@flusys/ng-storage 9.2.1 → 9.3.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.
Files changed (24) hide show
  1. package/fesm2022/{flusys-ng-storage-file-manager-api.service-DJ9uP3aN.mjs → flusys-ng-storage-file-manager-api.service-BSooxN-R.mjs} +4 -4
  2. package/fesm2022/{flusys-ng-storage-file-manager-api.service-DJ9uP3aN.mjs.map → flusys-ng-storage-file-manager-api.service-BSooxN-R.mjs.map} +1 -1
  3. package/fesm2022/{flusys-ng-storage-file-manager-form.component-Bvhewt3f.mjs → flusys-ng-storage-file-manager-form.component-B45INctA.mjs} +8 -8
  4. package/fesm2022/{flusys-ng-storage-file-manager-form.component-Bvhewt3f.mjs.map → flusys-ng-storage-file-manager-form.component-B45INctA.mjs.map} +1 -1
  5. package/fesm2022/{flusys-ng-storage-file-manager-list.component-BjlsjxSH.mjs → flusys-ng-storage-file-manager-list.component-BH_jro0g.mjs} +5 -5
  6. package/fesm2022/{flusys-ng-storage-file-manager-list.component-BjlsjxSH.mjs.map → flusys-ng-storage-file-manager-list.component-BH_jro0g.mjs.map} +1 -1
  7. package/fesm2022/{flusys-ng-storage-folder-api.service-D_fFEuO6.mjs → flusys-ng-storage-folder-api.service-5-wLOtDf.mjs} +4 -4
  8. package/fesm2022/{flusys-ng-storage-folder-api.service-D_fFEuO6.mjs.map → flusys-ng-storage-folder-api.service-5-wLOtDf.mjs.map} +1 -1
  9. package/fesm2022/{flusys-ng-storage-folder-form.component-D9qZ47dk.mjs → flusys-ng-storage-folder-form.component-17UJpIi4.mjs} +5 -5
  10. package/fesm2022/{flusys-ng-storage-folder-form.component-D9qZ47dk.mjs.map → flusys-ng-storage-folder-form.component-17UJpIi4.mjs.map} +1 -1
  11. package/fesm2022/{flusys-ng-storage-folder-list.component-B0kQQRFm.mjs → flusys-ng-storage-folder-list.component-kK24TzQZ.mjs} +5 -5
  12. package/fesm2022/{flusys-ng-storage-folder-list.component-B0kQQRFm.mjs.map → flusys-ng-storage-folder-list.component-kK24TzQZ.mjs.map} +1 -1
  13. package/fesm2022/{flusys-ng-storage-storage-config-api.service-Bl4asniq.mjs → flusys-ng-storage-storage-config-api.service-BrkSaKHQ.mjs} +4 -4
  14. package/fesm2022/{flusys-ng-storage-storage-config-api.service-Bl4asniq.mjs.map → flusys-ng-storage-storage-config-api.service-BrkSaKHQ.mjs.map} +1 -1
  15. package/fesm2022/{flusys-ng-storage-storage-config-form.component-De5h8JY-.mjs → flusys-ng-storage-storage-config-form.component-C11jPE7f.mjs} +5 -5
  16. package/fesm2022/{flusys-ng-storage-storage-config-form.component-De5h8JY-.mjs.map → flusys-ng-storage-storage-config-form.component-C11jPE7f.mjs.map} +1 -1
  17. package/fesm2022/{flusys-ng-storage-storage-config-list.component-B6uawDtd.mjs → flusys-ng-storage-storage-config-list.component-Bm3gwdNT.mjs} +5 -5
  18. package/fesm2022/{flusys-ng-storage-storage-config-list.component-B6uawDtd.mjs.map → flusys-ng-storage-storage-config-list.component-Bm3gwdNT.mjs.map} +1 -1
  19. package/fesm2022/{flusys-ng-storage-storage-container.component-EWGNoozU.mjs → flusys-ng-storage-storage-container.component-shR0FO4s.mjs} +4 -4
  20. package/fesm2022/{flusys-ng-storage-storage-container.component-EWGNoozU.mjs.map → flusys-ng-storage-storage-container.component-shR0FO4s.mjs.map} +1 -1
  21. package/fesm2022/{flusys-ng-storage-upload.service-CIcEL_Kr.mjs → flusys-ng-storage-upload.service-CG6JyFMm.mjs} +5 -5
  22. package/fesm2022/{flusys-ng-storage-upload.service-CIcEL_Kr.mjs.map → flusys-ng-storage-upload.service-CG6JyFMm.mjs.map} +1 -1
  23. package/fesm2022/flusys-ng-storage.mjs +23 -23
  24. package/package.json +5 -5
@@ -1,4 +1,4 @@
1
- import { t as StorageConfigApiService } from "./flusys-ng-storage-storage-config-api.service-Bl4asniq.mjs";
1
+ import { t as StorageConfigApiService } from "./flusys-ng-storage-storage-config-api.service-BrkSaKHQ.mjs";
2
2
  import { BaseStoragePage, FileLocationEnum, STORAGE_PROVIDER_OPTIONS } from "./flusys-ng-storage.mjs";
3
3
  import * as i0 from "@angular/core";
4
4
  import { Component, computed, effect, inject, signal } from "@angular/core";
@@ -160,7 +160,7 @@ var StorageConfigFormComponent = class StorageConfigFormComponent extends BaseSt
160
160
  }
161
161
  static ɵfac = i0.ɵɵngDeclareFactory({
162
162
  minVersion: "12.0.0",
163
- version: "22.2.1",
163
+ version: "22.2.3",
164
164
  ngImport: i0,
165
165
  type: StorageConfigFormComponent,
166
166
  deps: [],
@@ -168,7 +168,7 @@ var StorageConfigFormComponent = class StorageConfigFormComponent extends BaseSt
168
168
  });
169
169
  static ɵcmp = i0.ɵɵngDeclareComponent({
170
170
  minVersion: "17.0.0",
171
- version: "22.2.1",
171
+ version: "22.2.3",
172
172
  type: StorageConfigFormComponent,
173
173
  isStandalone: true,
174
174
  selector: "lib-storage-config-form",
@@ -677,7 +677,7 @@ var StorageConfigFormComponent = class StorageConfigFormComponent extends BaseSt
677
677
  };
678
678
  i0.ɵɵngDeclareClassMetadata({
679
679
  minVersion: "12.0.0",
680
- version: "22.2.1",
680
+ version: "22.2.3",
681
681
  ngImport: i0,
682
682
  type: StorageConfigFormComponent,
683
683
  decorators: [{
@@ -1035,4 +1035,4 @@ i0.ɵɵngDeclareClassMetadata({
1035
1035
  });
1036
1036
  export { StorageConfigFormComponent };
1037
1037
 
1038
- //# sourceMappingURL=flusys-ng-storage-storage-config-form.component-De5h8JY-.mjs.map
1038
+ //# sourceMappingURL=flusys-ng-storage-storage-config-form.component-C11jPE7f.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage-storage-config-form.component-De5h8JY-.mjs","names":[],"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"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-storage-storage-config-form.component-C11jPE7f.mjs","names":[],"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"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as StorageConfigApiService } from "./flusys-ng-storage-storage-config-api.service-Bl4asniq.mjs";
1
+ import { t as StorageConfigApiService } from "./flusys-ng-storage-storage-config-api.service-BrkSaKHQ.mjs";
2
2
  import { BaseStorageListPage, getProviderIcon, getProviderLabelKey, getProviderSeverity } from "./flusys-ng-storage.mjs";
3
3
  import * as i0 from "@angular/core";
4
4
  import { Component, inject, signal } from "@angular/core";
@@ -51,7 +51,7 @@ var StorageConfigListComponent = class StorageConfigListComponent extends BaseSt
51
51
  }
52
52
  static ɵfac = i0.ɵɵngDeclareFactory({
53
53
  minVersion: "12.0.0",
54
- version: "22.2.1",
54
+ version: "22.2.3",
55
55
  ngImport: i0,
56
56
  type: StorageConfigListComponent,
57
57
  deps: null,
@@ -59,7 +59,7 @@ var StorageConfigListComponent = class StorageConfigListComponent extends BaseSt
59
59
  });
60
60
  static ɵcmp = i0.ɵɵngDeclareComponent({
61
61
  minVersion: "17.0.0",
62
- version: "22.2.1",
62
+ version: "22.2.3",
63
63
  type: StorageConfigListComponent,
64
64
  isStandalone: true,
65
65
  selector: "lib-storage-config-list",
@@ -410,7 +410,7 @@ var StorageConfigListComponent = class StorageConfigListComponent extends BaseSt
410
410
  };
411
411
  i0.ɵɵngDeclareClassMetadata({
412
412
  minVersion: "12.0.0",
413
- version: "22.2.1",
413
+ version: "22.2.3",
414
414
  ngImport: i0,
415
415
  type: StorageConfigListComponent,
416
416
  decorators: [{
@@ -573,4 +573,4 @@ i0.ɵɵngDeclareClassMetadata({
573
573
  });
574
574
  export { StorageConfigListComponent };
575
575
 
576
- //# sourceMappingURL=flusys-ng-storage-storage-config-list.component-B6uawDtd.mjs.map
576
+ //# sourceMappingURL=flusys-ng-storage-storage-config-list.component-Bm3gwdNT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage-storage-config-list.component-B6uawDtd.mjs","names":[],"sources":["../../../projects/ng-storage/pages/storage-config/storage-config-list.component.ts"],"sourcesContent":["import { Component, inject, signal } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n HasPermissionDirective,\n STORAGE_CONFIG_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport { IStorageConfig } from '../../interfaces/storage-config.interface';\nimport { StorageConfigApiService } from '../../services/storage-config-api.service';\nimport { BaseStorageListPage } from '../../utils/base-storage-page';\nimport {\n getProviderIcon,\n getProviderLabelKey,\n getProviderSeverity,\n} from '../../utils/storage-utils';\n\n@Component({\n selector: 'lib-storage-config-list',\n imports: [\n FButtonDirective,\n UiIconComponent,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n DatePipe,\n FormsModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\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.config.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 <div\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto\"\n >\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n <button\n fButton\n *hasPermission=\"STORAGE_CONFIG_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'storage.button.new.configuration' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"overflow-x-auto\">\n <f-table\n [value]=\"items()\"\n [loading]=\"isLoading()\"\n [paginator]=\"totalRecords() > 0\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'shared.name' | translate }}</th>\n <th>{{ 'storage.table.provider' | 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-config>\n <tr>\n <td>\n <div class=\"flex items-center gap-2\">\n <ui-icon [name]=\"getProviderIcon(config.storage)\"></ui-icon>\n <span class=\"truncate max-w-32 sm:max-w-none\">{{\n config.name\n }}</span>\n </div>\n </td>\n <td>\n <f-tag\n [value]=\"getProviderLabelKey(config.storage) | translate\"\n [severity]=\"getProviderSeverity(config.storage)\"\n />\n </td>\n <td class=\"hidden sm:table-cell\">\n {{ config.createdAt | date: 'short' }}\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"STORAGE_CONFIG_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (click)=\"onEdit(config.id)\"\n [fTooltip]=\"'shared.edit' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"STORAGE_CONFIG_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [disabled]=\"config.isDefault\"\n (click)=\"onDeleteConfig(config)\"\n [fTooltip]=\"\n (config.isDefault\n ? 'storage.config.default.delete.forbidden'\n : 'shared.delete'\n ) | translate\n \"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\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 {{\n (showCompanyInfo()\n ? 'storage.empty.configs.in.company'\n : 'storage.empty.configs'\n ) | translate\n }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class StorageConfigListComponent extends BaseStorageListPage<IStorageConfig> {\n readonly STORAGE_CONFIG_PERMISSIONS = STORAGE_CONFIG_PERMISSIONS;\n\n private readonly configService = inject(StorageConfigApiService);\n private readonly translateService = inject(TranslateService);\n\n readonly getProviderIcon = getProviderIcon;\n readonly getProviderLabelKey = getProviderLabelKey;\n readonly getProviderSeverity = getProviderSeverity;\n\n private readonly _searchTerm = signal('');\n readonly searchTerm = this._searchTerm.asReadonly();\n\n getResourceRoute(): string {\n return '/storage/configs';\n }\n\n override getDeleteConfirmMessage(config: IStorageConfig): string {\n return this.translateService.translate('shared.confirm.delete.item', {\n name: config.name,\n });\n }\n\n async loadData(): Promise<void> {\n const token = this.beginLoad();\n this.isLoading.set(true);\n try {\n const response = await this.configService.getAll(\n {\n pagination: this.getPaginationParams(),\n },\n this.searchTerm(),\n );\n if (!this.isLatestLoad(token)) return;\n if (response.success) {\n this.items.set(response.data ?? []);\n this.total.set(response.meta?.total ?? 0);\n }\n } catch {\n if (this.isLatestLoad(token)) {\n this.showError(\n this.translateService.translate('storage.config.load.failed'),\n );\n }\n } finally {\n if (this.isLatestLoad(token)) this.isLoading.set(false);\n }\n }\n\n onSearchChange(term: string): void {\n this._searchTerm.set(term);\n this.first.set(0);\n this.loadData();\n }\n\n onDeleteConfig(config: IStorageConfig): void {\n this.onDeleteAsync(\n config,\n (c) => c.id,\n (id) => this.configService.delete({ id, type: 'delete' }),\n {\n header: this.translateService.translate('storage.config.delete.title'),\n },\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-storage-storage-config-list.component-Bm3gwdNT.mjs","names":[],"sources":["../../../projects/ng-storage/pages/storage-config/storage-config-list.component.ts"],"sourcesContent":["import { Component, inject, signal } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport {\n HasPermissionDirective,\n STORAGE_CONFIG_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\nimport {\n FButtonDirective,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n UiIconComponent,\n} from '@flusys/ng-ui';\nimport { IStorageConfig } from '../../interfaces/storage-config.interface';\nimport { StorageConfigApiService } from '../../services/storage-config-api.service';\nimport { BaseStorageListPage } from '../../utils/base-storage-page';\nimport {\n getProviderIcon,\n getProviderLabelKey,\n getProviderSeverity,\n} from '../../utils/storage-utils';\n\n@Component({\n selector: 'lib-storage-config-list',\n imports: [\n FButtonDirective,\n UiIconComponent,\n IconFieldComponent,\n InputIconComponent,\n InputTextDirective,\n TableComponent,\n TagComponent,\n TooltipDirective,\n DatePipe,\n FormsModule,\n HasPermissionDirective,\n TranslatePipe,\n ],\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.config.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 <div\n class=\"flex flex-col sm:flex-row items-stretch sm:items-center gap-2 w-full sm:w-auto\"\n >\n <f-iconfield class=\"w-full sm:w-64\">\n <f-inputicon icon=\"search\" />\n <input\n fInputText\n type=\"text\"\n [ngModel]=\"searchTerm()\"\n (ngModelChange)=\"onSearchChange($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n [placeholder]=\"'shared.search' | translate\"\n class=\"w-full\"\n />\n </f-iconfield>\n <button\n fButton\n *hasPermission=\"STORAGE_CONFIG_PERMISSIONS.CREATE\"\n (click)=\"onCreate()\"\n class=\"w-full sm:w-auto\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'storage.button.new.configuration' | translate }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"overflow-x-auto\">\n <f-table\n [value]=\"items()\"\n [loading]=\"isLoading()\"\n [paginator]=\"totalRecords() > 0\"\n [rows]=\"pageSize()\"\n [totalRecords]=\"totalRecords()\"\n [lazy]=\"true\"\n (onLazyLoad)=\"onPageChange($event)\"\n [rowsPerPageOptions]=\"[10, 25, 50]\"\n [scrollable]=\"true\"\n >\n <ng-template #header>\n <tr>\n <th>{{ 'shared.name' | translate }}</th>\n <th>{{ 'storage.table.provider' | 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-config>\n <tr>\n <td>\n <div class=\"flex items-center gap-2\">\n <ui-icon [name]=\"getProviderIcon(config.storage)\"></ui-icon>\n <span class=\"truncate max-w-32 sm:max-w-none\">{{\n config.name\n }}</span>\n </div>\n </td>\n <td>\n <f-tag\n [value]=\"getProviderLabelKey(config.storage) | translate\"\n [severity]=\"getProviderSeverity(config.storage)\"\n />\n </td>\n <td class=\"hidden sm:table-cell\">\n {{ config.createdAt | date: 'short' }}\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n *hasPermission=\"STORAGE_CONFIG_PERMISSIONS.UPDATE\"\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n (click)=\"onEdit(config.id)\"\n [fTooltip]=\"'shared.edit' | translate\"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n *hasPermission=\"STORAGE_CONFIG_PERMISSIONS.DELETE\"\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [disabled]=\"config.isDefault\"\n (click)=\"onDeleteConfig(config)\"\n [fTooltip]=\"\n (config.isDefault\n ? 'storage.config.default.delete.forbidden'\n : 'shared.delete'\n ) | translate\n \"\n tooltipPosition=\"top\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\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 {{\n (showCompanyInfo()\n ? 'storage.empty.configs.in.company'\n : 'storage.empty.configs'\n ) | translate\n }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n `,\n})\nexport class StorageConfigListComponent extends BaseStorageListPage<IStorageConfig> {\n readonly STORAGE_CONFIG_PERMISSIONS = STORAGE_CONFIG_PERMISSIONS;\n\n private readonly configService = inject(StorageConfigApiService);\n private readonly translateService = inject(TranslateService);\n\n readonly getProviderIcon = getProviderIcon;\n readonly getProviderLabelKey = getProviderLabelKey;\n readonly getProviderSeverity = getProviderSeverity;\n\n private readonly _searchTerm = signal('');\n readonly searchTerm = this._searchTerm.asReadonly();\n\n getResourceRoute(): string {\n return '/storage/configs';\n }\n\n override getDeleteConfirmMessage(config: IStorageConfig): string {\n return this.translateService.translate('shared.confirm.delete.item', {\n name: config.name,\n });\n }\n\n async loadData(): Promise<void> {\n const token = this.beginLoad();\n this.isLoading.set(true);\n try {\n const response = await this.configService.getAll(\n {\n pagination: this.getPaginationParams(),\n },\n this.searchTerm(),\n );\n if (!this.isLatestLoad(token)) return;\n if (response.success) {\n this.items.set(response.data ?? []);\n this.total.set(response.meta?.total ?? 0);\n }\n } catch {\n if (this.isLatestLoad(token)) {\n this.showError(\n this.translateService.translate('storage.config.load.failed'),\n );\n }\n } finally {\n if (this.isLatestLoad(token)) this.isLoading.set(false);\n }\n }\n\n onSearchChange(term: string): void {\n this._searchTerm.set(term);\n this.first.set(0);\n this.loadData();\n }\n\n onDeleteConfig(config: IStorageConfig): void {\n this.onDeleteAsync(\n config,\n (c) => c.id,\n (id) => this.configService.delete({ id, type: 'delete' }),\n {\n header: this.translateService.translate('storage.config.delete.title'),\n },\n );\n }\n}\n"],"mappings":"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"}
@@ -36,7 +36,7 @@ var StorageContainerComponent = class StorageContainerComponent {
36
36
  })), ...ngDevMode ? [{ debugName: "visibleTabs" }] : /* istanbul ignore next */ []);
37
37
  static ɵfac = i0.ɵɵngDeclareFactory({
38
38
  minVersion: "12.0.0",
39
- version: "22.2.1",
39
+ version: "22.2.3",
40
40
  ngImport: i0,
41
41
  type: StorageContainerComponent,
42
42
  deps: [],
@@ -44,7 +44,7 @@ var StorageContainerComponent = class StorageContainerComponent {
44
44
  });
45
45
  static ɵcmp = i0.ɵɵngDeclareComponent({
46
46
  minVersion: "14.0.0",
47
- version: "22.2.1",
47
+ version: "22.2.3",
48
48
  type: StorageContainerComponent,
49
49
  isStandalone: true,
50
50
  selector: "lib-storage-container",
@@ -92,7 +92,7 @@ var StorageContainerComponent = class StorageContainerComponent {
92
92
  };
93
93
  i0.ɵɵngDeclareClassMetadata({
94
94
  minVersion: "12.0.0",
95
- version: "22.2.1",
95
+ version: "22.2.3",
96
96
  ngImport: i0,
97
97
  type: StorageContainerComponent,
98
98
  decorators: [{
@@ -121,4 +121,4 @@ i0.ɵɵngDeclareClassMetadata({
121
121
  });
122
122
  export { StorageContainerComponent };
123
123
 
124
- //# sourceMappingURL=flusys-ng-storage-storage-container.component-EWGNoozU.mjs.map
124
+ //# sourceMappingURL=flusys-ng-storage-storage-container.component-shR0FO4s.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage-storage-container.component-EWGNoozU.mjs","names":[],"sources":["../../../projects/ng-storage/pages/storage-container/storage-container.component.ts"],"sourcesContent":["import { Component, computed, inject } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport {\n FILE_PERMISSIONS,\n FOLDER_PERMISSIONS,\n PermissionValidatorService,\n RouterTabItem,\n RouterTabsComponent,\n STORAGE_CONFIG_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\n\ninterface ITab {\n id: string;\n labelKey: string;\n icon: string;\n route: string;\n permission: string;\n}\n\n/**\n * Storage Container Component\n *\n * Main container for Storage module with tab navigation\n * Routes: Files | Folders | Configurations\n * Tabs are filtered based on user permissions\n */\n@Component({\n selector: 'lib-storage-container',\n imports: [RouterOutlet, TranslatePipe, RouterTabsComponent],\n template: `\n <div class=\"p-2 sm:p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">{{ 'storage.title' | translate }}</h1>\n <p class=\"text-muted-color mt-1 text-sm sm:text-base\">{{ 'storage.subtitle' | translate }}</p>\n </div>\n\n <lib-router-tabs [tabs]=\"visibleTabs()\" class=\"mb-4\" />\n\n <router-outlet />\n </div>\n `,\n})\nexport class StorageContainerComponent {\n private readonly permissionValidator = inject(PermissionValidatorService);\n private readonly translateService = inject(TranslateService);\n\n /** All available tabs with required permissions */\n private readonly allTabs: ITab[] = [\n {\n id: 'files',\n labelKey: 'storage.file.title',\n icon: 'file',\n route: 'files',\n permission: FILE_PERMISSIONS.READ,\n },\n {\n id: 'folders',\n labelKey: 'storage.folder.title',\n icon: 'folder',\n route: 'folders',\n permission: FOLDER_PERMISSIONS.READ,\n },\n {\n id: 'configs',\n labelKey: 'storage.config.title',\n icon: 'cog',\n route: 'configs',\n permission: STORAGE_CONFIG_PERMISSIONS.READ,\n },\n ];\n\n /** Visible tabs based on user permissions */\n readonly visibleTabs = computed<RouterTabItem[]>(() =>\n this.allTabs\n .filter((tab) => this.permissionValidator.hasPermission(tab.permission))\n .map((tab) => ({\n id: tab.id,\n label: this.translateService.translate(tab.labelKey),\n icon: tab.icon,\n route: tab.route,\n })),\n );\n}\n"],"mappings":";;;;AA4CA,IAAa,4BAAb,MAAa,0BAAyB;CACnB,sBAAsB,OAAO,0BAA0B;CACvD,mBAAmB,OAAO,gBAAgB;CAG1C,UAAkB;EACjC;GACE,IAAI;GACJ,UAAU;GACV,MAAM;GACN,OAAO;GACP,YAAY,iBAAiB;EAC9B;EACD;GACE,IAAI;GACJ,UAAU;GACV,MAAM;GACN,OAAO;GACP,YAAY,mBAAmB;EAChC;EACD;GACE,IAAI;GACJ,UAAU;GACV,MAAM;GACN,OAAO;GACP,YAAY,2BAA2B;EACxC;CACF;CAGQ,cAAc,eACrB,KAAK,QACF,QAAQ,QAAQ,KAAK,oBAAoB,cAAc,IAAI,UAAU,CAAC,CAAC,CACvE,KAAK,SAAS;EACb,IAAI,IAAI;EACR,OAAO,KAAK,iBAAiB,UAAU,IAAI,QAAQ;EACnD,MAAM,IAAI;EACV,OAAO,IAAI;CACZ,EAAC,GACL,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAvCU,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAyB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAzB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAyB,cAAA;EAAA,UAAA;EAAA,UAAA;EAAA,UAb1B;;;;;;;;;;;;EAWT,UAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MAZS;IAAY,UAAA;IAAA,QAAA,CAAA,QAAA,kBAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,QAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAiB;IAAmB,UAAA;IAAA,QAAA,CAAA,MAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAlC;IAAa,MAAA;GAAA;EAAA;CAAA,CAAA;;AAc1B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAyB,YAAA,CAAA;EAhBrC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS;IAAC;IAAc;IAAe;GAAmB;GAC1D,UAAU;;;;;;;;;;;;EAYX,CAAA"}
1
+ {"version":3,"file":"flusys-ng-storage-storage-container.component-shR0FO4s.mjs","names":[],"sources":["../../../projects/ng-storage/pages/storage-container/storage-container.component.ts"],"sourcesContent":["import { Component, computed, inject } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport {\n FILE_PERMISSIONS,\n FOLDER_PERMISSIONS,\n PermissionValidatorService,\n RouterTabItem,\n RouterTabsComponent,\n STORAGE_CONFIG_PERMISSIONS,\n TranslatePipe,\n TranslateService,\n} from '@flusys/ng-shared';\n\ninterface ITab {\n id: string;\n labelKey: string;\n icon: string;\n route: string;\n permission: string;\n}\n\n/**\n * Storage Container Component\n *\n * Main container for Storage module with tab navigation\n * Routes: Files | Folders | Configurations\n * Tabs are filtered based on user permissions\n */\n@Component({\n selector: 'lib-storage-container',\n imports: [RouterOutlet, TranslatePipe, RouterTabsComponent],\n template: `\n <div class=\"p-2 sm:p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">{{ 'storage.title' | translate }}</h1>\n <p class=\"text-muted-color mt-1 text-sm sm:text-base\">{{ 'storage.subtitle' | translate }}</p>\n </div>\n\n <lib-router-tabs [tabs]=\"visibleTabs()\" class=\"mb-4\" />\n\n <router-outlet />\n </div>\n `,\n})\nexport class StorageContainerComponent {\n private readonly permissionValidator = inject(PermissionValidatorService);\n private readonly translateService = inject(TranslateService);\n\n /** All available tabs with required permissions */\n private readonly allTabs: ITab[] = [\n {\n id: 'files',\n labelKey: 'storage.file.title',\n icon: 'file',\n route: 'files',\n permission: FILE_PERMISSIONS.READ,\n },\n {\n id: 'folders',\n labelKey: 'storage.folder.title',\n icon: 'folder',\n route: 'folders',\n permission: FOLDER_PERMISSIONS.READ,\n },\n {\n id: 'configs',\n labelKey: 'storage.config.title',\n icon: 'cog',\n route: 'configs',\n permission: STORAGE_CONFIG_PERMISSIONS.READ,\n },\n ];\n\n /** Visible tabs based on user permissions */\n readonly visibleTabs = computed<RouterTabItem[]>(() =>\n this.allTabs\n .filter((tab) => this.permissionValidator.hasPermission(tab.permission))\n .map((tab) => ({\n id: tab.id,\n label: this.translateService.translate(tab.labelKey),\n icon: tab.icon,\n route: tab.route,\n })),\n );\n}\n"],"mappings":";;;;AA4CA,IAAa,4BAAb,MAAa,0BAAyB;CACnB,sBAAsB,OAAO,0BAA0B;CACvD,mBAAmB,OAAO,gBAAgB;CAG1C,UAAkB;EACjC;GACE,IAAI;GACJ,UAAU;GACV,MAAM;GACN,OAAO;GACP,YAAY,iBAAiB;EAC9B;EACD;GACE,IAAI;GACJ,UAAU;GACV,MAAM;GACN,OAAO;GACP,YAAY,mBAAmB;EAChC;EACD;GACE,IAAI;GACJ,UAAU;GACV,MAAM;GACN,OAAO;GACP,YAAY,2BAA2B;EACxC;CACF;CAGQ,cAAc,eACrB,KAAK,QACF,QAAQ,QAAQ,KAAK,oBAAoB,cAAc,IAAI,UAAU,CAAC,CAAC,CACvE,KAAK,SAAS;EACb,IAAI,IAAI;EACR,OAAO,KAAK,iBAAiB,UAAU,IAAI,QAAQ;EACnD,MAAM,IAAI;EACV,OAAO,IAAI;CACZ,EAAC,GACL,GAAA,YAAA,CAAA,EAAA,WAAA,cAAA,CAAA,+BAAA,CAAA,CAAA;CAvCU,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAyB,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAzB,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAyB,cAAA;EAAA,UAAA;EAAA,UAAA;EAAA,UAb1B;;;;;;;;;;;;EAWT,UAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MAZS;IAAY,UAAA;IAAA,QAAA,CAAA,QAAA,kBAAA;IAAA,SAAA;KAAA;KAAA;KAAA;KAAA;IAAA;IAAA,UAAA,CAAA,QAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAiB;IAAmB,UAAA;IAAA,QAAA,CAAA,MAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAlC;IAAa,MAAA;GAAA;EAAA;CAAA,CAAA;;AAc1B,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAyB,YAAA,CAAA;EAhBrC,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS;IAAC;IAAc;IAAe;GAAmB;GAC1D,UAAU;;;;;;;;;;;;EAYX,CAAA"}
@@ -1,4 +1,4 @@
1
- import { t as FileManagerApiService } from "./flusys-ng-storage-file-manager-api.service-DJ9uP3aN.mjs";
1
+ import { t as FileManagerApiService } from "./flusys-ng-storage-file-manager-api.service-BSooxN-R.mjs";
2
2
  import * as i0 from "@angular/core";
3
3
  import { Service, inject } from "@angular/core";
4
4
  import { BaseApiService, getDefaultStorageConfigId } from "@flusys/ng-core";
@@ -87,7 +87,7 @@ var UploadService = class UploadService extends BaseApiService {
87
87
  }
88
88
  static ɵfac = i0.ɵɵngDeclareFactory({
89
89
  minVersion: "12.0.0",
90
- version: "22.2.1",
90
+ version: "22.2.3",
91
91
  ngImport: i0,
92
92
  type: UploadService,
93
93
  deps: [],
@@ -95,14 +95,14 @@ var UploadService = class UploadService extends BaseApiService {
95
95
  });
96
96
  static ɵprov = i0.ɵɵngDeclareService({
97
97
  minVersion: "22.0.0",
98
- version: "22.2.1",
98
+ version: "22.2.3",
99
99
  ngImport: i0,
100
100
  type: UploadService
101
101
  });
102
102
  };
103
103
  i0.ɵɵngDeclareClassMetadata({
104
104
  minVersion: "12.0.0",
105
- version: "22.2.1",
105
+ version: "22.2.3",
106
106
  ngImport: i0,
107
107
  type: UploadService,
108
108
  decorators: [{ type: Service }],
@@ -110,4 +110,4 @@ i0.ɵɵngDeclareClassMetadata({
110
110
  });
111
111
  export { UploadService as t };
112
112
 
113
- //# sourceMappingURL=flusys-ng-storage-upload.service-CIcEL_Kr.mjs.map
113
+ //# sourceMappingURL=flusys-ng-storage-upload.service-CG6JyFMm.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-storage-upload.service-CIcEL_Kr.mjs","names":[],"sources":["../../../projects/ng-storage/services/upload.service.ts"],"sourcesContent":["import { inject, Service } from '@angular/core';\nimport { map, Observable, switchMap } from 'rxjs';\nimport { BaseApiService, getDefaultStorageConfigId } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport { IUploadOptionsDto, IUploadedFileInfo } from '../interfaces/upload.interface';\nimport { FileManagerApiService } from './file-manager-api.service';\nimport { ICreateFileManagerDto, IFileManager } from '../interfaces/file-manager.interface';\n\n/**\n * Upload Service - File upload/delete operations\n * Endpoint: POST /storage/upload/*\n */\n@Service()\nexport class UploadService extends BaseApiService {\n private readonly fileManagerApi = inject(FileManagerApiService);\n\n constructor() {\n super('storage');\n }\n\n /** Get default storage config ID from app config */\n getDefaultConfigId(): string | undefined {\n return getDefaultStorageConfigId(this.appConfig);\n }\n\n /** Upload single file - POST /storage/upload/single-file */\n uploadSingleFile(file: File, options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo>> {\n const formData = new FormData();\n formData.append('file', file);\n return this.http.post<ISingleResponse<IUploadedFileInfo>>(this.buildUploadUrl('single-file', options), formData);\n }\n\n /** Upload multiple files (max 50) - POST /storage/upload/multiple-file */\n uploadMultipleFiles(files: File[], options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo[]>> {\n const formData = new FormData();\n files.forEach((file) => formData.append('files', file));\n return this.http.post<ISingleResponse<IUploadedFileInfo[]>>(this.buildUploadUrl('multiple-file', options), formData);\n }\n\n /** Delete single file - POST /storage/upload/delete-single-file */\n deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-single-file'),\n this.buildDeleteBody({ key }, storageConfigId),\n );\n }\n\n /** Delete multiple files - POST /storage/upload/delete-multiple-file */\n deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-multiple-file'),\n this.buildDeleteBody({ keys }, storageConfigId),\n );\n }\n\n /** Get file download URL - GET /storage/upload/file/:filePath */\n getFileUrl(key: string): string {\n return this.getUrl(`upload/file/${key}`);\n }\n\n /** Upload file and register in file manager - returns file manager ID (UUID) */\n uploadAndRegister(\n file: File,\n options?: IUploadOptionsDto & { isPrivate?: boolean; folderId?: string },\n ): Observable<ISingleResponse<IFileManager>> {\n return this.uploadSingleFile(file, options).pipe(\n switchMap((response) => {\n if (!response.success || !response.data) {\n throw new Error(response.message || 'upload.failed');\n }\n return this.fileManagerApi.createFile(this.toCreateFileDto(response.data, options));\n }),\n );\n }\n\n /** Upload multiple files and register in file manager - batch upload (2 API calls total) */\n uploadAndRegisterMultiple(\n files: File[],\n options?: IUploadOptionsDto & { isPrivate?: boolean; folderId?: string },\n ): Observable<ISingleResponse<IFileManager[]>> {\n return this.uploadMultipleFiles(files, options).pipe(\n switchMap((response) => {\n if (!response.success || !response.data) {\n throw new Error(response.message || 'upload.failed');\n }\n const dtos = response.data.map((fileInfo) => this.toCreateFileDto(fileInfo, options));\n return this.fileManagerApi.createFiles(dtos).pipe(\n map((bulkResponse) => ({\n success: bulkResponse.success,\n data: bulkResponse.data ?? [],\n message: bulkResponse.message,\n })),\n );\n }),\n );\n }\n\n // ─── Private Helpers ───────────────────────────────────────────────────────\n\n private resolveConfigId(storageConfigId?: string): string | undefined {\n return storageConfigId ?? this.getDefaultConfigId();\n }\n\n private toCreateFileDto(\n fileInfo: IUploadedFileInfo,\n options?: { isPrivate?: boolean; folderId?: string; storageConfigId?: string },\n ): ICreateFileManagerDto {\n return {\n name: fileInfo.name,\n key: fileInfo.key,\n size: String(fileInfo.size),\n contentType: fileInfo.contentType,\n isPrivate: options?.isPrivate ?? false,\n folderId: options?.folderId,\n storageConfigId: this.resolveConfigId(options?.storageConfigId),\n };\n }\n\n private buildUploadUrl(endpoint: string, options?: IUploadOptionsDto): string {\n const params = this.buildQueryParams(options);\n const baseUrl = this.getUrl(`upload/${endpoint}`);\n return params ? `${baseUrl}?${params}` : baseUrl;\n }\n\n private buildQueryParams(options?: IUploadOptionsDto): string {\n const params = new URLSearchParams();\n const configId = this.resolveConfigId(options?.storageConfigId);\n\n if (configId) params.append('storageConfigId', configId);\n if (options?.folderPath) params.append('folderPath', options.folderPath);\n if (options?.maxWidth) params.append('maxWidth', options.maxWidth.toString());\n if (options?.maxHeight) params.append('maxHeight', options.maxHeight.toString());\n if (options?.quality) params.append('quality', options.quality.toString());\n if (options?.format) params.append('format', options.format);\n if (options?.compress !== undefined) params.append('compress', options.compress.toString());\n\n return params.toString();\n }\n\n private buildDeleteBody(data: { key?: string; keys?: string[] }, storageConfigId?: string): Record<string, unknown> {\n const configId = this.resolveConfigId(storageConfigId);\n return { ...data, ...(configId && { storageConfigId: configId }) };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-storage-upload.service-CG6JyFMm.mjs","names":[],"sources":["../../../projects/ng-storage/services/upload.service.ts"],"sourcesContent":["import { inject, Service } from '@angular/core';\nimport { map, Observable, switchMap } from 'rxjs';\nimport { BaseApiService, getDefaultStorageConfigId } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport { IUploadOptionsDto, IUploadedFileInfo } from '../interfaces/upload.interface';\nimport { FileManagerApiService } from './file-manager-api.service';\nimport { ICreateFileManagerDto, IFileManager } from '../interfaces/file-manager.interface';\n\n/**\n * Upload Service - File upload/delete operations\n * Endpoint: POST /storage/upload/*\n */\n@Service()\nexport class UploadService extends BaseApiService {\n private readonly fileManagerApi = inject(FileManagerApiService);\n\n constructor() {\n super('storage');\n }\n\n /** Get default storage config ID from app config */\n getDefaultConfigId(): string | undefined {\n return getDefaultStorageConfigId(this.appConfig);\n }\n\n /** Upload single file - POST /storage/upload/single-file */\n uploadSingleFile(file: File, options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo>> {\n const formData = new FormData();\n formData.append('file', file);\n return this.http.post<ISingleResponse<IUploadedFileInfo>>(this.buildUploadUrl('single-file', options), formData);\n }\n\n /** Upload multiple files (max 50) - POST /storage/upload/multiple-file */\n uploadMultipleFiles(files: File[], options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo[]>> {\n const formData = new FormData();\n files.forEach((file) => formData.append('files', file));\n return this.http.post<ISingleResponse<IUploadedFileInfo[]>>(this.buildUploadUrl('multiple-file', options), formData);\n }\n\n /** Delete single file - POST /storage/upload/delete-single-file */\n deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-single-file'),\n this.buildDeleteBody({ key }, storageConfigId),\n );\n }\n\n /** Delete multiple files - POST /storage/upload/delete-multiple-file */\n deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-multiple-file'),\n this.buildDeleteBody({ keys }, storageConfigId),\n );\n }\n\n /** Get file download URL - GET /storage/upload/file/:filePath */\n getFileUrl(key: string): string {\n return this.getUrl(`upload/file/${key}`);\n }\n\n /** Upload file and register in file manager - returns file manager ID (UUID) */\n uploadAndRegister(\n file: File,\n options?: IUploadOptionsDto & { isPrivate?: boolean; folderId?: string },\n ): Observable<ISingleResponse<IFileManager>> {\n return this.uploadSingleFile(file, options).pipe(\n switchMap((response) => {\n if (!response.success || !response.data) {\n throw new Error(response.message || 'upload.failed');\n }\n return this.fileManagerApi.createFile(this.toCreateFileDto(response.data, options));\n }),\n );\n }\n\n /** Upload multiple files and register in file manager - batch upload (2 API calls total) */\n uploadAndRegisterMultiple(\n files: File[],\n options?: IUploadOptionsDto & { isPrivate?: boolean; folderId?: string },\n ): Observable<ISingleResponse<IFileManager[]>> {\n return this.uploadMultipleFiles(files, options).pipe(\n switchMap((response) => {\n if (!response.success || !response.data) {\n throw new Error(response.message || 'upload.failed');\n }\n const dtos = response.data.map((fileInfo) => this.toCreateFileDto(fileInfo, options));\n return this.fileManagerApi.createFiles(dtos).pipe(\n map((bulkResponse) => ({\n success: bulkResponse.success,\n data: bulkResponse.data ?? [],\n message: bulkResponse.message,\n })),\n );\n }),\n );\n }\n\n // ─── Private Helpers ───────────────────────────────────────────────────────\n\n private resolveConfigId(storageConfigId?: string): string | undefined {\n return storageConfigId ?? this.getDefaultConfigId();\n }\n\n private toCreateFileDto(\n fileInfo: IUploadedFileInfo,\n options?: { isPrivate?: boolean; folderId?: string; storageConfigId?: string },\n ): ICreateFileManagerDto {\n return {\n name: fileInfo.name,\n key: fileInfo.key,\n size: String(fileInfo.size),\n contentType: fileInfo.contentType,\n isPrivate: options?.isPrivate ?? false,\n folderId: options?.folderId,\n storageConfigId: this.resolveConfigId(options?.storageConfigId),\n };\n }\n\n private buildUploadUrl(endpoint: string, options?: IUploadOptionsDto): string {\n const params = this.buildQueryParams(options);\n const baseUrl = this.getUrl(`upload/${endpoint}`);\n return params ? `${baseUrl}?${params}` : baseUrl;\n }\n\n private buildQueryParams(options?: IUploadOptionsDto): string {\n const params = new URLSearchParams();\n const configId = this.resolveConfigId(options?.storageConfigId);\n\n if (configId) params.append('storageConfigId', configId);\n if (options?.folderPath) params.append('folderPath', options.folderPath);\n if (options?.maxWidth) params.append('maxWidth', options.maxWidth.toString());\n if (options?.maxHeight) params.append('maxHeight', options.maxHeight.toString());\n if (options?.quality) params.append('quality', options.quality.toString());\n if (options?.format) params.append('format', options.format);\n if (options?.compress !== undefined) params.append('compress', options.compress.toString());\n\n return params.toString();\n }\n\n private buildDeleteBody(data: { key?: string; keys?: string[] }, storageConfigId?: string): Record<string, unknown> {\n const configId = this.resolveConfigId(storageConfigId);\n return { ...data, ...(configId && { storageConfigId: configId }) };\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { t as FileManagerApiService } from "./flusys-ng-storage-file-manager-api.service-DJ9uP3aN.mjs";
2
- import { t as FolderApiService } from "./flusys-ng-storage-folder-api.service-D_fFEuO6.mjs";
3
- import { t as StorageConfigApiService } from "./flusys-ng-storage-storage-config-api.service-Bl4asniq.mjs";
4
- import { t as UploadService } from "./flusys-ng-storage-upload.service-CIcEL_Kr.mjs";
1
+ import { t as FileManagerApiService } from "./flusys-ng-storage-file-manager-api.service-BSooxN-R.mjs";
2
+ import { t as FolderApiService } from "./flusys-ng-storage-folder-api.service-5-wLOtDf.mjs";
3
+ import { t as StorageConfigApiService } from "./flusys-ng-storage-storage-config-api.service-BrkSaKHQ.mjs";
4
+ import { t as UploadService } from "./flusys-ng-storage-upload.service-CG6JyFMm.mjs";
5
5
  import * as i0 from "@angular/core";
6
6
  import { DestroyRef, Directive, Service, computed, inject, signal } from "@angular/core";
7
7
  import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
@@ -287,7 +287,7 @@ var BaseStoragePage = class BaseStoragePage {
287
287
  }
288
288
  static ɵfac = i0.ɵɵngDeclareFactory({
289
289
  minVersion: "12.0.0",
290
- version: "22.2.1",
290
+ version: "22.2.3",
291
291
  ngImport: i0,
292
292
  type: BaseStoragePage,
293
293
  deps: [],
@@ -295,7 +295,7 @@ var BaseStoragePage = class BaseStoragePage {
295
295
  });
296
296
  static ɵdir = i0.ɵɵngDeclareDirective({
297
297
  minVersion: "14.0.0",
298
- version: "22.2.1",
298
+ version: "22.2.3",
299
299
  type: BaseStoragePage,
300
300
  isStandalone: true,
301
301
  ngImport: i0
@@ -303,7 +303,7 @@ var BaseStoragePage = class BaseStoragePage {
303
303
  };
304
304
  i0.ɵɵngDeclareClassMetadata({
305
305
  minVersion: "12.0.0",
306
- version: "22.2.1",
306
+ version: "22.2.3",
307
307
  ngImport: i0,
308
308
  type: BaseStoragePage,
309
309
  decorators: [{ type: Directive }]
@@ -417,7 +417,7 @@ var BaseStorageListPage = class BaseStorageListPage {
417
417
  }
418
418
  static ɵfac = i0.ɵɵngDeclareFactory({
419
419
  minVersion: "12.0.0",
420
- version: "22.2.1",
420
+ version: "22.2.3",
421
421
  ngImport: i0,
422
422
  type: BaseStorageListPage,
423
423
  deps: [],
@@ -425,7 +425,7 @@ var BaseStorageListPage = class BaseStorageListPage {
425
425
  });
426
426
  static ɵdir = i0.ɵɵngDeclareDirective({
427
427
  minVersion: "14.0.0",
428
- version: "22.2.1",
428
+ version: "22.2.3",
429
429
  type: BaseStorageListPage,
430
430
  isStandalone: true,
431
431
  ngImport: i0
@@ -433,7 +433,7 @@ var BaseStorageListPage = class BaseStorageListPage {
433
433
  };
434
434
  i0.ɵɵngDeclareClassMetadata({
435
435
  minVersion: "12.0.0",
436
- version: "22.2.1",
436
+ version: "22.2.3",
437
437
  ngImport: i0,
438
438
  type: BaseStorageListPage,
439
439
  decorators: [{ type: Directive }]
@@ -529,7 +529,7 @@ var FileProviderAdapter = class FileProviderAdapter {
529
529
  });
530
530
  static ɵfac = i0.ɵɵngDeclareFactory({
531
531
  minVersion: "12.0.0",
532
- version: "22.2.1",
532
+ version: "22.2.3",
533
533
  ngImport: i0,
534
534
  type: FileProviderAdapter,
535
535
  deps: [],
@@ -537,7 +537,7 @@ var FileProviderAdapter = class FileProviderAdapter {
537
537
  });
538
538
  static ɵprov = i0.ɵɵngDeclareService({
539
539
  minVersion: "22.0.0",
540
- version: "22.2.1",
540
+ version: "22.2.3",
541
541
  ngImport: i0,
542
542
  type: FileProviderAdapter,
543
543
  autoProvided: false
@@ -545,7 +545,7 @@ var FileProviderAdapter = class FileProviderAdapter {
545
545
  };
546
546
  i0.ɵɵngDeclareClassMetadata({
547
547
  minVersion: "12.0.0",
548
- version: "22.2.1",
548
+ version: "22.2.3",
549
549
  ngImport: i0,
550
550
  type: FileProviderAdapter,
551
551
  decorators: [{
@@ -575,7 +575,7 @@ const STORAGE_ROUTES = [{
575
575
  ...SHARED_MESSAGES
576
576
  }
577
577
  }) },
578
- loadComponent: () => import("./flusys-ng-storage-storage-container.component-EWGNoozU.mjs").then((m) => m.StorageContainerComponent),
578
+ loadComponent: () => import("./flusys-ng-storage-storage-container.component-shR0FO4s.mjs").then((m) => m.StorageContainerComponent),
579
579
  children: [
580
580
  {
581
581
  path: "files",
@@ -583,17 +583,17 @@ const STORAGE_ROUTES = [{
583
583
  children: [
584
584
  {
585
585
  path: "",
586
- loadComponent: () => import("./flusys-ng-storage-file-manager-list.component-BjlsjxSH.mjs").then((m) => m.FileManagerListComponent)
586
+ loadComponent: () => import("./flusys-ng-storage-file-manager-list.component-BH_jro0g.mjs").then((m) => m.FileManagerListComponent)
587
587
  },
588
588
  {
589
589
  path: "new",
590
590
  canActivate: [permissionGuard(FILE_PERMISSIONS.CREATE)],
591
- loadComponent: () => import("./flusys-ng-storage-file-manager-form.component-Bvhewt3f.mjs").then((m) => m.FileManagerFormComponent)
591
+ loadComponent: () => import("./flusys-ng-storage-file-manager-form.component-B45INctA.mjs").then((m) => m.FileManagerFormComponent)
592
592
  },
593
593
  {
594
594
  path: ":id",
595
595
  canActivate: [permissionGuard(FILE_PERMISSIONS.UPDATE)],
596
- loadComponent: () => import("./flusys-ng-storage-file-manager-form.component-Bvhewt3f.mjs").then((m) => m.FileManagerFormComponent)
596
+ loadComponent: () => import("./flusys-ng-storage-file-manager-form.component-B45INctA.mjs").then((m) => m.FileManagerFormComponent)
597
597
  }
598
598
  ]
599
599
  },
@@ -603,17 +603,17 @@ const STORAGE_ROUTES = [{
603
603
  children: [
604
604
  {
605
605
  path: "",
606
- loadComponent: () => import("./flusys-ng-storage-folder-list.component-B0kQQRFm.mjs").then((m) => m.FolderListComponent)
606
+ loadComponent: () => import("./flusys-ng-storage-folder-list.component-kK24TzQZ.mjs").then((m) => m.FolderListComponent)
607
607
  },
608
608
  {
609
609
  path: "new",
610
610
  canActivate: [permissionGuard(FOLDER_PERMISSIONS.CREATE)],
611
- loadComponent: () => import("./flusys-ng-storage-folder-form.component-D9qZ47dk.mjs").then((m) => m.FolderFormComponent)
611
+ loadComponent: () => import("./flusys-ng-storage-folder-form.component-17UJpIi4.mjs").then((m) => m.FolderFormComponent)
612
612
  },
613
613
  {
614
614
  path: ":id",
615
615
  canActivate: [permissionGuard(FOLDER_PERMISSIONS.UPDATE)],
616
- loadComponent: () => import("./flusys-ng-storage-folder-form.component-D9qZ47dk.mjs").then((m) => m.FolderFormComponent)
616
+ loadComponent: () => import("./flusys-ng-storage-folder-form.component-17UJpIi4.mjs").then((m) => m.FolderFormComponent)
617
617
  }
618
618
  ]
619
619
  },
@@ -623,17 +623,17 @@ const STORAGE_ROUTES = [{
623
623
  children: [
624
624
  {
625
625
  path: "",
626
- loadComponent: () => import("./flusys-ng-storage-storage-config-list.component-B6uawDtd.mjs").then((m) => m.StorageConfigListComponent)
626
+ loadComponent: () => import("./flusys-ng-storage-storage-config-list.component-Bm3gwdNT.mjs").then((m) => m.StorageConfigListComponent)
627
627
  },
628
628
  {
629
629
  path: "new",
630
630
  canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.CREATE)],
631
- loadComponent: () => import("./flusys-ng-storage-storage-config-form.component-De5h8JY-.mjs").then((m) => m.StorageConfigFormComponent)
631
+ loadComponent: () => import("./flusys-ng-storage-storage-config-form.component-C11jPE7f.mjs").then((m) => m.StorageConfigFormComponent)
632
632
  },
633
633
  {
634
634
  path: ":id",
635
635
  canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.UPDATE)],
636
- loadComponent: () => import("./flusys-ng-storage-storage-config-form.component-De5h8JY-.mjs").then((m) => m.StorageConfigFormComponent)
636
+ loadComponent: () => import("./flusys-ng-storage-storage-config-form.component-C11jPE7f.mjs").then((m) => m.StorageConfigFormComponent)
637
637
  }
638
638
  ]
639
639
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flusys/ng-storage",
3
- "version": "9.2.1",
3
+ "version": "9.3.0",
4
4
  "description": "File storage module for FLUSYS Angular applications",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -8,10 +8,10 @@
8
8
  "@angular/core": ">=22.0.0",
9
9
  "@angular/forms": ">=22.0.0",
10
10
  "@angular/router": ">=22.0.0",
11
- "@flusys/ng-core": ">=9.2.1",
12
- "@flusys/ng-layout": ">=9.2.1",
13
- "@flusys/ng-shared": ">=9.2.1",
14
- "@flusys/ng-ui": ">=9.2.1",
11
+ "@flusys/ng-core": ">=9.3.0",
12
+ "@flusys/ng-layout": ">=9.3.0",
13
+ "@flusys/ng-shared": ">=9.3.0",
14
+ "@flusys/ng-ui": ">=9.3.0",
15
15
  "rxjs": "^7.8.0"
16
16
  },
17
17
  "dependencies": {