box-annotations 5.3.1-beta.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.js +1 -1
- package/i18n/bn-IN.js +24 -23
- package/i18n/da-DK.js +24 -23
- package/i18n/de-DE.js +24 -23
- package/i18n/en-AU.js +4 -23
- package/i18n/en-CA.js +2 -24
- package/i18n/en-GB.js +4 -23
- package/i18n/en-US.js +4 -24
- package/i18n/en-x-pseudo.js +6 -0
- package/i18n/es-419.js +24 -23
- package/i18n/es-ES.js +24 -23
- package/i18n/fi-FI.js +24 -23
- package/i18n/fr-CA.js +24 -23
- package/i18n/fr-FR.js +24 -23
- package/i18n/hi-IN.js +24 -23
- package/i18n/it-IT.js +24 -23
- package/i18n/ja-JP.js +2 -24
- package/i18n/ko-KR.js +24 -23
- package/i18n/nb-NO.js +24 -23
- package/i18n/nl-NL.js +24 -23
- package/i18n/pl-PL.js +24 -23
- package/i18n/pt-BR.js +24 -23
- package/i18n/ru-RU.js +24 -23
- package/i18n/sv-SE.js +24 -23
- package/i18n/tr-TR.js +24 -23
- package/i18n/zh-CN.js +24 -23
- package/i18n/zh-TW.js +24 -23
- package/package.json +7 -7
- package/src/common/BaseAnnotator.ts +9 -0
- package/src/common/EventEmitter.ts +11 -3
- package/src/components/Popups/PopupV2.tsx +32 -1
- package/src/document/DocumentAnnotator.ts +28 -11
- package/src/document/docUtil.ts +5 -1
- package/src/popup/PopupLayer.tsx +6 -1
- package/src/region/RegionCreation.tsx +4 -3
- package/src/region/RegionCreationContainer.tsx +3 -0
- package/src/store/annotations/actions.ts +2 -0
- package/src/store/annotations/reducer.ts +2 -0
- package/i18n/bn-IN.properties +0 -44
- package/i18n/da-DK.properties +0 -44
- package/i18n/de-DE.properties +0 -44
- package/i18n/en-AU.properties +0 -44
- package/i18n/en-CA.properties +0 -44
- package/i18n/en-GB.properties +0 -44
- package/i18n/en-US.properties +0 -44
- package/i18n/en-x-pseudo.properties +0 -32
- package/i18n/es-419.properties +0 -44
- package/i18n/es-ES.properties +0 -44
- package/i18n/fi-FI.properties +0 -44
- package/i18n/fr-CA.properties +0 -44
- package/i18n/fr-FR.properties +0 -44
- package/i18n/hi-IN.properties +0 -44
- package/i18n/it-IT.properties +0 -44
- package/i18n/ja-JP.properties +0 -44
- 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 -44
- package/i18n/nb-NO.properties +0 -44
- package/i18n/nl-NL.properties +0 -44
- package/i18n/pl-PL.properties +0 -44
- package/i18n/pt-BR.properties +0 -44
- package/i18n/ru-RU.properties +0 -44
- package/i18n/sv-SE.properties +0 -44
- package/i18n/tr-TR.properties +0 -44
- package/i18n/zh-CN.properties +0 -44
- package/i18n/zh-TW.properties +0 -44
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "box-annotations",
|
|
3
|
-
"version": "5.3.1-beta.
|
|
3
|
+
"version": "5.3.1-beta.1",
|
|
4
4
|
"description": "Box Annotations",
|
|
5
5
|
"author": "Box (https://www.box.com/)",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -40,12 +40,13 @@
|
|
|
40
40
|
"@box/item-icon": "^3.2.0",
|
|
41
41
|
"@box/languages": "^1.1.0",
|
|
42
42
|
"@box/readable-time": "^2.1.32",
|
|
43
|
-
"@box/threaded-annotations": "^4.11.
|
|
43
|
+
"@box/threaded-annotations": "^4.11.14",
|
|
44
44
|
"@box/types": "^2.1.8",
|
|
45
45
|
"@box/user-selector": "^2.1.35",
|
|
46
46
|
"@cfaester/enzyme-adapter-react-18": "^0.8.0",
|
|
47
47
|
"@commitlint/cli": "^19.8.0",
|
|
48
48
|
"@commitlint/config-conventional": "^19.8.0",
|
|
49
|
+
"@formatjs/cli": "^6.16.26",
|
|
49
50
|
"@formatjs/intl-pluralrules": "^1.5.5",
|
|
50
51
|
"@formatjs/intl-relativetimeformat": "^4.5.12",
|
|
51
52
|
"@popperjs/core": "^2.4.0",
|
|
@@ -69,7 +70,6 @@
|
|
|
69
70
|
"babel-jest": "^29.7.0",
|
|
70
71
|
"babel-loader": "^9.2.1",
|
|
71
72
|
"babel-plugin-istanbul": "^6.0.0",
|
|
72
|
-
"babel-plugin-react-intl": "^7.5.1",
|
|
73
73
|
"babel-plugin-transform-require-ignore": "^0.1.1",
|
|
74
74
|
"box-ui-elements": "^20.0.0",
|
|
75
75
|
"circular-dependency-plugin": "^5.2.0",
|
|
@@ -142,17 +142,17 @@
|
|
|
142
142
|
"@box/combobox-with-api": "^1.42.22",
|
|
143
143
|
"@box/item-icon": "^3.2.0",
|
|
144
144
|
"@box/readable-time": "^2.1.32",
|
|
145
|
-
"@box/threaded-annotations": "^4.11.
|
|
145
|
+
"@box/threaded-annotations": "^4.11.14",
|
|
146
146
|
"@box/types": "^2.1.8",
|
|
147
147
|
"@box/user-selector": "^2.1.35",
|
|
148
148
|
"axios": "^0.33.0"
|
|
149
149
|
},
|
|
150
150
|
"scripts": {
|
|
151
151
|
"build": "yarn setup && yarn build:prod:dist",
|
|
152
|
-
"build:i18n": "props2es",
|
|
153
152
|
"build:dev:dist": "LANGUAGE=en-US BABEL_ENV=dev NODE_ENV=dev webpack --config scripts/webpack.config.js --mode development --progress",
|
|
154
153
|
"build:prod:dist": "LANGUAGE=en-US BABEL_ENV=production NODE_ENV=production webpack --config scripts/webpack.config.js --mode production",
|
|
155
|
-
"clean": "rm -rf dist reports/* i18n/json
|
|
154
|
+
"clean": "rm -rf dist reports/* i18n/json",
|
|
155
|
+
"extract:i18n": "mkdir -p i18n/json && formatjs extract 'src/**/*.{js,ts,tsx}' --ignore='src/**/__tests__/**' --ignore='src/**/__mocks__/**' --out-file i18n/json/en-US.json",
|
|
156
156
|
"cy:open": "yarn cy:wait; yarn cypress open",
|
|
157
157
|
"cy:run": "yarn cy:wait; yarn cypress run --spec test/integration/**/*.test.js",
|
|
158
158
|
"cy:wait": "wait-on http-get://127.0.0.1:8001",
|
|
@@ -166,7 +166,7 @@
|
|
|
166
166
|
"release:minor": "scripts/release.sh -n",
|
|
167
167
|
"release:patch": "scripts/release.sh -p",
|
|
168
168
|
"release:pre": "scripts/release.sh -x",
|
|
169
|
-
"setup": "yarn install && yarn clean
|
|
169
|
+
"setup": "yarn install && yarn clean",
|
|
170
170
|
"start": "yarn setup && yarn build:dev:dist --watch",
|
|
171
171
|
"start:dev": "yarn setup && LANGUAGE=en-US BABEL_ENV=dev NODE_ENV=dev yarn webpack-dev-server --config scripts/webpack.config.js --mode development",
|
|
172
172
|
"start:linked": "IS_LINKED=1 yarn start",
|
|
@@ -45,6 +45,8 @@ export type Options = {
|
|
|
45
45
|
intl: IntlOptions;
|
|
46
46
|
locale?: string;
|
|
47
47
|
onCopyLink?: (params: { annotationId: string; fileVersionId: string }) => void;
|
|
48
|
+
// When false, skip annotation create. Existing annotations still render.
|
|
49
|
+
showAnnotationsControls?: boolean;
|
|
48
50
|
token: Token;
|
|
49
51
|
};
|
|
50
52
|
|
|
@@ -339,6 +341,13 @@ export default class BaseAnnotator extends EventEmitter {
|
|
|
339
341
|
};
|
|
340
342
|
|
|
341
343
|
protected handleSetActive = (annotationId: string | null): void => {
|
|
344
|
+
const state = this.store.getState();
|
|
345
|
+
|
|
346
|
+
// Ignore ids this pane does not own. Clear locally so the host is not told to deselect.
|
|
347
|
+
if (annotationId && state?.annotations?.isInitialized && !store.getAnnotation(state, annotationId)) {
|
|
348
|
+
this.store.dispatch(store.clearActiveAnnotationIdAction());
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
342
351
|
this.setActiveId(annotationId);
|
|
343
352
|
};
|
|
344
353
|
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import eventManager from './EventManager';
|
|
2
2
|
|
|
3
|
+
type Listener = (...args: any[]) => void;
|
|
4
|
+
|
|
3
5
|
export default class EventEmitter {
|
|
4
|
-
|
|
6
|
+
private ownListeners: Array<{ event: string | symbol; listener: Listener }> = [];
|
|
7
|
+
|
|
8
|
+
addListener(event: string | symbol, listener: Listener): void {
|
|
9
|
+
this.ownListeners.push({ event, listener });
|
|
5
10
|
eventManager.addListener(event, listener);
|
|
6
11
|
}
|
|
7
12
|
|
|
@@ -10,10 +15,13 @@ export default class EventEmitter {
|
|
|
10
15
|
}
|
|
11
16
|
|
|
12
17
|
removeAllListeners(): void {
|
|
13
|
-
eventManager.
|
|
18
|
+
// Shared eventManager: remove only this instance's listeners.
|
|
19
|
+
this.ownListeners.forEach(({ event, listener }) => eventManager.removeListener(event, listener));
|
|
20
|
+
this.ownListeners = [];
|
|
14
21
|
}
|
|
15
22
|
|
|
16
|
-
removeListener(event: string | symbol, listener:
|
|
23
|
+
removeListener(event: string | symbol, listener: Listener): void {
|
|
24
|
+
this.ownListeners = this.ownListeners.filter(own => !(own.event === event && own.listener === listener));
|
|
17
25
|
eventManager.removeListener(event, listener);
|
|
18
26
|
}
|
|
19
27
|
}
|
|
@@ -19,6 +19,7 @@ import FocusTrap from 'box-ui-elements/es/components/focus-trap/FocusTrap';
|
|
|
19
19
|
|
|
20
20
|
import { annotationToMessages, collaboratorToUserContact } from '../../adapters/threadedAnnotationsAdapters';
|
|
21
21
|
import AnnotationCallbacksContext from '../../common/AnnotationCallbacksContext';
|
|
22
|
+
import useOutsideEvent from '../../common/useOutsideEvent';
|
|
22
23
|
import {
|
|
23
24
|
createReplyAction,
|
|
24
25
|
deleteAnnotationAction,
|
|
@@ -41,6 +42,7 @@ import './PopupV2.scss';
|
|
|
41
42
|
|
|
42
43
|
export type Props = {
|
|
43
44
|
annotationId?: string;
|
|
45
|
+
onCancel?: () => void;
|
|
44
46
|
onSubmit: (text: string) => void;
|
|
45
47
|
popupPortalEl?: HTMLElement | null;
|
|
46
48
|
reference: PopupReference;
|
|
@@ -70,6 +72,15 @@ const createDocumentNode = (content: JSONContent | null): DocumentNodeV2 => {
|
|
|
70
72
|
const serializePopupMessage = (doc: DocumentNodeV2, isRichTextEnabled: boolean): string =>
|
|
71
73
|
isRichTextEnabled ? serializeMessageToMarkdown(doc) : serializeMentionMarkup(doc).text;
|
|
72
74
|
|
|
75
|
+
const isEmptyEditorContent = (content: JSONContent | null, isRichTextEnabled: boolean): boolean => {
|
|
76
|
+
if (!content) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const text = serializePopupMessage(createDocumentNode(content), isRichTextEnabled);
|
|
81
|
+
return text.trim().length === 0;
|
|
82
|
+
};
|
|
83
|
+
|
|
73
84
|
const literalToString = (literal: TokenLiteral): string | null => {
|
|
74
85
|
if (!literal) return null;
|
|
75
86
|
if (typeof literal === 'string') return literal;
|
|
@@ -105,13 +116,14 @@ const fetchAvatarBlob = async (
|
|
|
105
116
|
}
|
|
106
117
|
};
|
|
107
118
|
|
|
108
|
-
const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): JSX.Element | null => {
|
|
119
|
+
const PopupV2 = ({ annotationId, onCancel, onSubmit, popupPortalEl, reference }: Props): JSX.Element | null => {
|
|
109
120
|
const intl = useIntl();
|
|
110
121
|
const dispatch = useDispatch<AppThunkDispatch>();
|
|
111
122
|
const { onCopyLink: consumerOnCopyLink } = React.useContext(AnnotationCallbacksContext);
|
|
112
123
|
const popupRef = React.useRef<HTMLDivElement>(null);
|
|
113
124
|
const popperRef = React.useRef<Instance>();
|
|
114
125
|
const optionsRef = React.useRef<Partial<Options>>(getPopupOptions());
|
|
126
|
+
const hasTextRef = React.useRef(false);
|
|
115
127
|
|
|
116
128
|
const apiHost = useSelector(getApiHost);
|
|
117
129
|
const fileId = useSelector(getFileId);
|
|
@@ -185,6 +197,21 @@ const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): J
|
|
|
185
197
|
event.stopPropagation();
|
|
186
198
|
}, []);
|
|
187
199
|
|
|
200
|
+
const handleEditorChange = React.useCallback(
|
|
201
|
+
(content: JSONContent | null): void => {
|
|
202
|
+
hasTextRef.current = !isEmptyEditorContent(content, isRichTextEnabled);
|
|
203
|
+
},
|
|
204
|
+
[isRichTextEnabled],
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
const handleClickAway = React.useCallback((): void => {
|
|
208
|
+
if (!hasTextRef.current) {
|
|
209
|
+
onCancel?.();
|
|
210
|
+
}
|
|
211
|
+
}, [onCancel]);
|
|
212
|
+
|
|
213
|
+
useOutsideEvent('mousedown', popupRef, onCancel ? handleClickAway : undefined);
|
|
214
|
+
|
|
188
215
|
React.useEffect(() => {
|
|
189
216
|
if (!annotation) return undefined;
|
|
190
217
|
|
|
@@ -310,6 +337,9 @@ const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): J
|
|
|
310
337
|
await dispatch(updateAnnotationAction({ annotationId, payload: { status: 'open' } }));
|
|
311
338
|
}, [annotationId, dispatch]);
|
|
312
339
|
|
|
340
|
+
// No messages means this pane does not own the thread; do not render an empty composer.
|
|
341
|
+
if (annotationId && !threadMessages.length) return null;
|
|
342
|
+
|
|
313
343
|
if (!popupPortalEl) return null;
|
|
314
344
|
|
|
315
345
|
return ReactDOM.createPortal(
|
|
@@ -359,6 +389,7 @@ const PopupV2 = ({ annotationId, onSubmit, popupPortalEl, reference }: Props): J
|
|
|
359
389
|
<MessageEditorV2
|
|
360
390
|
isFirstAnnotation
|
|
361
391
|
isRichTextEnabled={isRichTextEnabled}
|
|
392
|
+
onChange={handleEditorChange}
|
|
362
393
|
onPost={handlePost}
|
|
363
394
|
userSelectorProps={userSelectorProps}
|
|
364
395
|
/>
|
|
@@ -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
|
|
|
@@ -123,10 +138,10 @@ export default class DocumentAnnotator extends BaseAnnotator {
|
|
|
123
138
|
|
|
124
139
|
const textLayer = pageEl.querySelector('.textLayer') as HTMLElement;
|
|
125
140
|
|
|
126
|
-
if (textLayer) {
|
|
141
|
+
if (this.canCreate && textLayer) {
|
|
127
142
|
managers.add(
|
|
128
143
|
new HighlightCreatorManager({
|
|
129
|
-
getSelection,
|
|
144
|
+
getSelection: this.getDocumentSelection,
|
|
130
145
|
referenceEl: textLayer,
|
|
131
146
|
selectionChangeDelay: TEXT_LAYER_ENHANCEMENT,
|
|
132
147
|
store: this.store,
|
|
@@ -144,15 +159,17 @@ export default class DocumentAnnotator extends BaseAnnotator {
|
|
|
144
159
|
);
|
|
145
160
|
managers.add(new RegionManager({ location: pageNumber, referenceEl: pageReferenceEl, resinTags }));
|
|
146
161
|
|
|
147
|
-
|
|
162
|
+
if (this.canCreate) {
|
|
163
|
+
const canvasLayerEl = pageEl.querySelector<HTMLElement>('.canvasWrapper');
|
|
148
164
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
165
|
+
managers.add(
|
|
166
|
+
new RegionCreationManager({
|
|
167
|
+
location: pageNumber,
|
|
168
|
+
referenceEl: canvasLayerEl || pageReferenceEl,
|
|
169
|
+
resinTags,
|
|
170
|
+
}),
|
|
171
|
+
);
|
|
172
|
+
}
|
|
156
173
|
}
|
|
157
174
|
|
|
158
175
|
return managers;
|
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);
|
package/src/popup/PopupLayer.tsx
CHANGED
|
@@ -140,7 +140,12 @@ const PopupLayer = (props: Props): JSX.Element | null => {
|
|
|
140
140
|
if (showCreator && isThreadedAnnotation) {
|
|
141
141
|
return (
|
|
142
142
|
<div className="ba-PopupLayer-popup">
|
|
143
|
-
<PopupV2
|
|
143
|
+
<PopupV2
|
|
144
|
+
onCancel={handleCancel}
|
|
145
|
+
onSubmit={handleSubmit}
|
|
146
|
+
popupPortalEl={popupPortalEl}
|
|
147
|
+
reference={reference}
|
|
148
|
+
/>
|
|
144
149
|
</div>
|
|
145
150
|
);
|
|
146
151
|
}
|
|
@@ -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
|
|
|
@@ -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,
|
|
@@ -194,4 +194,6 @@ export const applySidebarReplyUpdateAction = createAction<SidebarReplyMutationPa
|
|
|
194
194
|
|
|
195
195
|
export const removeAnnotationAction = createAction<string>('REMOVE_ANNOTATION');
|
|
196
196
|
export const setActiveAnnotationIdAction = createAction<string | null>('SET_ACTIVE_ANNOTATION_ID');
|
|
197
|
+
// Clears activeId without emitting ACTIVE_CHANGE.
|
|
198
|
+
export const clearActiveAnnotationIdAction = createAction('CLEAR_ACTIVE_ANNOTATION_ID');
|
|
197
199
|
export const setIsInitialized = createAction('SET_IS_INITIALIZED');
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
applySidebarReplyCreateAction,
|
|
7
7
|
applySidebarReplyDeleteAction,
|
|
8
8
|
applySidebarReplyUpdateAction,
|
|
9
|
+
clearActiveAnnotationIdAction,
|
|
9
10
|
createAnnotationAction,
|
|
10
11
|
createReplyAction,
|
|
11
12
|
deleteAnnotationAction,
|
|
@@ -22,6 +23,7 @@ import { setViewModeAction } from '../options/actions';
|
|
|
22
23
|
const activeAnnotationId = createReducer<AnnotationsState['activeId']>(null, builder =>
|
|
23
24
|
builder
|
|
24
25
|
/* Preview will set the active ID with a an event which will trigger the url change */
|
|
26
|
+
.addCase(clearActiveAnnotationIdAction, () => null)
|
|
25
27
|
.addCase(createAnnotationAction.fulfilled, () => null)
|
|
26
28
|
.addCase(deleteAnnotationAction.fulfilled, (state, { payload: id }) => (state === id ? null : state))
|
|
27
29
|
.addCase(removeAnnotationAction, (state, { payload: id }) => (state === id ? null : state))
|
package/i18n/bn-IN.properties
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Label for the close button
|
|
2
|
-
ba.annotationsClose = বন্ধ করুন
|
|
3
|
-
# Error message when creating
|
|
4
|
-
ba.annotationsCreateError = আমরা দুঃখিত, অ্যানোটেশন তৈরী করা যায়নি।
|
|
5
|
-
# Error message when loading
|
|
6
|
-
ba.annotationsLoadError = আমরা দুঃখিত, এই ফাইলের জন্য অ্যানোটেশন লোড করা যায়নি।
|
|
7
|
-
# Label for the post button
|
|
8
|
-
ba.annotationsPost = পোস্ট করুন
|
|
9
|
-
# Label for the save button
|
|
10
|
-
ba.annotationsSave = সংরক্ষণ করুন
|
|
11
|
-
# Aria label for the button to view the next reference
|
|
12
|
-
ba.boundingBoxHighlight.viewNextReference = পরবর্তী রেফারেন্স দেখুন
|
|
13
|
-
# Aria label for the button to view the previous reference
|
|
14
|
-
ba.boundingBoxHighlight.viewPrevReference = পূর্ববর্তী রেফারেন্স দেখুন
|
|
15
|
-
# Aria label description for reply popup
|
|
16
|
-
ba.popup.reply.comment = মন্তব্য
|
|
17
|
-
# Aria label description for annotation comment field
|
|
18
|
-
ba.popup.reply.field = মন্তব্য টাইপ করুন
|
|
19
|
-
# Aria label for mention selector loading state
|
|
20
|
-
ba.popup.reply.mentionLoading = ব্যবহারকারীদের লোড করা হচ্ছে…
|
|
21
|
-
# Aria role description for mention user selector
|
|
22
|
-
ba.popup.reply.mentionSelector = একজন কোলাবোরেটরকে উল্লেখ করুন
|
|
23
|
-
# Button label for cancelling the creation of a description, comment, or reply
|
|
24
|
-
ba.popups.cancel = বাতিল করুন
|
|
25
|
-
# Button label for adding a comment in the drawing toolbar
|
|
26
|
-
ba.popups.drawing.addComment = মন্তব্য যোগ করুন
|
|
27
|
-
# Button title for deleting a staged drawing
|
|
28
|
-
ba.popups.drawing.delete = মুছুন
|
|
29
|
-
# Button title for redoing a staged drawing
|
|
30
|
-
ba.popups.drawing.redo = রিডু
|
|
31
|
-
# Button title for undoing a staged drawing
|
|
32
|
-
ba.popups.drawing.undo = বাতিল করুন
|
|
33
|
-
# Prompt message following cursor in region annotations mode
|
|
34
|
-
ba.popups.popupCursor.regionPrompt = মন্তব্য করতে একটি বক্স আঁকুন
|
|
35
|
-
# Popup message for highlight promoter
|
|
36
|
-
ba.popups.popupHighlight.promoter = হাইলাইট এবং মন্তব্য করুন
|
|
37
|
-
# Prompt message when selection crosses multiple pages
|
|
38
|
-
ba.popups.popupHighlight.restrictedPrompt = মন্তব্যগুলি কেবলমাত্র একটি পৃষ্ঠায় সীমাবদ্ধ রয়েছে
|
|
39
|
-
# Prompt message for empty popup list
|
|
40
|
-
ba.popups.popupList.prompt = কাউকে জানাতে তাকে উল্লেখ করুন
|
|
41
|
-
# Button label for creating a description, comment, or reply
|
|
42
|
-
ba.popups.post = পোস্ট করুন
|
|
43
|
-
# Placeholder for reply field editor
|
|
44
|
-
ba.popups.replyField.placeholder = একটি মন্তব্য টাইপ করুন...
|
package/i18n/da-DK.properties
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Label for the close button
|
|
2
|
-
ba.annotationsClose = Luk
|
|
3
|
-
# Error message when creating
|
|
4
|
-
ba.annotationsCreateError = Vi beklager, anmærkningen kunne ikke oprettes.
|
|
5
|
-
# Error message when loading
|
|
6
|
-
ba.annotationsLoadError = Vi beklager, anmærkningerne for denne fil kunne ikke indlæses.
|
|
7
|
-
# Label for the post button
|
|
8
|
-
ba.annotationsPost = Opslå
|
|
9
|
-
# Label for the save button
|
|
10
|
-
ba.annotationsSave = Gem
|
|
11
|
-
# Aria label for the button to view the next reference
|
|
12
|
-
ba.boundingBoxHighlight.viewNextReference = Vis næste reference
|
|
13
|
-
# Aria label for the button to view the previous reference
|
|
14
|
-
ba.boundingBoxHighlight.viewPrevReference = Vis tidligere reference
|
|
15
|
-
# Aria label description for reply popup
|
|
16
|
-
ba.popup.reply.comment = Kommentar
|
|
17
|
-
# Aria label description for annotation comment field
|
|
18
|
-
ba.popup.reply.field = Skriv en kommentar
|
|
19
|
-
# Aria label for mention selector loading state
|
|
20
|
-
ba.popup.reply.mentionLoading = Henter brugere …
|
|
21
|
-
# Aria role description for mention user selector
|
|
22
|
-
ba.popup.reply.mentionSelector = Omtal en samarbejdspartner
|
|
23
|
-
# Button label for cancelling the creation of a description, comment, or reply
|
|
24
|
-
ba.popups.cancel = Annuller
|
|
25
|
-
# Button label for adding a comment in the drawing toolbar
|
|
26
|
-
ba.popups.drawing.addComment = Tilføj kommentar
|
|
27
|
-
# Button title for deleting a staged drawing
|
|
28
|
-
ba.popups.drawing.delete = Slet
|
|
29
|
-
# Button title for redoing a staged drawing
|
|
30
|
-
ba.popups.drawing.redo = Annuller fortryd
|
|
31
|
-
# Button title for undoing a staged drawing
|
|
32
|
-
ba.popups.drawing.undo = Fortryd
|
|
33
|
-
# Prompt message following cursor in region annotations mode
|
|
34
|
-
ba.popups.popupCursor.regionPrompt = Tegn et felt for at kommentere
|
|
35
|
-
# Popup message for highlight promoter
|
|
36
|
-
ba.popups.popupHighlight.promoter = Fremhæv og kommenter
|
|
37
|
-
# Prompt message when selection crosses multiple pages
|
|
38
|
-
ba.popups.popupHighlight.restrictedPrompt = Kommentarer er begrænset til enkelt side
|
|
39
|
-
# Prompt message for empty popup list
|
|
40
|
-
ba.popups.popupList.prompt = Nævn en person for at give vedkommende besked
|
|
41
|
-
# Button label for creating a description, comment, or reply
|
|
42
|
-
ba.popups.post = Slå op
|
|
43
|
-
# Placeholder for reply field editor
|
|
44
|
-
ba.popups.replyField.placeholder = Skriv en kommentar ...
|
package/i18n/de-DE.properties
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Label for the close button
|
|
2
|
-
ba.annotationsClose = Schließen
|
|
3
|
-
# Error message when creating
|
|
4
|
-
ba.annotationsCreateError = Die Anmerkung konnte leider nicht erstellt werden.
|
|
5
|
-
# Error message when loading
|
|
6
|
-
ba.annotationsLoadError = Die Anmerkungen für diese Datei konnten leider nicht geladen werden.
|
|
7
|
-
# Label for the post button
|
|
8
|
-
ba.annotationsPost = Posten
|
|
9
|
-
# Label for the save button
|
|
10
|
-
ba.annotationsSave = Speichern
|
|
11
|
-
# Aria label for the button to view the next reference
|
|
12
|
-
ba.boundingBoxHighlight.viewNextReference = Nächste Referenz anzeigen
|
|
13
|
-
# Aria label for the button to view the previous reference
|
|
14
|
-
ba.boundingBoxHighlight.viewPrevReference = Vorherige Referenz anzeigen
|
|
15
|
-
# Aria label description for reply popup
|
|
16
|
-
ba.popup.reply.comment = Kommentar
|
|
17
|
-
# Aria label description for annotation comment field
|
|
18
|
-
ba.popup.reply.field = Einen Kommentar eingeben
|
|
19
|
-
# Aria label for mention selector loading state
|
|
20
|
-
ba.popup.reply.mentionLoading = Benutzer werden geladen …
|
|
21
|
-
# Aria role description for mention user selector
|
|
22
|
-
ba.popup.reply.mentionSelector = Mitarbeiter erwähnen
|
|
23
|
-
# Button label for cancelling the creation of a description, comment, or reply
|
|
24
|
-
ba.popups.cancel = Abbrechen
|
|
25
|
-
# Button label for adding a comment in the drawing toolbar
|
|
26
|
-
ba.popups.drawing.addComment = Kommentar hinzufügen
|
|
27
|
-
# Button title for deleting a staged drawing
|
|
28
|
-
ba.popups.drawing.delete = Löschen
|
|
29
|
-
# Button title for redoing a staged drawing
|
|
30
|
-
ba.popups.drawing.redo = Wiederholen
|
|
31
|
-
# Button title for undoing a staged drawing
|
|
32
|
-
ba.popups.drawing.undo = Rückgängig machen
|
|
33
|
-
# Prompt message following cursor in region annotations mode
|
|
34
|
-
ba.popups.popupCursor.regionPrompt = Zeichnen Sie ein Feld zum Kommentieren
|
|
35
|
-
# Popup message for highlight promoter
|
|
36
|
-
ba.popups.popupHighlight.promoter = Markieren und kommentieren
|
|
37
|
-
# Prompt message when selection crosses multiple pages
|
|
38
|
-
ba.popups.popupHighlight.restrictedPrompt = Kommentare sind auf eine Seite beschränkt
|
|
39
|
-
# Prompt message for empty popup list
|
|
40
|
-
ba.popups.popupList.prompt = Jemanden erwähnen, der benachrichtigt werden soll
|
|
41
|
-
# Button label for creating a description, comment, or reply
|
|
42
|
-
ba.popups.post = Posten
|
|
43
|
-
# Placeholder for reply field editor
|
|
44
|
-
ba.popups.replyField.placeholder = Kommentar eingeben ...
|
package/i18n/en-AU.properties
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Label for the close button
|
|
2
|
-
ba.annotationsClose = Close
|
|
3
|
-
# Error message when creating
|
|
4
|
-
ba.annotationsCreateError = We're sorry, but the annotation could not be created.
|
|
5
|
-
# Error message when loading
|
|
6
|
-
ba.annotationsLoadError = We're sorry, the annotations failed to load for this file.
|
|
7
|
-
# Label for the post button
|
|
8
|
-
ba.annotationsPost = Post
|
|
9
|
-
# Label for the save button
|
|
10
|
-
ba.annotationsSave = Save
|
|
11
|
-
# Aria label for the button to view the next reference
|
|
12
|
-
ba.boundingBoxHighlight.viewNextReference = View next reference
|
|
13
|
-
# Aria label for the button to view the previous reference
|
|
14
|
-
ba.boundingBoxHighlight.viewPrevReference = View previous reference
|
|
15
|
-
# Aria label description for reply popup
|
|
16
|
-
ba.popup.reply.comment = Comment
|
|
17
|
-
# Aria label description for annotation comment field
|
|
18
|
-
ba.popup.reply.field = Type a comment
|
|
19
|
-
# Aria label for mention selector loading state
|
|
20
|
-
ba.popup.reply.mentionLoading = Loading users…
|
|
21
|
-
# Aria role description for mention user selector
|
|
22
|
-
ba.popup.reply.mentionSelector = Mention a collaborator
|
|
23
|
-
# Button label for cancelling the creation of a description, comment, or reply
|
|
24
|
-
ba.popups.cancel = Cancel
|
|
25
|
-
# Button label for adding a comment in the drawing toolbar
|
|
26
|
-
ba.popups.drawing.addComment = Add a comment
|
|
27
|
-
# Button title for deleting a staged drawing
|
|
28
|
-
ba.popups.drawing.delete = Delete
|
|
29
|
-
# Button title for redoing a staged drawing
|
|
30
|
-
ba.popups.drawing.redo = Redo
|
|
31
|
-
# Button title for undoing a staged drawing
|
|
32
|
-
ba.popups.drawing.undo = Undo
|
|
33
|
-
# Prompt message following cursor in region annotations mode
|
|
34
|
-
ba.popups.popupCursor.regionPrompt = Draw a box to comment
|
|
35
|
-
# Popup message for highlight promoter
|
|
36
|
-
ba.popups.popupHighlight.promoter = Highlight and comment
|
|
37
|
-
# Prompt message when selection crosses multiple pages
|
|
38
|
-
ba.popups.popupHighlight.restrictedPrompt = Comments restricted to single page
|
|
39
|
-
# Prompt message for empty popup list
|
|
40
|
-
ba.popups.popupList.prompt = Mention someone to notify them
|
|
41
|
-
# Button label for creating a description, comment, or reply
|
|
42
|
-
ba.popups.post = Post
|
|
43
|
-
# Placeholder for reply field editor
|
|
44
|
-
ba.popups.replyField.placeholder = Type a comment…
|
package/i18n/en-CA.properties
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Label for the close button
|
|
2
|
-
ba.annotationsClose = Close
|
|
3
|
-
# Error message when creating
|
|
4
|
-
ba.annotationsCreateError = We’re sorry, the annotation could not be created.
|
|
5
|
-
# Error message when loading
|
|
6
|
-
ba.annotationsLoadError = We’re sorry, the annotations failed to load for this file.
|
|
7
|
-
# Label for the post button
|
|
8
|
-
ba.annotationsPost = Post
|
|
9
|
-
# Label for the save button
|
|
10
|
-
ba.annotationsSave = Save
|
|
11
|
-
# Aria label for the button to view the next reference
|
|
12
|
-
ba.boundingBoxHighlight.viewNextReference = View next reference
|
|
13
|
-
# Aria label for the button to view the previous reference
|
|
14
|
-
ba.boundingBoxHighlight.viewPrevReference = View previous reference
|
|
15
|
-
# Aria label description for reply popup
|
|
16
|
-
ba.popup.reply.comment = Comment
|
|
17
|
-
# Aria label description for annotation comment field
|
|
18
|
-
ba.popup.reply.field = Type a comment
|
|
19
|
-
# Aria label for mention selector loading state
|
|
20
|
-
ba.popup.reply.mentionLoading = Loading users...
|
|
21
|
-
# Aria role description for mention user selector
|
|
22
|
-
ba.popup.reply.mentionSelector = Mention a collaborator
|
|
23
|
-
# Button label for cancelling the creation of a description, comment, or reply
|
|
24
|
-
ba.popups.cancel = Cancel
|
|
25
|
-
# Button label for adding a comment in the drawing toolbar
|
|
26
|
-
ba.popups.drawing.addComment = Add Comment
|
|
27
|
-
# Button title for deleting a staged drawing
|
|
28
|
-
ba.popups.drawing.delete = Delete
|
|
29
|
-
# Button title for redoing a staged drawing
|
|
30
|
-
ba.popups.drawing.redo = Redo
|
|
31
|
-
# Button title for undoing a staged drawing
|
|
32
|
-
ba.popups.drawing.undo = Undo
|
|
33
|
-
# Prompt message following cursor in region annotations mode
|
|
34
|
-
ba.popups.popupCursor.regionPrompt = Draw a box to comment
|
|
35
|
-
# Popup message for highlight promoter
|
|
36
|
-
ba.popups.popupHighlight.promoter = Highlight and Comment
|
|
37
|
-
# Prompt message when selection crosses multiple pages
|
|
38
|
-
ba.popups.popupHighlight.restrictedPrompt = Comments restricted to single page
|
|
39
|
-
# Prompt message for empty popup list
|
|
40
|
-
ba.popups.popupList.prompt = Mention someone to notify them
|
|
41
|
-
# Button label for creating a description, comment, or reply
|
|
42
|
-
ba.popups.post = Post
|
|
43
|
-
# Placeholder for reply field editor
|
|
44
|
-
ba.popups.replyField.placeholder = Type a comment...
|
package/i18n/en-GB.properties
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Label for the close button
|
|
2
|
-
ba.annotationsClose = Close
|
|
3
|
-
# Error message when creating
|
|
4
|
-
ba.annotationsCreateError = We're sorry, but the annotation could not be created.
|
|
5
|
-
# Error message when loading
|
|
6
|
-
ba.annotationsLoadError = We're sorry, the annotations failed to load for this file.
|
|
7
|
-
# Label for the post button
|
|
8
|
-
ba.annotationsPost = Post
|
|
9
|
-
# Label for the save button
|
|
10
|
-
ba.annotationsSave = Save
|
|
11
|
-
# Aria label for the button to view the next reference
|
|
12
|
-
ba.boundingBoxHighlight.viewNextReference = View next reference
|
|
13
|
-
# Aria label for the button to view the previous reference
|
|
14
|
-
ba.boundingBoxHighlight.viewPrevReference = View previous reference
|
|
15
|
-
# Aria label description for reply popup
|
|
16
|
-
ba.popup.reply.comment = Comment
|
|
17
|
-
# Aria label description for annotation comment field
|
|
18
|
-
ba.popup.reply.field = Type a comment
|
|
19
|
-
# Aria label for mention selector loading state
|
|
20
|
-
ba.popup.reply.mentionLoading = Loading users…
|
|
21
|
-
# Aria role description for mention user selector
|
|
22
|
-
ba.popup.reply.mentionSelector = Mention a collaborator
|
|
23
|
-
# Button label for cancelling the creation of a description, comment, or reply
|
|
24
|
-
ba.popups.cancel = Cancel
|
|
25
|
-
# Button label for adding a comment in the drawing toolbar
|
|
26
|
-
ba.popups.drawing.addComment = Add a comment
|
|
27
|
-
# Button title for deleting a staged drawing
|
|
28
|
-
ba.popups.drawing.delete = Delete
|
|
29
|
-
# Button title for redoing a staged drawing
|
|
30
|
-
ba.popups.drawing.redo = Redo
|
|
31
|
-
# Button title for undoing a staged drawing
|
|
32
|
-
ba.popups.drawing.undo = Undo
|
|
33
|
-
# Prompt message following cursor in region annotations mode
|
|
34
|
-
ba.popups.popupCursor.regionPrompt = Draw a box to comment
|
|
35
|
-
# Popup message for highlight promoter
|
|
36
|
-
ba.popups.popupHighlight.promoter = Highlight and comment
|
|
37
|
-
# Prompt message when selection crosses multiple pages
|
|
38
|
-
ba.popups.popupHighlight.restrictedPrompt = Comments restricted to single page
|
|
39
|
-
# Prompt message for empty popup list
|
|
40
|
-
ba.popups.popupList.prompt = Mention someone to notify them
|
|
41
|
-
# Button label for creating a description, comment, or reply
|
|
42
|
-
ba.popups.post = Post
|
|
43
|
-
# Placeholder for reply field editor
|
|
44
|
-
ba.popups.replyField.placeholder = Type a comment…
|