diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts
index 49dbd4dea..cc7512862 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts
@@ -6,7 +6,7 @@ import { CircleButtonTypes, IconButtonTypes, LoadingService, Toaster } from '@iq
import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
import { DossierAttributesService } from '@services/entity-services/dossier-attributes.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
-import { firstValueFrom, forkJoin } from 'rxjs';
+import { firstValueFrom } from 'rxjs';
import dayjs from 'dayjs';
@Component({
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.html b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.html
index f11b0df05..50582da92 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.html
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.html
@@ -17,24 +17,37 @@
>
-
{{ 'dossier-watermark-selector.heading' | translate }}
-
-
-
+
+
+
{{ 'dossier-watermark-selector.heading' | translate }}
+
+
+
-
-
-
+
+
+
+
+
+
{{ 'documents-hidden-text-option.heading' | translate }}
+
+
+
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.scss b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.scss
index e00963652..82a878d75 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.scss
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.scss
@@ -9,6 +9,14 @@ form {
> div {
display: flex;
+
+ > div {
+ width: 50%;
+ }
+
+ > div:first-child {
+ margin-right: 16px;
+ }
}
}
@@ -20,3 +28,7 @@ form {
.no-watermark {
color: var(--iqser-grey-7);
}
+
+.info {
+ margin-left: 24px;
+}
diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts
index 421d67be3..715577fdb 100644
--- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts
+++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts
@@ -1,20 +1,24 @@
import { Component, Input, OnInit } from '@angular/core';
-import { Dossier, DownloadFileType, IReportTemplate } from '@red/domain';
+import { Dossier, DossierTemplate, DownloadFileType, IDossierTemplate, IReportTemplate } from '@red/domain';
import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
import { EditDossierSaveResult, EditDossierSectionInterface } from '../edit-dossier-section.interface';
import { downloadTypesTranslations } from '@translations/download-types-translations';
import { ReportTemplateService } from '@services/report-template.service';
import { PermissionsService } from '@services/permissions.service';
-import { firstValueFrom, Observable } from 'rxjs';
+import { firstValueFrom, forkJoin, Observable } from 'rxjs';
import { DossiersService } from '@services/dossiers/dossiers.service';
import { WatermarksMapService } from '@services/entity-services/watermarks-map.service';
import { ContextComponent, shareLast } from '@iqser/common-ui';
import { tap } from 'rxjs/operators';
+import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service';
interface EditDossierDownloadPackageContext {
existsWatermarks: boolean;
+ dossierTemplate: IDossierTemplate;
}
+const KEEP_HIDDEN_TEXT_KEY = 'keepHiddenText';
+
@Component({
selector: 'redaction-edit-dossier-download-package',
templateUrl: './edit-dossier-download-package.component.html',
@@ -35,11 +39,14 @@ export class EditDossierDownloadPackageComponent
#existsWatermarks$: Observable;
+ #dossierTemplate: DossierTemplate;
+
@Input() dossier: Dossier;
constructor(
private readonly _dossiersService: DossiersService,
private readonly _reportTemplateController: ReportTemplateService,
+ private readonly _dossierTemplatesService: DossierTemplatesService,
private readonly _formBuilder: UntypedFormBuilder,
private readonly _permissionsService: PermissionsService,
private readonly _watermarksMapService: WatermarksMapService,
@@ -61,21 +68,27 @@ export class EditDossierDownloadPackageComponent
}
for (const key of Object.keys(this.form.getRawValue())) {
- if (key.toLowerCase().includes('watermark')) {
- if (this.dossier[key] !== this.form.get(key).value) {
- return true;
- }
- } else {
- if (this.dossier[key].length !== this.form.get(key).value.length) {
- return true;
- }
- const originalItems = [...this.dossier[key]].sort();
- const newItems = [...this.form.get(key).value].sort();
-
- for (let idx = 0; idx < originalItems.length; ++idx) {
- if (originalItems[idx] !== newItems[idx]) {
+ if (key !== KEEP_HIDDEN_TEXT_KEY) {
+ if (key.toLowerCase().includes('watermark')) {
+ if (this.dossier[key] !== this.form.get(key).value) {
return true;
}
+ } else {
+ if (this.dossier[key].length !== this.form.get(key).value.length) {
+ return true;
+ }
+ const originalItems = [...this.dossier[key]].sort();
+ const newItems = [...this.form.get(key).value].sort();
+
+ for (let idx = 0; idx < originalItems.length; ++idx) {
+ if (originalItems[idx] !== newItems[idx]) {
+ return true;
+ }
+ }
+ }
+ } else {
+ if (this.#dossierTemplate.keepHiddenText !== this.form.get(KEEP_HIDDEN_TEXT_KEY).value) {
+ return true;
}
}
}
@@ -100,10 +113,16 @@ export class EditDossierDownloadPackageComponent
async ngOnInit() {
const dossierTemplateId = this.dossier.dossierTemplateId;
+ this.#dossierTemplate = this._dossierTemplatesService.find(dossierTemplateId);
+ const dossierTemplate$ = this._dossierTemplatesService
+ .getEntityChanged$(dossierTemplateId)
+ .pipe(tap(dossierTemplate => (this.#dossierTemplate = dossierTemplate)));
+
this.#existsWatermarks$ = this._watermarksMapService.watchChanged$(dossierTemplateId).pipe(shareLast());
super._initContext({
existsWatermarks: this.#existsWatermarks$,
+ dossierTemplate: dossierTemplate$,
});
this.availableReportTypes = (await this._reportTemplateController.getAvailableReportTemplates(dossierTemplateId)) || [];
@@ -123,8 +142,14 @@ export class EditDossierDownloadPackageComponent
previewWatermarkId: this.form.get('previewWatermarkId').value,
};
- const updatedDossier = await firstValueFrom(this._dossiersService.createOrUpdate(dossier));
- return { success: !!updatedDossier };
+ const dossierTemplate = {
+ ...this.#dossierTemplate,
+ keepHiddenText: this.form.get('keepHiddenText').value,
+ };
+
+ const updateDossier = await firstValueFrom(this._dossiersService.createOrUpdate(dossier));
+ const updateDossierTemplate = await this._dossierTemplatesService.createOrUpdate(dossierTemplate);
+ return { success: !!updateDossier && !!updateDossierTemplate };
}
revert() {
@@ -133,6 +158,7 @@ export class EditDossierDownloadPackageComponent
reportTemplateIds: this.dossier.reportTemplateIds,
watermarkId: this.dossier.watermarkId,
previewWatermarkId: this.dossier.previewWatermarkId,
+ keepHiddenText: [this.#dossierTemplate.keepHiddenText],
});
}
@@ -143,6 +169,7 @@ export class EditDossierDownloadPackageComponent
downloadFileTypes: [this.dossier.downloadFileTypes],
watermarkId: [this.dossier.watermarkId],
previewWatermarkId: [this.dossier.previewWatermarkId],
+ keepHiddenText: [this.#dossierTemplate.keepHiddenText],
},
{
validators: control =>
diff --git a/apps/red-ui/src/assets/i18n/redact/de.json b/apps/red-ui/src/assets/i18n/redact/de.json
index a115eb1a9..5fb62a42b 100644
--- a/apps/red-ui/src/assets/i18n/redact/de.json
+++ b/apps/red-ui/src/assets/i18n/redact/de.json
@@ -741,6 +741,11 @@
"save": "Dokumenteninformation speichern",
"title": "Datei-Attribute anlegen"
},
+ "documents-hidden-text-option": {
+ "description": "",
+ "heading": "",
+ "title": ""
+ },
"dossier-attribute-types": {
"date": "Datum",
"image": "Bild",
@@ -1217,6 +1222,17 @@
"title": "Hoppla! Etwas ist schief gelaufen..."
},
"exact-date": "{day} {month} {year} um {hour}:{minute} Uhr",
+ "false-positive-dialog": {
+ "actions": {
+ "cancel": "",
+ "save": ""
+ },
+ "content": {
+ "body-text": "",
+ "comment": ""
+ },
+ "header": ""
+ },
"file": "Datei",
"file-attribute-encoding-types": {
"ascii": "",
@@ -1994,17 +2010,6 @@
"annotations": "",
"title": ""
},
- "false-positive-dialog": {
- "actions": {
- "cancel": "",
- "save": ""
- },
- "content": {
- "comment": "",
- "body-text": ""
- },
- "header": ""
- },
"rules-screen": {
"error": {
"generic": "Es ist ein Fehler aufgetreten ... Die Regeln konnten nicht aktualisiert werden!"
diff --git a/apps/red-ui/src/assets/i18n/redact/en.json b/apps/red-ui/src/assets/i18n/redact/en.json
index 03b83ce1a..f0f2872a0 100644
--- a/apps/red-ui/src/assets/i18n/redact/en.json
+++ b/apps/red-ui/src/assets/i18n/redact/en.json
@@ -741,6 +741,11 @@
"save": "Save Document Info",
"title": "Enter File Attributes"
},
+ "documents-hidden-text-option": {
+ "description": "Hidden text is invisible to human readers but can be detected and read by software and machines. For example, the OCR output of scanned documents is stored as hidden text.",
+ "heading": "Hidden text on documents",
+ "title": "Keep hidden text in redacted documents"
+ },
"dossier-attribute-types": {
"date": "Date",
"image": "Image",
@@ -1217,6 +1222,17 @@
"title": "Oops! Something went wrong..."
},
"exact-date": "{day} {month} {year} at {hour}:{minute}",
+ "false-positive-dialog": {
+ "actions": {
+ "cancel": "Cancel",
+ "save": "Yes, proceed"
+ },
+ "content": {
+ "body-text": "''{value}'' is a false positive in this context: {context}",
+ "comment": "Comment"
+ },
+ "header": "False Positive"
+ },
"file": "File",
"file-attribute-encoding-types": {
"ascii": "ASCII",
@@ -1994,17 +2010,6 @@
"annotations": "",
"title": "Structured Component Management"
},
- "false-positive-dialog": {
- "actions": {
- "cancel": "Cancel",
- "save": "Yes, proceed"
- },
- "content": {
- "comment": "Comment",
- "body-text": "''{value}'' is a false positive in this context: {context}"
- },
- "header": "False Positive"
- },
"rules-screen": {
"error": {
"generic": "Something went wrong... Rules update failed!"
diff --git a/apps/red-ui/src/assets/i18n/scm/de.json b/apps/red-ui/src/assets/i18n/scm/de.json
index f9f3614b5..25b49dc1d 100644
--- a/apps/red-ui/src/assets/i18n/scm/de.json
+++ b/apps/red-ui/src/assets/i18n/scm/de.json
@@ -741,6 +741,11 @@
"save": "Dokumenteninformation speichern",
"title": "Datei-Attribute anlegen"
},
+ "documents-hidden-text-option": {
+ "description": "",
+ "heading": "",
+ "title": ""
+ },
"dossier-attribute-types": {
"date": "Datum",
"image": "Bild",
@@ -1217,6 +1222,17 @@
"title": "Hoppla! Etwas ist schief gelaufen..."
},
"exact-date": "{day} {month} {year} um {hour}:{minute} Uhr",
+ "false-positive-dialog": {
+ "actions": {
+ "cancel": "",
+ "save": ""
+ },
+ "content": {
+ "body-text": "",
+ "comment": ""
+ },
+ "header": ""
+ },
"file": "Datei",
"file-attribute-encoding-types": {
"ascii": "",
diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json
index 264f2d8c3..d4812c129 100644
--- a/apps/red-ui/src/assets/i18n/scm/en.json
+++ b/apps/red-ui/src/assets/i18n/scm/en.json
@@ -741,6 +741,11 @@
"save": "Save Document Info",
"title": "Enter File Attributes"
},
+ "documents-hidden-text-option": {
+ "description": "Hidden text is invisible to human readers but can be detected and read by software and machines. For example, the OCR output of scanned documents is stored as hidden text.",
+ "heading": "Hidden text on documents",
+ "title": "Keep hidden text in redacted documents"
+ },
"dossier-attribute-types": {
"date": "Date",
"image": "Image",
@@ -1217,6 +1222,17 @@
"title": "Oops! Something went wrong..."
},
"exact-date": "{day} {month} {year} at {hour}:{minute}",
+ "false-positive-dialog": {
+ "actions": {
+ "cancel": "",
+ "save": ""
+ },
+ "content": {
+ "body-text": "",
+ "comment": ""
+ },
+ "header": ""
+ },
"file": "File",
"file-attribute-encoding-types": {
"ascii": "ASCII",
diff --git a/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts b/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts
index 1fc314d9b..a651c491e 100644
--- a/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts
+++ b/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts
@@ -16,6 +16,7 @@ export class DossierTemplate implements IDossierTemplate, IListable {
readonly validFrom?: string;
readonly validTo?: string;
readonly dossierTemplateStatus: DossierTemplateStatus;
+ readonly keepHiddenText: boolean;
constructor(dossierTemplate: IDossierTemplate) {
this.createdBy = dossierTemplate.createdBy;
@@ -30,6 +31,7 @@ export class DossierTemplate implements IDossierTemplate, IListable {
this.validFrom = dossierTemplate.validFrom;
this.validTo = dossierTemplate.validTo;
this.dossierTemplateStatus = dossierTemplate.dossierTemplateStatus;
+ this.keepHiddenText = dossierTemplate.keepHiddenText;
}
get isActive(): boolean {
diff --git a/libs/red-domain/src/lib/dossier-templates/dossier-template.ts b/libs/red-domain/src/lib/dossier-templates/dossier-template.ts
index 054a7ab30..79ca93781 100644
--- a/libs/red-domain/src/lib/dossier-templates/dossier-template.ts
+++ b/libs/red-domain/src/lib/dossier-templates/dossier-template.ts
@@ -48,4 +48,8 @@ export interface IDossierTemplate {
*/
readonly validTo?: string;
readonly dossierTemplateStatus: DossierTemplateStatus;
+ /**
+ * Hidden text is invisible to human readers but can be detected and read by software and machines
+ */
+ readonly keepHiddenText: boolean;
}