@flusys/ng-storage 3.0.1 → 4.0.0-lts

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/README.md +12 -6
  2. package/fesm2022/{flusys-ng-storage-file-manager-form.component-CXVB9G-f.mjs → flusys-ng-storage-file-manager-form.component-AM7JE-s5.mjs} +67 -74
  3. package/fesm2022/flusys-ng-storage-file-manager-form.component-AM7JE-s5.mjs.map +1 -0
  4. package/fesm2022/{flusys-ng-storage-file-manager-list.component-0O_b4EjN.mjs → flusys-ng-storage-file-manager-list.component-bj6oOzOL.mjs} +66 -74
  5. package/fesm2022/flusys-ng-storage-file-manager-list.component-bj6oOzOL.mjs.map +1 -0
  6. package/fesm2022/{flusys-ng-storage-folder-form.component-BTQGEqNu.mjs → flusys-ng-storage-folder-form.component-Cc2ybTwu.mjs} +25 -34
  7. package/fesm2022/flusys-ng-storage-folder-form.component-Cc2ybTwu.mjs.map +1 -0
  8. package/fesm2022/{flusys-ng-storage-folder-list.component-B8GoIh6Z.mjs → flusys-ng-storage-folder-list.component-B2Q41I1g.mjs} +34 -39
  9. package/fesm2022/flusys-ng-storage-folder-list.component-B2Q41I1g.mjs.map +1 -0
  10. package/fesm2022/{flusys-ng-storage-storage-config-form.component-CorNWrmF.mjs → flusys-ng-storage-storage-config-form.component-a88XhuPH.mjs} +87 -85
  11. package/fesm2022/flusys-ng-storage-storage-config-form.component-a88XhuPH.mjs.map +1 -0
  12. package/fesm2022/{flusys-ng-storage-storage-config-list.component-YXzz3Tvo.mjs → flusys-ng-storage-storage-config-list.component-DBH_qf9o.mjs} +36 -35
  13. package/fesm2022/flusys-ng-storage-storage-config-list.component-DBH_qf9o.mjs.map +1 -0
  14. package/fesm2022/flusys-ng-storage.mjs +490 -151
  15. package/fesm2022/flusys-ng-storage.mjs.map +1 -1
  16. package/package.json +7 -5
  17. package/types/flusys-ng-storage.d.ts +56 -36
  18. package/fesm2022/flusys-ng-storage-file-manager-form.component-CXVB9G-f.mjs.map +0 -1
  19. package/fesm2022/flusys-ng-storage-file-manager-list.component-0O_b4EjN.mjs.map +0 -1
  20. package/fesm2022/flusys-ng-storage-folder-form.component-BTQGEqNu.mjs.map +0 -1
  21. package/fesm2022/flusys-ng-storage-folder-list.component-B8GoIh6Z.mjs.map +0 -1
  22. package/fesm2022/flusys-ng-storage-storage-config-form.component-CorNWrmF.mjs.map +0 -1
  23. package/fesm2022/flusys-ng-storage-storage-config-list.component-YXzz3Tvo.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage.mjs","sources":["../../../projects/ng-storage/enums/file-location.enum.ts","../../../projects/ng-storage/utils/storage-utils.ts","../../../projects/ng-storage/utils/base-storage-page.ts","../../../projects/ng-storage/services/file-manager-api.service.ts","../../../projects/ng-storage/services/upload.service.ts","../../../projects/ng-storage/adapters/profile-upload-provider.adapter.ts","../../../projects/ng-storage/providers/storage-providers.ts","../../../projects/ng-storage/services/folder-api.service.ts","../../../projects/ng-storage/services/storage-config-api.service.ts","../../../projects/ng-storage/routes/storage.routes.ts","../../../projects/ng-storage/pages/storage-container/storage-container.component.ts","../../../projects/ng-storage/public-api.ts","../../../projects/ng-storage/flusys-ng-storage.ts"],"sourcesContent":["/**\n * File Location Enum\n * Storage provider types (matches backend FileLocationEnum)\n */\nexport enum FileLocationEnum {\n LOCAL = 'local',\n AWS = 'aws',\n AZURE = 'azure',\n SFTP = 'sftp',\n}\n\n/**\n * Image Format Enum\n * Supported image output formats for compression\n */\nexport enum ImageFormat {\n ORIGINAL = 'original',\n JPEG = 'jpeg',\n PNG = 'png',\n WEBP = 'webp',\n}\n","import { FileLocationEnum } from '../enums/file-location.enum';\n\n/**\n * Storage Provider Configuration\n * Maps provider enum to display properties\n */\ninterface IProviderConfig {\n label: string;\n icon: string;\n severity: 'success' | 'info' | 'warn' | 'danger' | 'secondary' | 'contrast';\n}\n\n/**\n * Provider configurations for all storage types\n */\nconst PROVIDER_CONFIGS: Record<FileLocationEnum, IProviderConfig> = {\n [FileLocationEnum.LOCAL]: {\n label: 'Local',\n icon: 'pi pi-folder',\n severity: 'secondary',\n },\n [FileLocationEnum.AWS]: {\n label: 'AWS S3',\n icon: 'pi pi-cloud',\n severity: 'warn',\n },\n [FileLocationEnum.AZURE]: {\n label: 'Azure Blob',\n icon: 'pi pi-cloud',\n severity: 'info',\n },\n [FileLocationEnum.SFTP]: {\n label: 'SFTP',\n icon: 'pi pi-server',\n severity: 'contrast',\n },\n};\n\n/**\n * Get provider label for display\n */\nexport function getProviderLabel(storage: FileLocationEnum | string): string {\n const enumValue = storage as FileLocationEnum;\n return PROVIDER_CONFIGS[enumValue]?.label ?? storage;\n}\n\n/**\n * Get provider icon class\n */\nexport function getProviderIcon(storage: FileLocationEnum | string): string {\n const enumValue = storage as FileLocationEnum;\n return PROVIDER_CONFIGS[enumValue]?.icon ?? 'pi pi-database';\n}\n\n/**\n * Get provider severity for p-tag\n */\nexport function getProviderSeverity(\n storage: FileLocationEnum | string,\n): 'success' | 'info' | 'warn' | 'danger' | 'secondary' | 'contrast' {\n const enumValue = storage as FileLocationEnum;\n return PROVIDER_CONFIGS[enumValue]?.severity ?? 'secondary';\n}\n\n/**\n * Get file icon based on content type\n */\nexport function 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/**\n * Format file size from bytes to human readable string\n */\nexport function 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.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1);\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n}\n\n/**\n * Storage provider options for dropdown selects\n */\nexport const STORAGE_PROVIDERS = [\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] as const;\n","import { computed, Directive, inject, 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 { BaseListPage } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\n\n@Directive()\nexport abstract class BaseStoragePage {\n protected readonly router = inject(Router);\n protected readonly messageService = inject(MessageService);\n protected readonly appConfig = inject(APP_CONFIG);\n protected readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n readonly isLoading = signal(false);\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n readonly currentCompanyName = computed(() => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME);\n\n protected showSuccess(detail: string, summary = 'Success'): void {\n this.messageService.add({ severity: 'success', summary, detail });\n }\n\n protected showError(detail: string, summary = 'Error'): void {\n this.messageService.add({ severity: 'error', summary, detail });\n }\n\n protected navigateTo(path: string[]): void {\n this.router.navigate(path);\n }\n}\n\n@Directive()\nexport abstract class BaseStorageListPage<T> extends BaseListPage<T> {\n protected readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n override readonly pageSize = signal(50);\n readonly totalRecords = this.total;\n readonly currentCompanyName = computed(() => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME);\n\n getDeleteConfirmMessage(item: T): string {\n const name = (item as { name?: string }).name ?? 'this item';\n return `Are you sure you want to delete \"${name}\"?`;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, firstValueFrom } from 'rxjs';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { ICreateFileManagerDto, IFileManager, IFilesResponseDto, IGetFilesRequestDto, IUpdateFileManagerDto } from '../interfaces/file-manager.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class FileManagerApiService extends ApiResourceService<IUpdateFileManagerDto, IFileManager> {\n constructor() {\n super('file-manager', inject(HttpClient), 'storage');\n }\n\n getFiles(fileIds: string[]): Observable<ISingleResponse<IFilesResponseDto[]>> {\n const requests: IGetFilesRequestDto[] = fileIds.map((id) => ({ id }));\n return this.http.post<ISingleResponse<IFilesResponseDto[]>>(`${this.baseUrl}/get-files`, requests);\n }\n\n createFile(dto: ICreateFileManagerDto): Observable<ISingleResponse<IFileManager>> {\n return this.http.post<ISingleResponse<IFileManager>>(`${this.baseUrl}/insert`, dto);\n }\n\n async createFileAsync(dto: ICreateFileManagerDto): Promise<ISingleResponse<IFileManager>> {\n return firstValueFrom(this.createFile(dto));\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable, switchMap } from 'rxjs';\nimport { BaseApiService, getDefaultStorageConfigId } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport { IUploadOptionsDto, IUploadedFileInfo } from '../interfaces/upload.interface';\nimport { FileManagerApiService } from './file-manager-api.service';\nimport { IFileManager } from '../interfaces/file-manager.interface';\n\n/**\n * Upload Service - File upload/delete operations\n * Endpoint: POST /storage/upload/*\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadService extends BaseApiService {\n private readonly fileManagerApi = inject(FileManagerApiService);\n\n constructor() {\n super('storage');\n }\n\n /** Get default storage config ID from app config */\n getDefaultConfigId(): string | undefined {\n return getDefaultStorageConfigId(this.appConfig);\n }\n\n /** Upload single file - POST /storage/upload/single-file */\n uploadSingleFile(file: File, options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo>> {\n const formData = new FormData();\n formData.append('file', file);\n return this.http.post<ISingleResponse<IUploadedFileInfo>>(this.buildUploadUrl('single-file', options), formData);\n }\n\n /** Upload multiple files (max 50) - POST /storage/upload/multiple-file */\n uploadMultipleFiles(files: File[], options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo[]>> {\n const formData = new FormData();\n files.forEach((file) => formData.append('files', file));\n return this.http.post<ISingleResponse<IUploadedFileInfo[]>>(this.buildUploadUrl('multiple-file', options), formData);\n }\n\n /** Delete single file - POST /storage/upload/delete-single-file */\n deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-single-file'),\n this.buildDeleteBody({ key }, storageConfigId),\n );\n }\n\n /** Delete multiple files - POST /storage/upload/delete-multiple-file */\n deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-multiple-file'),\n this.buildDeleteBody({ keys }, storageConfigId),\n );\n }\n\n /** Get file download URL - GET /storage/upload/file/:filePath */\n getFileUrl(key: string): string {\n return this.getUrl(`upload/file/${key}`);\n }\n\n /** Upload file and register in file manager - returns file manager ID (UUID) */\n uploadAndRegister(\n file: File,\n options?: IUploadOptionsDto & { isPrivate?: boolean; folderId?: string },\n ): Observable<ISingleResponse<IFileManager>> {\n return this.uploadSingleFile(file, options).pipe(\n switchMap((response) => {\n if (!response.success || !response.data) {\n throw new Error(response.message || 'Upload failed');\n }\n return this.fileManagerApi.createFile({\n name: response.data.name,\n key: response.data.key,\n size: String(response.data.size),\n contentType: response.data.contentType,\n isPrivate: options?.isPrivate ?? false,\n folderId: options?.folderId,\n storageConfigId: this.resolveConfigId(options?.storageConfigId),\n });\n }),\n );\n }\n\n // ─── Private Helpers ───────────────────────────────────────────────────────\n\n private resolveConfigId(storageConfigId?: string): string | undefined {\n return storageConfigId ?? this.getDefaultConfigId();\n }\n\n private buildUploadUrl(endpoint: string, options?: IUploadOptionsDto): string {\n const params = this.buildQueryParams(options);\n const baseUrl = this.getUrl(`upload/${endpoint}`);\n return params ? `${baseUrl}?${params}` : baseUrl;\n }\n\n private buildQueryParams(options?: IUploadOptionsDto): string {\n const params = new URLSearchParams();\n const configId = this.resolveConfigId(options?.storageConfigId);\n\n if (configId) params.append('storageConfigId', configId);\n if (options?.folderPath) params.append('folderPath', options.folderPath);\n if (options?.maxWidth) params.append('maxWidth', options.maxWidth.toString());\n if (options?.maxHeight) params.append('maxHeight', options.maxHeight.toString());\n if (options?.quality) params.append('quality', options.quality.toString());\n if (options?.format) params.append('format', options.format);\n if (options?.compress !== undefined) params.append('compress', options.compress.toString());\n\n return params.toString();\n }\n\n private buildDeleteBody(data: { key?: string; keys?: string[] }, storageConfigId?: string): Record<string, unknown> {\n const configId = this.resolveConfigId(storageConfigId);\n return { ...data, ...(configId && { storageConfigId: configId }) };\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport {\n IProfileUploadProvider,\n IProfileUploadOptions,\n IProfileUploadResult,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { UploadService } from '../services/upload.service';\n\n/**\n * Profile Upload Provider Adapter\n *\n * Implements IProfileUploadProvider interface for ng-auth profile page.\n * Uses UploadService.uploadAndRegister() to upload files and register in file manager.\n *\n * @example\n * // In app.config.ts\n * providers: [\n * ...provideStorageProviders(),\n * ]\n */\n@Injectable()\nexport class ProfileUploadProviderAdapter implements IProfileUploadProvider {\n private readonly uploadService = inject(UploadService);\n\n /**\n * Upload profile picture and register in file manager\n * Returns file manager ID (UUID) for storing in user.profilePictureId\n */\n uploadProfilePicture(\n file: File,\n options?: IProfileUploadOptions\n ): Observable<ISingleResponse<IProfileUploadResult>> {\n return this.uploadService\n .uploadAndRegister(file, {\n folderPath: options?.folderPath ?? 'profile-pictures',\n compress: options?.compress ?? true,\n maxWidth: options?.maxWidth ?? 400,\n maxHeight: options?.maxHeight ?? 400,\n })\n .pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: response.data\n ? {\n id: response.data.id,\n name: response.data.name,\n key: response.data.key,\n size: parseFloat(response.data.size) * 1024, // Convert KB to bytes\n contentType: response.data.contentType,\n }\n : undefined,\n }))\n );\n }\n}\n","import { Provider } from '@angular/core';\nimport { PROFILE_UPLOAD_PROVIDER } from '@flusys/ng-shared';\nimport { ProfileUploadProviderAdapter } from '../adapters/profile-upload-provider.adapter';\n\n/**\n * Provide Storage Providers\n *\n * Registers storage-related provider implementations.\n * Call this in app.config.ts to enable storage features in other packages.\n *\n * @example\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * ...provideStorageProviders(),\n * ],\n * };\n *\n * @returns Array of providers for storage functionality\n */\nexport function provideStorageProviders(): Provider[] {\n return [\n {\n provide: PROFILE_UPLOAD_PROVIDER,\n useClass: ProfileUploadProviderAdapter,\n },\n ];\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateFolderDto, IFolder, IUpdateFolderDto } from '../interfaces/folder.interface';\n\n/**\n * Folder API Service\n * Handles folder CRUD operations\n * Endpoint: POST /storage/folder/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FolderApiService extends ApiResourceService<ICreateFolderDto | IUpdateFolderDto, IFolder> {\n constructor() {\n super('folder', inject(HttpClient), 'storage');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateStorageConfigDto, IStorageConfig, IUpdateStorageConfigDto } from '../interfaces/storage-config.interface';\n\n/**\n * Storage Config API Service\n * Handles storage configuration CRUD operations\n * Endpoint: POST /storage/storage-config/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class StorageConfigApiService extends ApiResourceService<\n ICreateStorageConfigDto | IUpdateStorageConfigDto,\n IStorageConfig\n> {\n constructor() {\n super('storage-config', inject(HttpClient), 'storage');\n }\n}\n","import { Routes } from '@angular/router';\nimport {\n FILE_PERMISSIONS,\n FOLDER_PERMISSIONS,\n permissionGuard,\n STORAGE_CONFIG_PERMISSIONS,\n} from '@flusys/ng-shared';\n\n/**\n * Storage Module Routes\n * All routes protected by permission guards\n */\nexport const STORAGE_ROUTES: Routes = [\n {\n path: '',\n loadComponent: () =>\n import('../pages/storage-container/storage-container.component').then(\n (m) => m.StorageContainerComponent,\n ),\n children: [\n // File Manager Routes\n {\n path: 'files',\n canActivate: [permissionGuard(FILE_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-list.component').then(\n (m) => m.FileManagerListComponent,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(FILE_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(FILE_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n ],\n },\n\n // Folder Routes\n {\n path: 'folders',\n canActivate: [permissionGuard(FOLDER_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/folder/folder-list.component').then(\n (m) => m.FolderListComponent,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(FOLDER_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(FOLDER_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n ],\n },\n\n // Storage Config Routes\n {\n path: 'configs',\n canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-list.component').then(\n (m) => m.StorageConfigListComponent,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n ],\n },\n\n // Default redirect\n { path: '', redirectTo: 'files', pathMatch: 'full' },\n ],\n },\n];\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport {\n FILE_PERMISSIONS,\n FOLDER_PERMISSIONS,\n PermissionValidatorService,\n STORAGE_CONFIG_PERMISSIONS,\n} from '@flusys/ng-shared';\n\ninterface ITab {\n id: string;\n label: string;\n icon: string;\n route: string;\n permission: string;\n}\n\n/**\n * Storage Container Component\n *\n * Main container for Storage module with tab navigation\n * Routes: Files | Folders | Configurations\n * Tabs are filtered based on user permissions\n */\n@Component({\n selector: 'lib-storage-container',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-2 sm:p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">Storage</h1>\n <p class=\"text-muted-color mt-1 text-sm sm:text-base\">{{ subtitle() }}</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0\"\n >\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.label }}</span>\n </a>\n }\n </div>\n\n <router-outlet />\n </div>\n `,\n})\nexport class StorageContainerComponent {\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n /** All available tabs with required permissions */\n private readonly allTabs: ITab[] = [\n {\n id: 'files',\n label: 'Files',\n icon: 'pi pi-file',\n route: 'files',\n permission: FILE_PERMISSIONS.READ,\n },\n {\n id: 'folders',\n label: 'Folders',\n icon: 'pi pi-folder',\n route: 'folders',\n permission: FOLDER_PERMISSIONS.READ,\n },\n {\n id: 'configs',\n label: 'Configurations',\n icon: 'pi pi-cog',\n route: 'configs',\n permission: STORAGE_CONFIG_PERMISSIONS.READ,\n },\n ];\n\n /** Visible tabs based on user permissions */\n readonly visibleTabs = computed(() =>\n this.allTabs.filter((tab) => this.permissionValidator.hasPermission(tab.permission)),\n );\n\n /** Dynamic subtitle based on visible tabs */\n readonly subtitle = computed(() => {\n const tabs = this.visibleTabs();\n if (tabs.length === 0) return 'No permissions available';\n return `Manage ${tabs.map((t) => t.label.toLowerCase()).join(', ')}`;\n });\n}\n","// =============================================================================\n// @flusys/ng-storage - Storage Package\n// =============================================================================\n\n// Enums\nexport * from './enums/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Utils\nexport * from './utils/public-api';\n\n// Adapters\nexport { ProfileUploadProviderAdapter } from './adapters/profile-upload-provider.adapter';\n\n// Providers\nexport { provideStorageProviders } from './providers/storage-providers';\n\n// Services\nexport { FileManagerApiService } from './services/file-manager-api.service';\nexport { FolderApiService } from './services/folder-api.service';\nexport { StorageConfigApiService } from './services/storage-config-api.service';\nexport { UploadService } from './services/upload.service';\n\n// Routes\nexport { STORAGE_ROUTES } from './routes/storage.routes';\n\n// Components\nexport { StorageContainerComponent } from './pages/storage-container/storage-container.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-storage.mjs","sources":["../../../projects/ng-storage/constants/messages.ts","../../../projects/ng-storage/enums/file-location.enum.ts","../../../projects/ng-storage/utils/storage-utils.ts","../../../projects/ng-storage/utils/base-storage-page.ts","../../../projects/ng-storage/services/file-manager-api.service.ts","../../../projects/ng-storage/services/folder-api.service.ts","../../../projects/ng-storage/services/storage-config-api.service.ts","../../../projects/ng-storage/services/upload.service.ts","../../../projects/ng-storage/adapters/file-provider.adapter.ts","../../../projects/ng-storage/providers/storage-providers.ts","../../../projects/ng-storage/routes/storage.routes.ts","../../../projects/ng-storage/pages/storage-container/storage-container.component.ts","../../../projects/ng-storage/public-api.ts","../../../projects/ng-storage/flusys-ng-storage.ts"],"sourcesContent":["export const STORAGE_MESSAGES: Record<string, string> = {\n // Container page\n 'storage.title': 'Storage',\n 'storage.subtitle': 'Manage files, folders, and storage configurations',\n\n // Tabs\n 'storage.tabs.file.manager': 'File Manager',\n 'storage.tabs.folders': 'Folders',\n 'storage.tabs.configs': 'Configurations',\n\n // Page titles\n 'storage.file.title': 'Files',\n 'storage.file.manager.title': 'File Manager',\n 'storage.file.manager.upload.file': 'Upload File',\n 'storage.file.manager.edit.file': 'Edit File',\n 'storage.folder.title': 'Folder Setup',\n 'storage.folder.new.folder': 'New Folder',\n 'storage.folder.edit.folder': 'Edit Folder',\n 'storage.config.title': 'Storage Configurations',\n 'storage.config.new.config': 'New Configuration',\n 'storage.config.edit.config': 'Edit Storage Configuration',\n\n // Common labels\n 'storage.company': 'Company',\n 'storage.name': 'Name',\n 'storage.type': 'Type',\n 'storage.size': 'Size',\n 'storage.location': 'Location',\n 'storage.config': 'Config',\n 'storage.private': 'Private',\n 'storage.public': 'Public',\n 'storage.created': 'Created',\n 'storage.actions': 'Actions',\n 'storage.slug': 'Slug',\n 'storage.provider': 'Provider',\n 'storage.active': 'Active',\n 'storage.set.as.default': 'Set as Default',\n\n // Table headers\n 'storage.table.name': 'Name',\n 'storage.table.type': 'Type',\n 'storage.table.size': 'Size',\n 'storage.table.location': 'Location',\n 'storage.table.config': 'Config',\n 'storage.table.private': 'Private',\n 'storage.table.created': 'Created',\n 'storage.table.actions': 'Actions',\n 'storage.table.slug': 'Slug',\n 'storage.table.provider': 'Provider',\n\n // Buttons\n 'storage.button.upload.file': 'Upload File',\n 'storage.button.new.folder': 'New Folder',\n 'storage.button.new.configuration': 'New Configuration',\n 'storage.button.choose.file': 'Choose File',\n 'storage.button.cancel': 'Cancel',\n 'storage.button.create': 'Create',\n 'storage.button.update': 'Update',\n 'storage.button.upload': 'Upload',\n\n // Tooltips\n 'storage.tooltip.view': 'View',\n 'storage.tooltip.edit': 'Edit',\n 'storage.tooltip.trash': 'Trash',\n 'storage.tooltip.delete': 'Delete',\n\n // Empty states\n 'storage.empty.files': 'No files found',\n 'storage.empty.files.in.company': 'No files found in current company',\n 'storage.empty.folders': 'No folders found',\n 'storage.empty.folders.in.company': 'No folders found in current company',\n 'storage.empty.configs': 'No storage configurations found',\n 'storage.empty.configs.in.company': 'No storage configurations found in current company',\n\n // File operations\n 'storage.upload.title': 'Upload File',\n 'storage.upload.success': 'File uploaded successfully',\n 'storage.upload.failed': 'Failed to upload file',\n 'storage.upload.progress': 'Uploading... {{percent}}%',\n 'storage.upload.drag.drop': 'Drag and drop file here or click to browse',\n 'storage.upload.select.file': 'Select File',\n 'storage.upload.select.files': 'Select Files',\n 'storage.upload.max.size': 'Maximum file size: {{size}}',\n 'storage.upload.please.select': 'Please select a file to upload',\n\n 'storage.download.success': 'File downloaded successfully',\n 'storage.download.failed': 'Failed to download file',\n 'storage.download.progress': 'Downloading...',\n\n // Delete operations\n 'storage.delete.success': 'File deleted successfully',\n 'storage.delete.failed': 'Failed to delete file',\n 'storage.delete.confirm': 'Are you sure you want to delete this file?',\n 'storage.delete.this.item': 'this item',\n 'storage.delete.confirm.named': 'Are you sure you want to delete \"{{name}}\"?',\n 'storage.delete.move.to.trash': 'Move to Trash',\n 'storage.delete.move.to.trash.confirm': 'Move \"{{name}}\" to trash? You can recover it later.',\n 'storage.delete.permanent.delete': 'Permanent Delete',\n 'storage.delete.permanent.delete.confirm': 'Permanently delete \"{{name}}\"? This action CANNOT be undone and will delete the file from storage.',\n 'storage.delete.permanent.delete.button': 'Delete Permanently',\n 'storage.delete.trash.success': 'File moved to trash successfully',\n 'storage.delete.trash.failed': 'Failed to move file to trash',\n 'storage.delete.permanent.success': 'File permanently deleted',\n 'storage.delete.permanent.failed': 'Failed to permanently delete file',\n\n // File info\n 'storage.file.name': 'File Name',\n 'storage.file.name.required': 'File Name *',\n 'storage.file.size': 'File Size',\n 'storage.file.type': 'File Type',\n 'storage.file.extension': 'Extension',\n 'storage.file.uploaded.at': 'Uploaded At',\n 'storage.file.uploaded.by': 'Uploaded By',\n 'storage.file.path': 'File Path',\n 'storage.file.url': 'File URL',\n 'storage.file.url.not.available': 'File URL is not available',\n 'storage.file.get.url.failed': 'Failed to get file URL',\n 'storage.file.private': 'Private File',\n 'storage.file.private.hint': 'Only users with permission can access',\n 'storage.file.public.hint': 'File is publicly accessible',\n 'storage.file.placeholder': 'Will be auto-filled from selected file',\n 'storage.file.placeholder.edit': 'Enter file name',\n 'storage.file.select.required': 'Select File *',\n\n // Validation\n 'storage.error.file.too.big': 'File size exceeds the maximum limit of {{maxSize}}',\n 'storage.error.invalid.type': 'Invalid file type. Allowed types: {{types}}',\n 'storage.error.too.many.files': 'Maximum {{max}} files allowed',\n 'storage.error.no.file': 'Please select a file',\n 'storage.error.no.config': 'Please select a storage configuration',\n 'storage.error.load.failed': 'Failed to load files',\n 'storage.error.load.file.failed': 'Failed to load file',\n\n // Storage config\n 'storage.config.config.name': 'Configuration Name',\n 'storage.config.config.name.required': 'Configuration Name *',\n 'storage.config.config.name.placeholder': 'e.g., Production AWS S3',\n 'storage.config.provider': 'Storage Provider',\n 'storage.config.provider.required': 'Storage Provider *',\n 'storage.config.bucket': 'Bucket Name',\n 'storage.config.bucket.required': 'Bucket Name *',\n 'storage.config.region': 'Region',\n 'storage.config.region.required': 'AWS Region *',\n 'storage.config.access.key': 'Access Key',\n 'storage.config.access.key.required': 'Access Key ID *',\n 'storage.config.secret.key': 'Secret Key',\n 'storage.config.secret.key.required': 'Secret Access Key *',\n 'storage.config.endpoint': 'Endpoint URL',\n 'storage.config.endpoint.optional': 'Custom Endpoint (Optional)',\n 'storage.config.endpoint.placeholder': 'https://s3.custom-endpoint.com',\n 'storage.config.public': 'Public Access',\n 'storage.config.no.configs': 'No storage configurations found. Please create one first.',\n 'storage.config.select.config': 'Select storage configuration...',\n 'storage.config.load.failed': 'Failed to load storage configurations',\n 'storage.config.load.config.failed': 'Failed to load storage configuration',\n 'storage.config.delete.title': 'Delete Configuration',\n 'storage.config.delete.success': 'Storage configuration deleted successfully',\n 'storage.config.delete.failed': 'Failed to delete storage configuration',\n\n // AWS specific\n 'storage.aws.title': 'AWS S3 Configuration',\n 'storage.aws.region': 'AWS Region',\n 'storage.aws.region.placeholder': 'us-east-1',\n 'storage.aws.bucket': 'Bucket Name',\n 'storage.aws.bucket.placeholder': 'my-bucket',\n 'storage.aws.access.key.id': 'Access Key ID',\n 'storage.aws.secret.access.key': 'Secret Access Key',\n\n // Azure specific\n 'storage.azure.title': 'Azure Blob Configuration',\n 'storage.azure.account.name': 'Account Name',\n 'storage.azure.account.name.required': 'Account Name *',\n 'storage.azure.account.key': 'Account Key',\n 'storage.azure.account.key.required': 'Account Key *',\n 'storage.azure.container.name': 'Container Name',\n 'storage.azure.container.name.required': 'Container Name *',\n\n // SFTP specific\n 'storage.sftp.title': 'SFTP Configuration',\n 'storage.sftp.host': 'Host',\n 'storage.sftp.host.required': 'Host *',\n 'storage.sftp.host.placeholder': 'sftp.example.com',\n 'storage.sftp.port': 'Port',\n 'storage.sftp.port.required': 'Port *',\n 'storage.sftp.username': 'Username',\n 'storage.sftp.username.required': 'Username *',\n 'storage.sftp.password': 'Password',\n 'storage.sftp.password.required': 'Password *',\n 'storage.sftp.base.path': 'Base Path',\n 'storage.sftp.base.path.required': 'Base Path *',\n 'storage.sftp.base.path.placeholder': '/uploads',\n\n // Local specific\n 'storage.local.title': 'Local Storage Configuration',\n 'storage.local.base.path': 'Base Path',\n 'storage.local.base.path.required': 'Base Path *',\n 'storage.local.base.path.placeholder': '/var/www/uploads',\n\n // Folder operations\n 'storage.folder.create': 'Create Folder',\n 'storage.folder.name': 'Folder Name',\n 'storage.folder.name.required': 'Folder Name *',\n 'storage.folder.name.placeholder': 'Enter folder name',\n 'storage.folder.create.success': 'Folder created successfully',\n 'storage.folder.create.failed': 'Failed to create folder',\n 'storage.folder.update.success': 'Folder updated successfully',\n 'storage.folder.update.failed': 'Failed to update folder',\n 'storage.folder.delete': 'Delete Folder',\n 'storage.folder.delete.title': 'Delete Folder',\n 'storage.folder.delete.confirm': 'Are you sure you want to delete this folder and all its contents?',\n 'storage.folder.delete.success': 'Folder deleted successfully',\n 'storage.folder.delete.failed': 'Failed to delete folder',\n 'storage.folder.optional': 'Folder (Optional)',\n 'storage.folder.no.folder': 'No folder (root level)',\n 'storage.folder.no.folders.available': 'No folders available. File will be uploaded to root level.',\n 'storage.folder.no.folders.edit': 'No folders available.',\n 'storage.folder.load.failed': 'Failed to load folder',\n\n // File entity CRUD (API keys)\n 'file.create.success': 'File created successfully',\n 'file.create.many.success': '{{count}} files created successfully',\n 'file.get.success': 'File retrieved successfully',\n 'file.get.all.success': 'Files retrieved successfully',\n 'file.update.success': 'File updated successfully',\n 'file.update.many.success': '{{count}} files updated successfully',\n 'file.delete.success': 'File deleted successfully',\n 'file.restore.success': 'File restored successfully',\n 'file.not.found': 'File not found: {{path}}',\n 'file.upload.success': 'File uploaded successfully',\n 'file.upload.many.success': 'Files uploaded successfully',\n 'file.download.success': 'File downloaded successfully',\n 'file.move.success': 'File moved successfully',\n 'file.copy.success': 'File copied successfully',\n\n // Folder entity CRUD (API keys)\n 'folder.create.success': 'Folder created successfully',\n 'folder.create.many.success': '{{count}} folders created successfully',\n 'folder.get.success': 'Folder retrieved successfully',\n 'folder.get.all.success': 'Folders retrieved successfully',\n 'folder.update.success': 'Folder updated successfully',\n 'folder.update.many.success': '{{count}} folders updated successfully',\n 'folder.delete.success': 'Folder deleted successfully',\n 'folder.restore.success': 'Folder restored successfully',\n 'folder.not.found': 'Folder \"{{folderId}}\" not found or access denied',\n 'folder.tree.success': 'Folder tree retrieved successfully',\n 'folder.contents.success': 'Folder contents retrieved successfully',\n\n // Storage config CRUD (API keys)\n 'storage.config.update.success': 'Storage configuration updated successfully',\n 'storage.config.create.success': 'Storage configuration created successfully',\n 'storage.config.update.failed': 'Failed to update storage configuration',\n 'storage.config.create.failed': 'Failed to create storage configuration',\n 'storage.config.create.many.success': '{{count}} storage configurations created successfully',\n 'storage.config.get.success': 'Storage configuration retrieved successfully',\n 'storage.config.get.all.success': 'Storage configurations retrieved successfully',\n 'storage.config.update.many.success': '{{count}} storage configurations updated successfully',\n 'storage.config.restore.success': 'Storage configuration restored successfully',\n 'storage.config.not.found': 'Storage configuration not found',\n 'storage.config.active.success': 'Active storage configuration retrieved successfully',\n 'storage.config.test.success': 'Storage configuration test successful',\n 'storage.config.test.failed': 'Storage configuration test failed',\n\n // Upload messages (API keys)\n 'upload.success': 'File uploaded successfully',\n 'upload.many.success': 'Files uploaded successfully',\n 'upload.failed': 'Failed to upload file',\n 'upload.file.too.large': 'File size ({{fileSize}}MB) exceeds maximum {{maxSize}}MB',\n 'upload.invalid.type': 'File type \"{{mimeType}}\" not allowed. Allowed: {{allowedTypes}}',\n 'upload.chunk.success': 'Chunk uploaded successfully',\n 'upload.complete.success': 'Upload completed successfully',\n 'upload.no.files.provided': 'No files provided',\n 'upload.no.file.path': 'File path is required',\n 'upload.invalid.file.path': 'Invalid file path',\n 'upload.config.not.found': 'Upload configuration not found',\n\n // Validation messages\n 'storage.validation.file.name.required': 'File name is required',\n 'storage.validation.folder.name.required': 'Folder name is required',\n 'storage.validation.config.name.required': 'Configuration name is required',\n\n // Additional missing keys\n 'storage.unit.kb': 'KB',\n 'storage.unit.mb': 'MB',\n 'storage.unit.gb': 'GB',\n 'storage.sftp.port.placeholder': '22',\n 'storage.file.update.success': 'File updated successfully',\n 'storage.pagination.files.template': 'Showing {first} to {last} of {totalRecords} files',\n 'storage.pagination.folders.template': 'Showing {first} to {last} of {totalRecords} folders',\n 'storage.pagination.configs.template': 'Showing {first} to {last} of {totalRecords} configurations',\n};\n","/**\n * File Location Enum\n * Storage provider types (matches backend FileLocationEnum)\n */\nexport enum FileLocationEnum {\n LOCAL = 'local',\n AWS = 'aws',\n AZURE = 'azure',\n SFTP = 'sftp',\n}\n\n/**\n * Image Format Enum\n * Supported image output formats for compression\n */\nexport enum ImageFormat {\n ORIGINAL = 'original',\n JPEG = 'jpeg',\n PNG = 'png',\n WEBP = 'webp',\n}\n","import { FileLocationEnum } from '../enums/file-location.enum';\n\n/**\n * Storage Provider Configuration\n * Maps provider enum to display properties\n */\ninterface IProviderConfig {\n labelKey: string;\n icon: string;\n severity: 'success' | 'info' | 'warn' | 'danger' | 'secondary' | 'contrast';\n}\n\n/**\n * Provider label translation keys\n */\nexport const PROVIDER_LABEL_KEYS: Record<FileLocationEnum, string> = {\n [FileLocationEnum.LOCAL]: 'storage.local.title',\n [FileLocationEnum.AWS]: 'storage.aws.title',\n [FileLocationEnum.AZURE]: 'storage.azure.title',\n [FileLocationEnum.SFTP]: 'storage.sftp.title',\n};\n\n/**\n * Provider configurations for all storage types\n */\nconst PROVIDER_CONFIGS: Record<FileLocationEnum, IProviderConfig> = {\n [FileLocationEnum.LOCAL]: {\n labelKey: 'storage.local.title',\n icon: 'pi pi-folder',\n severity: 'secondary',\n },\n [FileLocationEnum.AWS]: {\n labelKey: 'storage.aws.title',\n icon: 'pi pi-cloud',\n severity: 'warn',\n },\n [FileLocationEnum.AZURE]: {\n labelKey: 'storage.azure.title',\n icon: 'pi pi-cloud',\n severity: 'info',\n },\n [FileLocationEnum.SFTP]: {\n labelKey: 'storage.sftp.title',\n icon: 'pi pi-server',\n severity: 'contrast',\n },\n};\n\n/**\n * Get provider label translation key\n */\nexport function getProviderLabelKey(storage: FileLocationEnum | string): string {\n const enumValue = storage as FileLocationEnum;\n return PROVIDER_CONFIGS[enumValue]?.labelKey ?? storage;\n}\n\n/**\n * Get provider icon class\n */\nexport function getProviderIcon(storage: FileLocationEnum | string): string {\n const enumValue = storage as FileLocationEnum;\n return PROVIDER_CONFIGS[enumValue]?.icon ?? 'pi pi-database';\n}\n\n/**\n * Get provider severity for p-tag\n */\nexport function getProviderSeverity(\n storage: FileLocationEnum | string,\n): 'success' | 'info' | 'warn' | 'danger' | 'secondary' | 'contrast' {\n const enumValue = storage as FileLocationEnum;\n return PROVIDER_CONFIGS[enumValue]?.severity ?? 'secondary';\n}\n\n/**\n * Get file icon based on content type\n */\nexport function 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/** File size unit keys for translation */\nexport const FILE_SIZE_UNIT_KEYS = ['storage.size.bytes', 'storage.size.kb', 'storage.size.mb', 'storage.size.gb'] as const;\n\n/**\n * Format file size from bytes to human readable format\n * Returns an object with value and unitKey for translation\n */\nexport function formatFileSizeWithKey(bytes: number): { value: string; unitKey: string } {\n if (bytes <= 0) return { value: '0', unitKey: 'storage.size.bytes' };\n const k = 1024;\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), FILE_SIZE_UNIT_KEYS.length - 1);\n const value = (Math.round((bytes / Math.pow(k, i)) * 100) / 100).toString();\n return { value, unitKey: FILE_SIZE_UNIT_KEYS[i] };\n}\n\n/**\n * Format file size from bytes to human readable string\n * @deprecated Use formatFileSizeWithKey for localization support\n */\nexport function formatFileSize(bytes: number): string {\n const { value, unitKey } = formatFileSizeWithKey(bytes);\n // Fallback to non-translated units for backward compatibility\n const unitMap: Record<string, string> = {\n 'storage.size.bytes': 'Bytes',\n 'storage.size.kb': 'KB',\n 'storage.size.mb': 'MB',\n 'storage.size.gb': 'GB',\n };\n return `${value} ${unitMap[unitKey]}`;\n}\n\n/**\n * Storage provider options for dropdown selects\n * Labels are translation keys - components should translate them\n */\nexport const STORAGE_PROVIDER_OPTIONS = [\n { labelKey: 'storage.aws.title', value: FileLocationEnum.AWS },\n { labelKey: 'storage.azure.title', value: FileLocationEnum.AZURE },\n { labelKey: 'storage.sftp.title', value: FileLocationEnum.SFTP },\n { labelKey: 'storage.local.title', value: FileLocationEnum.LOCAL },\n] as const;\n\nexport type StorageProviderOption = (typeof STORAGE_PROVIDER_OPTIONS)[number];\n","import { computed, Directive, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, DEFAULT_APP_NAME, TRANSLATE_ADAPTER } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { BaseListPage } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\n\n@Directive()\nexport abstract class BaseStoragePage {\n protected readonly router = inject(Router);\n protected readonly messageService = inject(MessageService);\n protected readonly appConfig = inject(APP_CONFIG);\n protected readonly companyContext = inject(LAYOUT_AUTH_STATE);\n protected readonly translateAdapter = inject(TRANSLATE_ADAPTER);\n\n readonly isLoading = signal(false);\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n readonly currentCompanyName = computed(() => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME);\n\n protected showSuccess(detail: string, summaryKey = 'shared.success'): void {\n const summary = this.translateAdapter.translate(summaryKey);\n this.messageService.add({ severity: 'success', summary, detail });\n }\n\n protected showError(detail: string, summaryKey = 'shared.error'): void {\n const summary = this.translateAdapter.translate(summaryKey);\n this.messageService.add({ severity: 'error', summary, detail });\n }\n\n protected navigateTo(path: string[]): void {\n this.router.navigate(path);\n }\n}\n\n@Directive()\nexport abstract class BaseStorageListPage<T> extends BaseListPage<T> {\n protected readonly companyContext = inject(LAYOUT_AUTH_STATE);\n protected override readonly translateAdapter = inject(TRANSLATE_ADAPTER);\n\n override readonly pageSize = signal(50);\n readonly totalRecords = this.total;\n readonly currentCompanyName = computed(() => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME);\n\n getDeleteConfirmMessage(item: T): string {\n const itemName = (item as { name?: string }).name;\n const name = itemName ?? this.translateAdapter.translate('storage.delete.this.item');\n return this.translateAdapter.translate('storage.delete.confirm.named', { name });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { ApiResourceService, IBulkResponse, ISingleResponse } from '@flusys/ng-shared';\nimport { ICreateFileManagerDto, IFileManager, IFilesResponseDto, IGetFilesRequestDto, IUpdateFileManagerDto } from '../interfaces/file-manager.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class FileManagerApiService extends ApiResourceService<IUpdateFileManagerDto, IFileManager> {\n constructor() {\n super('file-manager', inject(HttpClient), 'storage');\n }\n\n getFiles(fileIds: string[]): Observable<ISingleResponse<IFilesResponseDto[]>> {\n const requests: IGetFilesRequestDto[] = fileIds.map((id) => ({ id }));\n return this.http.post<ISingleResponse<IFilesResponseDto[]>>(`${this.baseUrl}/get-files`, requests);\n }\n\n createFile(dto: ICreateFileManagerDto): Observable<ISingleResponse<IFileManager>> {\n return this.http.post<ISingleResponse<IFileManager>>(`${this.baseUrl}/insert`, dto);\n }\n\n createFiles(dtos: ICreateFileManagerDto[]): Observable<IBulkResponse<IFileManager>> {\n return this.http.post<IBulkResponse<IFileManager>>(`${this.baseUrl}/insert-many`, dtos);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateFolderDto, IFolder, IUpdateFolderDto } from '../interfaces/folder.interface';\n\n/**\n * Folder API Service\n * Handles folder CRUD operations\n * Endpoint: POST /storage/folder/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FolderApiService extends ApiResourceService<ICreateFolderDto | IUpdateFolderDto, IFolder> {\n constructor() {\n super('folder', inject(HttpClient), 'storage');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateStorageConfigDto, IStorageConfig, IUpdateStorageConfigDto } from '../interfaces/storage-config.interface';\n\n/**\n * Storage Config API Service\n * Handles storage configuration CRUD operations\n * Endpoint: POST /storage/storage-config/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class StorageConfigApiService extends ApiResourceService<\n ICreateStorageConfigDto | IUpdateStorageConfigDto,\n IStorageConfig\n> {\n constructor() {\n super('storage-config', inject(HttpClient), 'storage');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { map, Observable, switchMap } from 'rxjs';\nimport { BaseApiService, getDefaultStorageConfigId } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport { IUploadOptionsDto, IUploadedFileInfo } from '../interfaces/upload.interface';\nimport { FileManagerApiService } from './file-manager-api.service';\nimport { ICreateFileManagerDto, IFileManager } from '../interfaces/file-manager.interface';\n\n/**\n * Upload Service - File upload/delete operations\n * Endpoint: POST /storage/upload/*\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadService extends BaseApiService {\n private readonly fileManagerApi = inject(FileManagerApiService);\n\n constructor() {\n super('storage');\n }\n\n /** Get default storage config ID from app config */\n getDefaultConfigId(): string | undefined {\n return getDefaultStorageConfigId(this.appConfig);\n }\n\n /** Upload single file - POST /storage/upload/single-file */\n uploadSingleFile(file: File, options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo>> {\n const formData = new FormData();\n formData.append('file', file);\n return this.http.post<ISingleResponse<IUploadedFileInfo>>(this.buildUploadUrl('single-file', options), formData);\n }\n\n /** Upload multiple files (max 50) - POST /storage/upload/multiple-file */\n uploadMultipleFiles(files: File[], options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo[]>> {\n const formData = new FormData();\n files.forEach((file) => formData.append('files', file));\n return this.http.post<ISingleResponse<IUploadedFileInfo[]>>(this.buildUploadUrl('multiple-file', options), formData);\n }\n\n /** Delete single file - POST /storage/upload/delete-single-file */\n deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-single-file'),\n this.buildDeleteBody({ key }, storageConfigId),\n );\n }\n\n /** Delete multiple files - POST /storage/upload/delete-multiple-file */\n deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-multiple-file'),\n this.buildDeleteBody({ keys }, storageConfigId),\n );\n }\n\n /** Get file download URL - GET /storage/upload/file/:filePath */\n getFileUrl(key: string): string {\n return this.getUrl(`upload/file/${key}`);\n }\n\n /** Upload file and register in file manager - returns file manager ID (UUID) */\n uploadAndRegister(\n file: File,\n options?: IUploadOptionsDto & { isPrivate?: boolean; folderId?: string },\n ): Observable<ISingleResponse<IFileManager>> {\n return this.uploadSingleFile(file, options).pipe(\n switchMap((response) => {\n if (!response.success || !response.data) {\n throw new Error(response.message || 'upload.failed');\n }\n return this.fileManagerApi.createFile(this.toCreateFileDto(response.data, options));\n }),\n );\n }\n\n /** Upload multiple files and register in file manager - batch upload (2 API calls total) */\n uploadAndRegisterMultiple(\n files: File[],\n options?: IUploadOptionsDto & { isPrivate?: boolean; folderId?: string },\n ): Observable<ISingleResponse<IFileManager[]>> {\n return this.uploadMultipleFiles(files, options).pipe(\n switchMap((response) => {\n if (!response.success || !response.data) {\n throw new Error(response.message || 'upload.failed');\n }\n const dtos = response.data.map((fileInfo) => this.toCreateFileDto(fileInfo, options));\n return this.fileManagerApi.createFiles(dtos).pipe(\n map((bulkResponse) => ({\n success: bulkResponse.success,\n data: bulkResponse.data ?? [],\n message: bulkResponse.message,\n })),\n );\n }),\n );\n }\n\n // ─── Private Helpers ───────────────────────────────────────────────────────\n\n private resolveConfigId(storageConfigId?: string): string | undefined {\n return storageConfigId ?? this.getDefaultConfigId();\n }\n\n private toCreateFileDto(\n fileInfo: IUploadedFileInfo,\n options?: { isPrivate?: boolean; folderId?: string; storageConfigId?: string },\n ): ICreateFileManagerDto {\n return {\n name: fileInfo.name,\n key: fileInfo.key,\n size: String(fileInfo.size),\n contentType: fileInfo.contentType,\n isPrivate: options?.isPrivate ?? false,\n folderId: options?.folderId,\n storageConfigId: this.resolveConfigId(options?.storageConfigId),\n };\n }\n\n private buildUploadUrl(endpoint: string, options?: IUploadOptionsDto): string {\n const params = this.buildQueryParams(options);\n const baseUrl = this.getUrl(`upload/${endpoint}`);\n return params ? `${baseUrl}?${params}` : baseUrl;\n }\n\n private buildQueryParams(options?: IUploadOptionsDto): string {\n const params = new URLSearchParams();\n const configId = this.resolveConfigId(options?.storageConfigId);\n\n if (configId) params.append('storageConfigId', configId);\n if (options?.folderPath) params.append('folderPath', options.folderPath);\n if (options?.maxWidth) params.append('maxWidth', options.maxWidth.toString());\n if (options?.maxHeight) params.append('maxHeight', options.maxHeight.toString());\n if (options?.quality) params.append('quality', options.quality.toString());\n if (options?.format) params.append('format', options.format);\n if (options?.compress !== undefined) params.append('compress', options.compress.toString());\n\n return params.toString();\n }\n\n private buildDeleteBody(data: { key?: string; keys?: string[] }, storageConfigId?: string): Record<string, unknown> {\n const configId = this.resolveConfigId(storageConfigId);\n return { ...data, ...(configId && { storageConfigId: configId }) };\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { map, Observable } from 'rxjs';\nimport {\n IFileBasicInfo,\n IFileProvider,\n IFileSelectFilter,\n IFileUploadOptions,\n IFolderBasicInfo,\n IListResponse,\n ISelectFilter,\n ISingleResponse,\n IStorageConfigBasicInfo,\n IUploadedFile,\n} from '@flusys/ng-shared';\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';\nimport { IFileManager } from '../interfaces/file-manager.interface';\n\n@Injectable()\nexport class FileProviderAdapter implements IFileProvider {\n private readonly fileManagerApi = inject(FileManagerApiService);\n private readonly uploadService = inject(UploadService);\n private readonly folderApi = inject(FolderApiService);\n private readonly storageConfigApi = inject(StorageConfigApiService);\n\n loadFiles(filter: IFileSelectFilter): Observable<IListResponse<IFileBasicInfo>> {\n const filterObj = this.buildFileFilter(filter);\n\n return this.fileManagerApi\n .getAll(filter.search || '', {\n pagination: { currentPage: filter.page, pageSize: filter.pageSize },\n filter: Object.keys(filterObj).length > 0 ? filterObj : undefined,\n })\n .pipe(map((res) => ({ ...res, data: res.data?.map(this.mapToFileBasicInfo) })));\n }\n\n uploadFile(file: File, options?: IFileUploadOptions): Observable<ISingleResponse<IUploadedFile>> {\n return this.uploadService\n .uploadAndRegister(file, options)\n .pipe(map((res) => ({ ...res, data: res.data ? this.mapToUploadedFile(res.data) : undefined })));\n }\n\n uploadMultipleFiles(files: File[], options?: IFileUploadOptions): Observable<ISingleResponse<IUploadedFile[]>> {\n return this.uploadService\n .uploadAndRegisterMultiple(files, options)\n .pipe(map((res) => ({ ...res, data: res.data?.map(this.mapToUploadedFile) })));\n }\n\n getFileUrls(fileIds: string[]): Observable<ISingleResponse<IFileBasicInfo[]>> {\n return this.fileManagerApi.getFiles(fileIds).pipe(\n map((res) => ({\n ...res,\n data: res.data?.map((f) => ({ id: f.id, name: f.name, contentType: f.contentType, size: '0', url: f.url })),\n }))\n );\n }\n\n loadFolders(filter: ISelectFilter): Observable<IListResponse<IFolderBasicInfo>> {\n return this.folderApi\n .getAll(filter.search || '', {\n pagination: { currentPage: filter.page, pageSize: filter.pageSize },\n })\n .pipe(map((res) => ({ ...res, data: res.data?.map((f) => ({ id: f.id, name: f.name, slug: f.slug })) })));\n }\n\n loadStorageConfigs(filter: ISelectFilter): Observable<IListResponse<IStorageConfigBasicInfo>> {\n return this.storageConfigApi\n .getAll(filter.search || '', {\n pagination: { currentPage: filter.page, pageSize: filter.pageSize },\n })\n .pipe(map((res) => ({ ...res, data: res.data?.map((c) => ({ id: c.id, name: c.name, isDefault: c.isDefault })) })));\n }\n\n // ─── Private Helpers ────────────────────────────────────────────────────────\n\n private buildFileFilter(filter: IFileSelectFilter): Record<string, string> {\n const filterObj: Record<string, string> = {};\n if (filter.folderId) filterObj['folderId'] = filter.folderId;\n if (filter.storageConfigId) filterObj['storageConfigId'] = filter.storageConfigId;\n if (filter.contentTypes?.length) filterObj['contentType'] = filter.contentTypes.join(',');\n return filterObj;\n }\n\n private mapToFileBasicInfo = (f: IFileManager): IFileBasicInfo => ({\n id: f.id,\n name: f.name,\n contentType: f.contentType,\n size: f.size,\n url: f.url,\n });\n\n private mapToUploadedFile = (f: IFileManager): IUploadedFile => ({\n id: f.id,\n name: f.name,\n key: f.key,\n size: parseFloat(f.size) * 1024,\n contentType: f.contentType,\n });\n}\n","import { Provider } from '@angular/core';\nimport { FILE_PROVIDER } from '@flusys/ng-shared';\nimport { FileProviderAdapter } from '../adapters/file-provider.adapter';\n\n/**\n * Provide Storage Providers\n *\n * Registers storage-related provider implementations.\n * Call this in app.config.ts to enable storage features in other packages.\n *\n * @example\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * ...provideStorageProviders(),\n * ],\n * };\n *\n * @returns Array of providers for storage functionality\n */\nexport function provideStorageProviders(): Provider[] {\n return [\n {\n provide: FILE_PROVIDER,\n useClass: FileProviderAdapter,\n },\n ];\n}\n","import { Routes } from '@angular/router';\nimport {\n FILE_PERMISSIONS,\n FOLDER_PERMISSIONS,\n permissionGuard,\n STORAGE_CONFIG_PERMISSIONS,\n SHARED_MESSAGES,\n resolveTranslationModule,\n} from '@flusys/ng-shared';\nimport { STORAGE_MESSAGES } from '../constants/messages';\n\n/**\n * Storage Module Routes\n * All routes protected by permission guards\n */\nexport const STORAGE_ROUTES: Routes = [\n {\n path: '',\n resolve: { translations: resolveTranslationModule({ modules: ['storage'], fallbackMessages: { ...STORAGE_MESSAGES, ...SHARED_MESSAGES } }) },\n loadComponent: () =>\n import('../pages/storage-container/storage-container.component').then(\n (m) => m.StorageContainerComponent,\n ),\n children: [\n // File Manager Routes\n {\n path: 'files',\n canActivate: [permissionGuard(FILE_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-list.component').then(\n (m) => m.FileManagerListComponent,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(FILE_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(FILE_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n ],\n },\n\n // Folder Routes\n {\n path: 'folders',\n canActivate: [permissionGuard(FOLDER_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/folder/folder-list.component').then(\n (m) => m.FolderListComponent,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(FOLDER_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(FOLDER_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n ],\n },\n\n // Storage Config Routes\n {\n path: 'configs',\n canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-list.component').then(\n (m) => m.StorageConfigListComponent,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n ],\n },\n\n // Default redirect\n { path: '', redirectTo: 'files', pathMatch: 'full' },\n ],\n },\n];\n","import { Component, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport {\n FILE_PERMISSIONS,\n FOLDER_PERMISSIONS,\n PermissionValidatorService,\n STORAGE_CONFIG_PERMISSIONS,\n TranslatePipe,\n} from '@flusys/ng-shared';\n\ninterface ITab {\n id: string;\n labelKey: string;\n icon: string;\n route: string;\n permission: string;\n}\n\n/**\n * Storage Container Component\n *\n * Main container for Storage module with tab navigation\n * Routes: Files | Folders | Configurations\n * Tabs are filtered based on user permissions\n */\n@Component({\n selector: 'lib-storage-container',\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive, TranslatePipe],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-2 sm:p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">{{ 'storage.title' | translate }}</h1>\n <p class=\"text-muted-color mt-1 text-sm sm:text-base\">{{ 'storage.subtitle' | translate }}</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0\"\n >\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.labelKey | translate }}</span>\n </a>\n }\n </div>\n\n <router-outlet />\n </div>\n `,\n})\nexport class StorageContainerComponent {\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n /** All available tabs with required permissions */\n private readonly allTabs: ITab[] = [\n {\n id: 'files',\n labelKey: 'storage.file.title',\n icon: 'pi pi-file',\n route: 'files',\n permission: FILE_PERMISSIONS.READ,\n },\n {\n id: 'folders',\n labelKey: 'storage.folder.title',\n icon: 'pi pi-folder',\n route: 'folders',\n permission: FOLDER_PERMISSIONS.READ,\n },\n {\n id: 'configs',\n labelKey: 'storage.config.title',\n icon: 'pi pi-cog',\n route: 'configs',\n permission: STORAGE_CONFIG_PERMISSIONS.READ,\n },\n ];\n\n /** Visible tabs based on user permissions */\n readonly visibleTabs = computed(() =>\n this.allTabs.filter((tab) => this.permissionValidator.hasPermission(tab.permission)),\n );\n}\n","// =============================================================================\n// @flusys/ng-storage - Storage Package\n// =============================================================================\n\n// Constants\nexport * from './constants/messages';\n\n// Enums\nexport * from './enums/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Utils\nexport * from './utils/public-api';\n\n// Adapters\nexport { FileProviderAdapter } from './adapters/file-provider.adapter';\n\n// Providers\nexport { provideStorageProviders } from './providers/storage-providers';\n\n// Services\nexport { FileManagerApiService } from './services/file-manager-api.service';\nexport { FolderApiService } from './services/folder-api.service';\nexport { StorageConfigApiService } from './services/storage-config-api.service';\nexport { UploadService } from './services/upload.service';\n\n// Routes\nexport { STORAGE_ROUTES } from './routes/storage.routes';\n\n// Components\nexport { StorageContainerComponent } from './pages/storage-container/storage-container.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,19 @@
1
1
  {
2
2
  "name": "@flusys/ng-storage",
3
- "version": "3.0.1",
3
+ "version": "4.0.0-lts",
4
4
  "description": "File storage module for FLUSYS Angular applications",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
7
7
  "@angular/common": ">=21.0.0",
8
8
  "@angular/core": ">=21.0.0",
9
- "@flusys/ng-core": ">=3.0.1",
10
- "@flusys/ng-layout": ">=3.0.1",
11
- "@flusys/ng-shared": ">=3.0.1",
9
+ "@angular/router": ">=21.0.0",
10
+ "@flusys/ng-core": ">=4.0.0-lts",
11
+ "@flusys/ng-layout": ">=4.0.0-lts",
12
+ "@flusys/ng-shared": ">=4.0.0-lts",
12
13
  "@primeuix/themes": ">=1.0.0",
13
14
  "primeicons": ">=7.0.0",
14
- "primeng": ">=21.0.0"
15
+ "primeng": ">=21.0.0",
16
+ "rxjs": "^7.8.0"
15
17
  },
16
18
  "dependencies": {
17
19
  "tslib": "^2.3.0"
@@ -1,4 +1,4 @@
1
- import { IBaseEntity, BaseListPage, IProfileUploadProvider, IProfileUploadOptions, ISingleResponse, IProfileUploadResult, ApiResourceService } from '@flusys/ng-shared';
1
+ import { IBaseEntity, BaseListPage, IFileProvider, IFileSelectFilter, IListResponse, IFileBasicInfo, IFileUploadOptions, ISingleResponse, IUploadedFile, ISelectFilter, IFolderBasicInfo, IStorageConfigBasicInfo, ApiResourceService, IBulkResponse } from '@flusys/ng-shared';
2
2
  import * as i0 from '@angular/core';
3
3
  import { Provider } from '@angular/core';
4
4
  import * as _flusys_ng_layout from '@flusys/ng-layout';
@@ -8,6 +8,8 @@ import { Router, Routes } from '@angular/router';
8
8
  import { MessageService } from 'primeng/api';
9
9
  import { Observable } from 'rxjs';
10
10
 
11
+ declare const STORAGE_MESSAGES: Record<string, string>;
12
+
11
13
  /**
12
14
  * File Location Enum
13
15
  * Storage provider types (matches backend FileLocationEnum)
@@ -163,9 +165,13 @@ interface IUploadedFileInfo {
163
165
  }
164
166
 
165
167
  /**
166
- * Get provider label for display
168
+ * Provider label translation keys
169
+ */
170
+ declare const PROVIDER_LABEL_KEYS: Record<FileLocationEnum, string>;
171
+ /**
172
+ * Get provider label translation key
167
173
  */
168
- declare function getProviderLabel(storage: FileLocationEnum | string): string;
174
+ declare function getProviderLabelKey(storage: FileLocationEnum | string): string;
169
175
  /**
170
176
  * Get provider icon class
171
177
  */
@@ -178,43 +184,58 @@ declare function getProviderSeverity(storage: FileLocationEnum | string): 'succe
178
184
  * Get file icon based on content type
179
185
  */
180
186
  declare function getFileIcon(contentType: string): string;
187
+ /** File size unit keys for translation */
188
+ declare const FILE_SIZE_UNIT_KEYS: readonly ["storage.size.bytes", "storage.size.kb", "storage.size.mb", "storage.size.gb"];
189
+ /**
190
+ * Format file size from bytes to human readable format
191
+ * Returns an object with value and unitKey for translation
192
+ */
193
+ declare function formatFileSizeWithKey(bytes: number): {
194
+ value: string;
195
+ unitKey: string;
196
+ };
181
197
  /**
182
198
  * Format file size from bytes to human readable string
199
+ * @deprecated Use formatFileSizeWithKey for localization support
183
200
  */
184
201
  declare function formatFileSize(bytes: number): string;
185
202
  /**
186
203
  * Storage provider options for dropdown selects
204
+ * Labels are translation keys - components should translate them
187
205
  */
188
- declare const STORAGE_PROVIDERS: readonly [{
189
- readonly label: "AWS S3";
206
+ declare const STORAGE_PROVIDER_OPTIONS: readonly [{
207
+ readonly labelKey: "storage.aws.title";
190
208
  readonly value: FileLocationEnum.AWS;
191
209
  }, {
192
- readonly label: "Azure Blob Storage";
210
+ readonly labelKey: "storage.azure.title";
193
211
  readonly value: FileLocationEnum.AZURE;
194
212
  }, {
195
- readonly label: "SFTP";
213
+ readonly labelKey: "storage.sftp.title";
196
214
  readonly value: FileLocationEnum.SFTP;
197
215
  }, {
198
- readonly label: "Local Storage";
216
+ readonly labelKey: "storage.local.title";
199
217
  readonly value: FileLocationEnum.LOCAL;
200
218
  }];
219
+ type StorageProviderOption = (typeof STORAGE_PROVIDER_OPTIONS)[number];
201
220
 
202
221
  declare abstract class BaseStoragePage {
203
222
  protected readonly router: Router;
204
223
  protected readonly messageService: MessageService;
205
224
  protected readonly appConfig: _flusys_ng_core.IAppConfig;
206
225
  protected readonly companyContext: _flusys_ng_layout.ILayoutAuthState;
226
+ protected readonly translateAdapter: _flusys_ng_core.ITranslateAdapter;
207
227
  readonly isLoading: i0.WritableSignal<boolean>;
208
228
  readonly showCompanyInfo: i0.Signal<boolean>;
209
229
  readonly currentCompanyName: i0.Signal<string>;
210
- protected showSuccess(detail: string, summary?: string): void;
211
- protected showError(detail: string, summary?: string): void;
230
+ protected showSuccess(detail: string, summaryKey?: string): void;
231
+ protected showError(detail: string, summaryKey?: string): void;
212
232
  protected navigateTo(path: string[]): void;
213
233
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseStoragePage, never>;
214
234
  static ɵdir: i0.ɵɵDirectiveDeclaration<BaseStoragePage, never, never, {}, {}, never, never, true, never>;
215
235
  }
216
236
  declare abstract class BaseStorageListPage<T> extends BaseListPage<T> {
217
237
  protected readonly companyContext: _flusys_ng_layout.ILayoutAuthState;
238
+ protected readonly translateAdapter: _flusys_ng_core.ITranslateAdapter;
218
239
  readonly pageSize: i0.WritableSignal<number>;
219
240
  readonly totalRecords: i0.WritableSignal<number>;
220
241
  readonly currentCompanyName: i0.Signal<string>;
@@ -223,27 +244,22 @@ declare abstract class BaseStorageListPage<T> extends BaseListPage<T> {
223
244
  static ɵdir: i0.ɵɵDirectiveDeclaration<BaseStorageListPage<any>, never, never, {}, {}, never, never, true, never>;
224
245
  }
225
246
 
226
- /**
227
- * Profile Upload Provider Adapter
228
- *
229
- * Implements IProfileUploadProvider interface for ng-auth profile page.
230
- * Uses UploadService.uploadAndRegister() to upload files and register in file manager.
231
- *
232
- * @example
233
- * // In app.config.ts
234
- * providers: [
235
- * ...provideStorageProviders(),
236
- * ]
237
- */
238
- declare class ProfileUploadProviderAdapter implements IProfileUploadProvider {
247
+ declare class FileProviderAdapter implements IFileProvider {
248
+ private readonly fileManagerApi;
239
249
  private readonly uploadService;
240
- /**
241
- * Upload profile picture and register in file manager
242
- * Returns file manager ID (UUID) for storing in user.profilePictureId
243
- */
244
- uploadProfilePicture(file: File, options?: IProfileUploadOptions): Observable<ISingleResponse<IProfileUploadResult>>;
245
- static ɵfac: i0.ɵɵFactoryDeclaration<ProfileUploadProviderAdapter, never>;
246
- static ɵprov: i0.ɵɵInjectableDeclaration<ProfileUploadProviderAdapter>;
250
+ private readonly folderApi;
251
+ private readonly storageConfigApi;
252
+ loadFiles(filter: IFileSelectFilter): Observable<IListResponse<IFileBasicInfo>>;
253
+ uploadFile(file: File, options?: IFileUploadOptions): Observable<ISingleResponse<IUploadedFile>>;
254
+ uploadMultipleFiles(files: File[], options?: IFileUploadOptions): Observable<ISingleResponse<IUploadedFile[]>>;
255
+ getFileUrls(fileIds: string[]): Observable<ISingleResponse<IFileBasicInfo[]>>;
256
+ loadFolders(filter: ISelectFilter): Observable<IListResponse<IFolderBasicInfo>>;
257
+ loadStorageConfigs(filter: ISelectFilter): Observable<IListResponse<IStorageConfigBasicInfo>>;
258
+ private buildFileFilter;
259
+ private mapToFileBasicInfo;
260
+ private mapToUploadedFile;
261
+ static ɵfac: i0.ɵɵFactoryDeclaration<FileProviderAdapter, never>;
262
+ static ɵprov: i0.ɵɵInjectableDeclaration<FileProviderAdapter>;
247
263
  }
248
264
 
249
265
  /**
@@ -268,7 +284,7 @@ declare class FileManagerApiService extends ApiResourceService<IUpdateFileManage
268
284
  constructor();
269
285
  getFiles(fileIds: string[]): Observable<ISingleResponse<IFilesResponseDto[]>>;
270
286
  createFile(dto: ICreateFileManagerDto): Observable<ISingleResponse<IFileManager>>;
271
- createFileAsync(dto: ICreateFileManagerDto): Promise<ISingleResponse<IFileManager>>;
287
+ createFiles(dtos: ICreateFileManagerDto[]): Observable<IBulkResponse<IFileManager>>;
272
288
  static ɵfac: i0.ɵɵFactoryDeclaration<FileManagerApiService, never>;
273
289
  static ɵprov: i0.ɵɵInjectableDeclaration<FileManagerApiService>;
274
290
  }
@@ -323,7 +339,13 @@ declare class UploadService extends BaseApiService {
323
339
  isPrivate?: boolean;
324
340
  folderId?: string;
325
341
  }): Observable<ISingleResponse<IFileManager>>;
342
+ /** Upload multiple files and register in file manager - batch upload (2 API calls total) */
343
+ uploadAndRegisterMultiple(files: File[], options?: IUploadOptionsDto & {
344
+ isPrivate?: boolean;
345
+ folderId?: string;
346
+ }): Observable<ISingleResponse<IFileManager[]>>;
326
347
  private resolveConfigId;
348
+ private toCreateFileDto;
327
349
  private buildUploadUrl;
328
350
  private buildQueryParams;
329
351
  private buildDeleteBody;
@@ -339,7 +361,7 @@ declare const STORAGE_ROUTES: Routes;
339
361
 
340
362
  interface ITab {
341
363
  id: string;
342
- label: string;
364
+ labelKey: string;
343
365
  icon: string;
344
366
  route: string;
345
367
  permission: string;
@@ -357,11 +379,9 @@ declare class StorageContainerComponent {
357
379
  private readonly allTabs;
358
380
  /** Visible tabs based on user permissions */
359
381
  readonly visibleTabs: i0.Signal<ITab[]>;
360
- /** Dynamic subtitle based on visible tabs */
361
- readonly subtitle: i0.Signal<string>;
362
382
  static ɵfac: i0.ɵɵFactoryDeclaration<StorageContainerComponent, never>;
363
383
  static ɵcmp: i0.ɵɵComponentDeclaration<StorageContainerComponent, "lib-storage-container", never, {}, {}, never, never, true, never>;
364
384
  }
365
385
 
366
- export { BaseStorageListPage, BaseStoragePage, FileLocationEnum, FileManagerApiService, FolderApiService, ImageFormat, ProfileUploadProviderAdapter, STORAGE_PROVIDERS, STORAGE_ROUTES, StorageConfigApiService, StorageContainerComponent, UploadService, formatFileSize, getFileIcon, getProviderIcon, getProviderLabel, getProviderSeverity, provideStorageProviders };
367
- export type { IAwsS3Config, IAzureBlobConfig, ICreateFileManagerDto, ICreateFolderDto, ICreateStorageConfigDto, IFileManager, IFilesResponseDto, IFolder, IGetFilesRequestDto, ILocalStorageConfig, ISftpConfig, IStorageConfig, IUpdateFileManagerDto, IUpdateFolderDto, IUpdateStorageConfigDto, IUploadOptionsDto, IUploadedFileInfo };
386
+ export { BaseStorageListPage, BaseStoragePage, FILE_SIZE_UNIT_KEYS, FileLocationEnum, FileManagerApiService, FileProviderAdapter, FolderApiService, ImageFormat, PROVIDER_LABEL_KEYS, STORAGE_MESSAGES, STORAGE_PROVIDER_OPTIONS, STORAGE_ROUTES, StorageConfigApiService, StorageContainerComponent, UploadService, formatFileSize, formatFileSizeWithKey, getFileIcon, getProviderIcon, getProviderLabelKey, getProviderSeverity, provideStorageProviders };
387
+ export type { IAwsS3Config, IAzureBlobConfig, ICreateFileManagerDto, ICreateFolderDto, ICreateStorageConfigDto, IFileManager, IFilesResponseDto, IFolder, IGetFilesRequestDto, ILocalStorageConfig, ISftpConfig, IStorageConfig, IUpdateFileManagerDto, IUpdateFolderDto, IUpdateStorageConfigDto, IUploadOptionsDto, IUploadedFileInfo, StorageProviderOption };
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-storage-file-manager-form.component-CXVB9G-f.mjs","sources":["../../../projects/ng-storage/pages/file-manager/file-manager-form.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport { AngularModule, PrimeModule } from '@flusys/ng-shared';\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';\nimport { BaseStoragePage } from '../../utils/base-storage-page';\nimport { formatFileSize, getProviderLabel } from '../../utils/storage-utils';\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 changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, FormField],\n template: `\n <div class=\"card\">\n <div class=\"mb-4\">\n <h3 class=\"text-lg sm:text-xl font-semibold\">{{ isEditMode() ? 'Edit File' : 'Upload File' }}</h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">Company: {{ currentCompanyName() }}</p>\n }\n </div>\n\n <form (ngSubmit)=\"onSubmit()\">\n @if (!isEditMode()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div class=\"field\">\n <label for=\"storageConfig\" class=\"block font-medium mb-2 text-sm sm:text-base\">Storage Configuration *</label>\n <select id=\"storageConfig\" class=\"p-select-native w-full\" [formField]=\"fileForm.storageConfigId\">\n <option value=\"\">Select storage configuration...</option>\n @for (config of availableConfigs(); track config.id) {\n <option [value]=\"config.id\">{{ config.name }} ({{ getProviderLabel(config.storage) }})</option>\n }\n </select>\n @if (availableConfigs().length === 0 && !isLoadingConfigs()) {\n <small class=\"text-warn 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 <div class=\"field\">\n <label for=\"folder\" class=\"block font-medium mb-2 text-sm sm:text-base\">Folder (Optional)</label>\n <select id=\"folder\" class=\"p-select-native w-full\" [formField]=\"fileForm.folderId\">\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-muted-color 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 <div class=\"field mb-4\">\n <label for=\"folder\" class=\"block font-medium mb-2 text-sm sm:text-base\">Folder (Optional)</label>\n <select id=\"folder\" class=\"p-select-native w-full\" [formField]=\"fileForm.folderId\">\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-muted-color 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 @if (!isEditMode()) {\n <div class=\"field mb-4\">\n <label class=\"block font-medium mb-2 text-sm sm:text-base\">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 border-surface rounded-lg bg-surface-ground\">\n <i class=\"pi pi-file text-xl sm:text-2xl text-primary\"></i>\n <div class=\"flex-1 min-w-0\">\n <div class=\"font-medium truncate\">{{ file.name }}</div>\n <div class=\"text-sm text-muted-color\">{{ formatFileSize(file.size) }}</div>\n </div>\n <p-button icon=\"pi pi-times\" [text]=\"true\" severity=\"danger\" size=\"small\" (onClick)=\"fileUpload.clear()\" />\n </div>\n }\n </div>\n } @else {\n <div class=\"flex items-center justify-center flex-col p-6 sm:p-8 border-2 border-dashed border-surface rounded-lg\">\n <i class=\"pi pi-cloud-upload text-3xl sm:text-4xl text-muted-color mb-3\"></i>\n <p class=\"text-muted-color text-center text-sm sm:text-base\">Drag and drop file here or click to browse</p>\n <p class=\"text-xs sm:text-sm text-muted-color mt-2\">Maximum file size: 50MB</p>\n </div>\n }\n </ng-template>\n </p-fileupload>\n @if (!selectedFile() && !isEditMode()) {\n <small class=\"text-muted-color\">Please select a file to upload</small>\n }\n </div>\n }\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"field md:col-span-2\">\n <label for=\"name\" class=\"block font-medium mb-2 text-sm sm:text-base\">File Name *</label>\n <input pInputText id=\"name\" [formField]=\"fileForm.name\" [placeholder]=\"isEditMode() ? 'Enter file name' : 'Will be auto-filled from selected file'\" class=\"w-full\" />\n </div>\n\n <div class=\"field\">\n <label class=\"p-checkbox-native flex items-center gap-2\">\n <input type=\"checkbox\" [formField]=\"fileForm.isPrivate\" />\n <span>Private File</span>\n </label>\n <small class=\"text-muted-color block mt-2\">\n {{ formModel().isPrivate ? 'Only users with permission can access' : 'File is publicly accessible' }}\n </small>\n </div>\n </div>\n\n <div class=\"flex justify-end gap-2 mt-4\">\n <p-button label=\"Cancel\" severity=\"secondary\" [outlined]=\"true\" (onClick)=\"onCancel()\" />\n <p-button\n type=\"submit\"\n [label]=\"isEditMode() ? 'Update' : 'Upload'\"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || (!isEditMode() && !selectedFile()) || isLoading()\"\n />\n </div>\n </form>\n </div>\n `,\n})\nexport class FileManagerFormComponent extends BaseStoragePage {\n private readonly route = inject(ActivatedRoute);\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\n private readonly routeParams = toSignal(this.route.paramMap);\n private initialized = false;\n\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 /** Utility functions exposed to template */\n readonly formatFileSize = formatFileSize;\n readonly getProviderLabel = getProviderLabel;\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 */\n readonly fileForm = form(this.formModel, (f) => {\n required(f.name, { message: 'File name is required' });\n });\n\n /** Check if form is valid */\n readonly isFormValid = computed(() => this.formModel().name.trim().length > 0);\n\n constructor() {\n super();\n effect(() => {\n const params = this.routeParams();\n if (!params || this.initialized) return;\n\n this.initialized = true;\n const fileId = params.get('id');\n if (fileId) {\n this.loadFile(fileId);\n } else {\n this.loadStorageConfigs();\n }\n this.loadFolders();\n });\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 if (response.data.length === 1) {\n this.formModel.update((m) => ({ ...m, storageConfigId: response.data![0].id }));\n }\n }\n } catch {\n this.showError('Failed to load storage configurations.');\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 {\n this.showError('Failed to load file.');\n this.navigateTo(['/storage/files']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onFileSelect(event: { files?: File[]; currentFiles?: File[] }): void {\n const file = event.files?.[0] || event.currentFiles?.[0];\n if (file) {\n this.selectedFile.set(file);\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 await this.fileService.updateAsync({\n id: formValue.id,\n name: formValue.name,\n isPrivate: formValue.isPrivate,\n folderId: formValue.folderId || null,\n });\n this.showSuccess('File updated successfully.');\n } else {\n const file = this.selectedFile();\n if (!file) {\n this.showError('Please select a file to upload.');\n return;\n }\n\n if (!formValue.storageConfigId) {\n this.showError('Please select a storage configuration.');\n return;\n }\n\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 await this.fileService.createFileAsync({\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,\n });\n this.showSuccess('File uploaded successfully.');\n } else {\n throw new Error('Upload failed');\n }\n }\n\n this.navigateTo(['/storage/files']);\n } catch (error: any) {\n this.showError(error?.message || `Failed to ${this.isEditMode() ? 'update' : 'upload'} file.`);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.navigateTo(['/storage/files']);\n }\n}\n"],"names":["i2","i4"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"flusys-ng-storage-file-manager-list.component-0O_b4EjN.mjs","sources":["../../../projects/ng-storage/pages/file-manager/file-manager-list.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';\nimport { AngularModule, FILE_PERMISSIONS, HasPermissionDirective, PrimeModule } from '@flusys/ng-shared';\nimport { firstValueFrom } from 'rxjs';\nimport { IFileManager } from '../../interfaces/file-manager.interface';\nimport { FileManagerApiService } from '../../services/file-manager-api.service';\nimport { BaseStorageListPage } from '../../utils/base-storage-page';\nimport { getFileIcon, getProviderLabel, getProviderSeverity } from '../../utils/storage-utils';\n\n/**\n * File Manager List Component\n * Displays all files with company filter (if enabled)\n */\n@Component({\n selector: 'lib-file-manager-list',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AngularModule, PrimeModule, HasPermissionDirective],\n template: `\n <div class=\"card\">\n <div class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4\">\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold\">File Manager</h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n Company: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <p-button *hasPermission=\"FILE_PERMISSIONS.CREATE\" label=\"Upload File\" icon=\"pi pi-upload\" (onClick)=\"onUpload()\" styleClass=\"w-full sm:w-auto\" />\n </div>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"files()\"\n [loading]=\"isLoading()\"\n [paginator]=\"totalRecords() > 0\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n styleClass=\"p-datatable-sm\"\n >\n <ng-template #header>\n <tr>\n <th>Name</th>\n <th class=\"hidden lg:table-cell\">Type</th>\n <th>Size</th>\n <th>Location</th>\n <th class=\"hidden xl:table-cell\">Config</th>\n <th>Private</th>\n <th class=\"hidden md:table-cell\">Created</th>\n <th class=\"w-[120px]\">Actions</th>\n </tr>\n </ng-template>\n <ng-template #body let-file>\n <tr>\n <td>\n <div class=\"flex items-center gap-2\">\n <i [class]=\"getFileIcon(file.contentType)\"></i>\n <span class=\"truncate max-w-32 sm:max-w-none\">{{ file.name }}</span>\n </div>\n </td>\n <td class=\"hidden lg:table-cell\">\n <span class=\"text-sm text-muted-color\">{{ file.contentType }}</span>\n </td>\n <td>{{ file.size }} KB</td>\n <td>\n <p-tag [value]=\"getProviderLabel(file.location)\" [severity]=\"getProviderSeverity(file.location)\" />\n </td>\n <td class=\"hidden xl:table-cell\">{{ 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 class=\"hidden md:table-cell\">{{ file.createdAt | date: 'short' }}</td>\n <td>\n <div class=\"flex gap-1\">\n <p-button *hasPermission=\"FILE_PERMISSIONS.READ\" icon=\"pi pi-eye\" [text]=\"true\" severity=\"secondary\" size=\"small\" [loading]=\"viewingFileId() === file.id\" [disabled]=\"viewingFileId() === file.id\" (onClick)=\"onView(file)\" pTooltip=\"View\" tooltipPosition=\"top\" />\n <p-button *hasPermission=\"FILE_PERMISSIONS.UPDATE\" icon=\"pi pi-pencil\" [text]=\"true\" severity=\"secondary\" size=\"small\" (onClick)=\"onEdit(file.id)\" pTooltip=\"Edit\" tooltipPosition=\"top\" />\n <p-button *hasPermission=\"FILE_PERMISSIONS.DELETE\" icon=\"pi pi-trash\" [text]=\"true\" severity=\"warn\" size=\"small\" (onClick)=\"onSoftDelete(file)\" pTooltip=\"Trash\" tooltipPosition=\"top\" />\n <p-button *hasPermission=\"FILE_PERMISSIONS.DELETE\" icon=\"pi pi-times-circle\" [text]=\"true\" severity=\"danger\" size=\"small\" (onClick)=\"onPermanentDelete(file)\" pTooltip=\"Delete\" tooltipPosition=\"top\" />\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"8\" class=\"text-center py-4 text-muted-color\">\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 </div>\n `,\n})\nexport class FileManagerListComponent extends BaseStorageListPage<IFileManager> {\n // Permission constants for template\n readonly FILE_PERMISSIONS = FILE_PERMISSIONS;\n\n private readonly fileService = inject(FileManagerApiService);\n\n /** Files list alias for template compatibility */\n readonly files = this.items;\n\n /** ID of file currently being viewed (null when not viewing) */\n readonly viewingFileId = signal<string | null>(null);\n\n /** Utility functions exposed to template */\n readonly getFileIcon = getFileIcon;\n readonly getProviderLabel = getProviderLabel;\n readonly getProviderSeverity = getProviderSeverity;\n\n getResourceRoute(): string {\n return '/storage/files';\n }\n\n override getDeleteConfirmMessage(file: IFileManager): string {\n return `Are you sure you want to delete \"${file.name}\"?`;\n }\n\n async loadData(): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await firstValueFrom(\n this.fileService.getAll('', {\n pagination: this.getPaginationParams(),\n filter: {},\n select: [],\n sort: {},\n }),\n );\n\n if (response.success) {\n this.items.set(response.data ?? []);\n this.total.set(response.meta?.total ?? 0);\n }\n } catch {\n this.showError('Failed to load files.');\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onUpload(): void {\n this.navigateTo(['/storage/files/new']);\n }\n\n async onView(file: IFileManager): Promise<void> {\n this.viewingFileId.set(file.id);\n try {\n const response = await firstValueFrom(this.fileService.getFiles([file.id]));\n\n // Response type is ISingleResponse<IFilesResponseDto[]>\n if (response.success && response.data?.length && response.data[0].url) {\n window.open(response.data[0].url, '_blank');\n } else {\n this.showError('File URL is not available.');\n }\n } catch {\n this.showError('Failed to get file URL.');\n } finally {\n this.viewingFileId.set(null);\n }\n }\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.showSuccess('File moved to trash successfully.');\n this.loadData();\n } catch {\n this.showError('Failed to move file to trash.');\n }\n },\n });\n }\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({ id: file.id, type: 'permanent' });\n this.showSuccess('File permanently deleted.');\n this.loadData();\n } catch {\n this.showError('Failed to permanently delete file.');\n }\n },\n });\n }\n}\n"],"names":[],"mappings":"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"}