@manuscripts/body-editor 1.8.2 → 1.8.4-LEAN-2974-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.
@@ -147,9 +147,10 @@ const CrossReferenceItems = ({ targets, handleSelect, handleCancel, currentTarge
147
147
  react_1.default.createElement(style_guide_1.ButtonGroup, null,
148
148
  react_1.default.createElement(style_guide_1.SecondaryButton, { onClick: handleCancel }, "Cancel"),
149
149
  react_1.default.createElement(style_guide_1.PrimaryButton, { onClick: () => {
150
- var _a;
150
+ var _a, _b;
151
151
  return selectedItem &&
152
- handleSelect(selectedItem, (_a = customTextRef.current) === null || _a === void 0 ? void 0 : _a.value);
152
+ handleSelect(selectedItem, ((_a = customTextRef.current) === null || _a === void 0 ? void 0 : _a.value) ||
153
+ ((_b = targets.find(({ id }) => id === selectedItem)) === null || _b === void 0 ? void 0 : _b.label));
153
154
  }, disabled: !selectedItem }, "Insert")))));
154
155
  };
155
156
  exports.CrossReferenceItems = CrossReferenceItems;
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isHighlightComment = exports.isThereSelector = exports.commentScroll = exports.commentAnnotation = void 0;
3
+ exports.addCommentToLeafNode = exports.isHighlightComment = exports.isThereSelector = exports.commentScroll = exports.commentAnnotation = void 0;
4
4
  const transform_1 = require("@manuscripts/transform");
5
5
  const prosemirror_state_1 = require("prosemirror-state");
6
+ const prosemirror_transform_1 = require("prosemirror-transform");
6
7
  const prosemirror_view_1 = require("prosemirror-view");
7
8
  const highlight_1 = require("./highlight");
8
9
  exports.commentAnnotation = new prosemirror_state_1.PluginKey('comment_annotation');
@@ -43,14 +44,26 @@ exports.default = (props) => {
43
44
  return new prosemirror_view_1.DecorationSet();
44
45
  }
45
46
  },
46
- apply: (tr) => {
47
+ apply: (tr, value, oldState, newState) => {
47
48
  const meta = tr.getMeta(exports.commentAnnotation);
48
49
  if (meta) {
49
50
  if (highlight_1.SET_COMMENT in meta) {
50
51
  props.setComment(meta[highlight_1.SET_COMMENT]);
52
+ return value;
51
53
  }
52
54
  }
53
- return commentsState(props.setSelectedComment, tr.doc);
55
+ const hasCommentChange = !!tr.steps.find((s) => {
56
+ var _a, _b;
57
+ if (s instanceof prosemirror_transform_1.ReplaceStep) {
58
+ return s.slice.size > 0
59
+ ? ((_a = newState.doc.nodeAt(s.from + 1)) === null || _a === void 0 ? void 0 : _a.type) === transform_1.schema.nodes.comment
60
+ : ((_b = oldState.doc.nodeAt(s.from)) === null || _b === void 0 ? void 0 : _b.type) === transform_1.schema.nodes.comment;
61
+ }
62
+ });
63
+ if (hasCommentChange) {
64
+ return commentsState(props.setSelectedComment, tr.doc);
65
+ }
66
+ return value;
54
67
  },
55
68
  },
56
69
  props: {
@@ -99,16 +112,23 @@ const commentsState = (setSelectedComment, doc) => {
99
112
  const id = node.attrs['id'] || node.attrs['rid'];
100
113
  const targetComment = commentsMap.get(id);
101
114
  if (targetComment) {
102
- const position = getNodePosition(node, pos);
103
- decorations.push(prosemirror_view_1.Decoration.widget(position, getCommentIcon(Object.assign(Object.assign({}, targetComment), { targetType: node.type }), setSelectedComment), { key: targetComment.id }));
115
+ if (node.isAtom && node.type !== transform_1.schema.nodes.highlight_marker) {
116
+ decorations.push(prosemirror_view_1.Decoration.inline(pos, pos + node.nodeSize, {}, {
117
+ toDOM: getCommentIcon(Object.assign(Object.assign({}, targetComment), { targetType: node.type, isAtom: node.isAtom }), setSelectedComment),
118
+ }));
119
+ }
120
+ else {
121
+ const position = getNodePosition(node, pos);
122
+ decorations.push(prosemirror_view_1.Decoration.widget(position, getCommentIcon(Object.assign(Object.assign({}, targetComment), { targetType: node.type }), setSelectedComment), { key: targetComment.id }));
123
+ }
104
124
  }
105
125
  });
106
126
  return prosemirror_view_1.DecorationSet.create(doc, decorations);
107
127
  };
108
128
  const getCommentIcon = (comment, setSelectedComment) => () => {
109
- const { id, targetType, target, count, location } = comment;
129
+ const { id, targetType, target, count, location, isAtom } = comment;
110
130
  const commentId = location === 'block' ? target : id;
111
- const element = document.createElement('div');
131
+ const element = document.createElement(isAtom ? 'span' : 'div');
112
132
  element.id = commentId;
113
133
  let elementClass;
114
134
  switch (targetType) {
@@ -126,8 +146,8 @@ const getCommentIcon = (comment, setSelectedComment) => () => {
126
146
  default:
127
147
  elementClass = 'inline-comment';
128
148
  }
129
- if (targetType === transform_1.schema.nodes.citation || location === 'point') {
130
- element.classList.add(location === 'point' ? 'point-comment' : 'inline-citation');
149
+ if (isAtom || location === 'point') {
150
+ element.classList.add('point-comment');
131
151
  }
132
152
  element.classList.add('block-comment-button', elementClass);
133
153
  element.onclick = (e) => {
@@ -152,3 +172,14 @@ const getCommentIcon = (comment, setSelectedComment) => () => {
152
172
  `;
153
173
  return element;
154
174
  };
175
+ const addCommentToLeafNode = (from, to, state, dom) => {
176
+ const commentsDecorationSet = exports.commentAnnotation.getState(state);
177
+ if (commentsDecorationSet) {
178
+ const commentWidget = commentsDecorationSet.find(from, to);
179
+ if (commentWidget.length) {
180
+ const commentElement = commentWidget[0].type.spec.toDOM();
181
+ dom.appendChild(commentElement);
182
+ }
183
+ }
184
+ };
185
+ exports.addCommentToLeafNode = addCommentToLeafNode;
@@ -21,6 +21,7 @@ const dompurify_1 = require("../lib/dompurify");
21
21
  const track_changes_utils_1 = require("../lib/track-changes-utils");
22
22
  const bibliography_1 = require("../plugins/bibliography");
23
23
  const bibliography_utils_1 = require("../plugins/bibliography/bibliography-utils");
24
+ const comment_annotation_1 = require("../plugins/comment_annotation");
24
25
  const base_node_view_1 = require("./base_node_view");
25
26
  const creators_1 = require("./creators");
26
27
  class CitationView extends base_node_view_1.BaseNodeView {
@@ -55,6 +56,7 @@ class CitationView extends base_node_view_1.BaseNodeView {
55
56
  this.dom.className = 'citation-wrapper';
56
57
  this.dom.innerHTML = '';
57
58
  this.dom.appendChild(element);
59
+ (0, comment_annotation_1.addCommentToLeafNode)(this.getPos(), this.getPos() + this.node.nodeSize, this.view.state, this.dom);
58
60
  this.setDomAttrs(this.node, this.dom, ['rids', 'contents', 'selectedText']);
59
61
  };
60
62
  this.getCitation = () => {
@@ -42,6 +42,13 @@ class CitationEditableView extends citation_1.CitationView {
42
42
  constructor() {
43
43
  super(...arguments);
44
44
  this.decoder = new transform_1.Decoder(new Map());
45
+ this.stopEvent = (event) => {
46
+ var _a;
47
+ const element = event.target;
48
+ return !!(element.classList.contains('point-comment') ||
49
+ element.classList.contains('comment-icon') ||
50
+ ((_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.classList.contains('comment-icon')));
51
+ };
45
52
  this.selectNode = () => {
46
53
  var _a;
47
54
  const dataTracked = this.node.attrs.dataTracked;
@@ -121,16 +121,14 @@ class FigureElementView extends block_view_1.default {
121
121
  };
122
122
  }
123
123
  deleteSupplementNode(file) {
124
- if (file.type.id === 'supplementary') {
125
- const tr = this.view.state.tr;
126
- this.view.state.doc.descendants((node, pos) => {
127
- if (node.type === transform_1.schema.nodes.supplement &&
128
- node.attrs.href === file.id) {
129
- tr.delete(pos, pos + node.nodeSize);
130
- }
131
- });
132
- this.view.dispatch(tr);
133
- }
124
+ const tr = this.view.state.tr;
125
+ this.view.state.doc.descendants((node, pos) => {
126
+ if (node.type === transform_1.schema.nodes.supplement &&
127
+ node.attrs.href === file.id) {
128
+ tr.delete(pos, pos + node.nodeSize);
129
+ }
130
+ });
131
+ this.view.dispatch(tr);
134
132
  }
135
133
  }
136
134
  exports.FigureElementView = FigureElementView;
@@ -118,8 +118,9 @@ export const CrossReferenceItems = ({ targets, handleSelect, handleCancel, curre
118
118
  React.createElement(ButtonGroup, null,
119
119
  React.createElement(SecondaryButton, { onClick: handleCancel }, "Cancel"),
120
120
  React.createElement(PrimaryButton, { onClick: () => {
121
- var _a;
121
+ var _a, _b;
122
122
  return selectedItem &&
123
- handleSelect(selectedItem, (_a = customTextRef.current) === null || _a === void 0 ? void 0 : _a.value);
123
+ handleSelect(selectedItem, ((_a = customTextRef.current) === null || _a === void 0 ? void 0 : _a.value) ||
124
+ ((_b = targets.find(({ id }) => id === selectedItem)) === null || _b === void 0 ? void 0 : _b.label));
124
125
  }, disabled: !selectedItem }, "Insert")))));
125
126
  };
@@ -1,5 +1,6 @@
1
1
  import { schema } from '@manuscripts/transform';
2
2
  import { Plugin, PluginKey } from 'prosemirror-state';
3
+ import { ReplaceStep } from 'prosemirror-transform';
3
4
  import { Decoration, DecorationSet } from 'prosemirror-view';
4
5
  import { SET_COMMENT } from './highlight';
5
6
  export const commentAnnotation = new PluginKey('comment_annotation');
@@ -37,14 +38,26 @@ export default (props) => {
37
38
  return new DecorationSet();
38
39
  }
39
40
  },
40
- apply: (tr) => {
41
+ apply: (tr, value, oldState, newState) => {
41
42
  const meta = tr.getMeta(commentAnnotation);
42
43
  if (meta) {
43
44
  if (SET_COMMENT in meta) {
44
45
  props.setComment(meta[SET_COMMENT]);
46
+ return value;
45
47
  }
46
48
  }
47
- return commentsState(props.setSelectedComment, tr.doc);
49
+ const hasCommentChange = !!tr.steps.find((s) => {
50
+ var _a, _b;
51
+ if (s instanceof ReplaceStep) {
52
+ return s.slice.size > 0
53
+ ? ((_a = newState.doc.nodeAt(s.from + 1)) === null || _a === void 0 ? void 0 : _a.type) === schema.nodes.comment
54
+ : ((_b = oldState.doc.nodeAt(s.from)) === null || _b === void 0 ? void 0 : _b.type) === schema.nodes.comment;
55
+ }
56
+ });
57
+ if (hasCommentChange) {
58
+ return commentsState(props.setSelectedComment, tr.doc);
59
+ }
60
+ return value;
48
61
  },
49
62
  },
50
63
  props: {
@@ -93,16 +106,23 @@ const commentsState = (setSelectedComment, doc) => {
93
106
  const id = node.attrs['id'] || node.attrs['rid'];
94
107
  const targetComment = commentsMap.get(id);
95
108
  if (targetComment) {
96
- const position = getNodePosition(node, pos);
97
- decorations.push(Decoration.widget(position, getCommentIcon(Object.assign(Object.assign({}, targetComment), { targetType: node.type }), setSelectedComment), { key: targetComment.id }));
109
+ if (node.isAtom && node.type !== schema.nodes.highlight_marker) {
110
+ decorations.push(Decoration.inline(pos, pos + node.nodeSize, {}, {
111
+ toDOM: getCommentIcon(Object.assign(Object.assign({}, targetComment), { targetType: node.type, isAtom: node.isAtom }), setSelectedComment),
112
+ }));
113
+ }
114
+ else {
115
+ const position = getNodePosition(node, pos);
116
+ decorations.push(Decoration.widget(position, getCommentIcon(Object.assign(Object.assign({}, targetComment), { targetType: node.type }), setSelectedComment), { key: targetComment.id }));
117
+ }
98
118
  }
99
119
  });
100
120
  return DecorationSet.create(doc, decorations);
101
121
  };
102
122
  const getCommentIcon = (comment, setSelectedComment) => () => {
103
- const { id, targetType, target, count, location } = comment;
123
+ const { id, targetType, target, count, location, isAtom } = comment;
104
124
  const commentId = location === 'block' ? target : id;
105
- const element = document.createElement('div');
125
+ const element = document.createElement(isAtom ? 'span' : 'div');
106
126
  element.id = commentId;
107
127
  let elementClass;
108
128
  switch (targetType) {
@@ -120,8 +140,8 @@ const getCommentIcon = (comment, setSelectedComment) => () => {
120
140
  default:
121
141
  elementClass = 'inline-comment';
122
142
  }
123
- if (targetType === schema.nodes.citation || location === 'point') {
124
- element.classList.add(location === 'point' ? 'point-comment' : 'inline-citation');
143
+ if (isAtom || location === 'point') {
144
+ element.classList.add('point-comment');
125
145
  }
126
146
  element.classList.add('block-comment-button', elementClass);
127
147
  element.onclick = (e) => {
@@ -146,3 +166,13 @@ const getCommentIcon = (comment, setSelectedComment) => () => {
146
166
  `;
147
167
  return element;
148
168
  };
169
+ export const addCommentToLeafNode = (from, to, state, dom) => {
170
+ const commentsDecorationSet = commentAnnotation.getState(state);
171
+ if (commentsDecorationSet) {
172
+ const commentWidget = commentsDecorationSet.find(from, to);
173
+ if (commentWidget.length) {
174
+ const commentElement = commentWidget[0].type.spec.toDOM();
175
+ dom.appendChild(commentElement);
176
+ }
177
+ }
178
+ };
@@ -18,6 +18,7 @@ import { sanitize } from '../lib/dompurify';
18
18
  import { getChangeClasses } from '../lib/track-changes-utils';
19
19
  import { getBibliographyPluginState } from '../plugins/bibliography';
20
20
  import { getCitation } from '../plugins/bibliography/bibliography-utils';
21
+ import { addCommentToLeafNode } from '../plugins/comment_annotation';
21
22
  import { BaseNodeView } from './base_node_view';
22
23
  import { createNodeView } from './creators';
23
24
  export class CitationView extends BaseNodeView {
@@ -52,6 +53,7 @@ export class CitationView extends BaseNodeView {
52
53
  this.dom.className = 'citation-wrapper';
53
54
  this.dom.innerHTML = '';
54
55
  this.dom.appendChild(element);
56
+ addCommentToLeafNode(this.getPos(), this.getPos() + this.node.nodeSize, this.view.state, this.dom);
55
57
  this.setDomAttrs(this.node, this.dom, ['rids', 'contents', 'selectedText']);
56
58
  };
57
59
  this.getCitation = () => {
@@ -36,6 +36,13 @@ export class CitationEditableView extends CitationView {
36
36
  constructor() {
37
37
  super(...arguments);
38
38
  this.decoder = new Decoder(new Map());
39
+ this.stopEvent = (event) => {
40
+ var _a;
41
+ const element = event.target;
42
+ return !!(element.classList.contains('point-comment') ||
43
+ element.classList.contains('comment-icon') ||
44
+ ((_a = element.parentElement) === null || _a === void 0 ? void 0 : _a.classList.contains('comment-icon')));
45
+ };
39
46
  this.selectNode = () => {
40
47
  var _a;
41
48
  const dataTracked = this.node.attrs.dataTracked;
@@ -115,16 +115,14 @@ export class FigureElementView extends BlockView {
115
115
  };
116
116
  }
117
117
  deleteSupplementNode(file) {
118
- if (file.type.id === 'supplementary') {
119
- const tr = this.view.state.tr;
120
- this.view.state.doc.descendants((node, pos) => {
121
- if (node.type === schema.nodes.supplement &&
122
- node.attrs.href === file.id) {
123
- tr.delete(pos, pos + node.nodeSize);
124
- }
125
- });
126
- this.view.dispatch(tr);
127
- }
118
+ const tr = this.view.state.tr;
119
+ this.view.state.doc.descendants((node, pos) => {
120
+ if (node.type === schema.nodes.supplement &&
121
+ node.attrs.href === file.id) {
122
+ tr.delete(pos, pos + node.nodeSize);
123
+ }
124
+ });
125
+ this.view.dispatch(tr);
128
126
  }
129
127
  }
130
128
  export default createNodeView(FigureElementView);
@@ -1,5 +1,5 @@
1
1
  import { CommentAnnotation } from '@manuscripts/json-schema';
2
- import { Plugin, PluginKey } from 'prosemirror-state';
2
+ import { EditorState, Plugin, PluginKey } from 'prosemirror-state';
3
3
  import { DecorationSet } from 'prosemirror-view';
4
4
  export declare const commentAnnotation: PluginKey<DecorationSet>;
5
5
  export declare const commentScroll: (id: string, direction: 'editor' | 'inspector', isHighlight?: boolean) => void;
@@ -11,3 +11,4 @@ interface CommentAnnotationProps {
11
11
  }
12
12
  declare const _default: (props: CommentAnnotationProps) => Plugin<DecorationSet>;
13
13
  export default _default;
14
+ export declare const addCommentToLeafNode: (from: number, to: number, state: EditorState, dom: HTMLElement) => void;
@@ -28,3 +28,9 @@ export interface SyncError {
28
28
  export type TrackableAttributes<T extends ManuscriptNode> = T['attrs'] & {
29
29
  dataTracked?: TrackedAttrs[];
30
30
  };
31
+ export type WidgetDecoration = Decoration & {
32
+ type: {
33
+ toDOM: () => HTMLElement;
34
+ spec: Decoration['spec'];
35
+ };
36
+ };
@@ -19,6 +19,7 @@ export declare class CitationEditableView extends CitationView<EditableBlockProp
19
19
  private decoder;
20
20
  private editor;
21
21
  private contextMenu;
22
+ stopEvent: (event: Event) => boolean;
22
23
  selectNode: () => void;
23
24
  deselectNode: () => void;
24
25
  destroy: () => void;
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": "1.8.2",
4
+ "version": "1.8.4-LEAN-2974-1",
5
5
  "repository": "github:Atypon-OpenSource/manuscripts-body-editor",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/cjs",
@@ -31,9 +31,9 @@
31
31
  "@manuscripts/assets": "^0.6.4",
32
32
  "@manuscripts/json-schema": "^2.2.7",
33
33
  "@manuscripts/library": "^1.3.6",
34
- "@manuscripts/style-guide": "1.11.1",
34
+ "@manuscripts/style-guide": "^1.11.2",
35
35
  "@manuscripts/track-changes-plugin": "1.7.9",
36
- "@manuscripts/transform": "2.2.0",
36
+ "@manuscripts/transform": "^2.2.1",
37
37
  "astrocite-eutils": "^0.16.4",
38
38
  "axios": "^1.6.7",
39
39
  "mathjax-full": "^3.2.2",
@@ -483,13 +483,6 @@ Next levels are shifted 'up' by 1
483
483
  top: 6px;
484
484
  }
485
485
 
486
- .block-comment-button.inline-citation {
487
- z-index: 1;
488
- left: -1%;
489
- top: -8%;
490
- display: inline-flex;
491
- }
492
-
493
486
  .block-comment-button.point-comment {
494
487
  z-index: 1;
495
488
  left: 0;