RED-3988: make annotations draw service global

This commit is contained in:
Dan Percic 2022-05-22 11:31:03 +03:00
parent afde721ddf
commit 94ab93cfaf
11 changed files with 137 additions and 123 deletions

View File

@ -8,7 +8,6 @@ import { AnnotationReferencesService } from '../../services/annotation-reference
import { MultiSelectService } from '../../services/multi-select.service';
import { FilePreviewStateService } from '../../services/file-preview-state.service';
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 '../../../pdf-viewer/services/annotation-manager.service';
@ -43,7 +42,6 @@ export class AnnotationActionsComponent implements OnChanges {
private readonly _annotationManager: REDAnnotationManager,
private readonly _state: FilePreviewStateService,
private readonly _permissionsService: PermissionsService,
private readonly _fileDataService: FileDataService,
private readonly _dictionariesMapService: DictionariesMapService,
) {}
@ -96,14 +94,14 @@ export class AnnotationActionsComponent implements OnChanges {
$event.stopPropagation();
this._annotationManager.hide(this.viewerAnnotations);
this._annotationManager.deselect();
this._fileDataService.updateHiddenAnnotations(this.viewerAnnotations, true);
this._annotationManager.hidden.add(this.viewerAnnotations[0].Id);
}
showAnnotation($event: MouseEvent) {
$event.stopPropagation();
this._annotationManager.show(this.viewerAnnotations);
this._annotationManager.deselect();
this._fileDataService.updateHiddenAnnotations(this.viewerAnnotations, false);
this._annotationManager.hidden.delete(this.viewerAnnotations[0].Id);
}
resize($event: MouseEvent) {

View File

@ -8,7 +8,7 @@ import {
ManualRedactionEntryWrapper,
} from '@models/file/manual-redaction-entry.wrapper';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { AnnotationDrawService } from '../../services/annotation-draw.service';
import { AnnotationDrawService } from '../../../pdf-viewer/services/annotation-draw.service';
import { AnnotationActionsService } from '../../services/annotation-actions.service';
import { UserPreferenceService } from '@services/user-preference.service';
import { BASE_HREF_FN, BaseHrefFn } from '../../../../tokens';
@ -26,7 +26,12 @@ import { ManualRedactionService } from '../../services/manual-redaction.service'
import { PdfViewer } from '../../../pdf-viewer/services/pdf-viewer.service';
import { REDAnnotationManager } from '../../../pdf-viewer/services/annotation-manager.service';
import { translateQuads } from '../../../../utils';
import { ROTATION_ACTION_BUTTONS } from '../../../pdf-viewer/utils/constants';
import {
ALLOWED_ACTIONS_WHEN_PAGE_EXCLUDED,
HEADER_ITEMS_TO_TOGGLE,
ROTATION_ACTION_BUTTONS,
TEXT_POPUPS_TO_TOGGLE,
} from '../../../pdf-viewer/utils/constants';
import Annotation = Core.Annotations.Annotation;
@Component({
@ -163,7 +168,7 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
private _configureElements() {
const dossierTemplateId = this.dossier.dossierTemplateId;
const color = this._annotationDrawService.getAndConvertColor(dossierTemplateId, 'manual');
const color = this._annotationDrawService.getAndConvertColor(dossierTemplateId, dossierTemplateId, 'manual');
this.pdf.setRectangleToolStyles(color);
}
@ -197,11 +202,12 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
this._ngZone.run(() => {
if (allAreVisible) {
this._annotationManager.hide(viewerAnnotations);
this._annotationManager.hidden.add(viewerAnnotations[0].Id);
} else {
this._annotationManager.show(viewerAnnotations);
this._annotationManager.hidden.delete(viewerAnnotations[0].Id);
}
this._annotationManager.deselect();
this._fileDataService.updateHiddenAnnotations(viewerAnnotations, allAreVisible);
});
},
},
@ -305,13 +311,6 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
}
private _handleCustomActions() {
const textPopupsToToggle = [TextPopups.ADD_REDACTION, TextPopups.ADD_RECTANGLE, TextPopups.ADD_FALSE_POSITIVE];
const headerItemsToToggle = [
HeaderElements.SHAPE_TOOL_GROUP_BUTTON,
HeaderElements.ROTATE_LEFT_BUTTON,
HeaderElements.ROTATE_RIGHT_BUTTON,
];
const isCurrentPageExcluded = this._state.file.isPageExcluded(this.pdf.currentPage);
if (this.canPerformActions && !isCurrentPageExcluded) {
@ -320,8 +319,8 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
} catch (e) {
// happens
}
this.pdf.enable(textPopupsToToggle);
this._viewerHeaderService.enable(headerItemsToToggle);
this.pdf.enable(TEXT_POPUPS_TO_TOGGLE);
this._viewerHeaderService.enable(HEADER_ITEMS_TO_TOGGLE);
if (this._selectedText.length > 2) {
this.pdf.enable([TextPopups.ADD_DICTIONARY, TextPopups.ADD_FALSE_POSITIVE]);
@ -330,17 +329,14 @@ export class PdfPaginatorComponent extends AutoUnsubscribe implements OnInit, On
return;
}
let textPopupElementsToDisable = [...textPopupsToToggle];
let headerElementsToDisable = [...headerItemsToToggle];
let textPopupElementsToDisable = [...TEXT_POPUPS_TO_TOGGLE];
let headerElementsToDisable = [...HEADER_ITEMS_TO_TOGGLE];
if (isCurrentPageExcluded) {
const allowedActionsWhenPageExcluded: string[] = [
TextPopups.ADD_RECTANGLE,
TextPopups.ADD_REDACTION,
HeaderElements.SHAPE_TOOL_GROUP_BUTTON,
];
textPopupElementsToDisable = textPopupElementsToDisable.filter(element => !allowedActionsWhenPageExcluded.includes(element));
headerElementsToDisable = headerElementsToDisable.filter(element => !allowedActionsWhenPageExcluded.includes(element));
textPopupElementsToDisable = textPopupElementsToDisable.filter(
element => !ALLOWED_ACTIONS_WHEN_PAGE_EXCLUDED.includes(element),
);
headerElementsToDisable = headerElementsToDisable.filter(element => !ALLOWED_ACTIONS_WHEN_PAGE_EXCLUDED.includes(element));
} else {
this.instance.UI.disableTools(['AnnotationCreateRectangle']);
}

View File

@ -4,7 +4,6 @@ import { MultiSelectService } from './services/multi-select.service';
import { DocumentInfoService } from './services/document-info.service';
import { CommentingService } from './services/commenting.service';
import { SkippedService } from './services/skipped.service';
import { AnnotationDrawService } from './services/annotation-draw.service';
import { AnnotationActionsService } from './services/annotation-actions.service';
import { FilePreviewStateService } from './services/file-preview-state.service';
import { AnnotationReferencesService } from './services/annotation-references.service';
@ -23,7 +22,6 @@ export const filePreviewScreenProviders = [
DocumentInfoService,
CommentingService,
SkippedService,
AnnotationDrawService,
AnnotationActionsService,
FilePreviewStateService,
AnnotationReferencesService,

View File

@ -21,7 +21,7 @@ import {
import { MatDialogRef, MatDialogState } from '@angular/material/dialog';
import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry.wrapper';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { AnnotationDrawService } from './services/annotation-draw.service';
import { AnnotationDrawService } from '../pdf-viewer/services/annotation-draw.service';
import { AnnotationProcessingService } from './services/annotation-processing.service';
import { File, ViewMode, ViewModes } from '@red/domain';
import { PermissionsService } from '@services/permissions.service';
@ -54,6 +54,7 @@ import { PdfViewer } from '../pdf-viewer/services/pdf-viewer.service';
import { REDAnnotationManager } from '../pdf-viewer/services/annotation-manager.service';
import { ViewerHeaderService } from '../pdf-viewer/services/viewer-header.service';
import { ROTATION_ACTION_BUTTONS } from '../pdf-viewer/utils/constants';
import { SkippedService } from './services/skipped.service';
import Annotation = Core.Annotations.Annotation;
@Component({
@ -98,6 +99,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
private readonly _loadingService: LoadingService,
private readonly _filesMapService: FilesMapService,
private readonly _dossiersService: DossiersService,
private readonly _skippedService: SkippedService,
private readonly _fileDataService: FileDataService,
private readonly _viewModeService: ViewModeService,
private readonly _changeDetectorRef: ChangeDetectorRef,
@ -185,7 +187,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
this._loadingService.start();
this._annotationManager.hide(annotations);
const highlights = await this._fileDataService.loadTextHighlights();
await this._annotationDrawService.draw(highlights);
await this._annotationDrawService.draw(highlights, this.state.dossierTemplateId, this._skippedService.hideSkipped);
this._loadingService.stop();
}
}
@ -211,6 +213,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
await this.ngOnInit();
await this._fileDataService.loadRedactionLog();
this._viewerHeaderService.updateElements();
this._lastPage = previousRoute.queryParams.page;
this._changeDetectorRef.markForCheck();
}
@ -557,7 +560,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
this._handleDeltaAnnotationFilters(currentFilters, this._fileDataService.all);
}
await this._annotationDrawService.draw(newAnnotations);
await this._annotationDrawService.draw(newAnnotations, this.state.dossierTemplateId, this._skippedService.hideSkipped);
this._logger.info(`[ANNOTATIONS] Redraw time: ${new Date().getTime() - startTime} ms for ${newAnnotations.length} annotations`);
}

View File

@ -20,7 +20,7 @@ import {
TextHighlightOperation,
} from '@red/domain';
import { toPosition } from '../utils/pdf-calculation.utils';
import { AnnotationDrawService } from './annotation-draw.service';
import { AnnotationDrawService } from '../../pdf-viewer/services/annotation-draw.service';
import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service';
import {
AcceptRecommendationData,
@ -36,6 +36,7 @@ import { DictionariesMapService } from '@services/entity-services/dictionaries-m
import { FileDataService } from './file-data.service';
import { PdfViewer } from '../../pdf-viewer/services/pdf-viewer.service';
import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service';
import { SkippedService } from './skipped.service';
import Quad = Core.Math.Quad;
@Injectable()
@ -56,6 +57,7 @@ export class AnnotationActionsService {
private readonly _dictionariesMapService: DictionariesMapService,
private readonly _state: FilePreviewStateService,
private readonly _fileDataService: FileDataService,
private readonly _skippedService: SkippedService,
private readonly _listingService: ListingService<AnnotationWrapper>,
) {}
@ -438,7 +440,7 @@ export class AnnotationActionsService {
annotationWrapper.resizing = false;
this._annotationManager.delete(annotationWrapper);
await this._annotationDrawService.draw([annotationWrapper]);
await this._annotationDrawService.draw([annotationWrapper], this._state.dossierTemplateId, this._skippedService.hideSkipped);
this._annotationManager.deselect();
await this._fileDataService.annotationsChanged();
}
@ -474,7 +476,12 @@ export class AnnotationActionsService {
annotation.ReadOnly = false;
annotation.Hidden = false;
annotation.disableRotationControl();
annotation.FillColor = this._annotationDrawService.getAndConvertColor(annotationWrapper.superType, annotationWrapper.type);
const dossierTemplateId = this._state.dossierTemplateId;
annotation.FillColor = this._annotationDrawService.getAndConvertColor(
annotationWrapper.superType,
dossierTemplateId,
annotationWrapper.type,
);
annotation.StrokeColor = annotation.FillColor;
annotation.Opacity = 0.6;
annotation.StrokeThickness = 1;

View File

@ -19,7 +19,6 @@ import dayjs from 'dayjs';
import { NGXLogger } from 'ngx-logger';
import { MultiSelectService } from './multi-select.service';
import { FilesService } from '@services/files/files.service';
import Annotation = Core.Annotations.Annotation;
const DELTA_VIEW_TIME = 10 * 60 * 1000; // 10 minutes;
@ -113,19 +112,6 @@ export class FileDataService extends EntitiesService<AnnotationWrapper> {
return firstValueFrom(redactionLog$.pipe(tap(redactionLog => this.#redactionLog$.next(redactionLog))));
}
updateHiddenAnnotations(viewerAnnotations: Annotation[], hidden: boolean) {
const annotationId = viewerAnnotations[0].Id;
if (hidden) {
this.hiddenAnnotations.add(annotationId);
} else {
this.hiddenAnnotations.delete(annotationId);
}
}
isHidden(annotationId: string) {
return this.hiddenAnnotations.has(annotationId);
}
#checkMissingTypes() {
if (this.missingTypes.size > 0) {
this._toaster.error(_('error.missing-types'), {

View File

@ -9,11 +9,12 @@ import { TooltipsService } from './services/tooltips.service';
import { ViewerHeaderService } from './services/viewer-header.service';
import { PaginatorComponent } from './components/paginator/paginator.component';
import { MatIconModule } from '@angular/material/icon';
import { AnnotationDrawService } from './services/annotation-draw.service';
@NgModule({
declarations: [PdfViewerComponent, CompareFileInputComponent, PaginatorComponent],
exports: [PdfViewerComponent],
imports: [CommonModule, MatIconModule],
providers: [PdfViewer, REDAnnotationManager, PageRotationService, TooltipsService, ViewerHeaderService],
providers: [PdfViewer, REDAnnotationManager, PageRotationService, TooltipsService, ViewerHeaderService, AnnotationDrawService],
})
export class PdfViewerModule {}

View File

@ -1,19 +1,19 @@
import { Injectable } from '@angular/core';
import { Core } from '@pdftron/webviewer';
import { hexToRgb } from '../../../utils';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
import { UserPreferenceService } from '@services/user-preference.service';
import { RedactionLogService } from '@services/files/redaction-log.service';
import { environment } from '@environments/environment';
import { AnnotationWrapper } from '../../../models/file/annotation.wrapper';
import { UserPreferenceService } from '../../../services/user-preference.service';
import { RedactionLogService } from '../../../services/files/redaction-log.service';
import { environment } from '../../../../environments/environment';
import { IRectangle, ISectionGrid, ISectionRectangle } from '@red/domain';
import { SkippedService } from './skipped.service';
import { DOSSIER_ID, FILE_ID, IRectangle, ISectionGrid, ISectionRectangle } from '@red/domain';
import { firstValueFrom } from 'rxjs';
import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service';
import { FilePreviewStateService } from './file-preview-state.service';
import { FileDataService } from './file-data.service';
import { SuperTypes } from '@models/file/super-types';
import { PdfViewer } from '../../pdf-viewer/services/pdf-viewer.service';
import { DictionariesMapService } from '../../../services/entity-services/dictionaries-map.service';
import { SuperTypes } from '../../../models/file/super-types';
import { PdfViewer } from './pdf-viewer.service';
import { ActivatedRoute } from '@angular/router';
import { REDAnnotationManager } from './annotation-manager.service';
import { List } from '@iqser/common-ui';
import Annotation = Core.Annotations.Annotation;
import Quad = Core.Math.Quad;
@ -26,39 +26,18 @@ export class AnnotationDrawService {
private readonly _dictionariesMapService: DictionariesMapService,
private readonly _redactionLogService: RedactionLogService,
private readonly _userPreferenceService: UserPreferenceService,
private readonly _skippedService: SkippedService,
private readonly _activatedRoute: ActivatedRoute,
private readonly _annotationManager: REDAnnotationManager,
private readonly _pdf: PdfViewer,
private readonly _state: FilePreviewStateService,
private readonly _fileDataService: FileDataService,
) {}
draw(annotations: readonly AnnotationWrapper[]) {
draw(annotations: List<AnnotationWrapper>, dossierTemplateId: string, hideSkipped: boolean) {
const licenseKey = environment.licenseKey ? atob(environment.licenseKey) : null;
return this._pdf.PDFNet.runWithCleanup(() => this._draw(annotations), licenseKey);
return this._pdf.PDFNet.runWithCleanup(() => this._draw(annotations, dossierTemplateId, hideSkipped), licenseKey);
}
getColor(superType: string, dictionary?: string) {
let color: string;
switch (superType) {
case SuperTypes.Hint:
case SuperTypes.Redaction:
color = this._dictionariesMapService.getDictionaryColor(dictionary, this._state.dossierTemplateId);
break;
case SuperTypes.Recommendation:
color = this._dictionariesMapService.getDictionaryColor(dictionary, this._state.dossierTemplateId, true);
break;
case SuperTypes.Skipped:
color = this._dictionariesMapService.getDictionaryColor(superType, this._state.dossierTemplateId);
break;
default:
color = this._dictionariesMapService.getDictionaryColor(superType, this._state.dossierTemplateId);
break;
}
return color;
}
getAndConvertColor(superType: string, dictionary?: string) {
return this.convertColor(this.getColor(superType, dictionary));
getAndConvertColor(superType: string, dossierTemplateId: string, dictionary?: string) {
return this.convertColor(this.#getColor(superType, dossierTemplateId, dictionary));
}
convertColor(hexColor: string) {
@ -81,25 +60,48 @@ export class AnnotationDrawService {
return this._pdf.quad(x1, y1, x2, y2, x3, y3, x4, y4);
}
private async _draw(annotationWrappers: readonly AnnotationWrapper[]) {
const annotations = annotationWrappers.map(annotation => this._computeAnnotation(annotation)).filter(a => !!a);
#getColor(superType: string, dossierTemplateId: string, dictionary?: string) {
let color: string;
switch (superType) {
case SuperTypes.Hint:
case SuperTypes.Redaction:
color = this._dictionariesMapService.getDictionaryColor(dictionary, dossierTemplateId);
break;
case SuperTypes.Recommendation:
color = this._dictionariesMapService.getDictionaryColor(dictionary, dossierTemplateId, true);
break;
case SuperTypes.Skipped:
color = this._dictionariesMapService.getDictionaryColor(superType, dossierTemplateId);
break;
default:
color = this._dictionariesMapService.getDictionaryColor(superType, dossierTemplateId);
break;
}
return color;
}
private async _draw(annotationWrappers: List<AnnotationWrapper>, dossierTemplateId: string, hideSkipped: boolean) {
const annotations = annotationWrappers
.map(annotation => this._computeAnnotation(annotation, dossierTemplateId, hideSkipped))
.filter(a => !!a);
this._pdf.annotationManager.addAnnotations(annotations, { imported: true });
await this._pdf.annotationManager.drawAnnotationsFromList(annotations);
if (this._userPreferenceService.areDevFeaturesEnabled) {
const { dossierId, fileId } = this._state;
const dossierId = this._activatedRoute.snapshot.paramMap.get(DOSSIER_ID);
const fileId = this._activatedRoute.snapshot.paramMap.get(FILE_ID);
const sectionsGrid$ = this._redactionLogService.getSectionGrid(dossierId, fileId);
const sectionsGrid = await firstValueFrom(sectionsGrid$).catch(() => ({ rectanglesPerPage: {} }));
await this._drawSections(sectionsGrid);
await this._drawSections(sectionsGrid, dossierTemplateId);
}
}
private async _drawSections(sectionGrid: ISectionGrid) {
private async _drawSections(sectionGrid: ISectionGrid, dossierTemplateId: string) {
const sections: Core.Annotations.RectangleAnnotation[] = [];
for (const page of Object.keys(sectionGrid.rectanglesPerPage)) {
const sectionRectangles = sectionGrid.rectanglesPerPage[page];
sectionRectangles.forEach(sectionRectangle => {
sections.push(this._computeSection(parseInt(page, 10), sectionRectangle));
sections.push(this._computeSection(dossierTemplateId, parseInt(page, 10), sectionRectangle));
// sectionRectangle.tableCells?.forEach(cell =>{
// sections.push(this.computeSection(activeViewer, parseInt(page, 10), cell));
// })
@ -109,7 +111,7 @@ export class AnnotationDrawService {
await this._pdf.annotationManager.drawAnnotationsFromList(sections);
}
private _computeSection(pageNumber: number, sectionRectangle: ISectionRectangle) {
private _computeSection(dossierTemplateId: string, pageNumber: number, sectionRectangle: ISectionRectangle) {
const rectangleAnnot = this._pdf.rectangle();
const pageHeight = this._pdf.getPageHeight(pageNumber);
const rectangle: IRectangle = {
@ -124,13 +126,13 @@ export class AnnotationDrawService {
rectangleAnnot.Width = rectangle.width + 2;
rectangleAnnot.Height = rectangle.height + 2;
rectangleAnnot.ReadOnly = true;
rectangleAnnot.StrokeColor = this.getAndConvertColor('analysis', 'analysis');
rectangleAnnot.StrokeColor = this.getAndConvertColor('analysis', dossierTemplateId, 'analysis');
rectangleAnnot.StrokeThickness = 1;
return rectangleAnnot;
}
private _computeAnnotation(annotationWrapper: AnnotationWrapper) {
private _computeAnnotation(annotationWrapper: AnnotationWrapper, dossierTemplateId: string, hideSkipped: boolean) {
const pageNumber = this._pdf.isCompare ? annotationWrapper.pageNumber * 2 - 1 : annotationWrapper.pageNumber;
if (pageNumber > this._pdf.pageCount) {
// skip imported annotations from files that have more pages than the current one
@ -159,23 +161,26 @@ export class AnnotationDrawService {
annotation.Opacity = annotationWrapper.isChangeLogRemoved ? DEFAULT_REMOVED_ANNOTATION_OPACITY : DEFAULT_TEXT_ANNOTATION_OPACITY;
annotation.setContents(annotationWrapper.content);
annotation.PageNumber = pageNumber;
annotation.StrokeColor = this.getAndConvertColor(annotationWrapper.superType, annotationWrapper.type);
annotation.StrokeColor = this.getAndConvertColor(annotationWrapper.superType, dossierTemplateId, annotationWrapper.type);
annotation.Id = annotationWrapper.id;
annotation.ReadOnly = true;
annotation.Hidden =
annotationWrapper.isChangeLogRemoved ||
(this._skippedService.hideSkipped && annotationWrapper.isSkipped) ||
(hideSkipped && annotationWrapper.isSkipped) ||
annotationWrapper.isOCR ||
this._fileDataService.isHidden(annotationWrapper.annotationId);
this._annotationManager.isHidden(annotationWrapper.annotationId);
annotation.setCustomData('redact-manager', 'true');
annotation.setCustomData('redaction', String(annotationWrapper.previewAnnotation));
annotation.setCustomData('skipped', String(annotationWrapper.isSkipped));
annotation.setCustomData('changeLog', String(annotationWrapper.isChangeLogEntry));
annotation.setCustomData('changeLogRemoved', String(annotationWrapper.isChangeLogRemoved));
annotation.setCustomData('opacity', String(annotation.Opacity));
annotation.setCustomData('redactionColor', String(this.getColor('redaction', 'preview')));
annotation.setCustomData('annotationColor', String(this.getColor(annotationWrapper.superType, annotationWrapper.type)));
annotation.setCustomData('redactionColor', String(this.#getColor('redaction', dossierTemplateId, 'preview')));
annotation.setCustomData(
'annotationColor',
String(this.#getColor(annotationWrapper.superType, dossierTemplateId, annotationWrapper.type)),
);
return annotation;
}

View File

@ -12,6 +12,8 @@ import Annotation = Core.Annotations.Annotation;
@Injectable()
export class REDAnnotationManager {
annotationSelected$: Observable<[Annotation[], string]>;
readonly hidden = new Set<string>();
#manager: AnnotationManager;
get selected() {
@ -33,6 +35,10 @@ export class REDAnnotationManager {
this.#autoSelectRectangleAfterCreation();
}
isHidden(annotationId: string) {
return this.hidden.has(annotationId);
}
delete(annotations?: List | List<AnnotationWrapper> | string | AnnotationWrapper) {
const items = isStringOrWrapper(annotations) ? [this.get(annotations)] : this.get(annotations);
const options: DeleteAnnotationsOptions = { force: true };

View File

@ -156,7 +156,7 @@ export class ViewerHeaderService {
[HeaderElements.CLOSE_COMPARE_BUTTON, this._closeCompare],
]);
this._updateElements();
this.updateElements();
}
enable(elements: HeaderElementType[]): void {
@ -167,6 +167,25 @@ export class ViewerHeaderService {
this._updateState(elements, false);
}
updateElements(): void {
this._pdf.instance.UI.setHeaderItems(header => {
const enabledItems: IHeaderElement[] = [];
const groups: HeaderElementType[][] = [
[HeaderElements.COMPARE_BUTTON, HeaderElements.CLOSE_COMPARE_BUTTON],
[HeaderElements.TOGGLE_TOOLTIPS],
[HeaderElements.SHAPE_TOOL_GROUP_BUTTON],
[
HeaderElements.ROTATE_LEFT_BUTTON,
HeaderElements.ROTATE_RIGHT_BUTTON,
HeaderElements.APPLY_ROTATION,
HeaderElements.DISCARD_ROTATION,
],
];
groups.forEach(group => this._pushGroup(enabledItems, group));
header.getItems().splice(8, header.getItems().length - 13, ...enabledItems);
});
}
#toggleRotationActionButtons() {
if (this._rotationService.hasRotations) {
this.enable(ROTATION_ACTION_BUTTONS);
@ -213,28 +232,9 @@ export class ViewerHeaderService {
}
}
private _updateElements(): void {
this._pdf.instance.UI.setHeaderItems(header => {
const enabledItems: IHeaderElement[] = [];
const groups: HeaderElementType[][] = [
[HeaderElements.COMPARE_BUTTON, HeaderElements.CLOSE_COMPARE_BUTTON],
[HeaderElements.TOGGLE_TOOLTIPS],
[HeaderElements.SHAPE_TOOL_GROUP_BUTTON],
[
HeaderElements.ROTATE_LEFT_BUTTON,
HeaderElements.ROTATE_RIGHT_BUTTON,
HeaderElements.APPLY_ROTATION,
HeaderElements.DISCARD_ROTATION,
],
];
groups.forEach(group => this._pushGroup(enabledItems, group));
header.getItems().splice(8, header.getItems().length - 13, ...enabledItems);
});
}
private _updateState(elements: HeaderElementType[], value: boolean): void {
elements.forEach(element => this.#config.set(element, value));
this._updateElements();
this.updateElements();
}
private _isEnabled(key: HeaderElementType): boolean {

View File

@ -1,9 +1,23 @@
import { CustomError, List } from '@iqser/common-ui';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
import { HeaderElements } from '../../file-preview/utils/constants';
import { HeaderElements, TextPopups } from '../../file-preview/utils/constants';
export const ROTATION_ACTION_BUTTONS = [HeaderElements.APPLY_ROTATION, HeaderElements.DISCARD_ROTATION];
export const TEXT_POPUPS_TO_TOGGLE = [TextPopups.ADD_REDACTION, TextPopups.ADD_RECTANGLE, TextPopups.ADD_FALSE_POSITIVE];
export const HEADER_ITEMS_TO_TOGGLE = [
HeaderElements.SHAPE_TOOL_GROUP_BUTTON,
HeaderElements.ROTATE_LEFT_BUTTON,
HeaderElements.ROTATE_RIGHT_BUTTON,
];
export const ALLOWED_ACTIONS_WHEN_PAGE_EXCLUDED: string[] = [
TextPopups.ADD_RECTANGLE,
TextPopups.ADD_REDACTION,
HeaderElements.SHAPE_TOOL_GROUP_BUTTON,
];
export const ALLOWED_KEYBOARD_SHORTCUTS: List = ['+', '-', 'p', 'r', 'Escape'] as const;
export const DOCUMENT_LOADING_ERROR = new CustomError(_('error.file-preview.label'), _('error.file-preview.action'), 'iqser:refresh');