@flusys/ng-storage 5.1.3 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,12 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, signal, computed, Directive, Injectable, Component } from '@angular/core';
2
+ import { inject, signal, computed, Directive, DestroyRef, Injectable, Component } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
4
  import { Router, RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router';
4
5
  import { APP_CONFIG, DEFAULT_APP_NAME, BaseApiService, getDefaultStorageConfigId } from '@flusys/ng-core';
5
6
  import { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';
6
- import { TranslateService, BaseListPage, ApiResourceService, FILE_PROVIDER, permissionGuard, FILE_PERMISSIONS, FOLDER_PERMISSIONS, STORAGE_CONFIG_PERMISSIONS, resolveTranslationModule, SHARED_MESSAGES, PermissionValidatorService, TranslatePipe } from '@flusys/ng-shared';
7
- import { MessageService } from 'primeng/api';
8
- import { switchMap, map, from } from 'rxjs';
7
+ import { TranslateService, ApiResourceService, FILE_PROVIDER, permissionGuard, FILE_PERMISSIONS, FOLDER_PERMISSIONS, STORAGE_CONFIG_PERMISSIONS, resolveTranslationModule, SHARED_MESSAGES, PermissionValidatorService, TranslatePipe } from '@flusys/ng-shared';
8
+ import { MessageService, ConfirmationService } from 'primeng/api';
9
+ import { from, switchMap, map } from 'rxjs';
9
10
  import { CommonModule } from '@angular/common';
10
11
 
11
12
  const STORAGE_MESSAGES = {
@@ -329,21 +330,111 @@ class BaseStoragePage {
329
330
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: BaseStoragePage, decorators: [{
330
331
  type: Directive
331
332
  }] });
332
- class BaseStorageListPage extends BaseListPage {
333
- companyContext = inject(LAYOUT_AUTH_STATE);
333
+ class BaseStorageListPage {
334
+ router = inject(Router);
335
+ messageService = inject(MessageService);
336
+ appConfig = inject(APP_CONFIG);
337
+ confirmationService = inject(ConfirmationService);
338
+ destroyRef = inject(DestroyRef);
334
339
  translateAdapter = inject(TranslateService);
340
+ companyContext = inject(LAYOUT_AUTH_STATE);
341
+ items = signal([], ...(ngDevMode ? [{ debugName: "items" }] : []));
342
+ isLoading = signal(false, ...(ngDevMode ? [{ debugName: "isLoading" }] : []));
343
+ total = signal(0, ...(ngDevMode ? [{ debugName: "total" }] : []));
335
344
  pageSize = signal(50, ...(ngDevMode ? [{ debugName: "pageSize" }] : []));
345
+ first = signal(0, ...(ngDevMode ? [{ debugName: "first" }] : []));
346
+ currentPage = computed(() => Math.floor(this.first() / this.pageSize()), ...(ngDevMode ? [{ debugName: "currentPage" }] : []));
347
+ showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature, ...(ngDevMode ? [{ debugName: "showCompanyInfo" }] : []));
336
348
  totalRecords = this.total;
337
349
  currentCompanyName = computed(() => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME, ...(ngDevMode ? [{ debugName: "currentCompanyName" }] : []));
338
350
  getDeleteConfirmMessage(item) {
339
351
  const itemName = item.name;
340
352
  const name = itemName ?? this.translateAdapter.translate('storage.delete.this.item');
341
- return this.translateAdapter.translate('shared.confirm.delete.item', {
342
- name,
353
+ return this.translateAdapter.translate('shared.confirm.delete.item', { name });
354
+ }
355
+ onCreate() {
356
+ this.router.navigate([this.getResourceRoute(), 'new']);
357
+ }
358
+ onEdit(id) {
359
+ this.router.navigate([this.getResourceRoute(), id]);
360
+ }
361
+ onPageChange(event) {
362
+ this.first.set(event.first ?? 0);
363
+ this.pageSize.set(event.rows ?? 10);
364
+ this.loadData();
365
+ }
366
+ getPaginationParams() {
367
+ return { currentPage: this.currentPage(), pageSize: this.pageSize() };
368
+ }
369
+ showSuccess(detail, summary) {
370
+ this.messageService.add({
371
+ severity: 'success',
372
+ summary: summary ?? this.t('shared.success'),
373
+ detail,
343
374
  });
344
375
  }
345
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: BaseStorageListPage, deps: null, target: i0.ɵɵFactoryTarget.Directive });
346
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.5", type: BaseStorageListPage, isStandalone: true, usesInheritance: true, ngImport: i0 });
376
+ showError(detail, summary) {
377
+ this.messageService.add({
378
+ severity: 'error',
379
+ summary: summary ?? this.t('shared.error'),
380
+ detail,
381
+ });
382
+ }
383
+ showInfo(detail, summary) {
384
+ this.messageService.add({
385
+ severity: 'info',
386
+ summary: summary ?? this.t('shared.info'),
387
+ detail,
388
+ });
389
+ }
390
+ showWarn(detail, summary) {
391
+ this.messageService.add({
392
+ severity: 'warn',
393
+ summary: summary ?? this.t('shared.warning'),
394
+ detail,
395
+ });
396
+ }
397
+ onDelete(item, idGetter, deleteApiCall, options) {
398
+ this.confirmationService.confirm({
399
+ message: this.getDeleteConfirmMessage(item),
400
+ header: options?.header ?? this.t('shared.confirm.delete.header'),
401
+ icon: 'pi pi-exclamation-triangle',
402
+ acceptButtonStyleClass: 'p-button-danger',
403
+ accept: () => {
404
+ from(deleteApiCall(idGetter(item)))
405
+ .pipe(takeUntilDestroyed(this.destroyRef))
406
+ .subscribe({
407
+ next: (res) => {
408
+ const r = res;
409
+ this.showSuccess(r?.messageKey ? this.t(r.messageKey, r.messageVariables) : (r?.message ?? ''));
410
+ this.loadData();
411
+ },
412
+ });
413
+ },
414
+ });
415
+ }
416
+ async onDeleteAsync(item, idGetter, deleteApiCall, options) {
417
+ this.confirmationService.confirm({
418
+ message: this.getDeleteConfirmMessage(item),
419
+ header: options?.header ?? this.t('shared.confirm.delete.header'),
420
+ icon: 'pi pi-exclamation-triangle',
421
+ acceptButtonStyleClass: 'p-button-danger',
422
+ accept: async () => {
423
+ const res = await deleteApiCall(idGetter(item));
424
+ const r = res;
425
+ this.showSuccess(r?.messageKey ? this.t(r.messageKey, r.messageVariables) : (r?.message ?? ''));
426
+ await this.loadData();
427
+ },
428
+ });
429
+ }
430
+ navigateTo(path) {
431
+ this.router.navigate(path);
432
+ }
433
+ t(key, variables) {
434
+ return this.translateAdapter?.translate(key, variables) ?? key;
435
+ }
436
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: BaseStorageListPage, deps: [], target: i0.ɵɵFactoryTarget.Directive });
437
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.5", type: BaseStorageListPage, isStandalone: true, ngImport: i0 });
347
438
  }
348
439
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: BaseStorageListPage, decorators: [{
349
440
  type: Directive
@@ -1 +1 @@
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 // 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.by.ids.success': 'Files retrieved successfully by Ids',\n 'file.get.by.filter.success': 'Files retrieved successfully by filter',\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',\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.by.ids.success': 'Folders retrieved successfully by Ids',\n 'folder.get.by.filter.success': 'Folders retrieved successfully by filter',\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 not found',\n\n // Storage config CRUD (API keys)\n 'storage.config.create.success': 'Storage configuration created successfully',\n 'storage.config.create.many.success':\n '{{count}} storage configurations created successfully',\n 'storage.config.get.success': 'Storage configuration retrieved successfully',\n 'storage.config.get.by.ids.success':\n 'Storage configurations retrieved successfully by Ids',\n 'storage.config.get.by.filter.success':\n 'Storage configurations retrieved successfully by filter',\n 'storage.config.get.all.success':\n 'Storage configurations retrieved successfully',\n 'storage.config.update.success': 'Storage configuration updated successfully',\n 'storage.config.update.many.success':\n '{{count}} storage configurations updated successfully',\n 'storage.config.delete.success': 'Storage configuration deleted successfully',\n 'storage.config.restore.success':\n 'Storage configuration restored successfully',\n\n // Upload (API keys)\n 'upload.success': 'File uploaded successfully',\n 'upload.many.success': 'Files uploaded successfully',\n 'upload.file.too.large':\n 'File size ({{fileSize}}MB) exceeds maximum {{maxSize}}MB',\n 'upload.invalid.type':\n 'File type \"{{mimeType}}\" not allowed. Allowed: {{allowedTypes}}',\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 // pages/storage-container/storage-container.component.ts\n 'storage.title': 'Storage',\n 'storage.subtitle': 'Manage files, folders, and storage configurations',\n 'storage.file.title': 'Files',\n 'storage.folder.title': 'Folder Setup',\n 'storage.config.title': 'Storage Configurations',\n\n // pages/storage-config/storage-config-list.component.ts\n 'storage.button.new.configuration': 'New Configuration',\n 'storage.table.provider': 'Provider',\n 'storage.table.created': 'Created',\n 'storage.empty.configs.in.company':\n 'No storage configurations found in current company',\n 'storage.empty.configs': 'No storage configurations found',\n 'storage.config.load.failed': 'Failed to load storage configurations',\n 'storage.config.delete.title': 'Delete Configuration',\n\n // pages/storage-config/storage-config-form.component.ts\n 'storage.config.edit.config': 'Edit Storage Configuration',\n 'storage.config.new.config': 'New Configuration',\n 'storage.config.config.name.required': 'Configuration Name *',\n 'storage.config.config.name.placeholder': 'e.g., Production AWS S3',\n 'storage.config.provider.required': 'Storage Provider *',\n 'storage.set.as.default': 'Set as Default',\n 'storage.aws.title': 'AWS S3 Configuration',\n 'storage.config.region.required': 'AWS Region *',\n 'storage.aws.region.placeholder': 'us-east-1',\n 'storage.config.bucket.required': 'Bucket Name *',\n 'storage.aws.bucket.placeholder': 'my-bucket',\n 'storage.config.access.key.required': 'Access Key ID *',\n 'storage.config.secret.key.required': 'Secret Access Key *',\n 'storage.config.endpoint.optional': 'Custom Endpoint (Optional)',\n 'storage.config.endpoint.placeholder': 'https://s3.custom-endpoint.com',\n 'storage.azure.title': 'Azure Blob Configuration',\n 'storage.azure.account.name.required': 'Account Name *',\n 'storage.azure.container.name.required': 'Container Name *',\n 'storage.azure.account.key.required': 'Account Key *',\n 'storage.sftp.title': 'SFTP Configuration',\n 'storage.sftp.host.required': 'Host *',\n 'storage.sftp.host.placeholder': 'sftp.example.com',\n 'storage.sftp.port.required': 'Port *',\n 'storage.sftp.port.placeholder': '22',\n 'storage.sftp.username.required': 'Username *',\n 'storage.sftp.password.required': 'Password *',\n 'storage.sftp.base.path.required': 'Base Path *',\n 'storage.sftp.base.path.placeholder': '/uploads',\n 'storage.local.title': 'Local Storage Configuration',\n 'storage.local.base.path.required': 'Base Path *',\n 'storage.local.base.path.placeholder': '/var/www/uploads',\n 'storage.config.endpoint': 'Endpoint URL',\n 'storage.validation.config.name.required': 'Configuration name is required',\n\n // pages/file-manager/file-manager-list.component.ts\n 'storage.file.manager.title': 'File Manager',\n 'storage.button.upload.file': 'Upload File',\n 'storage.table.size': 'Size',\n 'storage.table.location': 'Location',\n 'storage.table.config': 'Config',\n 'storage.table.private': 'Private',\n 'storage.private': 'Private',\n 'storage.public': 'Public',\n 'storage.tooltip.trash': 'Trash',\n 'storage.empty.files.in.company': 'No files found in current company',\n 'storage.empty.files': 'No files found',\n 'storage.file.url.not.available': 'File URL is not available',\n 'storage.delete.move.to.trash.confirm':\n 'Move \"{{name}}\" to trash? You can recover it later.',\n 'storage.delete.move.to.trash': 'Move to Trash',\n 'storage.delete.permanent.delete.confirm':\n 'Permanently delete \"{{name}}\"? This action CANNOT be undone and will delete the file from storage.',\n 'storage.delete.permanent.delete': 'Permanent Delete',\n 'storage.delete.permanent.delete.button': 'Delete Permanently',\n\n // pages/file-manager/file-manager-form.component.ts\n 'storage.file.manager.edit.file': 'Edit File',\n 'storage.file.manager.upload.file': 'Upload File',\n 'storage.config.select.config': 'Select storage configuration...',\n 'storage.config.no.configs':\n 'No storage configurations found. Please create one first.',\n 'storage.folder.optional': 'Folder (Optional)',\n 'storage.folder.no.folder': 'No folder (root level)',\n 'storage.folder.no.folders.available':\n 'No folders available. File will be uploaded to root level.',\n 'storage.folder.no.folders.edit': 'No folders available.',\n 'storage.file.select.required': 'Select File *',\n 'storage.button.choose.file': 'Choose File',\n 'storage.upload.drag.drop': 'Drag and drop file here or click to browse',\n 'storage.upload.max.size': 'Maximum file size: {{size}}',\n 'storage.upload.please.select': 'Please select a file to upload',\n 'storage.file.name.required': 'File Name *',\n 'storage.file.placeholder.edit': 'Enter file name',\n 'storage.file.placeholder': 'Will be auto-filled from selected file',\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.validation.file.name.required': 'File name is required',\n 'storage.error.no.file': 'Please select a file',\n 'storage.error.no.config': 'Please select a storage configuration',\n 'storage.upload.failed': 'Failed to upload file',\n\n // pages/folder/folder-list.component.ts\n 'storage.button.new.folder': 'New Folder',\n 'storage.table.slug': 'Slug',\n 'storage.empty.folders.in.company': 'No folders found in current company',\n 'storage.empty.folders': 'No folders found',\n 'storage.folder.delete.title': 'Delete Folder',\n\n // pages/folder/folder-form.component.ts\n 'storage.folder.edit.folder': 'Edit Folder',\n 'storage.folder.new.folder': 'New Folder',\n 'storage.folder.name.required': 'Folder Name *',\n 'storage.folder.name.placeholder': 'Enter folder name',\n 'storage.validation.folder.name.required': 'Folder name is required',\n\n // utils/base-storage-page.ts\n 'storage.delete.this.item': 'this item',\n\n // utils/storage-utils.ts\n 'storage.size.bytes': 'Bytes',\n 'storage.size.gb': 'GB',\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(\n storage: FileLocationEnum | string,\n): 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 = [\n 'storage.size.bytes',\n 'shared.size.kb',\n 'shared.size.mb',\n 'storage.size.gb',\n] 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): {\n value: string;\n unitKey: string;\n} {\n if (bytes <= 0) return { value: '0', unitKey: 'storage.size.bytes' };\n const k = 1024;\n const i = Math.min(\n Math.floor(Math.log(bytes) / Math.log(k)),\n FILE_SIZE_UNIT_KEYS.length - 1,\n );\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 'shared.size.kb': 'KB',\n 'shared.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 } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { BaseListPage, TranslateService } 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(TranslateService);\n\n readonly isLoading = signal(false);\n readonly showCompanyInfo = computed(\n () => this.appConfig.enableCompanyFeature,\n );\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\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(TranslateService);\n\n override readonly pageSize = signal(50);\n readonly totalRecords = this.total;\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n getDeleteConfirmMessage(item: T): string {\n const itemName = (item as { name?: string }).name;\n const name =\n itemName ?? this.translateAdapter.translate('storage.delete.this.item');\n return this.translateAdapter.translate('shared.confirm.delete.item', {\n name,\n });\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n ApiResourceService,\n IBulkResponse,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateFileManagerDto,\n IFileManager,\n IFilesResponseDto,\n IGetFilesRequestDto,\n IUpdateFileManagerDto,\n} from '../interfaces/file-manager.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class FileManagerApiService extends ApiResourceService<\n IUpdateFileManagerDto,\n IFileManager\n> {\n constructor() {\n super('file-manager', 'storage');\n }\n\n getFiles(\n fileIds: string[],\n ): Observable<ISingleResponse<IFilesResponseDto[]>> {\n const requests: IGetFilesRequestDto[] = fileIds.map((id) => ({ id }));\n return this.http.post<ISingleResponse<IFilesResponseDto[]>>(\n `${this.baseUrl}/get-files`,\n requests,\n );\n }\n\n createFile(\n dto: ICreateFileManagerDto,\n ): Observable<ISingleResponse<IFileManager>> {\n return this.http.post<ISingleResponse<IFileManager>>(\n `${this.baseUrl}/insert`,\n dto,\n );\n }\n\n createFiles(\n dtos: ICreateFileManagerDto[],\n ): Observable<IBulkResponse<IFileManager>> {\n return this.http.post<IBulkResponse<IFileManager>>(\n `${this.baseUrl}/insert-many`,\n dtos,\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport {\n ICreateFolderDto,\n IFolder,\n IUpdateFolderDto,\n} 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<\n ICreateFolderDto | IUpdateFolderDto,\n IFolder\n> {\n constructor() {\n super('folder', 'storage');\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport {\n ICreateStorageConfigDto,\n IStorageConfig,\n IUpdateStorageConfigDto,\n} 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', '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 { from, 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 from(this.fileManagerApi\n .getAll(\n { pagination: { currentPage: filter.page, pageSize: filter.pageSize }, filter: Object.keys(filterObj).length > 0 ? filterObj : undefined },\n filter.search || '',\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 from(this.folderApi\n .getAll(\n { pagination: { currentPage: filter.page, pageSize: filter.pageSize } },\n filter.search || '',\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 from(this.storageConfigApi\n .getAll(\n { pagination: { currentPage: filter.page, pageSize: filter.pageSize } },\n filter.search || '',\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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"}
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 // 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.by.ids.success': 'Files retrieved successfully by Ids',\n 'file.get.by.filter.success': 'Files retrieved successfully by filter',\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',\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.by.ids.success': 'Folders retrieved successfully by Ids',\n 'folder.get.by.filter.success': 'Folders retrieved successfully by filter',\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 not found',\n\n // Storage config CRUD (API keys)\n 'storage.config.create.success': 'Storage configuration created successfully',\n 'storage.config.create.many.success':\n '{{count}} storage configurations created successfully',\n 'storage.config.get.success': 'Storage configuration retrieved successfully',\n 'storage.config.get.by.ids.success':\n 'Storage configurations retrieved successfully by Ids',\n 'storage.config.get.by.filter.success':\n 'Storage configurations retrieved successfully by filter',\n 'storage.config.get.all.success':\n 'Storage configurations retrieved successfully',\n 'storage.config.update.success': 'Storage configuration updated successfully',\n 'storage.config.update.many.success':\n '{{count}} storage configurations updated successfully',\n 'storage.config.delete.success': 'Storage configuration deleted successfully',\n 'storage.config.restore.success':\n 'Storage configuration restored successfully',\n\n // Upload (API keys)\n 'upload.success': 'File uploaded successfully',\n 'upload.many.success': 'Files uploaded successfully',\n 'upload.file.too.large':\n 'File size ({{fileSize}}MB) exceeds maximum {{maxSize}}MB',\n 'upload.invalid.type':\n 'File type \"{{mimeType}}\" not allowed. Allowed: {{allowedTypes}}',\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 // pages/storage-container/storage-container.component.ts\n 'storage.title': 'Storage',\n 'storage.subtitle': 'Manage files, folders, and storage configurations',\n 'storage.file.title': 'Files',\n 'storage.folder.title': 'Folder Setup',\n 'storage.config.title': 'Storage Configurations',\n\n // pages/storage-config/storage-config-list.component.ts\n 'storage.button.new.configuration': 'New Configuration',\n 'storage.table.provider': 'Provider',\n 'storage.table.created': 'Created',\n 'storage.empty.configs.in.company':\n 'No storage configurations found in current company',\n 'storage.empty.configs': 'No storage configurations found',\n 'storage.config.load.failed': 'Failed to load storage configurations',\n 'storage.config.delete.title': 'Delete Configuration',\n\n // pages/storage-config/storage-config-form.component.ts\n 'storage.config.edit.config': 'Edit Storage Configuration',\n 'storage.config.new.config': 'New Configuration',\n 'storage.config.config.name.required': 'Configuration Name *',\n 'storage.config.config.name.placeholder': 'e.g., Production AWS S3',\n 'storage.config.provider.required': 'Storage Provider *',\n 'storage.set.as.default': 'Set as Default',\n 'storage.aws.title': 'AWS S3 Configuration',\n 'storage.config.region.required': 'AWS Region *',\n 'storage.aws.region.placeholder': 'us-east-1',\n 'storage.config.bucket.required': 'Bucket Name *',\n 'storage.aws.bucket.placeholder': 'my-bucket',\n 'storage.config.access.key.required': 'Access Key ID *',\n 'storage.config.secret.key.required': 'Secret Access Key *',\n 'storage.config.endpoint.optional': 'Custom Endpoint (Optional)',\n 'storage.config.endpoint.placeholder': 'https://s3.custom-endpoint.com',\n 'storage.azure.title': 'Azure Blob Configuration',\n 'storage.azure.account.name.required': 'Account Name *',\n 'storage.azure.container.name.required': 'Container Name *',\n 'storage.azure.account.key.required': 'Account Key *',\n 'storage.sftp.title': 'SFTP Configuration',\n 'storage.sftp.host.required': 'Host *',\n 'storage.sftp.host.placeholder': 'sftp.example.com',\n 'storage.sftp.port.required': 'Port *',\n 'storage.sftp.port.placeholder': '22',\n 'storage.sftp.username.required': 'Username *',\n 'storage.sftp.password.required': 'Password *',\n 'storage.sftp.base.path.required': 'Base Path *',\n 'storage.sftp.base.path.placeholder': '/uploads',\n 'storage.local.title': 'Local Storage Configuration',\n 'storage.local.base.path.required': 'Base Path *',\n 'storage.local.base.path.placeholder': '/var/www/uploads',\n 'storage.config.endpoint': 'Endpoint URL',\n 'storage.validation.config.name.required': 'Configuration name is required',\n\n // pages/file-manager/file-manager-list.component.ts\n 'storage.file.manager.title': 'File Manager',\n 'storage.button.upload.file': 'Upload File',\n 'storage.table.size': 'Size',\n 'storage.table.location': 'Location',\n 'storage.table.config': 'Config',\n 'storage.table.private': 'Private',\n 'storage.private': 'Private',\n 'storage.public': 'Public',\n 'storage.tooltip.trash': 'Trash',\n 'storage.empty.files.in.company': 'No files found in current company',\n 'storage.empty.files': 'No files found',\n 'storage.file.url.not.available': 'File URL is not available',\n 'storage.delete.move.to.trash.confirm':\n 'Move \"{{name}}\" to trash? You can recover it later.',\n 'storage.delete.move.to.trash': 'Move to Trash',\n 'storage.delete.permanent.delete.confirm':\n 'Permanently delete \"{{name}}\"? This action CANNOT be undone and will delete the file from storage.',\n 'storage.delete.permanent.delete': 'Permanent Delete',\n 'storage.delete.permanent.delete.button': 'Delete Permanently',\n\n // pages/file-manager/file-manager-form.component.ts\n 'storage.file.manager.edit.file': 'Edit File',\n 'storage.file.manager.upload.file': 'Upload File',\n 'storage.config.select.config': 'Select storage configuration...',\n 'storage.config.no.configs':\n 'No storage configurations found. Please create one first.',\n 'storage.folder.optional': 'Folder (Optional)',\n 'storage.folder.no.folder': 'No folder (root level)',\n 'storage.folder.no.folders.available':\n 'No folders available. File will be uploaded to root level.',\n 'storage.folder.no.folders.edit': 'No folders available.',\n 'storage.file.select.required': 'Select File *',\n 'storage.button.choose.file': 'Choose File',\n 'storage.upload.drag.drop': 'Drag and drop file here or click to browse',\n 'storage.upload.max.size': 'Maximum file size: {{size}}',\n 'storage.upload.please.select': 'Please select a file to upload',\n 'storage.file.name.required': 'File Name *',\n 'storage.file.placeholder.edit': 'Enter file name',\n 'storage.file.placeholder': 'Will be auto-filled from selected file',\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.validation.file.name.required': 'File name is required',\n 'storage.error.no.file': 'Please select a file',\n 'storage.error.no.config': 'Please select a storage configuration',\n 'storage.upload.failed': 'Failed to upload file',\n\n // pages/folder/folder-list.component.ts\n 'storage.button.new.folder': 'New Folder',\n 'storage.table.slug': 'Slug',\n 'storage.empty.folders.in.company': 'No folders found in current company',\n 'storage.empty.folders': 'No folders found',\n 'storage.folder.delete.title': 'Delete Folder',\n\n // pages/folder/folder-form.component.ts\n 'storage.folder.edit.folder': 'Edit Folder',\n 'storage.folder.new.folder': 'New Folder',\n 'storage.folder.name.required': 'Folder Name *',\n 'storage.folder.name.placeholder': 'Enter folder name',\n 'storage.validation.folder.name.required': 'Folder name is required',\n\n // utils/base-storage-page.ts\n 'storage.delete.this.item': 'this item',\n\n // utils/storage-utils.ts\n 'storage.size.bytes': 'Bytes',\n 'storage.size.gb': 'GB',\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(\n storage: FileLocationEnum | string,\n): 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 = [\n 'storage.size.bytes',\n 'shared.size.kb',\n 'shared.size.mb',\n 'storage.size.gb',\n] 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): {\n value: string;\n unitKey: string;\n} {\n if (bytes <= 0) return { value: '0', unitKey: 'storage.size.bytes' };\n const k = 1024;\n const i = Math.min(\n Math.floor(Math.log(bytes) / Math.log(k)),\n FILE_SIZE_UNIT_KEYS.length - 1,\n );\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 'shared.size.kb': 'KB',\n 'shared.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, DestroyRef, Directive, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { TranslateService } from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService } from 'primeng/api';\nimport { from, Observable } from 'rxjs';\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(TranslateService);\n\n readonly isLoading = signal(false);\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\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> {\n protected readonly router = inject(Router);\n protected readonly messageService = inject(MessageService);\n protected readonly appConfig = inject(APP_CONFIG);\n protected readonly confirmationService = inject(ConfirmationService);\n protected readonly destroyRef = inject(DestroyRef);\n protected readonly translateAdapter = inject(TranslateService);\n protected readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n readonly items = signal<T[]>([]);\n readonly isLoading = signal(false);\n readonly total = signal(0);\n readonly pageSize = signal(50);\n readonly first = signal(0);\n readonly currentPage = computed(() => Math.floor(this.first() / this.pageSize()));\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n readonly totalRecords = this.total;\n readonly currentCompanyName = computed(\n () => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME,\n );\n\n abstract loadData(): Promise<void>;\n abstract getResourceRoute(): string;\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('shared.confirm.delete.item', { name });\n }\n\n onCreate(): void {\n this.router.navigate([this.getResourceRoute(), 'new']);\n }\n\n onEdit(id: string): void {\n this.router.navigate([this.getResourceRoute(), id]);\n }\n\n onPageChange(event: { first?: number | null; rows?: number | null }): void {\n this.first.set(event.first ?? 0);\n this.pageSize.set(event.rows ?? 10);\n this.loadData();\n }\n\n protected getPaginationParams(): { currentPage: number; pageSize: number } {\n return { currentPage: this.currentPage(), pageSize: this.pageSize() };\n }\n\n protected showSuccess(detail: string, summary?: string): void {\n this.messageService.add({\n severity: 'success',\n summary: summary ?? this.t('shared.success'),\n detail,\n });\n }\n\n protected showError(detail: string, summary?: string): void {\n this.messageService.add({\n severity: 'error',\n summary: summary ?? this.t('shared.error'),\n detail,\n });\n }\n\n protected showInfo(detail: string, summary?: string): void {\n this.messageService.add({\n severity: 'info',\n summary: summary ?? this.t('shared.info'),\n detail,\n });\n }\n\n protected showWarn(detail: string, summary?: string): void {\n this.messageService.add({\n severity: 'warn',\n summary: summary ?? this.t('shared.warning'),\n detail,\n });\n }\n\n onDelete(\n item: T,\n idGetter: (item: T) => string,\n deleteApiCall: (id: string) => Observable<unknown> | Promise<unknown>,\n options?: { header?: string },\n ): void {\n this.confirmationService.confirm({\n message: this.getDeleteConfirmMessage(item),\n header: options?.header ?? this.t('shared.confirm.delete.header'),\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: () => {\n from(deleteApiCall(idGetter(item)))\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (res) => {\n const r = res as {\n messageKey?: string;\n messageVariables?: Record<string, string | number>;\n message?: string;\n };\n this.showSuccess(\n r?.messageKey ? this.t(r.messageKey, r.messageVariables) : (r?.message ?? ''),\n );\n this.loadData();\n },\n });\n },\n });\n }\n\n async onDeleteAsync(\n item: T,\n idGetter: (item: T) => string,\n deleteApiCall: (id: string) => Promise<unknown>,\n options?: { header?: string },\n ): Promise<void> {\n this.confirmationService.confirm({\n message: this.getDeleteConfirmMessage(item),\n header: options?.header ?? this.t('shared.confirm.delete.header'),\n icon: 'pi pi-exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n const res = await deleteApiCall(idGetter(item));\n const r = res as {\n messageKey?: string;\n messageVariables?: Record<string, string | number>;\n message?: string;\n };\n this.showSuccess(\n r?.messageKey ? this.t(r.messageKey, r.messageVariables) : (r?.message ?? ''),\n );\n await this.loadData();\n },\n });\n }\n\n protected navigateTo(path: string[]): void {\n this.router.navigate(path);\n }\n\n protected t(key: string, variables?: Record<string, string | number>): string {\n return this.translateAdapter?.translate(key, variables) ?? key;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n ApiResourceService,\n IBulkResponse,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { Observable } from 'rxjs';\nimport {\n ICreateFileManagerDto,\n IFileManager,\n IFilesResponseDto,\n IGetFilesRequestDto,\n IUpdateFileManagerDto,\n} from '../interfaces/file-manager.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class FileManagerApiService extends ApiResourceService<\n IUpdateFileManagerDto,\n IFileManager\n> {\n constructor() {\n super('file-manager', 'storage');\n }\n\n getFiles(\n fileIds: string[],\n ): Observable<ISingleResponse<IFilesResponseDto[]>> {\n const requests: IGetFilesRequestDto[] = fileIds.map((id) => ({ id }));\n return this.http.post<ISingleResponse<IFilesResponseDto[]>>(\n `${this.baseUrl}/get-files`,\n requests,\n );\n }\n\n createFile(\n dto: ICreateFileManagerDto,\n ): Observable<ISingleResponse<IFileManager>> {\n return this.http.post<ISingleResponse<IFileManager>>(\n `${this.baseUrl}/insert`,\n dto,\n );\n }\n\n createFiles(\n dtos: ICreateFileManagerDto[],\n ): Observable<IBulkResponse<IFileManager>> {\n return this.http.post<IBulkResponse<IFileManager>>(\n `${this.baseUrl}/insert-many`,\n dtos,\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport {\n ICreateFolderDto,\n IFolder,\n IUpdateFolderDto,\n} 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<\n ICreateFolderDto | IUpdateFolderDto,\n IFolder\n> {\n constructor() {\n super('folder', 'storage');\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport {\n ICreateStorageConfigDto,\n IStorageConfig,\n IUpdateStorageConfigDto,\n} 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', '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 { from, 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 from(this.fileManagerApi\n .getAll(\n { pagination: { currentPage: filter.page, pageSize: filter.pageSize }, filter: Object.keys(filterObj).length > 0 ? filterObj : undefined },\n filter.search || '',\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 from(this.folderApi\n .getAll(\n { pagination: { currentPage: filter.page, pageSize: filter.pageSize } },\n filter.search || '',\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 from(this.storageConfigApi\n .getAll(\n { pagination: { currentPage: filter.page, pageSize: filter.pageSize } },\n filter.search || '',\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,15 +1,15 @@
1
1
  {
2
2
  "name": "@flusys/ng-storage",
3
- "version": "5.1.3",
3
+ "version": "5.2.0",
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
9
  "@angular/router": ">=21.0.0",
10
- "@flusys/ng-core": ">=5.1.3",
11
- "@flusys/ng-layout": ">=5.1.3",
12
- "@flusys/ng-shared": ">=5.1.3",
10
+ "@flusys/ng-core": ">=5.2.0",
11
+ "@flusys/ng-layout": ">=5.2.0",
12
+ "@flusys/ng-shared": ">=5.2.0",
13
13
  "@primeuix/themes": ">=1.0.0",
14
14
  "primeicons": ">=7.0.0",
15
15
  "primeng": ">=21.0.0",
@@ -1,11 +1,11 @@
1
- import { IBaseEntity, BaseListPage, TranslateService, IFileProvider, IFileSelectFilter, IListResponse, IFileBasicInfo, IFileUploadOptions, ISingleResponse, IUploadedFile, ISelectFilter, IFolderBasicInfo, IStorageConfigBasicInfo, ApiResourceService, IBulkResponse } from '@flusys/ng-shared';
1
+ import { IBaseEntity, TranslateService, 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
- import { Provider } from '@angular/core';
3
+ import { DestroyRef, Provider } from '@angular/core';
4
4
  import * as _flusys_ng_layout from '@flusys/ng-layout';
5
5
  import * as _flusys_ng_core from '@flusys/ng-core';
6
6
  import { BaseApiService } from '@flusys/ng-core';
7
7
  import { Router, Routes } from '@angular/router';
8
- import { MessageService } from 'primeng/api';
8
+ import { MessageService, ConfirmationService } from 'primeng/api';
9
9
  import { Observable } from 'rxjs';
10
10
 
11
11
  declare const STORAGE_MESSAGES: Record<string, string>;
@@ -235,13 +235,48 @@ declare abstract class BaseStoragePage {
235
235
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseStoragePage, never>;
236
236
  static ɵdir: i0.ɵɵDirectiveDeclaration<BaseStoragePage, never, never, {}, {}, never, never, true, never>;
237
237
  }
238
- declare abstract class BaseStorageListPage<T> extends BaseListPage<T> {
239
- protected readonly companyContext: _flusys_ng_layout.ILayoutAuthState;
238
+ declare abstract class BaseStorageListPage<T> {
239
+ protected readonly router: Router;
240
+ protected readonly messageService: MessageService;
241
+ protected readonly appConfig: _flusys_ng_core.IAppConfig;
242
+ protected readonly confirmationService: ConfirmationService;
243
+ protected readonly destroyRef: DestroyRef;
240
244
  protected readonly translateAdapter: TranslateService;
245
+ protected readonly companyContext: _flusys_ng_layout.ILayoutAuthState;
246
+ readonly items: i0.WritableSignal<T[]>;
247
+ readonly isLoading: i0.WritableSignal<boolean>;
248
+ readonly total: i0.WritableSignal<number>;
241
249
  readonly pageSize: i0.WritableSignal<number>;
250
+ readonly first: i0.WritableSignal<number>;
251
+ readonly currentPage: i0.Signal<number>;
252
+ readonly showCompanyInfo: i0.Signal<boolean>;
242
253
  readonly totalRecords: i0.WritableSignal<number>;
243
254
  readonly currentCompanyName: i0.Signal<string>;
255
+ abstract loadData(): Promise<void>;
256
+ abstract getResourceRoute(): string;
244
257
  getDeleteConfirmMessage(item: T): string;
258
+ onCreate(): void;
259
+ onEdit(id: string): void;
260
+ onPageChange(event: {
261
+ first?: number | null;
262
+ rows?: number | null;
263
+ }): void;
264
+ protected getPaginationParams(): {
265
+ currentPage: number;
266
+ pageSize: number;
267
+ };
268
+ protected showSuccess(detail: string, summary?: string): void;
269
+ protected showError(detail: string, summary?: string): void;
270
+ protected showInfo(detail: string, summary?: string): void;
271
+ protected showWarn(detail: string, summary?: string): void;
272
+ onDelete(item: T, idGetter: (item: T) => string, deleteApiCall: (id: string) => Observable<unknown> | Promise<unknown>, options?: {
273
+ header?: string;
274
+ }): void;
275
+ onDeleteAsync(item: T, idGetter: (item: T) => string, deleteApiCall: (id: string) => Promise<unknown>, options?: {
276
+ header?: string;
277
+ }): Promise<void>;
278
+ protected navigateTo(path: string[]): void;
279
+ protected t(key: string, variables?: Record<string, string | number>): string;
245
280
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseStorageListPage<any>, never>;
246
281
  static ɵdir: i0.ɵɵDirectiveDeclaration<BaseStorageListPage<any>, never, never, {}, {}, never, never, true, never>;
247
282
  }