RED-3747: check pages not out of bounds, fix rectangle deletion time

This commit is contained in:
Dan Percic 2022-04-11 17:15:11 +03:00
parent a42c2364bc
commit ffac0fb420
4 changed files with 24 additions and 12 deletions

View File

@ -415,13 +415,11 @@ export class PdfViewerComponent extends AutoUnsubscribe implements OnInit, OnCha
const quads = [this._annotationDrawService.annotationToQuads(activeAnnotation)]; const quads = [this._annotationDrawService.annotationToQuads(activeAnnotation)];
const manualRedactionEntry = this._getManualRedaction({ [activePage]: quads }); const manualRedactionEntry = this._getManualRedaction({ [activePage]: quads });
this._cleanUpSelectionAndButtonState(); this._cleanUpSelectionAndButtonState();
this.pdfViewer.deleteAnnotations([activeAnnotation.Id]);
this.manualAnnotationRequested.emit({ manualRedactionEntry, type: 'REDACTION' }); this.manualAnnotationRequested.emit({ manualRedactionEntry, type: 'REDACTION' });
} }
private _cleanUpSelectionAndButtonState() { private _cleanUpSelectionAndButtonState() {
this.pdfViewer.deselectAllAnnotations();
this._headerConfigService.disable([HeaderElements.SHAPE_TOOL_GROUP_BUTTON]); this._headerConfigService.disable([HeaderElements.SHAPE_TOOL_GROUP_BUTTON]);
this._headerConfigService.enable([HeaderElements.SHAPE_TOOL_GROUP_BUTTON]); this._headerConfigService.enable([HeaderElements.SHAPE_TOOL_GROUP_BUTTON]);
} }

View File

@ -88,11 +88,16 @@
</div> </div>
<div *ngIf="isRectangle" class="apply-on-multiple-pages iqser-input-group w-450"> <div *ngIf="isRectangle" class="apply-on-multiple-pages iqser-input-group w-450">
<mat-checkbox #checkbox class="mb-15" color="primary"> <mat-checkbox
(change)="applyOnMultiplePages = !applyOnMultiplePages"
[checked]="applyOnMultiplePages"
class="mb-15"
color="primary"
>
{{ 'manual-annotation.dialog.content.apply-on-multiple-pages' | translate }} {{ 'manual-annotation.dialog.content.apply-on-multiple-pages' | translate }}
</mat-checkbox> </mat-checkbox>
<div *ngIf="checkbox.checked"> <div *ngIf="applyOnMultiplePages">
<input <input
[placeholder]="'manual-annotation.dialog.content.apply-on-multiple-pages-placeholder' | translate" [placeholder]="'manual-annotation.dialog.content.apply-on-multiple-pages-placeholder' | translate"
class="full-width" class="full-width"

View File

@ -3,7 +3,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry.wrapper'; import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry.wrapper';
import { JustificationsService } from '@services/entity-services/justifications.service'; import { JustificationsService } from '@services/entity-services/justifications.service';
import { Dictionary, Dossier, IAddRedactionRequest } from '@red/domain'; import { Dictionary, Dossier, File, IAddRedactionRequest } from '@red/domain';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import { DictionaryService } from '@services/entity-services/dictionary.service'; import { DictionaryService } from '@services/entity-services/dictionary.service';
import { BaseDialogComponent, CircleButtonTypes, Toaster } from '@iqser/common-ui'; import { BaseDialogComponent, CircleButtonTypes, Toaster } from '@iqser/common-ui';
@ -26,6 +26,7 @@ export class ManualAnnotationDialogComponent extends BaseDialogComponent impleme
isDictionaryRequest: boolean; isDictionaryRequest: boolean;
isFalsePositiveRequest: boolean; isFalsePositiveRequest: boolean;
isEditingSelectedText = false; isEditingSelectedText = false;
applyOnMultiplePages = false;
possibleDictionaries: Dictionary[] = []; possibleDictionaries: Dictionary[] = [];
legalOptions: LegalBasisOption[] = []; legalOptions: LegalBasisOption[] = [];
@ -41,7 +42,7 @@ export class ManualAnnotationDialogComponent extends BaseDialogComponent impleme
protected readonly _injector: Injector, protected readonly _injector: Injector,
protected readonly _toaster: Toaster, protected readonly _toaster: Toaster,
protected readonly _dialogRef: MatDialogRef<ManualAnnotationDialogComponent>, protected readonly _dialogRef: MatDialogRef<ManualAnnotationDialogComponent>,
@Inject(MAT_DIALOG_DATA) readonly data: { manualRedactionEntryWrapper: ManualRedactionEntryWrapper; dossierId: string }, @Inject(MAT_DIALOG_DATA) readonly data: { manualRedactionEntryWrapper: ManualRedactionEntryWrapper; dossierId: string; file: File },
) { ) {
super(_injector, _dialogRef); super(_injector, _dialogRef);
this._dossier = this._activeDossiersService.find(this.data.dossierId); this._dossier = this._activeDossiersService.find(this.data.dossierId);
@ -70,7 +71,7 @@ export class ManualAnnotationDialogComponent extends BaseDialogComponent impleme
} }
get disabled() { get disabled() {
return this.form.invalid; return this.form.invalid || (this.applyOnMultiplePages && !this.form.get('multiplePages')?.value);
} }
async ngOnInit() { async ngOnInit() {
@ -116,11 +117,14 @@ export class ManualAnnotationDialogComponent extends BaseDialogComponent impleme
const splitted = range.split('-'); const splitted = range.split('-');
const startPage = parseInt(splitted[0], 10); const startPage = parseInt(splitted[0], 10);
const endPage = splitted.length > 1 ? parseInt(splitted[1], 10) : startPage; const endPage = splitted.length > 1 ? parseInt(splitted[1], 10) : startPage;
if (!startPage || !endPage) { if (!startPage || !endPage || startPage > this.data.file.numberOfPages || endPage > this.data.file.numberOfPages) {
throw new Error(); throw new Error();
} }
for (let page = startPage; page <= endPage; page++) { for (let page = startPage; page <= endPage; page++) {
if (page === wrapper.manualRedactionEntry.positions[0].page) {
continue;
}
const manualRedactionEntry = { ...entry, positions: [{ ...quads, page }] }; const manualRedactionEntry = { ...entry, positions: [{ ...quads, page }] };
wrappers.push({ ...wrapper, manualRedactionEntry }); wrappers.push({ ...wrapper, manualRedactionEntry });
} }

View File

@ -250,13 +250,18 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
} }
openManualAnnotationDialog(manualRedactionEntryWrapper: ManualRedactionEntryWrapper) { openManualAnnotationDialog(manualRedactionEntryWrapper: ManualRedactionEntryWrapper) {
this._ngZone.run(() => { return this._ngZone.run(async () => {
const file = await this.state.file;
this.dialogRef = this._dialogService.openDialog( this.dialogRef = this._dialogService.openDialog(
'manualAnnotation', 'manualAnnotation',
null, null,
{ manualRedactionEntryWrapper, dossierId: this.dossierId }, { manualRedactionEntryWrapper, dossierId: this.dossierId, file },
async (wrappers: ManualRedactionEntryWrapper[]) => { (wrappers: ManualRedactionEntryWrapper[]) => {
const file = await this.state.file; const selectedAnnotations = this.pdf.annotationManager.getSelectedAnnotations();
if (selectedAnnotations.length > 0) {
this.pdf.deleteAnnotations([selectedAnnotations[0].Id]);
}
const add$ = this._manualRedactionService.addAnnotation( const add$ = this._manualRedactionService.addAnnotation(
wrappers.map(w => w.manualRedactionEntry).filter(e => e.positions[0].page <= file.numberOfPages), wrappers.map(w => w.manualRedactionEntry).filter(e => e.positions[0].page <= file.numberOfPages),
this.dossierId, this.dossierId,