diff --git a/apps/red-ui/src/app/modules/admin/admin.module.ts b/apps/red-ui/src/app/modules/admin/admin.module.ts index 8f417aab5..aee060360 100644 --- a/apps/red-ui/src/app/modules/admin/admin.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin.module.ts @@ -46,6 +46,7 @@ import { SmtpConfigService } from './services/smtp-config.service'; import { UploadDictionaryDialogComponent } from './dialogs/upload-dictionary-dialog/upload-dictionary-dialog.component'; import { GeneralConfigFormComponent } from './screens/general-config/general-config-form/general-config-form.component'; import { SmtpFormComponent } from './screens/general-config/smtp-form/smtp-form.component'; +import { FileAttributesConfigurationsDialogComponent } from './dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component'; import { SharedAdminModule } from './shared/shared-admin.module'; import { BaseDossierTemplateScreenComponent } from './base-dossier-templates-screen/base-dossier-template-screen.component'; @@ -58,6 +59,7 @@ const dialogs = [ SmtpAuthDialogComponent, AddEditUserDialogComponent, ConfirmDeleteUsersDialogComponent, + FileAttributesConfigurationsDialogComponent, FileAttributesCsvImportDialogComponent, AddEditDossierAttributeDialogComponent, UploadDictionaryDialogComponent, diff --git a/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.html b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.html new file mode 100644 index 000000000..8bdf5db9b --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.html @@ -0,0 +1,50 @@ +
+
+ +
+
+
+ {{ + 'file-attributes-configurations.form.support-csv-mapping' | translate + }} +
+ +
+ + +
+
+ + +
+
+ + + + {{ translations[type] | translate }} + + +
+
+
+
+ + +
+
+
+ + +
diff --git a/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.scss b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.ts new file mode 100644 index 000000000..c54b54bf6 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component.ts @@ -0,0 +1,75 @@ +import { ChangeDetectionStrategy, Component, Inject, Injector } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { FileAttributeEncodingTypes, IFileAttributesConfig } from '../../../../../../../../libs/red-domain/src'; +import { fileAttributeEncodingTypesTranslations } from '../../translations/file-attribute-encoding-types-translations'; +import { BaseDialogComponent, Toaster } from '../../../../../../../../libs/common-ui/src'; +import { DossierTemplatesService } from '../../../../services/entity-services/dossier-templates.service'; +import { firstValueFrom } from 'rxjs'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { FileAttributesService } from '../../../../services/entity-services/file-attributes.service'; + +@Component({ + templateUrl: './file-attributes-configurations-dialog.component.html', + styleUrls: ['./file-attributes-configurations-dialog.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class FileAttributesConfigurationsDialogComponent extends BaseDialogComponent { + private readonly _configuration: IFileAttributesConfig = this._data; + + readonly encodingTypeOptions = Object.keys(FileAttributeEncodingTypes); + readonly translations = fileAttributeEncodingTypesTranslations; + + constructor( + private readonly _formBuilder: FormBuilder, + private readonly _dossierTemplatesService: DossierTemplatesService, + private readonly _fileAttributesService: FileAttributesService, + private readonly _toaster: Toaster, + protected readonly _injector: Injector, + protected readonly _dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) private _data: IFileAttributesConfig, + ) { + super(_injector, _dialogRef); + this.form = this._getForm(); + this.initialFormValue = this.form.getRawValue(); + } + + get disabled() { + if (!this.changed) { + return true; + } + if (!this.form.get('supportCsvMapping').value) { + return false; + } + return !this.valid; + } + + async save() { + this._configuration.keyColumn = this.form.get('keyColumn').value; + this._configuration.delimiter = this.form.get('delimiter').value; + this._configuration.encoding = this.form.get('encodingType').value; + + try { + await firstValueFrom( + this._fileAttributesService.setFileAttributeConfig( + this._configuration, + this._dossierTemplatesService.activeDossierTemplateId, + ), + ); + this._toaster.success(_('file-attributes-configurations.update.success')); + } catch (e) { + this._toaster.error(_('file-attributes-configurations.update.error')); + } + + this._dialogRef.close(); + } + + private _getForm(): FormGroup { + return this._formBuilder.group({ + supportCsvMapping: [!!this._configuration.filenameMappingColumnHeaderName], + keyColumn: [this._configuration.keyColumn || '', [Validators.required]], + delimiter: [this._configuration.delimiter || '', [Validators.required]], + encodingType: [this._configuration.encoding || FileAttributeEncodingTypes['UTF-8'], [Validators.required]], + }); + } +} diff --git a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.html index d9746c4ff..b8df7eacf 100644 --- a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.html @@ -65,6 +65,15 @@ tooltipPosition="above" > + + { await firstValueFrom( this._fileAttributesService.setFileAttributesConfig(newValue, this._dossierTemplatesService.activeDossierTemplateId), diff --git a/apps/red-ui/src/app/modules/admin/services/admin-dialog.service.ts b/apps/red-ui/src/app/modules/admin/services/admin-dialog.service.ts index 41548f39a..7e31b7b0d 100644 --- a/apps/red-ui/src/app/modules/admin/services/admin-dialog.service.ts +++ b/apps/red-ui/src/app/modules/admin/services/admin-dialog.service.ts @@ -13,6 +13,7 @@ import { AddEditDossierAttributeDialogComponent } from '../dialogs/add-edit-doss import { ConfirmationDialogComponent, DialogConfig, DialogService, largeDialogConfig } from '@iqser/common-ui'; import { AddEditJustificationDialogComponent } from '../screens/justifications/add-edit-justification-dialog/add-edit-justification-dialog.component'; import { UploadDictionaryDialogComponent } from '../dialogs/upload-dictionary-dialog/upload-dictionary-dialog.component'; +import { FileAttributesConfigurationsDialogComponent } from '../dialogs/file-attributes-configurations-dialog/file-attributes-configurations-dialog.component'; type DialogType = | 'confirm' @@ -21,6 +22,7 @@ type DialogType = | 'addEditFileAttribute' | 'deleteAttribute' | 'importFileAttributes' + | 'fileAttributesConfigurations' | 'addEditUser' | 'deleteUsers' | 'smtpAuthConfig' @@ -52,6 +54,9 @@ export class AdminDialogService extends DialogService { component: ConfirmDeleteAttributeDialogComponent, dialogConfig: { disableClose: false }, }, + fileAttributesConfigurations: { + component: FileAttributesConfigurationsDialogComponent, + }, importFileAttributes: { component: FileAttributesCsvImportDialogComponent, dialogConfig: { ...largeDialogConfig, ...{ disableClose: false } }, diff --git a/apps/red-ui/src/app/modules/admin/translations/file-attribute-encoding-types-translations.ts b/apps/red-ui/src/app/modules/admin/translations/file-attribute-encoding-types-translations.ts new file mode 100644 index 000000000..d3f53ecd6 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/translations/file-attribute-encoding-types-translations.ts @@ -0,0 +1,8 @@ +import { FileAttributeEncodingType } from '@red/domain'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; + +export const fileAttributeEncodingTypesTranslations: { [key in FileAttributeEncodingType]: string } = { + 'UTF-8': _('file-attribute-encoding-types.utf8'), + ASCII: _('file-attribute-encoding-types.ascii'), + ISO: _('file-attribute-encoding-types.iso'), +}; diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index dd08da1a3..5f60b49ec 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -1006,12 +1006,32 @@ }, "exact-date": "{day} {month} {year} at {hour}:{minute}", "file": "File", + "file-attribute-encoding-types": { + "ascii": "ASCII", + "iso": "ISO", + "utf8": "UTF-8" + }, "file-attribute-types": { "date": "Date", "number": "Number", "text": "Free Text" }, "file-attributes": "File Attributes", + "file-attributes-configurations": { + "cancel": "Cancel", + "form": { + "delimiter": "Delimiter", + "encoding-type": "Encoding Type", + "key-column": "Key Column", + "support-csv-mapping": "Support CSV Mapping" + }, + "save": "Save Configurations", + "title": "Configurations", + "update": { + "error": "Failed to update the configuration!", + "success": "Configuration has been updated successfully!" + } + }, "file-attributes-csv-import": { "action": { "cancel-edit-name": "Cancel", @@ -1077,6 +1097,7 @@ "bulk-actions": { "delete": "Delete Selected Attributes" }, + "configurations": "Configurations", "error": { "conflict": "File-Attribute with this name already exists!", "generic": "Failed to add File-Attribute" diff --git a/libs/red-domain/src/lib/file-attributes/file-attribute-config.ts b/libs/red-domain/src/lib/file-attributes/file-attribute-config.ts index 2219fc90b..c6c824f8e 100644 --- a/libs/red-domain/src/lib/file-attributes/file-attribute-config.ts +++ b/libs/red-domain/src/lib/file-attributes/file-attribute-config.ts @@ -17,3 +17,10 @@ export const FileAttributeConfigTypes = { TEXT: 'TEXT', } as const; export type FileAttributeConfigType = keyof typeof FileAttributeConfigTypes; + +export const FileAttributeEncodingTypes = { + 'UTF-8': 'UTF-8', + ASCII: 'ASCII', + ISO: 'ISO', +} as const; +export type FileAttributeEncodingType = keyof typeof FileAttributeEncodingTypes; diff --git a/libs/red-domain/src/lib/file-attributes/file-attributes-config.ts b/libs/red-domain/src/lib/file-attributes/file-attributes-config.ts index 7aa96c500..bac991593 100644 --- a/libs/red-domain/src/lib/file-attributes/file-attributes-config.ts +++ b/libs/red-domain/src/lib/file-attributes/file-attributes-config.ts @@ -3,7 +3,7 @@ import { IFileAttributeConfig } from './file-attribute-config'; export interface IFileAttributesConfig { delimiter?: string; encoding?: string; + keyColumn?: string filenameMappingColumnHeaderName?: string; - fileAttributeConfigs?: IFileAttributeConfig[]; }