box-annotations 5.3.0 → 5.3.1-beta.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/dist/annotations.css +1 -1
- package/dist/annotations.js +1 -1
- package/dist/annotations.js.LICENSE.txt +0 -9
- package/i18n/bn-IN.js +24 -17
- package/i18n/da-DK.js +24 -17
- package/i18n/de-DE.js +24 -17
- package/i18n/en-AU.js +4 -17
- package/i18n/en-CA.js +2 -18
- package/i18n/en-GB.js +4 -17
- package/i18n/en-US.js +4 -24
- package/i18n/en-x-pseudo.js +6 -0
- package/i18n/es-419.js +24 -17
- package/i18n/es-ES.js +24 -17
- package/i18n/fi-FI.js +24 -17
- package/i18n/fr-CA.js +24 -17
- package/i18n/fr-FR.js +24 -17
- package/i18n/hi-IN.js +24 -17
- package/i18n/it-IT.js +24 -17
- package/i18n/ja-JP.js +2 -18
- package/i18n/ko-KR.js +24 -17
- package/i18n/nb-NO.js +24 -17
- package/i18n/nl-NL.js +24 -17
- package/i18n/pl-PL.js +24 -17
- package/i18n/pt-BR.js +24 -17
- package/i18n/ru-RU.js +24 -17
- package/i18n/sv-SE.js +24 -17
- package/i18n/tr-TR.js +24 -17
- package/i18n/zh-CN.js +24 -17
- package/i18n/zh-TW.js +24 -17
- package/package.json +29 -28
- package/src/BoxAnnotations.ts +1 -1
- package/src/adapters/threadedAnnotationsAdapters.ts +10 -2
- package/src/boundingBoxHighlight/BoundingBoxHighlightContainer.tsx +4 -1
- package/src/common/BaseAnnotator.scss +1 -1
- package/src/common/BaseAnnotator.ts +9 -0
- package/src/common/DeselectListener.tsx +1 -1
- package/src/common/EventEmitter.ts +11 -3
- package/src/components/BoundingBoxHighlight/BoundingBoxHighlightNav.scss +3 -3
- package/src/components/BoundingBoxHighlight/BoundingBoxHighlightRect.scss +11 -6
- package/src/components/Popups/PopupBase.scss +2 -2
- package/src/components/Popups/PopupDrawingToolbar.scss +4 -4
- package/src/components/Popups/PopupList.scss +1 -1
- package/src/components/Popups/PopupV2.scss +2 -2
- package/src/components/Popups/PopupV2.tsx +62 -44
- package/src/components/ReplyForm/ReplyForm.tsx +1 -8
- package/src/constants.ts +2 -3
- package/src/document/DocumentAnnotator.ts +54 -14
- package/src/document/docUtil.ts +12 -2
- package/src/drawing/DrawingAnnotations.tsx +24 -24
- package/src/drawing/DrawingCursor.ts +2 -1
- package/src/drawing/DrawingManager.tsx +9 -1
- package/src/highlight/HighlightAnnotations.tsx +23 -22
- package/src/highlight/HighlightCreator.scss +9 -2
- package/src/media/MediaAnnotator.ts +38 -16
- package/src/popup/PopupLayer.tsx +1 -0
- package/src/region/RegionAnnotations.tsx +2 -3
- package/src/region/RegionCreation.tsx +8 -4
- package/src/region/RegionCreationContainer.tsx +3 -0
- package/src/region/RegionCreationManager.tsx +8 -1
- package/src/region/RegionCreator.scss +9 -3
- package/src/region/RegionManager.tsx +8 -1
- package/src/region/RegionRect.scss +17 -9
- package/src/store/annotations/actions.ts +88 -104
- package/src/store/annotations/reducer.ts +6 -4
- package/src/store/creator/selectors.ts +6 -6
- package/src/store/eventing/create.ts +4 -2
- package/src/store/eventing/delete.ts +4 -5
- package/src/store/eventing/middleware.ts +13 -11
- package/src/store/eventing/replyCreate.ts +6 -10
- package/src/store/eventing/replyDelete.ts +5 -9
- package/src/store/eventing/replyUpdate.ts +6 -10
- package/src/store/eventing/update.ts +5 -6
- package/src/store/highlight/actions.ts +43 -41
- package/src/test-utils/videoAnnotations.tsx +11 -11
- package/src/utils/useVideoTiming.ts +9 -13
- package/i18n/bn-IN.properties +0 -32
- package/i18n/da-DK.properties +0 -32
- package/i18n/de-DE.properties +0 -32
- package/i18n/en-AU.properties +0 -32
- package/i18n/en-CA.properties +0 -32
- package/i18n/en-GB.properties +0 -32
- package/i18n/en-US.properties +0 -44
- package/i18n/en-x-pseudo.properties +0 -32
- package/i18n/es-419.properties +0 -32
- package/i18n/es-ES.properties +0 -32
- package/i18n/fi-FI.properties +0 -32
- package/i18n/fr-CA.properties +0 -32
- package/i18n/fr-FR.properties +0 -32
- package/i18n/hi-IN.properties +0 -32
- package/i18n/it-IT.properties +0 -32
- package/i18n/ja-JP.properties +0 -32
- package/i18n/json/src/components/BoundingBoxHighlight/messages.json +0 -1
- package/i18n/json/src/components/Popups/messages.json +0 -1
- package/i18n/json/src/messages.json +0 -1
- package/i18n/ko-KR.properties +0 -32
- package/i18n/nb-NO.properties +0 -32
- package/i18n/nl-NL.properties +0 -32
- package/i18n/pl-PL.properties +0 -32
- package/i18n/pt-BR.properties +0 -32
- package/i18n/ru-RU.properties +0 -32
- package/i18n/sv-SE.properties +0 -32
- package/i18n/tr-TR.properties +0 -32
- package/i18n/zh-CN.properties +0 -32
- package/i18n/zh-TW.properties +0 -32
|
@@ -32,6 +32,8 @@ export default class DocumentAnnotator extends BaseAnnotator {
|
|
|
32
32
|
|
|
33
33
|
highlightListener?: HighlightListener;
|
|
34
34
|
|
|
35
|
+
private readonly canCreate: boolean;
|
|
36
|
+
|
|
35
37
|
managers: Map<number, Set<Manager>> = new Map();
|
|
36
38
|
|
|
37
39
|
/** Tracks which view mode the current managers were created for. Used to destroy/recreate when switching. */
|
|
@@ -40,11 +42,24 @@ export default class DocumentAnnotator extends BaseAnnotator {
|
|
|
40
42
|
constructor(options: Options) {
|
|
41
43
|
super(options);
|
|
42
44
|
|
|
43
|
-
|
|
45
|
+
// Controls off: skip create; existing annotations still render.
|
|
46
|
+
this.canCreate = options.showAnnotationsControls !== false;
|
|
47
|
+
if (this.canCreate) {
|
|
48
|
+
this.highlightListener = new HighlightListener({
|
|
49
|
+
getSelection: this.getDocumentSelection,
|
|
50
|
+
store: this.store,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
44
53
|
|
|
45
54
|
this.addListener(Event.ANNOTATIONS_MODE_CHANGE, this.handleChangeMode);
|
|
46
55
|
}
|
|
47
56
|
|
|
57
|
+
// Resolve .bp-doc at event time; it may not exist in the constructor.
|
|
58
|
+
getDocumentSelection = (): ReturnType<typeof getSelection> => {
|
|
59
|
+
const rootEl = this.annotatedEl ?? this.getAnnotatedElement();
|
|
60
|
+
return rootEl ? getSelection(rootEl) : null;
|
|
61
|
+
};
|
|
62
|
+
|
|
48
63
|
destroy(): void {
|
|
49
64
|
this.removeListener(Event.ANNOTATIONS_MODE_CHANGE, this.handleChangeMode);
|
|
50
65
|
|
|
@@ -97,20 +112,36 @@ export default class DocumentAnnotator extends BaseAnnotator {
|
|
|
97
112
|
// Lazily instantiate managers as pages are added or re-rendered
|
|
98
113
|
if (managers.size === 0) {
|
|
99
114
|
if (viewMode === 'boundingBoxes') {
|
|
100
|
-
managers.add(
|
|
115
|
+
managers.add(
|
|
116
|
+
new BoundingBoxHighlightManager({ location: pageNumber, referenceEl: pageReferenceEl, resinTags }),
|
|
117
|
+
);
|
|
101
118
|
return managers;
|
|
102
119
|
}
|
|
103
120
|
|
|
104
121
|
// Annotations mode
|
|
105
|
-
managers.add(
|
|
106
|
-
|
|
122
|
+
managers.add(
|
|
123
|
+
new PopupManager({
|
|
124
|
+
location: pageNumber,
|
|
125
|
+
popupPortalEl: this.popupPortalEl,
|
|
126
|
+
referenceEl: pageReferenceEl,
|
|
127
|
+
resinTags,
|
|
128
|
+
}),
|
|
129
|
+
);
|
|
130
|
+
managers.add(
|
|
131
|
+
new DrawingManager({
|
|
132
|
+
location: pageNumber,
|
|
133
|
+
popupPortalEl: this.popupPortalEl,
|
|
134
|
+
referenceEl: pageReferenceEl,
|
|
135
|
+
resinTags,
|
|
136
|
+
}),
|
|
137
|
+
);
|
|
107
138
|
|
|
108
139
|
const textLayer = pageEl.querySelector('.textLayer') as HTMLElement;
|
|
109
140
|
|
|
110
|
-
if (textLayer) {
|
|
141
|
+
if (this.canCreate && textLayer) {
|
|
111
142
|
managers.add(
|
|
112
143
|
new HighlightCreatorManager({
|
|
113
|
-
getSelection,
|
|
144
|
+
getSelection: this.getDocumentSelection,
|
|
114
145
|
referenceEl: textLayer,
|
|
115
146
|
selectionChangeDelay: TEXT_LAYER_ENHANCEMENT,
|
|
116
147
|
store: this.store,
|
|
@@ -118,18 +149,27 @@ export default class DocumentAnnotator extends BaseAnnotator {
|
|
|
118
149
|
);
|
|
119
150
|
}
|
|
120
151
|
|
|
121
|
-
managers.add(new HighlightManager({ location: pageNumber, popupPortalEl: this.popupPortalEl, referenceEl: pageReferenceEl, resinTags }));
|
|
122
|
-
managers.add(new RegionManager({ location: pageNumber, referenceEl: pageReferenceEl, resinTags }));
|
|
123
|
-
|
|
124
|
-
const canvasLayerEl = pageEl.querySelector<HTMLElement>('.canvasWrapper');
|
|
125
|
-
|
|
126
152
|
managers.add(
|
|
127
|
-
new
|
|
153
|
+
new HighlightManager({
|
|
128
154
|
location: pageNumber,
|
|
129
|
-
|
|
155
|
+
popupPortalEl: this.popupPortalEl,
|
|
156
|
+
referenceEl: pageReferenceEl,
|
|
130
157
|
resinTags,
|
|
131
158
|
}),
|
|
132
159
|
);
|
|
160
|
+
managers.add(new RegionManager({ location: pageNumber, referenceEl: pageReferenceEl, resinTags }));
|
|
161
|
+
|
|
162
|
+
if (this.canCreate) {
|
|
163
|
+
const canvasLayerEl = pageEl.querySelector<HTMLElement>('.canvasWrapper');
|
|
164
|
+
|
|
165
|
+
managers.add(
|
|
166
|
+
new RegionCreationManager({
|
|
167
|
+
location: pageNumber,
|
|
168
|
+
referenceEl: canvasLayerEl || pageReferenceEl,
|
|
169
|
+
resinTags,
|
|
170
|
+
}),
|
|
171
|
+
);
|
|
172
|
+
}
|
|
133
173
|
}
|
|
134
174
|
|
|
135
175
|
return managers;
|
|
@@ -220,7 +260,7 @@ export default class DocumentAnnotator extends BaseAnnotator {
|
|
|
220
260
|
width: `${origWidth}px`,
|
|
221
261
|
});
|
|
222
262
|
} else {
|
|
223
|
-
manager.style({height: '', left: '', top: '', transform: '', width: ''});
|
|
263
|
+
manager.style({ height: '', left: '', top: '', transform: '', width: '' });
|
|
224
264
|
}
|
|
225
265
|
|
|
226
266
|
manager.render({
|
package/src/document/docUtil.ts
CHANGED
|
@@ -29,13 +29,17 @@ export function getPageNumber(element: Element | null): number | undefined {
|
|
|
29
29
|
return pageNumber ? parseInt(pageNumber, 10) : undefined;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
export function getSelection(): Selection | null {
|
|
32
|
+
export function getSelection(rootEl?: HTMLElement | null): Selection | null {
|
|
33
33
|
const selection = window.getSelection();
|
|
34
34
|
|
|
35
35
|
if (!selection || selection.isCollapsed || !selection.rangeCount || !selection.focusNode) {
|
|
36
36
|
return null;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
if (rootEl && !rootEl.contains(selection.focusNode)) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
|
|
39
43
|
// Firefox allows to select multiple ranges in the document by using Ctrl/Cmd+click
|
|
40
44
|
// We only care about the last range
|
|
41
45
|
let range = selection.getRangeAt(selection.rangeCount - 1);
|
|
@@ -62,5 +66,11 @@ export function getSelection(): Selection | null {
|
|
|
62
66
|
location = getPageNumber(selection.focusNode as Element) ?? endPage;
|
|
63
67
|
}
|
|
64
68
|
|
|
65
|
-
return {
|
|
69
|
+
return {
|
|
70
|
+
containerEl: containerEl as HTMLElement,
|
|
71
|
+
containerRect: containerEl.getBoundingClientRect(),
|
|
72
|
+
hasError,
|
|
73
|
+
location,
|
|
74
|
+
range,
|
|
75
|
+
};
|
|
66
76
|
}
|
|
@@ -91,7 +91,7 @@ const DrawingAnnotations = (props: Props): JSX.Element => {
|
|
|
91
91
|
redoDrawingPathGroup();
|
|
92
92
|
};
|
|
93
93
|
|
|
94
|
-
const getCurrentLocation = (): number => {
|
|
94
|
+
const getCurrentLocation = (): number => {
|
|
95
95
|
if (targetType === TARGET_TYPE.FRAME) {
|
|
96
96
|
return getCurrentVideoLocation();
|
|
97
97
|
}
|
|
@@ -121,12 +121,11 @@ const DrawingAnnotations = (props: Props): JSX.Element => {
|
|
|
121
121
|
}
|
|
122
122
|
}, [drawnPathGroups]);
|
|
123
123
|
|
|
124
|
-
|
|
125
124
|
let annotationsToShow: AnnotationDrawing[] = [];
|
|
126
|
-
// For video annotations, we only show the active annotation and we wait for the video
|
|
125
|
+
// For video annotations, we only show the active annotation and we wait for the video
|
|
127
126
|
// to seek to the annotation location before showing it. This prevents annoations from being
|
|
128
127
|
// shown on the incorrect frame while the video is seeking.
|
|
129
|
-
if (targetType === TARGET_TYPE.FRAME
|
|
128
|
+
if (targetType === TARGET_TYPE.FRAME) {
|
|
130
129
|
if (!isVideoSeeking && activeAnnotationId) {
|
|
131
130
|
annotationsToShow = annotations.filter(annotation => annotation.id === activeAnnotationId);
|
|
132
131
|
}
|
|
@@ -134,9 +133,6 @@ const DrawingAnnotations = (props: Props): JSX.Element => {
|
|
|
134
133
|
annotationsToShow = annotations;
|
|
135
134
|
}
|
|
136
135
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
136
|
return (
|
|
141
137
|
<>
|
|
142
138
|
<DrawingList
|
|
@@ -179,23 +175,27 @@ const DrawingAnnotations = (props: Props): JSX.Element => {
|
|
|
179
175
|
/>
|
|
180
176
|
)}
|
|
181
177
|
|
|
182
|
-
{isCreating &&
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
178
|
+
{isCreating &&
|
|
179
|
+
hasPathGroups &&
|
|
180
|
+
drawingSVGGroup &&
|
|
181
|
+
canShowPopupToolbar &&
|
|
182
|
+
(() => {
|
|
183
|
+
const toolbar = (
|
|
184
|
+
<PopupDrawingToolbar
|
|
185
|
+
ref={popupDrawingToolbarRef}
|
|
186
|
+
canComment={hasDrawnPathGroups}
|
|
187
|
+
canRedo={hasStashedPathGroups}
|
|
188
|
+
canUndo={hasDrawnPathGroups}
|
|
189
|
+
className={classNames('ba-DrawingAnnotations-toolbar', { 'ba-is-drawing': isDrawing })}
|
|
190
|
+
onDelete={handleDelete}
|
|
191
|
+
onRedo={handleRedo}
|
|
192
|
+
onReply={handleReply}
|
|
193
|
+
onUndo={handleUndo}
|
|
194
|
+
reference={drawingSVGGroup}
|
|
195
|
+
/>
|
|
196
|
+
);
|
|
197
|
+
return popupPortalEl ? ReactDOM.createPortal(toolbar, popupPortalEl) : toolbar;
|
|
198
|
+
})()}
|
|
199
199
|
</>
|
|
200
200
|
);
|
|
201
201
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const getDrawingCursor = (color: string): string => {
|
|
2
|
-
const encodedSvg =
|
|
2
|
+
const encodedSvg =
|
|
3
|
+
encodeURIComponent(`<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='32' height='32' viewBox='0 0 32 32'>
|
|
3
4
|
<defs>
|
|
4
5
|
<path id='ba-DrawingCursor-b' d='M23.0868949,12.6610542 L21.7362465,14.0116939 C21.5985448,14.1493947 21.3758783,14.1493947 21.2381766,14.0116939 L17.9860729,10.7596114 C17.8483713,10.6219106 17.8483713,10.3992455 17.9860729,10.2615447 L19.3367214,8.91090502 C19.8845983,8.36303166 20.7752645,8.36303166 21.3260713,8.91090502 L23.0868949,10.6717173 C23.6377017,11.2195906 23.6377017,12.1102511 23.0868949,12.6610542 Z M16.825863,11.4217471 L9.13214756,19.1154126 L8.51102507,22.6751246 C8.4260602,23.1556124 8.8450249,23.5716446 9.32551588,23.4896101 L12.8852509,22.8655618 L20.5789664,15.1718963 C20.7166681,15.0341955 20.7166681,14.8115304 20.5789664,14.6738296 L17.3268627,11.4217471 C17.1862312,11.2840463 16.9635647,11.2840463 16.825863,11.4217471 Z M12.1352162,18.4562067 C11.974076,18.2950675 11.974076,18.0372447 12.1352162,17.8761055 L16.6471438,13.3642072 C16.8082841,13.203068 17.0661085,13.203068 17.2272488,13.3642072 C17.388389,13.5253464 17.388389,13.7831692 17.2272488,13.9443084 L12.7153212,18.4562067 C12.5541809,18.6173459 12.2963565,18.6173459 12.1352162,18.4562067 L12.1352162,18.4562067 Z M11.0775501,20.9201719 L12.4838652,20.9201719 L12.4838652,21.9836908 L10.5941293,22.3147587 L9.6829543,21.4035896 L10.0140243,19.513866 L11.0775501,19.513866 L11.0775501,20.9201719 Z'/>
|
|
5
6
|
<filter id='ba-DrawingCursor-a' width='196.7%' height='196.7%' x='-48.3%' y='-41.7%' filterUnits='objectBoundingBox'>
|
|
@@ -25,6 +25,14 @@ export default class DrawingListManager extends BaseManager {
|
|
|
25
25
|
this.root = ReactDOM.createRoot(this.reactEl);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
this.root.render(
|
|
28
|
+
this.root.render(
|
|
29
|
+
<DrawingAnnotationsContainer
|
|
30
|
+
referenceEl={this.referenceEl}
|
|
31
|
+
targetType={this.targetType}
|
|
32
|
+
location={this.location}
|
|
33
|
+
popupPortalEl={this.popupPortalEl}
|
|
34
|
+
{...props}
|
|
35
|
+
/>,
|
|
36
|
+
);
|
|
29
37
|
}
|
|
30
38
|
}
|
|
@@ -126,30 +126,31 @@ const HighlightAnnotations = (props: Props): JSX.Element => {
|
|
|
126
126
|
)}
|
|
127
127
|
|
|
128
128
|
{/* Layer 3a: Annotations promoter to promote selection to staged */}
|
|
129
|
-
{!isCreating &&
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
shape={popupShape}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
})()}
|
|
129
|
+
{!isCreating &&
|
|
130
|
+
selection &&
|
|
131
|
+
!selection.hasError &&
|
|
132
|
+
(() => {
|
|
133
|
+
const popupShape = selection.popupRect || getBoundingRect(selection.rects);
|
|
134
|
+
const popup = (
|
|
135
|
+
<div className="ba-HighlightAnnotations-popup">
|
|
136
|
+
<PopupHighlight onCancel={handleCancel} onSubmit={handlePromote} shape={popupShape} />
|
|
137
|
+
</div>
|
|
138
|
+
);
|
|
139
|
+
return rotation && popupPortalEl ? ReactDOM.createPortal(popup, popupPortalEl) : popup;
|
|
140
|
+
})()}
|
|
142
141
|
|
|
143
142
|
{/* Layer 3b: Highlight error popup */}
|
|
144
|
-
{selection &&
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
143
|
+
{selection &&
|
|
144
|
+
selection.hasError &&
|
|
145
|
+
(() => {
|
|
146
|
+
const popupShape = selection.popupRect || getBoundingRect(selection.rects);
|
|
147
|
+
const popup = (
|
|
148
|
+
<div className="ba-HighlightAnnotations-popup">
|
|
149
|
+
<PopupHighlightError onCancel={handleCancel} shape={popupShape} />
|
|
150
|
+
</div>
|
|
151
|
+
);
|
|
152
|
+
return rotation && popupPortalEl ? ReactDOM.createPortal(popup, popupPortalEl) : popup;
|
|
153
|
+
})()}
|
|
153
154
|
</>
|
|
154
155
|
);
|
|
155
156
|
};
|
|
@@ -7,6 +7,13 @@ $text_cursor_32_3x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAA
|
|
|
7
7
|
$offset_x: 10;
|
|
8
8
|
$offset_y: 16;
|
|
9
9
|
|
|
10
|
-
cursor:
|
|
11
|
-
|
|
10
|
+
cursor:
|
|
11
|
+
url($text_cursor_32) $offset_x $offset_y,
|
|
12
|
+
text; /* Legacy */
|
|
13
|
+
|
|
14
|
+
/* stylelint-disable unit-no-unknown */
|
|
15
|
+
cursor:
|
|
16
|
+
image-set(url($text_cursor_32) 1x, url($text_cursor_32_2x) 2x, url($text_cursor_32_3x) 3x) $offset_x $offset_y,
|
|
17
|
+
text; /* Webkit */
|
|
18
|
+
/* stylelint-enable unit-no-unknown */
|
|
12
19
|
}
|
|
@@ -27,7 +27,6 @@ export default class MediaAnnotator extends BaseAnnotator {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
destroy(): void {
|
|
30
|
-
|
|
31
30
|
// If the store handler is present, unsubscribe from the store.
|
|
32
31
|
if (this.storeHandler) {
|
|
33
32
|
this.storeHandler();
|
|
@@ -44,12 +43,40 @@ export default class MediaAnnotator extends BaseAnnotator {
|
|
|
44
43
|
return this.containerEl?.querySelector(VIDEO_PARENT_SELECTOR);
|
|
45
44
|
}
|
|
46
45
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
46
|
+
addManagers(referenceEl: HTMLVideoElement, resinTags: { fileid: string | null; iscurrent: boolean }): void {
|
|
47
|
+
this.managers.add(
|
|
48
|
+
new PopupManager({
|
|
49
|
+
location: MEDIA_LOCATION_INDEX,
|
|
50
|
+
popupPortalEl: this.popupPortalEl,
|
|
51
|
+
referenceEl,
|
|
52
|
+
resinTags,
|
|
53
|
+
targetType: TARGET_TYPE.FRAME,
|
|
54
|
+
}),
|
|
55
|
+
);
|
|
56
|
+
this.managers.add(
|
|
57
|
+
new DrawingManager({
|
|
58
|
+
location: MEDIA_LOCATION_INDEX,
|
|
59
|
+
referenceEl,
|
|
60
|
+
resinTags,
|
|
61
|
+
targetType: TARGET_TYPE.FRAME,
|
|
62
|
+
}),
|
|
63
|
+
);
|
|
64
|
+
this.managers.add(
|
|
65
|
+
new RegionManager({
|
|
66
|
+
location: MEDIA_LOCATION_INDEX,
|
|
67
|
+
referenceEl,
|
|
68
|
+
resinTags,
|
|
69
|
+
targetType: TARGET_TYPE.FRAME,
|
|
70
|
+
}),
|
|
71
|
+
);
|
|
72
|
+
this.managers.add(
|
|
73
|
+
new RegionCreationManager({
|
|
74
|
+
location: MEDIA_LOCATION_INDEX,
|
|
75
|
+
referenceEl,
|
|
76
|
+
resinTags,
|
|
77
|
+
targetType: TARGET_TYPE.FRAME,
|
|
78
|
+
}),
|
|
79
|
+
);
|
|
53
80
|
}
|
|
54
81
|
|
|
55
82
|
getManagers(parentEl: HTMLElement, referenceEl: HTMLVideoElement): Set<Manager> {
|
|
@@ -70,8 +97,6 @@ export default class MediaAnnotator extends BaseAnnotator {
|
|
|
70
97
|
return this.managers;
|
|
71
98
|
}
|
|
72
99
|
|
|
73
|
-
|
|
74
|
-
|
|
75
100
|
// returns the actual video element
|
|
76
101
|
getReference(): HTMLVideoElement | null | undefined {
|
|
77
102
|
return this.annotatedEl?.querySelector('video');
|
|
@@ -117,12 +142,11 @@ export default class MediaAnnotator extends BaseAnnotator {
|
|
|
117
142
|
this.postRender();
|
|
118
143
|
}
|
|
119
144
|
|
|
120
|
-
// This function gets called by the client. We are using the name scrollToAnnotation to match
|
|
145
|
+
// This function gets called by the client. We are using the name scrollToAnnotation to match
|
|
121
146
|
// the other annotators as the client calls this function when it wants to show an annoation on the
|
|
122
|
-
// preview. The only difference is that we are using the video element's currentTime to scroll to the
|
|
147
|
+
// preview. The only difference is that we are using the video element's currentTime to scroll to the
|
|
123
148
|
// annotation instead of the scrollLeft and scrollTop of the parent element.
|
|
124
|
-
scrollToAnnotation(annotationId: string | null | undefined, defaultLocation: number = -1
|
|
125
|
-
|
|
149
|
+
scrollToAnnotation(annotationId: string | null | undefined, defaultLocation: number = -1): void {
|
|
126
150
|
if (!annotationId) {
|
|
127
151
|
return;
|
|
128
152
|
}
|
|
@@ -130,13 +154,11 @@ export default class MediaAnnotator extends BaseAnnotator {
|
|
|
130
154
|
const annotationLocation = annotation?.target?.location?.value ?? defaultLocation;
|
|
131
155
|
const video = this.getReference();
|
|
132
156
|
|
|
133
|
-
if (
|
|
157
|
+
if (!video || !this.annotatedEl || annotationLocation === -1) {
|
|
134
158
|
return;
|
|
135
159
|
}
|
|
136
160
|
|
|
137
161
|
video.pause();
|
|
138
162
|
video.currentTime = annotationLocation / 1000;
|
|
139
|
-
|
|
140
163
|
}
|
|
141
164
|
}
|
|
142
|
-
|
package/src/popup/PopupLayer.tsx
CHANGED
|
@@ -26,8 +26,8 @@ const RegionAnnotations = (props: Props): JSX.Element => {
|
|
|
26
26
|
setActiveAnnotationId(annotationId);
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
let annotationsToShow: AnnotationRegion[] = []
|
|
30
|
-
|
|
29
|
+
let annotationsToShow: AnnotationRegion[] = [];
|
|
30
|
+
|
|
31
31
|
if (targetType === TARGET_TYPE.FRAME) {
|
|
32
32
|
if (!isVideoSeeking && activeAnnotationId) {
|
|
33
33
|
annotationsToShow = annotations.filter(annotation => annotation.id === activeAnnotationId);
|
|
@@ -35,7 +35,6 @@ const RegionAnnotations = (props: Props): JSX.Element => {
|
|
|
35
35
|
} else {
|
|
36
36
|
annotationsToShow = annotations;
|
|
37
37
|
}
|
|
38
|
-
|
|
39
38
|
|
|
40
39
|
return (
|
|
41
40
|
<RegionList
|
|
@@ -8,6 +8,7 @@ import { TARGET_TYPE } from '../constants';
|
|
|
8
8
|
import { getVideoCurrentTimeInMilliseconds } from '../utils/useVideoTiming';
|
|
9
9
|
|
|
10
10
|
type Props = {
|
|
11
|
+
hasStagedItem?: boolean;
|
|
11
12
|
isCreating: boolean;
|
|
12
13
|
location: number;
|
|
13
14
|
resetCreator: () => void;
|
|
@@ -33,10 +34,10 @@ export default class RegionCreation extends React.PureComponent<Props, State> {
|
|
|
33
34
|
state: State = {};
|
|
34
35
|
|
|
35
36
|
handleAbort = (): void => {
|
|
36
|
-
const { resetCreator, staged } = this.props;
|
|
37
|
+
const { hasStagedItem, resetCreator, staged } = this.props;
|
|
37
38
|
|
|
38
|
-
// Click-away
|
|
39
|
-
if (staged) {
|
|
39
|
+
// Click-away must not discard any in-progress comment/annotation
|
|
40
|
+
if (staged || hasStagedItem) {
|
|
40
41
|
return;
|
|
41
42
|
}
|
|
42
43
|
|
|
@@ -56,7 +57,10 @@ export default class RegionCreation extends React.PureComponent<Props, State> {
|
|
|
56
57
|
|
|
57
58
|
handleStop = (shape: Rect): void => {
|
|
58
59
|
const { location, setStaged, setStatus, targetType, referenceEl } = this.props;
|
|
59
|
-
const annotationLocation =
|
|
60
|
+
const annotationLocation =
|
|
61
|
+
targetType !== TARGET_TYPE.FRAME
|
|
62
|
+
? location
|
|
63
|
+
: getVideoCurrentTimeInMilliseconds(referenceEl as HTMLVideoElement);
|
|
60
64
|
|
|
61
65
|
setStaged({ location: annotationLocation, shape });
|
|
62
66
|
setStatus(CreatorStatus.staged);
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
CreatorItemRegion,
|
|
5
5
|
CreatorStatus,
|
|
6
6
|
getAnnotationMode,
|
|
7
|
+
getCreatorStaged,
|
|
7
8
|
getCreatorStagedForLocation,
|
|
8
9
|
getCreatorStatus,
|
|
9
10
|
getRotation,
|
|
@@ -18,6 +19,7 @@ import RegionCreation from './RegionCreation';
|
|
|
18
19
|
import withProviders from '../common/withProviders';
|
|
19
20
|
|
|
20
21
|
export type Props = {
|
|
22
|
+
hasStagedItem: boolean;
|
|
21
23
|
isCreating: boolean;
|
|
22
24
|
rotation: number;
|
|
23
25
|
staged: CreatorItemRegion | null;
|
|
@@ -27,6 +29,7 @@ export const mapStateToProps = (state: AppState, { location }: { location: numbe
|
|
|
27
29
|
const staged = getCreatorStagedForLocation(state, location);
|
|
28
30
|
|
|
29
31
|
return {
|
|
32
|
+
hasStagedItem: Boolean(getCreatorStaged(state)),
|
|
30
33
|
isCreating: getAnnotationMode(state) === Mode.REGION && getCreatorStatus(state) !== CreatorStatus.pending,
|
|
31
34
|
rotation: getRotation(state),
|
|
32
35
|
staged: isCreatorStagedRegion(staged) ? staged : null,
|
|
@@ -14,6 +14,13 @@ export default class RegionManager extends BaseManager {
|
|
|
14
14
|
this.root = ReactDOM.createRoot(this.reactEl);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
this.root.render(
|
|
17
|
+
this.root.render(
|
|
18
|
+
<RegionCreationContainer
|
|
19
|
+
targetType={this.targetType}
|
|
20
|
+
referenceEl={this.referenceEl}
|
|
21
|
+
location={this.location}
|
|
22
|
+
{...props}
|
|
23
|
+
/>,
|
|
24
|
+
);
|
|
18
25
|
}
|
|
19
26
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
$region_cursor_32: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAAA8UlEQVRYCe1Vyw6DIBBcafkPDxjb9P8/pQcTD/4HkZZpe1qeEQyHsgeTXZbZcRiUqEdXoLECQ835LxsxvMEGX7/yQmmuxtELsW6bt16dAKbwYSFS6BV4nBGQG5HCPkzAHveOM7exp4bE1g8TAOh9moLYX25xU2LzKR6InTlnXJ0ANyAfyPOqBHJMxwkUeYCDHcmTCsBMCWAR6slRJHlPAf6YZzLGODy01iSldOpCCHouC+UQcDbzAgiE4qZUaOlT51i+PHkEobewE/ABgoeM7bn4wHNqzU3YCTRXIMcn3h6Y8HcFiv6GXvBe7Ap0Bf5KgTeoYIC/a04wgAAAAABJRU5ErkJggg==';
|
|
2
2
|
$region_cursor_32_2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABlmWCKAAABWUlEQVR4Ae2YOxKDIBCGNaM5R4pYWOT+B0lhYQrPEZ1JGGcoZIy6Lj4IH40DLAt8+8srSUgQgAAEIAABCEAAAnESSM867Y9JmrGlJi1pf1li9M822dknd7/dREN8NY3IHgWIcB1oPBdZqVLsVFCAJRHK113dtbsFCtg78iZib9Nn7vTbmshenbJdsihgF8wjnZRF0ZdWdT1S+7tI+8+7nlGAS+Ss+bX7/Nx8UMAcoaPr506A2vGhAC3Brdq7J76t+oleAQDYSlqh+FW/CHk6meVSP77WiOh/gUUvp1NytpF7lGXSdd2U6aCubds+n+fuxXBgNshkWZY8q6ovQwEDNOsz3hQgHcLa26DtBwVYEsqveheQRsKsGbwIKYPmtXn02yAAvOopQGcoIMCgeR0yCvCKM0Bn0StAfReQBp2ToJQY9hCAAAQgAAEIQAACEIAABCAAAQhAwDOBLxaXQ2IYNsXoAAAAAElFTkSuQmCC';
|
|
3
3
|
$region_cursor_32_3x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAYKADAAQAAAABAAAAYAAAAACK+310AAACaUlEQVR4Ae3bwUrDQBDG8VTE+Bg9CD0IBd//IYSCh4KHPobxopuDYQgGOtNvdhvy39O2zc5uf9Odpol2HQ0BBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgXSBXfoMdzDBT2mZy9iVFo3/EB3IOI0ACdA4hqM8hkeudODLfi9Z+eflIonDDpAwxoOQgLidZOTmSpBV85YRVfmya2AHWI0GfRLQAN1OuekSZCGWfkxl/4hjB9gsNOiTgAbodsrVlKBSCr7Kwnu7+Fl/KGXkefbc3T9kBzROEQlonIDVlCDr9Ho4dMMwdH3fdx/ns30p3M8+21laGDtgSabS8ySgEvTSNKssQUtvxvt8xrUd7xrYAV4x8fEkQAzqDbe5EuS9BO0F9R7PDvCKiY8nAWJQb7hNlKClS81erIzj2QEZqo6YJMCBlXEoCchQdcQkAQ6sjENJQIaqI2b6WVDFy7y9aq6aZ03sAMenNeNQEpCh6ogZ/seCa+ewZeHteOy+y52sW9t4N+yvjXfFbm1PJcb76TSFqVmC0r8DpndVOiO+xbOvRfvqeNF1RMdVTcD4SVM0i67aAYp1RWJULUGRBf43JuOmvJ2nZgniS9jKN+iTgAbodsr07wDVdi5nU/xpos0cfY0AJUjjGI5CAsJ0moEkQOMYjkICwnSagSRA4xiOQgLCdJqBJEDjGI5CAsJ0moEkQOMYjkICwnSagSRA4xiOQgLCdJqBJEDjGI6SfkcsvLLZQC5Hz0B4qBGgBGkciYIAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIITAK/BlNVeN572e8AAAAASUVORK5CYII=';
|
|
4
|
-
|
|
5
4
|
$region_cursor_new: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAAEEfUpiAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAIKADAAQAAAABAAAAIAAAAACPTkDJAAAFEUlEQVRYCcVXeUyjVRD/erCl5SjtrpblWHbxADlTD0TDESIak0UJUYyE/zAhGo7gP+oaMDEhIRFNiCRG4A8NmGACwYsAG0lIIBSMCBSCrRDCXbkRiq2bbvv5m9qv2+srn3UTJ5nO++bNmzdv5r2ZKcMEgp6entfAF9Gc2EMglsZOLg1OTk7Gj4+PP6KxP+Tn57O+3CfBkHsyL29sbHzqyWBmZ2eLwfDc1TnvZiwtLanBsRcWFpJ+tzVOKdePDDSqu7v7g8nJyS8wDvec5Ma0MjYrK+tx0Ac5piAqMhgMLwWTJGNZvV7PK+QUIKG5ubmbgTSJDw4OHJi4CtQA3cfkBkSlLS0tWzab7f3s7Oy60tJSLXhuz5FzbAqF4g48OpCamsrrrCgIqvf39xdAJcCAQNtxWwcUCMYU9/b2vpqXl0cueTkURWLXhaQzsAUFBez8/HxJMEXu2+Jr1vb2NtPR0aELDw9/D+PbbW1t5F4/8FMgk8n+hFRGQkKCIikpyYqbpRoaGkpUqVSjeAifYM5vjZ9WF+NKc3PzQUNDwzP4jgBeHx0dvQVK11YQKPr6+t5dX1//rbW19XWEbnl8fHzh8PBwGqsFK/HciR6lCij4CJ6LBY//0yWiXS45HA4LUcFb+ghGTE9Ps6enp1ahSgI6RKlUhp+dnf0hRElABWRVdHS0XIgSXgVClQRUkJKSwqysrMwik+n29vZ+Pjo6+hIKA8rSRp4QgYfD9vf3t4F5HUhVgfIUXSDeBII5NyhGRkbewZemvLxcqdPppjs7Ow2Ey8vLP4Hvd4V9Mw/tEga8u7u7+9XOzk764OBgm91uFyOd1+Non2VmZn6OecoXQUG6ubn5rdFopNwXA1ROTEw0g8YBvTblcwxrsViOV1dXHXDi26DFcrn8xbW1tVookAIvBFKchMVGPN9FPOVfhoeHF0CNjY2NKZjzsoJPG/mCStgDwKsIpUGtVqdj7FVr8S0IyCIKZcCiKUjD/yFEfpKYTKYncPwXMCbn8wUtZPuCKSQDZDMzMwkoyLeRYswodlSjKFcJCqIQq4IZQOtF2FiGwsBQiqqtrf0O36f305CLDPA6BB6T05C6urrvKdXdD0P+lQGcNSiPznxbX1/vNATtA3VdIYVG0KvmNiaKboEpKipys2CEHM3rD8hXFjSz5chZP2LyLvDCfOVWwjMg70RQs0R1LiMjg0WCdAwMDFAyfA6YB3zWhU+DZgOvASOBglI35C7Oa2KxmM3JyXE0NTV9HBsb+zXW/A40azQaBoaVREZGpotEIimqOUOyEonESn8mkpOTpyBnB1LvywvBnhPNUVypr6IM9heQWgYGSfktZPpKtMPX0EKapNJ7kTSbzezY2Nhj1dXVS0jibxYXF89hCRkSUkjICEIKB1FyrXpra+sbavxQchcrKyspST0CvAF8VKvVFiBUehSBhaqqKgoL5W7ey37PdEgFAM5qjjqNYFmWKAPXs/Hx8dS+mIB3gNKampoYq9XqQF8siYmJof6IQsCtx9AbnIq8WUG/yANR7e3tz5eUlHzY1dX1EGJuKysr+zUuLm4ROSoLueESPKQKCwuz486c5ebm2s7Pz2+lpaWNYW3IoeCsIoOpTFKVfxj4VGJiYj6oFphGFPX2jampKf0ioKKi4hUX/zIorfM7sB8DQkKA1nH3gsaciymkSpz8Ck7tAB7i+wxoc8lwcvj8B0I1gFvvS0kfZxzNcfH325hb+Dfx/eE8ndH+AwAAAABJRU5ErkJggg==';
|
|
6
5
|
$region_cursor_new_2x: 'data:image/png;base64,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';
|
|
7
6
|
$region_cursor_new_3x: 'data:image/png;base64,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';
|
|
@@ -10,8 +9,15 @@ $region_cursor_new_3x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCA
|
|
|
10
9
|
$offset_x: 9;
|
|
11
10
|
$offset_y: 4;
|
|
12
11
|
|
|
13
|
-
cursor:
|
|
14
|
-
|
|
12
|
+
cursor:
|
|
13
|
+
url($region_cursor_new) $offset_x $offset_y,
|
|
14
|
+
auto; /* Legacy */
|
|
15
|
+
|
|
16
|
+
/* stylelint-disable unit-no-unknown */
|
|
17
|
+
cursor:
|
|
18
|
+
image-set(url($region_cursor_new) 1x, url($region_cursor_new_2x) 2x, url($region_cursor_new_3x) 3x) $offset_x $offset_y,
|
|
19
|
+
auto; /* Webkit */
|
|
20
|
+
/* stylelint-enable unit-no-unknown */
|
|
15
21
|
}
|
|
16
22
|
|
|
17
23
|
.ba-RegionCreator-rect {
|
|
@@ -14,6 +14,13 @@ export default class RegionListManager extends BaseManager {
|
|
|
14
14
|
this.root = ReactDOM.createRoot(this.reactEl);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
this.root.render(
|
|
17
|
+
this.root.render(
|
|
18
|
+
<RegionAnnotationsContainer
|
|
19
|
+
location={this.location}
|
|
20
|
+
referenceEl={this.referenceEl}
|
|
21
|
+
targetType={this.targetType}
|
|
22
|
+
{...props}
|
|
23
|
+
/>,
|
|
24
|
+
);
|
|
18
25
|
}
|
|
19
26
|
}
|