RED-5385 - Keep hidden text option in Edit Dossier dialog

This commit is contained in:
Valentin Mihai 2023-04-14 23:53:28 +03:00
parent d0bbc1f994
commit 5a1bf8a3be
10 changed files with 157 additions and 57 deletions

View File

@ -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({

View File

@ -17,24 +17,37 @@
></redaction-select>
</div>
<p class="heading">{{ 'dossier-watermark-selector.heading' | translate }}</p>
<ng-container *ngIf="ctx.existsWatermarks; else noWatermarks">
<redaction-watermark-selector
[dossierTemplateId]="dossier.dossierTemplateId"
[isReadonly]="!canEditDossier"
[label]="'dossier-watermark-selector.watermark' | translate"
formControlName="watermarkId"
>
</redaction-watermark-selector>
<div>
<div>
<p class="heading">{{ 'dossier-watermark-selector.heading' | translate }}</p>
<ng-container *ngIf="ctx.existsWatermarks; else noWatermarks">
<redaction-watermark-selector
[dossierTemplateId]="dossier.dossierTemplateId"
[isReadonly]="!canEditDossier"
[label]="'dossier-watermark-selector.watermark' | translate"
formControlName="watermarkId"
>
</redaction-watermark-selector>
<redaction-watermark-selector
[dossierTemplateId]="dossier.dossierTemplateId"
[isReadonly]="!canEditDossier"
[label]="'dossier-watermark-selector.preview' | translate"
formControlName="previewWatermarkId"
>
</redaction-watermark-selector>
</ng-container>
<redaction-watermark-selector
[dossierTemplateId]="dossier.dossierTemplateId"
[isReadonly]="!canEditDossier"
[label]="'dossier-watermark-selector.preview' | translate"
formControlName="previewWatermarkId"
>
</redaction-watermark-selector>
</ng-container>
</div>
<div>
<p class="heading">{{ 'documents-hidden-text-option.heading' | translate }}</p>
<div class="iqser-input-group">
<mat-checkbox color="primary" formControlName="keepHiddenText">
{{ 'documents-hidden-text-option.title' | translate }}
</mat-checkbox>
<div class="info mt-4">{{ 'documents-hidden-text-option.description' | translate }}</div>
</div>
</div>
</div>
<ng-template #noWatermarks>
<p class="no-watermark" [innerHTML]="'dossier-watermark-selector.no-watermark' | translate"></p>

View File

@ -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;
}

View File

@ -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<boolean>;
#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 =>

View File

@ -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!"

View File

@ -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!"

View File

@ -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": "",

View File

@ -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",

View File

@ -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 {

View File

@ -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;
}