@flusys/ng-storage 5.5.0 → 6.0.0-beta.2
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--W6sWv7W.mjs → flusys-ng-storage-file-manager-form.component-V-ZDWkKU.mjs} +83 -126
- package/fesm2022/flusys-ng-storage-file-manager-form.component-V-ZDWkKU.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-file-manager-list.component-D_shqU2a.mjs → flusys-ng-storage-file-manager-list.component-DqHH9lI0.mjs} +76 -74
- package/fesm2022/flusys-ng-storage-file-manager-list.component-DqHH9lI0.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-folder-form.component-BK2EWeV4.mjs → flusys-ng-storage-folder-form.component-Up9luV7j.mjs} +17 -17
- package/fesm2022/flusys-ng-storage-folder-form.component-Up9luV7j.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-folder-list.component-aQXBRZiN.mjs → flusys-ng-storage-folder-list.component-B52N1JaK.mjs} +32 -35
- package/fesm2022/flusys-ng-storage-folder-list.component-B52N1JaK.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-storage-config-form.component-ByRs-CSx.mjs → flusys-ng-storage-storage-config-form.component-CEW5gpSt.mjs} +63 -68
- package/fesm2022/flusys-ng-storage-storage-config-form.component-CEW5gpSt.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-storage-config-list.component-cjiA8k2G.mjs → flusys-ng-storage-storage-config-list.component-C-jaO7xD.mjs} +34 -38
- package/fesm2022/flusys-ng-storage-storage-config-list.component-C-jaO7xD.mjs.map +1 -0
- package/fesm2022/flusys-ng-storage.mjs +72 -83
- package/fesm2022/flusys-ng-storage.mjs.map +1 -1
- package/package.json +5 -7
- package/types/flusys-ng-storage.d.ts +5 -11
- package/fesm2022/flusys-ng-storage-file-manager-form.component--W6sWv7W.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-file-manager-list.component-D_shqU2a.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-folder-form.component-BK2EWeV4.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-folder-list.component-aQXBRZiN.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-storage-config-form.component-ByRs-CSx.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-storage-config-list.component-cjiA8k2G.mjs.map +0 -1
|
@@ -3,12 +3,11 @@ import { inject, signal, computed, effect, Component } from '@angular/core';
|
|
|
3
3
|
import { toSignal } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { form, required, FormField } from '@angular/forms/signals';
|
|
5
5
|
import { ActivatedRoute } from '@angular/router';
|
|
6
|
-
import { TranslateService, AngularModule,
|
|
6
|
+
import { TranslateService, AngularModule, TranslatePipe } from '@flusys/ng-shared';
|
|
7
7
|
import { FileLocationEnum, BaseStoragePage, StorageConfigApiService, STORAGE_PROVIDER_OPTIONS } from './flusys-ng-storage.mjs';
|
|
8
|
+
import * as i1$1 from '@flusys/ng-ui';
|
|
9
|
+
import { UiModule } from '@flusys/ng-ui';
|
|
8
10
|
import * as i1 from '@angular/forms';
|
|
9
|
-
import * as i1$1 from 'primeng/button';
|
|
10
|
-
import * as i3 from 'primeng/inputtext';
|
|
11
|
-
import * as i4 from 'primeng/toggleswitch';
|
|
12
11
|
|
|
13
12
|
const DEFAULT_FORM_MODEL = {
|
|
14
13
|
id: '',
|
|
@@ -192,8 +191,8 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
192
191
|
return {};
|
|
193
192
|
}
|
|
194
193
|
}
|
|
195
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.
|
|
196
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.
|
|
194
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: StorageConfigFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
195
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.6", type: StorageConfigFormComponent, isStandalone: true, selector: "lib-storage-config-form", usesInheritance: true, ngImport: i0, template: `
|
|
197
196
|
<div class="card">
|
|
198
197
|
<h3 class="text-lg sm:text-xl font-semibold mb-4">
|
|
199
198
|
{{
|
|
@@ -218,7 +217,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
218
217
|
>{{ 'storage.config.config.name.required' | translate }}</label
|
|
219
218
|
>
|
|
220
219
|
<input
|
|
221
|
-
|
|
220
|
+
fInputText
|
|
222
221
|
id="name"
|
|
223
222
|
[formField]="configForm.name"
|
|
224
223
|
[placeholder]="
|
|
@@ -234,28 +233,26 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
234
233
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
235
234
|
>{{ 'storage.config.provider.required' | translate }}</label
|
|
236
235
|
>
|
|
237
|
-
<select
|
|
238
|
-
|
|
239
|
-
|
|
236
|
+
<f-select
|
|
237
|
+
inputId="storage"
|
|
238
|
+
[options]="[...storageProviderOptions]"
|
|
239
|
+
optionValue="value"
|
|
240
240
|
[formField]="configForm.storage"
|
|
241
241
|
>
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
</option>
|
|
246
|
-
}
|
|
247
|
-
</select>
|
|
242
|
+
<ng-template #item let-provider>{{ provider.labelKey | translate }}</ng-template>
|
|
243
|
+
<ng-template #selectedItem let-provider>{{ provider.labelKey | translate }}</ng-template>
|
|
244
|
+
</f-select>
|
|
248
245
|
</div>
|
|
249
246
|
|
|
250
247
|
<div class="field flex items-center gap-2">
|
|
251
|
-
<
|
|
248
|
+
<f-toggleswitch [formField]="configForm.isActive" />
|
|
252
249
|
<label class="text-sm sm:text-base">{{
|
|
253
250
|
'shared.active' | translate
|
|
254
251
|
}}</label>
|
|
255
252
|
</div>
|
|
256
253
|
|
|
257
254
|
<div class="field flex items-center gap-2">
|
|
258
|
-
<
|
|
255
|
+
<f-toggleswitch [formField]="configForm.isDefault" />
|
|
259
256
|
<label class="text-sm sm:text-base">{{
|
|
260
257
|
'storage.set.as.default' | translate
|
|
261
258
|
}}</label>
|
|
@@ -279,7 +276,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
279
276
|
>{{ 'storage.config.region.required' | translate }}</label
|
|
280
277
|
>
|
|
281
278
|
<input
|
|
282
|
-
|
|
279
|
+
fInputText
|
|
283
280
|
id="awsRegion"
|
|
284
281
|
[formField]="configForm.awsRegion"
|
|
285
282
|
[placeholder]="'storage.aws.region.placeholder' | translate"
|
|
@@ -293,7 +290,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
293
290
|
>{{ 'storage.config.bucket.required' | translate }}</label
|
|
294
291
|
>
|
|
295
292
|
<input
|
|
296
|
-
|
|
293
|
+
fInputText
|
|
297
294
|
id="awsBucket"
|
|
298
295
|
[formField]="configForm.awsBucket"
|
|
299
296
|
[placeholder]="'storage.aws.bucket.placeholder' | translate"
|
|
@@ -307,7 +304,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
307
304
|
>{{ 'storage.config.access.key.required' | translate }}</label
|
|
308
305
|
>
|
|
309
306
|
<input
|
|
310
|
-
|
|
307
|
+
fInputText
|
|
311
308
|
id="awsAccessKeyId"
|
|
312
309
|
[formField]="configForm.awsAccessKeyId"
|
|
313
310
|
class="w-full"
|
|
@@ -321,7 +318,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
321
318
|
>
|
|
322
319
|
<input
|
|
323
320
|
type="password"
|
|
324
|
-
|
|
321
|
+
fInputText
|
|
325
322
|
id="awsSecretAccessKey"
|
|
326
323
|
[formField]="configForm.awsSecretAccessKey"
|
|
327
324
|
class="w-full"
|
|
@@ -334,7 +331,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
334
331
|
>{{ 'storage.config.endpoint.optional' | translate }}</label
|
|
335
332
|
>
|
|
336
333
|
<input
|
|
337
|
-
|
|
334
|
+
fInputText
|
|
338
335
|
id="awsEndpoint"
|
|
339
336
|
[formField]="configForm.awsEndpoint"
|
|
340
337
|
[placeholder]="
|
|
@@ -363,7 +360,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
363
360
|
>{{ 'storage.azure.account.name.required' | translate }}</label
|
|
364
361
|
>
|
|
365
362
|
<input
|
|
366
|
-
|
|
363
|
+
fInputText
|
|
367
364
|
id="azureAccountName"
|
|
368
365
|
[formField]="configForm.azureAccountName"
|
|
369
366
|
class="w-full"
|
|
@@ -378,7 +375,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
378
375
|
}}</label
|
|
379
376
|
>
|
|
380
377
|
<input
|
|
381
|
-
|
|
378
|
+
fInputText
|
|
382
379
|
id="azureContainerName"
|
|
383
380
|
[formField]="configForm.azureContainerName"
|
|
384
381
|
class="w-full"
|
|
@@ -392,7 +389,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
392
389
|
>
|
|
393
390
|
<input
|
|
394
391
|
type="password"
|
|
395
|
-
|
|
392
|
+
fInputText
|
|
396
393
|
id="azureAccountKey"
|
|
397
394
|
[formField]="configForm.azureAccountKey"
|
|
398
395
|
class="w-full"
|
|
@@ -418,7 +415,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
418
415
|
>{{ 'storage.sftp.host.required' | translate }}</label
|
|
419
416
|
>
|
|
420
417
|
<input
|
|
421
|
-
|
|
418
|
+
fInputText
|
|
422
419
|
id="sftpHost"
|
|
423
420
|
[formField]="configForm.sftpHost"
|
|
424
421
|
[placeholder]="'storage.sftp.host.placeholder' | translate"
|
|
@@ -433,7 +430,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
433
430
|
>
|
|
434
431
|
<input
|
|
435
432
|
type="number"
|
|
436
|
-
|
|
433
|
+
fInputText
|
|
437
434
|
id="sftpPort"
|
|
438
435
|
[formField]="configForm.sftpPort"
|
|
439
436
|
[placeholder]="'storage.sftp.port.placeholder' | translate"
|
|
@@ -447,7 +444,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
447
444
|
>{{ 'storage.sftp.username.required' | translate }}</label
|
|
448
445
|
>
|
|
449
446
|
<input
|
|
450
|
-
|
|
447
|
+
fInputText
|
|
451
448
|
id="sftpUsername"
|
|
452
449
|
[formField]="configForm.sftpUsername"
|
|
453
450
|
class="w-full"
|
|
@@ -461,7 +458,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
461
458
|
>
|
|
462
459
|
<input
|
|
463
460
|
type="password"
|
|
464
|
-
|
|
461
|
+
fInputText
|
|
465
462
|
id="sftpPassword"
|
|
466
463
|
[formField]="configForm.sftpPassword"
|
|
467
464
|
class="w-full"
|
|
@@ -474,7 +471,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
474
471
|
>{{ 'storage.sftp.base.path.required' | translate }}</label
|
|
475
472
|
>
|
|
476
473
|
<input
|
|
477
|
-
|
|
474
|
+
fInputText
|
|
478
475
|
id="sftpBasePath"
|
|
479
476
|
[formField]="configForm.sftpBasePath"
|
|
480
477
|
[placeholder]="'storage.sftp.base.path.placeholder' | translate"
|
|
@@ -501,7 +498,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
501
498
|
>{{ 'storage.local.base.path.required' | translate }}</label
|
|
502
499
|
>
|
|
503
500
|
<input
|
|
504
|
-
|
|
501
|
+
fInputText
|
|
505
502
|
id="localBasePath"
|
|
506
503
|
[formField]="configForm.localBasePath"
|
|
507
504
|
[placeholder]="
|
|
@@ -515,7 +512,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
515
512
|
|
|
516
513
|
<div class="flex justify-end gap-2 mt-4">
|
|
517
514
|
<button
|
|
518
|
-
|
|
515
|
+
fButton
|
|
519
516
|
severity="secondary"
|
|
520
517
|
[outlined]="true"
|
|
521
518
|
(click)="onCancel()"
|
|
@@ -523,12 +520,12 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
523
520
|
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
524
521
|
</button>
|
|
525
522
|
<button
|
|
526
|
-
|
|
523
|
+
fButton
|
|
527
524
|
type="submit"
|
|
528
525
|
[disabled]="!isFormValid() || isLoading()"
|
|
529
526
|
>
|
|
530
527
|
@if (isLoading()) {
|
|
531
|
-
<
|
|
528
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
532
529
|
}
|
|
533
530
|
<span pButtonLabel>{{
|
|
534
531
|
(isEditMode() ? 'shared.update' : 'shared.create') | translate
|
|
@@ -537,13 +534,13 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
537
534
|
</div>
|
|
538
535
|
</form>
|
|
539
536
|
</div>
|
|
540
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.
|
|
537
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1$1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "rounded", "raised", "fluid", "disabled", "loading", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "directive", type: i1$1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched"] }, { kind: "component", type: i1$1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "showClear", "loading", "inputId", "invalid", "touched", "styleClass", "editable"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur"] }, { kind: "component", type: i1$1.ToggleSwitchComponent, selector: "f-toggleswitch", inputs: ["disabled", "readonly", "invalid", "ariaLabel", "trueValue", "falseValue", "inputId"] }, { kind: "component", type: i1$1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
541
538
|
}
|
|
542
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.
|
|
539
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: StorageConfigFormComponent, decorators: [{
|
|
543
540
|
type: Component,
|
|
544
541
|
args: [{
|
|
545
542
|
selector: 'lib-storage-config-form',
|
|
546
|
-
imports: [AngularModule,
|
|
543
|
+
imports: [AngularModule, UiModule, FormField, TranslatePipe],
|
|
547
544
|
template: `
|
|
548
545
|
<div class="card">
|
|
549
546
|
<h3 class="text-lg sm:text-xl font-semibold mb-4">
|
|
@@ -569,7 +566,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
569
566
|
>{{ 'storage.config.config.name.required' | translate }}</label
|
|
570
567
|
>
|
|
571
568
|
<input
|
|
572
|
-
|
|
569
|
+
fInputText
|
|
573
570
|
id="name"
|
|
574
571
|
[formField]="configForm.name"
|
|
575
572
|
[placeholder]="
|
|
@@ -585,28 +582,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
585
582
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
586
583
|
>{{ 'storage.config.provider.required' | translate }}</label
|
|
587
584
|
>
|
|
588
|
-
<select
|
|
589
|
-
|
|
590
|
-
|
|
585
|
+
<f-select
|
|
586
|
+
inputId="storage"
|
|
587
|
+
[options]="[...storageProviderOptions]"
|
|
588
|
+
optionValue="value"
|
|
591
589
|
[formField]="configForm.storage"
|
|
592
590
|
>
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
</option>
|
|
597
|
-
}
|
|
598
|
-
</select>
|
|
591
|
+
<ng-template #item let-provider>{{ provider.labelKey | translate }}</ng-template>
|
|
592
|
+
<ng-template #selectedItem let-provider>{{ provider.labelKey | translate }}</ng-template>
|
|
593
|
+
</f-select>
|
|
599
594
|
</div>
|
|
600
595
|
|
|
601
596
|
<div class="field flex items-center gap-2">
|
|
602
|
-
<
|
|
597
|
+
<f-toggleswitch [formField]="configForm.isActive" />
|
|
603
598
|
<label class="text-sm sm:text-base">{{
|
|
604
599
|
'shared.active' | translate
|
|
605
600
|
}}</label>
|
|
606
601
|
</div>
|
|
607
602
|
|
|
608
603
|
<div class="field flex items-center gap-2">
|
|
609
|
-
<
|
|
604
|
+
<f-toggleswitch [formField]="configForm.isDefault" />
|
|
610
605
|
<label class="text-sm sm:text-base">{{
|
|
611
606
|
'storage.set.as.default' | translate
|
|
612
607
|
}}</label>
|
|
@@ -630,7 +625,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
630
625
|
>{{ 'storage.config.region.required' | translate }}</label
|
|
631
626
|
>
|
|
632
627
|
<input
|
|
633
|
-
|
|
628
|
+
fInputText
|
|
634
629
|
id="awsRegion"
|
|
635
630
|
[formField]="configForm.awsRegion"
|
|
636
631
|
[placeholder]="'storage.aws.region.placeholder' | translate"
|
|
@@ -644,7 +639,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
644
639
|
>{{ 'storage.config.bucket.required' | translate }}</label
|
|
645
640
|
>
|
|
646
641
|
<input
|
|
647
|
-
|
|
642
|
+
fInputText
|
|
648
643
|
id="awsBucket"
|
|
649
644
|
[formField]="configForm.awsBucket"
|
|
650
645
|
[placeholder]="'storage.aws.bucket.placeholder' | translate"
|
|
@@ -658,7 +653,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
658
653
|
>{{ 'storage.config.access.key.required' | translate }}</label
|
|
659
654
|
>
|
|
660
655
|
<input
|
|
661
|
-
|
|
656
|
+
fInputText
|
|
662
657
|
id="awsAccessKeyId"
|
|
663
658
|
[formField]="configForm.awsAccessKeyId"
|
|
664
659
|
class="w-full"
|
|
@@ -672,7 +667,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
672
667
|
>
|
|
673
668
|
<input
|
|
674
669
|
type="password"
|
|
675
|
-
|
|
670
|
+
fInputText
|
|
676
671
|
id="awsSecretAccessKey"
|
|
677
672
|
[formField]="configForm.awsSecretAccessKey"
|
|
678
673
|
class="w-full"
|
|
@@ -685,7 +680,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
685
680
|
>{{ 'storage.config.endpoint.optional' | translate }}</label
|
|
686
681
|
>
|
|
687
682
|
<input
|
|
688
|
-
|
|
683
|
+
fInputText
|
|
689
684
|
id="awsEndpoint"
|
|
690
685
|
[formField]="configForm.awsEndpoint"
|
|
691
686
|
[placeholder]="
|
|
@@ -714,7 +709,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
714
709
|
>{{ 'storage.azure.account.name.required' | translate }}</label
|
|
715
710
|
>
|
|
716
711
|
<input
|
|
717
|
-
|
|
712
|
+
fInputText
|
|
718
713
|
id="azureAccountName"
|
|
719
714
|
[formField]="configForm.azureAccountName"
|
|
720
715
|
class="w-full"
|
|
@@ -729,7 +724,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
729
724
|
}}</label
|
|
730
725
|
>
|
|
731
726
|
<input
|
|
732
|
-
|
|
727
|
+
fInputText
|
|
733
728
|
id="azureContainerName"
|
|
734
729
|
[formField]="configForm.azureContainerName"
|
|
735
730
|
class="w-full"
|
|
@@ -743,7 +738,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
743
738
|
>
|
|
744
739
|
<input
|
|
745
740
|
type="password"
|
|
746
|
-
|
|
741
|
+
fInputText
|
|
747
742
|
id="azureAccountKey"
|
|
748
743
|
[formField]="configForm.azureAccountKey"
|
|
749
744
|
class="w-full"
|
|
@@ -769,7 +764,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
769
764
|
>{{ 'storage.sftp.host.required' | translate }}</label
|
|
770
765
|
>
|
|
771
766
|
<input
|
|
772
|
-
|
|
767
|
+
fInputText
|
|
773
768
|
id="sftpHost"
|
|
774
769
|
[formField]="configForm.sftpHost"
|
|
775
770
|
[placeholder]="'storage.sftp.host.placeholder' | translate"
|
|
@@ -784,7 +779,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
784
779
|
>
|
|
785
780
|
<input
|
|
786
781
|
type="number"
|
|
787
|
-
|
|
782
|
+
fInputText
|
|
788
783
|
id="sftpPort"
|
|
789
784
|
[formField]="configForm.sftpPort"
|
|
790
785
|
[placeholder]="'storage.sftp.port.placeholder' | translate"
|
|
@@ -798,7 +793,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
798
793
|
>{{ 'storage.sftp.username.required' | translate }}</label
|
|
799
794
|
>
|
|
800
795
|
<input
|
|
801
|
-
|
|
796
|
+
fInputText
|
|
802
797
|
id="sftpUsername"
|
|
803
798
|
[formField]="configForm.sftpUsername"
|
|
804
799
|
class="w-full"
|
|
@@ -812,7 +807,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
812
807
|
>
|
|
813
808
|
<input
|
|
814
809
|
type="password"
|
|
815
|
-
|
|
810
|
+
fInputText
|
|
816
811
|
id="sftpPassword"
|
|
817
812
|
[formField]="configForm.sftpPassword"
|
|
818
813
|
class="w-full"
|
|
@@ -825,7 +820,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
825
820
|
>{{ 'storage.sftp.base.path.required' | translate }}</label
|
|
826
821
|
>
|
|
827
822
|
<input
|
|
828
|
-
|
|
823
|
+
fInputText
|
|
829
824
|
id="sftpBasePath"
|
|
830
825
|
[formField]="configForm.sftpBasePath"
|
|
831
826
|
[placeholder]="'storage.sftp.base.path.placeholder' | translate"
|
|
@@ -852,7 +847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
852
847
|
>{{ 'storage.local.base.path.required' | translate }}</label
|
|
853
848
|
>
|
|
854
849
|
<input
|
|
855
|
-
|
|
850
|
+
fInputText
|
|
856
851
|
id="localBasePath"
|
|
857
852
|
[formField]="configForm.localBasePath"
|
|
858
853
|
[placeholder]="
|
|
@@ -866,7 +861,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
866
861
|
|
|
867
862
|
<div class="flex justify-end gap-2 mt-4">
|
|
868
863
|
<button
|
|
869
|
-
|
|
864
|
+
fButton
|
|
870
865
|
severity="secondary"
|
|
871
866
|
[outlined]="true"
|
|
872
867
|
(click)="onCancel()"
|
|
@@ -874,12 +869,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
874
869
|
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
875
870
|
</button>
|
|
876
871
|
<button
|
|
877
|
-
|
|
872
|
+
fButton
|
|
878
873
|
type="submit"
|
|
879
874
|
[disabled]="!isFormValid() || isLoading()"
|
|
880
875
|
>
|
|
881
876
|
@if (isLoading()) {
|
|
882
|
-
<
|
|
877
|
+
<ui-icon pButtonIcon name="spinner" [spin]="true"></ui-icon>
|
|
883
878
|
}
|
|
884
879
|
<span pButtonLabel>{{
|
|
885
880
|
(isEditMode() ? 'shared.update' : 'shared.create') | translate
|
|
@@ -893,4 +888,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImpor
|
|
|
893
888
|
}], ctorParameters: () => [] });
|
|
894
889
|
|
|
895
890
|
export { StorageConfigFormComponent };
|
|
896
|
-
//# sourceMappingURL=flusys-ng-storage-storage-config-form.component-
|
|
891
|
+
//# sourceMappingURL=flusys-ng-storage-storage-config-form.component-CEW5gpSt.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusys-ng-storage-storage-config-form.component-CEW5gpSt.mjs","sources":["../../../projects/ng-storage/pages/storage-config/storage-config-form.component.ts"],"sourcesContent":["import { Component, computed, effect, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { form, FormField, required } from '@angular/forms/signals';\nimport { ActivatedRoute } from '@angular/router';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport { FileLocationEnum } from '../../enums/file-location.enum';\nimport { IStorageConfig } from '../../interfaces/storage-config.interface';\nimport { StorageConfigApiService } from '../../services/storage-config-api.service';\nimport { BaseStoragePage } from '../../utils/base-storage-page';\nimport { STORAGE_PROVIDER_OPTIONS } from '../../utils/storage-utils';\nimport { UiModule } from '@flusys/ng-ui';\n\ninterface IStorageConfigFormModel {\n id: string;\n name: string;\n storage: FileLocationEnum;\n isActive: boolean;\n isDefault: boolean;\n awsRegion: string;\n awsBucket: string;\n awsAccessKeyId: string;\n awsSecretAccessKey: string;\n awsEndpoint: string;\n azureAccountName: string;\n azureAccountKey: string;\n azureContainerName: string;\n sftpHost: string;\n sftpPort: string;\n sftpUsername: string;\n sftpPassword: string;\n sftpBasePath: string;\n localBasePath: string;\n}\n\nconst DEFAULT_FORM_MODEL: IStorageConfigFormModel = {\n id: '',\n name: '',\n storage: FileLocationEnum.AWS,\n isActive: true,\n isDefault: false,\n awsRegion: '',\n awsBucket: '',\n awsAccessKeyId: '',\n awsSecretAccessKey: '',\n awsEndpoint: '',\n azureAccountName: '',\n azureAccountKey: '',\n azureContainerName: '',\n sftpHost: '',\n sftpPort: '22',\n sftpUsername: '',\n sftpPassword: '',\n sftpBasePath: '',\n localBasePath: '',\n};\n\n@Component({\n selector: 'lib-storage-config-form',\n imports: [AngularModule, UiModule, FormField, TranslatePipe],\n template: `\n <div class=\"card\">\n <h3 class=\"text-lg sm:text-xl font-semibold mb-4\">\n {{\n (isEditMode()\n ? 'storage.config.edit.config'\n : 'storage.config.new.config'\n ) | translate\n }}\n </h3>\n @if (showCompanyInfo()) {\n <p class=\"text-sm text-muted-color mb-4\">\n {{ 'shared.company' | translate }}: {{ currentCompanyName() }}\n </p>\n }\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.config.config.name.required' | translate }}</label\n >\n <input\n fInputText\n id=\"name\"\n [formField]=\"configForm.name\"\n [placeholder]=\"\n 'storage.config.config.name.placeholder' | translate\n \"\n class=\"w-full\"\n />\n </div>\n\n <div class=\"field\">\n <label\n for=\"storage\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.config.provider.required' | translate }}</label\n >\n <f-select\n inputId=\"storage\"\n [options]=\"[...storageProviderOptions]\"\n optionValue=\"value\"\n [formField]=\"configForm.storage\"\n >\n <ng-template #item let-provider>{{ provider.labelKey | translate }}</ng-template>\n <ng-template #selectedItem let-provider>{{ provider.labelKey | translate }}</ng-template>\n </f-select>\n </div>\n\n <div class=\"field flex items-center gap-2\">\n <f-toggleswitch [formField]=\"configForm.isActive\" />\n <label class=\"text-sm sm:text-base\">{{\n 'shared.active' | translate\n }}</label>\n </div>\n\n <div class=\"field flex items-center gap-2\">\n <f-toggleswitch [formField]=\"configForm.isDefault\" />\n <label class=\"text-sm sm:text-base\">{{\n 'storage.set.as.default' | translate\n }}</label>\n </div>\n </div>\n\n @if (selectedProvider() === fileLocationEnum.AWS) {\n <div\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface\"\n >\n <div class=\"md:col-span-2 mb-2\">\n <span\n class=\"text-sm font-semibold text-muted-color uppercase tracking-wide\"\n >{{ 'storage.aws.title' | translate }}</span\n >\n </div>\n <div class=\"field\">\n <label\n for=\"awsRegion\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.config.region.required' | translate }}</label\n >\n <input\n fInputText\n id=\"awsRegion\"\n [formField]=\"configForm.awsRegion\"\n [placeholder]=\"'storage.aws.region.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n <div class=\"field\">\n <label\n for=\"awsBucket\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.config.bucket.required' | translate }}</label\n >\n <input\n fInputText\n id=\"awsBucket\"\n [formField]=\"configForm.awsBucket\"\n [placeholder]=\"'storage.aws.bucket.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n <div class=\"field\">\n <label\n for=\"awsAccessKeyId\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.config.access.key.required' | translate }}</label\n >\n <input\n fInputText\n id=\"awsAccessKeyId\"\n [formField]=\"configForm.awsAccessKeyId\"\n class=\"w-full\"\n />\n </div>\n <div class=\"field\">\n <label\n for=\"awsSecretAccessKey\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.config.secret.key.required' | translate }}</label\n >\n <input\n type=\"password\"\n fInputText\n id=\"awsSecretAccessKey\"\n [formField]=\"configForm.awsSecretAccessKey\"\n class=\"w-full\"\n />\n </div>\n <div class=\"field md:col-span-2\">\n <label\n for=\"awsEndpoint\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.config.endpoint.optional' | translate }}</label\n >\n <input\n fInputText\n id=\"awsEndpoint\"\n [formField]=\"configForm.awsEndpoint\"\n [placeholder]=\"\n 'storage.config.endpoint.placeholder' | translate\n \"\n class=\"w-full\"\n />\n </div>\n </div>\n }\n\n @if (selectedProvider() === fileLocationEnum.AZURE) {\n <div\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface\"\n >\n <div class=\"md:col-span-2 mb-2\">\n <span\n class=\"text-sm font-semibold text-muted-color uppercase tracking-wide\"\n >{{ 'storage.azure.title' | translate }}</span\n >\n </div>\n <div class=\"field\">\n <label\n for=\"azureAccountName\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.azure.account.name.required' | translate }}</label\n >\n <input\n fInputText\n id=\"azureAccountName\"\n [formField]=\"configForm.azureAccountName\"\n class=\"w-full\"\n />\n </div>\n <div class=\"field\">\n <label\n for=\"azureContainerName\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{\n 'storage.azure.container.name.required' | translate\n }}</label\n >\n <input\n fInputText\n id=\"azureContainerName\"\n [formField]=\"configForm.azureContainerName\"\n class=\"w-full\"\n />\n </div>\n <div class=\"field md:col-span-2\">\n <label\n for=\"azureAccountKey\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.azure.account.key.required' | translate }}</label\n >\n <input\n type=\"password\"\n fInputText\n id=\"azureAccountKey\"\n [formField]=\"configForm.azureAccountKey\"\n class=\"w-full\"\n />\n </div>\n </div>\n }\n\n @if (selectedProvider() === fileLocationEnum.SFTP) {\n <div\n class=\"grid grid-cols-1 md:grid-cols-2 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface\"\n >\n <div class=\"md:col-span-2 mb-2\">\n <span\n class=\"text-sm font-semibold text-muted-color uppercase tracking-wide\"\n >{{ 'storage.sftp.title' | translate }}</span\n >\n </div>\n <div class=\"field\">\n <label\n for=\"sftpHost\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.sftp.host.required' | translate }}</label\n >\n <input\n fInputText\n id=\"sftpHost\"\n [formField]=\"configForm.sftpHost\"\n [placeholder]=\"'storage.sftp.host.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n <div class=\"field\">\n <label\n for=\"sftpPort\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.sftp.port.required' | translate }}</label\n >\n <input\n type=\"number\"\n fInputText\n id=\"sftpPort\"\n [formField]=\"configForm.sftpPort\"\n [placeholder]=\"'storage.sftp.port.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n <div class=\"field\">\n <label\n for=\"sftpUsername\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.sftp.username.required' | translate }}</label\n >\n <input\n fInputText\n id=\"sftpUsername\"\n [formField]=\"configForm.sftpUsername\"\n class=\"w-full\"\n />\n </div>\n <div class=\"field\">\n <label\n for=\"sftpPassword\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.sftp.password.required' | translate }}</label\n >\n <input\n type=\"password\"\n fInputText\n id=\"sftpPassword\"\n [formField]=\"configForm.sftpPassword\"\n class=\"w-full\"\n />\n </div>\n <div class=\"field md:col-span-2\">\n <label\n for=\"sftpBasePath\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.sftp.base.path.required' | translate }}</label\n >\n <input\n fInputText\n id=\"sftpBasePath\"\n [formField]=\"configForm.sftpBasePath\"\n [placeholder]=\"'storage.sftp.base.path.placeholder' | translate\"\n class=\"w-full\"\n />\n </div>\n </div>\n }\n\n @if (selectedProvider() === fileLocationEnum.LOCAL) {\n <div\n class=\"grid grid-cols-1 gap-4 mt-4 p-4 bg-surface-ground rounded-lg border border-surface\"\n >\n <div class=\"mb-2\">\n <span\n class=\"text-sm font-semibold text-muted-color uppercase tracking-wide\"\n >{{ 'storage.local.title' | translate }}</span\n >\n </div>\n <div class=\"field\">\n <label\n for=\"localBasePath\"\n class=\"block font-medium mb-2 text-sm sm:text-base\"\n >{{ 'storage.local.base.path.required' | translate }}</label\n >\n <input\n fInputText\n id=\"localBasePath\"\n [formField]=\"configForm.localBasePath\"\n [placeholder]=\"\n 'storage.local.base.path.placeholder' | translate\n \"\n class=\"w-full\"\n />\n </div>\n </div>\n }\n\n <div class=\"flex justify-end gap-2 mt-4\">\n <button\n fButton\n severity=\"secondary\"\n [outlined]=\"true\"\n (click)=\"onCancel()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n type=\"submit\"\n [disabled]=\"!isFormValid() || isLoading()\"\n >\n @if (isLoading()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ \n (isEditMode() ? 'shared.update' : 'shared.create') | translate\n }}</span>\n </button>\n </div>\n </form>\n </div>\n `,\n})\nexport class StorageConfigFormComponent extends BaseStoragePage {\n private readonly route = inject(ActivatedRoute);\n private readonly configService = inject(StorageConfigApiService);\n private readonly translateService = inject(TranslateService);\n private readonly routeParams = toSignal(this.route.paramMap);\n private initialized = false;\n\n readonly fileLocationEnum = FileLocationEnum;\n readonly storageProviderOptions = STORAGE_PROVIDER_OPTIONS;\n\n readonly existingConfig = signal<IStorageConfig | null>(null);\n readonly isEditMode = computed(() => !!this.existingConfig());\n readonly formModel = signal<IStorageConfigFormModel>({\n ...DEFAULT_FORM_MODEL,\n });\n\n readonly configForm = form(this.formModel, (f) => {\n required(f.name, {\n message: this.translateService.translate(\n 'storage.validation.config.name.required',\n ),\n });\n });\n\n readonly selectedProvider = computed(() => this.formModel().storage);\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 configId = params.get('id');\n if (configId && configId !== 'new') {\n this.loadConfig(configId);\n }\n });\n }\n\n async loadConfig(id: string): Promise<void> {\n this.isLoading.set(true);\n try {\n const response = await this.configService.findById(id);\n if (response.success && response.data) {\n const config = response.data;\n this.existingConfig.set(config);\n this.formModel.update((m) => ({\n ...m,\n id: config.id,\n name: config.name,\n storage: config.storage,\n isActive: config.isActive ?? true,\n isDefault: config.isDefault ?? false,\n ...this.extractProviderConfig(config),\n }));\n }\n } catch {\n this.navigateTo(['/storage/configs']);\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 const config = this.buildProviderConfig(formValue);\n\n const response = this.isEditMode()\n ? await this.configService.update({\n id: formValue.id,\n name: formValue.name,\n storage: formValue.storage,\n config,\n isActive: formValue.isActive,\n isDefault: formValue.isDefault,\n })\n : await this.configService.insert({\n name: formValue.name,\n storage: formValue.storage,\n config,\n isActive: formValue.isActive,\n isDefault: formValue.isDefault,\n });\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.navigateTo(['/storage/configs']);\n } catch {\n } finally {\n this.isLoading.set(false);\n }\n }\n\n onCancel(): void {\n this.navigateTo(['/storage/configs']);\n }\n\n private extractProviderConfig(\n config: IStorageConfig,\n ): Partial<IStorageConfigFormModel> {\n const c = config.config ?? {};\n switch (config.storage) {\n case FileLocationEnum.AWS:\n return {\n awsRegion: (c['region'] as string) || '',\n awsBucket: (c['bucket'] as string) || '',\n awsAccessKeyId: (c['accessKeyId'] as string) || '',\n awsSecretAccessKey: (c['secretAccessKey'] as string) || '',\n awsEndpoint: (c['endpoint'] as string) || '',\n };\n case FileLocationEnum.AZURE:\n return {\n azureAccountName: (c['accountName'] as string) || '',\n azureAccountKey: (c['accountKey'] as string) || '',\n azureContainerName: (c['containerName'] as string) || '',\n };\n case FileLocationEnum.SFTP:\n return {\n sftpHost: (c['host'] as string) || '',\n sftpPort: ((c['port'] as number) || 22).toString(),\n sftpUsername: (c['username'] as string) || '',\n sftpPassword: (c['password'] as string) || '',\n sftpBasePath: (c['basePath'] as string) || '',\n };\n case FileLocationEnum.LOCAL:\n return { localBasePath: (c['basePath'] as string) || '' };\n default:\n return {};\n }\n }\n\n private buildProviderConfig(\n formValue: IStorageConfigFormModel,\n ): Record<string, unknown> {\n switch (formValue.storage) {\n case FileLocationEnum.AWS:\n return {\n region: formValue.awsRegion,\n bucket: formValue.awsBucket,\n accessKeyId: formValue.awsAccessKeyId,\n secretAccessKey: formValue.awsSecretAccessKey,\n ...(formValue.awsEndpoint && { endpoint: formValue.awsEndpoint }),\n };\n case FileLocationEnum.AZURE:\n return {\n accountName: formValue.azureAccountName,\n accountKey: formValue.azureAccountKey,\n containerName: formValue.azureContainerName,\n };\n case FileLocationEnum.SFTP:\n return {\n host: formValue.sftpHost,\n port: formValue.sftpPort ? parseInt(formValue.sftpPort, 10) : 22,\n username: formValue.sftpUsername,\n password: formValue.sftpPassword,\n basePath: formValue.sftpBasePath,\n };\n case FileLocationEnum.LOCAL:\n return { basePath: formValue.localBasePath };\n default:\n return {};\n }\n }\n}\n"],"names":["i2"],"mappings":"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"}
|