@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
@@ -1,20 +1,19 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, signal, Component } from '@angular/core';
3
- import { FILE_PERMISSIONS, TranslateService, AngularModule, PrimeModule, HasPermissionDirective, TranslatePipe } from '@flusys/ng-shared';
3
+ import { FILE_PERMISSIONS, TranslateService, AngularModule, HasPermissionDirective, TranslatePipe } from '@flusys/ng-shared';
4
+ import * as i1 from '@flusys/ng-ui';
5
+ import { UiModule } from '@flusys/ng-ui';
4
6
  import { firstValueFrom } from 'rxjs';
5
7
  import { BaseStorageListPage, FileManagerApiService, getFileIcon, getProviderLabelKey, getProviderSeverity } from './flusys-ng-storage.mjs';
6
- import * as i1 from 'primeng/button';
7
- import * as i2 from 'primeng/table';
8
- import * as i3 from 'primeng/tag';
9
- import * as i4 from 'primeng/tooltip';
10
- import * as i5 from '@angular/common';
8
+ import * as i2 from '@angular/common';
11
9
 
12
10
  class FileManagerListComponent extends BaseStorageListPage {
13
11
  FILE_PERMISSIONS = FILE_PERMISSIONS;
14
12
  fileService = inject(FileManagerApiService);
15
13
  translateService = inject(TranslateService);
16
14
  files = this.items;
17
- viewingFileId = signal(null, ...(ngDevMode ? [{ debugName: "viewingFileId" }] : []));
15
+ viewingFileId = signal(null, /* @ts-ignore */
16
+ ...(ngDevMode ? [{ debugName: "viewingFileId" }] : /* istanbul ignore next */ []));
18
17
  getFileIcon = getFileIcon;
19
18
  getProviderLabelKey = getProviderLabelKey;
20
19
  getProviderSeverity = getProviderSeverity;
@@ -66,18 +65,21 @@ class FileManagerListComponent extends BaseStorageListPage {
66
65
  this.confirmationService.confirm({
67
66
  message: this.translateService.translate('storage.delete.move.to.trash.confirm', { name: file.name }),
68
67
  header: this.translateService.translate('storage.delete.move.to.trash'),
69
- icon: 'pi pi-trash',
68
+ icon: 'trash',
70
69
  acceptLabel: this.translateService.translate('storage.delete.move.to.trash'),
71
70
  acceptButtonStyleClass: 'p-button-warning',
72
71
  accept: async () => {
73
- const response = await this.fileService.delete({
74
- id: file.id,
75
- type: 'delete',
76
- });
77
- this.showSuccess(response?.messageKey
78
- ? this.translateService.translate(response.messageKey, response.messageVariables)
79
- : (response?.message ?? ''));
80
- this.loadData();
72
+ try {
73
+ const response = await this.fileService.delete({
74
+ id: file.id,
75
+ type: 'delete',
76
+ });
77
+ this.showSuccess(response?.messageKey
78
+ ? this.translateService.translate(response.messageKey, response.messageVariables)
79
+ : (response?.message ?? ''));
80
+ this.loadData();
81
+ }
82
+ catch { }
81
83
  },
82
84
  });
83
85
  }
@@ -85,24 +87,27 @@ class FileManagerListComponent extends BaseStorageListPage {
85
87
  this.confirmationService.confirm({
86
88
  message: this.translateService.translate('storage.delete.permanent.delete.confirm', { name: file.name }),
87
89
  header: this.translateService.translate('storage.delete.permanent.delete'),
88
- icon: 'pi pi-exclamation-triangle',
90
+ icon: 'exclamation-triangle',
89
91
  acceptLabel: this.translateService.translate('storage.delete.permanent.delete.button'),
90
92
  rejectLabel: this.translateService.translate('shared.cancel'),
91
93
  acceptButtonStyleClass: 'p-button-danger',
92
94
  accept: async () => {
93
- const response = await this.fileService.delete({
94
- id: file.id,
95
- type: 'permanent',
96
- });
97
- this.showSuccess(response?.messageKey
98
- ? this.translateService.translate(response.messageKey, response.messageVariables)
99
- : (response?.message ?? ''));
100
- this.loadData();
95
+ try {
96
+ const response = await this.fileService.delete({
97
+ id: file.id,
98
+ type: 'permanent',
99
+ });
100
+ this.showSuccess(response?.messageKey
101
+ ? this.translateService.translate(response.messageKey, response.messageVariables)
102
+ : (response?.message ?? ''));
103
+ this.loadData();
104
+ }
105
+ catch { }
101
106
  },
102
107
  });
103
108
  }
104
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: FileManagerListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
105
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: FileManagerListComponent, isStandalone: true, selector: "lib-file-manager-list", usesInheritance: true, ngImport: i0, template: `
109
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: FileManagerListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
110
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: FileManagerListComponent, isStandalone: true, selector: "lib-file-manager-list", usesInheritance: true, ngImport: i0, template: `
106
111
  <div class="card">
107
112
  <div
108
113
  class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4"
@@ -117,17 +122,19 @@ class FileManagerListComponent extends BaseStorageListPage {
117
122
  </p>
118
123
  }
119
124
  </div>
120
- <p-button
125
+ <button
126
+ fButton
121
127
  *hasPermission="FILE_PERMISSIONS.CREATE"
122
- [label]="'storage.button.upload.file' | translate"
123
- icon="pi pi-upload"
124
- (onClick)="onUpload()"
128
+ (click)="onUpload()"
125
129
  class="w-full sm:w-auto"
126
- />
130
+ >
131
+ <ui-icon pButtonIcon name="upload"></ui-icon>
132
+ <span pButtonLabel>{{ 'storage.button.upload.file' | translate }}</span>
133
+ </button>
127
134
  </div>
128
135
 
129
136
  <div class="overflow-x-auto">
130
- <p-table
137
+ <f-table
131
138
  [value]="files()"
132
139
  [loading]="isLoading()"
133
140
  [paginator]="totalRecords() > 0"
@@ -137,7 +144,6 @@ class FileManagerListComponent extends BaseStorageListPage {
137
144
  (onLazyLoad)="onPageChange($event)"
138
145
  [rowsPerPageOptions]="[10, 25, 50]"
139
146
  [scrollable]="true"
140
- class="p-datatable-sm"
141
147
  >
142
148
  <ng-template #header>
143
149
  <tr>
@@ -162,7 +168,7 @@ class FileManagerListComponent extends BaseStorageListPage {
162
168
  <tr>
163
169
  <td>
164
170
  <div class="flex items-center gap-2">
165
- <i [class]="getFileIcon(file.contentType)"></i>
171
+ <ui-icon [name]="getFileIcon(file.contentType)"></ui-icon>
166
172
  <span class="truncate max-w-32 sm:max-w-none">{{
167
173
  file.name
168
174
  }}</span>
@@ -175,7 +181,7 @@ class FileManagerListComponent extends BaseStorageListPage {
175
181
  </td>
176
182
  <td>{{ file.size }} {{ 'shared.size.kb' | translate }}</td>
177
183
  <td>
178
- <p-tag
184
+ <f-tag
179
185
  [value]="getProviderLabelKey(file.location) | translate"
180
186
  [severity]="getProviderSeverity(file.location)"
181
187
  />
@@ -185,12 +191,12 @@ class FileManagerListComponent extends BaseStorageListPage {
185
191
  </td>
186
192
  <td>
187
193
  @if (file.isPrivate) {
188
- <p-tag
194
+ <f-tag
189
195
  [value]="'storage.private' | translate"
190
196
  severity="warn"
191
197
  />
192
198
  } @else {
193
- <p-tag
199
+ <f-tag
194
200
  [value]="'storage.public' | translate"
195
201
  severity="success"
196
202
  />
@@ -201,48 +207,59 @@ class FileManagerListComponent extends BaseStorageListPage {
201
207
  </td>
202
208
  <td>
203
209
  <div class="flex gap-1">
204
- <p-button
210
+ <button
211
+ fButton
205
212
  *hasPermission="FILE_PERMISSIONS.READ"
206
- icon="pi pi-eye"
207
213
  [text]="true"
208
214
  severity="secondary"
209
215
  size="small"
210
- [loading]="isViewing"
211
216
  [disabled]="isViewing"
212
- (onClick)="onView(file)"
213
- [pTooltip]="'shared.view' | translate"
217
+ (click)="onView(file)"
218
+ [fTooltip]="'shared.view' | translate"
214
219
  tooltipPosition="top"
215
- />
216
- <p-button
220
+ >
221
+ @if (isViewing) {
222
+ <ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
223
+ } @else {
224
+ <ui-icon pButtonIcon name="eye"></ui-icon>
225
+ }
226
+ </button>
227
+ <button
228
+ fButton
217
229
  *hasPermission="FILE_PERMISSIONS.UPDATE"
218
- icon="pi pi-pencil"
219
230
  [text]="true"
220
231
  severity="secondary"
221
232
  size="small"
222
- (onClick)="onEdit(file.id)"
223
- [pTooltip]="'shared.edit' | translate"
233
+ (click)="onEdit(file.id)"
234
+ [fTooltip]="'shared.edit' | translate"
224
235
  tooltipPosition="top"
225
- />
226
- <p-button
236
+ >
237
+ <ui-icon pButtonIcon name="pencil"></ui-icon>
238
+ </button>
239
+ <button
240
+ fButton
227
241
  *hasPermission="FILE_PERMISSIONS.DELETE"
228
- icon="pi pi-trash"
229
242
  [text]="true"
230
243
  severity="warn"
231
244
  size="small"
232
- (onClick)="onSoftDelete(file)"
233
- [pTooltip]="'storage.tooltip.trash' | translate"
245
+ (click)="onSoftDelete(file)"
246
+ [fTooltip]="'storage.tooltip.trash' | translate"
234
247
  tooltipPosition="top"
235
- />
236
- <p-button
248
+ >
249
+ <ui-icon pButtonIcon name="trash"></ui-icon>
250
+ </button>
251
+ <button
252
+ fButton
237
253
  *hasPermission="FILE_PERMISSIONS.DELETE"
238
- icon="pi pi-times-circle"
239
254
  [text]="true"
240
255
  severity="danger"
241
256
  size="small"
242
- (onClick)="onPermanentDelete(file)"
243
- [pTooltip]="'shared.delete' | translate"
257
+ (click)="onPermanentDelete(file)"
258
+ [fTooltip]="'shared.delete' | translate"
244
259
  tooltipPosition="top"
245
- />
260
+ >
261
+ <ui-icon pButtonIcon name="times-circle"></ui-icon>
262
+ </button>
246
263
  </div>
247
264
  </td>
248
265
  </tr>
@@ -258,16 +275,16 @@ class FileManagerListComponent extends BaseStorageListPage {
258
275
  </td>
259
276
  </tr>
260
277
  </ng-template>
261
- </p-table>
278
+ </f-table>
262
279
  </div>
263
280
  </div>
264
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "ngmodule", type: PrimeModule }, { kind: "component", type: i1.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: i2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "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", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "component", type: i3.Tag, selector: "p-tag", inputs: ["styleClass", "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", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "pipe", type: i5.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
281
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "rounded", "raised", "fluid", "disabled", "loading", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1.TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color"] }, { kind: "component", type: i1.TableComponent, selector: "f-table", inputs: ["value", "lazy", "loading", "rows", "totalRecords", "rowHover", "dataKey", "scrollable", "paginator", "first", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "tableStyle", "styleClass", "globalFilterFields", "sortField", "sortOrder"], outputs: ["sortFieldChange", "sortOrderChange", "onLazyLoad", "onSort"] }, { kind: "directive", type: i1.TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay"] }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: HasPermissionDirective, selector: "[hasPermission]", inputs: ["hasPermission"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
265
282
  }
266
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: FileManagerListComponent, decorators: [{
283
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: FileManagerListComponent, decorators: [{
267
284
  type: Component,
268
285
  args: [{
269
286
  selector: 'lib-file-manager-list',
270
- imports: [AngularModule, PrimeModule, HasPermissionDirective, TranslatePipe],
287
+ imports: [UiModule, AngularModule, HasPermissionDirective, TranslatePipe],
271
288
  template: `
272
289
  <div class="card">
273
290
  <div
@@ -283,17 +300,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
283
300
  </p>
284
301
  }
285
302
  </div>
286
- <p-button
303
+ <button
304
+ fButton
287
305
  *hasPermission="FILE_PERMISSIONS.CREATE"
288
- [label]="'storage.button.upload.file' | translate"
289
- icon="pi pi-upload"
290
- (onClick)="onUpload()"
306
+ (click)="onUpload()"
291
307
  class="w-full sm:w-auto"
292
- />
308
+ >
309
+ <ui-icon pButtonIcon name="upload"></ui-icon>
310
+ <span pButtonLabel>{{ 'storage.button.upload.file' | translate }}</span>
311
+ </button>
293
312
  </div>
294
313
 
295
314
  <div class="overflow-x-auto">
296
- <p-table
315
+ <f-table
297
316
  [value]="files()"
298
317
  [loading]="isLoading()"
299
318
  [paginator]="totalRecords() > 0"
@@ -303,7 +322,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
303
322
  (onLazyLoad)="onPageChange($event)"
304
323
  [rowsPerPageOptions]="[10, 25, 50]"
305
324
  [scrollable]="true"
306
- class="p-datatable-sm"
307
325
  >
308
326
  <ng-template #header>
309
327
  <tr>
@@ -328,7 +346,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
328
346
  <tr>
329
347
  <td>
330
348
  <div class="flex items-center gap-2">
331
- <i [class]="getFileIcon(file.contentType)"></i>
349
+ <ui-icon [name]="getFileIcon(file.contentType)"></ui-icon>
332
350
  <span class="truncate max-w-32 sm:max-w-none">{{
333
351
  file.name
334
352
  }}</span>
@@ -341,7 +359,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
341
359
  </td>
342
360
  <td>{{ file.size }} {{ 'shared.size.kb' | translate }}</td>
343
361
  <td>
344
- <p-tag
362
+ <f-tag
345
363
  [value]="getProviderLabelKey(file.location) | translate"
346
364
  [severity]="getProviderSeverity(file.location)"
347
365
  />
@@ -351,12 +369,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
351
369
  </td>
352
370
  <td>
353
371
  @if (file.isPrivate) {
354
- <p-tag
372
+ <f-tag
355
373
  [value]="'storage.private' | translate"
356
374
  severity="warn"
357
375
  />
358
376
  } @else {
359
- <p-tag
377
+ <f-tag
360
378
  [value]="'storage.public' | translate"
361
379
  severity="success"
362
380
  />
@@ -367,48 +385,59 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
367
385
  </td>
368
386
  <td>
369
387
  <div class="flex gap-1">
370
- <p-button
388
+ <button
389
+ fButton
371
390
  *hasPermission="FILE_PERMISSIONS.READ"
372
- icon="pi pi-eye"
373
391
  [text]="true"
374
392
  severity="secondary"
375
393
  size="small"
376
- [loading]="isViewing"
377
394
  [disabled]="isViewing"
378
- (onClick)="onView(file)"
379
- [pTooltip]="'shared.view' | translate"
395
+ (click)="onView(file)"
396
+ [fTooltip]="'shared.view' | translate"
380
397
  tooltipPosition="top"
381
- />
382
- <p-button
398
+ >
399
+ @if (isViewing) {
400
+ <ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
401
+ } @else {
402
+ <ui-icon pButtonIcon name="eye"></ui-icon>
403
+ }
404
+ </button>
405
+ <button
406
+ fButton
383
407
  *hasPermission="FILE_PERMISSIONS.UPDATE"
384
- icon="pi pi-pencil"
385
408
  [text]="true"
386
409
  severity="secondary"
387
410
  size="small"
388
- (onClick)="onEdit(file.id)"
389
- [pTooltip]="'shared.edit' | translate"
411
+ (click)="onEdit(file.id)"
412
+ [fTooltip]="'shared.edit' | translate"
390
413
  tooltipPosition="top"
391
- />
392
- <p-button
414
+ >
415
+ <ui-icon pButtonIcon name="pencil"></ui-icon>
416
+ </button>
417
+ <button
418
+ fButton
393
419
  *hasPermission="FILE_PERMISSIONS.DELETE"
394
- icon="pi pi-trash"
395
420
  [text]="true"
396
421
  severity="warn"
397
422
  size="small"
398
- (onClick)="onSoftDelete(file)"
399
- [pTooltip]="'storage.tooltip.trash' | translate"
423
+ (click)="onSoftDelete(file)"
424
+ [fTooltip]="'storage.tooltip.trash' | translate"
400
425
  tooltipPosition="top"
401
- />
402
- <p-button
426
+ >
427
+ <ui-icon pButtonIcon name="trash"></ui-icon>
428
+ </button>
429
+ <button
430
+ fButton
403
431
  *hasPermission="FILE_PERMISSIONS.DELETE"
404
- icon="pi pi-times-circle"
405
432
  [text]="true"
406
433
  severity="danger"
407
434
  size="small"
408
- (onClick)="onPermanentDelete(file)"
409
- [pTooltip]="'shared.delete' | translate"
435
+ (click)="onPermanentDelete(file)"
436
+ [fTooltip]="'shared.delete' | translate"
410
437
  tooltipPosition="top"
411
- />
438
+ >
439
+ <ui-icon pButtonIcon name="times-circle"></ui-icon>
440
+ </button>
412
441
  </div>
413
442
  </td>
414
443
  </tr>
@@ -424,7 +453,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
424
453
  </td>
425
454
  </tr>
426
455
  </ng-template>
427
- </p-table>
456
+ </f-table>
428
457
  </div>
429
458
  </div>
430
459
  `,
@@ -432,4 +461,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
432
461
  }] });
433
462
 
434
463
  export { FileManagerListComponent };
435
- //# sourceMappingURL=flusys-ng-storage-file-manager-list.component-Go5Gqptd.mjs.map
464
+ //# sourceMappingURL=flusys-ng-storage-file-manager-list.component-DqHH9lI0.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flusys-ng-storage-file-manager-list.component-DqHH9lI0.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 TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { firstValueFrom } from 'rxjs';\nimport { IFileManager } from '../../interfaces/file-manager.interface';\nimport { FileManagerApiService } from '../../services/file-manager-api.service';\nimport { BaseStorageListPage } from '../../utils/base-storage-page';\n\nimport {\n getFileIcon,\n getProviderLabelKey,\n getProviderSeverity,\n} from '../../utils/storage-utils';\n\n@Component({\n selector: 'lib-file-manager-list',\n imports: [UiModule, AngularModule, 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 fButton\n *hasPermission=\"FILE_PERMISSIONS.CREATE\"\n (click)=\"onUpload()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"upload\"></ui-icon>\n <span pButtonLabel>{{ 'storage.button.upload.file' | translate }}</span>\n </button>\n </div>\n\n <div class=\"overflow-x-auto\">\n <f-table\n [value]=\"files()\"\n [loading]=\"isLoading()\"\n [paginator]=\"totalRecords() > 0\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'shared.name' | translate }}</th>\n <th class=\"hidden lg:table-cell\">\n {{ 'shared.type' | translate }}\n </th>\n <th>{{ 'storage.table.size' | translate }}</th>\n <th>{{ 'storage.table.location' | translate }}</th>\n <th class=\"hidden xl:table-cell\">\n {{ 'storage.table.config' | translate }}\n </th>\n <th>{{ 'storage.table.private' | translate }}</th>\n <th class=\"hidden md:table-cell\">\n {{ 'storage.table.created' | translate }}\n </th>\n <th class=\"w-[120px]\">{{ 'shared.actions' | translate }}</th>\n </tr>\n </ng-template>\n <ng-template #body let-file>\n @let isViewing = viewingFileId() === file.id;\n <tr>\n <td>\n <div class=\"flex items-center gap-2\">\n <ui-icon [name]=\"getFileIcon(file.contentType)\"></ui-icon>\n <span class=\"truncate max-w-32 sm:max-w-none\">{{\n file.name\n }}</span>\n </div>\n </td>\n <td class=\"hidden lg:table-cell\">\n <span class=\"text-sm text-muted-color\">{{\n file.contentType\n }}</span>\n </td>\n <td>{{ file.size }} {{ 'shared.size.kb' | translate }}</td>\n <td>\n <f-tag\n [value]=\"getProviderLabelKey(file.location) | translate\"\n [severity]=\"getProviderSeverity(file.location)\"\n />\n </td>\n <td class=\"hidden xl:table-cell\">\n {{ file.providerName || '-' }}\n </td>\n <td>\n @if (file.isPrivate) {\n <f-tag\n [value]=\"'storage.private' | translate\"\n severity=\"warn\"\n />\n } @else {\n <f-tag\n [value]=\"'storage.public' | translate\"\n severity=\"success\"\n />\n }\n </td>\n <td class=\"hidden md:table-cell\">\n {{ file.createdAt | date: 'short' }}\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.READ\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [disabled]=\"isViewing\"\n (click)=\"onView(file)\"\n [fTooltip]=\"'shared.view' | translate\"\n tooltipPosition=\"top\"\n >\n @if (isViewing) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"eye\"></ui-icon>\n }\n </button>\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (click)=\"onEdit(file.id)\"\n [fTooltip]=\"'shared.edit' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"warn\"\n size=\"small\"\n (click)=\"onSoftDelete(file)\"\n [fTooltip]=\"'storage.tooltip.trash' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"FILE_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (click)=\"onPermanentDelete(file)\"\n [fTooltip]=\"'shared.delete' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"times-circle\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"8\" class=\"text-center py-4 text-muted-color\">\n @if (showCompanyInfo()) {\n {{ 'storage.empty.files.in.company' | translate }}\n } @else {\n {{ 'storage.empty.files' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class FileManagerListComponent extends BaseStorageListPage<IFileManager> {\n readonly FILE_PERMISSIONS = FILE_PERMISSIONS;\n\n private readonly fileService = inject(FileManagerApiService);\n private readonly translateService = inject(TranslateService);\n\n readonly files = this.items;\n readonly viewingFileId = signal<string | null>(null);\n\n 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: 'trash',\n acceptLabel: this.translateService.translate(\n 'storage.delete.move.to.trash',\n ),\n acceptButtonStyleClass: 'p-button-warning',\n accept: async () => {\n try {\n const response = await this.fileService.delete({\n id: file.id,\n type: 'delete',\n });\n this.showSuccess(\n response?.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response?.message ?? ''),\n );\n this.loadData();\n } catch {}\n },\n });\n }\n\n onPermanentDelete(file: IFileManager): void {\n this.confirmationService.confirm({\n message: this.translateService.translate(\n 'storage.delete.permanent.delete.confirm',\n { name: file.name },\n ),\n header: this.translateService.translate(\n 'storage.delete.permanent.delete',\n ),\n icon: 'exclamation-triangle',\n acceptLabel: this.translateService.translate(\n 'storage.delete.permanent.delete.button',\n ),\n rejectLabel: this.translateService.translate('shared.cancel'),\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n const response = await this.fileService.delete({\n id: file.id,\n type: 'permanent',\n });\n this.showSuccess(\n response?.messageKey\n ? this.translateService.translate(\n response.messageKey,\n response.messageVariables as Record<string, string | number>,\n )\n : (response?.message ?? ''),\n );\n this.loadData();\n } catch {}\n },\n });\n }\n}\n"],"names":[],"mappings":"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"}