From d2e2324aa31dfc067035ce995a72d3e756a7fa9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Tue, 21 Dec 2021 15:20:50 +0200 Subject: [PATCH 01/14] RED-2914 - arrow navigation in pdf viewer, some translations --- .../dossiers-listing-details.component.html | 4 +- .../file-workload/file-workload.component.ts | 58 +++++++++---------- .../file-preview-screen.component.ts | 17 ++++-- .../modules/dossier/utils/pdf-viewer.utils.ts | 3 +- apps/red-ui/src/assets/i18n/en.json | 8 +-- 5 files changed, 48 insertions(+), 42 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html index ffcf42195..1371e0061 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.html @@ -4,7 +4,7 @@ [config]="config" [radius]="80" [strokeWidth]="15" - [subtitle]="'dossier-listing.stats.charts.dossiers' | translate" + [subtitle]="'dossier-listing.stats.charts.dossiers' | translate: { count: config[0].value }" >
@@ -12,7 +12,7 @@
{{ stats.totalAnalyzedPages | number }}
-
+
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 0607b4055..1caebce68 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 @@ -207,7 +207,7 @@ export class FileWorkloadComponent { // Disable annotation navigation in multi select mode // => TODO: maybe implement selection on enter? if (!this.multiSelectService.isActive) { - this._navigateAnnotations($event); + this.navigateAnnotations($event); } } else { this._navigatePages($event); @@ -276,34 +276,7 @@ export class FileWorkloadComponent { this.selectPage.emit(this._nextPageWithAnnotations()); } - private _disableMultiSelectAndDocumentInfo(): void { - this.multiSelectService.deactivate(); - this.documentInfoService.hide(); - } - - private _filterAnnotations( - annotations: AnnotationWrapper[], - primary: INestedFilter[], - secondary: INestedFilter[] = [], - ): Map { - if (!primary) { - return; - } - this.displayedAnnotations = this._annotationProcessingService.filterAndGroupAnnotations(annotations, primary, secondary); - this.displayedPages = [...this.displayedAnnotations.keys()]; - return this.displayedAnnotations; - } - - private _selectFirstAnnotationOnCurrentPageIfNecessary() { - if ( - (!this._firstSelectedAnnotation || this.activeViewerPage !== this._firstSelectedAnnotation.pageNumber) && - this.displayedPages.indexOf(this.activeViewerPage) >= 0 - ) { - this.selectAnnotations.emit([this.activeAnnotations[0]]); - } - } - - private _navigateAnnotations($event: KeyboardEvent) { + navigateAnnotations($event: KeyboardEvent) { if (!this._firstSelectedAnnotation || this.activeViewerPage !== this._firstSelectedAnnotation.pageNumber) { if (this.displayedPages.indexOf(this.activeViewerPage) !== -1) { // Displayed page has annotations @@ -354,6 +327,33 @@ export class FileWorkloadComponent { } } + private _disableMultiSelectAndDocumentInfo(): void { + this.multiSelectService.deactivate(); + this.documentInfoService.hide(); + } + + private _filterAnnotations( + annotations: AnnotationWrapper[], + primary: INestedFilter[], + secondary: INestedFilter[] = [], + ): Map { + if (!primary) { + return; + } + this.displayedAnnotations = this._annotationProcessingService.filterAndGroupAnnotations(annotations, primary, secondary); + this.displayedPages = [...this.displayedAnnotations.keys()]; + return this.displayedAnnotations; + } + + private _selectFirstAnnotationOnCurrentPageIfNecessary() { + if ( + (!this._firstSelectedAnnotation || this.activeViewerPage !== this._firstSelectedAnnotation.pageNumber) && + this.displayedPages.indexOf(this.activeViewerPage) >= 0 + ) { + this.selectAnnotations.emit([this.activeAnnotations[0]]); + } + } + private _navigatePages($event: KeyboardEvent) { const pageIdx = this.displayedPages.indexOf(this.activeViewerPage); 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 16976197e..74f19e118 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 @@ -48,7 +48,7 @@ import { ReanalysisService } from '../../../../services/reanalysis.service'; import Annotation = Core.Annotations.Annotation; import PDFNet = Core.PDFNet; -const ALL_HOTKEY_ARRAY = ['Escape', 'F', 'f']; +const ALL_HOTKEY_ARRAY = ['Escape', 'F', 'f', 'ArrowUp', 'ArrowDown']; @Component({ templateUrl: './file-preview-screen.component.html', @@ -63,7 +63,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni shouldDeselectAnnotationsOnPageChange = true; fileData: FileDataModel; annotationData: AnnotationData; - selectedAnnotations: AnnotationWrapper[]; + selectedAnnotations: AnnotationWrapper[] = []; hideSkipped = false; displayPdfViewer = false; @ViewChild(PdfViewerComponent) readonly viewerComponent: PdfViewerComponent; @@ -294,7 +294,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this._changeDetectorRef.markForCheck(); } - @Debounce(0) + @Debounce(10) selectAnnotations(annotations?: AnnotationWrapper[]) { if (annotations) { this.viewerComponent?.utils.selectAnnotations(annotations, this.multiSelectService.isActive); @@ -357,9 +357,17 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni return; } + if (['ArrowUp', 'ArrowDown'].includes($event.key)) { + if (this.selectedAnnotations.length === 1) { + this._workloadComponent.navigateAnnotations($event); + } + return; + } + if (['Escape'].includes($event.key)) { this.fullScreen = false; this.closeFullScreen(); + this._changeDetectorRef.markForCheck(); } if (['f', 'F'].includes($event.key)) { @@ -370,8 +378,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this.toggleFullScreen(); return; } - - this._changeDetectorRef.markForCheck(); } viewerPageChanged($event: any) { @@ -388,6 +394,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni const extras: NavigationExtras = { queryParams: { page: $event }, queryParamsHandling: 'merge', + replaceUrl: true, }; this._router.navigate([], extras).then(); diff --git a/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts b/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts index 5b29b9c07..99b1fe3a8 100644 --- a/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts +++ b/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts @@ -126,9 +126,8 @@ export class PdfViewerUtils { } const annotationsFromViewer = annotations.map(ann => this._getAnnotationById(ann.id)); - this._annotationManager.selectAnnotations(annotationsFromViewer); - // this.navigateToPage(annotations[0].pageNumber*this.paginationOffset); this._annotationManager.jumpToAnnotation(annotationsFromViewer[0]); + this._annotationManager.selectAnnotations(annotationsFromViewer); } deselectAnnotations(annotations: AnnotationWrapper[]) { diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index 54da1734b..1f3977ece 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -656,12 +656,12 @@ "action": "Analyze entire dossier" }, "stats": { - "analyzed-pages": "Pages", + "analyzed-pages": "{count, plural, one{Page} other{Pages}}", "charts": { - "dossiers": "Dossiers", - "total-documents": "Total Document(s)" + "dossiers": "{count, plural, one{Dossier} other{Dossiers}}", + "total-documents": "Total Documents" }, - "total-people": "Total user(s)" + "total-people": "Total users" }, "table-col-names": { "name": "Name", From c588c859182c886432865eada032222e705b57a8 Mon Sep 17 00:00:00 2001 From: Bamboo Date: Tue, 21 Dec 2021 14:31:40 +0100 Subject: [PATCH 02/14] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3214 -> 3215 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 91a9f08b4..b7aa65527 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.111.0", + "version": "3.112.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 840317a80606719a75b1fc26d2b8f74516cfac1c..3e0716f22a172ef4c30d67551a6fc753fde3249d 100644 GIT binary patch delta 3036 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 From b477905fa18d9309f14f302d8be75c94c007432d Mon Sep 17 00:00:00 2001 From: Edi Cziszter Date: Sat, 18 Dec 2021 21:44:56 +0200 Subject: [PATCH 03/14] changed placeholder and attributes reload --- .../edit-dossier-attributes.component.html | 16 ++++++++++------ .../src/app/services/user-preference.service.ts | 9 +++------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.html b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.html index 6657b935e..c62035d5b 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.html +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.html @@ -16,15 +16,19 @@ class="iqser-input-group" > - + > + + - + diff --git a/apps/red-ui/src/app/services/user-preference.service.ts b/apps/red-ui/src/app/services/user-preference.service.ts index ac318c13d..cc89c6b6e 100644 --- a/apps/red-ui/src/app/services/user-preference.service.ts +++ b/apps/red-ui/src/app/services/user-preference.service.ts @@ -68,12 +68,9 @@ export class UserPreferenceService extends GenericService { window.location.reload(); } - reload(): Promise { - return this.getAll() - .toPromise() - .then(attributes => { - this._userAttributes = attributes ?? {}; - }); + async reload(): Promise { + const attributes = await this.getAll().toPromise(); + this._userAttributes = attributes ?? {}; } @Validate() From aa795d12599205f49d76570d6dea55636434b9a3 Mon Sep 17 00:00:00 2001 From: Edi Cziszter Date: Mon, 20 Dec 2021 12:38:49 +0200 Subject: [PATCH 04/14] changed input date format --- .../edit-dossier-attributes.component.ts | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts index bb7541497..1e2ebbc45 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts @@ -7,11 +7,31 @@ import { FormBuilder, FormGroup } from '@angular/forms'; import * as moment from 'moment'; import { DossierAttributesService } from '@shared/services/controller-wrappers/dossier-attributes.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; +import { MomentDateAdapter } from '@angular/material-moment-adapter'; + +export const DATE_FORMATS = { + parse: { + dateInput: 'YYYY-MM-DD', + }, + display: { + dateInput: 'YYYY-MM-DD', + monthYearLabel: 'YYYY', + }, +}; @Component({ selector: 'redaction-edit-dossier-attributes', templateUrl: './edit-dossier-attributes.component.html', styleUrls: ['./edit-dossier-attributes.component.scss'], + providers: [ + { + provide: DateAdapter, + useClass: MomentDateAdapter, + deps: [MAT_DATE_LOCALE], + }, + { provide: MAT_DATE_FORMATS, useValue: DATE_FORMATS }, + ], }) export class EditDossierAttributesComponent implements EditDossierSectionInterface, OnInit { readonly iconButtonTypes = IconButtonTypes; @@ -53,7 +73,10 @@ export class EditDossierAttributesComponent implements EditDossierSectionInterfa } get valid(): boolean { - return this.form.valid; + if (this.form) { + return this.form.valid; + } + return false; } async ngOnInit() { From b6e31f4ce4b99bd5121f5fbf05974aace0db1705 Mon Sep 17 00:00:00 2001 From: Edi Cziszter Date: Mon, 20 Dec 2021 13:18:39 +0200 Subject: [PATCH 05/14] refactored get valid() and removed / from input and img --- .../attributes/edit-dossier-attributes.component.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts index 1e2ebbc45..304ba1219 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts @@ -73,10 +73,7 @@ export class EditDossierAttributesComponent implements EditDossierSectionInterfa } get valid(): boolean { - if (this.form) { - return this.form.valid; - } - return false; + return !!this.form?.valid; } async ngOnInit() { From ca8c4a08f90ed40ad8f1e725844fc40ea0bbd81e Mon Sep 17 00:00:00 2001 From: Edi Cziszter Date: Tue, 21 Dec 2021 20:51:27 +0200 Subject: [PATCH 06/14] trim time from date --- .../edit-dossier-attributes.component.html | 2 +- .../edit-dossier-attributes.component.ts | 24 +++---------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.html b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.html index c62035d5b..1cc4516d4 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.html +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.html @@ -28,7 +28,7 @@ - + diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts index 304ba1219..e22722727 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/attributes/edit-dossier-attributes.component.ts @@ -7,31 +7,11 @@ import { FormBuilder, FormGroup } from '@angular/forms'; import * as moment from 'moment'; import { DossierAttributesService } from '@shared/services/controller-wrappers/dossier-attributes.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE } from '@angular/material/core'; -import { MomentDateAdapter } from '@angular/material-moment-adapter'; - -export const DATE_FORMATS = { - parse: { - dateInput: 'YYYY-MM-DD', - }, - display: { - dateInput: 'YYYY-MM-DD', - monthYearLabel: 'YYYY', - }, -}; @Component({ selector: 'redaction-edit-dossier-attributes', templateUrl: './edit-dossier-attributes.component.html', styleUrls: ['./edit-dossier-attributes.component.scss'], - providers: [ - { - provide: DateAdapter, - useClass: MomentDateAdapter, - deps: [MAT_DATE_LOCALE], - }, - { provide: MAT_DATE_FORMATS, useValue: DATE_FORMATS }, - ], }) export class EditDossierAttributesComponent implements EditDossierSectionInterface, OnInit { readonly iconButtonTypes = IconButtonTypes; @@ -86,7 +66,9 @@ export class EditDossierAttributesComponent implements EditDossierSectionInterfa async save(): EditDossierSaveResult { const dossierAttributeList = this.attributes.map(attr => ({ dossierAttributeConfigId: attr.id, - value: this.currentAttrValue(attr), + value: this.isSpecificType(attr, DossierAttributeConfigTypes.DATE) + ? moment(this.currentAttrValue(attr)).format('YYYY-MM-DD') + : this.currentAttrValue(attr), })); try { await this._dossierAttributesService.setAttributes(this.dossier, dossierAttributeList).toPromise(); From 02e14fded84b73b6079c2ed47b9cd6e9fbcce541 Mon Sep 17 00:00:00 2001 From: Edi Cziszter Date: Tue, 21 Dec 2021 21:29:30 +0200 Subject: [PATCH 07/14] update configuration.initializer --- apps/red-ui/src/app/utils/configuration.initializer.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/red-ui/src/app/utils/configuration.initializer.ts b/apps/red-ui/src/app/utils/configuration.initializer.ts index 2f31bef07..2f4bc4faf 100644 --- a/apps/red-ui/src/app/utils/configuration.initializer.ts +++ b/apps/red-ui/src/app/utils/configuration.initializer.ts @@ -1,4 +1,4 @@ -import { catchError, filter, mergeMapTo, switchMap, take, tap } from 'rxjs/operators'; +import { catchError, filter, mergeMap, switchMap, take, tap } from 'rxjs/operators'; import { ConfigService } from '@services/config.service'; import { Title } from '@angular/platform-browser'; import { from, of, throwError } from 'rxjs'; @@ -21,9 +21,10 @@ export function configurationInitializer( filter(event => event.type === KeycloakEventType.OnReady), switchMap(() => from(keycloakService.isLoggedIn())), switchMap(loggedIn => (!loggedIn ? throwError('Not Logged In') : of({}))), - mergeMapTo(generalSettingsService.getGeneralConfigurations()), + mergeMap(() => generalSettingsService.getGeneralConfigurations()), tap(configuration => configService.updateDisplayName(configuration.displayName)), - tap(() => userPreferenceService.reload().then(() => languageService.chooseAndSetInitialLanguage())), + switchMap(() => userPreferenceService.reload()), + tap(() => languageService.chooseAndSetInitialLanguage()), catchError(() => { title.setTitle('RedactManager'); return of({}); From d593a01162e96d598d602c6d0de088894da872d8 Mon Sep 17 00:00:00 2001 From: Bamboo Date: Wed, 22 Dec 2021 09:37:56 +0100 Subject: [PATCH 08/14] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3215 -> 3213 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b7aa65527..94b72850e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.112.0", + "version": "3.113.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 3e0716f22a172ef4c30d67551a6fc753fde3249d..dd6bfef226688aeab3852eba67ef018be5938bdd 100644 GIT binary patch delta 3176 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 L%cBS|08jt`V1+9W From 4fca8621fa7b4e775bc183ee79c8c0f9a9733697 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Fri, 24 Dec 2021 16:00:41 +0200 Subject: [PATCH 09/14] update documentInfoService --- .../file-preview-screen.component.html | 6 +++++- .../file-preview-screen.component.ts | 14 -------------- .../services/document-info.service.ts | 16 ++++++++++++++-- 3 files changed, 19 insertions(+), 17 deletions(-) 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 3b8387637..b18e1c5fe 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 @@ -95,7 +95,11 @@ icon="red:needs-work" > - + ; readonly dossier$: Observable; - readonly viewDocumentInfo$: Observable; readonly file$: Observable; readonly fileId: string; ready = false; @@ -121,7 +120,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni }), shareLast(), ); - this.viewDocumentInfo$ = this._viewDocumentInfo$; this.canPerformAnnotationActions$ = this._canPerformAnnotationActions$; document.documentElement.addEventListener('fullscreenchange', () => { @@ -147,18 +145,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni return this.viewModeService.isStandard ? currentPage : currentPage % 2 === 0 ? currentPage / 2 : (currentPage + 1) / 2; } - private get _viewDocumentInfo$() { - return this.documentInfoService.shown$.pipe( - tap(value => { - if (value) { - this.multiSelectService.deactivate(); - this.excludedPagesService.hide(); - } - }), - shareDistinctLast(), - ); - } - private get _canPerformAnnotationActions$() { return combineLatest([this.file$, this.viewModeService.viewMode$]).pipe( map(([file, viewMode]) => this.permissionsService.canPerformAnnotationActions(file) && viewMode === 'STANDARD'), diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/document-info.service.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/document-info.service.ts index 156fcd7c6..60023ef3a 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/document-info.service.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/services/document-info.service.ts @@ -1,11 +1,13 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, merge, Observable } from 'rxjs'; import { shareLast } from '@iqser/common-ui'; -import { filter, map, startWith, withLatestFrom } from 'rxjs/operators'; +import { filter, map, startWith, tap, withLatestFrom } from 'rxjs/operators'; import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; import { FileAttributesService } from '@services/entity-services/file-attributes.service'; import { FilesMapService } from '@services/entity-services/files-map.service'; import { File, IFileAttributeConfig } from '@red/domain'; +import { MultiSelectService } from './multi-select.service'; +import { ExcludedPagesService } from './excluded-pages.service'; @Injectable() export class DocumentInfoService { @@ -17,8 +19,18 @@ export class DocumentInfoService { private readonly _dossierTemplatesService: DossierTemplatesService, private readonly _fileAttributesService: FileAttributesService, private readonly _filesMapService: FilesMapService, + private readonly _multiSelectService: MultiSelectService, + private readonly _excludedPagesService: ExcludedPagesService, ) { - this.shown$ = this._show$.asObservable().pipe(shareLast()); + this.shown$ = this._show$.asObservable().pipe( + tap(show => { + if (show) { + this._multiSelectService.deactivate(); + this._excludedPagesService.hide(); + } + }), + shareLast(), + ); this.hidden$ = this.shown$.pipe( map(value => !value), shareLast(), From ecf57233ba18cf280be3c1b9fd31a5dd0f3138bd Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Fri, 24 Dec 2021 16:08:00 +0200 Subject: [PATCH 10/14] fix RED-3108 & RED-3109 --- .../file-preview-screen.component.ts | 61 +++++++++++-------- 1 file changed, 34 insertions(+), 27 deletions(-) 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 43cd1704c..226af6b17 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 @@ -50,6 +50,14 @@ import PDFNet = Core.PDFNet; const ALL_HOTKEY_ARRAY = ['Escape', 'F', 'f', 'ArrowUp', 'ArrowDown']; +function diff(first: readonly T[], second: readonly T[]): T[] { + // symmetrical difference between two arrays + const a = new Set(first); + const b = new Set(second); + + return [...first.filter(x => !b.has(x)), ...second.filter(x => !a.has(x))]; +} + @Component({ templateUrl: './file-preview-screen.component.html', styleUrls: ['./file-preview-screen.component.scss'], @@ -232,8 +240,8 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni } catch (error) { console.error(error); } + console.log(`[REDACTION] Delete previous annotations time: ${new Date().getTime() - startTime} ms`); } - console.log(`[REDACTION] Delete previous annotations time: ${new Date().getTime() - startTime} ms`); const processStartTime = new Date().getTime(); const dossier = this._dossiersService.find(this.dossierId); const newAnnotationsData = this.fileData.getAnnotations( @@ -261,11 +269,8 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni filters: processFilters(secondaryFilters, AnnotationProcessingService.secondaryAnnotationFilters(this.fileData?.viewedPages)), }); console.log(`[REDACTION] Process time: ${new Date().getTime() - processStartTime} ms`); - console.log( - `[REDACTION] Annotation Redraw and filter rebuild time: ${new Date().getTime() - startTime} ms for: ${ - this.annotations.length - } annotations`, - ); + console.log(`[REDACTION] Filter rebuild time: ${new Date().getTime() - startTime}`); + console.log(); } handleAnnotationSelected(annotationIds: string[]) { @@ -311,7 +316,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni response.manualRedactionEntryWrapper.rectId, ); this._instance.Core.annotationManager.deleteAnnotation(annotation); - await this._filesService.reload(this.dossierId, this.fileId).toPromise(); const distinctPages = manualRedactionEntryWrapper.manualRedactionEntry.positions .map(p => p.page) .filter((item, pos, self) => self.indexOf(item) === pos); @@ -469,7 +473,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni } private _setHiddenPropertyToNewAnnotations(newAnnotations: AnnotationWrapper[], oldAnnotations: AnnotationWrapper[]) { - newAnnotations.map(newAnnotation => { + newAnnotations.forEach(newAnnotation => { const oldAnnotation = oldAnnotations.find(a => a.annotationId === newAnnotation.annotationId); if (oldAnnotation) { newAnnotation.hidden = oldAnnotation.hidden; @@ -497,7 +501,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni } this._instance.Core.documentViewer.refreshAll(); this._instance.Core.documentViewer.updateView([this.activeViewerPage], this.activeViewerPage); - this._changeDetectorRef.detectChanges(); + this._changeDetectorRef.markForCheck(); } private async _stampPreview(document: PDFNet.PDFDoc, dossierTemplateId: string) { @@ -540,8 +544,8 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni .subscribe(async file => { await this._loadFileData(file, !this._reloadFileOnReanalysis); this._reloadFileOnReanalysis = false; - this._loadingService.stop(); await this._reloadAnnotations(); + this._loadingService.stop(); }); } @@ -552,21 +556,21 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni const fileData = await this._fileDownloadService.loadDataFor(file).toPromise(); - if (!file.isPending) { - let excludedOrIncludedPages = new Set(); - let currentPageAnnotations: AnnotationWrapper[] = []; + if (file.isPending) { + return; + } - if (performUpdate && !!this.fileData) { - this.fileData.redactionLog = fileData.redactionLog; - this.fileData.viewedPages = fileData.viewedPages; - excludedOrIncludedPages = new Set([...this.fileData.file.excludedPages, ...file.excludedPages]); - currentPageAnnotations = this.annotations.filter(a => excludedOrIncludedPages.has(a.pageNumber)); - this.fileData.file = file; - } else { - this.fileData = fileData; + if (performUpdate && !!this.fileData) { + this.fileData.redactionLog = fileData.redactionLog; + this.fileData.viewedPages = fileData.viewedPages; + const excludedOrIncludedPages = new Set(diff(this.fileData.file.excludedPages, file.excludedPages)); + const currentPageAnnotations = this.annotations.filter(a => excludedOrIncludedPages.has(a.pageNumber)); + this.fileData.file = file; + if (excludedOrIncludedPages?.size) { + await this._cleanupAndRedrawAnnotations(currentPageAnnotations, a => excludedOrIncludedPages.has(a.pageNumber)); } - - return this._cleanupAndRedrawAnnotations(currentPageAnnotations, a => excludedOrIncludedPages.has(a.pageNumber)); + } else { + this.fileData = fileData; } } @@ -584,7 +588,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni private async _reloadAnnotationsForPage(page: number) { const currentPageAnnotations = this.annotations.filter(a => a.pageNumber === page); - await this._filesService.reload(this.dossierId, this.fileId).toPromise(); this.fileData.redactionLog = await this._fileDownloadService.loadRedactionLogFor(this.dossierId, this.fileId).toPromise(); await this._cleanupAndRedrawAnnotations(currentPageAnnotations, annotation => annotation.pageNumber === page); @@ -597,12 +600,16 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni this.rebuildFilters(); if (this.viewModeService.viewMode === 'STANDARD') { + const startTime = new Date().getTime(); annotationsToDelete?.forEach(annotation => { this._findAndDeleteAnnotation(annotation.id); }); - const newPageAnnotations = newAnnotationsFilter ? this.annotations.filter(newAnnotationsFilter) : this.annotations; - this._handleDeltaAnnotationFilters(annotationsToDelete ?? [], newPageAnnotations); - await this._redrawAnnotations(newPageAnnotations); + const newAnnotations = newAnnotationsFilter ? this.annotations.filter(newAnnotationsFilter) : this.annotations; + this._handleDeltaAnnotationFilters(annotationsToDelete ?? [], newAnnotations); + await this._redrawAnnotations(newAnnotations); + console.log( + `[REDACTION] Annotations redraw time: ${new Date().getTime() - startTime} ms for ${newAnnotations.length} annotations`, + ); } } From 85351e3bc78338d9a806c926f88a4cee1ef6a827 Mon Sep 17 00:00:00 2001 From: Bamboo Date: Fri, 24 Dec 2021 15:18:53 +0100 Subject: [PATCH 11/14] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3213 -> 3214 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 94b72850e..c82b6a4f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.113.0", + "version": "3.114.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index dd6bfef226688aeab3852eba67ef018be5938bdd..463a71f66893f2f12f074fb0be3d8b3bd979f8dd 100644 GIT binary patch delta 2829 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 delta 2853 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 D2x6YX From 5da318496de450d533e83a4a64b1f35c46aaf433 Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Tue, 21 Dec 2021 15:01:31 +0200 Subject: [PATCH 12/14] viewed pages cleanup --- .../src/app/models/file/file-data.model.ts | 3 ++- ...ile-attributes-listing-screen.component.ts | 1 - .../file-workload.component.html | 1 + .../file-workload/file-workload.component.ts | 7 ++++--- .../page-indicator.component.ts | 12 ++++++++---- .../pdf-viewer/pdf-viewer.component.ts | 2 +- .../file-preview-screen.component.ts | 19 ++++++++++++++----- .../modules/dossier/utils/pdf-viewer.utils.ts | 5 ++++- apps/red-ui/src/assets/config/config.json | 4 ++-- libs/red-domain/src/lib/pages/viewed-page.ts | 2 +- 10 files changed, 37 insertions(+), 19 deletions(-) diff --git a/apps/red-ui/src/app/models/file/file-data.model.ts b/apps/red-ui/src/app/models/file/file-data.model.ts index 6407c15fd..1c0d3b920 100644 --- a/apps/red-ui/src/app/models/file/file-data.model.ts +++ b/apps/red-ui/src/app/models/file/file-data.model.ts @@ -117,9 +117,10 @@ export class FileDataModel { const relevantChanges = redactionLogEntry.changes.filter(change => moment(change.dateTime).valueOf() > viewTime); // at least one unseen change if (relevantChanges.length > 0) { + // at least 1 relevant change wrapper.changeLogType = relevantChanges[relevantChanges.length - 1].type; wrapper.isChangeLogEntry = true; - viewedPage.hasChanges = true; + viewedPage.showAsUnseen = moment(viewedPage.viewedTime).valueOf() < moment(lastChange.dateTime).valueOf(); this.hasChangeLog = true; } else { // no relevant changes - hide removed anyway diff --git a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts index 86390b6e1..f2e07904d 100644 --- a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts @@ -127,7 +127,6 @@ export class FileAttributesListingScreenComponent extends ListingComponent { - console.log('error'); if (error.status === HttpStatusCode.Conflict) { this._toaster.error(_('file-attributes-listing.error.conflict')); } else { 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 7111f4d66..7cbfa2962 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 @@ -94,6 +94,7 @@ + {{activeViewerPage}}
annotation.manual); + const hasOnlyManualRedactions = this.displayedAnnotations.get(pageNumber)?.every(annotation => annotation.manual); return hasOnlyManualRedactions && this.file.excludedPages.includes(pageNumber); } @@ -280,7 +280,7 @@ export class FileWorkloadComponent { if (!this._firstSelectedAnnotation || this.activeViewerPage !== this._firstSelectedAnnotation.pageNumber) { if (this.displayedPages.indexOf(this.activeViewerPage) !== -1) { // Displayed page has annotations - return this.selectAnnotations.emit([this.activeAnnotations[0]]); + return this.selectAnnotations.emit(this.activeAnnotations ? [this.activeAnnotations[0]] : null); } // Displayed page doesn't have annotations if ($event.key === 'ArrowDown') { @@ -337,7 +337,8 @@ export class FileWorkloadComponent { primary: INestedFilter[], secondary: INestedFilter[] = [], ): Map { - if (!primary) { + if (!primary || primary.length === 0) { + this.displayedPages = Array.from({ length: this.file?.numberOfPages }, (x, i) => i + 1); return; } this.displayedAnnotations = this._annotationProcessingService.filterAndGroupAnnotations(annotations, primary, secondary); diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/page-indicator/page-indicator.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/page-indicator/page-indicator.component.ts index dc417f73d..2b217e9d4 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/page-indicator/page-indicator.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/components/page-indicator/page-indicator.component.ts @@ -24,6 +24,7 @@ export class PageIndicatorComponent extends AutoUnsubscribe implements OnDestroy @Output() readonly pageSelected = new EventEmitter(); pageReadTimeout: number = null; + read = false; constructor( private readonly _viewedPagesService: ViewedPagesService, @@ -39,16 +40,17 @@ export class PageIndicatorComponent extends AutoUnsubscribe implements OnDestroy return this.viewedPages?.find(p => p.page === this.number); } - get read() { + private _setReadState() { const activePage = this.activePage; if (!activePage) { - return false; + this.read = false; } else { - return !activePage.hasChanges; + this.read = !activePage.showAsUnseen; } } ngOnChanges() { + this._setReadState(); this.handlePageRead(); } @@ -83,10 +85,11 @@ export class PageIndicatorComponent extends AutoUnsubscribe implements OnDestroy private async _markPageRead() { await this._viewedPagesService.addPage({ page: this.number }, this.file.dossierId, this.file.fileId).toPromise(); if (this.activePage) { - this.activePage.hasChanges = false; + this.activePage.showAsUnseen = false; } else { this.viewedPages?.push({ page: this.number, fileId: this.file.fileId }); } + this._setReadState(); } private async _markPageUnread() { @@ -95,5 +98,6 @@ export class PageIndicatorComponent extends AutoUnsubscribe implements OnDestroy this.viewedPages?.findIndex(p => p.page === this.number), 1, ); + this._setReadState(); } } 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 059d44dc7..9777cc816 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 @@ -309,7 +309,7 @@ export class PdfViewerComponent implements OnInit, OnChanges { private _setInitialDisplayMode() { this.instance.UI.setFitMode('FitPage'); const instanceDisplayMode = this.documentViewer.getDisplayModeManager().getDisplayMode(); - instanceDisplayMode.mode = this.viewModeService.isStandard ? 'Single' : 'Facing'; + instanceDisplayMode.mode = this.viewModeService.isCompare ? 'Facing' : 'Single'; this.documentViewer.getDisplayModeManager().setDisplayMode(instanceDisplayMode); } 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 226af6b17..d0d104b6f 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 @@ -74,6 +74,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni selectedAnnotations: AnnotationWrapper[] = []; hideSkipped = false; displayPdfViewer = false; + activeViewerPage : number = null; @ViewChild(PdfViewerComponent) readonly viewerComponent: PdfViewerComponent; readonly dossierId: string; readonly canPerformAnnotationActions$: Observable; @@ -145,12 +146,15 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni return this._instance; } - get activeViewerPage(): number { + + + private _setActiveViewerPage() { const currentPage = this._instance?.Core.documentViewer?.getCurrentPage(); if (!currentPage) { - return 0; + this.activeViewerPage = 0; + } else { + this.activeViewerPage = this.viewModeService.isCompare ? currentPage % 2 === 0 ? currentPage / 2 : (currentPage + 1) / 2 : currentPage; } - return this.viewModeService.isStandard ? currentPage : currentPage % 2 === 0 ? currentPage / 2 : (currentPage + 1) / 2; } private get _canPerformAnnotationActions$() { @@ -288,9 +292,9 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni @Debounce(10) selectAnnotations(annotations?: AnnotationWrapper[]) { if (annotations) { - this.viewerComponent?.utils.selectAnnotations(annotations, this.multiSelectService.isActive); + this.viewerComponent?.utils?.selectAnnotations(annotations, this.multiSelectService.isActive); } else { - this.viewerComponent?.utils.deselectAllAnnotations(); + this.viewerComponent?.utils?.deselectAllAnnotations(); } } @@ -316,6 +320,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni response.manualRedactionEntryWrapper.rectId, ); this._instance.Core.annotationManager.deleteAnnotation(annotation); + // await this._filesService.reload(this.dossierId, this.fileId).toPromise(); const distinctPages = manualRedactionEntryWrapper.manualRedactionEntry.positions .map(p => p.page) .filter((item, pos, self) => self.indexOf(item) === pos); @@ -388,6 +393,8 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni }; this._router.navigate([], extras).then(); + + this._setActiveViewerPage(); this._changeDetectorRef.markForCheck(); } @@ -407,7 +414,9 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni if (pageNumber) { setTimeout(() => { this.selectPage(parseInt(pageNumber, 10)); + this._setActiveViewerPage(); this._scrollViews(); + this._changeDetectorRef.markForCheck(); this._loadingService.stop(); }); } else { diff --git a/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts b/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts index 99b1fe3a8..e441e1dd1 100644 --- a/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts +++ b/apps/red-ui/src/app/modules/dossier/utils/pdf-viewer.utils.ts @@ -120,7 +120,10 @@ export class PdfViewerUtils { this._annotationManager.deselectAllAnnotations(); } - selectAnnotations(annotations: AnnotationWrapper[], multiSelectActive: boolean) { + selectAnnotations(annotations?: AnnotationWrapper[], multiSelectActive: boolean = false) { + if (!annotations){ + return; + } if (!multiSelectActive) { this.deselectAllAnnotations(); } diff --git a/apps/red-ui/src/assets/config/config.json b/apps/red-ui/src/assets/config/config.json index c5a78443c..4c6dd7e9a 100644 --- a/apps/red-ui/src/assets/config/config.json +++ b/apps/red-ui/src/assets/config/config.json @@ -1,7 +1,7 @@ { "ADMIN_CONTACT_NAME": null, "ADMIN_CONTACT_URL": null, - "API_URL": "https://dev-08.iqser.cloud/redaction-gateway-v1", + "API_URL": "https://aks-staging.iqser.cloud/redaction-gateway-v1", "APP_NAME": "RedactManager", "AUTO_READ_TIME": 1.5, "BACKEND_APP_VERSION": "4.4.40", @@ -17,7 +17,7 @@ "MAX_RETRIES_ON_SERVER_ERROR": 3, "OAUTH_CLIENT_ID": "redaction", "OAUTH_IDP_HINT": null, - "OAUTH_URL": "https://dev-08.iqser.cloud/auth/realms/redaction", + "OAUTH_URL": "https://aks-staging.iqser.cloud/auth/realms/redaction", "RECENT_PERIOD_IN_HOURS": 24, "SELECTION_MODE": "structural" } diff --git a/libs/red-domain/src/lib/pages/viewed-page.ts b/libs/red-domain/src/lib/pages/viewed-page.ts index 7dc11fc42..4de1e3c17 100644 --- a/libs/red-domain/src/lib/pages/viewed-page.ts +++ b/libs/red-domain/src/lib/pages/viewed-page.ts @@ -3,5 +3,5 @@ export interface IViewedPage { page?: number; userId?: string; viewedTime?: string; - hasChanges?: boolean; + showAsUnseen?: boolean; } From 9ccba63a3a1557c4f70b77312dc81a30fc661860 Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Tue, 21 Dec 2021 15:24:39 +0200 Subject: [PATCH 13/14] simplified initial page --- .../file-workload/file-workload.component.html | 1 - .../components/pdf-viewer/pdf-viewer.component.ts | 14 +++----------- .../file-preview-screen.component.ts | 11 +++++++---- apps/red-ui/src/assets/config/config.json | 4 ++-- 4 files changed, 12 insertions(+), 18 deletions(-) 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 7cbfa2962..7111f4d66 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 @@ -94,7 +94,6 @@
- {{activeViewerPage}}
this.pageChanged.emit(pageNumber)); - } + this._ngZone.run(() => this.pageChanged.emit(pageNumber)); this._handleCustomActions(); }); @@ -648,8 +639,9 @@ export class PdfViewerComponent implements OnInit, OnChanges { private _setReadyAndInitialState(): void { this._ngZone.run(() => { this.utils.ready = true; - this._firstPageChange = true; this.viewerReady.emit(this.instance); + const routePageNumber = this._activatedRoute.snapshot.queryParams.page; + this.pageChanged.emit(routePageNumber || 1); this._setInitialDisplayMode(); this._updateTooltipsVisibility(); }); 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 d0d104b6f..a2ee6f0f6 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 @@ -74,7 +74,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni selectedAnnotations: AnnotationWrapper[] = []; hideSkipped = false; displayPdfViewer = false; - activeViewerPage : number = null; + activeViewerPage: number = null; @ViewChild(PdfViewerComponent) readonly viewerComponent: PdfViewerComponent; readonly dossierId: string; readonly canPerformAnnotationActions$: Observable; @@ -151,9 +151,13 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni private _setActiveViewerPage() { const currentPage = this._instance?.Core.documentViewer?.getCurrentPage(); if (!currentPage) { - this.activeViewerPage = 0; + this.activeViewerPage = 1; } else { - this.activeViewerPage = this.viewModeService.isCompare ? currentPage % 2 === 0 ? currentPage / 2 : (currentPage + 1) / 2 : currentPage; + this.activeViewerPage = this.viewModeService.isCompare + ? currentPage % 2 === 0 + ? currentPage / 2 + : (currentPage + 1) / 2 + : currentPage; } } @@ -393,7 +397,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni }; this._router.navigate([], extras).then(); - this._setActiveViewerPage(); this._changeDetectorRef.markForCheck(); } diff --git a/apps/red-ui/src/assets/config/config.json b/apps/red-ui/src/assets/config/config.json index 4c6dd7e9a..6befaaf58 100644 --- a/apps/red-ui/src/assets/config/config.json +++ b/apps/red-ui/src/assets/config/config.json @@ -1,7 +1,7 @@ { "ADMIN_CONTACT_NAME": null, "ADMIN_CONTACT_URL": null, - "API_URL": "https://aks-staging.iqser.cloud/redaction-gateway-v1", + "API_URL": "https://dev-03.iqser.cloud/redaction-gateway-v1", "APP_NAME": "RedactManager", "AUTO_READ_TIME": 1.5, "BACKEND_APP_VERSION": "4.4.40", @@ -17,7 +17,7 @@ "MAX_RETRIES_ON_SERVER_ERROR": 3, "OAUTH_CLIENT_ID": "redaction", "OAUTH_IDP_HINT": null, - "OAUTH_URL": "https://aks-staging.iqser.cloud/auth/realms/redaction", + "OAUTH_URL": "https://dev-03.iqser.cloud/auth/realms/redaction", "RECENT_PERIOD_IN_HOURS": 24, "SELECTION_MODE": "structural" } From 8c1efd629fa73bcbfec8a23fc50d7dec8a240caf Mon Sep 17 00:00:00 2001 From: Bamboo Date: Tue, 28 Dec 2021 07:45:31 +0100 Subject: [PATCH 14/14] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3214 -> 3215 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c82b6a4f8..63e4bbe64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.114.0", + "version": "3.115.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 463a71f66893f2f12f074fb0be3d8b3bd979f8dd..99fc58a1057a262819618909eb4a6a7e6a14fbd0 100644 GIT binary patch delta 2949 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 delta 2948 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