@manuscripts/body-editor 3.7.13 → 3.7.15

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.
@@ -222,7 +222,7 @@ const DraggableTree = ({ tree, view, depth, can, }) => {
222
222
  const heroImageClass = isHeroImage ? 'hero-image' : '';
223
223
  return (react_1.default.createElement(Outline_1.Outline, { ref: ref, className: `${dragClass} ${dropClass} ${deletedClass} ${heroImageClass}` },
224
224
  !isTop && node.type.name != 'manuscript' && (react_1.default.createElement(Outline_1.OutlineItem, { depth: isHeroImage ? 1 : depth, onContextMenu: handleContextMenu },
225
- items.length ? (react_1.default.createElement(Outline_1.OutlineItemArrow, { onClick: toggleOpen }, isOpen ? react_1.default.createElement(style_guide_1.TriangleExpandedIcon, null) : react_1.default.createElement(style_guide_1.TriangleCollapsedIcon, null))) : (react_1.default.createElement(Outline_1.OutlineItemNoArrow, null)),
225
+ items.length ? (react_1.default.createElement(Outline_1.OutlineItemArrow, { "aria-label": `${isOpen ? 'Collapse' : 'Expand'} ${node.type.name}`, onClick: toggleOpen }, isOpen ? react_1.default.createElement(style_guide_1.TriangleExpandedIcon, null) : react_1.default.createElement(style_guide_1.TriangleCollapsedIcon, null))) : (react_1.default.createElement(Outline_1.OutlineItemNoArrow, null)),
226
226
  react_1.default.createElement(Outline_1.OutlineItemLink, { to: `#${node.attrs.id}` },
227
227
  react_1.default.createElement(Outline_1.OutlineItemIcon, null, (0, node_type_icons_1.nodeTypeIcon)(node.type)),
228
228
  react_1.default.createElement(Outline_1.OutlineItemLinkText, { className: `outline-text-${node.type.name}` }, itemText(node))))),
@@ -153,9 +153,10 @@ const isEditAllowed = (state) => {
153
153
  return !((0, exports.isBodyLocked)(state) && (0, exports.isSelectionInBody)(state));
154
154
  };
155
155
  exports.isEditAllowed = isEditAllowed;
156
- const createToggleButton = (listener) => {
156
+ const createToggleButton = (listener, what) => {
157
157
  const altTitlesButton = document.createElement('button');
158
158
  altTitlesButton.classList.add('toggle-button-open', 'button-reset');
159
+ altTitlesButton.setAttribute('aria-label', `Expand ${what}`);
159
160
  altTitlesButton.innerHTML = icons_1.arrowDown;
160
161
  altTitlesButton.addEventListener('click', (e) => {
161
162
  e.preventDefault();
@@ -27,7 +27,7 @@ const buildExpandButtonDecorations = (doc) => {
27
27
  const container = document.createElement('div');
28
28
  container.className =
29
29
  'accessibility_element_expander_button_container';
30
- container.appendChild((0, utils_1.createToggleButton)(() => handleExpandButtonClick(view, node)));
30
+ container.appendChild((0, utils_1.createToggleButton)(() => handleExpandButtonClick(view, node), 'additional info'));
31
31
  return container;
32
32
  }, {
33
33
  key: node.attrs.id,
@@ -139,7 +139,7 @@ exports.default = () => {
139
139
  collapsed: false,
140
140
  });
141
141
  view.dispatch((0, track_changes_plugin_1.skipTracking)(tr));
142
- });
142
+ }, 'alternative titles');
143
143
  }, {
144
144
  side: -1,
145
145
  key: 'title-' + titleEnd,
@@ -42,6 +42,7 @@ function createButton(view, pos, currentCategory, categories, usedCategoryIDs, c
42
42
  const button = document.createElement('button');
43
43
  button.innerHTML = icons_1.sectionCategoryIcon;
44
44
  button.classList.add('section-category-button');
45
+ button.setAttribute('aria-label', 'Section categories menu');
45
46
  if (currentCategory) {
46
47
  button.classList.add('assigned');
47
48
  }
@@ -38,23 +38,29 @@ const useEditor = (externalProps) => {
38
38
  view.current.updateState(newState);
39
39
  }
40
40
  }, [props.doc, props.isComparingMode]);
41
- if (collabProvider && !props.isComparingMode) {
42
- collabProvider.onNewSteps(async () => {
43
- if (state && view.current) {
44
- const localVersion = (0, prosemirror_collab_1.getVersion)(view.current.state);
45
- const since = await collabProvider.stepsSince(localVersion);
46
- if (since && since.version <= localVersion) {
47
- return;
48
- }
49
- if (since?.steps.length && since.clientIDs.length) {
50
- view.current.dispatch((0, prosemirror_collab_1.receiveTransaction)(view.current.state, since?.steps, since.clientIDs));
51
- }
52
- else {
53
- console.warn('Inconsistent new steps event from the authority.');
41
+ (0, react_1.useEffect)(() => {
42
+ if (collabProvider && !props.isComparingMode) {
43
+ collabProvider.onNewSteps(async () => {
44
+ if (state && view.current) {
45
+ let localVersion = (0, prosemirror_collab_1.getVersion)(view.current.state);
46
+ const since = await collabProvider.stepsSince((0, prosemirror_collab_1.getVersion)(view.current.state));
47
+ localVersion = (0, prosemirror_collab_1.getVersion)(view.current.state);
48
+ if (since && since.version <= localVersion) {
49
+ return;
50
+ }
51
+ if (since?.steps.length && since.clientIDs.length) {
52
+ view.current.dispatch((0, prosemirror_collab_1.receiveTransaction)(view.current.state, since?.steps, since.clientIDs));
53
+ }
54
+ else {
55
+ console.warn('Inconsistent new steps event from the authority.');
56
+ }
54
57
  }
55
- }
56
- });
57
- }
58
+ });
59
+ }
60
+ return () => {
61
+ collabProvider?.unsubscribe();
62
+ };
63
+ }, [collabProvider, props.isComparingMode, !!view.current]);
58
64
  const debounce = (0, use_do_with_debounce_1.useDoWithDebounce)();
59
65
  const dispatch = (0, react_1.useCallback)((tr) => {
60
66
  if (!view.current) {
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MATHJAX_VERSION = exports.VERSION = void 0;
4
- exports.VERSION = '3.7.13';
4
+ exports.VERSION = '3.7.15';
5
5
  exports.MATHJAX_VERSION = '3.2.2';
@@ -16,7 +16,7 @@ class AccessibilityElementView extends block_view_1.default {
16
16
  createDOM() {
17
17
  this.dom = document.createElement('div');
18
18
  this.dom.classList.add('accessibility_element');
19
- const label = document.createElement('label');
19
+ const label = document.createElement('div');
20
20
  label.contentEditable = 'false';
21
21
  label.className = 'accessibility_element_label';
22
22
  label.innerText =
@@ -45,6 +45,7 @@ class AltTitleSectionView extends block_view_1.default {
45
45
  closingPanel.classList.add('alt-titles-closing-panel');
46
46
  const button = document.createElement('button');
47
47
  button.classList.add('alt-titles-closing-button', 'button-reset');
48
+ button.setAttribute('aria-label', 'Collapse alternative titles');
48
49
  button.innerHTML = icons_1.arrowDown;
49
50
  button.addEventListener('click', () => {
50
51
  const tr = this.view.state.tr.setMeta(alt_titles_1.altTitlesKey, {
@@ -48,6 +48,7 @@ class FigureEditableView extends figure_1.FigureView {
48
48
  const img = document.createElement('img');
49
49
  img.classList.add('figure-image');
50
50
  img.src = src;
51
+ img.alt = 'figure image';
51
52
  return img;
52
53
  };
53
54
  this.createPlaceholder = () => {
@@ -185,7 +185,7 @@ export const DraggableTree = ({ tree, view, depth, can, }) => {
185
185
  const heroImageClass = isHeroImage ? 'hero-image' : '';
186
186
  return (React.createElement(Outline, { ref: ref, className: `${dragClass} ${dropClass} ${deletedClass} ${heroImageClass}` },
187
187
  !isTop && node.type.name != 'manuscript' && (React.createElement(OutlineItem, { depth: isHeroImage ? 1 : depth, onContextMenu: handleContextMenu },
188
- items.length ? (React.createElement(OutlineItemArrow, { onClick: toggleOpen }, isOpen ? React.createElement(TriangleExpandedIcon, null) : React.createElement(TriangleCollapsedIcon, null))) : (React.createElement(OutlineItemNoArrow, null)),
188
+ items.length ? (React.createElement(OutlineItemArrow, { "aria-label": `${isOpen ? 'Collapse' : 'Expand'} ${node.type.name}`, onClick: toggleOpen }, isOpen ? React.createElement(TriangleExpandedIcon, null) : React.createElement(TriangleCollapsedIcon, null))) : (React.createElement(OutlineItemNoArrow, null)),
189
189
  React.createElement(OutlineItemLink, { to: `#${node.attrs.id}` },
190
190
  React.createElement(OutlineItemIcon, null, nodeTypeIcon(node.type)),
191
191
  React.createElement(OutlineItemLinkText, { className: `outline-text-${node.type.name}` }, itemText(node))))),
@@ -135,9 +135,10 @@ export const isBodyLocked = (state) => {
135
135
  export const isEditAllowed = (state) => {
136
136
  return !(isBodyLocked(state) && isSelectionInBody(state));
137
137
  };
138
- export const createToggleButton = (listener) => {
138
+ export const createToggleButton = (listener, what) => {
139
139
  const altTitlesButton = document.createElement('button');
140
140
  altTitlesButton.classList.add('toggle-button-open', 'button-reset');
141
+ altTitlesButton.setAttribute('aria-label', `Expand ${what}`);
141
142
  altTitlesButton.innerHTML = arrowDown;
142
143
  altTitlesButton.addEventListener('click', (e) => {
143
144
  e.preventDefault();
@@ -24,7 +24,7 @@ const buildExpandButtonDecorations = (doc) => {
24
24
  const container = document.createElement('div');
25
25
  container.className =
26
26
  'accessibility_element_expander_button_container';
27
- container.appendChild(createToggleButton(() => handleExpandButtonClick(view, node)));
27
+ container.appendChild(createToggleButton(() => handleExpandButtonClick(view, node), 'additional info'));
28
28
  return container;
29
29
  }, {
30
30
  key: node.attrs.id,
@@ -136,7 +136,7 @@ export default () => {
136
136
  collapsed: false,
137
137
  });
138
138
  view.dispatch(skipTracking(tr));
139
- });
139
+ }, 'alternative titles');
140
140
  }, {
141
141
  side: -1,
142
142
  key: 'title-' + titleEnd,
@@ -39,6 +39,7 @@ function createButton(view, pos, currentCategory, categories, usedCategoryIDs, c
39
39
  const button = document.createElement('button');
40
40
  button.innerHTML = sectionCategoryIcon;
41
41
  button.classList.add('section-category-button');
42
+ button.setAttribute('aria-label', 'Section categories menu');
42
43
  if (currentCategory) {
43
44
  button.classList.add('assigned');
44
45
  }
@@ -35,23 +35,29 @@ export const useEditor = (externalProps) => {
35
35
  view.current.updateState(newState);
36
36
  }
37
37
  }, [props.doc, props.isComparingMode]);
38
- if (collabProvider && !props.isComparingMode) {
39
- collabProvider.onNewSteps(async () => {
40
- if (state && view.current) {
41
- const localVersion = getVersion(view.current.state);
42
- const since = await collabProvider.stepsSince(localVersion);
43
- if (since && since.version <= localVersion) {
44
- return;
45
- }
46
- if (since?.steps.length && since.clientIDs.length) {
47
- view.current.dispatch(receiveTransaction(view.current.state, since?.steps, since.clientIDs));
48
- }
49
- else {
50
- console.warn('Inconsistent new steps event from the authority.');
38
+ useEffect(() => {
39
+ if (collabProvider && !props.isComparingMode) {
40
+ collabProvider.onNewSteps(async () => {
41
+ if (state && view.current) {
42
+ let localVersion = getVersion(view.current.state);
43
+ const since = await collabProvider.stepsSince(getVersion(view.current.state));
44
+ localVersion = getVersion(view.current.state);
45
+ if (since && since.version <= localVersion) {
46
+ return;
47
+ }
48
+ if (since?.steps.length && since.clientIDs.length) {
49
+ view.current.dispatch(receiveTransaction(view.current.state, since?.steps, since.clientIDs));
50
+ }
51
+ else {
52
+ console.warn('Inconsistent new steps event from the authority.');
53
+ }
51
54
  }
52
- }
53
- });
54
- }
55
+ });
56
+ }
57
+ return () => {
58
+ collabProvider?.unsubscribe();
59
+ };
60
+ }, [collabProvider, props.isComparingMode, !!view.current]);
55
61
  const debounce = useDoWithDebounce();
56
62
  const dispatch = useCallback((tr) => {
57
63
  if (!view.current) {
@@ -1,2 +1,2 @@
1
- export const VERSION = '3.7.13';
1
+ export const VERSION = '3.7.15';
2
2
  export const MATHJAX_VERSION = '3.2.2';
@@ -10,7 +10,7 @@ export class AccessibilityElementView extends BlockView {
10
10
  createDOM() {
11
11
  this.dom = document.createElement('div');
12
12
  this.dom.classList.add('accessibility_element');
13
- const label = document.createElement('label');
13
+ const label = document.createElement('div');
14
14
  label.contentEditable = 'false';
15
15
  label.className = 'accessibility_element_label';
16
16
  label.innerText =
@@ -39,6 +39,7 @@ export class AltTitleSectionView extends BlockView {
39
39
  closingPanel.classList.add('alt-titles-closing-panel');
40
40
  const button = document.createElement('button');
41
41
  button.classList.add('alt-titles-closing-button', 'button-reset');
42
+ button.setAttribute('aria-label', 'Collapse alternative titles');
42
43
  button.innerHTML = arrowDown;
43
44
  button.addEventListener('click', () => {
44
45
  const tr = this.view.state.tr.setMeta(altTitlesKey, {
@@ -45,6 +45,7 @@ export class FigureEditableView extends FigureView {
45
45
  const img = document.createElement('img');
46
46
  img.classList.add('figure-image');
47
47
  img.src = src;
48
+ img.alt = 'figure image';
48
49
  return img;
49
50
  };
50
51
  this.createPlaceholder = () => {
@@ -18,6 +18,7 @@ export declare abstract class CollabProvider {
18
18
  currentVersion: number;
19
19
  protected newStepsListener: () => void;
20
20
  abstract sendSteps(version: number, steps: readonly Step[], clientID: string | number, flush?: boolean): Promise<void>;
21
+ abstract unsubscribe(): void;
21
22
  abstract onNewSteps(listener: CollabProvider['newStepsListener']): void;
22
23
  abstract stepsSince(version: number): Promise<{
23
24
  steps: Step[];
@@ -34,7 +34,7 @@ export declare const shouldRenderField: (field: string, type: BibliographyItemTy
34
34
  export declare const cleanItemValues: (item: BibliographyItemAttrs) => BibliographyItemAttrs;
35
35
  export declare const isBodyLocked: (state: EditorState) => boolean;
36
36
  export declare const isEditAllowed: (state: EditorState) => boolean;
37
- export declare const createToggleButton: (listener: () => void) => HTMLButtonElement;
37
+ export declare const createToggleButton: (listener: () => void, what: string) => HTMLButtonElement;
38
38
  export declare const getInsertPos: (type: ManuscriptNodeType, parent: ManuscriptNode, pos: number) => number;
39
39
  export declare const findInsertionPosition: (type: ManuscriptNodeType, doc: ManuscriptNode) => number;
40
40
  export declare const filterBlockNodes: (fragment: Fragment, predicate: (node: ProseMirrorNode) => boolean) => Fragment;
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "3.7.13";
1
+ export declare const VERSION = "3.7.15";
2
2
  export declare const MATHJAX_VERSION = "3.2.2";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@manuscripts/body-editor",
3
3
  "description": "Prosemirror components for editing and viewing manuscripts",
4
- "version": "3.7.13",
4
+ "version": "3.7.15",
5
5
  "repository": "github:Atypon-OpenSource/manuscripts-body-editor",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/cjs",