@flusys/ng-storage 1.0.0-rc → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/{flusys-ng-storage-file-manager-form.component-CMS_ddbs.mjs → flusys-ng-storage-file-manager-form.component-CXVB9G-f.mjs} +4 -5
  3. package/fesm2022/flusys-ng-storage-file-manager-form.component-CXVB9G-f.mjs.map +1 -0
  4. package/fesm2022/{flusys-ng-storage-file-manager-list.component-DDOFAPRD.mjs → flusys-ng-storage-file-manager-list.component-0O_b4EjN.mjs} +4 -5
  5. package/fesm2022/flusys-ng-storage-file-manager-list.component-0O_b4EjN.mjs.map +1 -0
  6. package/fesm2022/{flusys-ng-storage-folder-form.component-ClYATZkh.mjs → flusys-ng-storage-folder-form.component-BTQGEqNu.mjs} +5 -7
  7. package/fesm2022/flusys-ng-storage-folder-form.component-BTQGEqNu.mjs.map +1 -0
  8. package/fesm2022/{flusys-ng-storage-folder-list.component-CzONANHt.mjs → flusys-ng-storage-folder-list.component-B8GoIh6Z.mjs} +5 -11
  9. package/fesm2022/flusys-ng-storage-folder-list.component-B8GoIh6Z.mjs.map +1 -0
  10. package/fesm2022/{flusys-ng-storage-storage-config-form.component-CODLLCtg.mjs → flusys-ng-storage-storage-config-form.component-CorNWrmF.mjs} +70 -93
  11. package/fesm2022/flusys-ng-storage-storage-config-form.component-CorNWrmF.mjs.map +1 -0
  12. package/fesm2022/{flusys-ng-storage-storage-config-list.component-BbBx0iSL.mjs → flusys-ng-storage-storage-config-list.component-YXzz3Tvo.mjs} +14 -40
  13. package/fesm2022/flusys-ng-storage-storage-config-list.component-YXzz3Tvo.mjs.map +1 -0
  14. package/fesm2022/flusys-ng-storage.mjs +122 -248
  15. package/fesm2022/flusys-ng-storage.mjs.map +1 -1
  16. package/package.json +10 -10
  17. package/types/flusys-ng-storage.d.ts +32 -188
  18. package/fesm2022/flusys-ng-storage-file-manager-form.component-CMS_ddbs.mjs.map +0 -1
  19. package/fesm2022/flusys-ng-storage-file-manager-list.component-DDOFAPRD.mjs.map +0 -1
  20. package/fesm2022/flusys-ng-storage-folder-form.component-ClYATZkh.mjs.map +0 -1
  21. package/fesm2022/flusys-ng-storage-folder-list.component-CzONANHt.mjs.map +0 -1
  22. package/fesm2022/flusys-ng-storage-storage-config-form.component-CODLLCtg.mjs.map +0 -1
  23. package/fesm2022/flusys-ng-storage-storage-config-list.component-BbBx0iSL.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/**\n * Base Storage Page\n *\n * Provides common signals, computed values, and utilities for storage pages.\n * Used by form components that need company context and message utilities.\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 /** Loading state */\n readonly isLoading = signal(false);\n\n /** Show company info if company feature enabled */\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n\n /** Current company name */\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n /** Show success message */\n protected showSuccess(detail: string, summary = 'Success'): void {\n this.messageService.add({ severity: 'success', summary, detail });\n }\n\n /** Show error message */\n protected showError(detail: string, summary = 'Error'): void {\n this.messageService.add({ severity: 'error', summary, detail });\n }\n\n /** Navigate to a route */\n protected navigateTo(path: string[]): void {\n this.router.navigate(path);\n }\n}\n\n/**\n * Base Storage List Page\n *\n * Extends the shared BaseListPage with storage-specific functionality:\n * - Company context integration via LAYOUT_AUTH_STATE\n * - Current company name computed signal\n * - Storage-specific defaults (pageSize: 50)\n *\n * Usage:\n * ```typescript\n * @Component({ ... })\n * export class FolderListComponent extends BaseStorageListPage<IFolder> {\n * getResourceRoute(): string { return '/storage/folders'; }\n * getDeleteConfirmMessage(folder: IFolder): string { return `Delete \"${folder.name}\"?`; }\n * async loadData(): Promise<void> { ... }\n * }\n * ```\n */\n@Directive()\nexport abstract class BaseStorageListPage<T> extends BaseListPage<T> {\n protected readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n /** Override default page size for storage pages */\n override readonly pageSize = signal(50);\n\n /** Total records alias for backward compatibility */\n readonly totalRecords = this.total;\n\n /** Current company name */\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n /**\n * Default implementation - subclasses should override if needed\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\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, firstValueFrom } from 'rxjs';\nimport { ApiResourceService, ISingleResponse, IListResponse } from '@flusys/ng-shared';\nimport {\n IFileManager,\n ICreateFileManagerDto,\n IUpdateFileManagerDto,\n IGetFilesRequestDto,\n IFilesResponseDto,\n} from '../interfaces/file-manager.interface';\n\n/**\n * File Manager API Service\n * Handles file metadata CRUD operations\n * Endpoint: POST /storage/file-manager/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FileManagerApiService extends ApiResourceService<IUpdateFileManagerDto, IFileManager> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/file-manager', http);\n }\n\n /**\n * Get multiple files with valid URLs\n * POST /storage/file-manager/get-files\n * Regenerates presigned URLs if expired\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 /**\n * Get files by folder\n * POST /storage/file-manager/get-all\n * Filtered by folder ID (UUID) and company (if enabled)\n */\n getFilesByFolder(folderId: string | null, page = 1, limit = 50): Observable<IListResponse<IFileManager>> {\n return this.getAll('', {\n filter: folderId ? { folderId } : {},\n pagination: { currentPage: page - 1, pageSize: limit },\n select: [],\n sort: {},\n });\n }\n\n /**\n * Get private files (requires permission)\n * POST /storage/file-manager/get-all\n * Filtered by isPrivate and user permission 'storage.file.viewPrivate'\n */\n getPrivateFiles(page = 1, limit = 50): Observable<IListResponse<IFileManager>> {\n return this.getAll('', {\n filter: { isPrivate: true },\n pagination: { currentPage: page - 1, pageSize: limit },\n select: [],\n sort: {},\n });\n }\n\n /**\n * Create a new file record\n * POST /storage/file-manager/insert\n * Uses ICreateFileManagerDto which has different required fields than update\n */\n createFile(dto: ICreateFileManagerDto): Observable<ISingleResponse<IFileManager>> {\n return this.http.post<ISingleResponse<IFileManager>>(`${this.baseUrl}/insert`, dto);\n }\n\n /**\n * Create a new file record (async/await version)\n * POST /storage/file-manager/insert\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\n * Handles file upload/delete operations\n * Endpoint: POST /storage/upload/*\n *\n * Features:\n * - Company-scoped uploads (if company feature enabled)\n * - Image compression\n * - Multiple storage providers\n * - File validation (size, type)\n * - Default storage config from environment (services.storage.defaultStorageConfigId)\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class UploadService extends BaseApiService {\n private readonly fileManagerApi = inject(FileManagerApiService);\n\n constructor() {\n super('storage');\n }\n\n /**\n * Get default storage config ID from app config\n * Used when no storageConfigId is provided in upload options\n */\n getDefaultConfigId(): string | undefined {\n return getDefaultStorageConfigId(this.appConfig);\n }\n\n /**\n * Upload single file\n * POST /storage/upload/single-file?storageConfigId=x&folderPath=y\n *\n * @param file - File to upload\n * @param options - Upload options (storage config, compression, etc.)\n */\n uploadSingleFile(\n file: File,\n options?: IUploadOptionsDto\n ): Observable<ISingleResponse<IUploadedFileInfo>> {\n const formData = new FormData();\n formData.append('file', file);\n\n const queryParams = this.buildQueryParams(options);\n const url = queryParams\n ? `${this.getUrl('upload/single-file')}?${queryParams}`\n : this.getUrl('upload/single-file');\n\n return this.http.post<ISingleResponse<IUploadedFileInfo>>(url, formData);\n }\n\n /**\n * Upload multiple files (max 50)\n * POST /storage/upload/multiple-file?storageConfigId=x&folderPath=y\n *\n * @param files - Array of files to upload\n * @param options - Upload options\n */\n uploadMultipleFiles(\n files: File[],\n options?: IUploadOptionsDto\n ): Observable<ISingleResponse<IUploadedFileInfo[]>> {\n const formData = new FormData();\n files.forEach((file) => formData.append('files', file));\n\n const queryParams = this.buildQueryParams(options);\n const url = queryParams\n ? `${this.getUrl('upload/multiple-file')}?${queryParams}`\n : this.getUrl('upload/multiple-file');\n\n return this.http.post<ISingleResponse<IUploadedFileInfo[]>>(url, formData);\n }\n\n /**\n * Build query string from upload options\n * Uses default storageConfigId from app config if not provided in options\n */\n private buildQueryParams(options?: IUploadOptionsDto): string {\n const params = new URLSearchParams();\n\n // Use provided storageConfigId or fall back to default from config\n const storageConfigId = options?.storageConfigId ?? this.getDefaultConfigId();\n if (storageConfigId) params.append('storageConfigId', storageConfigId);\n\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 /**\n * Delete single file\n * POST /storage/upload/delete-single-file\n *\n * @param key - File key/path to delete\n * @param storageConfigId - Optional storage config ID (uses default from config if not provided)\n */\n deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>> {\n const configId = storageConfigId ?? this.getDefaultConfigId();\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-single-file'),\n { key, ...(configId && { storageConfigId: configId }) }\n );\n }\n\n /**\n * Delete multiple files\n * POST /storage/upload/delete-multiple-file\n *\n * @param keys - Array of file keys/paths to delete\n * @param storageConfigId - Optional storage config ID (uses default from config if not provided)\n */\n deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>> {\n const configId = storageConfigId ?? this.getDefaultConfigId();\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-multiple-file'),\n { keys, ...(configId && { storageConfigId: configId }) }\n );\n }\n\n /**\n * Get file download URL\n * GET /storage/upload/file/:filePath\n *\n * @param key - File key/path\n * @returns URL for direct file access\n */\n getFileUrl(key: string): string {\n return this.getUrl(`upload/file/${key}`);\n }\n\n /**\n * Upload file and register in file manager\n * Returns file manager ID (UUID) for storing in references like profilePictureId\n *\n * @param file - File to upload\n * @param options - Upload options (storage config, compression, etc.)\n * @returns Observable with file manager record (id is the UUID to store)\n */\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((uploadResponse) => {\n if (!uploadResponse.success || !uploadResponse.data) {\n throw new Error(uploadResponse.message || 'Upload failed');\n }\n\n const uploadedFile = uploadResponse.data;\n const storageConfigId = options?.storageConfigId ?? this.getDefaultConfigId();\n\n // Create file manager record using proper DTO\n return this.fileManagerApi.createFile({\n name: uploadedFile.name,\n key: uploadedFile.key,\n size: String(uploadedFile.size),\n contentType: uploadedFile.contentType,\n isPrivate: options?.isPrivate ?? false,\n folderId: options?.folderId,\n storageConfigId,\n });\n }),\n );\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 { 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<IUpdateFolderDto, IFolder> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/folder', http);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { 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 IUpdateStorageConfigDto,\n IStorageConfig\n> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/storage-config', http);\n }\n}\n","import { Routes } from '@angular/router';\n\n/**\n * Storage Module Routes\n * All storage management routes: configs, files, folders\n *\n * All routes are protected by permission guards to prevent direct URL access.\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 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 loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n {\n path: ':id',\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 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 loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n {\n path: ':id',\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 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 loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n ],\n },\n\n // Default redirect to files\n {\n path: '',\n redirectTo: 'files',\n pathMatch: 'full',\n },\n ],\n },\n];\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\n\ninterface ITab {\n id: string;\n label: string;\n icon: string;\n route: string;\n}\n\n/**\n * Storage Container Component\n *\n * Main container for Storage module with tab navigation\n * Routes: Files | Folders | Configurations\n */\n@Component({\n selector: 'lib-storage-container',\n standalone: true,\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\">Manage files, folders, and storage configurations</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 tabs; 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 /** All available tabs */\n readonly tabs: ITab[] = [\n {\n id: 'files',\n label: 'Files',\n icon: 'pi pi-file',\n route: 'files',\n },\n {\n id: 'folders',\n label: 'Folders',\n icon: 'pi pi-folder',\n route: 'folders',\n },\n {\n id: 'configs',\n label: 'Configurations',\n icon: 'pi pi-cog',\n route: 'configs',\n },\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/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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"}
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@flusys/ng-storage",
3
- "version": "1.0.0-rc",
3
+ "version": "1.0.1",
4
4
  "description": "File storage module for FLUSYS Angular applications",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
7
- "@angular/common": "^21.0.0",
8
- "@angular/core": "^21.0.0",
9
- "@flusys/ng-core": "^1.1.1-beta",
10
- "@flusys/ng-layout": "^1.1.1-beta",
11
- "@flusys/ng-shared": "^1.1.1-beta",
12
- "@primeuix/themes": "^1.0.0",
13
- "primeicons": "^7.0.0",
14
- "primeng": "^21.0.0"
7
+ "@angular/common": ">=21.0.0",
8
+ "@angular/core": ">=21.0.0",
9
+ "@flusys/ng-core": ">=1.0.1",
10
+ "@flusys/ng-layout": ">=1.0.1",
11
+ "@flusys/ng-shared": ">=1.0.1",
12
+ "@primeuix/themes": ">=1.0.0",
13
+ "primeicons": ">=7.0.0",
14
+ "primeng": ">=21.0.0"
15
15
  },
16
16
  "dependencies": {
17
17
  "tslib": "^2.3.0"
@@ -28,4 +28,4 @@
28
28
  "default": "./fesm2022/flusys-ng-storage.mjs"
29
29
  }
30
30
  }
31
- }
31
+ }
@@ -1,4 +1,4 @@
1
- import { IBaseEntity, BaseListPage, IProfileUploadProvider, IProfileUploadOptions, ISingleResponse, IProfileUploadResult, ApiResourceService, IListResponse } from '@flusys/ng-shared';
1
+ import { IBaseEntity, BaseListPage, IProfileUploadProvider, IProfileUploadOptions, ISingleResponse, IProfileUploadResult, ApiResourceService } 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';
@@ -32,10 +32,7 @@ declare enum ImageFormat {
32
32
  /**
33
33
  * File Manager Interface (matches backend IFileManager)
34
34
  */
35
- interface IFileManager {
36
- id: string;
37
- createdAt: Date;
38
- updatedAt: Date;
35
+ interface IFileManager extends IBaseEntity {
39
36
  name: string;
40
37
  contentType: string;
41
38
  size: string;
@@ -87,69 +84,36 @@ interface IFilesResponseDto {
87
84
  url: string;
88
85
  }
89
86
 
90
- /**
91
- * Folder Interface
92
- * Matches backend IFolder and FolderResponseDto
93
- */
94
87
  interface IFolder extends IBaseEntity {
95
88
  name: string;
96
89
  slug: string;
97
90
  companyId?: string | null;
98
91
  }
99
- /**
100
- * Create Folder DTO
101
- * POST /storage/folder/insert
102
- */
103
92
  interface ICreateFolderDto {
104
93
  name: string;
105
94
  }
106
- /**
107
- * Update Folder DTO
108
- * POST /storage/folder/update
109
- */
110
- interface IUpdateFolderDto {
95
+ interface IUpdateFolderDto extends Partial<ICreateFolderDto> {
111
96
  id: string;
112
- name?: string;
113
97
  }
114
98
 
115
- /**
116
- * Storage Config Interface
117
- * Matches backend IStorageConfig and StorageConfigResponseDto
118
- */
119
99
  interface IStorageConfig extends IBaseEntity {
120
100
  name: string;
121
101
  storage: FileLocationEnum;
122
- config: Record<string, any>;
102
+ config: Record<string, unknown>;
123
103
  isActive: boolean;
124
104
  isDefault: boolean;
125
105
  companyId?: string | null;
126
106
  }
127
- /**
128
- * Create Storage Config DTO
129
- * POST /storage/storage-config/insert
130
- */
131
107
  interface ICreateStorageConfigDto {
132
108
  name: string;
133
109
  storage: FileLocationEnum;
134
- config: Record<string, any>;
110
+ config: Record<string, unknown>;
135
111
  isActive?: boolean;
136
112
  isDefault?: boolean;
137
113
  }
138
- /**
139
- * Update Storage Config DTO
140
- * POST /storage/storage-config/update
141
- */
142
- interface IUpdateStorageConfigDto {
114
+ interface IUpdateStorageConfigDto extends Partial<ICreateStorageConfigDto> {
143
115
  id: string;
144
- name?: string;
145
- storage?: FileLocationEnum;
146
- config?: Record<string, any>;
147
- isActive?: boolean;
148
- isDefault?: boolean;
149
116
  }
150
- /**
151
- * AWS S3 Configuration
152
- */
153
117
  interface IAwsS3Config {
154
118
  region: string;
155
119
  bucket: string;
@@ -157,17 +121,11 @@ interface IAwsS3Config {
157
121
  secretAccessKey: string;
158
122
  endpoint?: string;
159
123
  }
160
- /**
161
- * Azure Blob Storage Configuration
162
- */
163
124
  interface IAzureBlobConfig {
164
125
  accountName: string;
165
126
  accountKey: string;
166
127
  containerName: string;
167
128
  }
168
- /**
169
- * SFTP Configuration
170
- */
171
129
  interface ISftpConfig {
172
130
  host: string;
173
131
  port: number;
@@ -176,9 +134,6 @@ interface ISftpConfig {
176
134
  privateKey?: string;
177
135
  basePath: string;
178
136
  }
179
- /**
180
- * Local Storage Configuration
181
- */
182
137
  interface ILocalStorageConfig {
183
138
  basePath: string;
184
139
  }
@@ -203,6 +158,8 @@ interface IUploadedFileInfo {
203
158
  key: string;
204
159
  size: number;
205
160
  contentType: string;
161
+ location?: string;
162
+ storageConfigId?: string;
206
163
  }
207
164
 
208
165
  /**
@@ -242,61 +199,25 @@ declare const STORAGE_PROVIDERS: readonly [{
242
199
  readonly value: FileLocationEnum.LOCAL;
243
200
  }];
244
201
 
245
- /**
246
- * Base Storage Page
247
- *
248
- * Provides common signals, computed values, and utilities for storage pages.
249
- * Used by form components that need company context and message utilities.
250
- */
251
202
  declare abstract class BaseStoragePage {
252
203
  protected readonly router: Router;
253
204
  protected readonly messageService: MessageService;
254
205
  protected readonly appConfig: _flusys_ng_core.IAppConfig;
255
206
  protected readonly companyContext: _flusys_ng_layout.ILayoutAuthState;
256
- /** Loading state */
257
207
  readonly isLoading: i0.WritableSignal<boolean>;
258
- /** Show company info if company feature enabled */
259
208
  readonly showCompanyInfo: i0.Signal<boolean>;
260
- /** Current company name */
261
209
  readonly currentCompanyName: i0.Signal<string>;
262
- /** Show success message */
263
210
  protected showSuccess(detail: string, summary?: string): void;
264
- /** Show error message */
265
211
  protected showError(detail: string, summary?: string): void;
266
- /** Navigate to a route */
267
212
  protected navigateTo(path: string[]): void;
268
213
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseStoragePage, never>;
269
214
  static ɵdir: i0.ɵɵDirectiveDeclaration<BaseStoragePage, never, never, {}, {}, never, never, true, never>;
270
215
  }
271
- /**
272
- * Base Storage List Page
273
- *
274
- * Extends the shared BaseListPage with storage-specific functionality:
275
- * - Company context integration via LAYOUT_AUTH_STATE
276
- * - Current company name computed signal
277
- * - Storage-specific defaults (pageSize: 50)
278
- *
279
- * Usage:
280
- * ```typescript
281
- * @Component({ ... })
282
- * export class FolderListComponent extends BaseStorageListPage<IFolder> {
283
- * getResourceRoute(): string { return '/storage/folders'; }
284
- * getDeleteConfirmMessage(folder: IFolder): string { return `Delete "${folder.name}"?`; }
285
- * async loadData(): Promise<void> { ... }
286
- * }
287
- * ```
288
- */
289
216
  declare abstract class BaseStorageListPage<T> extends BaseListPage<T> {
290
217
  protected readonly companyContext: _flusys_ng_layout.ILayoutAuthState;
291
- /** Override default page size for storage pages */
292
218
  readonly pageSize: i0.WritableSignal<number>;
293
- /** Total records alias for backward compatibility */
294
219
  readonly totalRecords: i0.WritableSignal<number>;
295
- /** Current company name */
296
220
  readonly currentCompanyName: i0.Signal<string>;
297
- /**
298
- * Default implementation - subclasses should override if needed
299
- */
300
221
  getDeleteConfirmMessage(item: T): string;
301
222
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseStorageListPage<any>, never>;
302
223
  static ɵdir: i0.ɵɵDirectiveDeclaration<BaseStorageListPage<any>, never, never, {}, {}, never, never, true, never>;
@@ -343,43 +264,10 @@ declare class ProfileUploadProviderAdapter implements IProfileUploadProvider {
343
264
  */
344
265
  declare function provideStorageProviders(): Provider[];
345
266
 
346
- /**
347
- * File Manager API Service
348
- * Handles file metadata CRUD operations
349
- * Endpoint: POST /storage/file-manager/*
350
- *
351
- * Note: Company feature enabled - all queries automatically scoped to user's company
352
- */
353
267
  declare class FileManagerApiService extends ApiResourceService<IUpdateFileManagerDto, IFileManager> {
354
268
  constructor();
355
- /**
356
- * Get multiple files with valid URLs
357
- * POST /storage/file-manager/get-files
358
- * Regenerates presigned URLs if expired
359
- */
360
269
  getFiles(fileIds: string[]): Observable<ISingleResponse<IFilesResponseDto[]>>;
361
- /**
362
- * Get files by folder
363
- * POST /storage/file-manager/get-all
364
- * Filtered by folder ID (UUID) and company (if enabled)
365
- */
366
- getFilesByFolder(folderId: string | null, page?: number, limit?: number): Observable<IListResponse<IFileManager>>;
367
- /**
368
- * Get private files (requires permission)
369
- * POST /storage/file-manager/get-all
370
- * Filtered by isPrivate and user permission 'storage.file.viewPrivate'
371
- */
372
- getPrivateFiles(page?: number, limit?: number): Observable<IListResponse<IFileManager>>;
373
- /**
374
- * Create a new file record
375
- * POST /storage/file-manager/insert
376
- * Uses ICreateFileManagerDto which has different required fields than update
377
- */
378
270
  createFile(dto: ICreateFileManagerDto): Observable<ISingleResponse<IFileManager>>;
379
- /**
380
- * Create a new file record (async/await version)
381
- * POST /storage/file-manager/insert
382
- */
383
271
  createFileAsync(dto: ICreateFileManagerDto): Promise<ISingleResponse<IFileManager>>;
384
272
  static ɵfac: i0.ɵɵFactoryDeclaration<FileManagerApiService, never>;
385
273
  static ɵprov: i0.ɵɵInjectableDeclaration<FileManagerApiService>;
@@ -392,7 +280,7 @@ declare class FileManagerApiService extends ApiResourceService<IUpdateFileManage
392
280
  *
393
281
  * Note: Company feature enabled - all queries automatically scoped to user's company
394
282
  */
395
- declare class FolderApiService extends ApiResourceService<IUpdateFolderDto, IFolder> {
283
+ declare class FolderApiService extends ApiResourceService<ICreateFolderDto | IUpdateFolderDto, IFolder> {
396
284
  constructor();
397
285
  static ɵfac: i0.ɵɵFactoryDeclaration<FolderApiService, never>;
398
286
  static ɵprov: i0.ɵɵInjectableDeclaration<FolderApiService>;
@@ -405,98 +293,47 @@ declare class FolderApiService extends ApiResourceService<IUpdateFolderDto, IFol
405
293
  *
406
294
  * Note: Company feature enabled - all queries automatically scoped to user's company
407
295
  */
408
- declare class StorageConfigApiService extends ApiResourceService<IUpdateStorageConfigDto, IStorageConfig> {
296
+ declare class StorageConfigApiService extends ApiResourceService<ICreateStorageConfigDto | IUpdateStorageConfigDto, IStorageConfig> {
409
297
  constructor();
410
298
  static ɵfac: i0.ɵɵFactoryDeclaration<StorageConfigApiService, never>;
411
299
  static ɵprov: i0.ɵɵInjectableDeclaration<StorageConfigApiService>;
412
300
  }
413
301
 
414
302
  /**
415
- * Upload Service
416
- * Handles file upload/delete operations
303
+ * Upload Service - File upload/delete operations
417
304
  * Endpoint: POST /storage/upload/*
418
- *
419
- * Features:
420
- * - Company-scoped uploads (if company feature enabled)
421
- * - Image compression
422
- * - Multiple storage providers
423
- * - File validation (size, type)
424
- * - Default storage config from environment (services.storage.defaultStorageConfigId)
425
305
  */
426
306
  declare class UploadService extends BaseApiService {
427
307
  private readonly fileManagerApi;
428
308
  constructor();
429
- /**
430
- * Get default storage config ID from app config
431
- * Used when no storageConfigId is provided in upload options
432
- */
309
+ /** Get default storage config ID from app config */
433
310
  getDefaultConfigId(): string | undefined;
434
- /**
435
- * Upload single file
436
- * POST /storage/upload/single-file?storageConfigId=x&folderPath=y
437
- *
438
- * @param file - File to upload
439
- * @param options - Upload options (storage config, compression, etc.)
440
- */
311
+ /** Upload single file - POST /storage/upload/single-file */
441
312
  uploadSingleFile(file: File, options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo>>;
442
- /**
443
- * Upload multiple files (max 50)
444
- * POST /storage/upload/multiple-file?storageConfigId=x&folderPath=y
445
- *
446
- * @param files - Array of files to upload
447
- * @param options - Upload options
448
- */
313
+ /** Upload multiple files (max 50) - POST /storage/upload/multiple-file */
449
314
  uploadMultipleFiles(files: File[], options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo[]>>;
450
- /**
451
- * Build query string from upload options
452
- * Uses default storageConfigId from app config if not provided in options
453
- */
454
- private buildQueryParams;
455
- /**
456
- * Delete single file
457
- * POST /storage/upload/delete-single-file
458
- *
459
- * @param key - File key/path to delete
460
- * @param storageConfigId - Optional storage config ID (uses default from config if not provided)
461
- */
315
+ /** Delete single file - POST /storage/upload/delete-single-file */
462
316
  deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>>;
463
- /**
464
- * Delete multiple files
465
- * POST /storage/upload/delete-multiple-file
466
- *
467
- * @param keys - Array of file keys/paths to delete
468
- * @param storageConfigId - Optional storage config ID (uses default from config if not provided)
469
- */
317
+ /** Delete multiple files - POST /storage/upload/delete-multiple-file */
470
318
  deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>>;
471
- /**
472
- * Get file download URL
473
- * GET /storage/upload/file/:filePath
474
- *
475
- * @param key - File key/path
476
- * @returns URL for direct file access
477
- */
319
+ /** Get file download URL - GET /storage/upload/file/:filePath */
478
320
  getFileUrl(key: string): string;
479
- /**
480
- * Upload file and register in file manager
481
- * Returns file manager ID (UUID) for storing in references like profilePictureId
482
- *
483
- * @param file - File to upload
484
- * @param options - Upload options (storage config, compression, etc.)
485
- * @returns Observable with file manager record (id is the UUID to store)
486
- */
321
+ /** Upload file and register in file manager - returns file manager ID (UUID) */
487
322
  uploadAndRegister(file: File, options?: IUploadOptionsDto & {
488
323
  isPrivate?: boolean;
489
324
  folderId?: string;
490
325
  }): Observable<ISingleResponse<IFileManager>>;
326
+ private resolveConfigId;
327
+ private buildUploadUrl;
328
+ private buildQueryParams;
329
+ private buildDeleteBody;
491
330
  static ɵfac: i0.ɵɵFactoryDeclaration<UploadService, never>;
492
331
  static ɵprov: i0.ɵɵInjectableDeclaration<UploadService>;
493
332
  }
494
333
 
495
334
  /**
496
335
  * Storage Module Routes
497
- * All storage management routes: configs, files, folders
498
- *
499
- * All routes are protected by permission guards to prevent direct URL access.
336
+ * All routes protected by permission guards
500
337
  */
501
338
  declare const STORAGE_ROUTES: Routes;
502
339
 
@@ -505,16 +342,23 @@ interface ITab {
505
342
  label: string;
506
343
  icon: string;
507
344
  route: string;
345
+ permission: string;
508
346
  }
509
347
  /**
510
348
  * Storage Container Component
511
349
  *
512
350
  * Main container for Storage module with tab navigation
513
351
  * Routes: Files | Folders | Configurations
352
+ * Tabs are filtered based on user permissions
514
353
  */
515
354
  declare class StorageContainerComponent {
516
- /** All available tabs */
517
- readonly tabs: ITab[];
355
+ private readonly permissionValidator;
356
+ /** All available tabs with required permissions */
357
+ private readonly allTabs;
358
+ /** Visible tabs based on user permissions */
359
+ readonly visibleTabs: i0.Signal<ITab[]>;
360
+ /** Dynamic subtitle based on visible tabs */
361
+ readonly subtitle: i0.Signal<string>;
518
362
  static ɵfac: i0.ɵɵFactoryDeclaration<StorageContainerComponent, never>;
519
363
  static ɵcmp: i0.ɵɵComponentDeclaration<StorageContainerComponent, "lib-storage-container", never, {}, {}, never, never, true, never>;
520
364
  }