diff --git a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts index 495eb2a96..140fe64c1 100644 --- a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts +++ b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts @@ -10,10 +10,8 @@ import { SharedModule } from '@shared/shared.module'; import { DossiersRoutingModule } from './dossiers-routing.module'; import { FileUploadDownloadModule } from '@upload-download/file-upload-download.module'; import { DossiersDialogService } from './services/dossiers-dialog.service'; -import { AnnotationActionsService } from './services/annotation-actions.service'; import { PdfViewerDataService } from './services/pdf-viewer-data.service'; import { ManualAnnotationService } from './services/manual-annotation.service'; -import { AnnotationDrawService } from './services/annotation-draw.service'; import { AnnotationProcessingService } from './services/annotation-processing.service'; import { EditDossierDialogComponent } from './dialogs/edit-dossier-dialog/edit-dossier-dialog.component'; import { EditDossierGeneralInfoComponent } from './dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component'; @@ -56,14 +54,7 @@ const components = [ ...dialogs, ]; -const services = [ - DossiersDialogService, - AnnotationActionsService, - ManualAnnotationService, - PdfViewerDataService, - AnnotationDrawService, - AnnotationProcessingService, -]; +const services = [DossiersDialogService, ManualAnnotationService, PdfViewerDataService, AnnotationProcessingService]; @NgModule({ declarations: [...components], diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-actions/annotation-actions.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-actions/annotation-actions.component.ts index e7f96a6e6..2dfa0851f 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-actions/annotation-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/annotation-actions/annotation-actions.component.ts @@ -2,7 +2,7 @@ import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { PermissionsService } from '@services/permissions.service'; import { AnnotationPermissions } from '@models/file/annotation.permissions'; -import { AnnotationActionsService } from '../../../../services/annotation-actions.service'; +import { AnnotationActionsService } from '../../services/annotation-actions.service'; import { WebViewerInstance } from '@pdftron/webviewer'; import { UserService } from '@services/user.service'; import { Dossier, File } from '@red/domain'; diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html index 157c9399d..720716f51 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.html @@ -217,9 +217,9 @@ diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts index 8f7c86e16..e6afc8d32 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/file-workload/file-workload.component.ts @@ -32,6 +32,7 @@ import { File, IViewedPage } from '@red/domain'; import { ExcludedPagesService } from '../../services/excluded-pages.service'; import { MultiSelectService } from '../../services/multi-select.service'; import { DocumentInfoService } from '../../services/document-info.service'; +import { SkippedService } from '../../services/skipped.service'; const COMMAND_KEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Escape']; const ALL_HOTKEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown']; @@ -53,14 +54,12 @@ export class FileWorkloadComponent { @Input() dialogRef: MatDialogRef; @Input() viewedPages: IViewedPage[]; @Input() file!: File; - @Input() hideSkipped: boolean; @Input() annotationActionsTemplate: TemplateRef; @Input() viewer: WebViewerInstance; @Output() readonly shouldDeselectAnnotationsOnPageChangeChange = new EventEmitter(); @Output() readonly selectAnnotations = new EventEmitter(); @Output() readonly deselectAnnotations = new EventEmitter(); @Output() readonly selectPage = new EventEmitter(); - @Output() readonly toggleSkipped = new EventEmitter(); @Output() readonly annotationsChanged = new EventEmitter(); displayedPages: number[] = []; pagesPanelActive = true; @@ -76,6 +75,7 @@ export class FileWorkloadComponent { readonly excludedPagesService: ExcludedPagesService, readonly multiSelectService: MultiSelectService, readonly documentInfoService: DocumentInfoService, + readonly skippedService: SkippedService, private readonly _permissionsService: PermissionsService, private readonly _changeDetectorRef: ChangeDetectorRef, private readonly _filterService: FilterService, diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/pdf-viewer/pdf-viewer.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/pdf-viewer/pdf-viewer.component.ts index 36310686b..1cb6893be 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/pdf-viewer/pdf-viewer.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/pdf-viewer/pdf-viewer.component.ts @@ -22,8 +22,8 @@ import { import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { ManualAnnotationService } from '../../../../services/manual-annotation.service'; import { environment } from '@environments/environment'; -import { AnnotationDrawService } from '../../../../services/annotation-draw.service'; -import { AnnotationActionsService } from '../../../../services/annotation-actions.service'; +import { AnnotationDrawService } from '../../services/annotation-draw.service'; +import { AnnotationActionsService } from '../../services/annotation-actions.service'; import { UserPreferenceService } from '@services/user-preference.service'; import { BASE_HREF } from '../../../../../../tokens'; import { ConfigService } from '@services/config.service'; diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html index 33575b2ea..ccc7b9f21 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html @@ -102,7 +102,6 @@ (deselectAnnotations)="deselectAnnotations($event)" (selectAnnotations)="selectAnnotations($event)" (selectPage)="selectPage($event)" - (toggleSkipped)="toggleSkipped($event)" *ngIf="!file.excluded" [(shouldDeselectAnnotationsOnPageChange)]="shouldDeselectAnnotationsOnPageChange" [activeViewerPage]="activeViewerPage" @@ -110,7 +109,6 @@ [annotations]="visibleAnnotations" [dialogRef]="dialogRef" [file]="file" - [hideSkipped]="hideSkipped" [selectedAnnotations]="selectedAnnotations" [viewedPages]="fileData?.viewedPages" [viewer]="activeViewer" diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts index 78783215f..f7175e113 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts @@ -21,7 +21,7 @@ import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { ManualAnnotationResponse } from '@models/file/manual-annotation-response'; import { FileDataModel } from '@models/file/file-data.model'; -import { AnnotationDrawService } from '../../services/annotation-draw.service'; +import { AnnotationDrawService } from './services/annotation-draw.service'; import { AnnotationProcessingService } from '../../services/annotation-processing.service'; import { Dossier, File, ViewMode } from '@red/domain'; import { PermissionsService } from '@services/permissions.service'; @@ -47,6 +47,8 @@ import { DocumentInfoService } from './services/document-info.service'; import { ReanalysisService } from '../../../../services/reanalysis.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { CommentingService } from './services/commenting.service'; +import { SkippedService } from './services/skipped.service'; +import { AnnotationActionsService } from './services/annotation-actions.service'; import Annotation = Core.Annotations.Annotation; import PDFNet = Core.PDFNet; @@ -55,7 +57,17 @@ const ALL_HOTKEY_ARRAY = ['Escape', 'F', 'f', 'ArrowUp', 'ArrowDown']; @Component({ templateUrl: './file-preview-screen.component.html', styleUrls: ['./file-preview-screen.component.scss'], - providers: [FilterService, ExcludedPagesService, ViewModeService, MultiSelectService, DocumentInfoService, CommentingService], + providers: [ + FilterService, + ExcludedPagesService, + ViewModeService, + MultiSelectService, + DocumentInfoService, + CommentingService, + SkippedService, + AnnotationDrawService, + AnnotationActionsService, + ], }) export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnInit, OnDestroy, OnAttach, OnDetach { readonly circleButtonTypes = CircleButtonTypes; @@ -65,7 +77,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni shouldDeselectAnnotationsOnPageChange = true; fileData: FileDataModel; selectedAnnotations: AnnotationWrapper[] = []; - hideSkipped = false; displayPdfViewer = false; activeViewerPage: number = null; @ViewChild(PdfViewerComponent) readonly viewerComponent: PdfViewerComponent; @@ -105,6 +116,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni private readonly _dossiersService: DossiersService, private readonly _reanalysisService: ReanalysisService, private readonly _errorService: ErrorService, + private readonly _skippedService: SkippedService, readonly excludedPagesService: ExcludedPagesService, readonly viewModeService: ViewModeService, readonly multiSelectService: MultiSelectService, @@ -422,16 +434,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni download(data, file.filename); } - toggleSkipped($event) { - $event.stopPropagation(); - $event.preventDefault(); - this.hideSkipped = !this.hideSkipped; - - this._handleIgnoreAnnotationsDrawing(); - - return false; - } - private _setActiveViewerPage() { const currentPage = this._instance?.Core.documentViewer?.getCurrentPage(); if (!currentPage) { @@ -548,6 +550,10 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni .watchDeleted$(this.fileId) .pipe(tap(() => this._handleDeletedFile())) .subscribe(); + + this.addActiveScreenSubscription = this._skippedService.hideSkipped$ + .pipe(tap(hideSkipped => this._handleIgnoreAnnotationsDrawing(hideSkipped))) + .subscribe(); } private _handleDeletedDossier(): void { @@ -632,7 +638,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni annotations, this.fileId, this.dossierId, - this.hideSkipped, !!this.viewModeService.isCompare, ); } @@ -674,9 +679,13 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni } } - private _handleIgnoreAnnotationsDrawing() { + private _handleIgnoreAnnotationsDrawing(hideSkipped: boolean): void { const ignored = this._getAnnotations(a => a.getCustomData('skipped')); - return this.hideSkipped ? this._hide(ignored) : this._show(ignored); + if (hideSkipped) { + this._hide(ignored); + } else { + this._show(ignored); + } } private _getAnnotations(predicate: (value) => unknown) { diff --git a/apps/red-ui/src/app/modules/dossier/services/annotation-actions.service.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-actions.service.ts similarity index 98% rename from apps/red-ui/src/app/modules/dossier/services/annotation-actions.service.ts rename to apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-actions.service.ts index 003b14a86..e02e796cd 100644 --- a/apps/red-ui/src/app/modules/dossier/services/annotation-actions.service.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-actions.service.ts @@ -1,19 +1,19 @@ import { EventEmitter, Inject, Injectable, NgZone } from '@angular/core'; import { PermissionsService } from '@services/permissions.service'; -import { ManualAnnotationService } from './manual-annotation.service'; +import { ManualAnnotationService } from '../../../services/manual-annotation.service'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { Observable } from 'rxjs'; import { TranslateService } from '@ngx-translate/core'; import { getFirstRelevantTextPart } from '@utils/functions'; import { AnnotationPermissions } from '@models/file/annotation.permissions'; -import { DossiersDialogService } from './dossiers-dialog.service'; -import { BASE_HREF } from '../../../tokens'; +import { DossiersDialogService } from '../../../services/dossiers-dialog.service'; +import { BASE_HREF } from '../../../../../tokens'; import { UserService } from '@services/user.service'; import { Core, WebViewerInstance } from '@pdftron/webviewer'; import { Dossier, File, IAddRedactionRequest, ILegalBasisChangeRequest, IRectangle, IResizeRequest } from '@red/domain'; -import { toPosition } from '../utils/pdf-calculation.utils'; +import { toPosition } from '../../../utils/pdf-calculation.utils'; import { AnnotationDrawService } from './annotation-draw.service'; -import { translateQuads } from '../../../utils'; +import { translateQuads } from '@utils/pdf-coordinates'; import { DossiersService } from '@services/entity-services/dossiers.service'; import Annotation = Core.Annotations.Annotation; diff --git a/apps/red-ui/src/app/modules/dossier/services/annotation-draw.service.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts similarity index 96% rename from apps/red-ui/src/app/modules/dossier/services/annotation-draw.service.ts rename to apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts index ecdccdbc9..760d08668 100644 --- a/apps/red-ui/src/app/modules/dossier/services/annotation-draw.service.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/annotation-draw.service.ts @@ -5,10 +5,11 @@ import { AppStateService } from '@state/app-state.service'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { UserPreferenceService } from '@services/user-preference.service'; import { DossiersService } from '@services/entity-services/dossiers.service'; -import { RedactionLogService } from './redaction-log.service'; +import { RedactionLogService } from '../../../services/redaction-log.service'; import { environment } from '@environments/environment'; import { IRectangle, ISectionGrid, ISectionRectangle } from '@red/domain'; +import { SkippedService } from './skipped.service'; import Annotation = Core.Annotations.Annotation; @Injectable() @@ -18,6 +19,7 @@ export class AnnotationDrawService { private readonly _dossiersService: DossiersService, private readonly _redactionLogService: RedactionLogService, private readonly _userPreferenceService: UserPreferenceService, + private readonly _skippedService: SkippedService, ) {} async drawAnnotations( @@ -25,7 +27,6 @@ export class AnnotationDrawService { annotationWrappers: AnnotationWrapper[], fileId: string, dossierId: string, - hideSkipped = false, compareMode = false, ) { if (!activeViewer) { @@ -36,7 +37,7 @@ export class AnnotationDrawService { await pdfNet.runWithCleanup( async () => { - await this._drawAnnotations(activeViewer, annotationWrappers, fileId, dossierId, hideSkipped, compareMode); + await this._drawAnnotations(activeViewer, annotationWrappers, fileId, dossierId, compareMode); }, environment.licenseKey ? atob(environment.licenseKey) : null, ); @@ -82,12 +83,9 @@ export class AnnotationDrawService { annotationWrappers: AnnotationWrapper[], fileId: string, dossierId: string, - hideSkipped: boolean, compareMode: boolean, ) { - const annotations = annotationWrappers.map(annotation => - this._computeAnnotation(activeViewer, annotation, dossierId, hideSkipped, compareMode), - ); + const annotations = annotationWrappers.map(annotation => this._computeAnnotation(activeViewer, annotation, dossierId, compareMode)); const annotationManager = activeViewer.Core.annotationManager; annotationManager.addAnnotations(annotations, { imported: true }); await annotationManager.drawAnnotationsFromList(annotations); @@ -143,7 +141,6 @@ export class AnnotationDrawService { activeViewer: WebViewerInstance, annotationWrapper: AnnotationWrapper, dossierId: string, - hideSkipped: boolean, compareMode: boolean, ) { const pageNumber = compareMode ? annotationWrapper.pageNumber * 2 - 1 : annotationWrapper.pageNumber; @@ -177,7 +174,7 @@ export class AnnotationDrawService { annotation.Hidden = annotationWrapper.isChangeLogRemoved || - (hideSkipped && annotationWrapper.isSkipped) || + (this._skippedService.hideSkipped && annotationWrapper.isSkipped) || annotationWrapper.isOCR || annotationWrapper.hidden; annotation.setCustomData('redact-manager', 'true'); diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/skipped.service.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/skipped.service.ts new file mode 100644 index 000000000..9f1f6238f --- /dev/null +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/skipped.service.ts @@ -0,0 +1,24 @@ +import { Injectable } from '@angular/core'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { skip } from 'rxjs/operators'; +import { shareDistinctLast } from '@iqser/common-ui'; + +@Injectable() +export class SkippedService { + readonly hideSkipped$: Observable; + private readonly _hideSkipped$ = new BehaviorSubject(false); + + constructor() { + this.hideSkipped$ = this._hideSkipped$.pipe(shareDistinctLast(), skip(1)); + } + + get hideSkipped(): boolean { + return this._hideSkipped$.value; + } + + toggleSkipped($event): void { + $event.stopPropagation(); + $event.preventDefault(); + this._hideSkipped$.next(!this.hideSkipped); + } +}