From e5585290d06774ca334907e410d59b807d1c6bc8 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Wed, 16 Aug 2023 11:23:41 +0300 Subject: [PATCH] RED-7155 & DM-344 update resize dialog --- .../resize-annotation-dialog.component.html | 19 +-- .../resize-annotation-dialog.component.ts | 40 +++--- .../resize-redaction-dialog.component.html | 28 ++--- .../resize-redaction-dialog.component.ts | 54 ++++----- .../services/annotation-actions.service.ts | 114 +++++++++--------- .../services/manual-redaction.service.ts | 26 ++-- .../file-preview/utils/dialog-types.ts | 5 +- .../src/lib/redaction-log/resize.request.ts | 1 + 8 files changed, 131 insertions(+), 156 deletions(-) diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.html b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.html index f6fd4404d..43e9c5abc 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.html +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.html @@ -4,30 +4,15 @@
- + {{ redaction.value }}
- + {{ data.text }}
- -
- - - - - {{ displayedDictionaryLabel }} - - {{ redaction.entity.label }} - - - -
-
-
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.ts index 9f0bab091..91070e5c6 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/docu-mine/resize-annotation-dialog/resize-annotation-dialog.component.ts @@ -1,10 +1,9 @@ import { Component, OnInit } from '@angular/core'; +import { FormBuilder } from '@angular/forms'; import { IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui'; -import { FormBuilder, FormControl, UntypedFormGroup } from '@angular/forms'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; import { Dictionary, Dossier } from '@red/domain'; -import { Roles } from '@users/roles'; +import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; import { ResizeAnnotationData, ResizeAnnotationResult } from '../../../utils/dialog-types'; @@ -15,25 +14,20 @@ export class ResizeAnnotationDialogComponent extends IqserDialogComponent implements OnInit { - readonly roles = Roles; + readonly #dossier: Dossier; readonly iconButtonTypes = IconButtonTypes; - dictionaries: Dictionary[] = []; redaction: AnnotationWrapper; - form!: UntypedFormGroup; - - readonly #dossier: Dossier; + readonly form = this.#getForm(); constructor( - private readonly _activeDossiersService: ActiveDossiersService, + activeDossiersService: ActiveDossiersService, private readonly _dictionariesMapService: DictionariesMapService, private readonly _formBuilder: FormBuilder, ) { super(); - this.#dossier = _activeDossiersService.find(this.data.dossierId); + this.#dossier = activeDossiersService.find(this.data.dossierId); this.redaction = this.data.redaction; - - this.form = this.#getForm(); } get displayedDictionaryLabel() { @@ -44,23 +38,23 @@ export class ResizeAnnotationDialogComponent return null; } - async ngOnInit() { + ngOnInit() { this.dictionaries = this._dictionariesMapService.get(this.#dossier.dossierTemplateId); } - #getForm(): UntypedFormGroup { - return this._formBuilder.group({ - comment: [null], - dictionary: new FormControl({ value: this.redaction.entity.type, disabled: true }), + save() { + const formValue = this.form.getRawValue(); + + this.close({ + comment: formValue.comment, + updateDictionary: this.redaction.entity.hasDictionary, + addToAllDossiers: this.redaction.entity.hasDictionary, }); } - save(): void { - const formValue = this.form.getRawValue(); - - this.dialogRef.close({ - comment: formValue.comment, - updateDictionary: this.redaction.entity.hasDictionary, + #getForm() { + return this._formBuilder.group({ + comment: [null], }); } } diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.html b/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.html index 2f562a0b1..db747fce4 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.html +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.html @@ -7,31 +7,29 @@
- + {{ redaction.value }}
- + {{ data.text }}
- -
- +
+ - - - {{ displayedDictionaryLabel }} - - {{ redaction.entity.label }} - - - -
- + + + {{ displayedDictionaryLabel }} + + {{ redaction.entity.label }} + + + +
diff --git a/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.ts b/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.ts index 8d9fbbe37..527720627 100644 --- a/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/dialogs/resize-redaction-dialog/resize-redaction-dialog.component.ts @@ -1,13 +1,13 @@ import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; import { DetailsRadioOption, IconButtonTypes, IqserDialogComponent, IqserPermissionsService } from '@iqser/common-ui'; -import { ResizeRedactionData, ResizeRedactionResult } from '../../utils/dialog-types'; -import { FormBuilder, FormControl, UntypedFormGroup } from '@angular/forms'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { getResizeRedactionOptions, ResizeOptions, ResizeRedactionOption } from '../../utils/dialog-options'; -import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; import { Dictionary, Dossier } from '@red/domain'; -import { Roles } from '@users/roles'; +import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; +import { Roles } from '@users/roles'; +import { getResizeRedactionOptions, ResizeOptions, ResizeRedactionOption } from '../../utils/dialog-options'; +import { ResizeRedactionData, ResizeRedactionResult } from '../../utils/dialog-types'; @Component({ templateUrl: './resize-redaction-dialog.component.html', @@ -16,18 +16,18 @@ export class ResizeRedactionDialogComponent extends IqserDialogComponent implements OnInit { - readonly roles = Roles; - readonly iconButtonTypes = IconButtonTypes; - readonly options: DetailsRadioOption[]; - - dictionaries: Dictionary[] = []; - redaction: AnnotationWrapper; - form!: UntypedFormGroup; - - #applyToAllDossiers: boolean; - + readonly #applyToAllDossiers = this.data.applyToAllDossiers ?? true; readonly #dossier: Dossier; readonly #isRss = this._iqserPermissionsService.has(Roles.getRss); + readonly iconButtonTypes = IconButtonTypes; + readonly options: DetailsRadioOption[]; + dictionaries: Dictionary[] = []; + redaction: AnnotationWrapper; + form: FormGroup<{ + comment: FormControl; + dictionary: FormControl; + option: FormControl>; + }>; constructor( private readonly _activeDossiersService: ActiveDossiersService, @@ -37,7 +37,6 @@ export class ResizeRedactionDialogComponent ) { super(); this.#dossier = _activeDossiersService.find(this.data.dossierId); - this.#applyToAllDossiers = this.data.applyToAllDossiers ?? true; this.redaction = this.data.redaction; this.options = getResizeRedactionOptions( this.redaction, @@ -57,25 +56,26 @@ export class ResizeRedactionDialogComponent return null; } - async ngOnInit() { + ngOnInit() { this.dictionaries = this._dictionariesMapService.get(this.#dossier.dossierTemplateId); } - #getForm(): UntypedFormGroup { - return this._formBuilder.group({ - comment: [null], - dictionary: new FormControl({ value: this.redaction.entity.type, disabled: true }), - option: [this.options[0]], - }); - } - - save(): void { + save() { const formValue = this.form.getRawValue(); const updateDictionary = formValue.option.value === ResizeOptions.IN_DOSSIER; - this.dialogRef.close({ + super.close({ comment: formValue.comment, updateDictionary, + addToAllDossiers: !!formValue.option?.extraOption?.checked, + }); + } + + #getForm() { + return this._formBuilder.group({ + comment: [null], + dictionary: new FormControl({ value: this.redaction.entity.type, disabled: true }), + option: this.options[0], }); } } 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 06aeec728..ffa1e89be 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 @@ -1,8 +1,8 @@ import { Injectable } from '@angular/core'; -import { ManualRedactionService } from './manual-redaction.service'; +import { IqserDialog } from '@common-ui/dialog/iqser-dialog.service'; +import { getConfig } from '@iqser/common-ui'; +import { List, log } from '@iqser/common-ui/lib/utils'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { firstValueFrom, from, Observable, zip } from 'rxjs'; -import { getFirstRelevantTextPart } from '../../../utils'; import { Core } from '@pdftron/webviewer'; import { DictionaryEntryTypes, @@ -12,37 +12,35 @@ import { IRectangle, IResizeRequest, } from '@red/domain'; -import { toPosition } from '../utils/pdf-calculation.utils'; -import { AnnotationDrawService } from '../../pdf-viewer/services/annotation-draw.service'; -import { getConfig } from '@iqser/common-ui'; -import { MatDialog } from '@angular/material/dialog'; -import { FilePreviewStateService } from './file-preview-state.service'; -import { FilePreviewDialogService } from './file-preview-dialog.service'; -import { FileDataService } from './file-data.service'; -import { PdfViewer } from '../../pdf-viewer/services/pdf-viewer.service'; -import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service'; -import { SkippedService } from './skipped.service'; -import { REDDocumentViewer } from '../../pdf-viewer/services/document-viewer.service'; -import { RemoveRedactionDialogComponent } from '../dialogs/remove-redaction-dialog/remove-redaction-dialog.component'; -import { IqserDialog } from '@common-ui/dialog/iqser-dialog.service'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; -import { List, log } from '@iqser/common-ui/lib/utils'; import { PermissionsService } from '@services/permissions.service'; +import { firstValueFrom, from, Observable, zip } from 'rxjs'; +import { getFirstRelevantTextPart } from '../../../utils'; +import { AnnotationDrawService } from '../../pdf-viewer/services/annotation-draw.service'; +import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service'; +import { REDDocumentViewer } from '../../pdf-viewer/services/document-viewer.service'; +import { PdfViewer } from '../../pdf-viewer/services/pdf-viewer.service'; +import { EditAnnotationDialogComponent } from '../dialogs/docu-mine/edit-annotation-dialog/edit-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 { EditRedactionDialogComponent } from '../dialogs/edit-redaction-dialog/edit-redaction-dialog.component'; +import { RedactRecommendationDialogComponent } from '../dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component'; +import { RemoveRedactionDialogComponent } from '../dialogs/remove-redaction-dialog/remove-redaction-dialog.component'; +import { ResizeRedactionDialogComponent } from '../dialogs/resize-redaction-dialog/resize-redaction-dialog.component'; +import { RemoveRedactionOptions } from '../utils/dialog-options'; import { EditRedactionData, RemoveRedactionData, RemoveRedactionPermissions, RemoveRedactionResult, ResizeRedactionData, - ResizeRedactionResult, } from '../utils/dialog-types'; -import { RemoveRedactionOptions } from '../utils/dialog-options'; -import { RemoveAnnotationDialogComponent } from '../dialogs/docu-mine/remove-annotation-dialog/remove-annotation-dialog.component'; -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'; -import { RedactRecommendationDialogComponent } from '../dialogs/redact-recommendation-dialog/redact-recommendation-dialog.component'; +import { toPosition } from '../utils/pdf-calculation.utils'; +import { FileDataService } from './file-data.service'; +import { FilePreviewDialogService } from './file-preview-dialog.service'; +import { FilePreviewStateService } from './file-preview-state.service'; +import { ManualRedactionService } from './manual-redaction.service'; +import { SkippedService } from './skipped.service'; @Injectable() export class AnnotationActionsService { @@ -51,7 +49,6 @@ export class AnnotationActionsService { constructor( private readonly _manualRedactionService: ManualRedactionService, private readonly _dialogService: FilePreviewDialogService, - private readonly _dialog: MatDialog, private readonly _iqserDialog: IqserDialog, private readonly _pdf: PdfViewer, private readonly _documentViewer: REDDocumentViewer, @@ -119,6 +116,7 @@ export class AnnotationActionsService { if (!result) { return; } + if (!this.#isDocumine) { const changeLegalBasisBody = annotations.map(annotation => ({ annotationId: annotation.id, @@ -157,7 +155,7 @@ export class AnnotationActionsService { const data = { redaction, dossier: this._state.dossier(), - falsePositiveContext: this._getFalsePositiveText(redaction), + falsePositiveContext: this.#getFalsePositiveText(redaction), permissions: removePermissions, applyToAllDossiers: isApprover ? dossierTemplate.applyDictionaryUpdatesToAllDossiersByDefault : false, isApprover, @@ -165,15 +163,17 @@ export class AnnotationActionsService { const result = await this.#getRemoveRedactionDialog(data).result(); - if (result) { - if ( - result.option.value === RemoveRedactionOptions.FALSE_POSITIVE || - result.option.value === RemoveRedactionOptions.DO_NOT_RECOMMEND - ) { - this.#setAsFalsePositive(redaction, result); - } else { - this.#removeRedaction(redaction, result); - } + if (!result) { + return; + } + + if ( + result.option.value === RemoveRedactionOptions.FALSE_POSITIVE || + result.option.value === RemoveRedactionOptions.DO_NOT_RECOMMEND + ) { + this.#setAsFalsePositive(redaction, result); + } else { + this.#removeRedaction(redaction, result); } } @@ -208,7 +208,6 @@ export class AnnotationActionsService { const data = this.#getRedactRecommendationDialogData(recommendations); const dialog = this._iqserDialog.openDefault(RedactRecommendationDialogComponent, { data }); const result = await dialog.result(); - console.log(result); if (!result) { return; } @@ -217,7 +216,9 @@ export class AnnotationActionsService { this.cancelResize(recommendations[0]).then(); } - this.#processObsAndEmit(this._manualRedactionService.addRecommendation(recommendations, result.redaction, dossierId, fileId)); + return this.#processObsAndEmit( + this._manualRedactionService.addRecommendation(recommendations, result.redaction, dossierId, fileId), + ); } async resize(annotationWrapper: AnnotationWrapper) { @@ -264,23 +265,26 @@ export class AnnotationActionsService { dossierId: dossier.dossierId, }; - const result: ResizeRedactionResult = await this.#getResizeRedactionDialog(data).result(); + const result = await this.#getResizeRedactionDialog(data).result(); - if (result) { - const resizeRequest: IResizeRequest = { - annotationId: annotation.id, - comment: result.comment, - positions: textAndPositions.positions, - value: text, - updateDictionary: result.updateDictionary, - }; - - this.cancelResize(annotation).then(); - - const { fileId, dossierId } = this._state; - const request = this._manualRedactionService.resizeOrSuggestResize([resizeRequest], dossierId, fileId); - this.#processObsAndEmit(request); + if (!result) { + return; } + + const resizeRequest: IResizeRequest = { + annotationId: annotation.id, + comment: result.comment, + positions: textAndPositions.positions, + value: text, + updateDictionary: result.updateDictionary, + addToAllDossiers: result.addToAllDossiers, + }; + + await this.cancelResize(annotation); + + const { fileId, dossierId } = this._state; + const request = this._manualRedactionService.resize([resizeRequest], dossierId, fileId); + return this.#processObsAndEmit(request); } async cancelResize(annotationWrapper: AnnotationWrapper) { @@ -330,7 +334,7 @@ export class AnnotationActionsService { .catch(() => this._fileDataService.annotationsChanged()); } - private _getFalsePositiveText(annotation: AnnotationWrapper) { + #getFalsePositiveText(annotation: AnnotationWrapper) { if (!annotation.canBeMarkedAsFalsePositive) { return; } @@ -421,7 +425,7 @@ export class AnnotationActionsService { #setAsFalsePositive(redaction: AnnotationWrapper, dialogResult: RemoveRedactionResult) { const request = { sourceId: redaction.id, - value: this._getFalsePositiveText(redaction), + value: this.#getFalsePositiveText(redaction), type: redaction.type, positions: redaction.positions, addToDictionary: true, diff --git a/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts b/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts index c69052d07..2329b4354 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts @@ -1,4 +1,10 @@ +import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; import { Injectable } from '@angular/core'; +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { GenericService, IqserPermissionsService, Toaster } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; +import { type AnnotationWrapper } from '@models/file/annotation.wrapper'; +import { type ManualRedactionEntryType } from '@models/file/manual-redaction-entry.wrapper'; import type { DictionaryActions, Dossier, @@ -10,19 +16,13 @@ import type { IResizeRequest, ManualRedactionActions, } from '@red/domain'; -import { type AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { GenericService, IqserPermissionsService, Toaster } from '@iqser/common-ui'; -import { tap } from 'rxjs/operators'; +import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; import { PermissionsService } from '@services/permissions.service'; import { dictionaryActionsTranslations, manualRedactionActionsTranslations } from '@translations/annotation-actions-translations'; -import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; -import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; -import { type ManualRedactionEntryType } from '@models/file/manual-redaction-entry.wrapper'; -import { NGXLogger } from 'ngx-logger'; import { Roles } from '@users/roles'; +import { NGXLogger } from 'ngx-logger'; import { firstValueFrom, of } from 'rxjs'; -import { List } from '@iqser/common-ui/lib/utils'; +import { tap } from 'rxjs/operators'; function getResponseType(error: boolean, isConflict: boolean) { const isConflictError = isConflict ? 'conflictError' : 'error'; @@ -120,10 +120,6 @@ export class ManualRedactionService extends GenericService { return this.undo(annotationIds, dossierId, fileId).pipe(this.#showToast('undo', modifyDictionary)); } - resizeOrSuggestResize(requests: List, dossierId: string, fileId: string) { - return this.resize(requests, dossierId, fileId); - } - removeRedaction(body: List, dossierId: string, fileId: string, removeFromDictionary = false, isHint = false) { return this.remove(body, dossierId, fileId).pipe(this.#showToast(!isHint ? 'remove' : 'remove-hint', removeFromDictionary)); } @@ -149,10 +145,6 @@ export class ManualRedactionService extends GenericService { return this._post(body, `${this.#bulkRedaction}/recategorize/${dossierId}/${fileId}`).pipe(this.#log('Recategorize', body)); } - requestRecategorize(body: List, dossierId: string, fileId: string) { - return this._post(body, `${this.#bulkRequest}/recategorize/${dossierId}/${fileId}`).pipe(this.#log('Request recategorize', body)); - } - legalBasisChange(body: List, dossierId: string, fileId: string) { return this._post(body, `${this.#bulkRedaction}/legalBasisChange/${dossierId}/${fileId}`).pipe( this.#log('Legal basis change', body), diff --git a/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts b/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts index 808e4fc20..679285324 100644 --- a/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts +++ b/apps/red-ui/src/app/modules/file-preview/utils/dialog-types.ts @@ -1,7 +1,7 @@ +import { DetailsRadioOption } from '@iqser/common-ui'; +import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry.wrapper'; import { Dictionary, Dossier, File, IAddRedactionRequest, IManualRedactionEntry } from '@red/domain'; -import { AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { DetailsRadioOption } from '@iqser/common-ui'; import { RemoveRedactionOption } from './dialog-options'; export interface RedactTextData { @@ -60,6 +60,7 @@ export interface ResizeRedactionData extends ResizeAnnotationData { export interface ResizeAnnotationResult { comment: string; updateDictionary: boolean; + addToAllDossiers?: boolean; } export type ResizeRedactionResult = ResizeAnnotationResult; diff --git a/libs/red-domain/src/lib/redaction-log/resize.request.ts b/libs/red-domain/src/lib/redaction-log/resize.request.ts index 1d89f755b..b7ac16550 100644 --- a/libs/red-domain/src/lib/redaction-log/resize.request.ts +++ b/libs/red-domain/src/lib/redaction-log/resize.request.ts @@ -6,4 +6,5 @@ export interface IResizeRequest { positions: IRectangle[]; value: string; updateDictionary?: boolean; + addToAllDossiers?: boolean; }