@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.
Files changed (22) hide show
  1. package/fesm2022/{flusys-ng-storage-file-manager-form.component-DnE4Whts.mjs → flusys-ng-storage-file-manager-form.component-V-ZDWkKU.mjs} +135 -153
  2. package/fesm2022/flusys-ng-storage-file-manager-form.component-V-ZDWkKU.mjs.map +1 -0
  3. package/fesm2022/{flusys-ng-storage-file-manager-list.component-Go5Gqptd.mjs → flusys-ng-storage-file-manager-list.component-DqHH9lI0.mjs} +126 -97
  4. package/fesm2022/flusys-ng-storage-file-manager-list.component-DqHH9lI0.mjs.map +1 -0
  5. package/fesm2022/{flusys-ng-storage-folder-form.component-BYOD0A_5.mjs → flusys-ng-storage-folder-form.component-Up9luV7j.mjs} +51 -35
  6. package/fesm2022/flusys-ng-storage-folder-form.component-Up9luV7j.mjs.map +1 -0
  7. package/fesm2022/{flusys-ng-storage-folder-list.component-N6RjQQwv.mjs → flusys-ng-storage-folder-list.component-B52N1JaK.mjs} +60 -51
  8. package/fesm2022/flusys-ng-storage-folder-list.component-B52N1JaK.mjs.map +1 -0
  9. package/fesm2022/{flusys-ng-storage-storage-config-form.component-BdpCYR3c.mjs → flusys-ng-storage-storage-config-form.component-CEW5gpSt.mjs} +99 -87
  10. package/fesm2022/flusys-ng-storage-storage-config-form.component-CEW5gpSt.mjs.map +1 -0
  11. package/fesm2022/{flusys-ng-storage-storage-config-list.component-CtsIrKSq.mjs → flusys-ng-storage-storage-config-list.component-C-jaO7xD.mjs} +62 -54
  12. package/fesm2022/flusys-ng-storage-storage-config-list.component-C-jaO7xD.mjs.map +1 -0
  13. package/fesm2022/flusys-ng-storage.mjs +95 -94
  14. package/fesm2022/flusys-ng-storage.mjs.map +1 -1
  15. package/package.json +10 -11
  16. package/types/flusys-ng-storage.d.ts +5 -11
  17. package/fesm2022/flusys-ng-storage-file-manager-form.component-DnE4Whts.mjs.map +0 -1
  18. package/fesm2022/flusys-ng-storage-file-manager-list.component-Go5Gqptd.mjs.map +0 -1
  19. package/fesm2022/flusys-ng-storage-folder-form.component-BYOD0A_5.mjs.map +0 -1
  20. package/fesm2022/flusys-ng-storage-folder-list.component-N6RjQQwv.mjs.map +0 -1
  21. package/fesm2022/flusys-ng-storage-storage-config-form.component-BdpCYR3c.mjs.map +0 -1
  22. 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, PrimeModule, TranslatePipe } from '@flusys/ng-shared';
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, ...(ngDevMode ? [{ debugName: "isLoadingConfigs" }] : []));
24
- isLoadingFolders = signal(false, ...(ngDevMode ? [{ debugName: "isLoadingFolders" }] : []));
25
- existingFile = signal(null, ...(ngDevMode ? [{ debugName: "existingFile" }] : []));
26
- isEditMode = computed(() => !!this.existingFile(), ...(ngDevMode ? [{ debugName: "isEditMode" }] : []));
27
- selectedFile = signal(null, ...(ngDevMode ? [{ debugName: "selectedFile" }] : []));
28
- availableConfigs = signal([], ...(ngDevMode ? [{ debugName: "availableConfigs" }] : []));
29
- availableFolders = signal([], ...(ngDevMode ? [{ debugName: "availableFolders" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "formModel" }] : []));
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, ...(ngDevMode ? [{ debugName: "isFormValid" }] : []));
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: "21.1.5", ngImport: i0, type: FileManagerFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
199
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: FileManagerFormComponent, isStandalone: true, selector: "lib-file-manager-form", usesInheritance: true, ngImport: i0, template: `
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
- id="storageConfig"
228
- class="p-select-native w-full"
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
- <option value="">
232
- {{ 'storage.config.select.config' | translate }}
233
- </option>
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
- <i class="pi pi-exclamation-triangle mr-1"></i>
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
- id="folder"
258
- class="p-select-native w-full"
258
+ <f-select
259
+ inputId="folder"
260
+ [options]="availableFolders()"
261
+ optionLabel="name"
262
+ optionValue="id"
259
263
  [formField]="fileForm.folderId"
260
- >
261
- <option value="">
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
- <i class="pi pi-info-circle mr-1"></i>
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
- id="folder"
285
- class="p-select-native w-full"
281
+ <f-select
282
+ inputId="folder"
283
+ [options]="availableFolders()"
284
+ optionLabel="name"
285
+ optionValue="id"
286
286
  [formField]="fileForm.folderId"
287
- >
288
- <option value="">
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
- <i class="pi pi-info-circle mr-1"></i>
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
- <p-fileupload
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="pi pi-upload"
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
- <i
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
- <p-button
341
- icon="pi pi-times"
332
+ <button
333
+ fButton
342
334
  [text]="true"
343
335
  severity="danger"
344
336
  size="small"
345
- (onClick)="fileUpload.clear()"
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
- <i
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
- </p-fileupload>
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
- pInputText
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
- <label class="p-checkbox-native flex items-center gap-2">
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
- <p-button
418
- [label]="'shared.cancel' | translate"
406
+ <button
407
+ fButton
419
408
  severity="secondary"
420
409
  [outlined]="true"
421
- (onClick)="onCancel()"
422
- />
423
- <p-button
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.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: "component", type: i1$1.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i3.FileUpload, selector: "p-fileupload, 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", "ptInputText", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
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: "21.1.5", ngImport: i0, type: FileManagerFormComponent, decorators: [{
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, PrimeModule, FormField, TranslatePipe],
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
- id="storageConfig"
474
- class="p-select-native w-full"
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
- <option value="">
478
- {{ 'storage.config.select.config' | translate }}
479
- </option>
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
- <i class="pi pi-exclamation-triangle mr-1"></i>
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
- id="folder"
504
- class="p-select-native w-full"
491
+ <f-select
492
+ inputId="folder"
493
+ [options]="availableFolders()"
494
+ optionLabel="name"
495
+ optionValue="id"
505
496
  [formField]="fileForm.folderId"
506
- >
507
- <option value="">
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
- <i class="pi pi-info-circle mr-1"></i>
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
- id="folder"
531
- class="p-select-native w-full"
514
+ <f-select
515
+ inputId="folder"
516
+ [options]="availableFolders()"
517
+ optionLabel="name"
518
+ optionValue="id"
532
519
  [formField]="fileForm.folderId"
533
- >
534
- <option value="">
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
- <i class="pi pi-info-circle mr-1"></i>
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
- <p-fileupload
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="pi pi-upload"
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
- <i
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
- <p-button
587
- icon="pi pi-times"
565
+ <button
566
+ fButton
588
567
  [text]="true"
589
568
  severity="danger"
590
569
  size="small"
591
- (onClick)="fileUpload.clear()"
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
- <i
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
- </p-fileupload>
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
- pInputText
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
- <label class="p-checkbox-native flex items-center gap-2">
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
- <p-button
664
- [label]="'shared.cancel' | translate"
639
+ <button
640
+ fButton
665
641
  severity="secondary"
666
642
  [outlined]="true"
667
- (onClick)="onCancel()"
668
- />
669
- <p-button
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-DnE4Whts.mjs.map
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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"}