From 5e0ca8a82af07815f26f628b3fbd7c2f2c089744 Mon Sep 17 00:00:00 2001 From: George Date: Fri, 28 Jul 2023 00:20:29 +0300 Subject: [PATCH] CM-343, add edit annotation dialog. Fix 7069 related bugs. --- .../edit-annotation-dialog.component.html | 51 ++++++++++++ .../edit-annotation-dialog.component.ts | 78 +++++++++++++++++++ .../edit-redaction-dialog.component.html | 2 +- .../edit-redaction-dialog.component.ts | 11 +-- .../file-preview/file-preview.module.ts | 2 + .../services/annotation-actions.service.ts | 32 +++++--- .../entity-services/dictionary.service.ts | 7 +- apps/red-ui/src/assets/i18n/scm/en.json | 14 ++-- 8 files changed, 164 insertions(+), 33 deletions(-) create mode 100644 apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.html create mode 100644 apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.ts diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.html b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.html new file mode 100644 index 000000000..edfd9e7ae --- /dev/null +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.html @@ -0,0 +1,51 @@ +
+
+
+ +
+
+ + {{ redactedText }} +
+ +
+ + + + + {{ displayedDictionaryLabel }} + + {{ dictionary.label }} + + + +
+ +
+ + +
+
+ +
+ + + +
+
+
+ + +
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.ts new file mode 100644 index 000000000..9aaba425f --- /dev/null +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component.ts @@ -0,0 +1,78 @@ +import { Component, OnInit } from '@angular/core'; +import { IconButtonTypes, IqserDialogComponent, IqserPermissionsService } from '@iqser/common-ui'; +import { Dictionary, Dossier, SuperTypes } from '@red/domain'; +import { FormBuilder, UntypedFormGroup } from '@angular/forms'; +import { Roles } from '@users/roles'; +import { JustificationsService } from '@services/entity-services/justifications.service'; +import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; +import { DictionaryService } from '@services/entity-services/dictionary.service'; +import { EditRedactionData, EditRedactResult } from '../../../utils/dialog-types'; + +@Component({ + templateUrl: 'edit-annotation-dialog.component.html', +}) +export class EditAnnotationDialogComponent + extends IqserDialogComponent + implements OnInit +{ + readonly roles = Roles; + readonly iconButtonTypes = IconButtonTypes; + readonly redactedText: string; + dictionaries: Dictionary[] = []; + form: UntypedFormGroup; + readonly #dossier: Dossier; + + constructor( + private readonly _justificationsService: JustificationsService, + private readonly _activeDossiersService: ActiveDossiersService, + private readonly _dictionaryService: DictionaryService, + private readonly _iqserPermissionsService: IqserPermissionsService, + private readonly _formBuilder: FormBuilder, + ) { + super(); + this.#dossier = _activeDossiersService.find(this.data.dossierId); + const annotations = this.data.annotations; + const firstEntry = annotations[0]; + this.redactedText = annotations.length === 1 ? firstEntry.value : null; + this.form = this.#getForm(); + } + + get displayedDictionaryLabel() { + const selectedDictionaryType = this.form.get('type').value; + if (selectedDictionaryType) { + return this.dictionaries.find(d => d.type === selectedDictionaryType)?.label ?? null; + } + return null; + } + + async ngOnInit(): Promise { + this.#setTypes(); + } + + reasonChanged() { + this.form.patchValue({ reason: this.dictionaries.find(d => d.type === SuperTypes.ManualRedaction) }); + } + + save(): void { + const value = this.form.value; + this.dialogRef.close({ + comment: value.comment, + type: value.type, + }); + } + + #setTypes() { + this.dictionaries = this._dictionaryService.getRedactionTypes(this.#dossier.dossierTemplateId); + } + + #getForm(): UntypedFormGroup { + return this._formBuilder.group({ + comment: [null], + type: [this.data.annotations[0].type], + }); + } + + #allRectangles() { + return this.data.annotations.reduce((acc, a) => acc && a.rectangle, true); + } +} diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.html b/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.html index 6abc135bf..e71ba716f 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.html +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.html @@ -11,7 +11,7 @@ {{ redactedText }} -
+
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts index 57ed4cc13..af8abc4f0 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/edit-redaction-dialog/edit-redaction-dialog.component.ts @@ -31,7 +31,7 @@ export class EditRedactionDialogComponent options: DetailsRadioOption[] | undefined; legalOptions: LegalBasisOption[] = []; dictionaries: Dictionary[] = []; - form!: UntypedFormGroup; + form: UntypedFormGroup; #applyToAllDossiers: boolean; readonly #dossier: Dossier; @@ -103,10 +103,6 @@ export class EditRedactionDialogComponent this.#setOptions(selectedDictionaryType); } - reasonChanged() { - this.form.patchValue({ reason: this.dictionaries.find(d => d.type === SuperTypes.ManualRedaction) }); - } - save(): void { const value = this.form.value; this.dialogRef.close({ @@ -125,18 +121,17 @@ export class EditRedactionDialogComponent #setOptions(type: string, reasonChanged = false) { const selectedDictionary = this.dictionaries.find(d => d.type === type); - const isManualRedaction = type === SuperTypes.ManualRedaction; this.options = getEditRedactionOptions( this.#dossier.dossierName, this.#applyToAllDossiers, selectedDictionary.dossierDictionaryOnly, this.isImage, - isManualRedaction, + this.isManualRedaction, ); this.form.patchValue( { option: - this.isImage || selectedDictionary.dossierDictionaryOnly || isManualRedaction || reasonChanged + this.isImage || selectedDictionary.dossierDictionaryOnly || this.isManualRedaction || reasonChanged ? this.options[0] : this.options[1], }, diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview.module.ts b/apps/red-ui/src/app/modules/file-preview/file-preview.module.ts index e8b48638e..271921eb0 100644 --- a/apps/red-ui/src/app/modules/file-preview/file-preview.module.ts +++ b/apps/red-ui/src/app/modules/file-preview/file-preview.module.ts @@ -70,6 +70,7 @@ import { AddHintDialogComponent } from './dialogs/add-hint-dialog/add-hint-dialo import { AddAnnotationDialogComponent } from './dialogs/docu-mine/add-annotation-dialog/add-annotation-dialog.component'; import { RemoveAnnotationDialogComponent } from './dialogs/docu-mine/remove-annotation-dialog/remove-annotation-dialog.component'; import { ResizeAnnotationDialogComponent } from './dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component'; +import { EditAnnotationDialogComponent } from './dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component'; import { EditRedactionDialogComponent } from './dialogs/edit-redaction-dialog/edit-redaction-dialog.component'; const routes: IqserRoutes = [ @@ -94,6 +95,7 @@ const dialogs = [ RssDialogComponent, RedactTextDialogComponent, EditRedactionDialogComponent, + EditAnnotationDialogComponent, AddHintDialogComponent, RemoveRedactionDialogComponent, AddAnnotationDialogComponent, diff --git a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts index c0a198595..9a7f5d81f 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts @@ -35,6 +35,7 @@ import { DossierTemplatesService } from '@services/dossier-templates/dossier-tem import { isJustOne, List, log } from '@iqser/common-ui/lib/utils'; import { PermissionsService } from '@services/permissions.service'; import { + EditRedactionData, RemoveRedactionData, RemoveRedactionPermissions, RemoveRedactionResult, @@ -46,6 +47,7 @@ import { RemoveAnnotationDialogComponent } from '../dialogs/docu-mine/remove-ann import { ResizeRedactionDialogComponent } from '../dialogs/resize-redaction-dialog/resize-redaction-dialog.component'; import { ResizeAnnotationDialogComponent } from '../dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component'; import { EditRedactionDialogComponent } from '../dialogs/edit-redaction-dialog/edit-redaction-dialog.component'; +import { EditAnnotationDialogComponent } from '../dialogs/docu-mine/edit-annotation-dialog/edit-annotation-dialog.component'; @Injectable() export class AnnotationActionsService { @@ -115,28 +117,27 @@ export class AnnotationActionsService { applyToAllDossiers: dossierTemplate.applyDictionaryUpdatesToAllDossiersByDefault, }; - const result = await this._iqserDialog.openDefault(EditRedactionDialogComponent, { data }).result(); + const result = await this.#getEditRedactionDialog(data).result(); const requests: Observable[] = []; if (!result) { return; } - - const changeLegalBasisBody = annotations.map(annotation => ({ - annotationId: annotation.id, - legalBasis: result.legalBasis, - section: result.section, - value: result.value, - })); - requests.push(this._manualRedactionService.changeLegalBasis(changeLegalBasisBody, dossierId, fileId)); - - if (result.typeChanged) { + if (!this.#isDocumine) { + const changeLegalBasisBody = annotations.map(annotation => ({ + annotationId: annotation.id, + legalBasis: result.legalBasis, + section: result.section, + value: result.value, + })); + requests.push(this._manualRedactionService.changeLegalBasis(changeLegalBasisBody, dossierId, fileId)); + } + if (result.typeChanged || this.#isDocumine) { const recategorizeBody: List = annotations.map(({ id }) => ({ annotationId: id, type: result.type, })); - console.log({ recategorizeBody }); requests.push(this._manualRedactionService.recategorizeRedactions(recategorizeBody, dossierId, fileId)); } @@ -464,4 +465,11 @@ export class AnnotationActionsService { } return this._iqserDialog.openDefault(ResizeRedactionDialogComponent, { data }); } + + #getEditRedactionDialog(data: EditRedactionData) { + if (this.#isDocumine) { + return this._iqserDialog.openDefault(EditAnnotationDialogComponent, { data }); + } + return this._iqserDialog.openDefault(EditRedactionDialogComponent, { data }); + } } diff --git a/apps/red-ui/src/app/services/entity-services/dictionary.service.ts b/apps/red-ui/src/app/services/entity-services/dictionary.service.ts index dd736ee84..879b22092 100644 --- a/apps/red-ui/src/app/services/entity-services/dictionary.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dictionary.service.ts @@ -164,13 +164,10 @@ export class DictionaryService extends EntitiesService } getEditableRedactionTypes(dossierTemplateId: string, isImage: boolean): Dictionary[] { + console.log(this._dictionariesMapService.get(dossierTemplateId)); return this._dictionariesMapService .get(dossierTemplateId) - .filter(d => - isImage - ? IMAGE_CATEGORIES.includes(d.type) - : (d.hasDictionary && !d.virtual && !d.systemManaged) || d.type === SuperTypes.ManualRedaction, - ) + .filter(d => (isImage ? IMAGE_CATEGORIES.includes(d.type) : d.hasDictionary && !d.virtual && !d.systemManaged)) .sort((a, b) => a.label.localeCompare(b.label)); } diff --git a/apps/red-ui/src/assets/i18n/scm/en.json b/apps/red-ui/src/assets/i18n/scm/en.json index 09c4cdf04..594768222 100644 --- a/apps/red-ui/src/assets/i18n/scm/en.json +++ b/apps/red-ui/src/assets/i18n/scm/en.json @@ -1207,12 +1207,12 @@ "edit-redaction": { "dialog": { "actions": { - "cancel": "", - "save": "" + "cancel": "Cancel", + "save": "Save changes" }, "content": { - "comment": "", - "comment-placeholder": "", + "comment": "Comment", + "comment-placeholder": "Add remarks or mentions ...", "legal-basis": "", "options": { "in-dossier": { @@ -1226,12 +1226,12 @@ } }, "reason": "", - "redacted-text": "", + "redacted-text": "Annotated text", "section": "", - "type": "" + "type": "Type" }, "title-edit-image": "", - "title-edit-text": "" + "title-edit-text": "Edit annotation" } }, "entities-listing": {