@hmcts/media-viewer 4.1.8-exui-2488-1 → 4.1.8-exui-2600-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/sass/box-highlight.scss +38 -0
- package/esm2022/lib/annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component.mjs +74 -19
- package/esm2022/lib/annotations/annotation-set/annotation-create/box-highlight-create/keyboard-box-draw.directive.mjs +258 -0
- package/esm2022/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.service.mjs +4 -4
- package/esm2022/lib/annotations/annotation-set/annotation-view/annotation-view.component.mjs +37 -3
- package/esm2022/lib/annotations/annotation-set/annotation-view/rectangle/keyboard-box-move.directive.mjs +122 -0
- package/esm2022/lib/annotations/annotation-set/annotation-view/rectangle/rectangle.component.mjs +39 -3
- package/esm2022/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.mjs +3 -3
- package/esm2022/lib/annotations/annotations.module.mjs +9 -3
- package/esm2022/lib/store/actions/annotation.actions.mjs +3 -2
- package/esm2022/lib/store/effects/annotation.effects.mjs +13 -3
- package/esm2022/lib/viewers/pdf-viewer/side-bar/side-bar.component.mjs +3 -8
- package/fesm2022/hmcts-media-viewer.mjs +545 -39
- package/fesm2022/hmcts-media-viewer.mjs.map +1 -1
- package/lib/annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component.d.ts +16 -2
- package/lib/annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component.d.ts.map +1 -1
- package/lib/annotations/annotation-set/annotation-create/box-highlight-create/keyboard-box-draw.directive.d.ts +59 -0
- package/lib/annotations/annotation-set/annotation-create/box-highlight-create/keyboard-box-draw.directive.d.ts.map +1 -0
- package/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.service.d.ts +1 -1
- package/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.service.d.ts.map +1 -1
- package/lib/annotations/annotation-set/annotation-view/annotation-view.component.d.ts +8 -2
- package/lib/annotations/annotation-set/annotation-view/annotation-view.component.d.ts.map +1 -1
- package/lib/annotations/annotation-set/annotation-view/rectangle/keyboard-box-move.directive.d.ts +27 -0
- package/lib/annotations/annotation-set/annotation-view/rectangle/keyboard-box-move.directive.d.ts.map +1 -0
- package/lib/annotations/annotation-set/annotation-view/rectangle/rectangle.component.d.ts +10 -1
- package/lib/annotations/annotation-set/annotation-view/rectangle/rectangle.component.d.ts.map +1 -1
- package/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.d.ts +2 -1
- package/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.d.ts.map +1 -1
- package/lib/annotations/annotations.module.d.ts +13 -11
- package/lib/annotations/annotations.module.d.ts.map +1 -1
- package/lib/store/actions/annotation.actions.d.ts +2 -1
- package/lib/store/actions/annotation.actions.d.ts.map +1 -1
- package/lib/store/effects/annotation.effects.d.ts +1 -0
- package/lib/store/effects/annotation.effects.d.ts.map +1 -1
- package/lib/viewers/pdf-viewer/side-bar/side-bar.component.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -8,8 +8,8 @@ import * as i2 from '@angular/forms';
|
|
|
8
8
|
import { UntypedFormControl, FormGroup, FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
9
9
|
import * as i1$1 from '@angular/common/http';
|
|
10
10
|
import { HttpClientModule } from '@angular/common/http';
|
|
11
|
-
import { BehaviorSubject, Subject, of, combineLatest, asyncScheduler } from 'rxjs';
|
|
12
|
-
import { take, distinctUntilChanged, filter, auditTime, tap,
|
|
11
|
+
import { BehaviorSubject, Subject, of, combineLatest, debounceTime as debounceTime$1, asyncScheduler } from 'rxjs';
|
|
12
|
+
import { take, distinctUntilChanged, filter, auditTime, tap, debounceTime, throttleTime, map, catchError, switchMap, concatMap, exhaustMap, withLatestFrom } from 'rxjs/operators';
|
|
13
13
|
import * as i1 from '@ngrx/store';
|
|
14
14
|
import { createFeatureSelector, createSelector, select, StoreModule } from '@ngrx/store';
|
|
15
15
|
import { v4 } from 'uuid';
|
|
@@ -433,8 +433,9 @@ class SaveAnnotationSetFail {
|
|
|
433
433
|
}
|
|
434
434
|
}
|
|
435
435
|
class SaveAnnotation {
|
|
436
|
-
constructor(payload) {
|
|
436
|
+
constructor(payload, autoSelect) {
|
|
437
437
|
this.payload = payload;
|
|
438
|
+
this.autoSelect = autoSelect;
|
|
438
439
|
this.type = SAVE_ANNOTATION;
|
|
439
440
|
}
|
|
440
441
|
}
|
|
@@ -2715,10 +2716,10 @@ class HighlightCreateService {
|
|
|
2715
2716
|
this.toolBarEvents = toolBarEvents;
|
|
2716
2717
|
this.store = store;
|
|
2717
2718
|
}
|
|
2718
|
-
saveAnnotation(rectangles, page) {
|
|
2719
|
+
saveAnnotation(rectangles, page, annotationId) {
|
|
2719
2720
|
this.store.pipe(select(getDocumentIdSetId), take(1)).subscribe(anoSetDocId => {
|
|
2720
2721
|
const anno = {
|
|
2721
|
-
id: v4(),
|
|
2722
|
+
id: annotationId || v4(),
|
|
2722
2723
|
color: 'FFFF00',
|
|
2723
2724
|
comments: [],
|
|
2724
2725
|
page: page,
|
|
@@ -2733,7 +2734,7 @@ class HighlightCreateService {
|
|
|
2733
2734
|
lastModifiedDate: '',
|
|
2734
2735
|
tags: [],
|
|
2735
2736
|
};
|
|
2736
|
-
this.store.dispatch(new SaveAnnotation(anno));
|
|
2737
|
+
this.store.dispatch(new SaveAnnotation(anno, !!annotationId));
|
|
2737
2738
|
});
|
|
2738
2739
|
}
|
|
2739
2740
|
saveAnnotationSet(searchRectangles) {
|
|
@@ -3889,6 +3890,262 @@ const getBookmarksPerPage = createSelector(getPages, getBookmarkPages, (pages, p
|
|
|
3889
3890
|
}
|
|
3890
3891
|
});
|
|
3891
3892
|
|
|
3893
|
+
class KeyboardBoxDrawDirective {
|
|
3894
|
+
set enabled(value) {
|
|
3895
|
+
const wasEnabled = this._enabled;
|
|
3896
|
+
this._enabled = value;
|
|
3897
|
+
if (value && !wasEnabled && KeyboardBoxDrawDirective.lastInteractionWasKeyboard && !this.showCursor) {
|
|
3898
|
+
this.initializeCursorForKeyboard();
|
|
3899
|
+
}
|
|
3900
|
+
}
|
|
3901
|
+
get enabled() {
|
|
3902
|
+
return this._enabled;
|
|
3903
|
+
}
|
|
3904
|
+
static { this.lastInteractionWasKeyboard = false; }
|
|
3905
|
+
constructor(elementRef) {
|
|
3906
|
+
this.elementRef = elementRef;
|
|
3907
|
+
this._enabled = false;
|
|
3908
|
+
this.minBoxSize = 10;
|
|
3909
|
+
this.incrementSmall = 1;
|
|
3910
|
+
this.incrementMedium = 5;
|
|
3911
|
+
this.incrementLarge = 10;
|
|
3912
|
+
this.drawingStarted = new EventEmitter();
|
|
3913
|
+
this.drawingUpdated = new EventEmitter();
|
|
3914
|
+
this.drawingConfirmed = new EventEmitter();
|
|
3915
|
+
this.drawingCancelled = new EventEmitter();
|
|
3916
|
+
this.cursorPositionChanged = new EventEmitter();
|
|
3917
|
+
this.isDrawing = false;
|
|
3918
|
+
this.showCursor = false;
|
|
3919
|
+
if (typeof window !== 'undefined') {
|
|
3920
|
+
window.addEventListener('keydown', KeyboardBoxDrawDirective.onGlobalKeyDown, { capture: true });
|
|
3921
|
+
window.addEventListener('mousedown', KeyboardBoxDrawDirective.onGlobalMouseDown, { capture: true });
|
|
3922
|
+
}
|
|
3923
|
+
}
|
|
3924
|
+
static onGlobalKeyDown() {
|
|
3925
|
+
KeyboardBoxDrawDirective.lastInteractionWasKeyboard = true;
|
|
3926
|
+
}
|
|
3927
|
+
static onGlobalMouseDown() {
|
|
3928
|
+
KeyboardBoxDrawDirective.lastInteractionWasKeyboard = false;
|
|
3929
|
+
}
|
|
3930
|
+
ngOnDestroy() {
|
|
3931
|
+
this.cleanup();
|
|
3932
|
+
}
|
|
3933
|
+
initializeCursorForKeyboard() {
|
|
3934
|
+
if (this.enabled && !this.showCursor && !this.isDrawing) {
|
|
3935
|
+
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
3936
|
+
if (rect.width > 0 && rect.height > 0) {
|
|
3937
|
+
this.cursorX = rect.width / 2;
|
|
3938
|
+
this.cursorY = rect.height / 2;
|
|
3939
|
+
this.showCursor = true;
|
|
3940
|
+
this.emitCursorPosition();
|
|
3941
|
+
}
|
|
3942
|
+
}
|
|
3943
|
+
}
|
|
3944
|
+
onKeyDown(event) {
|
|
3945
|
+
if (!this.enabled) {
|
|
3946
|
+
return;
|
|
3947
|
+
}
|
|
3948
|
+
if (event.key === 'Enter') {
|
|
3949
|
+
event.preventDefault();
|
|
3950
|
+
event.stopPropagation();
|
|
3951
|
+
if (!this.isDrawing) {
|
|
3952
|
+
this.startDrawing();
|
|
3953
|
+
}
|
|
3954
|
+
else {
|
|
3955
|
+
this.confirmDrawing();
|
|
3956
|
+
}
|
|
3957
|
+
return;
|
|
3958
|
+
}
|
|
3959
|
+
if (event.key === 'Escape') {
|
|
3960
|
+
event.preventDefault();
|
|
3961
|
+
event.stopPropagation();
|
|
3962
|
+
if (this.isDrawing) {
|
|
3963
|
+
this.cancelDrawing();
|
|
3964
|
+
}
|
|
3965
|
+
else if (this.showCursor) {
|
|
3966
|
+
this.hideCursor();
|
|
3967
|
+
}
|
|
3968
|
+
return;
|
|
3969
|
+
}
|
|
3970
|
+
if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {
|
|
3971
|
+
event.preventDefault();
|
|
3972
|
+
event.stopPropagation();
|
|
3973
|
+
if (this.isDrawing) {
|
|
3974
|
+
this.resizeBox(event);
|
|
3975
|
+
}
|
|
3976
|
+
else {
|
|
3977
|
+
this.moveCursor(event);
|
|
3978
|
+
}
|
|
3979
|
+
}
|
|
3980
|
+
}
|
|
3981
|
+
onBlur() {
|
|
3982
|
+
if (this.showCursor && !this.isDrawing) {
|
|
3983
|
+
this.hideCursor();
|
|
3984
|
+
}
|
|
3985
|
+
}
|
|
3986
|
+
moveCursor(event) {
|
|
3987
|
+
const increment = event.shiftKey ? this.incrementLarge : this.incrementMedium;
|
|
3988
|
+
if (!this.showCursor) {
|
|
3989
|
+
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
3990
|
+
this.cursorX = rect.width / 2;
|
|
3991
|
+
this.cursorY = rect.height / 2;
|
|
3992
|
+
this.showCursor = true;
|
|
3993
|
+
this.emitCursorPosition();
|
|
3994
|
+
return;
|
|
3995
|
+
}
|
|
3996
|
+
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
3997
|
+
switch (event.key) {
|
|
3998
|
+
case 'ArrowUp':
|
|
3999
|
+
this.cursorY = Math.max(0, this.cursorY - increment);
|
|
4000
|
+
break;
|
|
4001
|
+
case 'ArrowDown':
|
|
4002
|
+
this.cursorY = Math.min(rect.height, this.cursorY + increment);
|
|
4003
|
+
break;
|
|
4004
|
+
case 'ArrowLeft':
|
|
4005
|
+
this.cursorX = Math.max(0, this.cursorX - increment);
|
|
4006
|
+
break;
|
|
4007
|
+
case 'ArrowRight':
|
|
4008
|
+
this.cursorX = Math.min(rect.width, this.cursorX + increment);
|
|
4009
|
+
break;
|
|
4010
|
+
}
|
|
4011
|
+
this.emitCursorPosition();
|
|
4012
|
+
}
|
|
4013
|
+
startDrawing() {
|
|
4014
|
+
let startX;
|
|
4015
|
+
let startY;
|
|
4016
|
+
if (this.showCursor) {
|
|
4017
|
+
startX = this.cursorX;
|
|
4018
|
+
startY = this.cursorY;
|
|
4019
|
+
this.showCursor = false;
|
|
4020
|
+
this.emitCursorPosition();
|
|
4021
|
+
}
|
|
4022
|
+
else {
|
|
4023
|
+
// default to center
|
|
4024
|
+
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
4025
|
+
startX = rect.width / 2;
|
|
4026
|
+
startY = rect.height / 2;
|
|
4027
|
+
}
|
|
4028
|
+
this.isDrawing = true;
|
|
4029
|
+
this.drawStartX = startX;
|
|
4030
|
+
this.drawStartY = startY;
|
|
4031
|
+
this.currentWidth = this.minBoxSize;
|
|
4032
|
+
this.currentHeight = this.minBoxSize;
|
|
4033
|
+
this.emitDrawingStarted();
|
|
4034
|
+
}
|
|
4035
|
+
resizeBox(event) {
|
|
4036
|
+
const increment = event.shiftKey ? this.incrementLarge : this.incrementSmall;
|
|
4037
|
+
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
4038
|
+
switch (event.key) {
|
|
4039
|
+
case 'ArrowRight':
|
|
4040
|
+
const maxWidth = rect.width - this.drawStartX;
|
|
4041
|
+
this.currentWidth = Math.min(maxWidth, this.currentWidth + increment);
|
|
4042
|
+
break;
|
|
4043
|
+
case 'ArrowLeft':
|
|
4044
|
+
this.currentWidth = Math.max(this.minBoxSize, this.currentWidth - increment);
|
|
4045
|
+
break;
|
|
4046
|
+
case 'ArrowDown':
|
|
4047
|
+
const maxHeight = rect.height - this.drawStartY;
|
|
4048
|
+
this.currentHeight = Math.min(maxHeight, this.currentHeight + increment);
|
|
4049
|
+
break;
|
|
4050
|
+
case 'ArrowUp':
|
|
4051
|
+
this.currentHeight = Math.max(this.minBoxSize, this.currentHeight - increment);
|
|
4052
|
+
break;
|
|
4053
|
+
}
|
|
4054
|
+
this.emitDrawingUpdated();
|
|
4055
|
+
}
|
|
4056
|
+
confirmDrawing() {
|
|
4057
|
+
this.emitDrawingConfirmed();
|
|
4058
|
+
this.cleanup();
|
|
4059
|
+
}
|
|
4060
|
+
cancelDrawing() {
|
|
4061
|
+
this.drawingCancelled.emit();
|
|
4062
|
+
this.cleanup();
|
|
4063
|
+
}
|
|
4064
|
+
hideCursor() {
|
|
4065
|
+
this.showCursor = false;
|
|
4066
|
+
this.emitCursorPosition();
|
|
4067
|
+
}
|
|
4068
|
+
cleanup() {
|
|
4069
|
+
this.isDrawing = false;
|
|
4070
|
+
this.showCursor = false;
|
|
4071
|
+
this.cursorX = undefined;
|
|
4072
|
+
this.cursorY = undefined;
|
|
4073
|
+
this.drawStartX = undefined;
|
|
4074
|
+
this.drawStartY = undefined;
|
|
4075
|
+
this.currentWidth = undefined;
|
|
4076
|
+
this.currentHeight = undefined;
|
|
4077
|
+
}
|
|
4078
|
+
emitCursorPosition() {
|
|
4079
|
+
this.cursorPositionChanged.emit({
|
|
4080
|
+
x: this.cursorX,
|
|
4081
|
+
y: this.cursorY,
|
|
4082
|
+
visible: this.showCursor
|
|
4083
|
+
});
|
|
4084
|
+
}
|
|
4085
|
+
emitDrawingStarted() {
|
|
4086
|
+
this.drawingStarted.emit({
|
|
4087
|
+
startX: this.drawStartX,
|
|
4088
|
+
startY: this.drawStartY,
|
|
4089
|
+
width: this.currentWidth,
|
|
4090
|
+
height: this.currentHeight
|
|
4091
|
+
});
|
|
4092
|
+
}
|
|
4093
|
+
emitDrawingUpdated() {
|
|
4094
|
+
this.drawingUpdated.emit({
|
|
4095
|
+
startX: this.drawStartX,
|
|
4096
|
+
startY: this.drawStartY,
|
|
4097
|
+
width: this.currentWidth,
|
|
4098
|
+
height: this.currentHeight
|
|
4099
|
+
});
|
|
4100
|
+
}
|
|
4101
|
+
emitDrawingConfirmed() {
|
|
4102
|
+
this.drawingConfirmed.emit({
|
|
4103
|
+
startX: this.drawStartX,
|
|
4104
|
+
startY: this.drawStartY,
|
|
4105
|
+
width: this.currentWidth,
|
|
4106
|
+
height: this.currentHeight
|
|
4107
|
+
});
|
|
4108
|
+
}
|
|
4109
|
+
reset() {
|
|
4110
|
+
this.cleanup();
|
|
4111
|
+
this.emitCursorPosition();
|
|
4112
|
+
}
|
|
4113
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyboardBoxDrawDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
4114
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: KeyboardBoxDrawDirective, selector: "[mvKeyboardBoxDraw]", inputs: { enabled: "enabled", minBoxSize: "minBoxSize", incrementSmall: "incrementSmall", incrementMedium: "incrementMedium", incrementLarge: "incrementLarge" }, outputs: { drawingStarted: "drawingStarted", drawingUpdated: "drawingUpdated", drawingConfirmed: "drawingConfirmed", drawingCancelled: "drawingCancelled", cursorPositionChanged: "cursorPositionChanged" }, host: { listeners: { "keydown": "onKeyDown($event)", "blur": "onBlur()" } }, ngImport: i0 }); }
|
|
4115
|
+
}
|
|
4116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyboardBoxDrawDirective, decorators: [{
|
|
4117
|
+
type: Directive,
|
|
4118
|
+
args: [{
|
|
4119
|
+
selector: '[mvKeyboardBoxDraw]'
|
|
4120
|
+
}]
|
|
4121
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { enabled: [{
|
|
4122
|
+
type: Input
|
|
4123
|
+
}], minBoxSize: [{
|
|
4124
|
+
type: Input
|
|
4125
|
+
}], incrementSmall: [{
|
|
4126
|
+
type: Input
|
|
4127
|
+
}], incrementMedium: [{
|
|
4128
|
+
type: Input
|
|
4129
|
+
}], incrementLarge: [{
|
|
4130
|
+
type: Input
|
|
4131
|
+
}], drawingStarted: [{
|
|
4132
|
+
type: Output
|
|
4133
|
+
}], drawingUpdated: [{
|
|
4134
|
+
type: Output
|
|
4135
|
+
}], drawingConfirmed: [{
|
|
4136
|
+
type: Output
|
|
4137
|
+
}], drawingCancelled: [{
|
|
4138
|
+
type: Output
|
|
4139
|
+
}], cursorPositionChanged: [{
|
|
4140
|
+
type: Output
|
|
4141
|
+
}], onKeyDown: [{
|
|
4142
|
+
type: HostListener,
|
|
4143
|
+
args: ['keydown', ['$event']]
|
|
4144
|
+
}], onBlur: [{
|
|
4145
|
+
type: HostListener,
|
|
4146
|
+
args: ['blur']
|
|
4147
|
+
}] } });
|
|
4148
|
+
|
|
3892
4149
|
class BoxHighlightCreateComponent {
|
|
3893
4150
|
constructor(toolbarEvents, highlightService) {
|
|
3894
4151
|
this.toolbarEvents = toolbarEvents;
|
|
@@ -3897,6 +4154,8 @@ class BoxHighlightCreateComponent {
|
|
|
3897
4154
|
this.drawStartX = -1;
|
|
3898
4155
|
this.drawStartY = -1;
|
|
3899
4156
|
this.backgroundColor = 'none';
|
|
4157
|
+
this.keyboardDrawingMode = false;
|
|
4158
|
+
this.showCursor = false;
|
|
3900
4159
|
this.subscriptions = [];
|
|
3901
4160
|
}
|
|
3902
4161
|
ngOnInit() {
|
|
@@ -3904,6 +4163,14 @@ class BoxHighlightCreateComponent {
|
|
|
3904
4163
|
this.toolbarEvents.drawModeSubject.subscribe(drawMode => {
|
|
3905
4164
|
this.defaultHeight = drawMode ? '100%' : '0px';
|
|
3906
4165
|
this.defaultWidth = drawMode ? '100%' : '0px';
|
|
4166
|
+
this.drawMode = drawMode;
|
|
4167
|
+
if (drawMode) {
|
|
4168
|
+
setTimeout(() => {
|
|
4169
|
+
if (this.drawingContainer?.nativeElement && this.isElementInViewport(this.drawingContainer.nativeElement)) {
|
|
4170
|
+
this.drawingContainer.nativeElement.focus();
|
|
4171
|
+
}
|
|
4172
|
+
}, 100);
|
|
4173
|
+
}
|
|
3907
4174
|
}),
|
|
3908
4175
|
this.toolbarEvents.redactWholePage.subscribe(() => {
|
|
3909
4176
|
this.wholePage = true;
|
|
@@ -3915,13 +4182,20 @@ class BoxHighlightCreateComponent {
|
|
|
3915
4182
|
subscription.unsubscribe();
|
|
3916
4183
|
});
|
|
3917
4184
|
}
|
|
4185
|
+
isElementInViewport(el) {
|
|
4186
|
+
const rect = el.getBoundingClientRect();
|
|
4187
|
+
const windowHeight = (window.innerHeight || document.documentElement.clientHeight);
|
|
4188
|
+
const windowWidth = (window.innerWidth || document.documentElement.clientWidth);
|
|
4189
|
+
const verticallyVisible = rect.bottom > 0 && rect.top < windowHeight;
|
|
4190
|
+
const horizontallyVisible = rect.right > 0 && rect.left < windowWidth;
|
|
4191
|
+
return verticallyVisible && horizontallyVisible;
|
|
4192
|
+
}
|
|
3918
4193
|
initHighlight(event) {
|
|
3919
4194
|
if (this.wholePage) {
|
|
3920
4195
|
this.highlightPage();
|
|
3921
4196
|
return;
|
|
3922
4197
|
}
|
|
3923
4198
|
const rect = HtmlTemplatesHelper.getAdjustedBoundingRect(event.target), offsetX = event.clientX - rect.left, offsetY = event.clientY - rect.top;
|
|
3924
|
-
console.log(`initHighlight: rect=${JSON.stringify(rect)}, clientX=${event.clientX}, clientY=${event.clientY}, offsetX=${offsetX}, offsetY=${offsetY}`);
|
|
3925
4199
|
this.position = 'absolute';
|
|
3926
4200
|
this.backgroundColor = 'yellow';
|
|
3927
4201
|
this.drawStartX = offsetX;
|
|
@@ -3931,18 +4205,7 @@ class BoxHighlightCreateComponent {
|
|
|
3931
4205
|
this.width = 50;
|
|
3932
4206
|
this.top = this.drawStartY;
|
|
3933
4207
|
this.left = this.drawStartX;
|
|
3934
|
-
|
|
3935
|
-
case 90:
|
|
3936
|
-
this.top = this.drawStartY - this.height;
|
|
3937
|
-
break;
|
|
3938
|
-
case 180:
|
|
3939
|
-
this.top = this.drawStartY - this.height;
|
|
3940
|
-
this.left = this.drawStartX - this.width;
|
|
3941
|
-
break;
|
|
3942
|
-
case 270:
|
|
3943
|
-
this.left = this.drawStartX - this.width;
|
|
3944
|
-
break;
|
|
3945
|
-
}
|
|
4208
|
+
this.adjustForRotation();
|
|
3946
4209
|
}
|
|
3947
4210
|
updateHighlight(event) {
|
|
3948
4211
|
const rect = HtmlTemplatesHelper.getAdjustedBoundingRect(event.target, false), offsetX = event.clientX - rect.left, offsetY = event.clientY - rect.top;
|
|
@@ -3957,12 +4220,56 @@ class BoxHighlightCreateComponent {
|
|
|
3957
4220
|
if (this.height / this.zoom > 5 || this.width / this.zoom > 5) {
|
|
3958
4221
|
let rectangle = this.highlightService
|
|
3959
4222
|
.applyRotation(this.pageHeight, this.pageWidth, this.height, this.width, this.top, this.left, this.rotate, this.zoom);
|
|
3960
|
-
|
|
3961
|
-
|
|
3962
|
-
this.saveSelection.emit({ rectangles: [rectangle], page: this.page });
|
|
4223
|
+
const annotationId = v4();
|
|
4224
|
+
rectangle = { id: annotationId, ...rectangle };
|
|
4225
|
+
this.saveSelection.emit({ rectangles: [rectangle], page: this.page, annotationId });
|
|
3963
4226
|
this.resetHighlight();
|
|
3964
4227
|
}
|
|
3965
4228
|
}
|
|
4229
|
+
onCursorPositionChanged(position) {
|
|
4230
|
+
this.cursorX = position.x;
|
|
4231
|
+
this.cursorY = position.y;
|
|
4232
|
+
this.showCursor = position.visible;
|
|
4233
|
+
}
|
|
4234
|
+
onDrawingStarted(event) {
|
|
4235
|
+
this.keyboardDrawingMode = true;
|
|
4236
|
+
this.position = 'absolute';
|
|
4237
|
+
this.backgroundColor = 'yellow';
|
|
4238
|
+
this.display = 'block';
|
|
4239
|
+
this.drawStartX = event.startX;
|
|
4240
|
+
this.drawStartY = event.startY;
|
|
4241
|
+
this.width = event.width;
|
|
4242
|
+
this.height = event.height;
|
|
4243
|
+
this.top = this.drawStartY;
|
|
4244
|
+
this.left = this.drawStartX;
|
|
4245
|
+
this.adjustForRotation();
|
|
4246
|
+
}
|
|
4247
|
+
onDrawingUpdated(event) {
|
|
4248
|
+
this.width = event.width;
|
|
4249
|
+
this.height = event.height;
|
|
4250
|
+
}
|
|
4251
|
+
onDrawingConfirmed(event) {
|
|
4252
|
+
this.keyboardDrawingMode = false;
|
|
4253
|
+
this.createHighlight();
|
|
4254
|
+
}
|
|
4255
|
+
onDrawingCancelled() {
|
|
4256
|
+
this.keyboardDrawingMode = false;
|
|
4257
|
+
this.resetHighlight();
|
|
4258
|
+
}
|
|
4259
|
+
adjustForRotation() {
|
|
4260
|
+
switch (this.rotate) {
|
|
4261
|
+
case 90:
|
|
4262
|
+
this.top = this.drawStartY - this.height;
|
|
4263
|
+
break;
|
|
4264
|
+
case 180:
|
|
4265
|
+
this.top = this.drawStartY - this.height;
|
|
4266
|
+
this.left = this.drawStartX - this.width;
|
|
4267
|
+
break;
|
|
4268
|
+
case 270:
|
|
4269
|
+
this.left = this.drawStartX - this.width;
|
|
4270
|
+
break;
|
|
4271
|
+
}
|
|
4272
|
+
}
|
|
3966
4273
|
resetHighlight() {
|
|
3967
4274
|
this.drawStartX = -1;
|
|
3968
4275
|
this.drawStartY = -1;
|
|
@@ -3981,11 +4288,11 @@ class BoxHighlightCreateComponent {
|
|
|
3981
4288
|
this.createHighlight();
|
|
3982
4289
|
}
|
|
3983
4290
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BoxHighlightCreateComponent, deps: [{ token: ToolbarEventService }, { token: HighlightCreateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3984
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BoxHighlightCreateComponent, selector: "mv-box-highlight-create", inputs: { page: "page", pageHeight: "pageHeight", pageWidth: "pageWidth", rotate: "rotate", zoom: "zoom", container: "container" }, outputs: { saveSelection: "saveSelection" }, viewQueries: [{ propertyName: "highlight", first: true, predicate: ["boxHighlight"], descendants: true }], ngImport: i0, template: "<div [style.height]=\"defaultHeight\"\n
|
|
4291
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BoxHighlightCreateComponent, selector: "mv-box-highlight-create", inputs: { page: "page", pageHeight: "pageHeight", pageWidth: "pageWidth", rotate: "rotate", zoom: "zoom", container: "container" }, outputs: { saveSelection: "saveSelection" }, viewQueries: [{ propertyName: "highlight", first: true, predicate: ["boxHighlight"], descendants: true }, { propertyName: "drawingContainer", first: true, predicate: ["drawingContainer"], descendants: true }], ngImport: i0, template: "<div #drawingContainer\n [style.height]=\"defaultHeight\"\n [style.width]=\"defaultWidth\"\n [tabindex]=\"drawMode ? 0 : -1\"\n mvKeyboardBoxDraw\n [enabled]=\"drawMode\"\n (cursorPositionChanged)=\"onCursorPositionChanged($event)\"\n (drawingStarted)=\"onDrawingStarted($event)\"\n (drawingUpdated)=\"onDrawingUpdated($event)\"\n (drawingConfirmed)=\"onDrawingConfirmed($event)\"\n (drawingCancelled)=\"onDrawingCancelled()\"\n (mousedown)=\"initHighlight($event)\"\n (mousemove)=\"updateHighlight($event)\"\n (mouseup)=\"createHighlight()\">\n\n <div *ngIf=\"showCursor\"\n class=\"drawing-cursor\"\n [style.position]=\"'absolute'\"\n [style.top]=\"cursorY + 'px'\"\n [style.left]=\"cursorX + 'px'\">\n </div>\n\n <div #boxHighlight\n class=\"box-highlight\"\n [style.display]=\"display\"\n [style.position]=\"position\"\n [style.background-color]=\"backgroundColor\"\n [style.height]=\"height ? height + 'px' : '100%'\"\n [style.width]=\"width ? width + 'px' : '100%'\"\n [style.top]=\"top + 'px'\"\n [style.left]=\"left + 'px'\">\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: KeyboardBoxDrawDirective, selector: "[mvKeyboardBoxDraw]", inputs: ["enabled", "minBoxSize", "incrementSmall", "incrementMedium", "incrementLarge"], outputs: ["drawingStarted", "drawingUpdated", "drawingConfirmed", "drawingCancelled", "cursorPositionChanged"] }] }); }
|
|
3985
4292
|
}
|
|
3986
4293
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BoxHighlightCreateComponent, decorators: [{
|
|
3987
4294
|
type: Component,
|
|
3988
|
-
args: [{ selector: 'mv-box-highlight-create', template: "<div [style.height]=\"defaultHeight\"\n
|
|
4295
|
+
args: [{ selector: 'mv-box-highlight-create', template: "<div #drawingContainer\n [style.height]=\"defaultHeight\"\n [style.width]=\"defaultWidth\"\n [tabindex]=\"drawMode ? 0 : -1\"\n mvKeyboardBoxDraw\n [enabled]=\"drawMode\"\n (cursorPositionChanged)=\"onCursorPositionChanged($event)\"\n (drawingStarted)=\"onDrawingStarted($event)\"\n (drawingUpdated)=\"onDrawingUpdated($event)\"\n (drawingConfirmed)=\"onDrawingConfirmed($event)\"\n (drawingCancelled)=\"onDrawingCancelled()\"\n (mousedown)=\"initHighlight($event)\"\n (mousemove)=\"updateHighlight($event)\"\n (mouseup)=\"createHighlight()\">\n\n <div *ngIf=\"showCursor\"\n class=\"drawing-cursor\"\n [style.position]=\"'absolute'\"\n [style.top]=\"cursorY + 'px'\"\n [style.left]=\"cursorX + 'px'\">\n </div>\n\n <div #boxHighlight\n class=\"box-highlight\"\n [style.display]=\"display\"\n [style.position]=\"position\"\n [style.background-color]=\"backgroundColor\"\n [style.height]=\"height ? height + 'px' : '100%'\"\n [style.width]=\"width ? width + 'px' : '100%'\"\n [style.top]=\"top + 'px'\"\n [style.left]=\"left + 'px'\">\n </div>\n</div>\n" }]
|
|
3989
4296
|
}], ctorParameters: () => [{ type: ToolbarEventService }, { type: HighlightCreateService }], propDecorators: { page: [{
|
|
3990
4297
|
type: Input
|
|
3991
4298
|
}], pageHeight: [{
|
|
@@ -4003,6 +4310,127 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
4003
4310
|
}], highlight: [{
|
|
4004
4311
|
type: ViewChild,
|
|
4005
4312
|
args: ['boxHighlight', { static: false }]
|
|
4313
|
+
}], drawingContainer: [{
|
|
4314
|
+
type: ViewChild,
|
|
4315
|
+
args: ['drawingContainer', { static: false }]
|
|
4316
|
+
}] } });
|
|
4317
|
+
|
|
4318
|
+
class KeyboardBoxMoveDirective {
|
|
4319
|
+
constructor(elementRef) {
|
|
4320
|
+
this.elementRef = elementRef;
|
|
4321
|
+
this.enabled = true;
|
|
4322
|
+
this.incrementSmall = 1;
|
|
4323
|
+
this.incrementLarge = 10;
|
|
4324
|
+
this.keyboardMovingChange = new EventEmitter();
|
|
4325
|
+
this.boxDelete = new EventEmitter();
|
|
4326
|
+
this.moveSubject = new Subject();
|
|
4327
|
+
this.isMoving = false;
|
|
4328
|
+
this.moveSubscription = this.moveSubject
|
|
4329
|
+
.pipe(debounceTime(500))
|
|
4330
|
+
.subscribe(() => {
|
|
4331
|
+
this.setMoving(false);
|
|
4332
|
+
this.emitStoppedEvent();
|
|
4333
|
+
});
|
|
4334
|
+
}
|
|
4335
|
+
ngOnDestroy() {
|
|
4336
|
+
if (this.moveSubscription) {
|
|
4337
|
+
this.moveSubscription.unsubscribe();
|
|
4338
|
+
}
|
|
4339
|
+
this.moveSubject.complete();
|
|
4340
|
+
}
|
|
4341
|
+
onKeyDown(event) {
|
|
4342
|
+
if (event.key === 'Delete' || event.key === 'Backspace') {
|
|
4343
|
+
event.preventDefault();
|
|
4344
|
+
event.stopPropagation();
|
|
4345
|
+
this.boxDelete.emit();
|
|
4346
|
+
return;
|
|
4347
|
+
}
|
|
4348
|
+
if (!this.enabled) {
|
|
4349
|
+
return;
|
|
4350
|
+
}
|
|
4351
|
+
if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {
|
|
4352
|
+
event.preventDefault();
|
|
4353
|
+
event.stopPropagation();
|
|
4354
|
+
this.moveBox(event);
|
|
4355
|
+
}
|
|
4356
|
+
}
|
|
4357
|
+
moveBox(event) {
|
|
4358
|
+
const element = this.elementRef.nativeElement;
|
|
4359
|
+
const increment = event.shiftKey ? this.incrementLarge : this.incrementSmall;
|
|
4360
|
+
if (!this.isMoving) {
|
|
4361
|
+
this.setMoving(true);
|
|
4362
|
+
}
|
|
4363
|
+
const currentTop = parseFloat(element.style.top) || 0;
|
|
4364
|
+
const currentLeft = parseFloat(element.style.left) || 0;
|
|
4365
|
+
const currentWidth = element.offsetWidth;
|
|
4366
|
+
const currentHeight = element.offsetHeight;
|
|
4367
|
+
let newTop = currentTop;
|
|
4368
|
+
let newLeft = currentLeft;
|
|
4369
|
+
switch (event.key) {
|
|
4370
|
+
case 'ArrowUp':
|
|
4371
|
+
newTop = currentTop - increment;
|
|
4372
|
+
break;
|
|
4373
|
+
case 'ArrowDown':
|
|
4374
|
+
newTop = currentTop + increment;
|
|
4375
|
+
break;
|
|
4376
|
+
case 'ArrowLeft':
|
|
4377
|
+
newLeft = currentLeft - increment;
|
|
4378
|
+
break;
|
|
4379
|
+
case 'ArrowRight':
|
|
4380
|
+
newLeft = currentLeft + increment;
|
|
4381
|
+
break;
|
|
4382
|
+
}
|
|
4383
|
+
if (this.movementBounds) {
|
|
4384
|
+
newTop = Math.max(0, Math.min(newTop, this.movementBounds.containerHeight - currentHeight));
|
|
4385
|
+
newLeft = Math.max(0, Math.min(newLeft, this.movementBounds.containerWidth - currentWidth));
|
|
4386
|
+
}
|
|
4387
|
+
element.style.top = `${newTop}px`;
|
|
4388
|
+
element.style.left = `${newLeft}px`;
|
|
4389
|
+
this.moveSubject.next();
|
|
4390
|
+
}
|
|
4391
|
+
setMoving(moving) {
|
|
4392
|
+
if (this.isMoving !== moving) {
|
|
4393
|
+
this.isMoving = moving;
|
|
4394
|
+
this.keyboardMovingChange.emit(moving);
|
|
4395
|
+
}
|
|
4396
|
+
}
|
|
4397
|
+
emitStoppedEvent() {
|
|
4398
|
+
const element = this.elementRef.nativeElement;
|
|
4399
|
+
const wasFocused = document.activeElement === element;
|
|
4400
|
+
const stoppedEvent = new CustomEvent('stopped', {
|
|
4401
|
+
detail: element,
|
|
4402
|
+
bubbles: true
|
|
4403
|
+
});
|
|
4404
|
+
element.dispatchEvent(stoppedEvent);
|
|
4405
|
+
if (wasFocused) {
|
|
4406
|
+
setTimeout(() => {
|
|
4407
|
+
element.focus();
|
|
4408
|
+
}, 50);
|
|
4409
|
+
}
|
|
4410
|
+
}
|
|
4411
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyboardBoxMoveDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
4412
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: KeyboardBoxMoveDirective, selector: "[mvKeyboardBoxMove]", inputs: { enabled: "enabled", incrementSmall: "incrementSmall", incrementLarge: "incrementLarge", movementBounds: "movementBounds" }, outputs: { keyboardMovingChange: "keyboardMovingChange", boxDelete: "boxDelete" }, host: { listeners: { "keydown": "onKeyDown($event)" } }, ngImport: i0 }); }
|
|
4413
|
+
}
|
|
4414
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyboardBoxMoveDirective, decorators: [{
|
|
4415
|
+
type: Directive,
|
|
4416
|
+
args: [{
|
|
4417
|
+
selector: '[mvKeyboardBoxMove]'
|
|
4418
|
+
}]
|
|
4419
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { enabled: [{
|
|
4420
|
+
type: Input
|
|
4421
|
+
}], incrementSmall: [{
|
|
4422
|
+
type: Input
|
|
4423
|
+
}], incrementLarge: [{
|
|
4424
|
+
type: Input
|
|
4425
|
+
}], movementBounds: [{
|
|
4426
|
+
type: Input
|
|
4427
|
+
}], keyboardMovingChange: [{
|
|
4428
|
+
type: Output
|
|
4429
|
+
}], boxDelete: [{
|
|
4430
|
+
type: Output
|
|
4431
|
+
}], onKeyDown: [{
|
|
4432
|
+
type: HostListener,
|
|
4433
|
+
args: ['keydown', ['$event']]
|
|
4006
4434
|
}] } });
|
|
4007
4435
|
|
|
4008
4436
|
class RectangleComponent {
|
|
@@ -4019,8 +4447,11 @@ class RectangleComponent {
|
|
|
4019
4447
|
constructor(toolbarEvents, highlightService) {
|
|
4020
4448
|
this.toolbarEvents = toolbarEvents;
|
|
4021
4449
|
this.highlightService = highlightService;
|
|
4450
|
+
this.rectangleTabIndex = 0;
|
|
4022
4451
|
this.selectEvent = new EventEmitter();
|
|
4023
4452
|
this.updateEvent = new EventEmitter();
|
|
4453
|
+
this.deleteEvent = new EventEmitter();
|
|
4454
|
+
this.keyboardMovingChange = new EventEmitter();
|
|
4024
4455
|
this.subscriptions = [];
|
|
4025
4456
|
this.enableGrabNDrag = false;
|
|
4026
4457
|
}
|
|
@@ -4028,9 +4459,16 @@ class RectangleComponent {
|
|
|
4028
4459
|
if (changes.rotate) {
|
|
4029
4460
|
this.adjustForRotation(this.rotate);
|
|
4030
4461
|
}
|
|
4462
|
+
if (changes.pageHeight || changes.pageWidth) {
|
|
4463
|
+
this.updateMovementBounds();
|
|
4464
|
+
}
|
|
4031
4465
|
}
|
|
4032
4466
|
ngAfterViewInit() {
|
|
4033
4467
|
this.subscriptions.push(this.toolbarEvents.grabNDrag.subscribe(grabNDrag => this.enableGrabNDrag = grabNDrag));
|
|
4468
|
+
setTimeout(() => this.updateMovementBounds(), 0);
|
|
4469
|
+
if (this._selected && this.viewRect) {
|
|
4470
|
+
this.viewRect.nativeElement.focus();
|
|
4471
|
+
}
|
|
4034
4472
|
}
|
|
4035
4473
|
ngOnDestroy() {
|
|
4036
4474
|
this.subscriptions.filter(subscription => !subscription.closed)
|
|
@@ -4048,6 +4486,9 @@ class RectangleComponent {
|
|
|
4048
4486
|
onClick() {
|
|
4049
4487
|
this.selectEvent.emit(this.annoRect);
|
|
4050
4488
|
}
|
|
4489
|
+
onFocus() {
|
|
4490
|
+
this.selectEvent.emit(this.annoRect);
|
|
4491
|
+
}
|
|
4051
4492
|
onUpdate(viewRect) {
|
|
4052
4493
|
const { offsetHeight, offsetWidth, offsetTop, offsetLeft } = viewRect;
|
|
4053
4494
|
if (this.hasRectangleChanged(viewRect)) {
|
|
@@ -4084,12 +4525,28 @@ class RectangleComponent {
|
|
|
4084
4525
|
Math.round(this.width) !== viewRect.offsetWidth ||
|
|
4085
4526
|
Math.round(this.height) !== viewRect.offsetHeight;
|
|
4086
4527
|
}
|
|
4528
|
+
updateMovementBounds() {
|
|
4529
|
+
if (this.pageHeight && this.pageWidth) {
|
|
4530
|
+
this.movementBounds = {
|
|
4531
|
+
containerHeight: this.pageHeight,
|
|
4532
|
+
containerWidth: this.pageWidth
|
|
4533
|
+
};
|
|
4534
|
+
}
|
|
4535
|
+
}
|
|
4536
|
+
onKeyboardMovingChange(isMoving) {
|
|
4537
|
+
this.keyboardMovingChange.emit(isMoving);
|
|
4538
|
+
}
|
|
4539
|
+
onDelete() {
|
|
4540
|
+
if (this._selected) {
|
|
4541
|
+
this.deleteEvent.emit(this.annoRect);
|
|
4542
|
+
}
|
|
4543
|
+
}
|
|
4087
4544
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RectangleComponent, deps: [{ token: ToolbarEventService }, { token: HighlightCreateService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4088
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RectangleComponent, selector: "mv-anno-rectangle", inputs: { color: "color", zoom: "zoom", rotate: "rotate", editable: "editable", pageHeight: "pageHeight", pageWidth: "pageWidth", annoRect: "annoRect", selected: "selected" }, outputs: { selectEvent: "selectEvent", updateEvent: "updateEvent" }, viewQueries: [{ propertyName: "viewRect", first: true, predicate: ["rectElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"editable; else nonEditable\">\n <div #rectElement\n class=\"rectangle\"\n draggable\n resizable\n [tabindex]=\"
|
|
4545
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RectangleComponent, selector: "mv-anno-rectangle", inputs: { color: "color", zoom: "zoom", rotate: "rotate", editable: "editable", pageHeight: "pageHeight", pageWidth: "pageWidth", rectangleTabIndex: "rectangleTabIndex", annoRect: "annoRect", selected: "selected" }, outputs: { selectEvent: "selectEvent", updateEvent: "updateEvent", deleteEvent: "deleteEvent", keyboardMovingChange: "keyboardMovingChange" }, viewQueries: [{ propertyName: "viewRect", first: true, predicate: ["rectElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"editable; else nonEditable\">\n <div #rectElement\n class=\"rectangle\"\n draggable\n resizable\n mvKeyboardBoxMove\n [tabindex]=\"rectangleTabIndex\"\n [ngClass]=\"{ 'selected': selected, 'grabNDrag': enableGrabNDrag }\"\n [style.backgroundColor]=\"'#' + color\"\n [style.width]=\"width + 'px'\"\n [style.height]=\"height + 'px'\"\n [style.left]=\"left + 'px'\"\n [style.top]=\"top + 'px'\"\n [rotate]=\"0\"\n [selected]=\"selected\"\n [movementBounds]=\"movementBounds\"\n (click)=\"onClick()\"\n (focus)=\"onFocus()\"\n (stopped)=\"onUpdate(rectElement)\"\n (keyboardMovingChange)=\"onKeyboardMovingChange($event)\"\n (boxDelete)=\"onDelete()\">\n </div>\n</div>\n<ng-template #nonEditable>\n <div #rectElement\n class=\"rectangle\"\n mvKeyboardBoxMove\n [tabindex]=\"rectangleTabIndex\"\n [ngClass]=\"{ 'selected': selected }\"\n [style.backgroundColor]=\"'#' + color\"\n [style.width]=\"width + 'px'\"\n [style.height]=\"height+ 'px'\"\n [style.left]=\"left + 'px'\"\n [style.top]=\"top + 'px'\"\n [enabled]=\"false\"\n (click)=\"onClick()\"\n (focus)=\"onFocus()\"\n (boxDelete)=\"onDelete()\">\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4$1.DraggableElementDirective, selector: "[draggable]", inputs: ["rotate"], outputs: ["coordinates", "stopped"] }, { kind: "directive", type: i4$1.ResizableElementDirective, selector: "[resizable]", inputs: ["rotate", "selected"], outputs: ["stopped"] }, { kind: "directive", type: KeyboardBoxMoveDirective, selector: "[mvKeyboardBoxMove]", inputs: ["enabled", "incrementSmall", "incrementLarge", "movementBounds"], outputs: ["keyboardMovingChange", "boxDelete"] }] }); }
|
|
4089
4546
|
}
|
|
4090
4547
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RectangleComponent, decorators: [{
|
|
4091
4548
|
type: Component,
|
|
4092
|
-
args: [{ selector: 'mv-anno-rectangle', template: "<div *ngIf=\"editable; else nonEditable\">\n <div #rectElement\n class=\"rectangle\"\n draggable\n resizable\n [tabindex]=\"
|
|
4549
|
+
args: [{ selector: 'mv-anno-rectangle', template: "<div *ngIf=\"editable; else nonEditable\">\n <div #rectElement\n class=\"rectangle\"\n draggable\n resizable\n mvKeyboardBoxMove\n [tabindex]=\"rectangleTabIndex\"\n [ngClass]=\"{ 'selected': selected, 'grabNDrag': enableGrabNDrag }\"\n [style.backgroundColor]=\"'#' + color\"\n [style.width]=\"width + 'px'\"\n [style.height]=\"height + 'px'\"\n [style.left]=\"left + 'px'\"\n [style.top]=\"top + 'px'\"\n [rotate]=\"0\"\n [selected]=\"selected\"\n [movementBounds]=\"movementBounds\"\n (click)=\"onClick()\"\n (focus)=\"onFocus()\"\n (stopped)=\"onUpdate(rectElement)\"\n (keyboardMovingChange)=\"onKeyboardMovingChange($event)\"\n (boxDelete)=\"onDelete()\">\n </div>\n</div>\n<ng-template #nonEditable>\n <div #rectElement\n class=\"rectangle\"\n mvKeyboardBoxMove\n [tabindex]=\"rectangleTabIndex\"\n [ngClass]=\"{ 'selected': selected }\"\n [style.backgroundColor]=\"'#' + color\"\n [style.width]=\"width + 'px'\"\n [style.height]=\"height+ 'px'\"\n [style.left]=\"left + 'px'\"\n [style.top]=\"top + 'px'\"\n [enabled]=\"false\"\n (click)=\"onClick()\"\n (focus)=\"onFocus()\"\n (boxDelete)=\"onDelete()\">\n </div>\n</ng-template>\n" }]
|
|
4093
4550
|
}], ctorParameters: () => [{ type: ToolbarEventService }, { type: HighlightCreateService }], propDecorators: { color: [{
|
|
4094
4551
|
type: Input
|
|
4095
4552
|
}], zoom: [{
|
|
@@ -4102,10 +4559,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
4102
4559
|
type: Input
|
|
4103
4560
|
}], pageWidth: [{
|
|
4104
4561
|
type: Input
|
|
4562
|
+
}], rectangleTabIndex: [{
|
|
4563
|
+
type: Input
|
|
4105
4564
|
}], selectEvent: [{
|
|
4106
4565
|
type: Output
|
|
4107
4566
|
}], updateEvent: [{
|
|
4108
4567
|
type: Output
|
|
4568
|
+
}], deleteEvent: [{
|
|
4569
|
+
type: Output
|
|
4570
|
+
}], keyboardMovingChange: [{
|
|
4571
|
+
type: Output
|
|
4109
4572
|
}], viewRect: [{
|
|
4110
4573
|
type: ViewChild,
|
|
4111
4574
|
args: ['rectElement', { static: false }]
|
|
@@ -4239,18 +4702,41 @@ class AnnotationViewComponent {
|
|
|
4239
4702
|
if (selectedId) {
|
|
4240
4703
|
const id = this.anno.id || this.anno.redactionId; // todo make it unique
|
|
4241
4704
|
this.selected = selectedId.annotationId ? (selectedId.annotationId === id) : false;
|
|
4705
|
+
if (this.selected && !this.isKeyboardMoving) {
|
|
4706
|
+
this.showToolbarSubject.next(true);
|
|
4707
|
+
}
|
|
4708
|
+
else {
|
|
4709
|
+
this.showToolbarSubject.next(false);
|
|
4710
|
+
}
|
|
4242
4711
|
}
|
|
4243
4712
|
}
|
|
4244
4713
|
constructor(toolbarEvents, store) {
|
|
4245
4714
|
this.toolbarEvents = toolbarEvents;
|
|
4246
4715
|
this.store = store;
|
|
4716
|
+
this.isKeyboardMoving = false;
|
|
4717
|
+
this.showToolbar = false;
|
|
4718
|
+
this.showToolbarSubject = new Subject();
|
|
4247
4719
|
this.update = new EventEmitter();
|
|
4248
4720
|
this.delete = new EventEmitter();
|
|
4249
4721
|
this.annotationClick = new EventEmitter();
|
|
4722
|
+
this.showToolbarSubject
|
|
4723
|
+
.pipe(debounceTime$1(300))
|
|
4724
|
+
.subscribe(show => {
|
|
4725
|
+
this.showToolbar = show;
|
|
4726
|
+
});
|
|
4727
|
+
}
|
|
4728
|
+
ngOnDestroy() {
|
|
4729
|
+
this.showToolbarSubject.complete();
|
|
4730
|
+
}
|
|
4731
|
+
setShowToolbar(show) {
|
|
4732
|
+
this.showToolbarSubject.next(show);
|
|
4250
4733
|
}
|
|
4251
4734
|
onSelect() {
|
|
4252
4735
|
const annotationId = this.anno.id || this.anno.redactionId;
|
|
4253
4736
|
this.annotationClick.emit({ annotationId, editable: false, selected: true });
|
|
4737
|
+
if (!this.isKeyboardMoving) {
|
|
4738
|
+
this.setShowToolbar(true);
|
|
4739
|
+
}
|
|
4254
4740
|
}
|
|
4255
4741
|
onRectangleUpdate(rectangle) {
|
|
4256
4742
|
const annotation = { ...this.anno };
|
|
@@ -4286,12 +4772,22 @@ class AnnotationViewComponent {
|
|
|
4286
4772
|
this.annotationClick.emit({ annotationId: this.anno.id, editable: true, selected: true });
|
|
4287
4773
|
this.toolbarEvents.toggleCommentsPanel(true);
|
|
4288
4774
|
}
|
|
4775
|
+
onKeyboardMovingChange(isMoving) {
|
|
4776
|
+
this.isKeyboardMoving = isMoving;
|
|
4777
|
+
if (isMoving) {
|
|
4778
|
+
this.showToolbar = false;
|
|
4779
|
+
this.showToolbarSubject.next(false);
|
|
4780
|
+
}
|
|
4781
|
+
else if (this.selected) {
|
|
4782
|
+
this.setShowToolbar(true);
|
|
4783
|
+
}
|
|
4784
|
+
}
|
|
4289
4785
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnnotationViewComponent, deps: [{ token: ToolbarEventService }, { token: i1.Store }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4290
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AnnotationViewComponent, selector: "mv-annotation", inputs: { annotation: "annotation", zoom: "zoom", rotate: "rotate", selectedAnnoId: "selectedAnnoId", pageHeight: "pageHeight", pageWidth: "pageWidth" }, outputs: { update: "update", delete: "delete", annotationClick: "annotationClick" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div #container [tabindex]=\"
|
|
4786
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AnnotationViewComponent, selector: "mv-annotation", inputs: { annotation: "annotation", zoom: "zoom", rotate: "rotate", selectedAnnoId: "selectedAnnoId", pageHeight: "pageHeight", pageWidth: "pageWidth" }, outputs: { update: "update", delete: "delete", annotationClick: "annotationClick" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div #container [tabindex]=\"-1\">\n <mv-ctx-toolbar *ngIf=\"selected && showToolbar\"\n [canDelete]=\"true\" [canComment]=\"true\"\n [rectangles]=\"anno.rectangles\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [pageHeight]=\"pageHeight\"\n [pageWidth]=\"pageWidth\"\n (deleteHighlightEvent)=\"deleteHighlight()\"\n (addOrEditCommentEvent)=\"addOrEditComment()\">\n </mv-ctx-toolbar>\n <ng-container *ngFor=\"let rectangle of anno.rectangles; let i = index\">\n <mv-anno-rectangle\n (selectEvent)=\"onSelect()\"\n (updateEvent)=\"onRectangleUpdate($event)\"\n (keyboardMovingChange)=\"onKeyboardMovingChange($event)\"\n (deleteEvent)=\"deleteHighlight()\"\n [selected]=\"selected\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [pageHeight]=\"pageHeight\"\n [pageWidth]=\"pageWidth\"\n [editable]=\"anno.rectangles.length <= 1\"\n [annoRect]=\"rectangle\"\n [rectangleTabIndex]=\"i + 1\"\n [color]=\"anno.color\">\n </mv-anno-rectangle>\n </ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: RectangleComponent, selector: "mv-anno-rectangle", inputs: ["color", "zoom", "rotate", "editable", "pageHeight", "pageWidth", "rectangleTabIndex", "annoRect", "selected"], outputs: ["selectEvent", "updateEvent", "deleteEvent", "keyboardMovingChange"] }, { kind: "component", type: CtxToolbarComponent, selector: "mv-ctx-toolbar", inputs: ["zoom", "rotate", "pageHeight", "pageWidth", "canHighlight", "canBookmark", "canComment", "canDelete", "rectangles"], outputs: ["createHighlightEvent", "deleteHighlightEvent", "addOrEditCommentEvent", "createBookmarkEvent"] }] }); }
|
|
4291
4787
|
}
|
|
4292
4788
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnnotationViewComponent, decorators: [{
|
|
4293
4789
|
type: Component,
|
|
4294
|
-
args: [{ selector: 'mv-annotation', template: "<div #container [tabindex]=\"
|
|
4790
|
+
args: [{ selector: 'mv-annotation', template: "<div #container [tabindex]=\"-1\">\n <mv-ctx-toolbar *ngIf=\"selected && showToolbar\"\n [canDelete]=\"true\" [canComment]=\"true\"\n [rectangles]=\"anno.rectangles\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [pageHeight]=\"pageHeight\"\n [pageWidth]=\"pageWidth\"\n (deleteHighlightEvent)=\"deleteHighlight()\"\n (addOrEditCommentEvent)=\"addOrEditComment()\">\n </mv-ctx-toolbar>\n <ng-container *ngFor=\"let rectangle of anno.rectangles; let i = index\">\n <mv-anno-rectangle\n (selectEvent)=\"onSelect()\"\n (updateEvent)=\"onRectangleUpdate($event)\"\n (keyboardMovingChange)=\"onKeyboardMovingChange($event)\"\n (deleteEvent)=\"deleteHighlight()\"\n [selected]=\"selected\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [pageHeight]=\"pageHeight\"\n [pageWidth]=\"pageWidth\"\n [editable]=\"anno.rectangles.length <= 1\"\n [annoRect]=\"rectangle\"\n [rectangleTabIndex]=\"i + 1\"\n [color]=\"anno.color\">\n </mv-anno-rectangle>\n </ng-container>\n</div>\n" }]
|
|
4295
4791
|
}], ctorParameters: () => [{ type: ToolbarEventService }, { type: i1.Store }], propDecorators: { annotation: [{
|
|
4296
4792
|
type: Input
|
|
4297
4793
|
}], zoom: [{
|
|
@@ -4409,8 +4905,8 @@ class MetadataLayerComponent {
|
|
|
4409
4905
|
this.rectangles = undefined;
|
|
4410
4906
|
});
|
|
4411
4907
|
}
|
|
4412
|
-
saveAnnotation({ rectangles, page }) {
|
|
4413
|
-
this.highlightService.saveAnnotation(rectangles, page);
|
|
4908
|
+
saveAnnotation({ rectangles, page, annotationId }) {
|
|
4909
|
+
this.highlightService.saveAnnotation(rectangles, page, annotationId);
|
|
4414
4910
|
this.toolbarEvents.drawModeSubject.next(false);
|
|
4415
4911
|
}
|
|
4416
4912
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataLayerComponent, deps: [{ token: i1.Store }, { token: HighlightCreateService }, { token: ToolbarEventService }, { token: ViewerEventService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
@@ -4852,10 +5348,6 @@ class SideBarComponent {
|
|
|
4852
5348
|
this.selectedView = toggle ? 'outline' : 'bookmarks';
|
|
4853
5349
|
}), this.toolbarEvents.sidebarOpen.subscribe(toggle => {
|
|
4854
5350
|
this.sidebarOpen = toggle;
|
|
4855
|
-
}), this.toolbarEvents.sidebarOpen.pipe(filter(toggle => toggle === true), delay(0)).subscribe(() => {
|
|
4856
|
-
if (this.sidebarDiv?.nativeElement) {
|
|
4857
|
-
this.sidebarDiv.nativeElement.focus();
|
|
4858
|
-
}
|
|
4859
5351
|
}));
|
|
4860
5352
|
this.subscriptions.push(this.store.pipe(select(getScrollTop)).subscribe(scrollTopValue => {
|
|
4861
5353
|
if (this.sidebarDiv?.nativeElement) {
|
|
@@ -4899,11 +5391,11 @@ class SideBarComponent {
|
|
|
4899
5391
|
return next === undefined ? Number.MAX_SAFE_INTEGER : next.pageNumber;
|
|
4900
5392
|
}
|
|
4901
5393
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SideBarComponent, deps: [{ token: ViewerEventService }, { token: i1.Store }, { token: ToolbarEventService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4902
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SideBarComponent, selector: "mv-side-bar", inputs: { annotationsEnabled: "annotationsEnabled", outline: "outline", url: "url", zoom: "zoom", rotate: "rotate", currentPageNumber: "currentPageNumber" }, viewQueries: [{ propertyName: "bookmarks", first: true, predicate: BookmarksComponent, descendants: true }, { propertyName: "sidebarDiv", first: true, predicate: ["sidebar"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"toolbarSidebar\">\n <div\n *ngIf=\"annotationsEnabled && selectedView === 'bookmarks'\"\n class=\"splitToolbarButton toggled\"\n >\n <button\n id=\"sortBookmarkPosition\"\n class=\"splitToolbarButton left bookmark__sort__position\"\n (click)=\"bookmarks.sort(bookmarks.positionSort)\"\n title=\"Order by place in document\"\n aria-pressed=\"true\"\n ></button>\n <button\n id=\"sortBookmarkCustom\"\n class=\"splitToolbarButton left bookmark__sort__custom\"\n (click)=\"bookmarks.sort(bookmarks.customSort)\"\n title=\"Order manually\"\n aria-pressed=\"true\"\n ></button>\n </div>\n <div class=\"splitToolbarButtonSeparator\"></div>\n <div\n *ngIf=\"annotationsEnabled && selectedView === 'bookmarks'\"\n class=\"splitToolbarButton right\"\n >\n <button\n id=\"addBookmark\"\n class=\"toolbarButton addBookmark\"\n (click)=\"bookmarks.onAddBookmarkClick()\"\n title=\"Add bookmark\"\n tabindex=\"3\"\n data-l10n-id=\"addBookmark\"\n >\n <span data-l10n-id=\"addBookmark_label\">{{\n \"Add bookmark\" | rpxTranslate\n }}</span>\n </button>\n </div>\n</div>\n<div
|
|
5394
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SideBarComponent, selector: "mv-side-bar", inputs: { annotationsEnabled: "annotationsEnabled", outline: "outline", url: "url", zoom: "zoom", rotate: "rotate", currentPageNumber: "currentPageNumber" }, viewQueries: [{ propertyName: "bookmarks", first: true, predicate: BookmarksComponent, descendants: true }, { propertyName: "sidebarDiv", first: true, predicate: ["sidebar"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"toolbarSidebar\">\n <div\n *ngIf=\"annotationsEnabled && selectedView === 'bookmarks'\"\n class=\"splitToolbarButton toggled\"\n >\n <button\n id=\"sortBookmarkPosition\"\n class=\"splitToolbarButton left bookmark__sort__position\"\n (click)=\"bookmarks.sort(bookmarks.positionSort)\"\n title=\"Order by place in document\"\n aria-pressed=\"true\"\n ></button>\n <button\n id=\"sortBookmarkCustom\"\n class=\"splitToolbarButton left bookmark__sort__custom\"\n (click)=\"bookmarks.sort(bookmarks.customSort)\"\n title=\"Order manually\"\n aria-pressed=\"true\"\n ></button>\n </div>\n <div class=\"splitToolbarButtonSeparator\"></div>\n <div\n *ngIf=\"annotationsEnabled && selectedView === 'bookmarks'\"\n class=\"splitToolbarButton right\"\n >\n <button\n id=\"addBookmark\"\n class=\"toolbarButton addBookmark\"\n (click)=\"bookmarks.onAddBookmarkClick()\"\n title=\"Add bookmark\"\n tabindex=\"3\"\n data-l10n-id=\"addBookmark\"\n >\n <span data-l10n-id=\"addBookmark_label\">{{\n \"Add bookmark\" | rpxTranslate\n }}</span>\n </button>\n </div>\n</div>\n<div #sidebar id=\"sidebarContent\" cdkScrollable (scroll)=\"onScroll($event)\" [hidden]=\"!sidebarOpen\">\n <div id=\"outlineView\" class=\"outlineWithDeepNesting\">\n <div class=\"outlineItem\" *ngIf=\"selectedView === 'outline'\">\n <mv-outline-item\n *ngFor=\"let outlineItem of outline; index as i\"\n [outline]=\"outlineItem\"\n [currentPageNumber]=\"currentPageNumber\"\n [isCurrentSection]=\"isViewedItem(outlineItem, outline[i + 1])\"\n [endPage]=\"findEndPage(outline[i + 1])\"\n (navigationEvent)=\"goToDestination($event)\"\n ></mv-outline-item>\n </div>\n <div\n *ngIf=\"annotationsEnabled && selectedView === 'bookmarks'\"\n id=\"bookmarkContainer\"\n >\n <mv-bookmarks\n [bookmarkNodes]=\"bookmarkNodes$ | async\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [parentScrollTop]=\"scrollTop\"\n (goToDestination)=\"goToDestination($event)\"\n (treeHasChanged)=\"hasTreeChanged($event)\"\n ></mv-bookmarks>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5$2.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "component", type: BookmarksComponent, selector: "mv-bookmarks", inputs: ["bookmarkNodes", "zoom", "rotate", "parentScrollTop"], outputs: ["goToDestination", "treeHasChanged"] }, { kind: "component", type: OutlineItemComponent, selector: "mv-outline-item", inputs: ["outline", "currentPageNumber", "isCurrentSection", "endPage"], outputs: ["navigationEvent"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5$1.RpxTranslatePipe, name: "rpxTranslate" }] }); }
|
|
4903
5395
|
}
|
|
4904
5396
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SideBarComponent, decorators: [{
|
|
4905
5397
|
type: Component,
|
|
4906
|
-
args: [{ selector: 'mv-side-bar', template: "<div id=\"toolbarSidebar\">\n <div\n *ngIf=\"annotationsEnabled && selectedView === 'bookmarks'\"\n class=\"splitToolbarButton toggled\"\n >\n <button\n id=\"sortBookmarkPosition\"\n class=\"splitToolbarButton left bookmark__sort__position\"\n (click)=\"bookmarks.sort(bookmarks.positionSort)\"\n title=\"Order by place in document\"\n aria-pressed=\"true\"\n ></button>\n <button\n id=\"sortBookmarkCustom\"\n class=\"splitToolbarButton left bookmark__sort__custom\"\n (click)=\"bookmarks.sort(bookmarks.customSort)\"\n title=\"Order manually\"\n aria-pressed=\"true\"\n ></button>\n </div>\n <div class=\"splitToolbarButtonSeparator\"></div>\n <div\n *ngIf=\"annotationsEnabled && selectedView === 'bookmarks'\"\n class=\"splitToolbarButton right\"\n >\n <button\n id=\"addBookmark\"\n class=\"toolbarButton addBookmark\"\n (click)=\"bookmarks.onAddBookmarkClick()\"\n title=\"Add bookmark\"\n tabindex=\"3\"\n data-l10n-id=\"addBookmark\"\n >\n <span data-l10n-id=\"addBookmark_label\">{{\n \"Add bookmark\" | rpxTranslate\n }}</span>\n </button>\n </div>\n</div>\n<div
|
|
5398
|
+
args: [{ selector: 'mv-side-bar', template: "<div id=\"toolbarSidebar\">\n <div\n *ngIf=\"annotationsEnabled && selectedView === 'bookmarks'\"\n class=\"splitToolbarButton toggled\"\n >\n <button\n id=\"sortBookmarkPosition\"\n class=\"splitToolbarButton left bookmark__sort__position\"\n (click)=\"bookmarks.sort(bookmarks.positionSort)\"\n title=\"Order by place in document\"\n aria-pressed=\"true\"\n ></button>\n <button\n id=\"sortBookmarkCustom\"\n class=\"splitToolbarButton left bookmark__sort__custom\"\n (click)=\"bookmarks.sort(bookmarks.customSort)\"\n title=\"Order manually\"\n aria-pressed=\"true\"\n ></button>\n </div>\n <div class=\"splitToolbarButtonSeparator\"></div>\n <div\n *ngIf=\"annotationsEnabled && selectedView === 'bookmarks'\"\n class=\"splitToolbarButton right\"\n >\n <button\n id=\"addBookmark\"\n class=\"toolbarButton addBookmark\"\n (click)=\"bookmarks.onAddBookmarkClick()\"\n title=\"Add bookmark\"\n tabindex=\"3\"\n data-l10n-id=\"addBookmark\"\n >\n <span data-l10n-id=\"addBookmark_label\">{{\n \"Add bookmark\" | rpxTranslate\n }}</span>\n </button>\n </div>\n</div>\n<div #sidebar id=\"sidebarContent\" cdkScrollable (scroll)=\"onScroll($event)\" [hidden]=\"!sidebarOpen\">\n <div id=\"outlineView\" class=\"outlineWithDeepNesting\">\n <div class=\"outlineItem\" *ngIf=\"selectedView === 'outline'\">\n <mv-outline-item\n *ngFor=\"let outlineItem of outline; index as i\"\n [outline]=\"outlineItem\"\n [currentPageNumber]=\"currentPageNumber\"\n [isCurrentSection]=\"isViewedItem(outlineItem, outline[i + 1])\"\n [endPage]=\"findEndPage(outline[i + 1])\"\n (navigationEvent)=\"goToDestination($event)\"\n ></mv-outline-item>\n </div>\n <div\n *ngIf=\"annotationsEnabled && selectedView === 'bookmarks'\"\n id=\"bookmarkContainer\"\n >\n <mv-bookmarks\n [bookmarkNodes]=\"bookmarkNodes$ | async\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [parentScrollTop]=\"scrollTop\"\n (goToDestination)=\"goToDestination($event)\"\n (treeHasChanged)=\"hasTreeChanged($event)\"\n ></mv-bookmarks>\n </div>\n </div>\n</div>\n" }]
|
|
4907
5399
|
}], ctorParameters: () => [{ type: ViewerEventService }, { type: i1.Store }, { type: ToolbarEventService }], propDecorators: { annotationsEnabled: [{
|
|
4908
5400
|
type: Input
|
|
4909
5401
|
}], outline: [{
|
|
@@ -6975,7 +7467,9 @@ class AnnotationsModule {
|
|
|
6975
7467
|
MomentDatePipe,
|
|
6976
7468
|
CommentFilterComponent,
|
|
6977
7469
|
FilterPipe,
|
|
6978
|
-
UnsnakePipe
|
|
7470
|
+
UnsnakePipe,
|
|
7471
|
+
KeyboardBoxDrawDirective,
|
|
7472
|
+
KeyboardBoxMoveDirective], imports: [A11yModule,
|
|
6979
7473
|
CommonModule,
|
|
6980
7474
|
FormsModule,
|
|
6981
7475
|
HttpClientModule,
|
|
@@ -7051,7 +7545,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
7051
7545
|
MomentDatePipe,
|
|
7052
7546
|
CommentFilterComponent,
|
|
7053
7547
|
FilterPipe,
|
|
7054
|
-
UnsnakePipe
|
|
7548
|
+
UnsnakePipe,
|
|
7549
|
+
KeyboardBoxDrawDirective,
|
|
7550
|
+
KeyboardBoxMoveDirective
|
|
7055
7551
|
],
|
|
7056
7552
|
providers: [
|
|
7057
7553
|
AnnotationApiService,
|
|
@@ -7095,7 +7591,10 @@ class AnnotationEffects {
|
|
|
7095
7591
|
})));
|
|
7096
7592
|
this.postAnnotation$ = createEffect(() => this.actions$.pipe(ofType(SAVE_ANNOTATION), concatMap((action) => {
|
|
7097
7593
|
return this.annotationApiService.postAnnotation(action.payload).pipe(map(annotations => {
|
|
7098
|
-
|
|
7594
|
+
const successAction = new SaveAnnotationSuccess(annotations);
|
|
7595
|
+
successAction.autoSelect = action.autoSelect;
|
|
7596
|
+
successAction.annotationId = action.payload.id;
|
|
7597
|
+
return successAction;
|
|
7099
7598
|
}), catchError(error => {
|
|
7100
7599
|
return of(new LoadAnnotationSetFail(error));
|
|
7101
7600
|
}));
|
|
@@ -7114,6 +7613,13 @@ class AnnotationEffects {
|
|
|
7114
7613
|
return of(new SaveAnnotationSetFail(error));
|
|
7115
7614
|
}));
|
|
7116
7615
|
})));
|
|
7616
|
+
this.autoSelectAnnotation$ = createEffect(() => this.actions$.pipe(ofType(SAVE_ANNOTATION_SUCCESS), filter((action) => action.autoSelect === true && action.annotationId), map((action) => {
|
|
7617
|
+
return new SelectedAnnotation({
|
|
7618
|
+
annotationId: action.annotationId,
|
|
7619
|
+
editable: false,
|
|
7620
|
+
selected: true
|
|
7621
|
+
});
|
|
7622
|
+
})));
|
|
7117
7623
|
}
|
|
7118
7624
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnnotationEffects, deps: [{ token: i1$2.Actions }, { token: AnnotationApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
7119
7625
|
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnnotationEffects }); }
|