box-annotations 5.3.0 → 5.3.1-beta.0
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 +6 -0
- package/i18n/bn-IN.properties +12 -0
- package/i18n/da-DK.js +6 -0
- package/i18n/da-DK.properties +12 -0
- package/i18n/de-DE.js +6 -0
- package/i18n/de-DE.properties +12 -0
- package/i18n/en-AU.js +6 -0
- package/i18n/en-AU.properties +12 -0
- package/i18n/en-CA.js +6 -0
- package/i18n/en-CA.properties +12 -0
- package/i18n/en-GB.js +6 -0
- package/i18n/en-GB.properties +12 -0
- package/i18n/es-419.js +6 -0
- package/i18n/es-419.properties +12 -0
- package/i18n/es-ES.js +6 -0
- package/i18n/es-ES.properties +12 -0
- package/i18n/fi-FI.js +6 -0
- package/i18n/fi-FI.properties +12 -0
- package/i18n/fr-CA.js +6 -0
- package/i18n/fr-CA.properties +12 -0
- package/i18n/fr-FR.js +6 -0
- package/i18n/fr-FR.properties +12 -0
- package/i18n/hi-IN.js +6 -0
- package/i18n/hi-IN.properties +12 -0
- package/i18n/it-IT.js +6 -0
- package/i18n/it-IT.properties +12 -0
- package/i18n/ja-JP.js +7 -1
- package/i18n/ja-JP.properties +13 -1
- package/i18n/ko-KR.js +6 -0
- package/i18n/ko-KR.properties +12 -0
- package/i18n/nb-NO.js +6 -0
- package/i18n/nb-NO.properties +12 -0
- package/i18n/nl-NL.js +6 -0
- package/i18n/nl-NL.properties +12 -0
- package/i18n/pl-PL.js +6 -0
- package/i18n/pl-PL.properties +12 -0
- package/i18n/pt-BR.js +6 -0
- package/i18n/pt-BR.properties +12 -0
- package/i18n/ru-RU.js +6 -0
- package/i18n/ru-RU.properties +12 -0
- package/i18n/sv-SE.js +6 -0
- package/i18n/sv-SE.properties +12 -0
- package/i18n/tr-TR.js +6 -0
- package/i18n/tr-TR.properties +12 -0
- package/i18n/zh-CN.js +6 -0
- package/i18n/zh-CN.properties +12 -0
- package/i18n/zh-TW.js +6 -0
- package/i18n/zh-TW.properties +12 -0
- package/package.json +23 -22
- 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/DeselectListener.tsx +1 -1
- 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 +30 -43
- package/src/components/ReplyForm/ReplyForm.tsx +1 -8
- package/src/constants.ts +2 -3
- package/src/document/DocumentAnnotator.ts +28 -5
- package/src/document/docUtil.ts +7 -1
- 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 -5
- package/src/region/RegionAnnotations.tsx +2 -3
- package/src/region/RegionCreation.tsx +4 -1
- 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 +86 -104
- package/src/store/annotations/reducer.ts +4 -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
|
@@ -142,10 +142,7 @@ const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): J
|
|
|
142
142
|
const capturedToken = token;
|
|
143
143
|
const url = await fetchAvatarBlob(capturedApiHost, capturedToken, fileId, userId);
|
|
144
144
|
if (!url) return null;
|
|
145
|
-
if (
|
|
146
|
-
credentialsRef.current.apiHost !== capturedApiHost ||
|
|
147
|
-
credentialsRef.current.token !== capturedToken
|
|
148
|
-
) {
|
|
145
|
+
if (credentialsRef.current.apiHost !== capturedApiHost || credentialsRef.current.token !== capturedToken) {
|
|
149
146
|
URL.revokeObjectURL(url);
|
|
150
147
|
return null;
|
|
151
148
|
}
|
|
@@ -225,11 +222,9 @@ const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): J
|
|
|
225
222
|
|
|
226
223
|
const isResolved = annotation?.status === 'resolved';
|
|
227
224
|
const resolvedBy = isResolved
|
|
228
|
-
? annotation?.resolution?.resolved_by?.name ?? annotation?.modified_by?.name
|
|
229
|
-
: undefined;
|
|
230
|
-
const resolvedAtSource = isResolved
|
|
231
|
-
? annotation?.resolution?.resolved_at ?? annotation?.modified_at
|
|
225
|
+
? (annotation?.resolution?.resolved_by?.name ?? annotation?.modified_by?.name)
|
|
232
226
|
: undefined;
|
|
227
|
+
const resolvedAtSource = isResolved ? (annotation?.resolution?.resolved_at ?? annotation?.modified_at) : undefined;
|
|
233
228
|
const resolvedAt = resolvedAtSource ? new Date(resolvedAtSource).getTime() : undefined;
|
|
234
229
|
|
|
235
230
|
const userSelectorProps = React.useMemo(
|
|
@@ -288,14 +283,11 @@ const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): J
|
|
|
288
283
|
[annotationId, dispatch, isRichTextEnabled],
|
|
289
284
|
);
|
|
290
285
|
|
|
291
|
-
const handleThreadDelete = React.useCallback(
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
},
|
|
297
|
-
[annotationId, dispatch],
|
|
298
|
-
);
|
|
286
|
+
const handleThreadDelete = React.useCallback(async (): Promise<void> => {
|
|
287
|
+
if (annotationId) {
|
|
288
|
+
await dispatch(deleteAnnotationAction(annotationId));
|
|
289
|
+
}
|
|
290
|
+
}, [annotationId, dispatch]);
|
|
299
291
|
|
|
300
292
|
const handleDelete = React.useCallback(
|
|
301
293
|
async (id: string): Promise<void> => {
|
|
@@ -305,24 +297,18 @@ const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): J
|
|
|
305
297
|
[annotationId, dispatch],
|
|
306
298
|
);
|
|
307
299
|
|
|
308
|
-
const handleResolve = React.useCallback(
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
},
|
|
316
|
-
[annotationId, dispatch],
|
|
317
|
-
);
|
|
300
|
+
const handleResolve = React.useCallback(async (): Promise<void> => {
|
|
301
|
+
if (!annotationId) return;
|
|
302
|
+
const result = await dispatch(updateAnnotationAction({ annotationId, payload: { status: 'resolved' } }));
|
|
303
|
+
if (updateAnnotationAction.fulfilled.match(result)) {
|
|
304
|
+
dispatch(setActiveAnnotationIdAction(null));
|
|
305
|
+
}
|
|
306
|
+
}, [annotationId, dispatch]);
|
|
318
307
|
|
|
319
|
-
const handleUnresolve = React.useCallback(
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
},
|
|
324
|
-
[annotationId, dispatch],
|
|
325
|
-
);
|
|
308
|
+
const handleUnresolve = React.useCallback(async (): Promise<void> => {
|
|
309
|
+
if (!annotationId) return;
|
|
310
|
+
await dispatch(updateAnnotationAction({ annotationId, payload: { status: 'open' } }));
|
|
311
|
+
}, [annotationId, dispatch]);
|
|
326
312
|
|
|
327
313
|
if (!popupPortalEl) return null;
|
|
328
314
|
|
|
@@ -331,25 +317,26 @@ const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): J
|
|
|
331
317
|
<div
|
|
332
318
|
ref={popupRef}
|
|
333
319
|
aria-label={intl.formatMessage(messages.ariaLabelComment)}
|
|
334
|
-
className="ba-
|
|
320
|
+
className="ba-PopupAnnotation"
|
|
335
321
|
data-resin-component={annotationId ? 'popupThreadV2' : 'popupReplyV2'}
|
|
336
|
-
|
|
322
|
+
data-resin-feature="annotations"
|
|
337
323
|
onMouseDown={handleEvent}
|
|
338
324
|
onMouseMove={handleEvent}
|
|
339
|
-
onMouseUp={handleEvent}
|
|
340
325
|
onTouchMove={handleEvent}
|
|
341
326
|
onTouchStart={handleEvent}
|
|
342
327
|
role="presentation"
|
|
343
328
|
>
|
|
344
329
|
<BlueprintModernizationProvider enableModernizedComponents>
|
|
345
330
|
<TooltipProvider>
|
|
346
|
-
<MentionContextProvider
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
331
|
+
<MentionContextProvider
|
|
332
|
+
value={{
|
|
333
|
+
collaborationPopoverProps: {
|
|
334
|
+
onSubmit: () => Promise.resolve(),
|
|
335
|
+
},
|
|
336
|
+
// Mentions are restricted to file collaborators; the invite popover is intentionally never shown.
|
|
337
|
+
fetchCollaboratorState: async () => true,
|
|
338
|
+
}}
|
|
339
|
+
>
|
|
353
340
|
{annotationId ? (
|
|
354
341
|
<ThreadedAnnotationsV2
|
|
355
342
|
isAnnotations
|
|
@@ -70,14 +70,7 @@ const ReplyForm = (props: Props): JSX.Element => {
|
|
|
70
70
|
}, [formRef]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
71
71
|
|
|
72
72
|
return (
|
|
73
|
-
<Form
|
|
74
|
-
ref={formRef}
|
|
75
|
-
className="ba-ReplyForm"
|
|
76
|
-
data-testid="ba-ReplyForm"
|
|
77
|
-
onPointerEnterCapture={undefined}
|
|
78
|
-
onPointerLeaveCapture={undefined}
|
|
79
|
-
placeholder={undefined}
|
|
80
|
-
>
|
|
73
|
+
<Form ref={formRef} className="ba-ReplyForm" data-testid="ba-ReplyForm">
|
|
81
74
|
<div className="ba-Popup-main">
|
|
82
75
|
<ReplyField
|
|
83
76
|
className="ba-Popup-field"
|
package/src/constants.ts
CHANGED
|
@@ -9,14 +9,13 @@ export const MOUSE_PRIMARY = 1;
|
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* This is the default location index for video annotations.
|
|
12
|
-
* Documents have locations that represent a page but that doesn't apply to
|
|
12
|
+
* Documents have locations that represent a page but that doesn't apply to
|
|
13
13
|
* videos as they have no pages. The annnotations managers take locations as
|
|
14
|
-
* parameters so we need to provide a default value that indicates that this is a
|
|
14
|
+
* parameters so we need to provide a default value that indicates that this is a
|
|
15
15
|
* video annotation.
|
|
16
16
|
*/
|
|
17
17
|
export const MEDIA_LOCATION_INDEX = -1;
|
|
18
18
|
|
|
19
|
-
|
|
20
19
|
export enum TARGET_TYPE {
|
|
21
20
|
FRAME = 'frame',
|
|
22
21
|
PAGE = 'page',
|
|
@@ -97,13 +97,29 @@ export default class DocumentAnnotator extends BaseAnnotator {
|
|
|
97
97
|
// Lazily instantiate managers as pages are added or re-rendered
|
|
98
98
|
if (managers.size === 0) {
|
|
99
99
|
if (viewMode === 'boundingBoxes') {
|
|
100
|
-
managers.add(
|
|
100
|
+
managers.add(
|
|
101
|
+
new BoundingBoxHighlightManager({ location: pageNumber, referenceEl: pageReferenceEl, resinTags }),
|
|
102
|
+
);
|
|
101
103
|
return managers;
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
// Annotations mode
|
|
105
|
-
managers.add(
|
|
106
|
-
|
|
107
|
+
managers.add(
|
|
108
|
+
new PopupManager({
|
|
109
|
+
location: pageNumber,
|
|
110
|
+
popupPortalEl: this.popupPortalEl,
|
|
111
|
+
referenceEl: pageReferenceEl,
|
|
112
|
+
resinTags,
|
|
113
|
+
}),
|
|
114
|
+
);
|
|
115
|
+
managers.add(
|
|
116
|
+
new DrawingManager({
|
|
117
|
+
location: pageNumber,
|
|
118
|
+
popupPortalEl: this.popupPortalEl,
|
|
119
|
+
referenceEl: pageReferenceEl,
|
|
120
|
+
resinTags,
|
|
121
|
+
}),
|
|
122
|
+
);
|
|
107
123
|
|
|
108
124
|
const textLayer = pageEl.querySelector('.textLayer') as HTMLElement;
|
|
109
125
|
|
|
@@ -118,7 +134,14 @@ export default class DocumentAnnotator extends BaseAnnotator {
|
|
|
118
134
|
);
|
|
119
135
|
}
|
|
120
136
|
|
|
121
|
-
managers.add(
|
|
137
|
+
managers.add(
|
|
138
|
+
new HighlightManager({
|
|
139
|
+
location: pageNumber,
|
|
140
|
+
popupPortalEl: this.popupPortalEl,
|
|
141
|
+
referenceEl: pageReferenceEl,
|
|
142
|
+
resinTags,
|
|
143
|
+
}),
|
|
144
|
+
);
|
|
122
145
|
managers.add(new RegionManager({ location: pageNumber, referenceEl: pageReferenceEl, resinTags }));
|
|
123
146
|
|
|
124
147
|
const canvasLayerEl = pageEl.querySelector<HTMLElement>('.canvasWrapper');
|
|
@@ -220,7 +243,7 @@ export default class DocumentAnnotator extends BaseAnnotator {
|
|
|
220
243
|
width: `${origWidth}px`,
|
|
221
244
|
});
|
|
222
245
|
} else {
|
|
223
|
-
manager.style({height: '', left: '', top: '', transform: '', width: ''});
|
|
246
|
+
manager.style({ height: '', left: '', top: '', transform: '', width: '' });
|
|
224
247
|
}
|
|
225
248
|
|
|
226
249
|
manager.render({
|
package/src/document/docUtil.ts
CHANGED
|
@@ -62,5 +62,11 @@ export function getSelection(): Selection | null {
|
|
|
62
62
|
location = getPageNumber(selection.focusNode as Element) ?? endPage;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
return {
|
|
65
|
+
return {
|
|
66
|
+
containerEl: containerEl as HTMLElement,
|
|
67
|
+
containerRect: containerEl.getBoundingClientRect(),
|
|
68
|
+
hasError,
|
|
69
|
+
location,
|
|
70
|
+
range,
|
|
71
|
+
};
|
|
66
72
|
}
|
|
@@ -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
|
@@ -140,11 +140,7 @@ const PopupLayer = (props: Props): JSX.Element | null => {
|
|
|
140
140
|
if (showCreator && isThreadedAnnotation) {
|
|
141
141
|
return (
|
|
142
142
|
<div className="ba-PopupLayer-popup">
|
|
143
|
-
<PopupV2
|
|
144
|
-
onSubmit={handleSubmit}
|
|
145
|
-
popupPortalEl={popupPortalEl}
|
|
146
|
-
reference={reference}
|
|
147
|
-
/>
|
|
143
|
+
<PopupV2 onSubmit={handleSubmit} popupPortalEl={popupPortalEl} reference={reference} />
|
|
148
144
|
</div>
|
|
149
145
|
);
|
|
150
146
|
}
|
|
@@ -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
|
|
@@ -56,7 +56,10 @@ export default class RegionCreation extends React.PureComponent<Props, State> {
|
|
|
56
56
|
|
|
57
57
|
handleStop = (shape: Rect): void => {
|
|
58
58
|
const { location, setStaged, setStatus, targetType, referenceEl } = this.props;
|
|
59
|
-
const annotationLocation =
|
|
59
|
+
const annotationLocation =
|
|
60
|
+
targetType !== TARGET_TYPE.FRAME
|
|
61
|
+
? location
|
|
62
|
+
: getVideoCurrentTimeInMilliseconds(referenceEl as HTMLVideoElement);
|
|
60
63
|
|
|
61
64
|
setStaged({ location: annotationLocation, shape });
|
|
62
65
|
setStatus(CreatorStatus.staged);
|
|
@@ -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
|
}
|