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.
Files changed (104) hide show
  1. package/dist/annotations.css +1 -1
  2. package/dist/annotations.js +1 -1
  3. package/dist/annotations.js.LICENSE.txt +0 -9
  4. package/i18n/bn-IN.js +24 -17
  5. package/i18n/da-DK.js +24 -17
  6. package/i18n/de-DE.js +24 -17
  7. package/i18n/en-AU.js +4 -17
  8. package/i18n/en-CA.js +2 -18
  9. package/i18n/en-GB.js +4 -17
  10. package/i18n/en-US.js +4 -24
  11. package/i18n/en-x-pseudo.js +6 -0
  12. package/i18n/es-419.js +24 -17
  13. package/i18n/es-ES.js +24 -17
  14. package/i18n/fi-FI.js +24 -17
  15. package/i18n/fr-CA.js +24 -17
  16. package/i18n/fr-FR.js +24 -17
  17. package/i18n/hi-IN.js +24 -17
  18. package/i18n/it-IT.js +24 -17
  19. package/i18n/ja-JP.js +2 -18
  20. package/i18n/ko-KR.js +24 -17
  21. package/i18n/nb-NO.js +24 -17
  22. package/i18n/nl-NL.js +24 -17
  23. package/i18n/pl-PL.js +24 -17
  24. package/i18n/pt-BR.js +24 -17
  25. package/i18n/ru-RU.js +24 -17
  26. package/i18n/sv-SE.js +24 -17
  27. package/i18n/tr-TR.js +24 -17
  28. package/i18n/zh-CN.js +24 -17
  29. package/i18n/zh-TW.js +24 -17
  30. package/package.json +29 -28
  31. package/src/BoxAnnotations.ts +1 -1
  32. package/src/adapters/threadedAnnotationsAdapters.ts +10 -2
  33. package/src/boundingBoxHighlight/BoundingBoxHighlightContainer.tsx +4 -1
  34. package/src/common/BaseAnnotator.scss +1 -1
  35. package/src/common/BaseAnnotator.ts +9 -0
  36. package/src/common/DeselectListener.tsx +1 -1
  37. package/src/common/EventEmitter.ts +11 -3
  38. package/src/components/BoundingBoxHighlight/BoundingBoxHighlightNav.scss +3 -3
  39. package/src/components/BoundingBoxHighlight/BoundingBoxHighlightRect.scss +11 -6
  40. package/src/components/Popups/PopupBase.scss +2 -2
  41. package/src/components/Popups/PopupDrawingToolbar.scss +4 -4
  42. package/src/components/Popups/PopupList.scss +1 -1
  43. package/src/components/Popups/PopupV2.scss +2 -2
  44. package/src/components/Popups/PopupV2.tsx +62 -44
  45. package/src/components/ReplyForm/ReplyForm.tsx +1 -8
  46. package/src/constants.ts +2 -3
  47. package/src/document/DocumentAnnotator.ts +54 -14
  48. package/src/document/docUtil.ts +12 -2
  49. package/src/drawing/DrawingAnnotations.tsx +24 -24
  50. package/src/drawing/DrawingCursor.ts +2 -1
  51. package/src/drawing/DrawingManager.tsx +9 -1
  52. package/src/highlight/HighlightAnnotations.tsx +23 -22
  53. package/src/highlight/HighlightCreator.scss +9 -2
  54. package/src/media/MediaAnnotator.ts +38 -16
  55. package/src/popup/PopupLayer.tsx +1 -0
  56. package/src/region/RegionAnnotations.tsx +2 -3
  57. package/src/region/RegionCreation.tsx +8 -4
  58. package/src/region/RegionCreationContainer.tsx +3 -0
  59. package/src/region/RegionCreationManager.tsx +8 -1
  60. package/src/region/RegionCreator.scss +9 -3
  61. package/src/region/RegionManager.tsx +8 -1
  62. package/src/region/RegionRect.scss +17 -9
  63. package/src/store/annotations/actions.ts +88 -104
  64. package/src/store/annotations/reducer.ts +6 -4
  65. package/src/store/creator/selectors.ts +6 -6
  66. package/src/store/eventing/create.ts +4 -2
  67. package/src/store/eventing/delete.ts +4 -5
  68. package/src/store/eventing/middleware.ts +13 -11
  69. package/src/store/eventing/replyCreate.ts +6 -10
  70. package/src/store/eventing/replyDelete.ts +5 -9
  71. package/src/store/eventing/replyUpdate.ts +6 -10
  72. package/src/store/eventing/update.ts +5 -6
  73. package/src/store/highlight/actions.ts +43 -41
  74. package/src/test-utils/videoAnnotations.tsx +11 -11
  75. package/src/utils/useVideoTiming.ts +9 -13
  76. package/i18n/bn-IN.properties +0 -32
  77. package/i18n/da-DK.properties +0 -32
  78. package/i18n/de-DE.properties +0 -32
  79. package/i18n/en-AU.properties +0 -32
  80. package/i18n/en-CA.properties +0 -32
  81. package/i18n/en-GB.properties +0 -32
  82. package/i18n/en-US.properties +0 -44
  83. package/i18n/en-x-pseudo.properties +0 -32
  84. package/i18n/es-419.properties +0 -32
  85. package/i18n/es-ES.properties +0 -32
  86. package/i18n/fi-FI.properties +0 -32
  87. package/i18n/fr-CA.properties +0 -32
  88. package/i18n/fr-FR.properties +0 -32
  89. package/i18n/hi-IN.properties +0 -32
  90. package/i18n/it-IT.properties +0 -32
  91. package/i18n/ja-JP.properties +0 -32
  92. package/i18n/json/src/components/BoundingBoxHighlight/messages.json +0 -1
  93. package/i18n/json/src/components/Popups/messages.json +0 -1
  94. package/i18n/json/src/messages.json +0 -1
  95. package/i18n/ko-KR.properties +0 -32
  96. package/i18n/nb-NO.properties +0 -32
  97. package/i18n/nl-NL.properties +0 -32
  98. package/i18n/pl-PL.properties +0 -32
  99. package/i18n/pt-BR.properties +0 -32
  100. package/i18n/ru-RU.properties +0 -32
  101. package/i18n/sv-SE.properties +0 -32
  102. package/i18n/tr-TR.properties +0 -32
  103. package/i18n/zh-CN.properties +0 -32
  104. 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
- this.highlightListener = new HighlightListener({ getSelection, store: this.store });
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(new BoundingBoxHighlightManager({ location: pageNumber, referenceEl: pageReferenceEl, resinTags }));
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(new PopupManager({ location: pageNumber, popupPortalEl: this.popupPortalEl, referenceEl: pageReferenceEl, resinTags }));
106
- managers.add(new DrawingManager({ location: pageNumber, popupPortalEl: this.popupPortalEl, referenceEl: pageReferenceEl, resinTags }));
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 RegionCreationManager({
153
+ new HighlightManager({
128
154
  location: pageNumber,
129
- referenceEl: canvasLayerEl || pageReferenceEl,
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({
@@ -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 { containerEl: containerEl as HTMLElement, containerRect: containerEl.getBoundingClientRect(), hasError, location, range };
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 && hasPathGroups && drawingSVGGroup && canShowPopupToolbar && (() => {
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
- })()}
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 = 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'>
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(<DrawingAnnotationsContainer referenceEl={this.referenceEl} targetType={this.targetType} location={this.location} popupPortalEl={this.popupPortalEl} {...props} />);
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 && selection && !selection.hasError && (() => {
130
- const popupShape = selection.popupRect || getBoundingRect(selection.rects);
131
- const popup = (
132
- <div className="ba-HighlightAnnotations-popup">
133
- <PopupHighlight
134
- onCancel={handleCancel}
135
- onSubmit={handlePromote}
136
- shape={popupShape}
137
- />
138
- </div>
139
- );
140
- return rotation && popupPortalEl ? ReactDOM.createPortal(popup, popupPortalEl) : popup;
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 && selection.hasError && (() => {
145
- const popupShape = selection.popupRect || getBoundingRect(selection.rects);
146
- const popup = (
147
- <div className="ba-HighlightAnnotations-popup">
148
- <PopupHighlightError onCancel={handleCancel} shape={popupShape} />
149
- </div>
150
- );
151
- return rotation && popupPortalEl ? ReactDOM.createPortal(popup, popupPortalEl) : popup;
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: url($text_cursor_32) $offset_x $offset_y, text; /* Legacy */
11
- cursor: image-set(url($text_cursor_32) 1x, url($text_cursor_32_2x) 2x, url($text_cursor_32_3x) 3x) $offset_x $offset_y, text; /* Webkit */ /* stylelint-disable-line */
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
- addManagers(referenceEl: HTMLVideoElement, resinTags: { fileid: string|null; iscurrent: boolean }): void {
49
- this.managers.add(new PopupManager({ location: MEDIA_LOCATION_INDEX, popupPortalEl: this.popupPortalEl, referenceEl, resinTags, targetType: TARGET_TYPE.FRAME }));
50
- this.managers.add(new DrawingManager({ location: MEDIA_LOCATION_INDEX, referenceEl, resinTags, targetType: TARGET_TYPE.FRAME }));
51
- this.managers.add(new RegionManager({ location: MEDIA_LOCATION_INDEX, referenceEl, resinTags, targetType: TARGET_TYPE.FRAME }));
52
- this.managers.add(new RegionCreationManager({ location: MEDIA_LOCATION_INDEX, referenceEl, resinTags, targetType: TARGET_TYPE.FRAME }));
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 ): void {
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 ( !video || !this.annotatedEl || annotationLocation === -1 ) {
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
-
@@ -141,6 +141,7 @@ const PopupLayer = (props: Props): JSX.Element | null => {
141
141
  return (
142
142
  <div className="ba-PopupLayer-popup">
143
143
  <PopupV2
144
+ onCancel={handleCancel}
144
145
  onSubmit={handleSubmit}
145
146
  popupPortalEl={popupPortalEl}
146
147
  reference={reference}
@@ -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 (a click too small to start a new region) must not discard an in-progress comment/annotation
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 = targetType !== TARGET_TYPE.FRAME ? location : getVideoCurrentTimeInMilliseconds(referenceEl as HTMLVideoElement);
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(<RegionCreationContainer targetType={this.targetType} referenceEl={this.referenceEl} location={this.location} {...props} />);
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: url($region_cursor_new) $offset_x $offset_y, auto; /* Legacy */
14
- cursor: image-set(url($region_cursor_new) 1x, url($region_cursor_new_2x) 2x, url($region_cursor_new_3x) 3x) $offset_x $offset_y, auto; /* Webkit */ /* stylelint-disable-line */
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(<RegionAnnotationsContainer location={this.location} referenceEl={this.referenceEl} targetType={this.targetType} {...props} />);
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
  }