@flusys/ng-storage 5.4.1 → 6.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{flusys-ng-storage-file-manager-form.component-DnE4Whts.mjs → flusys-ng-storage-file-manager-form.component-V-ZDWkKU.mjs} +135 -153
- package/fesm2022/flusys-ng-storage-file-manager-form.component-V-ZDWkKU.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-file-manager-list.component-Go5Gqptd.mjs → flusys-ng-storage-file-manager-list.component-DqHH9lI0.mjs} +126 -97
- package/fesm2022/flusys-ng-storage-file-manager-list.component-DqHH9lI0.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-folder-form.component-BYOD0A_5.mjs → flusys-ng-storage-folder-form.component-Up9luV7j.mjs} +51 -35
- package/fesm2022/flusys-ng-storage-folder-form.component-Up9luV7j.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-folder-list.component-N6RjQQwv.mjs → flusys-ng-storage-folder-list.component-B52N1JaK.mjs} +60 -51
- package/fesm2022/flusys-ng-storage-folder-list.component-B52N1JaK.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-storage-config-form.component-BdpCYR3c.mjs → flusys-ng-storage-storage-config-form.component-CEW5gpSt.mjs} +99 -87
- package/fesm2022/flusys-ng-storage-storage-config-form.component-CEW5gpSt.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-storage-config-list.component-CtsIrKSq.mjs → flusys-ng-storage-storage-config-list.component-C-jaO7xD.mjs} +62 -54
- package/fesm2022/flusys-ng-storage-storage-config-list.component-C-jaO7xD.mjs.map +1 -0
- package/fesm2022/flusys-ng-storage.mjs +95 -94
- package/fesm2022/flusys-ng-storage.mjs.map +1 -1
- package/package.json +10 -11
- package/types/flusys-ng-storage.d.ts +5 -11
- 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-form.component-BdpCYR3c.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-storage-config-list.component-CtsIrKSq.mjs.map +0 -1
|
@@ -3,13 +3,12 @@ import { inject, signal, computed, effect, Component } from '@angular/core';
|
|
|
3
3
|
import { toSignal } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { form, required, FormField } from '@angular/forms/signals';
|
|
5
5
|
import { ActivatedRoute } from '@angular/router';
|
|
6
|
-
import { TranslateService, AngularModule,
|
|
6
|
+
import { TranslateService, AngularModule, TranslatePipe } from '@flusys/ng-shared';
|
|
7
7
|
import { firstValueFrom } from 'rxjs';
|
|
8
8
|
import { BaseStoragePage, FileManagerApiService, UploadService, StorageConfigApiService, FolderApiService, formatFileSize, getProviderLabelKey } from './flusys-ng-storage.mjs';
|
|
9
|
+
import * as i1$1 from '@flusys/ng-ui';
|
|
10
|
+
import { UiModule } from '@flusys/ng-ui';
|
|
9
11
|
import * as i1 from '@angular/forms';
|
|
10
|
-
import * as i1$1 from 'primeng/button';
|
|
11
|
-
import * as i3 from 'primeng/fileupload';
|
|
12
|
-
import * as i3$1 from 'primeng/inputtext';
|
|
13
12
|
|
|
14
13
|
class FileManagerFormComponent extends BaseStoragePage {
|
|
15
14
|
route = inject(ActivatedRoute);
|
|
@@ -20,13 +19,20 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
20
19
|
translateService = inject(TranslateService);
|
|
21
20
|
routeParams = toSignal(this.route.paramMap);
|
|
22
21
|
initialized = false;
|
|
23
|
-
isLoadingConfigs = signal(false,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
22
|
+
isLoadingConfigs = signal(false, /* @ts-ignore */
|
|
23
|
+
...(ngDevMode ? [{ debugName: "isLoadingConfigs" }] : /* istanbul ignore next */ []));
|
|
24
|
+
isLoadingFolders = signal(false, /* @ts-ignore */
|
|
25
|
+
...(ngDevMode ? [{ debugName: "isLoadingFolders" }] : /* istanbul ignore next */ []));
|
|
26
|
+
existingFile = signal(null, /* @ts-ignore */
|
|
27
|
+
...(ngDevMode ? [{ debugName: "existingFile" }] : /* istanbul ignore next */ []));
|
|
28
|
+
isEditMode = computed(() => !!this.existingFile(), /* @ts-ignore */
|
|
29
|
+
...(ngDevMode ? [{ debugName: "isEditMode" }] : /* istanbul ignore next */ []));
|
|
30
|
+
selectedFile = signal(null, /* @ts-ignore */
|
|
31
|
+
...(ngDevMode ? [{ debugName: "selectedFile" }] : /* istanbul ignore next */ []));
|
|
32
|
+
availableConfigs = signal([], /* @ts-ignore */
|
|
33
|
+
...(ngDevMode ? [{ debugName: "availableConfigs" }] : /* istanbul ignore next */ []));
|
|
34
|
+
availableFolders = signal([], /* @ts-ignore */
|
|
35
|
+
...(ngDevMode ? [{ debugName: "availableFolders" }] : /* istanbul ignore next */ []));
|
|
30
36
|
formatFileSize = formatFileSize;
|
|
31
37
|
getProviderLabelKey = getProviderLabelKey;
|
|
32
38
|
formModel = signal({
|
|
@@ -35,13 +41,15 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
35
41
|
isPrivate: false,
|
|
36
42
|
folderId: '',
|
|
37
43
|
storageConfigId: '',
|
|
38
|
-
},
|
|
44
|
+
}, /* @ts-ignore */
|
|
45
|
+
...(ngDevMode ? [{ debugName: "formModel" }] : /* istanbul ignore next */ []));
|
|
39
46
|
fileForm = form(this.formModel, (f) => {
|
|
40
47
|
required(f.name, {
|
|
41
48
|
message: this.translateService.translate('storage.validation.file.name.required'),
|
|
42
49
|
});
|
|
43
50
|
});
|
|
44
|
-
isFormValid = computed(() => this.formModel().name.trim().length > 0,
|
|
51
|
+
isFormValid = computed(() => this.formModel().name.trim().length > 0, /* @ts-ignore */
|
|
52
|
+
...(ngDevMode ? [{ debugName: "isFormValid" }] : /* istanbul ignore next */ []));
|
|
45
53
|
constructor() {
|
|
46
54
|
super();
|
|
47
55
|
effect(() => {
|
|
@@ -195,8 +203,8 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
195
203
|
onCancel() {
|
|
196
204
|
this.navigateTo(['/storage/files']);
|
|
197
205
|
}
|
|
198
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
199
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
206
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: FileManagerFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
207
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: FileManagerFormComponent, isStandalone: true, selector: "lib-file-manager-form", usesInheritance: true, ngImport: i0, template: `
|
|
200
208
|
<div class="card">
|
|
201
209
|
<div class="mb-4">
|
|
202
210
|
<h3 class="text-lg sm:text-xl font-semibold">
|
|
@@ -223,25 +231,19 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
223
231
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
224
232
|
>{{ 'storage.config.provider.required' | translate }}</label
|
|
225
233
|
>
|
|
226
|
-
<select
|
|
227
|
-
|
|
228
|
-
|
|
234
|
+
<f-select
|
|
235
|
+
inputId="storageConfig"
|
|
236
|
+
[options]="availableConfigs()"
|
|
237
|
+
optionValue="id"
|
|
229
238
|
[formField]="fileForm.storageConfigId"
|
|
239
|
+
[placeholder]="'storage.config.select.config' | translate"
|
|
230
240
|
>
|
|
231
|
-
<
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
@for (config of availableConfigs(); track config.id) {
|
|
235
|
-
<option [value]="config.id">
|
|
236
|
-
{{ config.name }} ({{
|
|
237
|
-
getProviderLabelKey(config.storage) | translate
|
|
238
|
-
}})
|
|
239
|
-
</option>
|
|
240
|
-
}
|
|
241
|
-
</select>
|
|
241
|
+
<ng-template #item let-config>{{ config.name }} ({{ getProviderLabelKey(config.storage) | translate }})</ng-template>
|
|
242
|
+
<ng-template #selectedItem let-config>{{ config.name }} ({{ getProviderLabelKey(config.storage) | translate }})</ng-template>
|
|
243
|
+
</f-select>
|
|
242
244
|
@if (availableConfigs().length === 0 && !isLoadingConfigs()) {
|
|
243
245
|
<small class="text-warn block mt-2">
|
|
244
|
-
<
|
|
246
|
+
<ui-icon name="exclamation-triangle" class="mr-1"></ui-icon>
|
|
245
247
|
{{ 'storage.config.no.configs' | translate }}
|
|
246
248
|
</small>
|
|
247
249
|
}
|
|
@@ -253,21 +255,17 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
253
255
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
254
256
|
>{{ 'storage.folder.optional' | translate }}</label
|
|
255
257
|
>
|
|
256
|
-
<select
|
|
257
|
-
|
|
258
|
-
|
|
258
|
+
<f-select
|
|
259
|
+
inputId="folder"
|
|
260
|
+
[options]="availableFolders()"
|
|
261
|
+
optionLabel="name"
|
|
262
|
+
optionValue="id"
|
|
259
263
|
[formField]="fileForm.folderId"
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
{{ 'storage.folder.no.folder' | translate }}
|
|
263
|
-
</option>
|
|
264
|
-
@for (folder of availableFolders(); track folder.id) {
|
|
265
|
-
<option [value]="folder.id">{{ folder.name }}</option>
|
|
266
|
-
}
|
|
267
|
-
</select>
|
|
264
|
+
[placeholder]="'storage.folder.no.folder' | translate"
|
|
265
|
+
/>
|
|
268
266
|
@if (availableFolders().length === 0 && !isLoadingFolders()) {
|
|
269
267
|
<small class="text-muted-color block mt-2">
|
|
270
|
-
<
|
|
268
|
+
<ui-icon name="info-circle" class="mr-1"></ui-icon>
|
|
271
269
|
{{ 'storage.folder.no.folders.available' | translate }}
|
|
272
270
|
</small>
|
|
273
271
|
}
|
|
@@ -280,21 +278,17 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
280
278
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
281
279
|
>{{ 'storage.folder.optional' | translate }}</label
|
|
282
280
|
>
|
|
283
|
-
<select
|
|
284
|
-
|
|
285
|
-
|
|
281
|
+
<f-select
|
|
282
|
+
inputId="folder"
|
|
283
|
+
[options]="availableFolders()"
|
|
284
|
+
optionLabel="name"
|
|
285
|
+
optionValue="id"
|
|
286
286
|
[formField]="fileForm.folderId"
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
{{ 'storage.folder.no.folder' | translate }}
|
|
290
|
-
</option>
|
|
291
|
-
@for (folder of availableFolders(); track folder.id) {
|
|
292
|
-
<option [value]="folder.id">{{ folder.name }}</option>
|
|
293
|
-
}
|
|
294
|
-
</select>
|
|
287
|
+
[placeholder]="'storage.folder.no.folder' | translate"
|
|
288
|
+
/>
|
|
295
289
|
@if (availableFolders().length === 0 && !isLoadingFolders()) {
|
|
296
290
|
<small class="text-muted-color block mt-2">
|
|
297
|
-
<
|
|
291
|
+
<ui-icon name="info-circle" class="mr-1"></ui-icon>
|
|
298
292
|
{{ 'storage.folder.no.folders.edit' | translate }}
|
|
299
293
|
</small>
|
|
300
294
|
}
|
|
@@ -306,7 +300,7 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
306
300
|
<label class="block font-medium mb-2 text-sm sm:text-base">{{
|
|
307
301
|
'storage.file.select.required' | translate
|
|
308
302
|
}}</label>
|
|
309
|
-
<
|
|
303
|
+
<f-fileupload
|
|
310
304
|
#fileUpload
|
|
311
305
|
[customUpload]="true"
|
|
312
306
|
(onSelect)="onFileSelect($event)"
|
|
@@ -315,7 +309,7 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
315
309
|
[showUploadButton]="false"
|
|
316
310
|
[showCancelButton]="false"
|
|
317
311
|
[chooseLabel]="'storage.button.choose.file' | translate"
|
|
318
|
-
chooseIcon="
|
|
312
|
+
chooseIcon="upload"
|
|
319
313
|
accept="*/*"
|
|
320
314
|
class="w-full"
|
|
321
315
|
>
|
|
@@ -326,9 +320,7 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
326
320
|
<div
|
|
327
321
|
class="flex items-center gap-3 p-3 border border-surface rounded-lg bg-surface-ground"
|
|
328
322
|
>
|
|
329
|
-
<
|
|
330
|
-
class="pi pi-file text-xl sm:text-2xl text-primary"
|
|
331
|
-
></i>
|
|
323
|
+
<ui-icon name="file" class="text-xl sm:text-2xl text-primary"></ui-icon>
|
|
332
324
|
<div class="flex-1 min-w-0">
|
|
333
325
|
<div class="font-medium truncate">
|
|
334
326
|
{{ file.name }}
|
|
@@ -337,13 +329,15 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
337
329
|
{{ formatFileSize(file.size) }}
|
|
338
330
|
</div>
|
|
339
331
|
</div>
|
|
340
|
-
<
|
|
341
|
-
|
|
332
|
+
<button
|
|
333
|
+
fButton
|
|
342
334
|
[text]="true"
|
|
343
335
|
severity="danger"
|
|
344
336
|
size="small"
|
|
345
|
-
(
|
|
346
|
-
|
|
337
|
+
(click)="fileUpload.clear()"
|
|
338
|
+
>
|
|
339
|
+
<ui-icon pButtonIcon name="times"></ui-icon>
|
|
340
|
+
</button>
|
|
347
341
|
</div>
|
|
348
342
|
}
|
|
349
343
|
</div>
|
|
@@ -351,9 +345,7 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
351
345
|
<div
|
|
352
346
|
class="flex items-center justify-center flex-col p-6 sm:p-8 border-2 border-dashed border-surface rounded-lg"
|
|
353
347
|
>
|
|
354
|
-
<
|
|
355
|
-
class="pi pi-cloud-upload text-3xl sm:text-4xl text-muted-color mb-3"
|
|
356
|
-
></i>
|
|
348
|
+
<ui-icon name="cloud-upload" class="text-3xl sm:text-4xl text-muted-color mb-3"></ui-icon>
|
|
357
349
|
<p
|
|
358
350
|
class="text-muted-color text-center text-sm sm:text-base"
|
|
359
351
|
>
|
|
@@ -367,7 +359,7 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
367
359
|
</div>
|
|
368
360
|
}
|
|
369
361
|
</ng-template>
|
|
370
|
-
</
|
|
362
|
+
</f-fileupload>
|
|
371
363
|
@if (!selectedFile() && !isEditMode()) {
|
|
372
364
|
<small class="text-muted-color">{{
|
|
373
365
|
'storage.upload.please.select' | translate
|
|
@@ -384,7 +376,7 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
384
376
|
>{{ 'storage.file.name.required' | translate }}</label
|
|
385
377
|
>
|
|
386
378
|
<input
|
|
387
|
-
|
|
379
|
+
fInputText
|
|
388
380
|
id="name"
|
|
389
381
|
[formField]="fileForm.name"
|
|
390
382
|
[placeholder]="
|
|
@@ -398,10 +390,7 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
398
390
|
</div>
|
|
399
391
|
|
|
400
392
|
<div class="field">
|
|
401
|
-
<
|
|
402
|
-
<input type="checkbox" [formField]="fileForm.isPrivate" />
|
|
403
|
-
<span>{{ 'storage.file.private' | translate }}</span>
|
|
404
|
-
</label>
|
|
393
|
+
<f-checkbox [formField]="fileForm.isPrivate" [label]="'storage.file.private' | translate" />
|
|
405
394
|
<small class="text-muted-color block mt-2">
|
|
406
395
|
{{
|
|
407
396
|
(formModel().isPrivate
|
|
@@ -414,34 +403,40 @@ class FileManagerFormComponent extends BaseStoragePage {
|
|
|
414
403
|
</div>
|
|
415
404
|
|
|
416
405
|
<div class="flex justify-end gap-2 mt-4">
|
|
417
|
-
<
|
|
418
|
-
|
|
406
|
+
<button
|
|
407
|
+
fButton
|
|
419
408
|
severity="secondary"
|
|
420
409
|
[outlined]="true"
|
|
421
|
-
(
|
|
422
|
-
|
|
423
|
-
|
|
410
|
+
(click)="onCancel()"
|
|
411
|
+
>
|
|
412
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
413
|
+
</button>
|
|
414
|
+
<button
|
|
415
|
+
fButton
|
|
424
416
|
type="submit"
|
|
425
|
-
[label]="
|
|
426
|
-
(isEditMode() ? 'shared.update' : 'shared.upload') | translate
|
|
427
|
-
"
|
|
428
|
-
[loading]="isLoading()"
|
|
429
417
|
[disabled]="
|
|
430
418
|
!isFormValid() ||
|
|
431
419
|
(!isEditMode() && !selectedFile()) ||
|
|
432
420
|
isLoading()
|
|
433
421
|
"
|
|
434
|
-
|
|
422
|
+
>
|
|
423
|
+
@if (isLoading()) {
|
|
424
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
425
|
+
}
|
|
426
|
+
<span pButtonLabel>{{
|
|
427
|
+
(isEditMode() ? 'shared.update' : 'shared.upload') | translate
|
|
428
|
+
}}</span>
|
|
429
|
+
</button>
|
|
435
430
|
</div>
|
|
436
431
|
</form>
|
|
437
432
|
</div>
|
|
438
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.
|
|
433
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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: UiModule }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "rounded", "raised", "fluid", "disabled", "loading", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1$1.CheckboxComponent, selector: "f-checkbox", inputs: ["label", "binary", "disabled", "inputId", "invalid", "indeterminate", "touched", "styleClass", "checked"], outputs: ["onChange", "onBlur", "touch", "checkedChange"] }, { kind: "component", type: i1$1.FileUploadComponent, selector: "f-fileupload", inputs: ["name", "accept", "multiple", "auto", "maxFileSize", "fileLimit", "disabled", "url", "customUpload", "showUploadButton", "showCancelButton", "chooseLabel", "chooseIcon", "styleClass", "mode"], outputs: ["onSelect", "onRemove", "onClear", "onError"] }, { kind: "directive", type: i1$1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched"] }, { kind: "component", type: i1$1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "showClear", "loading", "inputId", "invalid", "touched", "styleClass", "editable"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
439
434
|
}
|
|
440
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
435
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: FileManagerFormComponent, decorators: [{
|
|
441
436
|
type: Component,
|
|
442
437
|
args: [{
|
|
443
438
|
selector: 'lib-file-manager-form',
|
|
444
|
-
imports: [AngularModule,
|
|
439
|
+
imports: [AngularModule, UiModule, FormField, TranslatePipe],
|
|
445
440
|
template: `
|
|
446
441
|
<div class="card">
|
|
447
442
|
<div class="mb-4">
|
|
@@ -469,25 +464,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
469
464
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
470
465
|
>{{ 'storage.config.provider.required' | translate }}</label
|
|
471
466
|
>
|
|
472
|
-
<select
|
|
473
|
-
|
|
474
|
-
|
|
467
|
+
<f-select
|
|
468
|
+
inputId="storageConfig"
|
|
469
|
+
[options]="availableConfigs()"
|
|
470
|
+
optionValue="id"
|
|
475
471
|
[formField]="fileForm.storageConfigId"
|
|
472
|
+
[placeholder]="'storage.config.select.config' | translate"
|
|
476
473
|
>
|
|
477
|
-
<
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
@for (config of availableConfigs(); track config.id) {
|
|
481
|
-
<option [value]="config.id">
|
|
482
|
-
{{ config.name }} ({{
|
|
483
|
-
getProviderLabelKey(config.storage) | translate
|
|
484
|
-
}})
|
|
485
|
-
</option>
|
|
486
|
-
}
|
|
487
|
-
</select>
|
|
474
|
+
<ng-template #item let-config>{{ config.name }} ({{ getProviderLabelKey(config.storage) | translate }})</ng-template>
|
|
475
|
+
<ng-template #selectedItem let-config>{{ config.name }} ({{ getProviderLabelKey(config.storage) | translate }})</ng-template>
|
|
476
|
+
</f-select>
|
|
488
477
|
@if (availableConfigs().length === 0 && !isLoadingConfigs()) {
|
|
489
478
|
<small class="text-warn block mt-2">
|
|
490
|
-
<
|
|
479
|
+
<ui-icon name="exclamation-triangle" class="mr-1"></ui-icon>
|
|
491
480
|
{{ 'storage.config.no.configs' | translate }}
|
|
492
481
|
</small>
|
|
493
482
|
}
|
|
@@ -499,21 +488,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
499
488
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
500
489
|
>{{ 'storage.folder.optional' | translate }}</label
|
|
501
490
|
>
|
|
502
|
-
<select
|
|
503
|
-
|
|
504
|
-
|
|
491
|
+
<f-select
|
|
492
|
+
inputId="folder"
|
|
493
|
+
[options]="availableFolders()"
|
|
494
|
+
optionLabel="name"
|
|
495
|
+
optionValue="id"
|
|
505
496
|
[formField]="fileForm.folderId"
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
{{ 'storage.folder.no.folder' | translate }}
|
|
509
|
-
</option>
|
|
510
|
-
@for (folder of availableFolders(); track folder.id) {
|
|
511
|
-
<option [value]="folder.id">{{ folder.name }}</option>
|
|
512
|
-
}
|
|
513
|
-
</select>
|
|
497
|
+
[placeholder]="'storage.folder.no.folder' | translate"
|
|
498
|
+
/>
|
|
514
499
|
@if (availableFolders().length === 0 && !isLoadingFolders()) {
|
|
515
500
|
<small class="text-muted-color block mt-2">
|
|
516
|
-
<
|
|
501
|
+
<ui-icon name="info-circle" class="mr-1"></ui-icon>
|
|
517
502
|
{{ 'storage.folder.no.folders.available' | translate }}
|
|
518
503
|
</small>
|
|
519
504
|
}
|
|
@@ -526,21 +511,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
526
511
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
527
512
|
>{{ 'storage.folder.optional' | translate }}</label
|
|
528
513
|
>
|
|
529
|
-
<select
|
|
530
|
-
|
|
531
|
-
|
|
514
|
+
<f-select
|
|
515
|
+
inputId="folder"
|
|
516
|
+
[options]="availableFolders()"
|
|
517
|
+
optionLabel="name"
|
|
518
|
+
optionValue="id"
|
|
532
519
|
[formField]="fileForm.folderId"
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
{{ 'storage.folder.no.folder' | translate }}
|
|
536
|
-
</option>
|
|
537
|
-
@for (folder of availableFolders(); track folder.id) {
|
|
538
|
-
<option [value]="folder.id">{{ folder.name }}</option>
|
|
539
|
-
}
|
|
540
|
-
</select>
|
|
520
|
+
[placeholder]="'storage.folder.no.folder' | translate"
|
|
521
|
+
/>
|
|
541
522
|
@if (availableFolders().length === 0 && !isLoadingFolders()) {
|
|
542
523
|
<small class="text-muted-color block mt-2">
|
|
543
|
-
<
|
|
524
|
+
<ui-icon name="info-circle" class="mr-1"></ui-icon>
|
|
544
525
|
{{ 'storage.folder.no.folders.edit' | translate }}
|
|
545
526
|
</small>
|
|
546
527
|
}
|
|
@@ -552,7 +533,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
552
533
|
<label class="block font-medium mb-2 text-sm sm:text-base">{{
|
|
553
534
|
'storage.file.select.required' | translate
|
|
554
535
|
}}</label>
|
|
555
|
-
<
|
|
536
|
+
<f-fileupload
|
|
556
537
|
#fileUpload
|
|
557
538
|
[customUpload]="true"
|
|
558
539
|
(onSelect)="onFileSelect($event)"
|
|
@@ -561,7 +542,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
561
542
|
[showUploadButton]="false"
|
|
562
543
|
[showCancelButton]="false"
|
|
563
544
|
[chooseLabel]="'storage.button.choose.file' | translate"
|
|
564
|
-
chooseIcon="
|
|
545
|
+
chooseIcon="upload"
|
|
565
546
|
accept="*/*"
|
|
566
547
|
class="w-full"
|
|
567
548
|
>
|
|
@@ -572,9 +553,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
572
553
|
<div
|
|
573
554
|
class="flex items-center gap-3 p-3 border border-surface rounded-lg bg-surface-ground"
|
|
574
555
|
>
|
|
575
|
-
<
|
|
576
|
-
class="pi pi-file text-xl sm:text-2xl text-primary"
|
|
577
|
-
></i>
|
|
556
|
+
<ui-icon name="file" class="text-xl sm:text-2xl text-primary"></ui-icon>
|
|
578
557
|
<div class="flex-1 min-w-0">
|
|
579
558
|
<div class="font-medium truncate">
|
|
580
559
|
{{ file.name }}
|
|
@@ -583,13 +562,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
583
562
|
{{ formatFileSize(file.size) }}
|
|
584
563
|
</div>
|
|
585
564
|
</div>
|
|
586
|
-
<
|
|
587
|
-
|
|
565
|
+
<button
|
|
566
|
+
fButton
|
|
588
567
|
[text]="true"
|
|
589
568
|
severity="danger"
|
|
590
569
|
size="small"
|
|
591
|
-
(
|
|
592
|
-
|
|
570
|
+
(click)="fileUpload.clear()"
|
|
571
|
+
>
|
|
572
|
+
<ui-icon pButtonIcon name="times"></ui-icon>
|
|
573
|
+
</button>
|
|
593
574
|
</div>
|
|
594
575
|
}
|
|
595
576
|
</div>
|
|
@@ -597,9 +578,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
597
578
|
<div
|
|
598
579
|
class="flex items-center justify-center flex-col p-6 sm:p-8 border-2 border-dashed border-surface rounded-lg"
|
|
599
580
|
>
|
|
600
|
-
<
|
|
601
|
-
class="pi pi-cloud-upload text-3xl sm:text-4xl text-muted-color mb-3"
|
|
602
|
-
></i>
|
|
581
|
+
<ui-icon name="cloud-upload" class="text-3xl sm:text-4xl text-muted-color mb-3"></ui-icon>
|
|
603
582
|
<p
|
|
604
583
|
class="text-muted-color text-center text-sm sm:text-base"
|
|
605
584
|
>
|
|
@@ -613,7 +592,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
613
592
|
</div>
|
|
614
593
|
}
|
|
615
594
|
</ng-template>
|
|
616
|
-
</
|
|
595
|
+
</f-fileupload>
|
|
617
596
|
@if (!selectedFile() && !isEditMode()) {
|
|
618
597
|
<small class="text-muted-color">{{
|
|
619
598
|
'storage.upload.please.select' | translate
|
|
@@ -630,7 +609,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
630
609
|
>{{ 'storage.file.name.required' | translate }}</label
|
|
631
610
|
>
|
|
632
611
|
<input
|
|
633
|
-
|
|
612
|
+
fInputText
|
|
634
613
|
id="name"
|
|
635
614
|
[formField]="fileForm.name"
|
|
636
615
|
[placeholder]="
|
|
@@ -644,10 +623,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
644
623
|
</div>
|
|
645
624
|
|
|
646
625
|
<div class="field">
|
|
647
|
-
<
|
|
648
|
-
<input type="checkbox" [formField]="fileForm.isPrivate" />
|
|
649
|
-
<span>{{ 'storage.file.private' | translate }}</span>
|
|
650
|
-
</label>
|
|
626
|
+
<f-checkbox [formField]="fileForm.isPrivate" [label]="'storage.file.private' | translate" />
|
|
651
627
|
<small class="text-muted-color block mt-2">
|
|
652
628
|
{{
|
|
653
629
|
(formModel().isPrivate
|
|
@@ -660,24 +636,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
660
636
|
</div>
|
|
661
637
|
|
|
662
638
|
<div class="flex justify-end gap-2 mt-4">
|
|
663
|
-
<
|
|
664
|
-
|
|
639
|
+
<button
|
|
640
|
+
fButton
|
|
665
641
|
severity="secondary"
|
|
666
642
|
[outlined]="true"
|
|
667
|
-
(
|
|
668
|
-
|
|
669
|
-
|
|
643
|
+
(click)="onCancel()"
|
|
644
|
+
>
|
|
645
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
646
|
+
</button>
|
|
647
|
+
<button
|
|
648
|
+
fButton
|
|
670
649
|
type="submit"
|
|
671
|
-
[label]="
|
|
672
|
-
(isEditMode() ? 'shared.update' : 'shared.upload') | translate
|
|
673
|
-
"
|
|
674
|
-
[loading]="isLoading()"
|
|
675
650
|
[disabled]="
|
|
676
651
|
!isFormValid() ||
|
|
677
652
|
(!isEditMode() && !selectedFile()) ||
|
|
678
653
|
isLoading()
|
|
679
654
|
"
|
|
680
|
-
|
|
655
|
+
>
|
|
656
|
+
@if (isLoading()) {
|
|
657
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
658
|
+
}
|
|
659
|
+
<span pButtonLabel>{{
|
|
660
|
+
(isEditMode() ? 'shared.update' : 'shared.upload') | translate
|
|
661
|
+
}}</span>
|
|
662
|
+
</button>
|
|
681
663
|
</div>
|
|
682
664
|
</form>
|
|
683
665
|
</div>
|
|
@@ -686,4 +668,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
686
668
|
}], ctorParameters: () => [] });
|
|
687
669
|
|
|
688
670
|
export { FileManagerFormComponent };
|
|
689
|
-
//# sourceMappingURL=flusys-ng-storage-file-manager-form.component-
|
|
671
|
+
//# sourceMappingURL=flusys-ng-storage-file-manager-form.component-V-ZDWkKU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusys-ng-storage-file-manager-form.component-V-ZDWkKU.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 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 { FileSelectEvent, UiModule } 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: [AngularModule, UiModule, 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 <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 #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=\"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 <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 [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (click)=\"fileUpload.clear()\"\n >\n <ui-icon pButtonIcon 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 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 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"],"mappings":"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"}
|