@flusys/ng-storage 9.2.2 → 9.3.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.
Files changed (24) hide show
  1. package/fesm2022/{flusys-ng-storage-file-manager-api.service-D6CGVtHb.mjs → flusys-ng-storage-file-manager-api.service-BSooxN-R.mjs} +4 -4
  2. package/fesm2022/{flusys-ng-storage-file-manager-api.service-D6CGVtHb.mjs.map → flusys-ng-storage-file-manager-api.service-BSooxN-R.mjs.map} +1 -1
  3. package/fesm2022/{flusys-ng-storage-file-manager-form.component-CWpPnWXB.mjs → flusys-ng-storage-file-manager-form.component-B45INctA.mjs} +8 -8
  4. package/fesm2022/{flusys-ng-storage-file-manager-form.component-CWpPnWXB.mjs.map → flusys-ng-storage-file-manager-form.component-B45INctA.mjs.map} +1 -1
  5. package/fesm2022/{flusys-ng-storage-file-manager-list.component-DAYXDYUX.mjs → flusys-ng-storage-file-manager-list.component-BH_jro0g.mjs} +5 -5
  6. package/fesm2022/{flusys-ng-storage-file-manager-list.component-DAYXDYUX.mjs.map → flusys-ng-storage-file-manager-list.component-BH_jro0g.mjs.map} +1 -1
  7. package/fesm2022/{flusys-ng-storage-folder-api.service-BlQH7f29.mjs → flusys-ng-storage-folder-api.service-5-wLOtDf.mjs} +4 -4
  8. package/fesm2022/{flusys-ng-storage-folder-api.service-BlQH7f29.mjs.map → flusys-ng-storage-folder-api.service-5-wLOtDf.mjs.map} +1 -1
  9. package/fesm2022/{flusys-ng-storage-folder-form.component-C721Ej1L.mjs → flusys-ng-storage-folder-form.component-17UJpIi4.mjs} +5 -5
  10. package/fesm2022/{flusys-ng-storage-folder-form.component-C721Ej1L.mjs.map → flusys-ng-storage-folder-form.component-17UJpIi4.mjs.map} +1 -1
  11. package/fesm2022/{flusys-ng-storage-folder-list.component-JBDc-7tx.mjs → flusys-ng-storage-folder-list.component-kK24TzQZ.mjs} +5 -5
  12. package/fesm2022/{flusys-ng-storage-folder-list.component-JBDc-7tx.mjs.map → flusys-ng-storage-folder-list.component-kK24TzQZ.mjs.map} +1 -1
  13. package/fesm2022/{flusys-ng-storage-storage-config-api.service-6pfK7lpy.mjs → flusys-ng-storage-storage-config-api.service-BrkSaKHQ.mjs} +4 -4
  14. package/fesm2022/{flusys-ng-storage-storage-config-api.service-6pfK7lpy.mjs.map → flusys-ng-storage-storage-config-api.service-BrkSaKHQ.mjs.map} +1 -1
  15. package/fesm2022/{flusys-ng-storage-storage-config-form.component-RLN7RBa3.mjs → flusys-ng-storage-storage-config-form.component-C11jPE7f.mjs} +5 -5
  16. package/fesm2022/{flusys-ng-storage-storage-config-form.component-RLN7RBa3.mjs.map → flusys-ng-storage-storage-config-form.component-C11jPE7f.mjs.map} +1 -1
  17. package/fesm2022/{flusys-ng-storage-storage-config-list.component-BsKP0D_R.mjs → flusys-ng-storage-storage-config-list.component-Bm3gwdNT.mjs} +5 -5
  18. package/fesm2022/{flusys-ng-storage-storage-config-list.component-BsKP0D_R.mjs.map → flusys-ng-storage-storage-config-list.component-Bm3gwdNT.mjs.map} +1 -1
  19. package/fesm2022/{flusys-ng-storage-storage-container.component-ByWJLvlY.mjs → flusys-ng-storage-storage-container.component-shR0FO4s.mjs} +4 -4
  20. package/fesm2022/{flusys-ng-storage-storage-container.component-ByWJLvlY.mjs.map → flusys-ng-storage-storage-container.component-shR0FO4s.mjs.map} +1 -1
  21. package/fesm2022/{flusys-ng-storage-upload.service-D9n8yztB.mjs → flusys-ng-storage-upload.service-CG6JyFMm.mjs} +5 -5
  22. package/fesm2022/{flusys-ng-storage-upload.service-D9n8yztB.mjs.map → flusys-ng-storage-upload.service-CG6JyFMm.mjs.map} +1 -1
  23. package/fesm2022/flusys-ng-storage.mjs +23 -23
  24. package/package.json +5 -5
@@ -17,7 +17,7 @@ var FileManagerApiService = class FileManagerApiService extends ApiResourceServi
17
17
  }
18
18
  static ɵfac = i0.ɵɵngDeclareFactory({
19
19
  minVersion: "12.0.0",
20
- version: "22.2.2",
20
+ version: "22.2.3",
21
21
  ngImport: i0,
22
22
  type: FileManagerApiService,
23
23
  deps: [],
@@ -25,14 +25,14 @@ var FileManagerApiService = class FileManagerApiService extends ApiResourceServi
25
25
  });
26
26
  static ɵprov = i0.ɵɵngDeclareService({
27
27
  minVersion: "22.0.0",
28
- version: "22.2.2",
28
+ version: "22.2.3",
29
29
  ngImport: i0,
30
30
  type: FileManagerApiService
31
31
  });
32
32
  };
33
33
  i0.ɵɵngDeclareClassMetadata({
34
34
  minVersion: "12.0.0",
35
- version: "22.2.2",
35
+ version: "22.2.3",
36
36
  ngImport: i0,
37
37
  type: FileManagerApiService,
38
38
  decorators: [{ type: Service }],
@@ -40,4 +40,4 @@ i0.ɵɵngDeclareClassMetadata({
40
40
  });
41
41
  export { FileManagerApiService as t };
42
42
 
43
- //# sourceMappingURL=flusys-ng-storage-file-manager-api.service-D6CGVtHb.mjs.map
43
+ //# sourceMappingURL=flusys-ng-storage-file-manager-api.service-BSooxN-R.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage-file-manager-api.service-D6CGVtHb.mjs","names":[],"sources":["../../../projects/ng-storage/services/file-manager-api.service.ts"],"sourcesContent":["import { Service } 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@Service()\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"],"mappings":";;;AAgBA,IAAa,wBAAb,MAAa,8BAA8B,mBAG1C;CACC,cAAA;EACE,MAAM,gBAAgB,SAAS;CACjC;CAEA,SACE,SAAiB;EAEjB,MAAM,WAAkC,QAAQ,KAAK,QAAQ,EAAE,GAAE,EAAG;EACpE,OAAO,KAAK,KAAK,KACf,GAAG,KAAK,QAAO,aACf,QAAQ;CAEZ;CAEA,WACE,KAA0B;EAE1B,OAAO,KAAK,KAAK,KACf,GAAG,KAAK,QAAO,UACf,GAAG;CAEP;CAEA,YACE,MAA6B;EAE7B,OAAO,KAAK,KAAK,KACf,GAAG,KAAK,QAAO,eACf,IAAI;CAER;CAlCW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,QAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;CAAqB,CAAA;;AAArB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA,EADjC,MAAA,QAAA,CAAA"}
1
+ {"version":3,"file":"flusys-ng-storage-file-manager-api.service-BSooxN-R.mjs","names":[],"sources":["../../../projects/ng-storage/services/file-manager-api.service.ts"],"sourcesContent":["import { Service } 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@Service()\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"],"mappings":";;;AAgBA,IAAa,wBAAb,MAAa,8BAA8B,mBAG1C;CACC,cAAA;EACE,MAAM,gBAAgB,SAAS;CACjC;CAEA,SACE,SAAiB;EAEjB,MAAM,WAAkC,QAAQ,KAAK,QAAQ,EAAE,GAAE,EAAG;EACpE,OAAO,KAAK,KAAK,KACf,GAAG,KAAK,QAAO,aACf,QAAQ;CAEZ;CAEA,WACE,KAA0B;EAE1B,OAAO,KAAK,KAAK,KACf,GAAG,KAAK,QAAO,UACf,GAAG;CAEP;CAEA,YACE,MAA6B;EAE7B,OAAO,KAAK,KAAK,KACf,GAAG,KAAK,QAAO,eACf,IAAI;CAER;CAlCW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAqB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAArB,OAAA,QAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;CAAqB,CAAA;;AAArB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAqB,YAAA,CAAA,EADjC,MAAA,QAAA,CAAA"}
@@ -1,7 +1,7 @@
1
- import { t as FileManagerApiService } from "./flusys-ng-storage-file-manager-api.service-D6CGVtHb.mjs";
2
- import { t as FolderApiService } from "./flusys-ng-storage-folder-api.service-BlQH7f29.mjs";
3
- import { t as StorageConfigApiService } from "./flusys-ng-storage-storage-config-api.service-6pfK7lpy.mjs";
4
- import { t as UploadService } from "./flusys-ng-storage-upload.service-D9n8yztB.mjs";
1
+ import { t as FileManagerApiService } from "./flusys-ng-storage-file-manager-api.service-BSooxN-R.mjs";
2
+ import { t as FolderApiService } from "./flusys-ng-storage-folder-api.service-5-wLOtDf.mjs";
3
+ import { t as StorageConfigApiService } from "./flusys-ng-storage-storage-config-api.service-BrkSaKHQ.mjs";
4
+ import { t as UploadService } from "./flusys-ng-storage-upload.service-CG6JyFMm.mjs";
5
5
  import { BaseStoragePage, formatFileSize, getProviderLabelKey } from "./flusys-ng-storage.mjs";
6
6
  import * as i0 from "@angular/core";
7
7
  import { Component, computed, effect, inject, signal } from "@angular/core";
@@ -181,7 +181,7 @@ var FileManagerFormComponent = class FileManagerFormComponent extends BaseStorag
181
181
  }
182
182
  static ɵfac = i0.ɵɵngDeclareFactory({
183
183
  minVersion: "12.0.0",
184
- version: "22.2.2",
184
+ version: "22.2.3",
185
185
  ngImport: i0,
186
186
  type: FileManagerFormComponent,
187
187
  deps: [],
@@ -189,7 +189,7 @@ var FileManagerFormComponent = class FileManagerFormComponent extends BaseStorag
189
189
  });
190
190
  static ɵcmp = i0.ɵɵngDeclareComponent({
191
191
  minVersion: "17.0.0",
192
- version: "22.2.2",
192
+ version: "22.2.3",
193
193
  type: FileManagerFormComponent,
194
194
  isStandalone: true,
195
195
  selector: "lib-file-manager-form",
@@ -614,7 +614,7 @@ var FileManagerFormComponent = class FileManagerFormComponent extends BaseStorag
614
614
  };
615
615
  i0.ɵɵngDeclareClassMetadata({
616
616
  minVersion: "12.0.0",
617
- version: "22.2.2",
617
+ version: "22.2.3",
618
618
  ngImport: i0,
619
619
  type: FileManagerFormComponent,
620
620
  decorators: [{
@@ -869,4 +869,4 @@ i0.ɵɵngDeclareClassMetadata({
869
869
  });
870
870
  export { FileManagerFormComponent };
871
871
 
872
- //# sourceMappingURL=flusys-ng-storage-file-manager-form.component-CWpPnWXB.mjs.map
872
+ //# sourceMappingURL=flusys-ng-storage-file-manager-form.component-B45INctA.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage-file-manager-form.component-CWpPnWXB.mjs","names":[],"sources":["../../../projects/ng-storage/pages/file-manager/file-manager-form.component.ts"],"sourcesContent":["import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { firstValueFrom } from 'rxjs';\nimport { IFileManager } from '../../interfaces/file-manager.interface';\nimport { IFolder } from '../../interfaces/folder.interface';\nimport { IStorageConfig } from '../../interfaces/storage-config.interface';\nimport { FileManagerApiService } from '../../services/file-manager-api.service';\nimport { FolderApiService } from '../../services/folder-api.service';\nimport { StorageConfigApiService } from '../../services/storage-config-api.service';\nimport { UploadService } from '../../services/upload.service';\nimport { BaseStoragePage } from '../../utils/base-storage-page';\nimport { formatFileSize, getProviderLabelKey } from '../../utils/storage-utils';\nimport {\n CheckboxComponent,\n FButtonDirective,\n FileSelectEvent,\n FileUploadComponent,\n InputTextDirective,\n SelectComponent,\n UiIconComponent,\n} from '@flusys/ng-ui';\n\ninterface IFileManagerFormModel {\n id: string;\n name: string;\n isPrivate: boolean;\n folderId: string;\n storageConfigId: string;\n}\n\n@Component({\n selector: 'lib-file-manager-form',\n imports: [\n SelectComponent,\n UiIconComponent,\n FileUploadComponent,\n FButtonDirective,\n CheckboxComponent,\n InputTextDirective,\n FormField,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div class=\"mb-4\">\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{\n (isEditMode()\n ? 'storage.file.manager.edit.file'\n : 'storage.file.manager.upload.file'\n ) | translate\n }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'shared.company' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n\n <form (submit)=\"onSubmit($event)\">\n @if (!isEditMode()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div class=\"field\">\n <label\n for=\"storageConfig\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.config.provider.required' | translate }}</label\n >\n <f-select\n inputId=\"storageConfig\"\n [options]=\"availableConfigs()\"\n optionValue=\"id\"\n [formField]=\"fileForm.storageConfigId\"\n [placeholder]=\"'storage.config.select.config' | translate\"\n >\n <ng-template #item let-config>{{ config.name }} ({{ getProviderLabelKey(config.storage) | translate }})</ng-template>\n <ng-template #selectedItem let-config>{{ config.name }} ({{ getProviderLabelKey(config.storage) | translate }})</ng-template>\n </f-select>\n @if (availableConfigs().length === 0 && !isLoadingConfigs()) {\n <small class=\"text-warn block mt-2\">\n <ui-icon name=\"exclamation-triangle\" class=\"mr-1\"></ui-icon>\n {{ 'storage.config.no.configs' | translate }}\n </small>\n }\n </div>\n\n <div class=\"field\">\n <label\n for=\"folder\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.folder.optional' | translate }}</label\n >\n <f-select\n inputId=\"folder\"\n [options]=\"availableFolders()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"fileForm.folderId\"\n [placeholder]=\"'storage.folder.no.folder' | translate\"\n />\n @if (availableFolders().length === 0 && !isLoadingFolders()) {\n <small class=\"text-muted-color block mt-2\">\n <ui-icon name=\"info-circle\" class=\"mr-1\"></ui-icon>\n {{ 'storage.folder.no.folders.available' | translate }}\n </small>\n }\n </div>\n </div>\n } @else {\n <div class=\"field mb-4\">\n <label\n for=\"folder\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.folder.optional' | translate }}</label\n >\n <f-select\n inputId=\"folder\"\n [options]=\"availableFolders()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"fileForm.folderId\"\n [placeholder]=\"'storage.folder.no.folder' | translate\"\n />\n @if (availableFolders().length === 0 && !isLoadingFolders()) {\n <small class=\"text-muted-color block mt-2\">\n <ui-icon name=\"info-circle\" class=\"mr-1\"></ui-icon>\n {{ 'storage.folder.no.folders.edit' | translate }}\n </small>\n }\n </div>\n }\n\n @if (!isEditMode()) {\n <div class=\"field mb-4\">\n <label class=\"block font-medium mb-2 text-sm sm:text-base\">{{\n 'storage.file.select.required' | translate\n }}</label>\n <f-fileupload\n [customUpload]=\"true\"\n (onSelect)=\"onFileSelect($event)\"\n (onRemove)=\"onFileRemoved()\"\n (onClear)=\"onFileRemoved()\"\n [multiple]=\"false\"\n [maxFileSize]=\"50000000\"\n [showUploadButton]=\"false\"\n [showCancelButton]=\"false\"\n [chooseLabel]=\"'storage.button.choose.file' | translate\"\n [removeLabel]=\"'shared.remove' | translate\"\n chooseIcon=\"upload\"\n accept=\"*/*\"\n class=\"w-full\"\n >\n <ng-template #content let-files let-removeFile=\"removeFile\">\n @if (files && files.length > 0) {\n <div class=\"flex flex-col gap-2\">\n @for (file of files; track file.name) {\n <div\n class=\"flex items-center gap-3 p-3 border border-surface rounded-lg bg-surface-ground\"\n >\n <ui-icon name=\"file\" class=\"text-xl sm:text-2xl text-primary\"></ui-icon>\n <div class=\"flex-1 min-w-0\">\n <div class=\"font-medium truncate\">\n {{ file.name }}\n </div>\n <div class=\"text-sm text-muted-color\">\n {{ formatFileSize(file.size) }}\n </div>\n </div>\n <button\n fButton\n type=\"button\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [ariaLabel]=\"'shared.remove' | translate\"\n (click)=\"removeFile(file)\"\n >\n <ui-icon name=\"times\"></ui-icon>\n </button>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"flex items-center justify-center flex-col p-6 sm:p-8 border-2 border-dashed border-surface rounded-lg\"\n >\n <ui-icon name=\"cloud-upload\" class=\"text-3xl sm:text-4xl text-muted-color mb-3\"></ui-icon>\n <p\n class=\"text-muted-color text-center text-sm sm:text-base\"\n >\n {{ 'storage.upload.drag.drop' | translate }}\n </p>\n <p class=\"text-xs sm:text-sm text-muted-color mt-2\">\n {{\n 'storage.upload.max.size' | translate: { size: '50MB' }\n }}\n </p>\n </div>\n }\n </ng-template>\n </f-fileupload>\n @if (!selectedFile() && !isEditMode()) {\n <small class=\"text-muted-color\">{{\n 'storage.upload.please.select' | translate\n }}</small>\n }\n </div>\n }\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"field md:col-span-2\">\n <label\n for=\"name\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.file.name.required' | translate }}</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"fileForm.name\"\n [placeholder]=\"\n (isEditMode()\n ? 'storage.file.placeholder.edit'\n : 'storage.file.placeholder'\n ) | translate\n \"\n class=\"w-full\"\n />\n </div>\n\n <div class=\"field\">\n <f-checkbox [formField]=\"fileForm.isPrivate\" [label]=\"'storage.file.private' | translate\" />\n <small class=\"text-muted-color block mt-2\">\n {{\n (formModel().isPrivate\n ? 'storage.file.private.hint'\n : 'storage.file.public.hint'\n ) | translate\n }}\n </small>\n </div>\n </div>\n\n <div class=\"flex justify-end gap-2 mt-4\">\n <button\n fButton\n type=\"button\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"\n !isFormValid() ||\n (!isEditMode() && !selectedFile()) ||\n isLoading()\n \"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n (isEditMode() ? 'shared.update' : 'shared.upload') | translate\n }}</span>\n </button>\n </div>\n </form>\n </div>\n `,\n})\nexport class FileManagerFormComponent extends BaseStoragePage {\n private readonly route = inject(ActivatedRoute);\n private readonly fileService = inject(FileManagerApiService);\n private readonly uploadService = inject(UploadService);\n private readonly configService = inject(StorageConfigApiService);\n private readonly folderService = inject(FolderApiService);\n private readonly translateService = inject(TranslateService);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private initialized = false;\n\n readonly isLoadingConfigs = signal(false);\n readonly isLoadingFolders = signal(false);\n readonly existingFile = signal<IFileManager | null>(null);\n readonly isEditMode = computed(() => !!this.existingFile());\n readonly selectedFile = signal<File | null>(null);\n readonly availableConfigs = signal<IStorageConfig[]>([]);\n readonly availableFolders = signal<IFolder[]>([]);\n\n readonly formatFileSize = formatFileSize;\n readonly getProviderLabelKey = getProviderLabelKey;\n\n readonly formModel = signal<IFileManagerFormModel>({\n id: '',\n name: '',\n isPrivate: false,\n folderId: '',\n storageConfigId: '',\n });\n\n readonly fileForm = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translateService.translate(\n 'storage.validation.file.name.required',\n ),\n });\n });\n\n readonly isFormValid = computed(\n () => this.formModel().name.trim().length > 0,\n );\n\n constructor() {\n super();\n effect(() => {\n const params = this.routeParams();\n if (!params || this.initialized) return;\n\n this.initialized = true;\n const fileId = params.get('id');\n if (fileId) {\n this.loadFile(fileId);\n } else {\n this.loadStorageConfigs();\n }\n this.loadFolders();\n });\n }\n\n async loadStorageConfigs(): Promise<void> {\n this.isLoadingConfigs.set(true);\n try {\n const response = await this.configService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n select: [],\n sort: {},\n });\n if (response.success && response.data) {\n this.availableConfigs.set(response.data);\n if (response.data.length === 1) {\n this.formModel.update((m) => ({\n ...m,\n storageConfigId: response.data![0].id,\n }));\n }\n }\n } finally {\n this.isLoadingConfigs.set(false);\n }\n }\n\n async loadFolders(): Promise<void> {\n this.isLoadingFolders.set(true);\n try {\n const response = await this.folderService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n select: [],\n sort: {},\n });\n if (response.success && response.data) {\n this.availableFolders.set(response.data);\n }\n } catch {\n // Silently fail - folders are optional\n } finally {\n this.isLoadingFolders.set(false);\n }\n }\n\n async loadFile(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.fileService.findById(id);\n if (response.success && response.data) {\n const file = response.data;\n this.existingFile.set(file);\n this.formModel.set({\n id: file.id,\n name: file.name,\n isPrivate: file.isPrivate ?? false,\n folderId: file.folderId ?? '',\n storageConfigId: '',\n });\n }\n } catch {\n this.navigateTo(['/storage/files']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onFileSelect(event: FileSelectEvent): void {\n const file = event.files?.[0] || event.currentFiles?.[0];\n if (file) {\n this.selectedFile.set(file);\n this.formModel.update((m) => ({ ...m, name: file.name }));\n }\n }\n\n onFileRemoved(): void {\n this.selectedFile.set(null);\n }\n\n async onSubmit(event: Event): Promise<void> {\n event.preventDefault();\n\n if (!this.isFormValid()) return;\n\n this.isLoading.set(true);\n try {\n const formValue = this.formModel();\n\n if (this.isEditMode()) {\n const response = await this.fileService.update({\n id: formValue.id,\n name: formValue.name,\n isPrivate: formValue.isPrivate,\n folderId: formValue.folderId || null,\n });\n this.showSuccess(\n response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response.message ?? ''),\n );\n } else {\n const file = this.selectedFile();\n if (!file) {\n this.showError(\n this.translateService.translate('storage.error.no.file'),\n );\n return;\n }\n\n if (!formValue.storageConfigId) {\n this.showError(\n this.translateService.translate('storage.error.no.config'),\n );\n return;\n }\n\n const uploadResponse = await firstValueFrom(\n this.uploadService.uploadSingleFile(file, {\n compress: true,\n quality: 85,\n storageConfigId: formValue.storageConfigId,\n }),\n );\n\n if (uploadResponse.success && uploadResponse.data) {\n const uploadedFileInfo = uploadResponse.data;\n const createResponse = await firstValueFrom(\n this.fileService.createFile({\n name: formValue.name,\n key: uploadedFileInfo.key,\n contentType: file.type || 'application/octet-stream',\n size: Math.round(file.size / 1024).toString(),\n isPrivate: formValue.isPrivate,\n folderId: formValue.folderId || undefined,\n storageConfigId: formValue.storageConfigId,\n }),\n );\n this.showSuccess(\n createResponse?.messageKey\n ? this.translateService.translate(\n createResponse.messageKey,\n createResponse.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (createResponse?.message ?? ''),\n );\n } else {\n throw new Error(\n this.translateService.translate('storage.upload.failed'),\n );\n }\n }\n\n this.navigateTo(['/storage/files']);\n } catch {\n this.showError(this.translateService.translate('storage.upload.failed'));\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.navigateTo(['/storage/files']);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-storage-file-manager-form.component-B45INctA.mjs","names":[],"sources":["../../../projects/ng-storage/pages/file-manager/file-manager-form.component.ts"],"sourcesContent":["import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { firstValueFrom } from 'rxjs';\nimport { IFileManager } from '../../interfaces/file-manager.interface';\nimport { IFolder } from '../../interfaces/folder.interface';\nimport { IStorageConfig } from '../../interfaces/storage-config.interface';\nimport { FileManagerApiService } from '../../services/file-manager-api.service';\nimport { FolderApiService } from '../../services/folder-api.service';\nimport { StorageConfigApiService } from '../../services/storage-config-api.service';\nimport { UploadService } from '../../services/upload.service';\nimport { BaseStoragePage } from '../../utils/base-storage-page';\nimport { formatFileSize, getProviderLabelKey } from '../../utils/storage-utils';\nimport {\n CheckboxComponent,\n FButtonDirective,\n FileSelectEvent,\n FileUploadComponent,\n InputTextDirective,\n SelectComponent,\n UiIconComponent,\n} from '@flusys/ng-ui';\n\ninterface IFileManagerFormModel {\n id: string;\n name: string;\n isPrivate: boolean;\n folderId: string;\n storageConfigId: string;\n}\n\n@Component({\n selector: 'lib-file-manager-form',\n imports: [\n SelectComponent,\n UiIconComponent,\n FileUploadComponent,\n FButtonDirective,\n CheckboxComponent,\n InputTextDirective,\n FormField,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div class=\"mb-4\">\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{\n (isEditMode()\n ? 'storage.file.manager.edit.file'\n : 'storage.file.manager.upload.file'\n ) | translate\n }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'shared.company' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n\n <form (submit)=\"onSubmit($event)\">\n @if (!isEditMode()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div class=\"field\">\n <label\n for=\"storageConfig\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.config.provider.required' | translate }}</label\n >\n <f-select\n inputId=\"storageConfig\"\n [options]=\"availableConfigs()\"\n optionValue=\"id\"\n [formField]=\"fileForm.storageConfigId\"\n [placeholder]=\"'storage.config.select.config' | translate\"\n >\n <ng-template #item let-config>{{ config.name }} ({{ getProviderLabelKey(config.storage) | translate }})</ng-template>\n <ng-template #selectedItem let-config>{{ config.name }} ({{ getProviderLabelKey(config.storage) | translate }})</ng-template>\n </f-select>\n @if (availableConfigs().length === 0 && !isLoadingConfigs()) {\n <small class=\"text-warn block mt-2\">\n <ui-icon name=\"exclamation-triangle\" class=\"mr-1\"></ui-icon>\n {{ 'storage.config.no.configs' | translate }}\n </small>\n }\n </div>\n\n <div class=\"field\">\n <label\n for=\"folder\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.folder.optional' | translate }}</label\n >\n <f-select\n inputId=\"folder\"\n [options]=\"availableFolders()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"fileForm.folderId\"\n [placeholder]=\"'storage.folder.no.folder' | translate\"\n />\n @if (availableFolders().length === 0 && !isLoadingFolders()) {\n <small class=\"text-muted-color block mt-2\">\n <ui-icon name=\"info-circle\" class=\"mr-1\"></ui-icon>\n {{ 'storage.folder.no.folders.available' | translate }}\n </small>\n }\n </div>\n </div>\n } @else {\n <div class=\"field mb-4\">\n <label\n for=\"folder\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.folder.optional' | translate }}</label\n >\n <f-select\n inputId=\"folder\"\n [options]=\"availableFolders()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [formField]=\"fileForm.folderId\"\n [placeholder]=\"'storage.folder.no.folder' | translate\"\n />\n @if (availableFolders().length === 0 && !isLoadingFolders()) {\n <small class=\"text-muted-color block mt-2\">\n <ui-icon name=\"info-circle\" class=\"mr-1\"></ui-icon>\n {{ 'storage.folder.no.folders.edit' | translate }}\n </small>\n }\n </div>\n }\n\n @if (!isEditMode()) {\n <div class=\"field mb-4\">\n <label class=\"block font-medium mb-2 text-sm sm:text-base\">{{\n 'storage.file.select.required' | translate\n }}</label>\n <f-fileupload\n [customUpload]=\"true\"\n (onSelect)=\"onFileSelect($event)\"\n (onRemove)=\"onFileRemoved()\"\n (onClear)=\"onFileRemoved()\"\n [multiple]=\"false\"\n [maxFileSize]=\"50000000\"\n [showUploadButton]=\"false\"\n [showCancelButton]=\"false\"\n [chooseLabel]=\"'storage.button.choose.file' | translate\"\n [removeLabel]=\"'shared.remove' | translate\"\n chooseIcon=\"upload\"\n accept=\"*/*\"\n class=\"w-full\"\n >\n <ng-template #content let-files let-removeFile=\"removeFile\">\n @if (files && files.length > 0) {\n <div class=\"flex flex-col gap-2\">\n @for (file of files; track file.name) {\n <div\n class=\"flex items-center gap-3 p-3 border border-surface rounded-lg bg-surface-ground\"\n >\n <ui-icon name=\"file\" class=\"text-xl sm:text-2xl text-primary\"></ui-icon>\n <div class=\"flex-1 min-w-0\">\n <div class=\"font-medium truncate\">\n {{ file.name }}\n </div>\n <div class=\"text-sm text-muted-color\">\n {{ formatFileSize(file.size) }}\n </div>\n </div>\n <button\n fButton\n type=\"button\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [ariaLabel]=\"'shared.remove' | translate\"\n (click)=\"removeFile(file)\"\n >\n <ui-icon name=\"times\"></ui-icon>\n </button>\n </div>\n }\n </div>\n } @else {\n <div\n class=\"flex items-center justify-center flex-col p-6 sm:p-8 border-2 border-dashed border-surface rounded-lg\"\n >\n <ui-icon name=\"cloud-upload\" class=\"text-3xl sm:text-4xl text-muted-color mb-3\"></ui-icon>\n <p\n class=\"text-muted-color text-center text-sm sm:text-base\"\n >\n {{ 'storage.upload.drag.drop' | translate }}\n </p>\n <p class=\"text-xs sm:text-sm text-muted-color mt-2\">\n {{\n 'storage.upload.max.size' | translate: { size: '50MB' }\n }}\n </p>\n </div>\n }\n </ng-template>\n </f-fileupload>\n @if (!selectedFile() && !isEditMode()) {\n <small class=\"text-muted-color\">{{\n 'storage.upload.please.select' | translate\n }}</small>\n }\n </div>\n }\n\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"field md:col-span-2\">\n <label\n for=\"name\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.file.name.required' | translate }}</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"fileForm.name\"\n [placeholder]=\"\n (isEditMode()\n ? 'storage.file.placeholder.edit'\n : 'storage.file.placeholder'\n ) | translate\n \"\n class=\"w-full\"\n />\n </div>\n\n <div class=\"field\">\n <f-checkbox [formField]=\"fileForm.isPrivate\" [label]=\"'storage.file.private' | translate\" />\n <small class=\"text-muted-color block mt-2\">\n {{\n (formModel().isPrivate\n ? 'storage.file.private.hint'\n : 'storage.file.public.hint'\n ) | translate\n }}\n </small>\n </div>\n </div>\n\n <div class=\"flex justify-end gap-2 mt-4\">\n <button\n fButton\n type=\"button\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"\n !isFormValid() ||\n (!isEditMode() && !selectedFile()) ||\n isLoading()\n \"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n (isEditMode() ? 'shared.update' : 'shared.upload') | translate\n }}</span>\n </button>\n </div>\n </form>\n </div>\n `,\n})\nexport class FileManagerFormComponent extends BaseStoragePage {\n private readonly route = inject(ActivatedRoute);\n private readonly fileService = inject(FileManagerApiService);\n private readonly uploadService = inject(UploadService);\n private readonly configService = inject(StorageConfigApiService);\n private readonly folderService = inject(FolderApiService);\n private readonly translateService = inject(TranslateService);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private initialized = false;\n\n readonly isLoadingConfigs = signal(false);\n readonly isLoadingFolders = signal(false);\n readonly existingFile = signal<IFileManager | null>(null);\n readonly isEditMode = computed(() => !!this.existingFile());\n readonly selectedFile = signal<File | null>(null);\n readonly availableConfigs = signal<IStorageConfig[]>([]);\n readonly availableFolders = signal<IFolder[]>([]);\n\n readonly formatFileSize = formatFileSize;\n readonly getProviderLabelKey = getProviderLabelKey;\n\n readonly formModel = signal<IFileManagerFormModel>({\n id: '',\n name: '',\n isPrivate: false,\n folderId: '',\n storageConfigId: '',\n });\n\n readonly fileForm = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translateService.translate(\n 'storage.validation.file.name.required',\n ),\n });\n });\n\n readonly isFormValid = computed(\n () => this.formModel().name.trim().length > 0,\n );\n\n constructor() {\n super();\n effect(() => {\n const params = this.routeParams();\n if (!params || this.initialized) return;\n\n this.initialized = true;\n const fileId = params.get('id');\n if (fileId) {\n this.loadFile(fileId);\n } else {\n this.loadStorageConfigs();\n }\n this.loadFolders();\n });\n }\n\n async loadStorageConfigs(): Promise<void> {\n this.isLoadingConfigs.set(true);\n try {\n const response = await this.configService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n select: [],\n sort: {},\n });\n if (response.success && response.data) {\n this.availableConfigs.set(response.data);\n if (response.data.length === 1) {\n this.formModel.update((m) => ({\n ...m,\n storageConfigId: response.data![0].id,\n }));\n }\n }\n } finally {\n this.isLoadingConfigs.set(false);\n }\n }\n\n async loadFolders(): Promise<void> {\n this.isLoadingFolders.set(true);\n try {\n const response = await this.folderService.getAll({\n pagination: { currentPage: 0, pageSize: 100 },\n filter: {},\n select: [],\n sort: {},\n });\n if (response.success && response.data) {\n this.availableFolders.set(response.data);\n }\n } catch {\n // Silently fail - folders are optional\n } finally {\n this.isLoadingFolders.set(false);\n }\n }\n\n async loadFile(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.fileService.findById(id);\n if (response.success && response.data) {\n const file = response.data;\n this.existingFile.set(file);\n this.formModel.set({\n id: file.id,\n name: file.name,\n isPrivate: file.isPrivate ?? false,\n folderId: file.folderId ?? '',\n storageConfigId: '',\n });\n }\n } catch {\n this.navigateTo(['/storage/files']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onFileSelect(event: FileSelectEvent): void {\n const file = event.files?.[0] || event.currentFiles?.[0];\n if (file) {\n this.selectedFile.set(file);\n this.formModel.update((m) => ({ ...m, name: file.name }));\n }\n }\n\n onFileRemoved(): void {\n this.selectedFile.set(null);\n }\n\n async onSubmit(event: Event): Promise<void> {\n event.preventDefault();\n\n if (!this.isFormValid()) return;\n\n this.isLoading.set(true);\n try {\n const formValue = this.formModel();\n\n if (this.isEditMode()) {\n const response = await this.fileService.update({\n id: formValue.id,\n name: formValue.name,\n isPrivate: formValue.isPrivate,\n folderId: formValue.folderId || null,\n });\n this.showSuccess(\n response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response.message ?? ''),\n );\n } else {\n const file = this.selectedFile();\n if (!file) {\n this.showError(\n this.translateService.translate('storage.error.no.file'),\n );\n return;\n }\n\n if (!formValue.storageConfigId) {\n this.showError(\n this.translateService.translate('storage.error.no.config'),\n );\n return;\n }\n\n const uploadResponse = await firstValueFrom(\n this.uploadService.uploadSingleFile(file, {\n compress: true,\n quality: 85,\n storageConfigId: formValue.storageConfigId,\n }),\n );\n\n if (uploadResponse.success && uploadResponse.data) {\n const uploadedFileInfo = uploadResponse.data;\n const createResponse = await firstValueFrom(\n this.fileService.createFile({\n name: formValue.name,\n key: uploadedFileInfo.key,\n contentType: file.type || 'application/octet-stream',\n size: Math.round(file.size / 1024).toString(),\n isPrivate: formValue.isPrivate,\n folderId: formValue.folderId || undefined,\n storageConfigId: formValue.storageConfigId,\n }),\n );\n this.showSuccess(\n createResponse?.messageKey\n ? this.translateService.translate(\n createResponse.messageKey,\n createResponse.messageVariables as Record<\n string,\n string | number\n >,\n )\n : (createResponse?.message ?? ''),\n );\n } else {\n throw new Error(\n this.translateService.translate('storage.upload.failed'),\n );\n }\n }\n\n this.navigateTo(['/storage/files']);\n } catch {\n this.showError(this.translateService.translate('storage.upload.failed'));\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.navigateTo(['/storage/files']);\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as FileManagerApiService } from "./flusys-ng-storage-file-manager-api.service-D6CGVtHb.mjs";
1
+ import { t as FileManagerApiService } from "./flusys-ng-storage-file-manager-api.service-BSooxN-R.mjs";
2
2
  import { BaseStorageListPage, getFileIcon, getProviderLabelKey, getProviderSeverity } from "./flusys-ng-storage.mjs";
3
3
  import * as i0 from "@angular/core";
4
4
  import { Component, inject, signal } from "@angular/core";
@@ -103,7 +103,7 @@ var FileManagerListComponent = class FileManagerListComponent extends BaseStorag
103
103
  }
104
104
  static ɵfac = i0.ɵɵngDeclareFactory({
105
105
  minVersion: "12.0.0",
106
- version: "22.2.2",
106
+ version: "22.2.3",
107
107
  ngImport: i0,
108
108
  type: FileManagerListComponent,
109
109
  deps: null,
@@ -111,7 +111,7 @@ var FileManagerListComponent = class FileManagerListComponent extends BaseStorag
111
111
  });
112
112
  static ɵcmp = i0.ɵɵngDeclareComponent({
113
113
  minVersion: "17.0.0",
114
- version: "22.2.2",
114
+ version: "22.2.3",
115
115
  type: FileManagerListComponent,
116
116
  isStandalone: true,
117
117
  selector: "lib-file-manager-list",
@@ -513,7 +513,7 @@ var FileManagerListComponent = class FileManagerListComponent extends BaseStorag
513
513
  };
514
514
  i0.ɵɵngDeclareClassMetadata({
515
515
  minVersion: "12.0.0",
516
- version: "22.2.2",
516
+ version: "22.2.3",
517
517
  ngImport: i0,
518
518
  type: FileManagerListComponent,
519
519
  decorators: [{
@@ -727,4 +727,4 @@ i0.ɵɵngDeclareClassMetadata({
727
727
  });
728
728
  export { FileManagerListComponent };
729
729
 
730
- //# sourceMappingURL=flusys-ng-storage-file-manager-list.component-DAYXDYUX.mjs.map
730
+ //# sourceMappingURL=flusys-ng-storage-file-manager-list.component-BH_jro0g.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage-file-manager-list.component-DAYXDYUX.mjs","names":[],"sources":["../../../projects/ng-storage/pages/file-manager/file-manager-list.component.ts"],"sourcesContent":["import { Component, inject, signal } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n FILE_PERMISSIONS,\n HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport { firstValueFrom } from 'rxjs';\nimport { IFileManager } from '../../interfaces/file-manager.interface';\nimport { FileManagerApiService } from '../../services/file-manager-api.service';\nimport { BaseStorageListPage } from '../../utils/base-storage-page';\n\nimport {\n getFileIcon,\n getProviderLabelKey,\n getProviderSeverity,\n} from '../../utils/storage-utils';\n\n@Component({\n selector: 'lib-file-manager-list',\n imports: [\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n DatePipe,\n FormsModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{ 'storage.file.manager.title' | translate }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'shared.company' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <div\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto\"\n >\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.CREATE\"\n (click)=\"onUpload()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"upload\"></ui-icon>\n <span pButtonLabel>{{ 'storage.button.upload.file' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"overflow-x-auto\">\n <f-table\n [value]=\"files()\"\n [loading]=\"isLoading()\"\n [paginator]=\"totalRecords() > 0\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'shared.name' | translate }}</th>\n <th class=\"hidden lg:table-cell\">\n {{ 'shared.type' | translate }}\n </th>\n <th>{{ 'storage.table.size' | translate }}</th>\n <th>{{ 'storage.table.location' | translate }}</th>\n <th class=\"hidden xl:table-cell\">\n {{ 'storage.table.config' | translate }}\n </th>\n <th>{{ 'storage.table.private' | translate }}</th>\n <th class=\"hidden md:table-cell\">\n {{ 'storage.table.created' | translate }}\n </th>\n <th class=\"w-[120px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-file>\n @let isViewing = viewingFileId() === file.id;\n <tr>\n <td>\n <div class=\"flex items-center gap-2\">\n <ui-icon [name]=\"getFileIcon(file.contentType)\"></ui-icon>\n <span class=\"truncate max-w-32 sm:max-w-none\">{{\n file.name\n }}</span>\n </div>\n </td>\n <td class=\"hidden lg:table-cell\">\n <span class=\"text-sm text-muted-color\">{{\n file.contentType\n }}</span>\n </td>\n <td>{{ file.size }} {{ 'shared.size.kb' | translate }}</td>\n <td>\n <f-tag\n [value]=\"getProviderLabelKey(file.location) | translate\"\n [severity]=\"getProviderSeverity(file.location)\"\n />\n </td>\n <td class=\"hidden xl:table-cell\">\n {{ file.providerName || '-' }}\n </td>\n <td>\n @if (file.isPrivate) {\n <f-tag\n [value]=\"'storage.private' | translate\"\n severity=\"warn\"\n />\n } @else {\n <f-tag\n [value]=\"'storage.public' | translate\"\n severity=\"success\"\n />\n }\n </td>\n <td class=\"hidden md:table-cell\">\n {{ file.createdAt | date: 'short' }}\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.READ\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [disabled]=\"isViewing\"\n (click)=\"onView(file)\"\n [fTooltip]=\"'shared.view' | translate\"\n tooltipPosition=\"top\"\n >\n @if (isViewing) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"eye\"></ui-icon>\n }\n </button>\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (click)=\"onEdit(file.id)\"\n [fTooltip]=\"'shared.edit' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"warn\"\n size=\"small\"\n (click)=\"onSoftDelete(file)\"\n [fTooltip]=\"'storage.tooltip.trash' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (click)=\"onPermanentDelete(file)\"\n [fTooltip]=\"'shared.delete' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"times-circle\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"8\" class=\"text-center py-4 text-muted-color\">\n @if (showCompanyInfo()) {\n {{ 'storage.empty.files.in.company' | translate }}\n } @else {\n {{ 'storage.empty.files' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class FileManagerListComponent extends BaseStorageListPage<IFileManager> {\n readonly FILE_PERMISSIONS = FILE_PERMISSIONS;\n\n private readonly fileService = inject(FileManagerApiService);\n private readonly translateService = inject(TranslateService);\n\n readonly files = this.items;\n readonly viewingFileId = signal<string | null>(null);\n\n private readonly _searchTerm = signal('');\n readonly searchTerm = this._searchTerm.asReadonly();\n\n readonly getFileIcon = getFileIcon;\n readonly getProviderLabelKey = getProviderLabelKey;\n readonly getProviderSeverity = getProviderSeverity;\n\n getResourceRoute(): string {\n return '/storage/files';\n }\n\n override getDeleteConfirmMessage(file: IFileManager): string {\n return this.translateService.translate('shared.confirm.delete.item', {\n name: file.name,\n });\n }\n\n async loadData(): Promise<void> {\n const token = this.beginLoad();\n this.isLoading.set(true);\n try {\n const response = await this.fileService.getAll(\n {\n pagination: this.getPaginationParams(),\n filter: {},\n select: [],\n sort: {},\n },\n this.searchTerm(),\n );\n\n if (!this.isLatestLoad(token)) return;\n\n if (response.success) {\n this.items.set(response.data ?? []);\n this.total.set(response.meta?.total ?? 0);\n }\n } finally {\n if (this.isLatestLoad(token)) this.isLoading.set(false);\n }\n }\n\n onSearchChange(term: string): void {\n this._searchTerm.set(term);\n this.first.set(0);\n this.loadData();\n }\n\n onUpload(): void {\n this.navigateTo(['/storage/files/new']);\n }\n\n async onView(file: IFileManager): Promise<void> {\n this.viewingFileId.set(file.id);\n try {\n const response = await firstValueFrom(\n this.fileService.getFiles([file.id]),\n );\n\n if (response.success && response.data?.length && response.data[0].url) {\n window.open(response.data[0].url, '_blank');\n } else {\n this.showError(\n this.translateService.translate('storage.file.url.not.available'),\n );\n }\n } finally {\n this.viewingFileId.set(null);\n }\n }\n\n onSoftDelete(file: IFileManager): void {\n this.confirmationService.confirm({\n message: this.translateService.translate(\n 'storage.delete.move.to.trash.confirm',\n { name: file.name },\n ),\n header: this.translateService.translate('storage.delete.move.to.trash'),\n icon: 'trash',\n acceptLabel: this.translateService.translate(\n 'storage.delete.move.to.trash',\n ),\n acceptButtonStyleClass: 'p-button-warning',\n accept: async () => {\n try {\n const response = await this.fileService.delete({\n id: file.id,\n type: 'delete',\n });\n this.showSuccess(\n response?.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response?.message ?? ''),\n );\n this.loadData();\n } catch {}\n },\n });\n }\n\n onPermanentDelete(file: IFileManager): void {\n this.confirmationService.confirm({\n message: this.translateService.translate(\n 'storage.delete.permanent.delete.confirm',\n { name: file.name },\n ),\n header: this.translateService.translate(\n 'storage.delete.permanent.delete',\n ),\n icon: 'exclamation-triangle',\n acceptLabel: this.translateService.translate(\n 'storage.delete.permanent.delete.button',\n ),\n rejectLabel: this.translateService.translate('shared.cancel'),\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n const response = await this.fileService.delete({\n id: file.id,\n type: 'permanent',\n });\n this.showSuccess(\n response?.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response?.message ?? ''),\n );\n this.loadData();\n } catch {}\n },\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-storage-file-manager-list.component-BH_jro0g.mjs","names":[],"sources":["../../../projects/ng-storage/pages/file-manager/file-manager-list.component.ts"],"sourcesContent":["import { Component, inject, signal } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n FILE_PERMISSIONS,\n HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport { firstValueFrom } from 'rxjs';\nimport { IFileManager } from '../../interfaces/file-manager.interface';\nimport { FileManagerApiService } from '../../services/file-manager-api.service';\nimport { BaseStorageListPage } from '../../utils/base-storage-page';\n\nimport {\n getFileIcon,\n getProviderLabelKey,\n getProviderSeverity,\n} from '../../utils/storage-utils';\n\n@Component({\n selector: 'lib-file-manager-list',\n imports: [\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n DatePipe,\n FormsModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{ 'storage.file.manager.title' | translate }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'shared.company' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <div\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto\"\n >\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.CREATE\"\n (click)=\"onUpload()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"upload\"></ui-icon>\n <span pButtonLabel>{{ 'storage.button.upload.file' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"overflow-x-auto\">\n <f-table\n [value]=\"files()\"\n [loading]=\"isLoading()\"\n [paginator]=\"totalRecords() > 0\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'shared.name' | translate }}</th>\n <th class=\"hidden lg:table-cell\">\n {{ 'shared.type' | translate }}\n </th>\n <th>{{ 'storage.table.size' | translate }}</th>\n <th>{{ 'storage.table.location' | translate }}</th>\n <th class=\"hidden xl:table-cell\">\n {{ 'storage.table.config' | translate }}\n </th>\n <th>{{ 'storage.table.private' | translate }}</th>\n <th class=\"hidden md:table-cell\">\n {{ 'storage.table.created' | translate }}\n </th>\n <th class=\"w-[120px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-file>\n @let isViewing = viewingFileId() === file.id;\n <tr>\n <td>\n <div class=\"flex items-center gap-2\">\n <ui-icon [name]=\"getFileIcon(file.contentType)\"></ui-icon>\n <span class=\"truncate max-w-32 sm:max-w-none\">{{\n file.name\n }}</span>\n </div>\n </td>\n <td class=\"hidden lg:table-cell\">\n <span class=\"text-sm text-muted-color\">{{\n file.contentType\n }}</span>\n </td>\n <td>{{ file.size }} {{ 'shared.size.kb' | translate }}</td>\n <td>\n <f-tag\n [value]=\"getProviderLabelKey(file.location) | translate\"\n [severity]=\"getProviderSeverity(file.location)\"\n />\n </td>\n <td class=\"hidden xl:table-cell\">\n {{ file.providerName || '-' }}\n </td>\n <td>\n @if (file.isPrivate) {\n <f-tag\n [value]=\"'storage.private' | translate\"\n severity=\"warn\"\n />\n } @else {\n <f-tag\n [value]=\"'storage.public' | translate\"\n severity=\"success\"\n />\n }\n </td>\n <td class=\"hidden md:table-cell\">\n {{ file.createdAt | date: 'short' }}\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.READ\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [disabled]=\"isViewing\"\n (click)=\"onView(file)\"\n [fTooltip]=\"'shared.view' | translate\"\n tooltipPosition=\"top\"\n >\n @if (isViewing) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"eye\"></ui-icon>\n }\n </button>\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (click)=\"onEdit(file.id)\"\n [fTooltip]=\"'shared.edit' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"warn\"\n size=\"small\"\n (click)=\"onSoftDelete(file)\"\n [fTooltip]=\"'storage.tooltip.trash' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (click)=\"onPermanentDelete(file)\"\n [fTooltip]=\"'shared.delete' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"times-circle\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"8\" class=\"text-center py-4 text-muted-color\">\n @if (showCompanyInfo()) {\n {{ 'storage.empty.files.in.company' | translate }}\n } @else {\n {{ 'storage.empty.files' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class FileManagerListComponent extends BaseStorageListPage<IFileManager> {\n readonly FILE_PERMISSIONS = FILE_PERMISSIONS;\n\n private readonly fileService = inject(FileManagerApiService);\n private readonly translateService = inject(TranslateService);\n\n readonly files = this.items;\n readonly viewingFileId = signal<string | null>(null);\n\n private readonly _searchTerm = signal('');\n readonly searchTerm = this._searchTerm.asReadonly();\n\n readonly getFileIcon = getFileIcon;\n readonly getProviderLabelKey = getProviderLabelKey;\n readonly getProviderSeverity = getProviderSeverity;\n\n getResourceRoute(): string {\n return '/storage/files';\n }\n\n override getDeleteConfirmMessage(file: IFileManager): string {\n return this.translateService.translate('shared.confirm.delete.item', {\n name: file.name,\n });\n }\n\n async loadData(): Promise<void> {\n const token = this.beginLoad();\n this.isLoading.set(true);\n try {\n const response = await this.fileService.getAll(\n {\n pagination: this.getPaginationParams(),\n filter: {},\n select: [],\n sort: {},\n },\n this.searchTerm(),\n );\n\n if (!this.isLatestLoad(token)) return;\n\n if (response.success) {\n this.items.set(response.data ?? []);\n this.total.set(response.meta?.total ?? 0);\n }\n } finally {\n if (this.isLatestLoad(token)) this.isLoading.set(false);\n }\n }\n\n onSearchChange(term: string): void {\n this._searchTerm.set(term);\n this.first.set(0);\n this.loadData();\n }\n\n onUpload(): void {\n this.navigateTo(['/storage/files/new']);\n }\n\n async onView(file: IFileManager): Promise<void> {\n this.viewingFileId.set(file.id);\n try {\n const response = await firstValueFrom(\n this.fileService.getFiles([file.id]),\n );\n\n if (response.success && response.data?.length && response.data[0].url) {\n window.open(response.data[0].url, '_blank');\n } else {\n this.showError(\n this.translateService.translate('storage.file.url.not.available'),\n );\n }\n } finally {\n this.viewingFileId.set(null);\n }\n }\n\n onSoftDelete(file: IFileManager): void {\n this.confirmationService.confirm({\n message: this.translateService.translate(\n 'storage.delete.move.to.trash.confirm',\n { name: file.name },\n ),\n header: this.translateService.translate('storage.delete.move.to.trash'),\n icon: 'trash',\n acceptLabel: this.translateService.translate(\n 'storage.delete.move.to.trash',\n ),\n acceptButtonStyleClass: 'p-button-warning',\n accept: async () => {\n try {\n const response = await this.fileService.delete({\n id: file.id,\n type: 'delete',\n });\n this.showSuccess(\n response?.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response?.message ?? ''),\n );\n this.loadData();\n } catch {}\n },\n });\n }\n\n onPermanentDelete(file: IFileManager): void {\n this.confirmationService.confirm({\n message: this.translateService.translate(\n 'storage.delete.permanent.delete.confirm',\n { name: file.name },\n ),\n header: this.translateService.translate(\n 'storage.delete.permanent.delete',\n ),\n icon: 'exclamation-triangle',\n acceptLabel: this.translateService.translate(\n 'storage.delete.permanent.delete.button',\n ),\n rejectLabel: this.translateService.translate('shared.cancel'),\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n const response = await this.fileService.delete({\n id: file.id,\n type: 'permanent',\n });\n this.showSuccess(\n response?.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response?.message ?? ''),\n );\n this.loadData();\n } catch {}\n },\n });\n }\n}\n"],"mappings":"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"}
@@ -7,7 +7,7 @@ var FolderApiService = class FolderApiService extends ApiResourceService {
7
7
  }
8
8
  static ɵfac = i0.ɵɵngDeclareFactory({
9
9
  minVersion: "12.0.0",
10
- version: "22.2.2",
10
+ version: "22.2.3",
11
11
  ngImport: i0,
12
12
  type: FolderApiService,
13
13
  deps: [],
@@ -15,14 +15,14 @@ var FolderApiService = class FolderApiService extends ApiResourceService {
15
15
  });
16
16
  static ɵprov = i0.ɵɵngDeclareService({
17
17
  minVersion: "22.0.0",
18
- version: "22.2.2",
18
+ version: "22.2.3",
19
19
  ngImport: i0,
20
20
  type: FolderApiService
21
21
  });
22
22
  };
23
23
  i0.ɵɵngDeclareClassMetadata({
24
24
  minVersion: "12.0.0",
25
- version: "22.2.2",
25
+ version: "22.2.3",
26
26
  ngImport: i0,
27
27
  type: FolderApiService,
28
28
  decorators: [{ type: Service }],
@@ -30,4 +30,4 @@ i0.ɵɵngDeclareClassMetadata({
30
30
  });
31
31
  export { FolderApiService as t };
32
32
 
33
- //# sourceMappingURL=flusys-ng-storage-folder-api.service-BlQH7f29.mjs.map
33
+ //# sourceMappingURL=flusys-ng-storage-folder-api.service-5-wLOtDf.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage-folder-api.service-BlQH7f29.mjs","names":[],"sources":["../../../projects/ng-storage/services/folder-api.service.ts"],"sourcesContent":["import { Service } 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@Service()\nexport class FolderApiService extends ApiResourceService<\n ICreateFolderDto | IUpdateFolderDto,\n IFolder\n> {\n constructor() {\n super('folder', 'storage');\n }\n}\n"],"mappings":";;;AAgBA,IAAa,mBAAb,MAAa,yBAAyB,mBAGrC;CACC,cAAA;EACE,MAAM,UAAU,SAAS;CAC3B;CANW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,QAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;CAAgB,CAAA;;AAAhB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA,EAD5B,MAAA,QAAA,CAAA"}
1
+ {"version":3,"file":"flusys-ng-storage-folder-api.service-5-wLOtDf.mjs","names":[],"sources":["../../../projects/ng-storage/services/folder-api.service.ts"],"sourcesContent":["import { Service } 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@Service()\nexport class FolderApiService extends ApiResourceService<\n ICreateFolderDto | IUpdateFolderDto,\n IFolder\n> {\n constructor() {\n super('folder', 'storage');\n }\n}\n"],"mappings":";;;AAgBA,IAAa,mBAAb,MAAa,yBAAyB,mBAGrC;CACC,cAAA;EACE,MAAM,UAAU,SAAS;CAC3B;CANW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAgB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAhB,OAAA,QAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;CAAgB,CAAA;;AAAhB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAgB,YAAA,CAAA,EAD5B,MAAA,QAAA,CAAA"}
@@ -1,4 +1,4 @@
1
- import { t as FolderApiService } from "./flusys-ng-storage-folder-api.service-BlQH7f29.mjs";
1
+ import { t as FolderApiService } from "./flusys-ng-storage-folder-api.service-5-wLOtDf.mjs";
2
2
  import { BaseStoragePage } from "./flusys-ng-storage.mjs";
3
3
  import * as i0 from "@angular/core";
4
4
  import { Component, computed, effect, inject, signal } from "@angular/core";
@@ -72,7 +72,7 @@ var FolderFormComponent = class FolderFormComponent extends BaseStoragePage {
72
72
  }
73
73
  static ɵfac = i0.ɵɵngDeclareFactory({
74
74
  minVersion: "12.0.0",
75
- version: "22.2.2",
75
+ version: "22.2.3",
76
76
  ngImport: i0,
77
77
  type: FolderFormComponent,
78
78
  deps: [],
@@ -80,7 +80,7 @@ var FolderFormComponent = class FolderFormComponent extends BaseStoragePage {
80
80
  });
81
81
  static ɵcmp = i0.ɵɵngDeclareComponent({
82
82
  minVersion: "17.0.0",
83
- version: "22.2.2",
83
+ version: "22.2.3",
84
84
  type: FolderFormComponent,
85
85
  isStandalone: true,
86
86
  selector: "lib-folder-form",
@@ -215,7 +215,7 @@ var FolderFormComponent = class FolderFormComponent extends BaseStoragePage {
215
215
  };
216
216
  i0.ɵɵngDeclareClassMetadata({
217
217
  minVersion: "12.0.0",
218
- version: "22.2.2",
218
+ version: "22.2.3",
219
219
  ngImport: i0,
220
220
  type: FolderFormComponent,
221
221
  decorators: [{
@@ -297,4 +297,4 @@ i0.ɵɵngDeclareClassMetadata({
297
297
  });
298
298
  export { FolderFormComponent };
299
299
 
300
- //# sourceMappingURL=flusys-ng-storage-folder-form.component-C721Ej1L.mjs.map
300
+ //# sourceMappingURL=flusys-ng-storage-folder-form.component-17UJpIi4.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage-folder-form.component-C721Ej1L.mjs","names":[],"sources":["../../../projects/ng-storage/pages/folder/folder-form.component.ts"],"sourcesContent":["import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { IFolder } from '../../interfaces/folder.interface';\nimport { FolderApiService } from '../../services/folder-api.service';\nimport { BaseStoragePage } from '../../utils/base-storage-page';\nimport {\n FButtonDirective,\n InputTextDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\n\ninterface IFolderFormModel {\n id: string;\n name: string;\n}\n\n@Component({\n selector: 'lib-folder-form',\n imports: [\n InputTextDirective,\n FButtonDirective,\n UiIconComponent,\n FormField,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div class=\"mb-4\">\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{\n (isEditMode()\n ? 'storage.folder.edit.folder'\n : 'storage.folder.new.folder'\n ) | translate\n }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'shared.company' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n\n <form (submit)=\"onSubmit($event)\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"field\">\n <label\n for=\"name\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.folder.name.required' | translate }}</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"folderForm.name\"\n [placeholder]=\"'storage.folder.name.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n </div>\n\n <div class=\"flex justify-end gap-2 mt-4\">\n <button\n fButton\n type=\"button\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n (isEditMode() ? 'shared.update' : 'shared.create') | translate\n }}</span>\n </button>\n </div>\n </form>\n </div>\n `,\n})\nexport class FolderFormComponent extends BaseStoragePage {\n private readonly route = inject(ActivatedRoute);\n private readonly folderService = inject(FolderApiService);\n private readonly translateService = inject(TranslateService);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private initialized = false;\n\n readonly existingFolder = signal<IFolder | null>(null);\n readonly isEditMode = computed(() => !!this.existingFolder());\n\n readonly formModel = signal<IFolderFormModel>({\n id: '',\n name: '',\n });\n\n readonly folderForm = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translateService.translate(\n 'storage.validation.folder.name.required',\n ),\n });\n });\n\n readonly isFormValid = computed(\n () => this.formModel().name.trim().length > 0,\n );\n\n constructor() {\n super();\n effect(() => {\n const params = this.routeParams();\n if (!params || this.initialized) return;\n\n this.initialized = true;\n const folderId = params.get('id');\n if (folderId && folderId !== 'new') {\n this.loadFolder(folderId);\n }\n });\n }\n\n async loadFolder(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.folderService.findById(id);\n if (response.success && response.data) {\n const folder = response.data;\n this.existingFolder.set(folder);\n this.formModel.set({ id: folder.id, name: folder.name });\n }\n } catch {\n this.navigateTo(['/storage/folders']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onSubmit(event: Event): Promise<void> {\n event.preventDefault();\n\n if (!this.isFormValid()) return;\n\n this.isLoading.set(true);\n try {\n const formValue = this.formModel();\n\n const response = this.isEditMode()\n ? await this.folderService.update({\n id: formValue.id,\n name: formValue.name,\n })\n : await this.folderService.insert({ name: formValue.name });\n\n this.showSuccess(\n response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response.message ?? ''),\n );\n\n this.navigateTo(['/storage/folders']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.navigateTo(['/storage/folders']);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-storage-folder-form.component-17UJpIi4.mjs","names":[],"sources":["../../../projects/ng-storage/pages/folder/folder-form.component.ts"],"sourcesContent":["import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { IFolder } from '../../interfaces/folder.interface';\nimport { FolderApiService } from '../../services/folder-api.service';\nimport { BaseStoragePage } from '../../utils/base-storage-page';\nimport {\n FButtonDirective,\n InputTextDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\n\ninterface IFolderFormModel {\n id: string;\n name: string;\n}\n\n@Component({\n selector: 'lib-folder-form',\n imports: [\n InputTextDirective,\n FButtonDirective,\n UiIconComponent,\n FormField,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div class=\"mb-4\">\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{\n (isEditMode()\n ? 'storage.folder.edit.folder'\n : 'storage.folder.new.folder'\n ) | translate\n }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'shared.company' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n\n <form (submit)=\"onSubmit($event)\">\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"field\">\n <label\n for=\"name\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.folder.name.required' | translate }}</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"folderForm.name\"\n [placeholder]=\"'storage.folder.name.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n </div>\n\n <div class=\"flex justify-end gap-2 mt-4\">\n <button\n fButton\n type=\"button\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n (isEditMode() ? 'shared.update' : 'shared.create') | translate\n }}</span>\n </button>\n </div>\n </form>\n </div>\n `,\n})\nexport class FolderFormComponent extends BaseStoragePage {\n private readonly route = inject(ActivatedRoute);\n private readonly folderService = inject(FolderApiService);\n private readonly translateService = inject(TranslateService);\n\n private readonly routeParams = toSignal(this.route.paramMap);\n private initialized = false;\n\n readonly existingFolder = signal<IFolder | null>(null);\n readonly isEditMode = computed(() => !!this.existingFolder());\n\n readonly formModel = signal<IFolderFormModel>({\n id: '',\n name: '',\n });\n\n readonly folderForm = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translateService.translate(\n 'storage.validation.folder.name.required',\n ),\n });\n });\n\n readonly isFormValid = computed(\n () => this.formModel().name.trim().length > 0,\n );\n\n constructor() {\n super();\n effect(() => {\n const params = this.routeParams();\n if (!params || this.initialized) return;\n\n this.initialized = true;\n const folderId = params.get('id');\n if (folderId && folderId !== 'new') {\n this.loadFolder(folderId);\n }\n });\n }\n\n async loadFolder(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.folderService.findById(id);\n if (response.success && response.data) {\n const folder = response.data;\n this.existingFolder.set(folder);\n this.formModel.set({ id: folder.id, name: folder.name });\n }\n } catch {\n this.navigateTo(['/storage/folders']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n async onSubmit(event: Event): Promise<void> {\n event.preventDefault();\n\n if (!this.isFormValid()) return;\n\n this.isLoading.set(true);\n try {\n const formValue = this.formModel();\n\n const response = this.isEditMode()\n ? await this.folderService.update({\n id: formValue.id,\n name: formValue.name,\n })\n : await this.folderService.insert({ name: formValue.name });\n\n this.showSuccess(\n response.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response.message ?? ''),\n );\n\n this.navigateTo(['/storage/folders']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.navigateTo(['/storage/folders']);\n }\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as FolderApiService } from "./flusys-ng-storage-folder-api.service-BlQH7f29.mjs";
1
+ import { t as FolderApiService } from "./flusys-ng-storage-folder-api.service-5-wLOtDf.mjs";
2
2
  import { BaseStorageListPage } from "./flusys-ng-storage.mjs";
3
3
  import * as i0 from "@angular/core";
4
4
  import { Component, inject, signal } from "@angular/core";
@@ -47,7 +47,7 @@ var FolderListComponent = class FolderListComponent extends BaseStorageListPage
47
47
  }
48
48
  static ɵfac = i0.ɵɵngDeclareFactory({
49
49
  minVersion: "12.0.0",
50
- version: "22.2.2",
50
+ version: "22.2.3",
51
51
  ngImport: i0,
52
52
  type: FolderListComponent,
53
53
  deps: null,
@@ -55,7 +55,7 @@ var FolderListComponent = class FolderListComponent extends BaseStorageListPage
55
55
  });
56
56
  static ɵcmp = i0.ɵɵngDeclareComponent({
57
57
  minVersion: "17.0.0",
58
- version: "22.2.2",
58
+ version: "22.2.3",
59
59
  type: FolderListComponent,
60
60
  isStandalone: true,
61
61
  selector: "lib-folder-list",
@@ -376,7 +376,7 @@ var FolderListComponent = class FolderListComponent extends BaseStorageListPage
376
376
  };
377
377
  i0.ɵɵngDeclareClassMetadata({
378
378
  minVersion: "12.0.0",
379
- version: "22.2.2",
379
+ version: "22.2.3",
380
380
  ngImport: i0,
381
381
  type: FolderListComponent,
382
382
  decorators: [{
@@ -522,4 +522,4 @@ i0.ɵɵngDeclareClassMetadata({
522
522
  });
523
523
  export { FolderListComponent };
524
524
 
525
- //# sourceMappingURL=flusys-ng-storage-folder-list.component-JBDc-7tx.mjs.map
525
+ //# sourceMappingURL=flusys-ng-storage-folder-list.component-kK24TzQZ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage-folder-list.component-JBDc-7tx.mjs","names":[],"sources":["../../../projects/ng-storage/pages/folder/folder-list.component.ts"],"sourcesContent":["import { Component, inject, signal } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n FOLDER_PERMISSIONS,\n HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { IFolder } from '../../interfaces/folder.interface';\nimport { FolderApiService } from '../../services/folder-api.service';\nimport { BaseStorageListPage } from '../../utils/base-storage-page';\nimport {\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\n\n@Component({\n selector: 'lib-folder-list',\n imports: [\n DatePipe,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TooltipDirective,\n UiIconComponent,\n FormsModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{ 'storage.folder.title' | translate }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'shared.company' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <div\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto\"\n >\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n <button\n fButton\n *hasPermission=\"FOLDER_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'storage.button.new.folder' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"overflow-x-auto\">\n <f-table\n [value]=\"folders()\"\n [loading]=\"isLoading()\"\n [paginator]=\"totalRecords() > 0\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'shared.name' | translate }}</th>\n <th>{{ 'storage.table.slug' | translate }}</th>\n <th class=\"hidden sm:table-cell\">\n {{ 'storage.table.created' | translate }}\n </th>\n <th class=\"w-[120px]\">\n {{ 'shared.actions' | translate }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body let-folder>\n <tr>\n <td>\n <ui-icon name=\"folder\" class=\"mr-2\"></ui-icon>\n {{ folder.name }}\n </td>\n <td>{{ folder.slug }}</td>\n <td class=\"hidden sm:table-cell\">\n {{ folder.createdAt | date: 'short' }}\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"FOLDER_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (click)=\"onEdit(folder.id)\"\n [fTooltip]=\"'shared.edit' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"FOLDER_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (click)=\"onDeleteFolder(folder)\"\n [fTooltip]=\"'shared.delete' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"4\" class=\"text-center py-4 text-muted-color\">\n @if (showCompanyInfo()) {\n {{ 'storage.empty.folders.in.company' | translate }}\n } @else {\n {{ 'storage.empty.folders' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class FolderListComponent extends BaseStorageListPage<IFolder> {\n readonly FOLDER_PERMISSIONS = FOLDER_PERMISSIONS;\n\n private readonly folderService = inject(FolderApiService);\n private readonly translateService = inject(TranslateService);\n\n readonly folders = this.items;\n\n private readonly _searchTerm = signal('');\n readonly searchTerm = this._searchTerm.asReadonly();\n\n getResourceRoute(): string {\n return '/storage/folders';\n }\n\n override getDeleteConfirmMessage(folder: IFolder): string {\n return this.translateService.translate('shared.confirm.delete.item', {\n name: folder.name,\n });\n }\n\n async loadData(): Promise<void> {\n const token = this.beginLoad();\n this.isLoading.set(true);\n try {\n const response = await this.folderService.getAll(\n {\n pagination: this.getPaginationParams(),\n },\n this.searchTerm(),\n );\n if (!this.isLatestLoad(token)) return;\n if (response.success) {\n this.items.set(response.data ?? []);\n this.total.set(response.meta?.total ?? 0);\n }\n } finally {\n if (this.isLatestLoad(token)) this.isLoading.set(false);\n }\n }\n\n onSearchChange(term: string): void {\n this._searchTerm.set(term);\n this.first.set(0);\n this.loadData();\n }\n\n onDeleteFolder(folder: IFolder): void {\n this.onDeleteAsync(\n folder,\n (f) => f.id,\n (id) => this.folderService.delete({ id, type: 'delete' }),\n {\n header: this.translateService.translate('storage.folder.delete.title'),\n },\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-storage-folder-list.component-kK24TzQZ.mjs","names":[],"sources":["../../../projects/ng-storage/pages/folder/folder-list.component.ts"],"sourcesContent":["import { Component, inject, signal } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n FOLDER_PERMISSIONS,\n HasPermissionDirective,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { IFolder } from '../../interfaces/folder.interface';\nimport { FolderApiService } from '../../services/folder-api.service';\nimport { BaseStorageListPage } from '../../utils/base-storage-page';\nimport {\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\n\n@Component({\n selector: 'lib-folder-list',\n imports: [\n DatePipe,\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TooltipDirective,\n UiIconComponent,\n FormsModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{ 'storage.folder.title' | translate }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mt-1\">\n {{ 'shared.company' | translate }}: {{ currentCompanyName() }}\n </p>\n }\n </div>\n <div\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto\"\n >\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n <button\n fButton\n *hasPermission=\"FOLDER_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'storage.button.new.folder' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"overflow-x-auto\">\n <f-table\n [value]=\"folders()\"\n [loading]=\"isLoading()\"\n [paginator]=\"totalRecords() > 0\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'shared.name' | translate }}</th>\n <th>{{ 'storage.table.slug' | translate }}</th>\n <th class=\"hidden sm:table-cell\">\n {{ 'storage.table.created' | translate }}\n </th>\n <th class=\"w-[120px]\">\n {{ 'shared.actions' | translate }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body let-folder>\n <tr>\n <td>\n <ui-icon name=\"folder\" class=\"mr-2\"></ui-icon>\n {{ folder.name }}\n </td>\n <td>{{ folder.slug }}</td>\n <td class=\"hidden sm:table-cell\">\n {{ folder.createdAt | date: 'short' }}\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"FOLDER_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (click)=\"onEdit(folder.id)\"\n [fTooltip]=\"'shared.edit' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"FOLDER_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (click)=\"onDeleteFolder(folder)\"\n [fTooltip]=\"'shared.delete' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"4\" class=\"text-center py-4 text-muted-color\">\n @if (showCompanyInfo()) {\n {{ 'storage.empty.folders.in.company' | translate }}\n } @else {\n {{ 'storage.empty.folders' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class FolderListComponent extends BaseStorageListPage<IFolder> {\n readonly FOLDER_PERMISSIONS = FOLDER_PERMISSIONS;\n\n private readonly folderService = inject(FolderApiService);\n private readonly translateService = inject(TranslateService);\n\n readonly folders = this.items;\n\n private readonly _searchTerm = signal('');\n readonly searchTerm = this._searchTerm.asReadonly();\n\n getResourceRoute(): string {\n return '/storage/folders';\n }\n\n override getDeleteConfirmMessage(folder: IFolder): string {\n return this.translateService.translate('shared.confirm.delete.item', {\n name: folder.name,\n });\n }\n\n async loadData(): Promise<void> {\n const token = this.beginLoad();\n this.isLoading.set(true);\n try {\n const response = await this.folderService.getAll(\n {\n pagination: this.getPaginationParams(),\n },\n this.searchTerm(),\n );\n if (!this.isLatestLoad(token)) return;\n if (response.success) {\n this.items.set(response.data ?? []);\n this.total.set(response.meta?.total ?? 0);\n }\n } finally {\n if (this.isLatestLoad(token)) this.isLoading.set(false);\n }\n }\n\n onSearchChange(term: string): void {\n this._searchTerm.set(term);\n this.first.set(0);\n this.loadData();\n }\n\n onDeleteFolder(folder: IFolder): void {\n this.onDeleteAsync(\n folder,\n (f) => f.id,\n (id) => this.folderService.delete({ id, type: 'delete' }),\n {\n header: this.translateService.translate('storage.folder.delete.title'),\n },\n );\n }\n}\n"],"mappings":"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"}
@@ -7,7 +7,7 @@ var StorageConfigApiService = class StorageConfigApiService extends ApiResourceS
7
7
  }
8
8
  static ɵfac = i0.ɵɵngDeclareFactory({
9
9
  minVersion: "12.0.0",
10
- version: "22.2.2",
10
+ version: "22.2.3",
11
11
  ngImport: i0,
12
12
  type: StorageConfigApiService,
13
13
  deps: [],
@@ -15,14 +15,14 @@ var StorageConfigApiService = class StorageConfigApiService extends ApiResourceS
15
15
  });
16
16
  static ɵprov = i0.ɵɵngDeclareService({
17
17
  minVersion: "22.0.0",
18
- version: "22.2.2",
18
+ version: "22.2.3",
19
19
  ngImport: i0,
20
20
  type: StorageConfigApiService
21
21
  });
22
22
  };
23
23
  i0.ɵɵngDeclareClassMetadata({
24
24
  minVersion: "12.0.0",
25
- version: "22.2.2",
25
+ version: "22.2.3",
26
26
  ngImport: i0,
27
27
  type: StorageConfigApiService,
28
28
  decorators: [{ type: Service }],
@@ -30,4 +30,4 @@ i0.ɵɵngDeclareClassMetadata({
30
30
  });
31
31
  export { StorageConfigApiService as t };
32
32
 
33
- //# sourceMappingURL=flusys-ng-storage-storage-config-api.service-6pfK7lpy.mjs.map
33
+ //# sourceMappingURL=flusys-ng-storage-storage-config-api.service-BrkSaKHQ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage-storage-config-api.service-6pfK7lpy.mjs","names":[],"sources":["../../../projects/ng-storage/services/storage-config-api.service.ts"],"sourcesContent":["import { Service } 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@Service()\nexport class StorageConfigApiService extends ApiResourceService<\n ICreateStorageConfigDto | IUpdateStorageConfigDto,\n IStorageConfig\n> {\n constructor() {\n super('storage-config', 'storage');\n }\n}\n"],"mappings":";;;AAgBA,IAAa,0BAAb,MAAa,gCAAgC,mBAG5C;CACC,cAAA;EACE,MAAM,kBAAkB,SAAS;CACnC;CANW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAuB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAvB,OAAA,QAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;CAAuB,CAAA;;AAAvB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAuB,YAAA,CAAA,EADnC,MAAA,QAAA,CAAA"}
1
+ {"version":3,"file":"flusys-ng-storage-storage-config-api.service-BrkSaKHQ.mjs","names":[],"sources":["../../../projects/ng-storage/services/storage-config-api.service.ts"],"sourcesContent":["import { Service } 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@Service()\nexport class StorageConfigApiService extends ApiResourceService<\n ICreateStorageConfigDto | IUpdateStorageConfigDto,\n IStorageConfig\n> {\n constructor() {\n super('storage-config', 'storage');\n }\n}\n"],"mappings":";;;AAgBA,IAAa,0BAAb,MAAa,gCAAgC,mBAG5C;CACC,cAAA;EACE,MAAM,kBAAkB,SAAS;CACnC;CANW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAuB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAvB,OAAA,QAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;CAAuB,CAAA;;AAAvB,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAuB,YAAA,CAAA,EADnC,MAAA,QAAA,CAAA"}