@flusys/ng-storage 5.4.1 → 5.5.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.
- package/fesm2022/{flusys-ng-storage-file-manager-form.component-DnE4Whts.mjs → flusys-ng-storage-file-manager-form.component--W6sWv7W.mjs} +67 -42
- package/fesm2022/flusys-ng-storage-file-manager-form.component--W6sWv7W.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-file-manager-list.component-Go5Gqptd.mjs → flusys-ng-storage-file-manager-list.component-D_shqU2a.mjs} +77 -50
- package/fesm2022/flusys-ng-storage-file-manager-list.component-D_shqU2a.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-folder-form.component-BYOD0A_5.mjs → flusys-ng-storage-folder-form.component-BK2EWeV4.mjs} +45 -29
- package/fesm2022/flusys-ng-storage-folder-form.component-BK2EWeV4.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-folder-list.component-N6RjQQwv.mjs → flusys-ng-storage-folder-list.component-aQXBRZiN.mjs} +45 -33
- package/fesm2022/flusys-ng-storage-folder-list.component-aQXBRZiN.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-storage-config-form.component-BdpCYR3c.mjs → flusys-ng-storage-storage-config-form.component-ByRs-CSx.mjs} +47 -30
- package/fesm2022/{flusys-ng-storage-storage-config-form.component-BdpCYR3c.mjs.map → flusys-ng-storage-storage-config-form.component-ByRs-CSx.mjs.map} +1 -1
- package/fesm2022/{flusys-ng-storage-storage-config-list.component-CtsIrKSq.mjs → flusys-ng-storage-storage-config-list.component-cjiA8k2G.mjs} +45 -33
- package/fesm2022/flusys-ng-storage-storage-config-list.component-cjiA8k2G.mjs.map +1 -0
- package/fesm2022/flusys-ng-storage.mjs +58 -46
- package/fesm2022/flusys-ng-storage.mjs.map +1 -1
- package/package.json +11 -10
- package/fesm2022/flusys-ng-storage-file-manager-form.component-DnE4Whts.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-file-manager-list.component-Go5Gqptd.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-folder-form.component-BYOD0A_5.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-folder-list.component-N6RjQQwv.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-storage-config-list.component-CtsIrKSq.mjs.map +0 -1
|
@@ -20,13 +20,20 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
20
20
|
translateService = inject(TranslateService);
|
|
21
21
|
routeParams = toSignal(this.route.paramMap);
|
|
22
22
|
initialized = false;
|
|
23
|
-
isLoadingConfigs = signal(false,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
isLoadingConfigs = signal(false, /* @ts-ignore */
|
|
24
|
+
...(ngDevMode ? [{ debugName: "isLoadingConfigs" }] : /* istanbul ignore next */ []));
|
|
25
|
+
isLoadingFolders = signal(false, /* @ts-ignore */
|
|
26
|
+
...(ngDevMode ? [{ debugName: "isLoadingFolders" }] : /* istanbul ignore next */ []));
|
|
27
|
+
existingFile = signal(null, /* @ts-ignore */
|
|
28
|
+
...(ngDevMode ? [{ debugName: "existingFile" }] : /* istanbul ignore next */ []));
|
|
29
|
+
isEditMode = computed(() => !!this.existingFile(), /* @ts-ignore */
|
|
30
|
+
...(ngDevMode ? [{ debugName: "isEditMode" }] : /* istanbul ignore next */ []));
|
|
31
|
+
selectedFile = signal(null, /* @ts-ignore */
|
|
32
|
+
...(ngDevMode ? [{ debugName: "selectedFile" }] : /* istanbul ignore next */ []));
|
|
33
|
+
availableConfigs = signal([], /* @ts-ignore */
|
|
34
|
+
...(ngDevMode ? [{ debugName: "availableConfigs" }] : /* istanbul ignore next */ []));
|
|
35
|
+
availableFolders = signal([], /* @ts-ignore */
|
|
36
|
+
...(ngDevMode ? [{ debugName: "availableFolders" }] : /* istanbul ignore next */ []));
|
|
30
37
|
formatFileSize = formatFileSize;
|
|
31
38
|
getProviderLabelKey = getProviderLabelKey;
|
|
32
39
|
formModel = signal({
|
|
@@ -35,13 +42,15 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
35
42
|
isPrivate: false,
|
|
36
43
|
folderId: '',
|
|
37
44
|
storageConfigId: '',
|
|
38
|
-
},
|
|
45
|
+
}, /* @ts-ignore */
|
|
46
|
+
...(ngDevMode ? [{ debugName: "formModel" }] : /* istanbul ignore next */ []));
|
|
39
47
|
fileForm = form(this.formModel, (f) => {
|
|
40
48
|
required(f.name, {
|
|
41
49
|
message: this.translateService.translate('storage.validation.file.name.required'),
|
|
42
50
|
});
|
|
43
51
|
});
|
|
44
|
-
isFormValid = computed(() => this.formModel().name.trim().length > 0,
|
|
52
|
+
isFormValid = computed(() => this.formModel().name.trim().length > 0, /* @ts-ignore */
|
|
53
|
+
...(ngDevMode ? [{ debugName: "isFormValid" }] : /* istanbul ignore next */ []));
|
|
45
54
|
constructor() {
|
|
46
55
|
super();
|
|
47
56
|
effect(() => {
|
|
@@ -195,8 +204,8 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
195
204
|
onCancel() {
|
|
196
205
|
this.navigateTo(['/storage/files']);
|
|
197
206
|
}
|
|
198
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
199
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
207
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FileManagerFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
208
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: FileManagerFormComponent, isStandalone: true, selector: "lib-file-manager-form", usesInheritance: true, ngImport: i0, template: `
|
|
200
209
|
<div class="card">
|
|
201
210
|
<div class="mb-4">
|
|
202
211
|
<h3 class="text-lg sm:text-xl font-semibold">
|
|
@@ -337,13 +346,15 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
337
346
|
{{ formatFileSize(file.size) }}
|
|
338
347
|
</div>
|
|
339
348
|
</div>
|
|
340
|
-
<
|
|
341
|
-
|
|
349
|
+
<button
|
|
350
|
+
pButton
|
|
342
351
|
[text]="true"
|
|
343
352
|
severity="danger"
|
|
344
353
|
size="small"
|
|
345
|
-
(
|
|
346
|
-
|
|
354
|
+
(click)="fileUpload.clear()"
|
|
355
|
+
>
|
|
356
|
+
<span pButtonIcon class="pi pi-times"></span>
|
|
357
|
+
</button>
|
|
347
358
|
</div>
|
|
348
359
|
}
|
|
349
360
|
</div>
|
|
@@ -414,30 +425,36 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
414
425
|
</div>
|
|
415
426
|
|
|
416
427
|
<div class="flex justify-end gap-2 mt-4">
|
|
417
|
-
<
|
|
418
|
-
|
|
428
|
+
<button
|
|
429
|
+
pButton
|
|
419
430
|
severity="secondary"
|
|
420
431
|
[outlined]="true"
|
|
421
|
-
(
|
|
422
|
-
|
|
423
|
-
|
|
432
|
+
(click)="onCancel()"
|
|
433
|
+
>
|
|
434
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
435
|
+
</button>
|
|
436
|
+
<button
|
|
437
|
+
pButton
|
|
424
438
|
type="submit"
|
|
425
|
-
[label]="
|
|
426
|
-
(isEditMode() ? 'shared.update' : 'shared.upload') | translate
|
|
427
|
-
"
|
|
428
|
-
[loading]="isLoading()"
|
|
429
439
|
[disabled]="
|
|
430
440
|
!isFormValid() ||
|
|
431
441
|
(!isEditMode() && !selectedFile()) ||
|
|
432
442
|
isLoading()
|
|
433
443
|
"
|
|
434
|
-
|
|
444
|
+
>
|
|
445
|
+
@if (isLoading()) {
|
|
446
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
447
|
+
}
|
|
448
|
+
<span pButtonLabel>{{
|
|
449
|
+
(isEditMode() ? 'shared.update' : 'shared.upload') | translate
|
|
450
|
+
}}</span>
|
|
451
|
+
</button>
|
|
435
452
|
</div>
|
|
436
453
|
</form>
|
|
437
454
|
</div>
|
|
438
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PrimeModule }, { kind: "
|
|
455
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: PrimeModule }, { kind: "directive", type: i1$1.ButtonDirective, selector: "[pButton]", inputs: ["pButton", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "link", "rounded", "fluid", "variant", "iconOnly", "loading", "severity"] }, { kind: "directive", type: i1$1.ButtonLabel, selector: "[pButtonLabel]", inputs: ["pButtonLabelPT", "pButtonLabelUnstyled"] }, { kind: "directive", type: i1$1.ButtonIcon, selector: "[pButtonIcon]", inputs: ["pButtonIconPT", "pButtonUnstyled"] }, { kind: "component", type: i3.FileUpload, selector: "p-fileupload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "chooseButtonProps", "uploadButtonProps", "cancelButtonProps", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }, { kind: "directive", type: i3$1.InputText, selector: "[pInputText]", inputs: ["hostName", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
439
456
|
}
|
|
440
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
457
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FileManagerFormComponent, decorators: [{
|
|
441
458
|
type: Component,
|
|
442
459
|
args: [{
|
|
443
460
|
selector: 'lib-file-manager-form',
|
|
@@ -583,13 +600,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
583
600
|
{{ formatFileSize(file.size) }}
|
|
584
601
|
</div>
|
|
585
602
|
</div>
|
|
586
|
-
<
|
|
587
|
-
|
|
603
|
+
<button
|
|
604
|
+
pButton
|
|
588
605
|
[text]="true"
|
|
589
606
|
severity="danger"
|
|
590
607
|
size="small"
|
|
591
|
-
(
|
|
592
|
-
|
|
608
|
+
(click)="fileUpload.clear()"
|
|
609
|
+
>
|
|
610
|
+
<span pButtonIcon class="pi pi-times"></span>
|
|
611
|
+
</button>
|
|
593
612
|
</div>
|
|
594
613
|
}
|
|
595
614
|
</div>
|
|
@@ -660,24 +679,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
660
679
|
</div>
|
|
661
680
|
|
|
662
681
|
<div class="flex justify-end gap-2 mt-4">
|
|
663
|
-
<
|
|
664
|
-
|
|
682
|
+
<button
|
|
683
|
+
pButton
|
|
665
684
|
severity="secondary"
|
|
666
685
|
[outlined]="true"
|
|
667
|
-
(
|
|
668
|
-
|
|
669
|
-
|
|
686
|
+
(click)="onCancel()"
|
|
687
|
+
>
|
|
688
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
689
|
+
</button>
|
|
690
|
+
<button
|
|
691
|
+
pButton
|
|
670
692
|
type="submit"
|
|
671
|
-
[label]="
|
|
672
|
-
(isEditMode() ? 'shared.update' : 'shared.upload') | translate
|
|
673
|
-
"
|
|
674
|
-
[loading]="isLoading()"
|
|
675
693
|
[disabled]="
|
|
676
694
|
!isFormValid() ||
|
|
677
695
|
(!isEditMode() && !selectedFile()) ||
|
|
678
696
|
isLoading()
|
|
679
697
|
"
|
|
680
|
-
|
|
698
|
+
>
|
|
699
|
+
@if (isLoading()) {
|
|
700
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
701
|
+
}
|
|
702
|
+
<span pButtonLabel>{{
|
|
703
|
+
(isEditMode() ? 'shared.update' : 'shared.upload') | translate
|
|
704
|
+
}}</span>
|
|
705
|
+
</button>
|
|
681
706
|
</div>
|
|
682
707
|
</form>
|
|
683
708
|
</div>
|
|
@@ -686,4 +711,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
686
711
|
}], ctorParameters: () => [] });
|
|
687
712
|
|
|
688
713
|
export { FileManagerFormComponent };
|
|
689
|
-
//# sourceMappingURL=flusys-ng-storage-file-manager-form.component
|
|
714
|
+
//# sourceMappingURL=flusys-ng-storage-file-manager-form.component--W6sWv7W.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusys-ng-storage-file-manager-form.component--W6sWv7W.mjs","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 AngularModule,\n PrimeModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport type { FileSelectEvent } from 'primeng/fileupload';\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';\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: [AngularModule, PrimeModule, FormField, TranslatePipe],\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 (ngSubmit)=\"onSubmit()\">\n @if (!isEditMode()) {\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mb-4\">\n <div class=\"field\">\n <label\n for=\"storageConfig\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.config.provider.required' | translate }}</label\n >\n <select\n id=\"storageConfig\"\n class=\"p-select-native w-full\"\n [formField]=\"fileForm.storageConfigId\"\n >\n <option value=\"\">\n {{ 'storage.config.select.config' | translate }}\n </option>\n @for (config of availableConfigs(); track config.id) {\n <option [value]=\"config.id\">\n {{ config.name }} ({{\n getProviderLabelKey(config.storage) | translate\n }})\n </option>\n }\n </select>\n @if (availableConfigs().length === 0 && !isLoadingConfigs()) {\n <small class=\"text-warn block mt-2\">\n <i class=\"pi pi-exclamation-triangle mr-1\"></i>\n {{ '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 <select\n id=\"folder\"\n class=\"p-select-native w-full\"\n [formField]=\"fileForm.folderId\"\n >\n <option value=\"\">\n {{ 'storage.folder.no.folder' | translate }}\n </option>\n @for (folder of availableFolders(); track folder.id) {\n <option [value]=\"folder.id\">{{ folder.name }}</option>\n }\n </select>\n @if (availableFolders().length === 0 && !isLoadingFolders()) {\n <small class=\"text-muted-color block mt-2\">\n <i class=\"pi pi-info-circle mr-1\"></i>\n {{ '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 <select\n id=\"folder\"\n class=\"p-select-native w-full\"\n [formField]=\"fileForm.folderId\"\n >\n <option value=\"\">\n {{ 'storage.folder.no.folder' | translate }}\n </option>\n @for (folder of availableFolders(); track folder.id) {\n <option [value]=\"folder.id\">{{ folder.name }}</option>\n }\n </select>\n @if (availableFolders().length === 0 && !isLoadingFolders()) {\n <small class=\"text-muted-color block mt-2\">\n <i class=\"pi pi-info-circle mr-1\"></i>\n {{ '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 <p-fileupload\n #fileUpload\n [customUpload]=\"true\"\n (onSelect)=\"onFileSelect($event)\"\n [multiple]=\"false\"\n [maxFileSize]=\"50000000\"\n [showUploadButton]=\"false\"\n [showCancelButton]=\"false\"\n [chooseLabel]=\"'storage.button.choose.file' | translate\"\n chooseIcon=\"pi pi-upload\"\n accept=\"*/*\"\n class=\"w-full\"\n >\n <ng-template #content let-files>\n @if (files && files.length > 0) {\n <div class=\"flex flex-col gap-2\">\n @for (file of files; track file.name) {\n <div\n class=\"flex items-center gap-3 p-3 border border-surface rounded-lg bg-surface-ground\"\n >\n <i\n class=\"pi pi-file text-xl sm:text-2xl text-primary\"\n ></i>\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 pButton\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (click)=\"fileUpload.clear()\"\n >\n <span pButtonIcon class=\"pi pi-times\"></span>\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 <i\n class=\"pi pi-cloud-upload text-3xl sm:text-4xl text-muted-color mb-3\"\n ></i>\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 </p-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 pInputText\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 <label class=\"p-checkbox-native flex items-center gap-2\">\n <input type=\"checkbox\" [formField]=\"fileForm.isPrivate\" />\n <span>{{ 'storage.file.private' | translate }}</span>\n </label>\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 pButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n pButton\n type=\"submit\"\n [disabled]=\"\n !isFormValid() ||\n (!isEditMode() && !selectedFile()) ||\n isLoading()\n \"\n >\n @if (isLoading()) {\n <span pButtonIcon class=\"pi pi-spinner pi-spin\"></span>\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 async onSubmit(): Promise<void> {\n if (!this.isFormValid()) return;\n\n this.isLoading.set(true);\n try {\n const formValue = this.formModel();\n\n if (this.isEditMode()) {\n 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"],"names":["i2","i4"],"mappings":"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"}
|
|
@@ -14,7 +14,8 @@ class FileManagerListComponent extends BaseStorageListPage {
|
|
|
14
14
|
fileService = inject(FileManagerApiService);
|
|
15
15
|
translateService = inject(TranslateService);
|
|
16
16
|
files = this.items;
|
|
17
|
-
viewingFileId = signal(null,
|
|
17
|
+
viewingFileId = signal(null, /* @ts-ignore */
|
|
18
|
+
...(ngDevMode ? [{ debugName: "viewingFileId" }] : /* istanbul ignore next */ []));
|
|
18
19
|
getFileIcon = getFileIcon;
|
|
19
20
|
getProviderLabelKey = getProviderLabelKey;
|
|
20
21
|
getProviderSeverity = getProviderSeverity;
|
|
@@ -101,8 +102,8 @@ class FileManagerListComponent extends BaseStorageListPage {
|
|
|
101
102
|
},
|
|
102
103
|
});
|
|
103
104
|
}
|
|
104
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
105
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
105
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FileManagerListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
106
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: FileManagerListComponent, isStandalone: true, selector: "lib-file-manager-list", usesInheritance: true, ngImport: i0, template: `
|
|
106
107
|
<div class="card">
|
|
107
108
|
<div
|
|
108
109
|
class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4"
|
|
@@ -117,13 +118,15 @@ class FileManagerListComponent extends BaseStorageListPage {
|
|
|
117
118
|
</p>
|
|
118
119
|
}
|
|
119
120
|
</div>
|
|
120
|
-
<
|
|
121
|
+
<button
|
|
122
|
+
pButton
|
|
121
123
|
*hasPermission="FILE_PERMISSIONS.CREATE"
|
|
122
|
-
|
|
123
|
-
icon="pi pi-upload"
|
|
124
|
-
(onClick)="onUpload()"
|
|
124
|
+
(click)="onUpload()"
|
|
125
125
|
class="w-full sm:w-auto"
|
|
126
|
-
|
|
126
|
+
>
|
|
127
|
+
<span pButtonIcon class="pi pi-upload"></span>
|
|
128
|
+
<span pButtonLabel>{{ 'storage.button.upload.file' | translate }}</span>
|
|
129
|
+
</button>
|
|
127
130
|
</div>
|
|
128
131
|
|
|
129
132
|
<div class="overflow-x-auto">
|
|
@@ -201,48 +204,59 @@ class FileManagerListComponent extends BaseStorageListPage {
|
|
|
201
204
|
</td>
|
|
202
205
|
<td>
|
|
203
206
|
<div class="flex gap-1">
|
|
204
|
-
<
|
|
207
|
+
<button
|
|
208
|
+
pButton
|
|
205
209
|
*hasPermission="FILE_PERMISSIONS.READ"
|
|
206
|
-
icon="pi pi-eye"
|
|
207
210
|
[text]="true"
|
|
208
211
|
severity="secondary"
|
|
209
212
|
size="small"
|
|
210
|
-
[loading]="isViewing"
|
|
211
213
|
[disabled]="isViewing"
|
|
212
|
-
(
|
|
214
|
+
(click)="onView(file)"
|
|
213
215
|
[pTooltip]="'shared.view' | translate"
|
|
214
216
|
tooltipPosition="top"
|
|
215
|
-
|
|
216
|
-
|
|
217
|
+
>
|
|
218
|
+
@if (isViewing) {
|
|
219
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
220
|
+
} @else {
|
|
221
|
+
<span pButtonIcon class="pi pi-eye"></span>
|
|
222
|
+
}
|
|
223
|
+
</button>
|
|
224
|
+
<button
|
|
225
|
+
pButton
|
|
217
226
|
*hasPermission="FILE_PERMISSIONS.UPDATE"
|
|
218
|
-
icon="pi pi-pencil"
|
|
219
227
|
[text]="true"
|
|
220
228
|
severity="secondary"
|
|
221
229
|
size="small"
|
|
222
|
-
(
|
|
230
|
+
(click)="onEdit(file.id)"
|
|
223
231
|
[pTooltip]="'shared.edit' | translate"
|
|
224
232
|
tooltipPosition="top"
|
|
225
|
-
|
|
226
|
-
|
|
233
|
+
>
|
|
234
|
+
<span pButtonIcon class="pi pi-pencil"></span>
|
|
235
|
+
</button>
|
|
236
|
+
<button
|
|
237
|
+
pButton
|
|
227
238
|
*hasPermission="FILE_PERMISSIONS.DELETE"
|
|
228
|
-
icon="pi pi-trash"
|
|
229
239
|
[text]="true"
|
|
230
240
|
severity="warn"
|
|
231
241
|
size="small"
|
|
232
|
-
(
|
|
242
|
+
(click)="onSoftDelete(file)"
|
|
233
243
|
[pTooltip]="'storage.tooltip.trash' | translate"
|
|
234
244
|
tooltipPosition="top"
|
|
235
|
-
|
|
236
|
-
|
|
245
|
+
>
|
|
246
|
+
<span pButtonIcon class="pi pi-trash"></span>
|
|
247
|
+
</button>
|
|
248
|
+
<button
|
|
249
|
+
pButton
|
|
237
250
|
*hasPermission="FILE_PERMISSIONS.DELETE"
|
|
238
|
-
icon="pi pi-times-circle"
|
|
239
251
|
[text]="true"
|
|
240
252
|
severity="danger"
|
|
241
253
|
size="small"
|
|
242
|
-
(
|
|
254
|
+
(click)="onPermanentDelete(file)"
|
|
243
255
|
[pTooltip]="'shared.delete' | translate"
|
|
244
256
|
tooltipPosition="top"
|
|
245
|
-
|
|
257
|
+
>
|
|
258
|
+
<span pButtonIcon class="pi pi-times-circle"></span>
|
|
259
|
+
</button>
|
|
246
260
|
</div>
|
|
247
261
|
</td>
|
|
248
262
|
</tr>
|
|
@@ -261,9 +275,9 @@ class FileManagerListComponent extends BaseStorageListPage {
|
|
|
261
275
|
</p-table>
|
|
262
276
|
</div>
|
|
263
277
|
</div>
|
|
264
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "ngmodule", type: PrimeModule }, { kind: "
|
|
278
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "ngmodule", type: PrimeModule }, { kind: "directive", type: i1.ButtonDirective, selector: "[pButton]", inputs: ["pButton", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "link", "rounded", "fluid", "variant", "iconOnly", "loading", "severity"] }, { kind: "directive", type: i1.ButtonLabel, selector: "[pButtonLabel]", inputs: ["pButtonLabelPT", "pButtonLabelUnstyled"] }, { kind: "directive", type: i1.ButtonIcon, selector: "[pButtonIcon]", inputs: ["pButtonIconPT", "pButtonUnstyled"] }, { kind: "component", type: i2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["contextMenuSelectionChange", "firstChange", "rowsChange", "totalRecordsChange", "selectionChange", "selectAllChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "onStateSave", "onStateRestore"] }, { kind: "component", type: i3.Tag, selector: "p-tag", inputs: ["severity", "value", "icon", "rounded"] }, { kind: "directive", type: i4.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
265
279
|
}
|
|
266
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
280
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: FileManagerListComponent, decorators: [{
|
|
267
281
|
type: Component,
|
|
268
282
|
args: [{
|
|
269
283
|
selector: 'lib-file-manager-list',
|
|
@@ -283,13 +297,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
283
297
|
</p>
|
|
284
298
|
}
|
|
285
299
|
</div>
|
|
286
|
-
<
|
|
300
|
+
<button
|
|
301
|
+
pButton
|
|
287
302
|
*hasPermission="FILE_PERMISSIONS.CREATE"
|
|
288
|
-
|
|
289
|
-
icon="pi pi-upload"
|
|
290
|
-
(onClick)="onUpload()"
|
|
303
|
+
(click)="onUpload()"
|
|
291
304
|
class="w-full sm:w-auto"
|
|
292
|
-
|
|
305
|
+
>
|
|
306
|
+
<span pButtonIcon class="pi pi-upload"></span>
|
|
307
|
+
<span pButtonLabel>{{ 'storage.button.upload.file' | translate }}</span>
|
|
308
|
+
</button>
|
|
293
309
|
</div>
|
|
294
310
|
|
|
295
311
|
<div class="overflow-x-auto">
|
|
@@ -367,48 +383,59 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
367
383
|
</td>
|
|
368
384
|
<td>
|
|
369
385
|
<div class="flex gap-1">
|
|
370
|
-
<
|
|
386
|
+
<button
|
|
387
|
+
pButton
|
|
371
388
|
*hasPermission="FILE_PERMISSIONS.READ"
|
|
372
|
-
icon="pi pi-eye"
|
|
373
389
|
[text]="true"
|
|
374
390
|
severity="secondary"
|
|
375
391
|
size="small"
|
|
376
|
-
[loading]="isViewing"
|
|
377
392
|
[disabled]="isViewing"
|
|
378
|
-
(
|
|
393
|
+
(click)="onView(file)"
|
|
379
394
|
[pTooltip]="'shared.view' | translate"
|
|
380
395
|
tooltipPosition="top"
|
|
381
|
-
|
|
382
|
-
|
|
396
|
+
>
|
|
397
|
+
@if (isViewing) {
|
|
398
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
399
|
+
} @else {
|
|
400
|
+
<span pButtonIcon class="pi pi-eye"></span>
|
|
401
|
+
}
|
|
402
|
+
</button>
|
|
403
|
+
<button
|
|
404
|
+
pButton
|
|
383
405
|
*hasPermission="FILE_PERMISSIONS.UPDATE"
|
|
384
|
-
icon="pi pi-pencil"
|
|
385
406
|
[text]="true"
|
|
386
407
|
severity="secondary"
|
|
387
408
|
size="small"
|
|
388
|
-
(
|
|
409
|
+
(click)="onEdit(file.id)"
|
|
389
410
|
[pTooltip]="'shared.edit' | translate"
|
|
390
411
|
tooltipPosition="top"
|
|
391
|
-
|
|
392
|
-
|
|
412
|
+
>
|
|
413
|
+
<span pButtonIcon class="pi pi-pencil"></span>
|
|
414
|
+
</button>
|
|
415
|
+
<button
|
|
416
|
+
pButton
|
|
393
417
|
*hasPermission="FILE_PERMISSIONS.DELETE"
|
|
394
|
-
icon="pi pi-trash"
|
|
395
418
|
[text]="true"
|
|
396
419
|
severity="warn"
|
|
397
420
|
size="small"
|
|
398
|
-
(
|
|
421
|
+
(click)="onSoftDelete(file)"
|
|
399
422
|
[pTooltip]="'storage.tooltip.trash' | translate"
|
|
400
423
|
tooltipPosition="top"
|
|
401
|
-
|
|
402
|
-
|
|
424
|
+
>
|
|
425
|
+
<span pButtonIcon class="pi pi-trash"></span>
|
|
426
|
+
</button>
|
|
427
|
+
<button
|
|
428
|
+
pButton
|
|
403
429
|
*hasPermission="FILE_PERMISSIONS.DELETE"
|
|
404
|
-
icon="pi pi-times-circle"
|
|
405
430
|
[text]="true"
|
|
406
431
|
severity="danger"
|
|
407
432
|
size="small"
|
|
408
|
-
(
|
|
433
|
+
(click)="onPermanentDelete(file)"
|
|
409
434
|
[pTooltip]="'shared.delete' | translate"
|
|
410
435
|
tooltipPosition="top"
|
|
411
|
-
|
|
436
|
+
>
|
|
437
|
+
<span pButtonIcon class="pi pi-times-circle"></span>
|
|
438
|
+
</button>
|
|
412
439
|
</div>
|
|
413
440
|
</td>
|
|
414
441
|
</tr>
|
|
@@ -432,4 +459,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
432
459
|
}] });
|
|
433
460
|
|
|
434
461
|
export { FileManagerListComponent };
|
|
435
|
-
//# sourceMappingURL=flusys-ng-storage-file-manager-list.component-
|
|
462
|
+
//# sourceMappingURL=flusys-ng-storage-file-manager-list.component-D_shqU2a.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusys-ng-storage-file-manager-list.component-D_shqU2a.mjs","sources":["../../../projects/ng-storage/pages/file-manager/file-manager-list.component.ts"],"sourcesContent":["import { Component, inject, signal } from '@angular/core';\nimport {\n AngularModule,\n FILE_PERMISSIONS,\n HasPermissionDirective,\n PrimeModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { firstValueFrom } from 'rxjs';\nimport { IFileManager } from '../../interfaces/file-manager.interface';\nimport { FileManagerApiService } from '../../services/file-manager-api.service';\nimport { BaseStorageListPage } from '../../utils/base-storage-page';\nimport {\n getFileIcon,\n getProviderLabelKey,\n getProviderSeverity,\n} from '../../utils/storage-utils';\n\n@Component({\n selector: 'lib-file-manager-list',\n imports: [AngularModule, PrimeModule, HasPermissionDirective, TranslatePipe],\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 <button\n pButton\n *hasPermission=\"FILE_PERMISSIONS.CREATE\"\n (click)=\"onUpload()\"\n class=\"w-full sm:w-auto\"\n >\n <span pButtonIcon class=\"pi pi-upload\"></span>\n <span pButtonLabel>{{ 'storage.button.upload.file' | translate }}</span>\n </button>\n </div>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"files()\"\n [loading]=\"isLoading()\"\n [paginator]=\"totalRecords() > 0\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n class=\"p-datatable-sm\"\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 <i [class]=\"getFileIcon(file.contentType)\"></i>\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 <p-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 <p-tag\n [value]=\"'storage.private' | translate\"\n severity=\"warn\"\n />\n } @else {\n <p-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 pButton\n *hasPermission=\"FILE_PERMISSIONS.READ\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [disabled]=\"isViewing\"\n (click)=\"onView(file)\"\n [pTooltip]=\"'shared.view' | translate\"\n tooltipPosition=\"top\"\n >\n @if (isViewing) {\n <span pButtonIcon class=\"pi pi-spinner pi-spin\"></span>\n } @else {\n <span pButtonIcon class=\"pi pi-eye\"></span>\n }\n </button>\n <button\n pButton\n *hasPermission=\"FILE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (click)=\"onEdit(file.id)\"\n [pTooltip]=\"'shared.edit' | translate\"\n tooltipPosition=\"top\"\n >\n <span pButtonIcon class=\"pi pi-pencil\"></span>\n </button>\n <button\n pButton\n *hasPermission=\"FILE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"warn\"\n size=\"small\"\n (click)=\"onSoftDelete(file)\"\n [pTooltip]=\"'storage.tooltip.trash' | translate\"\n tooltipPosition=\"top\"\n >\n <span pButtonIcon class=\"pi pi-trash\"></span>\n </button>\n <button\n pButton\n *hasPermission=\"FILE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (click)=\"onPermanentDelete(file)\"\n [pTooltip]=\"'shared.delete' | translate\"\n tooltipPosition=\"top\"\n >\n <span pButtonIcon class=\"pi pi-times-circle\"></span>\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 </p-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 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 this.isLoading.set(true);\n try {\n const response = await this.fileService.getAll({\n pagination: this.getPaginationParams(),\n filter: {},\n select: [],\n sort: {},\n });\n\n if (response.success) {\n this.items.set(response.data ?? []);\n this.total.set(response.meta?.total ?? 0);\n }\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onUpload(): void {\n this.navigateTo(['/storage/files/new']);\n }\n\n async onView(file: IFileManager): Promise<void> {\n this.viewingFileId.set(file.id);\n try {\n const response = await firstValueFrom(\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: 'pi pi-trash',\n acceptLabel: this.translateService.translate(\n 'storage.delete.move.to.trash',\n ),\n acceptButtonStyleClass: 'p-button-warning',\n accept: async () => {\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 },\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: 'pi pi-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 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 },\n });\n }\n}\n"],"names":[],"mappings":"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"}
|