RED-3988: make viewer header service global

This commit is contained in:
Dan Percic 2022-05-20 20:57:06 +03:00
parent 5c3c2b222c
commit 08c9de05de
24 changed files with 152 additions and 131 deletions

View File

@ -1,7 +1,7 @@
import { Component, ViewContainerRef } from '@angular/core';
import { RouterHistoryService } from '@services/router-history.service';
import { UserService } from '@services/user.service';
import { PdfViewer } from '@shared/components/reusable-pdf-viewer/pdf-viewer.service';
import { PdfViewer } from '@shared/components/pdf-viewer/pdf-viewer.service';
@Component({
selector: 'redaction-root',

View File

@ -52,7 +52,7 @@ import { LoggerModule, NgxLoggerLevel, TOKEN_LOGGER_CONFIG, TOKEN_LOGGER_RULES_S
import { LoggerRulesService } from '@services/logger-rules.service';
import { ILoggerConfig } from '@red/domain';
import { SystemPreferencesService } from '@services/system-preferences.service';
import { PdfViewerComponent } from '@shared/components/reusable-pdf-viewer/pdf-viewer.component';
import { PdfViewerComponent } from '@shared/components/pdf-viewer/pdf-viewer.component';
export function httpLoaderFactory(httpClient: HttpClient, configService: ConfigService): PruningTranslationLoader {
return new PruningTranslationLoader(httpClient, '/assets/i18n/', `.json?version=${configService.values.FRONTEND_APP_VERSION}`);

View File

@ -11,7 +11,7 @@ import { HelpModeService } from '@iqser/common-ui';
import { FileDataService } from '../../services/file-data.service';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
import { ViewModeService } from '../../services/view-mode.service';
import { REDAnnotationManager } from '../../../shared/components/reusable-pdf-viewer/annotation-manager.service';
import { REDAnnotationManager } from '../../../shared/components/pdf-viewer/annotation-manager.service';
export const AnnotationButtonTypes = {
dark: 'dark',

View File

@ -17,7 +17,7 @@ import { UserPreferenceService } from '@services/user-preference.service';
import { ViewModeService } from '../../services/view-mode.service';
import { BehaviorSubject } from 'rxjs';
import { TextHighlightsGroup } from '@red/domain';
import { REDAnnotationManager } from '../../../shared/components/reusable-pdf-viewer/annotation-manager.service';
import { REDAnnotationManager } from '../../../shared/components/pdf-viewer/annotation-manager.service';
import { AnnotationsListingService } from '../../services/annotations-listing.service';
@Component({

View File

@ -35,8 +35,8 @@ import { FilePreviewStateService } from '../../services/file-preview-state.servi
import { ViewModeService } from '../../services/view-mode.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { FileDataService } from '../../services/file-data.service';
import { PdfViewer } from '../../../shared/components/reusable-pdf-viewer/pdf-viewer.service';
import { REDAnnotationManager } from '../../../shared/components/reusable-pdf-viewer/annotation-manager.service';
import { PdfViewer } from '../../../shared/components/pdf-viewer/pdf-viewer.service';
import { REDAnnotationManager } from '../../../shared/components/pdf-viewer/annotation-manager.service';
import { AnnotationsListingService } from '../../services/annotations-listing.service';
const COMMAND_KEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Escape'];

View File

@ -16,7 +16,7 @@ import { IViewedPage } from '@red/domain';
import { AutoUnsubscribe } from '@iqser/common-ui';
import { FilePreviewStateService } from '../../services/file-preview-state.service';
import { firstValueFrom } from 'rxjs';
import { PageRotationService } from '../../services/page-rotation.service';
import { PageRotationService } from '../../../shared/components/pdf-viewer/page-rotation.service';
@Component({
selector: 'redaction-page-indicator',
@ -61,7 +61,7 @@ export class PageIndicatorComponent extends AutoUnsubscribe implements OnDestroy
}
ngOnInit() {
this.addSubscription = this.pageRotationService.isRotated(this.number).subscribe(value => {
this.addSubscription = this.pageRotationService.isRotated$(this.number).subscribe(value => {
this.isRotated = value;
this._changeDetectorRef.detectChanges();
});

View File

@ -31,17 +31,18 @@ import { toPosition } from '../../utils/pdf-calculation.utils';
import { MultiSelectService } from '../../services/multi-select.service';
import { FilePreviewStateService } from '../../services/file-preview-state.service';
import { map, switchMap, tap, withLatestFrom } from 'rxjs/operators';
import { PageRotationService } from '../../services/page-rotation.service';
import { PageRotationService } from '../../../shared/components/pdf-viewer/page-rotation.service';
import { HeaderElements, TextPopups } from '../../utils/constants';
import { FilePreviewDialogService } from '../../services/file-preview-dialog.service';
import { loadCompareDocumentWrapper } from '../../utils/compare-mode.utils';
import { from } from 'rxjs';
import { FileDataService } from '../../services/file-data.service';
import { ViewerHeaderConfigService } from '../../services/viewer-header-config.service';
import { ViewerHeaderService } from '../../../shared/components/pdf-viewer/viewer-header.service';
import { ManualRedactionService } from '../../services/manual-redaction.service';
import { PdfViewer } from '../../../shared/components/reusable-pdf-viewer/pdf-viewer.service';
import { REDAnnotationManager } from '../../../shared/components/reusable-pdf-viewer/annotation-manager.service';
import { PdfViewer } from '../../../shared/components/pdf-viewer/pdf-viewer.service';
import { REDAnnotationManager } from '../../../shared/components/pdf-viewer/annotation-manager.service';
import { translateQuads } from '../../../../utils';
import { ROTATION_ACTION_BUTTONS } from '../../../shared/components/pdf-viewer/constants';
import Annotation = Core.Annotations.Annotation;
@Component({
@ -78,7 +79,7 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
private readonly _loadingService: LoadingService,
private readonly _pageRotationService: PageRotationService,
private readonly _fileDataService: FileDataService,
private readonly _headerConfigService: ViewerHeaderConfigService,
private readonly _viewerHeaderService: ViewerHeaderService,
private readonly _errorService: ErrorService,
private readonly _annotationManager: REDAnnotationManager,
readonly pdf: PdfViewer,
@ -102,7 +103,10 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
withLatestFrom(this._state.file$),
tap(() => this._errorService.clear()),
tap(([blob, file]) => this.pdf.loadDocument(blob, file)),
tap(() => this._pageRotationService.clearRotationsHideActions()),
tap(() => {
this._pageRotationService.clearRotations();
this._viewerHeaderService.disable(ROTATION_ACTION_BUTTONS);
}),
)
.subscribe();
}
@ -150,8 +154,8 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
},
this.instance.Core.PDFNet,
);
this._headerConfigService.disable([HeaderElements.COMPARE_BUTTON]);
this._headerConfigService.enable([HeaderElements.CLOSE_COMPARE_BUTTON]);
this._viewerHeaderService.disable([HeaderElements.COMPARE_BUTTON]);
this._viewerHeaderService.enable([HeaderElements.CLOSE_COMPARE_BUTTON]);
this._loadingService.stop();
};
@ -246,7 +250,7 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
}
private _configureElements() {
this._headerConfigService.initialize(this.compareFileInput);
this._viewerHeaderService.initialize(this.compareFileInput);
const dossierTemplateId = this.dossier.dossierTemplateId;
const color = this._annotationDrawService.getAndConvertColor(dossierTemplateId, 'manual');
@ -323,8 +327,8 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
}
private _cleanUpSelectionAndButtonState() {
this._headerConfigService.disable([HeaderElements.SHAPE_TOOL_GROUP_BUTTON]);
this._headerConfigService.enable([HeaderElements.SHAPE_TOOL_GROUP_BUTTON]);
this._viewerHeaderService.disable([HeaderElements.SHAPE_TOOL_GROUP_BUTTON]);
this._viewerHeaderService.enable([HeaderElements.SHAPE_TOOL_GROUP_BUTTON]);
}
private _configureTextPopup() {
@ -407,7 +411,7 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
// happens
}
this.pdf.enable(textPopupsToToggle);
this._headerConfigService.enable(headerItemsToToggle);
this._viewerHeaderService.enable(headerItemsToToggle);
if (this._selectedText.length > 2) {
this.pdf.enable([TextPopups.ADD_DICTIONARY, TextPopups.ADD_FALSE_POSITIVE]);
@ -432,7 +436,7 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
}
this.pdf.disable(textPopupElementsToDisable);
this._headerConfigService.disable(headerElementsToDisable);
this._viewerHeaderService.disable(headerElementsToDisable);
}
private _getManualRedaction(

View File

@ -11,9 +11,7 @@ import { AnnotationReferencesService } from './services/annotation-references.se
import { EntitiesService, FilterService, ListingService, SearchService } from '@iqser/common-ui';
import { AnnotationProcessingService } from './services/annotation-processing.service';
import { dossiersServiceProvider } from '@services/entity-services/dossiers.service.provider';
import { PageRotationService } from './services/page-rotation.service';
import { FileDataService } from './services/file-data.service';
import { ViewerHeaderConfigService } from './services/viewer-header-config.service';
import { AnnotationsListingService } from './services/annotations-listing.service';
import { StampService } from './services/stamp.service';
@ -29,12 +27,10 @@ export const filePreviewScreenProviders = [
AnnotationActionsService,
FilePreviewStateService,
AnnotationReferencesService,
PageRotationService,
AnnotationProcessingService,
FileDataService,
{ provide: EntitiesService, useExisting: FileDataService },
dossiersServiceProvider,
ViewerHeaderConfigService,
AnnotationsListingService,
{ provide: ListingService, useExisting: AnnotationsListingService },
SearchService,

View File

@ -43,15 +43,17 @@ import { FilePreviewStateService } from './services/file-preview-state.service';
import { filePreviewScreenProviders } from './file-preview-providers';
import { ManualRedactionService } from './services/manual-redaction.service';
import { DossiersService } from '@services/dossiers/dossiers.service';
import { PageRotationService } from './services/page-rotation.service';
import { PageRotationService } from '../shared/components/pdf-viewer/page-rotation.service';
import { ComponentCanDeactivate } from '@guards/can-deactivate.guard';
import { FilePreviewDialogService } from './services/file-preview-dialog.service';
import { FileDataService } from './services/file-data.service';
import { ActionsHelpModeKeys, ALL_HOTKEYS } from './utils/constants';
import { NGXLogger } from 'ngx-logger';
import { StampService } from './services/stamp.service';
import { PdfViewer } from '../shared/components/reusable-pdf-viewer/pdf-viewer.service';
import { REDAnnotationManager } from '../shared/components/reusable-pdf-viewer/annotation-manager.service';
import { PdfViewer } from '../shared/components/pdf-viewer/pdf-viewer.service';
import { REDAnnotationManager } from '../shared/components/pdf-viewer/annotation-manager.service';
import { ViewerHeaderService } from '../shared/components/pdf-viewer/viewer-header.service';
import { ROTATION_ACTION_BUTTONS } from '../shared/components/pdf-viewer/constants';
import Annotation = Core.Annotations.Annotation;
@Component({
@ -101,6 +103,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
private readonly _changeDetectorRef: ChangeDetectorRef,
private readonly _dialogService: FilePreviewDialogService,
private readonly _pageRotationService: PageRotationService,
private readonly _viewerHeaderService: ViewerHeaderService,
private readonly _annotationDrawService: AnnotationDrawService,
private readonly _annotationProcessingService: AnnotationProcessingService,
private readonly _stampService: StampService,
@ -138,6 +141,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
async save() {
await this._pageRotationService.applyRotation();
this._viewerHeaderService.disable(ROTATION_ACTION_BUTTONS);
}
async updateViewMode(): Promise<void> {

View File

@ -34,8 +34,8 @@ import { FilePreviewStateService } from './file-preview-state.service';
import { FilePreviewDialogService } from './file-preview-dialog.service';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
import { FileDataService } from './file-data.service';
import { PdfViewer } from '../../shared/components/reusable-pdf-viewer/pdf-viewer.service';
import { REDAnnotationManager } from '../../shared/components/reusable-pdf-viewer/annotation-manager.service';
import { PdfViewer } from '../../shared/components/pdf-viewer/pdf-viewer.service';
import { REDAnnotationManager } from '../../shared/components/pdf-viewer/annotation-manager.service';
import Quad = Core.Math.Quad;
@Injectable()

View File

@ -13,7 +13,7 @@ import { DictionariesMapService } from '@services/entity-services/dictionaries-m
import { FilePreviewStateService } from './file-preview-state.service';
import { FileDataService } from './file-data.service';
import { SuperTypes } from '@models/file/super-types';
import { PdfViewer } from '../../shared/components/reusable-pdf-viewer/pdf-viewer.service';
import { PdfViewer } from '../../shared/components/pdf-viewer/pdf-viewer.service';
import Annotation = Core.Annotations.Annotation;
import Quad = Core.Math.Quad;

View File

@ -3,8 +3,8 @@ import { Injectable } from '@angular/core';
import { EntitiesService, FilterService, ListingService, SearchService } from '@iqser/common-ui';
import { filter, tap } from 'rxjs/operators';
import { MultiSelectService } from './multi-select.service';
import { PdfViewer } from '../../shared/components/reusable-pdf-viewer/pdf-viewer.service';
import { REDAnnotationManager } from '../../shared/components/reusable-pdf-viewer/annotation-manager.service';
import { PdfViewer } from '../../shared/components/pdf-viewer/pdf-viewer.service';
import { REDAnnotationManager } from '../../shared/components/pdf-viewer/annotation-manager.service';
@Injectable()
export class AnnotationsListingService extends ListingService<AnnotationWrapper> {

View File

@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
import { skip, tap } from 'rxjs/operators';
import { shareDistinctLast } from '@iqser/common-ui';
import { REDAnnotationManager } from '../../shared/components/reusable-pdf-viewer/annotation-manager.service';
import { REDAnnotationManager } from '../../shared/components/pdf-viewer/annotation-manager.service';
@Injectable()
export class SkippedService {

View File

@ -7,7 +7,7 @@ import { TranslateService } from '@ngx-translate/core';
import { Core } from '@pdftron/webviewer';
import { firstValueFrom } from 'rxjs';
import { WatermarkService } from '@services/entity-services/watermark.service';
import { PdfViewer } from '../../shared/components/reusable-pdf-viewer/pdf-viewer.service';
import { PdfViewer } from '../../shared/components/pdf-viewer/pdf-viewer.service';
import PDFNet = Core.PDFNet;
@Injectable()

View File

@ -23,8 +23,10 @@ import { ExcludedPagesService } from '../../../file-preview/services/excluded-pa
import { DocumentInfoService } from '../../../file-preview/services/document-info.service';
import { ExpandableFileActionsComponent } from '@shared/components/expandable-file-actions/expandable-file-actions.component';
import { firstValueFrom, Observable } from 'rxjs';
import { PageRotationService } from '../../../file-preview/services/page-rotation.service';
import { PageRotationService } from '../../../shared/components/pdf-viewer/page-rotation.service';
import { FileAssignService } from '../../services/file-assign.service';
import { ViewerHeaderService } from '../../../shared/components/pdf-viewer/viewer-header.service';
import { ROTATION_ACTION_BUTTONS } from '../../../shared/components/pdf-viewer/constants';
@Component({
selector: 'redaction-file-actions [file] [type] [dossier]',
@ -77,7 +79,8 @@ export class FileActionsComponent implements OnChanges {
constructor(
@Optional() private readonly _excludedPagesService: ExcludedPagesService,
@Optional() private readonly _documentInfoService: DocumentInfoService,
@Optional() private readonly _pageRotationService: PageRotationService,
private readonly _pageRotationService: PageRotationService,
private readonly _viewerHeaderService: ViewerHeaderService,
private readonly _permissionsService: PermissionsService,
private readonly _activeDossiersService: ActiveDossiersService,
private readonly _dialogService: DossiersDialogService,
@ -362,6 +365,7 @@ export class FileActionsComponent implements OnChanges {
}
if (this._pageRotationService) {
await firstValueFrom(this._pageRotationService.showConfirmationDialogIfHasRotations());
this._viewerHeaderService.disable(ROTATION_ACTION_BUTTONS);
}
this._loadingService.start();
await firstValueFrom(this._reanalysisService.ocrFiles([this.file], this.file.dossierId));

View File

@ -1,11 +1,11 @@
import { Injectable } from '@angular/core';
import { Core } from '@pdftron/webviewer';
import type { List } from '@iqser/common-ui';
import { AnnotationPredicate, DeleteAnnotationsOptions } from '@shared/components/reusable-pdf-viewer/types';
import { AnnotationPredicate, DeleteAnnotationsOptions } from '@shared/components/pdf-viewer/types';
import type { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { fromEvent, Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { getIds } from '@shared/components/reusable-pdf-viewer/functions';
import { getIds } from '@shared/components/pdf-viewer/functions';
import AnnotationManager = Core.AnnotationManager;
import Annotation = Core.Annotations.Annotation;

View File

@ -1,5 +1,8 @@
import { CustomError, List } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { HeaderElements } from '../../../file-preview/utils/constants';
export const ROTATION_ACTION_BUTTONS = [HeaderElements.APPLY_ROTATION, HeaderElements.DISCARD_ROTATION];
export const ALLOWED_KEYBOARD_SHORTCUTS: List = ['+', '-', 'p', 'r', 'Escape'] as const;

View File

@ -1,6 +1,6 @@
import { List } from '@iqser/common-ui';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { ALLOWED_KEYBOARD_SHORTCUTS } from '@shared/components/reusable-pdf-viewer/constants';
import { ALLOWED_KEYBOARD_SHORTCUTS } from '@shared/components/pdf-viewer/constants';
export function stopAndPrevent<T extends Event>($event: T) {
$event.preventDefault();

View File

@ -1,10 +1,8 @@
import { Injectable } from '@angular/core';
import { BehaviorSubject, firstValueFrom, of } from 'rxjs';
import { RotationType, RotationTypes } from '@red/domain';
import { FileManagementService } from '@services/files/file-management.service';
import { FilePreviewStateService } from './file-preview-state.service';
import { distinctUntilChanged, map, switchMap, tap, withLatestFrom } from 'rxjs/operators';
import { HeaderElements } from '../utils/constants';
import { FileManagementService } from '../../../../services/files/file-management.service';
import { distinctUntilChanged, map, switchMap, tap } from 'rxjs/operators';
import {
ConfirmationDialogComponent,
ConfirmationDialogInput,
@ -14,14 +12,17 @@ import {
} from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { MatDialog } from '@angular/material/dialog';
import { ViewerHeaderConfigService } from './viewer-header-config.service';
import { FilesService } from '@services/files/files.service';
import { PdfViewer } from '../../shared/components/reusable-pdf-viewer/pdf-viewer.service';
import { FilesService } from '../../../../services/files/files.service';
import { PdfViewer } from './pdf-viewer.service';
import { ActivatedRoute } from '@angular/router';
import { FilesMapService } from '../../../../services/files/files-map.service';
import { NGXLogger } from 'ngx-logger';
const ACTION_BUTTONS = [HeaderElements.APPLY_ROTATION, HeaderElements.DISCARD_ROTATION];
const ONE_ROTATION_DEGREE = 90;
@Injectable()
@Injectable({
providedIn: 'root',
})
export class PageRotationService {
readonly #rotations$ = new BehaviorSubject<Record<number, number>>({});
@ -29,13 +30,14 @@ export class PageRotationService {
private readonly _pdf: PdfViewer,
private readonly _dialog: MatDialog,
private readonly _loadingService: LoadingService,
private readonly _screenState: FilePreviewStateService,
private readonly _activatedRoute: ActivatedRoute,
private readonly _logger: NGXLogger,
private readonly _fileManagementService: FileManagementService,
private readonly _filesService: FilesService,
private readonly _headerConfigService: ViewerHeaderConfigService,
private readonly _filesMapService: FilesMapService,
) {}
isRotated(page: number) {
isRotated$(page: number) {
return this.#rotations$.pipe(
map(rotations => !!rotations[page]),
distinctUntilChanged(),
@ -49,17 +51,25 @@ export class PageRotationService {
applyRotation() {
this._loadingService.start();
const pages = this.#rotations$.value;
const { dossierId, fileId } = this._screenState;
const request = this._fileManagementService.rotatePage({ pages }, dossierId, fileId);
this.clearRotationsHideActions();
const dossierId = this._activatedRoute.snapshot.paramMap.get('dossierId');
const fileId = this._activatedRoute.snapshot.paramMap.get('fileId');
return firstValueFrom(
request.pipe(
withLatestFrom(this._screenState.file$),
switchMap(([, file]) => this._filesService.reload(dossierId, file)),
tap(() => this._loadingService.stop()),
),
);
if (!dossierId || !fileId) {
this._loadingService.stop();
return this._logger.error('No dossier id or file id while applying rotations: ', dossierId, fileId);
}
const file = this._filesMapService.get(dossierId, fileId);
if (!file) {
this._loadingService.stop();
return this._logger.error('Cannot find file: ', dossierId, fileId);
}
const request$ = this._fileManagementService.rotatePage({ pages }, dossierId, fileId);
this.clearRotations();
const reloaded$ = request$.pipe(switchMap(() => this._filesService.reload(dossierId, file)));
return firstValueFrom(reloaded$.pipe(tap(() => this._loadingService.stop())));
}
discardRotation() {
@ -72,7 +82,7 @@ export class PageRotationService {
}
}
this.clearRotationsHideActions();
this.clearRotations();
}
addRotation(rotation: RotationType): void {
@ -87,24 +97,17 @@ export class PageRotationService {
} else {
this._pdf.documentViewer.rotateClockwise(pageNumber);
}
if (this.hasRotations()) {
this.#showActionButtons();
} else {
this.#hideActionButtons();
}
}
clearRotations() {
this.#rotations$.next({});
}
clearRotationsHideActions() {
this.clearRotations();
this.#hideActionButtons();
showConfirmationDialogIfHasRotations() {
return this.hasRotations() ? this.#showConfirmationDialog() : of(ConfirmOptions.DISCARD_CHANGES);
}
showConfirmationDialog() {
#showConfirmationDialog() {
const ref = this._dialog.open(ConfirmationDialogComponent, {
...defaultDialogConfig,
data: new ConfirmationDialogInput({
@ -119,16 +122,4 @@ export class PageRotationService {
.afterClosed()
.pipe(tap((option: ConfirmOptions) => (option === ConfirmOptions.CONFIRM ? this.applyRotation() : this.discardRotation())));
}
showConfirmationDialogIfHasRotations() {
return this.hasRotations() ? this.showConfirmationDialog() : of(ConfirmOptions.DISCARD_CHANGES);
}
#showActionButtons() {
this._headerConfigService.enable(ACTION_BUTTONS);
}
#hideActionButtons() {
this._headerConfigService.disable(ACTION_BUTTONS);
}
}

View File

@ -1,6 +1,6 @@
import { Component, ElementRef, ViewChild } from '@angular/core';
import { PdfViewer } from './pdf-viewer.service';
import { REDAnnotationManager } from '@shared/components/reusable-pdf-viewer/annotation-manager.service';
import { REDAnnotationManager } from '@shared/components/pdf-viewer/annotation-manager.service';
@Component({
selector: 'redaction-pdf-viewer',

View File

@ -10,10 +10,10 @@ import { BehaviorSubject, combineLatest, fromEvent, merge, Observable } from 'rx
import { ConfigService } from '@services/config.service';
import { NGXLogger } from 'ngx-logger';
import { DISABLED_HOTKEYS, DOCUMENT_LOADING_ERROR, USELESS_ELEMENTS } from './constants';
import { Rgb } from '@shared/components/reusable-pdf-viewer/types';
import { Rgb } from '@shared/components/pdf-viewer/types';
import { UserPreferenceService } from '@services/user-preference.service';
import { asList, stopAndPrevent, stopAndPreventIfNotAllowed } from '@shared/components/reusable-pdf-viewer/functions';
import { REDAnnotationManager } from '@shared/components/reusable-pdf-viewer/annotation-manager.service';
import { asList, stopAndPrevent, stopAndPreventIfNotAllowed } from '@shared/components/pdf-viewer/functions';
import { REDAnnotationManager } from '@shared/components/pdf-viewer/annotation-manager.service';
import AnnotationManager = Core.AnnotationManager;
import TextTool = Core.Tools.TextTool;
import Annotation = Core.Annotations.Annotation;

View File

@ -1,21 +1,25 @@
import { ElementRef, Inject, Injectable, Injector } from '@angular/core';
import { IHeaderElement, RotationTypes } from '@red/domain';
import { HeaderElements, HeaderElementType } from '../utils/constants';
import { HeaderElements, HeaderElementType } from '../../../file-preview/utils/constants';
import { TranslateService } from '@ngx-translate/core';
import { BASE_HREF } from '../../../tokens';
import { TooltipsService } from '../../shared/components/reusable-pdf-viewer/tooltips.service';
import { environment } from '@environments/environment';
import { FilePreviewStateService } from './file-preview-state.service';
import { BASE_HREF_FN, BaseHrefFn } from '../../../../tokens';
import { TooltipsService } from './tooltips.service';
import { PageRotationService } from './page-rotation.service';
import { PdfViewer } from '../../shared/components/reusable-pdf-viewer/pdf-viewer.service';
import { PdfViewer } from './pdf-viewer.service';
import { ROTATION_ACTION_BUTTONS } from './constants';
import { ActivatedRoute } from '@angular/router';
import { FilesMapService } from '../../../../services/files/files-map.service';
@Injectable()
export class ViewerHeaderConfigService {
private _divider: IHeaderElement = {
type: 'divider',
};
private _buttons: Map<HeaderElementType, IHeaderElement>;
private _config: Map<HeaderElementType, boolean> = new Map<HeaderElementType, boolean>([
const divider: IHeaderElement = {
type: 'divider',
};
@Injectable({
providedIn: 'root',
})
export class ViewerHeaderService {
#buttons: Map<HeaderElementType, IHeaderElement>;
readonly #config = new Map<HeaderElementType, boolean>([
[HeaderElements.SHAPE_TOOL_GROUP_BUTTON, true],
[HeaderElements.TOGGLE_TOOLTIPS, true],
[HeaderElements.COMPARE_BUTTON, true],
@ -25,15 +29,15 @@ export class ViewerHeaderConfigService {
[HeaderElements.APPLY_ROTATION, false],
[HeaderElements.DISCARD_ROTATION, false],
]);
private _rotationService: PageRotationService;
#docBeforeCompare: Blob;
constructor(
@Inject(BASE_HREF) private readonly _baseHref: string,
@Inject(BASE_HREF_FN) private readonly _convertPath: BaseHrefFn,
private readonly _injector: Injector,
private readonly _translateService: TranslateService,
private readonly _pdf: PdfViewer,
private readonly _rotationService: PageRotationService,
private readonly _tooltipsService: TooltipsService,
private readonly _stateService: FilePreviewStateService,
) {}
private get _rectangle(): IHeaderElement {
@ -66,9 +70,7 @@ export class ViewerHeaderConfigService {
dataElement: HeaderElements.CLOSE_COMPARE_BUTTON,
img: this._convertPath('/assets/icons/general/pdftron-action-close-compare.svg'),
title: 'Leave Compare Mode',
onClick: async () => {
await this._closeCompareMode();
},
onClick: () => this._closeCompareMode(),
};
}
@ -78,7 +80,10 @@ export class ViewerHeaderConfigService {
element: HeaderElements.ROTATE_LEFT_BUTTON,
dataElement: HeaderElements.ROTATE_LEFT_BUTTON,
img: this._convertPath('/assets/icons/general/rotate-left.svg'),
onClick: () => this._rotationService.addRotation(RotationTypes.LEFT),
onClick: () => {
this._rotationService.addRotation(RotationTypes.LEFT);
this.#toggleRotationActionButtons();
},
};
}
@ -98,6 +103,7 @@ export class ViewerHeaderConfigService {
`;
paragraph.addEventListener('click', async () => {
await this._rotationService.applyRotation();
this.disable(ROTATION_ACTION_BUTTONS);
});
return paragraph;
},
@ -118,7 +124,10 @@ export class ViewerHeaderConfigService {
cursor: pointer;
opacity: 0.7;
`;
paragraph.addEventListener('click', () => this._rotationService.discardRotation());
paragraph.addEventListener('click', () => {
this._rotationService.discardRotation();
this.disable(ROTATION_ACTION_BUTTONS);
});
return paragraph;
},
};
@ -130,14 +139,15 @@ export class ViewerHeaderConfigService {
element: HeaderElements.ROTATE_RIGHT_BUTTON,
dataElement: HeaderElements.ROTATE_RIGHT_BUTTON,
img: this._convertPath('/assets/icons/general/rotate-right.svg'),
onClick: () => this._rotationService.addRotation(RotationTypes.RIGHT),
onClick: () => {
this._rotationService.addRotation(RotationTypes.RIGHT);
this.#toggleRotationActionButtons();
},
};
}
initialize(compareFileInput: ElementRef): void {
this._rotationService = this._injector.get<PageRotationService>(PageRotationService);
this._buttons = new Map([
this.#buttons = new Map([
[HeaderElements.SHAPE_TOOL_GROUP_BUTTON, this._rectangle],
[HeaderElements.ROTATE_LEFT_BUTTON, this._rotateLeft],
[HeaderElements.ROTATE_RIGHT_BUTTON, this._rotateRight],
@ -159,15 +169,23 @@ export class ViewerHeaderConfigService {
this._updateState(elements, false);
}
private async _closeCompareMode() {
this._pdf.closeCompareMode();
const pdfNet = this._pdf.PDFNet;
await pdfNet.initialize(environment.licenseKey ? atob(environment.licenseKey) : null);
const blob = await this._stateService.blob;
const currentDocument = await pdfNet.PDFDoc.createFromBuffer(await blob.arrayBuffer());
#toggleRotationActionButtons() {
if (this._rotationService.hasRotations()) {
this.enable(ROTATION_ACTION_BUTTONS);
} else {
this.disable(ROTATION_ACTION_BUTTONS);
}
}
const filename = this._stateService.file.filename ?? 'document.pdf';
this._pdf.instance.UI.loadDocument(currentDocument, { filename });
private _closeCompareMode() {
this._pdf.closeCompareMode();
const activatedRoute = this._injector.get(ActivatedRoute);
const dossierId = activatedRoute.snapshot.paramMap.get('dossierId');
const fileId = activatedRoute.snapshot.paramMap.get('fileId');
const file = this._injector.get(FilesMapService).get(dossierId, fileId);
const filename = file.filename ?? 'document.pdf';
this._pdf.instance.UI.loadDocument(this.#docBeforeCompare, { filename });
this.disable([HeaderElements.CLOSE_COMPARE_BUTTON]);
this.enable([HeaderElements.COMPARE_BUTTON]);
@ -182,15 +200,20 @@ export class ViewerHeaderConfigService {
dataElement: HeaderElements.COMPARE_BUTTON,
img: this._convertPath('/assets/icons/general/pdftron-action-compare.svg'),
title: 'Compare',
onClick: () => compareFileInput.nativeElement.click(),
onClick: async () => {
compareFileInput.nativeElement.click();
const data = await this._pdf.documentViewer.getDocument().getFileData();
const arr = new Uint8Array(data);
this.#docBeforeCompare = new Blob([arr], { type: 'application/pdf' });
},
};
}
private _pushGroup(items: IHeaderElement[], group: HeaderElementType[]): void {
const enabledItems = group.filter(item => this._isEnabled(item));
if (enabledItems.length) {
items.push(this._divider);
enabledItems.forEach(item => items.push(this._buttons.get(item)));
items.push(divider);
enabledItems.forEach(item => items.push(this.#buttons.get(item)));
}
}
@ -214,15 +237,11 @@ export class ViewerHeaderConfigService {
}
private _updateState(elements: HeaderElementType[], value: boolean): void {
elements.forEach(element => this._config.set(element, value));
elements.forEach(element => this.#config.set(element, value));
this._updateElements();
}
private _isEnabled(key: HeaderElementType): boolean {
return this._config.get(key);
}
private _convertPath(path: string): string {
return this._baseHref + path;
return this.#config.get(key);
}
}