From 5a1bf8a3be3531429813510ec15e5d0b0411c331 Mon Sep 17 00:00:00 2001 From: Valentin Mihai Date: Fri, 14 Apr 2023 23:53:28 +0300 Subject: [PATCH] RED-5385 - Keep hidden text option in Edit Dossier dialog --- .../edit-dossier-attributes.component.ts | 2 +- ...it-dossier-download-package.component.html | 47 ++++++++------ ...it-dossier-download-package.component.scss | 12 ++++ ...edit-dossier-download-package.component.ts | 61 +++++++++++++------ apps/red-ui/src/assets/i18n/redact/de.json | 27 ++++---- apps/red-ui/src/assets/i18n/redact/en.json | 27 ++++---- apps/red-ui/src/assets/i18n/scm/de.json | 16 +++++ apps/red-ui/src/assets/i18n/scm/en.json | 16 +++++ .../dossier-template.model.ts | 2 + .../lib/dossier-templates/dossier-template.ts | 4 ++ 10 files changed, 157 insertions(+), 57 deletions(-) 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 }}

+
+ + {{ 'documents-hidden-text-option.title' | translate }} + +
{{ 'documents-hidden-text-option.description' | 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; }