@flusys/ng-storage 8.0.0-beta.1 → 8.0.0
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-storage-config-form.component-DgpTIBpc.mjs → flusys-ng-storage-storage-config-form.component-Ce3uFkH3.mjs} +16 -33
- package/fesm2022/flusys-ng-storage-storage-config-form.component-Ce3uFkH3.mjs.map +1 -0
- package/fesm2022/flusys-ng-storage.mjs +2 -2
- package/package.json +5 -5
- package/fesm2022/flusys-ng-storage-storage-config-form.component-DgpTIBpc.mjs.map +0 -1
|
@@ -5,7 +5,7 @@ import { form, required, FormField } from '@angular/forms/signals';
|
|
|
5
5
|
import { ActivatedRoute } from '@angular/router';
|
|
6
6
|
import { TranslateService, TranslatePipe } from '@flusys/ng-shared';
|
|
7
7
|
import { FileLocationEnum, BaseStoragePage, StorageConfigApiService, STORAGE_PROVIDER_OPTIONS } from './flusys-ng-storage.mjs';
|
|
8
|
-
import { InputTextDirective, SelectComponent, ToggleSwitchComponent, FButtonDirective, UiIconComponent } from '@flusys/ng-ui';
|
|
8
|
+
import { InputTextDirective, PasswordComponent, SelectComponent, ToggleSwitchComponent, FButtonDirective, UiIconComponent } from '@flusys/ng-ui';
|
|
9
9
|
|
|
10
10
|
const DEFAULT_FORM_MODEL = {
|
|
11
11
|
id: '',
|
|
@@ -315,12 +315,9 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
315
315
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
316
316
|
>{{ 'storage.config.secret.key.required' | translate }}</label
|
|
317
317
|
>
|
|
318
|
-
<
|
|
319
|
-
|
|
320
|
-
fInputText
|
|
321
|
-
id="awsSecretAccessKey"
|
|
318
|
+
<f-password
|
|
319
|
+
inputId="awsSecretAccessKey"
|
|
322
320
|
[formField]="configForm.awsSecretAccessKey"
|
|
323
|
-
class="w-full"
|
|
324
321
|
/>
|
|
325
322
|
</div>
|
|
326
323
|
<div class="field md:col-span-2">
|
|
@@ -386,12 +383,9 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
386
383
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
387
384
|
>{{ 'storage.azure.account.key.required' | translate }}</label
|
|
388
385
|
>
|
|
389
|
-
<
|
|
390
|
-
|
|
391
|
-
fInputText
|
|
392
|
-
id="azureAccountKey"
|
|
386
|
+
<f-password
|
|
387
|
+
inputId="azureAccountKey"
|
|
393
388
|
[formField]="configForm.azureAccountKey"
|
|
394
|
-
class="w-full"
|
|
395
389
|
/>
|
|
396
390
|
</div>
|
|
397
391
|
</div>
|
|
@@ -455,12 +449,9 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
455
449
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
456
450
|
>{{ 'storage.sftp.password.required' | translate }}</label
|
|
457
451
|
>
|
|
458
|
-
<
|
|
459
|
-
|
|
460
|
-
fInputText
|
|
461
|
-
id="sftpPassword"
|
|
452
|
+
<f-password
|
|
453
|
+
inputId="sftpPassword"
|
|
462
454
|
[formField]="configForm.sftpPassword"
|
|
463
|
-
class="w-full"
|
|
464
455
|
/>
|
|
465
456
|
</div>
|
|
466
457
|
<div class="field md:col-span-2">
|
|
@@ -534,7 +525,7 @@ class StorageConfigFormComponent extends BaseStoragePage {
|
|
|
534
525
|
</div>
|
|
535
526
|
</form>
|
|
536
527
|
</div>
|
|
537
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: ToggleSwitchComponent, selector: "f-toggleswitch", inputs: ["disabled", "readonly", "invalid", "ariaLabel", "trueValue", "falseValue", "inputId", "size", "tabindex", "styleClass", "style"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
528
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: PasswordComponent, selector: "f-password", inputs: ["toggleMask", "feedback", "disabled", "placeholder", "inputId", "invalid", "touched", "inputStyleClass", "styleClass", "style", "ariaDescribedby", "autocomplete", "variant", "size", "fluid", "appendTo", "promptLabel", "weakLabel", "mediumLabel", "strongLabel", "mediumRegex", "strongRegex"], outputs: ["onBlur", "onFocus"] }, { kind: "component", type: SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "component", type: ToggleSwitchComponent, selector: "f-toggleswitch", inputs: ["disabled", "readonly", "invalid", "ariaLabel", "trueValue", "falseValue", "inputId", "size", "tabindex", "styleClass", "style"] }, { kind: "directive", type: FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "directive", type: FormField, selector: "[formField]", inputs: ["formField"], exportAs: ["formField"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
538
529
|
}
|
|
539
530
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: StorageConfigFormComponent, decorators: [{
|
|
540
531
|
type: Component,
|
|
@@ -542,6 +533,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
|
|
|
542
533
|
selector: 'lib-storage-config-form',
|
|
543
534
|
imports: [
|
|
544
535
|
InputTextDirective,
|
|
536
|
+
PasswordComponent,
|
|
545
537
|
SelectComponent,
|
|
546
538
|
ToggleSwitchComponent,
|
|
547
539
|
FButtonDirective,
|
|
@@ -673,12 +665,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
|
|
|
673
665
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
674
666
|
>{{ 'storage.config.secret.key.required' | translate }}</label
|
|
675
667
|
>
|
|
676
|
-
<
|
|
677
|
-
|
|
678
|
-
fInputText
|
|
679
|
-
id="awsSecretAccessKey"
|
|
668
|
+
<f-password
|
|
669
|
+
inputId="awsSecretAccessKey"
|
|
680
670
|
[formField]="configForm.awsSecretAccessKey"
|
|
681
|
-
class="w-full"
|
|
682
671
|
/>
|
|
683
672
|
</div>
|
|
684
673
|
<div class="field md:col-span-2">
|
|
@@ -744,12 +733,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
|
|
|
744
733
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
745
734
|
>{{ 'storage.azure.account.key.required' | translate }}</label
|
|
746
735
|
>
|
|
747
|
-
<
|
|
748
|
-
|
|
749
|
-
fInputText
|
|
750
|
-
id="azureAccountKey"
|
|
736
|
+
<f-password
|
|
737
|
+
inputId="azureAccountKey"
|
|
751
738
|
[formField]="configForm.azureAccountKey"
|
|
752
|
-
class="w-full"
|
|
753
739
|
/>
|
|
754
740
|
</div>
|
|
755
741
|
</div>
|
|
@@ -813,12 +799,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
|
|
|
813
799
|
class="block font-medium mb-2 text-sm sm:text-base"
|
|
814
800
|
>{{ 'storage.sftp.password.required' | translate }}</label
|
|
815
801
|
>
|
|
816
|
-
<
|
|
817
|
-
|
|
818
|
-
fInputText
|
|
819
|
-
id="sftpPassword"
|
|
802
|
+
<f-password
|
|
803
|
+
inputId="sftpPassword"
|
|
820
804
|
[formField]="configForm.sftpPassword"
|
|
821
|
-
class="w-full"
|
|
822
805
|
/>
|
|
823
806
|
</div>
|
|
824
807
|
<div class="field md:col-span-2">
|
|
@@ -897,4 +880,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
|
|
|
897
880
|
}], ctorParameters: () => [] });
|
|
898
881
|
|
|
899
882
|
export { StorageConfigFormComponent };
|
|
900
|
-
//# sourceMappingURL=flusys-ng-storage-storage-config-form.component-
|
|
883
|
+
//# sourceMappingURL=flusys-ng-storage-storage-config-form.component-Ce3uFkH3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusys-ng-storage-storage-config-form.component-Ce3uFkH3.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 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 {\n FButtonDirective,\n InputTextDirective,\n PasswordComponent,\n SelectComponent,\n ToggleSwitchComponent,\n UiIconComponent,\n} 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: [\n InputTextDirective,\n PasswordComponent,\n SelectComponent,\n ToggleSwitchComponent,\n FButtonDirective,\n UiIconComponent,\n FormField,\n TranslatePipe,\n ],\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 (submit)=\"onSubmit($event)\">\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 <f-password\n inputId=\"awsSecretAccessKey\"\n [formField]=\"configForm.awsSecretAccessKey\"\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 <f-password\n inputId=\"azureAccountKey\"\n [formField]=\"configForm.azureAccountKey\"\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 <f-password\n inputId=\"sftpPassword\"\n [formField]=\"configForm.sftpPassword\"\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 type=\"button\"\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(event: Event): Promise<void> {\n event.preventDefault();\n\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":[],"mappings":"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"}
|
|
@@ -796,12 +796,12 @@ const STORAGE_ROUTES = [
|
|
|
796
796
|
{
|
|
797
797
|
path: 'new',
|
|
798
798
|
canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.CREATE)],
|
|
799
|
-
loadComponent: () => import('./flusys-ng-storage-storage-config-form.component-
|
|
799
|
+
loadComponent: () => import('./flusys-ng-storage-storage-config-form.component-Ce3uFkH3.mjs').then((m) => m.StorageConfigFormComponent),
|
|
800
800
|
},
|
|
801
801
|
{
|
|
802
802
|
path: ':id',
|
|
803
803
|
canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.UPDATE)],
|
|
804
|
-
loadComponent: () => import('./flusys-ng-storage-storage-config-form.component-
|
|
804
|
+
loadComponent: () => import('./flusys-ng-storage-storage-config-form.component-Ce3uFkH3.mjs').then((m) => m.StorageConfigFormComponent),
|
|
805
805
|
},
|
|
806
806
|
],
|
|
807
807
|
},
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flusys/ng-storage",
|
|
3
|
-
"version": "8.0.0
|
|
3
|
+
"version": "8.0.0",
|
|
4
4
|
"description": "File storage module for FLUSYS Angular applications",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"peerDependencies": {
|
|
7
7
|
"@angular/common": ">=22.0.0",
|
|
8
8
|
"@angular/core": ">=22.0.0",
|
|
9
9
|
"@angular/router": ">=22.0.0",
|
|
10
|
-
"@flusys/ng-core": ">=8.0.0
|
|
11
|
-
"@flusys/ng-layout": ">=8.0.0
|
|
12
|
-
"@flusys/ng-shared": ">=8.0.0
|
|
13
|
-
"@flusys/ng-ui": ">=8.0.0
|
|
10
|
+
"@flusys/ng-core": ">=8.0.0",
|
|
11
|
+
"@flusys/ng-layout": ">=8.0.0",
|
|
12
|
+
"@flusys/ng-shared": ">=8.0.0",
|
|
13
|
+
"@flusys/ng-ui": ">=8.0.0",
|
|
14
14
|
"rxjs": "^7.8.0"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-storage-storage-config-form.component-DgpTIBpc.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 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 {\n FButtonDirective,\n InputTextDirective,\n SelectComponent,\n ToggleSwitchComponent,\n UiIconComponent,\n} 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: [\n InputTextDirective,\n SelectComponent,\n ToggleSwitchComponent,\n FButtonDirective,\n UiIconComponent,\n FormField,\n TranslatePipe,\n ],\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 (submit)=\"onSubmit($event)\">\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 type=\"button\"\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(event: Event): Promise<void> {\n event.preventDefault();\n\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":[],"mappings":"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"}
|