@flusys/ng-storage 4.1.1 → 5.0.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 (24) hide show
  1. package/README.md +17 -382
  2. package/fesm2022/{flusys-ng-storage-file-manager-form.component-AM7JE-s5.mjs → flusys-ng-storage-file-manager-form.component-BLJDAvBX.mjs} +287 -74
  3. package/fesm2022/flusys-ng-storage-file-manager-form.component-BLJDAvBX.mjs.map +1 -0
  4. package/fesm2022/{flusys-ng-storage-file-manager-list.component-bj6oOzOL.mjs → flusys-ng-storage-file-manager-list.component-Dn5hVksO.mjs} +210 -70
  5. package/fesm2022/flusys-ng-storage-file-manager-list.component-Dn5hVksO.mjs.map +1 -0
  6. package/fesm2022/{flusys-ng-storage-folder-form.component-Cc2ybTwu.mjs → flusys-ng-storage-folder-form.component-B8vRSb1T.mjs} +88 -31
  7. package/fesm2022/flusys-ng-storage-folder-form.component-B8vRSb1T.mjs.map +1 -0
  8. package/fesm2022/{flusys-ng-storage-folder-list.component-B2Q41I1g.mjs → flusys-ng-storage-folder-list.component-B4yCKvAV.mjs} +96 -30
  9. package/fesm2022/flusys-ng-storage-folder-list.component-B4yCKvAV.mjs.map +1 -0
  10. package/fesm2022/flusys-ng-storage-storage-config-form.component-CMeTif8p.mjs +880 -0
  11. package/fesm2022/flusys-ng-storage-storage-config-form.component-CMeTif8p.mjs.map +1 -0
  12. package/fesm2022/{flusys-ng-storage-storage-config-list.component-DBH_qf9o.mjs → flusys-ng-storage-storage-config-list.component-C7OYYyrQ.mjs} +126 -33
  13. package/fesm2022/flusys-ng-storage-storage-config-list.component-C7OYYyrQ.mjs.map +1 -0
  14. package/fesm2022/flusys-ng-storage.mjs +143 -256
  15. package/fesm2022/flusys-ng-storage.mjs.map +1 -1
  16. package/package.json +4 -4
  17. package/types/flusys-ng-storage.d.ts +4 -2
  18. package/fesm2022/flusys-ng-storage-file-manager-form.component-AM7JE-s5.mjs.map +0 -1
  19. package/fesm2022/flusys-ng-storage-file-manager-list.component-bj6oOzOL.mjs.map +0 -1
  20. package/fesm2022/flusys-ng-storage-folder-form.component-Cc2ybTwu.mjs.map +0 -1
  21. package/fesm2022/flusys-ng-storage-folder-list.component-B2Q41I1g.mjs.map +0 -1
  22. package/fesm2022/flusys-ng-storage-storage-config-form.component-a88XhuPH.mjs +0 -465
  23. package/fesm2022/flusys-ng-storage-storage-config-form.component-a88XhuPH.mjs.map +0 -1
  24. package/fesm2022/flusys-ng-storage-storage-config-list.component-DBH_qf9o.mjs.map +0 -1
@@ -23,7 +23,9 @@ class FolderFormComponent extends BaseStoragePage {
23
23
  name: '',
24
24
  }, ...(ngDevMode ? [{ debugName: "formModel" }] : []));
25
25
  folderForm = form(this.formModel, (f) => {
26
- required(f.name, { message: this.translateService.translate('storage.validation.folder.name.required') });
26
+ required(f.name, {
27
+ message: this.translateService.translate('storage.validation.folder.name.required'),
28
+ });
27
29
  });
28
30
  isFormValid = computed(() => this.formModel().name.trim().length > 0, ...(ngDevMode ? [{ debugName: "isFormValid" }] : []));
29
31
  constructor() {
@@ -42,17 +44,13 @@ class FolderFormComponent extends BaseStoragePage {
42
44
  async loadFolder(id) {
43
45
  this.isLoading.set(true);
44
46
  try {
45
- const response = await this.folderService.findByIdAsync(id);
47
+ const response = await this.folderService.findById(id);
46
48
  if (response.success && response.data) {
47
49
  const folder = response.data;
48
50
  this.existingFolder.set(folder);
49
51
  this.formModel.set({ id: folder.id, name: folder.name });
50
52
  }
51
53
  }
52
- catch {
53
- this.showError(this.translateService.translate('storage.folder.load.failed'));
54
- this.navigateTo(['/storage/folders']);
55
- }
56
54
  finally {
57
55
  this.isLoading.set(false);
58
56
  }
@@ -63,20 +61,17 @@ class FolderFormComponent extends BaseStoragePage {
63
61
  this.isLoading.set(true);
64
62
  try {
65
63
  const formValue = this.formModel();
66
- if (this.isEditMode()) {
67
- await this.folderService.updateAsync({ id: formValue.id, name: formValue.name });
68
- this.showSuccess(this.translateService.translate('storage.folder.update.success'));
69
- }
70
- else {
71
- await this.folderService.insertAsync({ name: formValue.name });
72
- this.showSuccess(this.translateService.translate('storage.folder.create.success'));
73
- }
64
+ const response = this.isEditMode()
65
+ ? await this.folderService.update({
66
+ id: formValue.id,
67
+ name: formValue.name,
68
+ })
69
+ : await this.folderService.insert({ name: formValue.name });
70
+ this.showSuccess(response.messageKey
71
+ ? this.translateService.translate(response.messageKey, response.messageVariables)
72
+ : (response.message ?? ''));
74
73
  this.navigateTo(['/storage/folders']);
75
74
  }
76
- catch {
77
- const action = this.isEditMode() ? 'update' : 'create';
78
- this.showError(this.translateService.translate(`storage.folder.${action}.failed`));
79
- }
80
75
  finally {
81
76
  this.isLoading.set(false);
82
77
  }
@@ -88,23 +83,54 @@ class FolderFormComponent extends BaseStoragePage {
88
83
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: FolderFormComponent, isStandalone: true, selector: "lib-folder-form", usesInheritance: true, ngImport: i0, template: `
89
84
  <div class="card">
90
85
  <div class="mb-4">
91
- <h3 class="text-lg sm:text-xl font-semibold">{{ (isEditMode() ? 'storage.folder.edit.folder' : 'storage.folder.new.folder') | translate }}</h3>
86
+ <h3 class="text-lg sm:text-xl font-semibold">
87
+ {{
88
+ (isEditMode()
89
+ ? 'storage.folder.edit.folder'
90
+ : 'storage.folder.new.folder'
91
+ ) | translate
92
+ }}
93
+ </h3>
92
94
  @if (showCompanyInfo()) {
93
- <p class="text-sm text-muted-color mt-1">{{ 'storage.company' | translate }}: {{ currentCompanyName() }}</p>
95
+ <p class="text-sm text-muted-color mt-1">
96
+ {{ 'shared.company' | translate }}: {{ currentCompanyName() }}
97
+ </p>
94
98
  }
95
99
  </div>
96
100
 
97
101
  <form (ngSubmit)="onSubmit()">
98
102
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
99
103
  <div class="field">
100
- <label for="name" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.folder.name.required' | translate }}</label>
101
- <input pInputText id="name" [formField]="folderForm.name" [placeholder]="'storage.folder.name.placeholder' | translate" class="w-full" />
104
+ <label
105
+ for="name"
106
+ class="block font-medium mb-2 text-sm sm:text-base"
107
+ >{{ 'storage.folder.name.required' | translate }}</label
108
+ >
109
+ <input
110
+ pInputText
111
+ id="name"
112
+ [formField]="folderForm.name"
113
+ [placeholder]="'storage.folder.name.placeholder' | translate"
114
+ class="w-full"
115
+ />
102
116
  </div>
103
117
  </div>
104
118
 
105
119
  <div class="flex justify-end gap-2 mt-4">
106
- <p-button [label]="'shared.cancel' | translate" severity="secondary" [outlined]="true" (onClick)="onCancel()" />
107
- <p-button type="submit" [label]="(isEditMode() ? 'shared.update' : 'shared.create') | translate" [loading]="isLoading()" [disabled]="!isFormValid() || isLoading()" />
120
+ <p-button
121
+ [label]="'shared.cancel' | translate"
122
+ severity="secondary"
123
+ [outlined]="true"
124
+ (onClick)="onCancel()"
125
+ />
126
+ <p-button
127
+ type="submit"
128
+ [label]="
129
+ (isEditMode() ? 'shared.update' : 'shared.create') | translate
130
+ "
131
+ [loading]="isLoading()"
132
+ [disabled]="!isFormValid() || isLoading()"
133
+ />
108
134
  </div>
109
135
  </form>
110
136
  </div>
@@ -118,23 +144,54 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
118
144
  template: `
119
145
  <div class="card">
120
146
  <div class="mb-4">
121
- <h3 class="text-lg sm:text-xl font-semibold">{{ (isEditMode() ? 'storage.folder.edit.folder' : 'storage.folder.new.folder') | translate }}</h3>
147
+ <h3 class="text-lg sm:text-xl font-semibold">
148
+ {{
149
+ (isEditMode()
150
+ ? 'storage.folder.edit.folder'
151
+ : 'storage.folder.new.folder'
152
+ ) | translate
153
+ }}
154
+ </h3>
122
155
  @if (showCompanyInfo()) {
123
- <p class="text-sm text-muted-color mt-1">{{ 'storage.company' | translate }}: {{ currentCompanyName() }}</p>
156
+ <p class="text-sm text-muted-color mt-1">
157
+ {{ 'shared.company' | translate }}: {{ currentCompanyName() }}
158
+ </p>
124
159
  }
125
160
  </div>
126
161
 
127
162
  <form (ngSubmit)="onSubmit()">
128
163
  <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
129
164
  <div class="field">
130
- <label for="name" class="block font-medium mb-2 text-sm sm:text-base">{{ 'storage.folder.name.required' | translate }}</label>
131
- <input pInputText id="name" [formField]="folderForm.name" [placeholder]="'storage.folder.name.placeholder' | translate" class="w-full" />
165
+ <label
166
+ for="name"
167
+ class="block font-medium mb-2 text-sm sm:text-base"
168
+ >{{ 'storage.folder.name.required' | translate }}</label
169
+ >
170
+ <input
171
+ pInputText
172
+ id="name"
173
+ [formField]="folderForm.name"
174
+ [placeholder]="'storage.folder.name.placeholder' | translate"
175
+ class="w-full"
176
+ />
132
177
  </div>
133
178
  </div>
134
179
 
135
180
  <div class="flex justify-end gap-2 mt-4">
136
- <p-button [label]="'shared.cancel' | translate" severity="secondary" [outlined]="true" (onClick)="onCancel()" />
137
- <p-button type="submit" [label]="(isEditMode() ? 'shared.update' : 'shared.create') | translate" [loading]="isLoading()" [disabled]="!isFormValid() || isLoading()" />
181
+ <p-button
182
+ [label]="'shared.cancel' | translate"
183
+ severity="secondary"
184
+ [outlined]="true"
185
+ (onClick)="onCancel()"
186
+ />
187
+ <p-button
188
+ type="submit"
189
+ [label]="
190
+ (isEditMode() ? 'shared.update' : 'shared.create') | translate
191
+ "
192
+ [loading]="isLoading()"
193
+ [disabled]="!isFormValid() || isLoading()"
194
+ />
138
195
  </div>
139
196
  </form>
140
197
  </div>
@@ -143,4 +200,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
143
200
  }], ctorParameters: () => [] });
144
201
 
145
202
  export { FolderFormComponent };
146
- //# sourceMappingURL=flusys-ng-storage-folder-form.component-Cc2ybTwu.mjs.map
203
+ //# sourceMappingURL=flusys-ng-storage-folder-form.component-B8vRSb1T.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flusys-ng-storage-folder-form.component-B8vRSb1T.mjs","sources":["../../../projects/ng-storage/pages/folder/folder-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 { TranslateService } from '@flusys/ng-localization';\nimport { AngularModule, PrimeModule, TranslatePipe } from '@flusys/ng-shared';\nimport { IFolder } from '../../interfaces/folder.interface';\nimport { FolderApiService } from '../../services/folder-api.service';\nimport { BaseStoragePage } from '../../utils/base-storage-page';\n\ninterface IFolderFormModel {\n id: string;\n name: string;\n}\n\n@Component({\n selector: 'lib-folder-form',\n imports: [AngularModule, PrimeModule, FormField, TranslatePipe],\n template: `\n <div class=\"card\">\n <div class=\"mb-4\">\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{\n (isEditMode()\n ? 'storage.folder.edit.folder'\n : 'storage.folder.new.folder'\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 <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div class=\"field\">\n <label\n for=\"name\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.folder.name.required' | translate }}</label\n >\n <input\n pInputText\n id=\"name\"\n [formField]=\"folderForm.name\"\n [placeholder]=\"'storage.folder.name.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n </div>\n\n <div class=\"flex justify-end gap-2 mt-4\">\n <p-button\n [label]=\"'shared.cancel' | translate\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\"\n />\n <p-button\n type=\"submit\"\n [label]=\"\n (isEditMode() ? 'shared.update' : 'shared.create') | translate\n \"\n [loading]=\"isLoading()\"\n [disabled]=\"!isFormValid() || isLoading()\"\n />\n </div>\n </form>\n </div>\n `,\n})\nexport class FolderFormComponent extends BaseStoragePage {\n private readonly route = inject(ActivatedRoute);\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 existingFolder = signal<IFolder | null>(null);\n readonly isEditMode = computed(() => !!this.existingFolder());\n\n readonly formModel = signal<IFolderFormModel>({\n id: '',\n name: '',\n });\n\n readonly folderForm = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translateService.translate(\n 'storage.validation.folder.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 folderId = params.get('id');\n if (folderId && folderId !== 'new') {\n this.loadFolder(folderId);\n }\n });\n }\n\n async loadFolder(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.folderService.findById(id);\n if (response.success && response.data) {\n const folder = response.data;\n this.existingFolder.set(folder);\n this.formModel.set({ id: folder.id, name: folder.name });\n }\n } finally {\n this.isLoading.set(false);\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 const response = this.isEditMode()\n ? await this.folderService.update({\n id: formValue.id,\n name: formValue.name,\n })\n : await this.folderService.insert({ name: formValue.name });\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\n this.navigateTo(['/storage/folders']);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.navigateTo(['/storage/folders']);\n }\n}\n"],"names":["i2"],"mappings":";;;;;;;;;;;;AA0EM,MAAO,mBAAoB,SAAQ,eAAe,CAAA;AACrC,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,IAAA,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACxC,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAE3C,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IACpD,WAAW,GAAG,KAAK;AAElB,IAAA,cAAc,GAAG,MAAM,CAAiB,IAAI,0DAAC;AAC7C,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,sDAAC;IAEpD,SAAS,GAAG,MAAM,CAAmB;AAC5C,QAAA,EAAE,EAAE,EAAE;AACN,QAAA,IAAI,EAAE,EAAE;AACT,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IAEO,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,KAAI;AAC/C,QAAA,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CACtC,yCAAyC,CAC1C;AACF,SAAA,CAAC;AACJ,IAAA,CAAC,CAAC;IAEO,WAAW,GAAG,QAAQ,CAC7B,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,uDAC9C;AAED,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;QACP,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;AACjC,YAAA,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW;gBAAE;AAEjC,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,YAAA,IAAI,QAAQ,IAAI,QAAQ,KAAK,KAAK,EAAE;AAClC,gBAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC3B;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,UAAU,CAAC,EAAU,EAAA;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtD,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;AACrC,gBAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI;AAC5B,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1D;QACF;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;AAEA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE;AAEzB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI;AACF,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAElC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU;AAC9B,kBAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;oBAC9B,EAAE,EAAE,SAAS,CAAC,EAAE;oBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;iBACrB;AACH,kBAAE,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;AAE7D,YAAA,IAAI,CAAC,WAAW,CACd,QAAQ,CAAC;AACP,kBAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAC7B,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,gBAAmD;mBAE7D,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAC7B;AAED,YAAA,IAAI,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACvC;gBAAU;AACR,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QAC3B;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACvC;uGAvFW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxDpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAvDS,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,yEAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,SAAS,0EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAyDnD,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBA3D/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;oBAC3B,OAAO,EAAE,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,CAAC;AAC/D,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDT,EAAA,CAAA;AACF,iBAAA;;;;;"}
@@ -2,7 +2,6 @@ import * as i0 from '@angular/core';
2
2
  import { inject, Component } from '@angular/core';
3
3
  import { TranslateService } from '@flusys/ng-localization';
4
4
  import { FOLDER_PERMISSIONS, AngularModule, PrimeModule, HasPermissionDirective, TranslatePipe } from '@flusys/ng-shared';
5
- import { firstValueFrom } from 'rxjs';
6
5
  import { BaseStorageListPage, FolderApiService } from './flusys-ng-storage.mjs';
7
6
  import * as i1 from 'primeng/button';
8
7
  import * as i2 from 'primeng/table';
@@ -18,44 +17,53 @@ class FolderListComponent extends BaseStorageListPage {
18
17
  return '/storage/folders';
19
18
  }
20
19
  getDeleteConfirmMessage(folder) {
21
- return this.translateService.translate('storage.delete.confirm.named', { name: folder.name });
20
+ return this.translateService.translate('shared.confirm.delete.item', {
21
+ name: folder.name,
22
+ });
22
23
  }
23
24
  async loadData() {
24
25
  this.isLoading.set(true);
25
26
  try {
26
- const response = await firstValueFrom(this.folderService.getAll('', { pagination: this.getPaginationParams() }));
27
+ const response = await this.folderService.getAll({
28
+ pagination: this.getPaginationParams(),
29
+ });
27
30
  if (response.success) {
28
31
  this.items.set(response.data ?? []);
29
32
  this.total.set(response.meta?.total ?? 0);
30
33
  }
31
34
  }
32
- catch {
33
- this.showError(this.translateService.translate('storage.folder.load.failed'));
34
- }
35
35
  finally {
36
36
  this.isLoading.set(false);
37
37
  }
38
38
  }
39
39
  onDeleteFolder(folder) {
40
- this.onDeleteAsync(folder, (f) => f.id, (id) => this.folderService.deleteAsync({ id, type: 'delete' }), {
40
+ this.onDeleteAsync(folder, (f) => f.id, (id) => this.folderService.delete({ id, type: 'delete' }), {
41
41
  header: this.translateService.translate('storage.folder.delete.title'),
42
- successMessage: this.translateService.translate('storage.folder.delete.success'),
43
- errorMessage: this.translateService.translate('storage.folder.delete.failed'),
44
42
  });
45
43
  }
46
44
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: FolderListComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
47
45
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: FolderListComponent, isStandalone: true, selector: "lib-folder-list", usesInheritance: true, ngImport: i0, template: `
48
46
  <div class="card">
49
- <div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4">
47
+ <div
48
+ class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4"
49
+ >
50
50
  <div>
51
- <h3 class="text-lg sm:text-xl font-semibold">{{ 'storage.folder.title' | translate }}</h3>
51
+ <h3 class="text-lg sm:text-xl font-semibold">
52
+ {{ 'storage.folder.title' | translate }}
53
+ </h3>
52
54
  @if (showCompanyInfo()) {
53
55
  <p class="text-sm text-muted-color mt-1">
54
- {{ 'storage.company' | translate }}: {{ currentCompanyName() }}
56
+ {{ 'shared.company' | translate }}: {{ currentCompanyName() }}
55
57
  </p>
56
58
  }
57
59
  </div>
58
- <p-button *hasPermission="FOLDER_PERMISSIONS.CREATE" [label]="'storage.button.new.folder' | translate" icon="pi pi-plus" (onClick)="onCreate()" styleClass="w-full sm:w-auto" />
60
+ <p-button
61
+ *hasPermission="FOLDER_PERMISSIONS.CREATE"
62
+ [label]="'storage.button.new.folder' | translate"
63
+ icon="pi pi-plus"
64
+ (onClick)="onCreate()"
65
+ styleClass="w-full sm:w-auto"
66
+ />
59
67
  </div>
60
68
 
61
69
  <div class="overflow-x-auto">
@@ -73,10 +81,14 @@ class FolderListComponent extends BaseStorageListPage {
73
81
  >
74
82
  <ng-template #header>
75
83
  <tr>
76
- <th>{{ 'storage.table.name' | translate }}</th>
84
+ <th>{{ 'shared.name' | translate }}</th>
77
85
  <th>{{ 'storage.table.slug' | translate }}</th>
78
- <th class="hidden sm:table-cell">{{ 'storage.table.created' | translate }}</th>
79
- <th class="w-[120px]">{{ 'storage.table.actions' | translate }}</th>
86
+ <th class="hidden sm:table-cell">
87
+ {{ 'storage.table.created' | translate }}
88
+ </th>
89
+ <th class="w-[120px]">
90
+ {{ 'shared.actions' | translate }}
91
+ </th>
80
92
  </tr>
81
93
  </ng-template>
82
94
  <ng-template #body let-folder>
@@ -86,11 +98,31 @@ class FolderListComponent extends BaseStorageListPage {
86
98
  {{ folder.name }}
87
99
  </td>
88
100
  <td>{{ folder.slug }}</td>
89
- <td class="hidden sm:table-cell">{{ folder.createdAt | date: 'short' }}</td>
101
+ <td class="hidden sm:table-cell">
102
+ {{ folder.createdAt | date: 'short' }}
103
+ </td>
90
104
  <td>
91
105
  <div class="flex gap-1">
92
- <p-button *hasPermission="FOLDER_PERMISSIONS.UPDATE" icon="pi pi-pencil" [text]="true" severity="secondary" size="small" (onClick)="onEdit(folder.id)" [pTooltip]="'storage.tooltip.edit' | translate" tooltipPosition="top" />
93
- <p-button *hasPermission="FOLDER_PERMISSIONS.DELETE" icon="pi pi-trash" [text]="true" severity="danger" size="small" (onClick)="onDeleteFolder(folder)" [pTooltip]="'storage.tooltip.delete' | translate" tooltipPosition="top" />
106
+ <p-button
107
+ *hasPermission="FOLDER_PERMISSIONS.UPDATE"
108
+ icon="pi pi-pencil"
109
+ [text]="true"
110
+ severity="secondary"
111
+ size="small"
112
+ (onClick)="onEdit(folder.id)"
113
+ [pTooltip]="'shared.edit' | translate"
114
+ tooltipPosition="top"
115
+ />
116
+ <p-button
117
+ *hasPermission="FOLDER_PERMISSIONS.DELETE"
118
+ icon="pi pi-trash"
119
+ [text]="true"
120
+ severity="danger"
121
+ size="small"
122
+ (onClick)="onDeleteFolder(folder)"
123
+ [pTooltip]="'shared.delete' | translate"
124
+ tooltipPosition="top"
125
+ />
94
126
  </div>
95
127
  </td>
96
128
  </tr>
@@ -118,16 +150,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
118
150
  imports: [AngularModule, PrimeModule, HasPermissionDirective, TranslatePipe],
119
151
  template: `
120
152
  <div class="card">
121
- <div class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4">
153
+ <div
154
+ class="flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4"
155
+ >
122
156
  <div>
123
- <h3 class="text-lg sm:text-xl font-semibold">{{ 'storage.folder.title' | translate }}</h3>
157
+ <h3 class="text-lg sm:text-xl font-semibold">
158
+ {{ 'storage.folder.title' | translate }}
159
+ </h3>
124
160
  @if (showCompanyInfo()) {
125
161
  <p class="text-sm text-muted-color mt-1">
126
- {{ 'storage.company' | translate }}: {{ currentCompanyName() }}
162
+ {{ 'shared.company' | translate }}: {{ currentCompanyName() }}
127
163
  </p>
128
164
  }
129
165
  </div>
130
- <p-button *hasPermission="FOLDER_PERMISSIONS.CREATE" [label]="'storage.button.new.folder' | translate" icon="pi pi-plus" (onClick)="onCreate()" styleClass="w-full sm:w-auto" />
166
+ <p-button
167
+ *hasPermission="FOLDER_PERMISSIONS.CREATE"
168
+ [label]="'storage.button.new.folder' | translate"
169
+ icon="pi pi-plus"
170
+ (onClick)="onCreate()"
171
+ styleClass="w-full sm:w-auto"
172
+ />
131
173
  </div>
132
174
 
133
175
  <div class="overflow-x-auto">
@@ -145,10 +187,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
145
187
  >
146
188
  <ng-template #header>
147
189
  <tr>
148
- <th>{{ 'storage.table.name' | translate }}</th>
190
+ <th>{{ 'shared.name' | translate }}</th>
149
191
  <th>{{ 'storage.table.slug' | translate }}</th>
150
- <th class="hidden sm:table-cell">{{ 'storage.table.created' | translate }}</th>
151
- <th class="w-[120px]">{{ 'storage.table.actions' | translate }}</th>
192
+ <th class="hidden sm:table-cell">
193
+ {{ 'storage.table.created' | translate }}
194
+ </th>
195
+ <th class="w-[120px]">
196
+ {{ 'shared.actions' | translate }}
197
+ </th>
152
198
  </tr>
153
199
  </ng-template>
154
200
  <ng-template #body let-folder>
@@ -158,11 +204,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
158
204
  {{ folder.name }}
159
205
  </td>
160
206
  <td>{{ folder.slug }}</td>
161
- <td class="hidden sm:table-cell">{{ folder.createdAt | date: 'short' }}</td>
207
+ <td class="hidden sm:table-cell">
208
+ {{ folder.createdAt | date: 'short' }}
209
+ </td>
162
210
  <td>
163
211
  <div class="flex gap-1">
164
- <p-button *hasPermission="FOLDER_PERMISSIONS.UPDATE" icon="pi pi-pencil" [text]="true" severity="secondary" size="small" (onClick)="onEdit(folder.id)" [pTooltip]="'storage.tooltip.edit' | translate" tooltipPosition="top" />
165
- <p-button *hasPermission="FOLDER_PERMISSIONS.DELETE" icon="pi pi-trash" [text]="true" severity="danger" size="small" (onClick)="onDeleteFolder(folder)" [pTooltip]="'storage.tooltip.delete' | translate" tooltipPosition="top" />
212
+ <p-button
213
+ *hasPermission="FOLDER_PERMISSIONS.UPDATE"
214
+ icon="pi pi-pencil"
215
+ [text]="true"
216
+ severity="secondary"
217
+ size="small"
218
+ (onClick)="onEdit(folder.id)"
219
+ [pTooltip]="'shared.edit' | translate"
220
+ tooltipPosition="top"
221
+ />
222
+ <p-button
223
+ *hasPermission="FOLDER_PERMISSIONS.DELETE"
224
+ icon="pi pi-trash"
225
+ [text]="true"
226
+ severity="danger"
227
+ size="small"
228
+ (onClick)="onDeleteFolder(folder)"
229
+ [pTooltip]="'shared.delete' | translate"
230
+ tooltipPosition="top"
231
+ />
166
232
  </div>
167
233
  </td>
168
234
  </tr>
@@ -186,4 +252,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
186
252
  }] });
187
253
 
188
254
  export { FolderListComponent };
189
- //# sourceMappingURL=flusys-ng-storage-folder-list.component-B2Q41I1g.mjs.map
255
+ //# sourceMappingURL=flusys-ng-storage-folder-list.component-B4yCKvAV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flusys-ng-storage-folder-list.component-B4yCKvAV.mjs","sources":["../../../projects/ng-storage/pages/folder/folder-list.component.ts"],"sourcesContent":["import { Component, inject } from '@angular/core';\nimport { TranslateService } from '@flusys/ng-localization';\nimport {\n AngularModule,\n FOLDER_PERMISSIONS,\n HasPermissionDirective,\n PrimeModule,\n TranslatePipe,\n} from '@flusys/ng-shared';\nimport { IFolder } from '../../interfaces/folder.interface';\nimport { FolderApiService } from '../../services/folder-api.service';\nimport { BaseStorageListPage } from '../../utils/base-storage-page';\n\n@Component({\n selector: 'lib-folder-list',\n imports: [AngularModule, PrimeModule, HasPermissionDirective, TranslatePipe],\n template: `\n <div class=\"card\">\n <div\n class=\"flex flex-col sm:flex-row sm:justify-between sm:items-center gap-3 mb-4\"\n >\n <div>\n <h3 class=\"text-lg sm:text-xl font-semibold\">\n {{ 'storage.folder.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 <p-button\n *hasPermission=\"FOLDER_PERMISSIONS.CREATE\"\n [label]=\"'storage.button.new.folder' | translate\"\n icon=\"pi pi-plus\"\n (onClick)=\"onCreate()\"\n styleClass=\"w-full sm:w-auto\"\n />\n </div>\n\n <div class=\"overflow-x-auto\">\n <p-table\n [value]=\"folders()\"\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 styleClass=\"p-datatable-sm\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'shared.name' | translate }}</th>\n <th>{{ 'storage.table.slug' | translate }}</th>\n <th class=\"hidden sm:table-cell\">\n {{ 'storage.table.created' | translate }}\n </th>\n <th class=\"w-[120px]\">\n {{ 'shared.actions' | translate }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body let-folder>\n <tr>\n <td>\n <i class=\"pi pi-folder mr-2\"></i>\n {{ folder.name }}\n </td>\n <td>{{ folder.slug }}</td>\n <td class=\"hidden sm:table-cell\">\n {{ folder.createdAt | date: 'short' }}\n </td>\n <td>\n <div class=\"flex gap-1\">\n <p-button\n *hasPermission=\"FOLDER_PERMISSIONS.UPDATE\"\n icon=\"pi pi-pencil\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (onClick)=\"onEdit(folder.id)\"\n [pTooltip]=\"'shared.edit' | translate\"\n tooltipPosition=\"top\"\n />\n <p-button\n *hasPermission=\"FOLDER_PERMISSIONS.DELETE\"\n icon=\"pi pi-trash\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n (onClick)=\"onDeleteFolder(folder)\"\n [pTooltip]=\"'shared.delete' | translate\"\n tooltipPosition=\"top\"\n />\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"4\" class=\"text-center py-4 text-muted-color\">\n @if (showCompanyInfo()) {\n {{ 'storage.empty.folders.in.company' | translate }}\n } @else {\n {{ 'storage.empty.folders' | translate }}\n }\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n `,\n})\nexport class FolderListComponent extends BaseStorageListPage<IFolder> {\n readonly FOLDER_PERMISSIONS = FOLDER_PERMISSIONS;\n\n private readonly folderService = inject(FolderApiService);\n private readonly translateService = inject(TranslateService);\n\n readonly folders = this.items;\n\n getResourceRoute(): string {\n return '/storage/folders';\n }\n\n override getDeleteConfirmMessage(folder: IFolder): string {\n return this.translateService.translate('shared.confirm.delete.item', {\n name: folder.name,\n });\n }\n\n async loadData(): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.folderService.getAll({\n pagination: this.getPaginationParams(),\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 onDeleteFolder(folder: IFolder): void {\n this.onDeleteAsync(\n folder,\n (f) => f.id,\n (id) => this.folderService.delete({ id, type: 'delete' }),\n {\n header: this.translateService.translate('storage.folder.delete.title'),\n },\n );\n }\n}\n"],"names":["i3"],"mappings":"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"}