@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
|
@@ -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,
|
|
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
|
|
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,
|
|
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: '
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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: '
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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: "
|
|
105
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
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
|
-
<
|
|
125
|
+
<button
|
|
126
|
+
fButton
|
|
121
127
|
*hasPermission="FILE_PERMISSIONS.CREATE"
|
|
122
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
194
|
+
<f-tag
|
|
189
195
|
[value]="'storage.private' | translate"
|
|
190
196
|
severity="warn"
|
|
191
197
|
/>
|
|
192
198
|
} @else {
|
|
193
|
-
<
|
|
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
|
-
<
|
|
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
|
-
(
|
|
213
|
-
[
|
|
217
|
+
(click)="onView(file)"
|
|
218
|
+
[fTooltip]="'shared.view' | translate"
|
|
214
219
|
tooltipPosition="top"
|
|
215
|
-
|
|
216
|
-
|
|
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
|
-
(
|
|
223
|
-
[
|
|
233
|
+
(click)="onEdit(file.id)"
|
|
234
|
+
[fTooltip]="'shared.edit' | translate"
|
|
224
235
|
tooltipPosition="top"
|
|
225
|
-
|
|
226
|
-
|
|
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
|
-
(
|
|
233
|
-
[
|
|
245
|
+
(click)="onSoftDelete(file)"
|
|
246
|
+
[fTooltip]="'storage.tooltip.trash' | translate"
|
|
234
247
|
tooltipPosition="top"
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
(
|
|
243
|
-
[
|
|
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
|
-
</
|
|
278
|
+
</f-table>
|
|
262
279
|
</div>
|
|
263
280
|
</div>
|
|
264
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type:
|
|
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: "
|
|
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: [
|
|
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
|
-
<
|
|
303
|
+
<button
|
|
304
|
+
fButton
|
|
287
305
|
*hasPermission="FILE_PERMISSIONS.CREATE"
|
|
288
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
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
|
-
<
|
|
372
|
+
<f-tag
|
|
355
373
|
[value]="'storage.private' | translate"
|
|
356
374
|
severity="warn"
|
|
357
375
|
/>
|
|
358
376
|
} @else {
|
|
359
|
-
<
|
|
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
|
-
<
|
|
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
|
-
(
|
|
379
|
-
[
|
|
395
|
+
(click)="onView(file)"
|
|
396
|
+
[fTooltip]="'shared.view' | translate"
|
|
380
397
|
tooltipPosition="top"
|
|
381
|
-
|
|
382
|
-
|
|
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
|
-
(
|
|
389
|
-
[
|
|
411
|
+
(click)="onEdit(file.id)"
|
|
412
|
+
[fTooltip]="'shared.edit' | translate"
|
|
390
413
|
tooltipPosition="top"
|
|
391
|
-
|
|
392
|
-
|
|
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
|
-
(
|
|
399
|
-
[
|
|
423
|
+
(click)="onSoftDelete(file)"
|
|
424
|
+
[fTooltip]="'storage.tooltip.trash' | translate"
|
|
400
425
|
tooltipPosition="top"
|
|
401
|
-
|
|
402
|
-
|
|
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
|
-
(
|
|
409
|
-
[
|
|
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
|
-
</
|
|
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-
|
|
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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"}
|