-
{{ file.fileAttributes.attributeIdToValue[config.id] || '-' }}
+
+
diff --git a/apps/red-ui/src/app/modules/dossier-overview/components/table-item/table-item.component.scss b/apps/red-ui/src/app/modules/dossier-overview/components/table-item/table-item.component.scss
index 396e6bfb4..4aa16c810 100644
--- a/apps/red-ui/src/app/modules/dossier-overview/components/table-item/table-item.component.scss
+++ b/apps/red-ui/src/app/modules/dossier-overview/components/table-item/table-item.component.scss
@@ -21,3 +21,10 @@
}
}
}
+
+.editable {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-start;
+ align-items: center;
+}
diff --git a/apps/red-ui/src/app/modules/dossier-overview/dialogs/edit-file-attribute-value-dialog/edit-file-attribute-value-dialog.component.html b/apps/red-ui/src/app/modules/dossier-overview/dialogs/edit-file-attribute-value-dialog/edit-file-attribute-value-dialog.component.html
new file mode 100644
index 000000000..75e0bb0f3
--- /dev/null
+++ b/apps/red-ui/src/app/modules/dossier-overview/dialogs/edit-file-attribute-value-dialog/edit-file-attribute-value-dialog.component.html
@@ -0,0 +1,28 @@
+
diff --git a/apps/red-ui/src/app/modules/dossier-overview/dialogs/edit-file-attribute-value-dialog/edit-file-attribute-value-dialog.component.ts b/apps/red-ui/src/app/modules/dossier-overview/dialogs/edit-file-attribute-value-dialog/edit-file-attribute-value-dialog.component.ts
new file mode 100644
index 000000000..0e686ed56
--- /dev/null
+++ b/apps/red-ui/src/app/modules/dossier-overview/dialogs/edit-file-attribute-value-dialog/edit-file-attribute-value-dialog.component.ts
@@ -0,0 +1,71 @@
+import { Component, Inject } from '@angular/core';
+import { File, IFileAttributeConfig } from '@red/domain';
+import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
+import { BaseDialogComponent } from '@iqser/common-ui';
+import { UntypedFormGroup } from '@angular/forms';
+import { firstValueFrom } from 'rxjs';
+import { FileAttributesService } from '@services/entity-services/file-attributes.service';
+import { FilesService } from '@services/files/files.service';
+
+export interface EditFileAttributeValueData {
+ readonly fileAttribute: IFileAttributeConfig;
+ readonly file: File;
+}
+
+@Component({
+ templateUrl: './edit-file-attribute-value-dialog.component.html',
+})
+export class EditFileAttributeValueDialogComponent extends BaseDialogComponent {
+ readonly #file: File;
+ readonly fileAttribute: IFileAttributeConfig;
+
+ constructor(
+ private readonly _fileAttributesService: FileAttributesService,
+ private readonly _filesService: FilesService,
+ protected readonly _dialogRef: MatDialogRef
,
+ @Inject(MAT_DIALOG_DATA) readonly data: EditFileAttributeValueData,
+ ) {
+ super(_dialogRef);
+
+ this.#file = data.file;
+ this.fileAttribute = data.fileAttribute;
+
+ if (this.#noFileAttributes) {
+ this.#initFileAttributes();
+ }
+
+ this.form = this.#getForm();
+ this.initialFormValue = this.form.getRawValue();
+ }
+
+ get #noFileAttributes(): boolean {
+ return JSON.stringify(this.#file.fileAttributes.attributeIdToValue) === '{}';
+ }
+
+ #initFileAttributes() {
+ const configs = this._fileAttributesService.getFileAttributeConfig(this.#file.dossierTemplateId).fileAttributeConfigs;
+ configs.forEach(config => (this.#file.fileAttributes.attributeIdToValue[config.id] = null));
+ }
+
+ #getForm(): UntypedFormGroup {
+ const config = {};
+ const fileAttributes = this.#file.fileAttributes.attributeIdToValue;
+ Object.keys(fileAttributes).forEach(key => {
+ config[key] = [fileAttributes[key]];
+ });
+ return this._formBuilder.group(config);
+ }
+
+ async save(): Promise {
+ try {
+ const attributeIdToValue = this.form.getRawValue();
+ await firstValueFrom(
+ this._fileAttributesService.setFileAttributes({ attributeIdToValue }, this.#file.dossierId, this.#file.fileId),
+ );
+ await firstValueFrom(this._filesService.reload(this.#file.dossierId, this.#file));
+ this._dialogRef.close(true);
+ } catch (e) {
+ this._dialogRef.close(false);
+ }
+ }
+}
diff --git a/apps/red-ui/src/app/modules/dossier-overview/dossier-overview.module.ts b/apps/red-ui/src/app/modules/dossier-overview/dossier-overview.module.ts
index bbd8b101c..faa4488b7 100644
--- a/apps/red-ui/src/app/modules/dossier-overview/dossier-overview.module.ts
+++ b/apps/red-ui/src/app/modules/dossier-overview/dossier-overview.module.ts
@@ -6,6 +6,7 @@ import {
IqserButtonsModule,
IqserHelpModeModule,
IqserIconsModule,
+ IqserInputsModule,
IqserListingModule,
IqserLoadingModule,
IqserPermissionsModule,
@@ -24,6 +25,8 @@ import { FileWorkloadComponent } from './components/table-item/file-workload/fil
import { WorkflowItemComponent } from './components/workflow-item/workflow-item.component';
import { DossierOverviewScreenHeaderComponent } from './components/screen-header/dossier-overview-screen-header.component';
import { ViewModeSelectionComponent } from './components/view-mode-selection/view-mode-selection.component';
+import { FileAttributeComponent } from './components/table-item/file-attribute/file-attribute.component';
+import { EditFileAttributeValueDialogComponent } from './dialogs/edit-file-attribute-value-dialog/edit-file-attribute-value-dialog.component';
const routes: Routes = [
{
@@ -36,13 +39,17 @@ const routes: Routes = [
},
];
+const dialogs = [EditFileAttributeValueDialogComponent];
+
@NgModule({
declarations: [
+ ...dialogs,
DossierOverviewScreenComponent,
DossierOverviewBulkActionsComponent,
DossierDetailsComponent,
DossierDetailsStatsComponent,
FileWorkloadComponent,
+ FileAttributeComponent,
TableItemComponent,
WorkflowItemComponent,
DossierOverviewScreenHeaderComponent,
@@ -63,6 +70,7 @@ const routes: Routes = [
IqserSharedModule,
IqserScrollbarModule,
IqserPermissionsModule,
+ IqserInputsModule,
],
})
export class DossierOverviewModule {}
diff --git a/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts b/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts
index a3ef1f066..6284c47e4 100644
--- a/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts
+++ b/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts
@@ -26,7 +26,11 @@ export class DatePipe extends BaseDatePipe implements PipeTransform {
return this._getExactDate(value);
}
}
- return super.transform(value, format, timezone, locale || this._translateService.currentLang);
+ try {
+ return super.transform(value, format, timezone, locale || this._translateService.currentLang);
+ } catch (e) {
+ return '-';
+ }
}
private _getTimeFromNow(value: string) {
diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json
index 317a036ff..3acc5a9bd 100644
--- a/apps/red-ui/src/assets/i18n/redact/de.json
+++ b/apps/red-ui/src/assets/i18n/redact/de.json
@@ -1152,6 +1152,13 @@
},
"side-nav-title": "Konfiguration"
},
+ "edit-file-attribute-value-dialog": {
+ "actions": {
+ "cancel": "",
+ "save": ""
+ },
+ "header": ""
+ },
"entities-listing": {
"action": {
"delete": "Wörterbuch löschen",
@@ -1228,6 +1235,15 @@
"number": "Nummer",
"text": "Freier Text"
},
+ "file-attribute": {
+ "actions": {
+ "edit": ""
+ },
+ "update": {
+ "error": "",
+ "success": ""
+ }
+ },
"file-attributes-configurations": {
"cancel": "",
"form": {
diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json
index 8d34f5731..327d32d4b 100644
--- a/apps/red-ui/src/assets/i18n/redact/en.json
+++ b/apps/red-ui/src/assets/i18n/redact/en.json
@@ -1152,6 +1152,13 @@
},
"side-nav-title": "Configurations"
},
+ "edit-file-attribute-value-dialog": {
+ "actions": {
+ "cancel": "Cancel",
+ "save": "Save"
+ },
+ "header": "Edit file attribute"
+ },
"entities-listing": {
"action": {
"delete": "Delete Entity",
@@ -1228,6 +1235,15 @@
"number": "Number",
"text": "Free Text"
},
+ "file-attribute": {
+ "actions": {
+ "edit": "Edit"
+ },
+ "update": {
+ "error": "Failed to update file attribute value!",
+ "success": "File attribute value has been updated successfully!"
+ }
+ },
"file-attributes-configurations": {
"cancel": "Cancel",
"form": {
diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json
index ed28e6911..06adc6cb3 100644
--- a/apps/red-ui/src/assets/i18n/scm/de.json
+++ b/apps/red-ui/src/assets/i18n/scm/de.json
@@ -1152,6 +1152,13 @@
},
"side-nav-title": "Konfiguration"
},
+ "edit-file-attribute-value-dialog": {
+ "actions": {
+ "cancel": "",
+ "save": ""
+ },
+ "header": ""
+ },
"entities-listing": {
"action": {
"delete": "Wörterbuch löschen",
@@ -1228,6 +1235,15 @@
"number": "Nummer",
"text": "Freier Text"
},
+ "file-attribute": {
+ "actions": {
+ "edit": ""
+ },
+ "update": {
+ "error": "",
+ "success": ""
+ }
+ },
"file-attributes-configurations": {
"cancel": "",
"form": {
diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json
index 9d87c1bc3..5a3190ba4 100644
--- a/apps/red-ui/src/assets/i18n/scm/en.json
+++ b/apps/red-ui/src/assets/i18n/scm/en.json
@@ -1152,6 +1152,13 @@
},
"side-nav-title": "Configurations"
},
+ "edit-file-attribute-value-dialog": {
+ "actions": {
+ "cancel": "Cancel",
+ "save": "Save"
+ },
+ "header": "Edit file attribute"
+ },
"entities-listing": {
"action": {
"delete": "Delete Entity",
@@ -1228,6 +1235,15 @@
"number": "Number",
"text": "Free Text"
},
+ "file-attribute": {
+ "actions": {
+ "edit": "Edit"
+ },
+ "update": {
+ "error": "Failed to update file attribute value!",
+ "success": "File attribute value has been updated successfully!"
+ }
+ },
"file-attributes-configurations": {
"cancel": "Cancel",
"form": {
diff --git a/libs/common-ui b/libs/common-ui
index 40e640bc6..484ff6eed 160000
--- a/libs/common-ui
+++ b/libs/common-ui
@@ -1 +1 @@
-Subproject commit 40e640bc62992879f3dbb2479f288beb27bbdf27
+Subproject commit 484ff6eed59fee2a35a61069943da2af46b3f17a