@manuscripts/body-editor 1.7.25 → 1.7.26

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.
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.selectedSuggestionKey = exports.SET_SUGGESTION_ID = void 0;
18
+ exports.selectedSuggestionKey = exports.CLEAR_SUGGESTION_ID = exports.SET_SUGGESTION_ID = void 0;
19
19
  const track_changes_plugin_1 = require("@manuscripts/track-changes-plugin");
20
20
  const lodash_1 = require("lodash");
21
21
  const prosemirror_state_1 = require("prosemirror-state");
@@ -81,7 +81,7 @@ const getTrackChangesData = (node) => {
81
81
  return (_a = trackChangesMark === null || trackChangesMark === void 0 ? void 0 : trackChangesMark.attrs) === null || _a === void 0 ? void 0 : _a.dataTracked;
82
82
  };
83
83
  exports.SET_SUGGESTION_ID = 'SET_SELECTED_SUGGESTION_ID';
84
- const CLEAR_SUGGESTION_ID = 'CLEAR_SUGGESTION_ID';
84
+ exports.CLEAR_SUGGESTION_ID = 'CLEAR_SUGGESTION_ID';
85
85
  exports.selectedSuggestionKey = new prosemirror_state_1.PluginKey('selected_suggestion');
86
86
  exports.default = (props) => new prosemirror_state_1.Plugin({
87
87
  key: exports.selectedSuggestionKey,
@@ -93,7 +93,7 @@ exports.default = (props) => new prosemirror_state_1.Plugin({
93
93
  if (suggestionId) {
94
94
  return buildSelectedSuggestionDecoration(suggestionId, state, props);
95
95
  }
96
- if (tr.getMeta(CLEAR_SUGGESTION_ID)) {
96
+ if (tr.getMeta(exports.CLEAR_SUGGESTION_ID)) {
97
97
  props.setEditorSelectedSuggestion(undefined);
98
98
  return prosemirror_view_1.DecorationSet.empty;
99
99
  }
@@ -105,7 +105,7 @@ exports.default = (props) => new prosemirror_state_1.Plugin({
105
105
  const nodeClicked = view.state.doc.nodeAt(pos);
106
106
  const trackChangesData = nodeClicked && getTrackChangesData(nodeClicked);
107
107
  if (!trackChangesData) {
108
- view.dispatch(view.state.tr.setMeta(CLEAR_SUGGESTION_ID, true));
108
+ view.dispatch(view.state.tr.setMeta(exports.CLEAR_SUGGESTION_ID, true));
109
109
  props.setEditorSelectedSuggestion(undefined);
110
110
  }
111
111
  },
@@ -28,9 +28,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  };
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
30
  exports.BibliographyElementBlockView = void 0;
31
+ const style_guide_1 = require("@manuscripts/style-guide");
31
32
  const track_changes_plugin_1 = require("@manuscripts/track-changes-plugin");
32
33
  const transform_1 = require("@manuscripts/transform");
33
- const assets_1 = require("../assets");
34
34
  const dompurify_1 = require("../lib/dompurify");
35
35
  const track_changes_utils_1 = require("../lib/track-changes-utils");
36
36
  const view_1 = require("../lib/view");
@@ -45,8 +45,9 @@ class BibliographyElementBlockView extends block_view_1.default {
45
45
  constructor() {
46
46
  super(...arguments);
47
47
  this.decoder = new transform_1.Decoder(new Map());
48
- this.gutterButtons = () => [];
48
+ this.clickedElementId = null;
49
49
  this.showPopper = (id) => {
50
+ this.props.popper.destroy();
50
51
  const bib = (0, bibliography_1.getBibliographyPluginState)(this.view.state);
51
52
  const componentProps = {
52
53
  items: Array.from(bib.bibliographyItems.values()),
@@ -60,6 +61,52 @@ class BibliographyElementBlockView extends block_view_1.default {
60
61
  };
61
62
  this.stopEvent = () => true;
62
63
  this.ignoreMutation = () => true;
64
+ this.handleEdit = (citationId) => {
65
+ this.showPopper(citationId);
66
+ };
67
+ this.handleComment = (citationId) => {
68
+ this.props.setComment((0, transform_1.buildComment)(citationId));
69
+ };
70
+ this.showContextMenu = (elementId) => {
71
+ this.props.popper.destroy();
72
+ this.clickedElementId = null;
73
+ const can = this.props.getCapabilities();
74
+ const element = document.getElementById(elementId);
75
+ const componentProps = {
76
+ actions: [],
77
+ };
78
+ if (can.editCitationsAndRefs) {
79
+ componentProps.actions.push({
80
+ label: 'Edit',
81
+ action: () => this.handleEdit(elementId),
82
+ icon: 'EditIcon',
83
+ });
84
+ }
85
+ componentProps.actions.push({
86
+ label: 'Comment',
87
+ action: () => this.handleComment(elementId),
88
+ icon: 'AddComment',
89
+ });
90
+ this.contextMenu = (0, ReactSubView_1.default)(this.props, style_guide_1.ContextMenu, componentProps, this.node, this.getPos, this.view, 'context-menu');
91
+ this.props.popper.show(element, this.contextMenu, 'right-start');
92
+ };
93
+ this.onClickHandler = (elementId, dataTracked) => {
94
+ var _a;
95
+ this.clickedElementId = elementId;
96
+ const isSelectedSuggestion = !!((_a = selected_suggestion_ui_1.selectedSuggestionKey
97
+ .getState(this.view.state)) === null || _a === void 0 ? void 0 : _a.find(this.getPos(), this.getPos() + this.node.nodeSize).length);
98
+ if (dataTracked && dataTracked.status !== track_changes_plugin_1.CHANGE_STATUS.rejected) {
99
+ this.view.dispatch(this.view.state.tr.setMeta(selected_suggestion_ui_1.SET_SUGGESTION_ID, dataTracked.id));
100
+ }
101
+ else {
102
+ if (isSelectedSuggestion) {
103
+ this.view.dispatch(this.view.state.tr.setMeta(selected_suggestion_ui_1.CLEAR_SUGGESTION_ID, true));
104
+ }
105
+ else {
106
+ this.showContextMenu(elementId);
107
+ }
108
+ }
109
+ };
63
110
  this.updateContents = () => __awaiter(this, void 0, void 0, function* () {
64
111
  const bib = (0, bibliography_1.getBibliographyPluginState)(this.view.state);
65
112
  const commentsDecorationSet = comment_annotation_1.commentAnnotation.getState(this.view.state);
@@ -94,28 +141,6 @@ class BibliographyElementBlockView extends block_view_1.default {
94
141
  const id = meta.entry_ids[i];
95
142
  const fragment = bibliography[i];
96
143
  const element = (0, dompurify_1.sanitize)(`<div id="${id}" class="bib-item"><div class="csl-bib-body">${fragment}</div></div>`).firstElementChild;
97
- const doubleButton = document.createElement('div');
98
- const editButton = document.createElement('button');
99
- const commentButton = document.createElement('button');
100
- doubleButton.className = 'bibliography-double-button';
101
- editButton.className = 'bibliography-edit-button';
102
- commentButton.className = 'bibliography-comment-button';
103
- commentButton.addEventListener('click', (e) => {
104
- e.preventDefault();
105
- this.props.setComment((0, transform_1.buildComment)(element.id));
106
- });
107
- editButton.addEventListener('click', (e) => {
108
- e.preventDefault();
109
- this.showPopper(element.id);
110
- });
111
- editButton.innerHTML = assets_1.editIcon;
112
- commentButton.innerHTML = assets_1.commentIcon;
113
- doubleButton.append(editButton, commentButton);
114
- if (can.seeReferencesButtons &&
115
- !element.querySelector('.bibliography-double-button')) {
116
- element.appendChild(doubleButton);
117
- }
118
- editButton.disabled = !can.editCitationsAndRefs;
119
144
  const commentElement = commentElementMap.get(element.id);
120
145
  if (commentElement) {
121
146
  element.appendChild(commentElement);
@@ -123,16 +148,14 @@ class BibliographyElementBlockView extends block_view_1.default {
123
148
  const dataTracked = dataTrackedMap.get(element.id);
124
149
  if (dataTracked) {
125
150
  element.classList.add('attrs-track-mark', ...(0, track_changes_utils_1.getChangeClasses)([dataTracked]));
126
- if (dataTracked.status === track_changes_plugin_1.CHANGE_STATUS.pending &&
127
- dataTracked.operation === track_changes_plugin_1.CHANGE_OPERATION.set_node_attributes) {
128
- element.appendChild((0, track_changes_utils_1.getAttrsTrackingButton)(dataTracked.id));
129
- }
130
- this.addClickListenerToBibItem(element, dataTracked);
131
151
  }
132
152
  if (selectedBibItemSuggestion &&
133
153
  selectedBibItemSuggestion === element.id) {
134
154
  element.classList.add('selected-suggestion');
135
155
  }
156
+ if (can.seeReferencesButtons) {
157
+ element.addEventListener('click', () => this.onClickHandler(element.id, dataTracked));
158
+ }
136
159
  wrapper.append(element);
137
160
  }
138
161
  const oldContent = this.container.querySelector('.contents');
@@ -142,6 +165,9 @@ class BibliographyElementBlockView extends block_view_1.default {
142
165
  else {
143
166
  this.container.appendChild(wrapper);
144
167
  }
168
+ if (this.clickedElementId) {
169
+ this.showContextMenu(this.clickedElementId);
170
+ }
145
171
  });
146
172
  this.createElement = () => {
147
173
  this.container = document.createElement('div');
@@ -157,13 +183,6 @@ class BibliographyElementBlockView extends block_view_1.default {
157
183
  this.handleDelete = (item) => {
158
184
  (0, view_1.deleteNode)(this.view, item._id);
159
185
  };
160
- this.addClickListenerToBibItem = (element, dataTracked) => {
161
- if (dataTracked.status !== track_changes_plugin_1.CHANGE_STATUS.rejected) {
162
- element.addEventListener('click', () => {
163
- this.view.dispatch(this.view.state.tr.setMeta(selected_suggestion_ui_1.SET_SUGGESTION_ID, dataTracked.id));
164
- });
165
- }
166
- };
167
186
  }
168
187
  }
169
188
  exports.BibliographyElementBlockView = BibliographyElementBlockView;
@@ -14,15 +14,9 @@
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */
17
- var __importDefault = (this && this.__importDefault) || function (mod) {
18
- return (mod && mod.__esModule) ? mod : { "default": mod };
19
- };
20
17
  Object.defineProperty(exports, "__esModule", { value: true });
21
18
  exports.CitationView = void 0;
22
19
  const prosemirror_model_1 = require("prosemirror-model");
23
- const react_1 = require("react");
24
- const react_dom_1 = __importDefault(require("react-dom"));
25
- const TrackChangesReview_1 = require("../components/track-changes/TrackChangesReview");
26
20
  const dompurify_1 = require("../lib/dompurify");
27
21
  const track_changes_utils_1 = require("../lib/track-changes-utils");
28
22
  const bibliography_1 = require("../plugins/bibliography");
@@ -61,24 +55,8 @@ class CitationView extends base_node_view_1.BaseNodeView {
61
55
  this.dom.className = 'citation-wrapper';
62
56
  this.dom.innerHTML = '';
63
57
  this.dom.appendChild(element);
64
- if ((0, track_changes_utils_1.isPendingSetAttrs)(this.node) &&
65
- !(0, track_changes_utils_1.isDeleted)(this.node) &&
66
- citation.embeddedCitationItems.length) {
67
- this.dom.appendChild(this.renderTrackChangesReview());
68
- }
69
58
  this.setDomAttrs(this.node, this.dom, ['rids', 'contents', 'selectedText']);
70
59
  };
71
- this.renderTrackChangesReview = () => {
72
- const { popper } = this.props;
73
- const el = document.createElement('span');
74
- el.classList.add('track-changes-review');
75
- react_dom_1.default.render((0, react_1.createElement)(TrackChangesReview_1.TrackChangesReview, {
76
- node: this.node,
77
- popper,
78
- target: el,
79
- }), el);
80
- return el;
81
- };
82
60
  this.getCitation = () => {
83
61
  const citation = (0, bibliography_utils_1.getCitation)(this.node);
84
62
  if (!citation) {
@@ -29,6 +29,7 @@ const citation_sources_1 = require("../citation-sources");
29
29
  const track_changes_utils_1 = require("../lib/track-changes-utils");
30
30
  const view_1 = require("../lib/view");
31
31
  const bibliography_1 = require("../plugins/bibliography");
32
+ const selected_suggestion_ui_1 = require("../plugins/selected-suggestion-ui");
32
33
  const citation_1 = require("./citation");
33
34
  const CitationEditorWrapper_1 = require("./CitationEditorWrapper");
34
35
  const creators_1 = require("./creators");
@@ -42,14 +43,28 @@ class CitationEditableView extends citation_1.CitationView {
42
43
  super(...arguments);
43
44
  this.decoder = new transform_1.Decoder(new Map());
44
45
  this.selectNode = () => {
45
- if (!(0, track_changes_utils_1.isDeleted)(this.node)) {
46
- this.showPopper();
47
- this.dom.classList.add('ProseMirror-selectednode');
46
+ var _a;
47
+ const dataTracked = this.node.attrs.dataTracked;
48
+ const isSelectedSuggestion = !!((_a = selected_suggestion_ui_1.selectedSuggestionKey
49
+ .getState(this.view.state)) === null || _a === void 0 ? void 0 : _a.find(this.getPos(), this.getPos() + this.node.nodeSize).length);
50
+ this.dom.classList.add('ProseMirror-selectednode');
51
+ if (dataTracked && !isSelectedSuggestion) {
52
+ this.view.dispatch(this.view.state.tr.setMeta(selected_suggestion_ui_1.SET_SUGGESTION_ID, dataTracked[0].id));
53
+ }
54
+ else {
55
+ if (!(0, track_changes_utils_1.isDeleted)(this.node)) {
56
+ const citation = this.getCitation();
57
+ const rids = citation.embeddedCitationItems.map((i) => i.bibliographyItem);
58
+ if (!rids.length) {
59
+ this.showPopper();
60
+ }
61
+ else {
62
+ this.showContextMenu();
63
+ }
64
+ }
48
65
  }
49
66
  };
50
67
  this.deselectNode = () => {
51
- var _a;
52
- (_a = this.editor) === null || _a === void 0 ? void 0 : _a.remove();
53
68
  this.dom.classList.remove('ProseMirror-selectednode');
54
69
  this.props.popper.destroy();
55
70
  };
@@ -58,7 +73,18 @@ class CitationEditableView extends citation_1.CitationView {
58
73
  (_a = this.editor) === null || _a === void 0 ? void 0 : _a.remove();
59
74
  this.props.popper.destroy();
60
75
  };
76
+ this.showContextMenu = () => {
77
+ const componentProps = {
78
+ actions: [
79
+ { label: 'Edit', action: this.handleEdit, icon: 'EditIcon' },
80
+ { label: 'Comment', action: this.handleComment, icon: 'AddComment' },
81
+ ],
82
+ };
83
+ this.contextMenu = (0, ReactSubView_1.default)(this.props, style_guide_1.ContextMenu, componentProps, this.node, this.getPos, this.view, 'context-menu');
84
+ this.props.popper.show(this.dom, this.contextMenu, 'right-start', false);
85
+ };
61
86
  this.showPopper = () => {
87
+ this.props.popper.destroy();
62
88
  const can = this.props.getCapabilities();
63
89
  const citation = this.getCitation();
64
90
  const rids = citation.embeddedCitationItems.map((i) => i.bibliographyItem);
@@ -91,6 +117,9 @@ class CitationEditableView extends citation_1.CitationView {
91
117
  }
92
118
  this.props.popper.show(this.dom, this.editor, 'right');
93
119
  };
120
+ this.handleEdit = () => {
121
+ this.showPopper();
122
+ };
94
123
  this.handleCancel = () => {
95
124
  const selection = prosemirror_state_1.TextSelection.create(this.view.state.tr.doc, this.getPos() + 1);
96
125
  this.view.dispatch(this.view.state.tr.setSelection(selection));
@@ -78,7 +78,7 @@ const getTrackChangesData = (node) => {
78
78
  return (_a = trackChangesMark === null || trackChangesMark === void 0 ? void 0 : trackChangesMark.attrs) === null || _a === void 0 ? void 0 : _a.dataTracked;
79
79
  };
80
80
  export const SET_SUGGESTION_ID = 'SET_SELECTED_SUGGESTION_ID';
81
- const CLEAR_SUGGESTION_ID = 'CLEAR_SUGGESTION_ID';
81
+ export const CLEAR_SUGGESTION_ID = 'CLEAR_SUGGESTION_ID';
82
82
  export const selectedSuggestionKey = new PluginKey('selected_suggestion');
83
83
  export default (props) => new Plugin({
84
84
  key: selectedSuggestionKey,
@@ -22,15 +22,15 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
22
22
  step((generator = generator.apply(thisArg, _arguments || [])).next());
23
23
  });
24
24
  };
25
- import { CHANGE_OPERATION, CHANGE_STATUS, } from '@manuscripts/track-changes-plugin';
25
+ import { ContextMenu } from '@manuscripts/style-guide';
26
+ import { CHANGE_STATUS } from '@manuscripts/track-changes-plugin';
26
27
  import { buildComment, Decoder, } from '@manuscripts/transform';
27
- import { commentIcon, editIcon } from '../assets';
28
28
  import { sanitize } from '../lib/dompurify';
29
- import { getAttrsTrackingButton, getChangeClasses, } from '../lib/track-changes-utils';
29
+ import { getChangeClasses } from '../lib/track-changes-utils';
30
30
  import { deleteNode, updateNode } from '../lib/view';
31
31
  import { getBibliographyPluginState } from '../plugins/bibliography';
32
32
  import { commentAnnotation } from '../plugins/comment_annotation';
33
- import { selectedSuggestionKey, SET_SUGGESTION_ID, } from '../plugins/selected-suggestion-ui';
33
+ import { CLEAR_SUGGESTION_ID, selectedSuggestionKey, SET_SUGGESTION_ID, } from '../plugins/selected-suggestion-ui';
34
34
  import BlockView from './block_view';
35
35
  import { createNodeView } from './creators';
36
36
  import ReactSubView from './ReactSubView';
@@ -39,8 +39,9 @@ export class BibliographyElementBlockView extends BlockView {
39
39
  constructor() {
40
40
  super(...arguments);
41
41
  this.decoder = new Decoder(new Map());
42
- this.gutterButtons = () => [];
42
+ this.clickedElementId = null;
43
43
  this.showPopper = (id) => {
44
+ this.props.popper.destroy();
44
45
  const bib = getBibliographyPluginState(this.view.state);
45
46
  const componentProps = {
46
47
  items: Array.from(bib.bibliographyItems.values()),
@@ -54,6 +55,52 @@ export class BibliographyElementBlockView extends BlockView {
54
55
  };
55
56
  this.stopEvent = () => true;
56
57
  this.ignoreMutation = () => true;
58
+ this.handleEdit = (citationId) => {
59
+ this.showPopper(citationId);
60
+ };
61
+ this.handleComment = (citationId) => {
62
+ this.props.setComment(buildComment(citationId));
63
+ };
64
+ this.showContextMenu = (elementId) => {
65
+ this.props.popper.destroy();
66
+ this.clickedElementId = null;
67
+ const can = this.props.getCapabilities();
68
+ const element = document.getElementById(elementId);
69
+ const componentProps = {
70
+ actions: [],
71
+ };
72
+ if (can.editCitationsAndRefs) {
73
+ componentProps.actions.push({
74
+ label: 'Edit',
75
+ action: () => this.handleEdit(elementId),
76
+ icon: 'EditIcon',
77
+ });
78
+ }
79
+ componentProps.actions.push({
80
+ label: 'Comment',
81
+ action: () => this.handleComment(elementId),
82
+ icon: 'AddComment',
83
+ });
84
+ this.contextMenu = ReactSubView(this.props, ContextMenu, componentProps, this.node, this.getPos, this.view, 'context-menu');
85
+ this.props.popper.show(element, this.contextMenu, 'right-start');
86
+ };
87
+ this.onClickHandler = (elementId, dataTracked) => {
88
+ var _a;
89
+ this.clickedElementId = elementId;
90
+ const isSelectedSuggestion = !!((_a = selectedSuggestionKey
91
+ .getState(this.view.state)) === null || _a === void 0 ? void 0 : _a.find(this.getPos(), this.getPos() + this.node.nodeSize).length);
92
+ if (dataTracked && dataTracked.status !== CHANGE_STATUS.rejected) {
93
+ this.view.dispatch(this.view.state.tr.setMeta(SET_SUGGESTION_ID, dataTracked.id));
94
+ }
95
+ else {
96
+ if (isSelectedSuggestion) {
97
+ this.view.dispatch(this.view.state.tr.setMeta(CLEAR_SUGGESTION_ID, true));
98
+ }
99
+ else {
100
+ this.showContextMenu(elementId);
101
+ }
102
+ }
103
+ };
57
104
  this.updateContents = () => __awaiter(this, void 0, void 0, function* () {
58
105
  const bib = getBibliographyPluginState(this.view.state);
59
106
  const commentsDecorationSet = commentAnnotation.getState(this.view.state);
@@ -88,28 +135,6 @@ export class BibliographyElementBlockView extends BlockView {
88
135
  const id = meta.entry_ids[i];
89
136
  const fragment = bibliography[i];
90
137
  const element = sanitize(`<div id="${id}" class="bib-item"><div class="csl-bib-body">${fragment}</div></div>`).firstElementChild;
91
- const doubleButton = document.createElement('div');
92
- const editButton = document.createElement('button');
93
- const commentButton = document.createElement('button');
94
- doubleButton.className = 'bibliography-double-button';
95
- editButton.className = 'bibliography-edit-button';
96
- commentButton.className = 'bibliography-comment-button';
97
- commentButton.addEventListener('click', (e) => {
98
- e.preventDefault();
99
- this.props.setComment(buildComment(element.id));
100
- });
101
- editButton.addEventListener('click', (e) => {
102
- e.preventDefault();
103
- this.showPopper(element.id);
104
- });
105
- editButton.innerHTML = editIcon;
106
- commentButton.innerHTML = commentIcon;
107
- doubleButton.append(editButton, commentButton);
108
- if (can.seeReferencesButtons &&
109
- !element.querySelector('.bibliography-double-button')) {
110
- element.appendChild(doubleButton);
111
- }
112
- editButton.disabled = !can.editCitationsAndRefs;
113
138
  const commentElement = commentElementMap.get(element.id);
114
139
  if (commentElement) {
115
140
  element.appendChild(commentElement);
@@ -117,16 +142,14 @@ export class BibliographyElementBlockView extends BlockView {
117
142
  const dataTracked = dataTrackedMap.get(element.id);
118
143
  if (dataTracked) {
119
144
  element.classList.add('attrs-track-mark', ...getChangeClasses([dataTracked]));
120
- if (dataTracked.status === CHANGE_STATUS.pending &&
121
- dataTracked.operation === CHANGE_OPERATION.set_node_attributes) {
122
- element.appendChild(getAttrsTrackingButton(dataTracked.id));
123
- }
124
- this.addClickListenerToBibItem(element, dataTracked);
125
145
  }
126
146
  if (selectedBibItemSuggestion &&
127
147
  selectedBibItemSuggestion === element.id) {
128
148
  element.classList.add('selected-suggestion');
129
149
  }
150
+ if (can.seeReferencesButtons) {
151
+ element.addEventListener('click', () => this.onClickHandler(element.id, dataTracked));
152
+ }
130
153
  wrapper.append(element);
131
154
  }
132
155
  const oldContent = this.container.querySelector('.contents');
@@ -136,6 +159,9 @@ export class BibliographyElementBlockView extends BlockView {
136
159
  else {
137
160
  this.container.appendChild(wrapper);
138
161
  }
162
+ if (this.clickedElementId) {
163
+ this.showContextMenu(this.clickedElementId);
164
+ }
139
165
  });
140
166
  this.createElement = () => {
141
167
  this.container = document.createElement('div');
@@ -151,13 +177,6 @@ export class BibliographyElementBlockView extends BlockView {
151
177
  this.handleDelete = (item) => {
152
178
  deleteNode(this.view, item._id);
153
179
  };
154
- this.addClickListenerToBibItem = (element, dataTracked) => {
155
- if (dataTracked.status !== CHANGE_STATUS.rejected) {
156
- element.addEventListener('click', () => {
157
- this.view.dispatch(this.view.state.tr.setMeta(SET_SUGGESTION_ID, dataTracked.id));
158
- });
159
- }
160
- };
161
180
  }
162
181
  }
163
182
  export default createNodeView(BibliographyElementBlockView);
@@ -14,11 +14,8 @@
14
14
  * limitations under the License.
15
15
  */
16
16
  import { DOMSerializer } from 'prosemirror-model';
17
- import { createElement } from 'react';
18
- import ReactDOM from 'react-dom';
19
- import { TrackChangesReview } from '../components/track-changes/TrackChangesReview';
20
17
  import { sanitize } from '../lib/dompurify';
21
- import { getChangeClasses, isDeleted, isPendingSetAttrs, } from '../lib/track-changes-utils';
18
+ import { getChangeClasses } from '../lib/track-changes-utils';
22
19
  import { getBibliographyPluginState } from '../plugins/bibliography';
23
20
  import { getCitation } from '../plugins/bibliography/bibliography-utils';
24
21
  import { BaseNodeView } from './base_node_view';
@@ -55,24 +52,8 @@ export class CitationView extends BaseNodeView {
55
52
  this.dom.className = 'citation-wrapper';
56
53
  this.dom.innerHTML = '';
57
54
  this.dom.appendChild(element);
58
- if (isPendingSetAttrs(this.node) &&
59
- !isDeleted(this.node) &&
60
- citation.embeddedCitationItems.length) {
61
- this.dom.appendChild(this.renderTrackChangesReview());
62
- }
63
55
  this.setDomAttrs(this.node, this.dom, ['rids', 'contents', 'selectedText']);
64
56
  };
65
- this.renderTrackChangesReview = () => {
66
- const { popper } = this.props;
67
- const el = document.createElement('span');
68
- el.classList.add('track-changes-review');
69
- ReactDOM.render(createElement(TrackChangesReview, {
70
- node: this.node,
71
- popper,
72
- target: el,
73
- }), el);
74
- return el;
75
- };
76
57
  this.getCitation = () => {
77
58
  const citation = getCitation(this.node);
78
59
  if (!citation) {
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import { ObjectTypes, } from '@manuscripts/json-schema';
17
17
  import { findMatchingBibliographyItem } from '@manuscripts/library';
18
- import { CitationViewer, } from '@manuscripts/style-guide';
18
+ import { CitationViewer, ContextMenu, } from '@manuscripts/style-guide';
19
19
  import { buildComment, Decoder, schema, } from '@manuscripts/transform';
20
20
  import { TextSelection } from 'prosemirror-state';
21
21
  import { findChildren, findChildrenByType } from 'prosemirror-utils';
@@ -23,6 +23,7 @@ import { crossref } from '../citation-sources';
23
23
  import { isDeleted } from '../lib/track-changes-utils';
24
24
  import { deleteNode, updateNodeAttrs } from '../lib/view';
25
25
  import { getBibliographyPluginState } from '../plugins/bibliography';
26
+ import { selectedSuggestionKey, SET_SUGGESTION_ID, } from '../plugins/selected-suggestion-ui';
26
27
  import { CitationView } from './citation';
27
28
  import { CitationEditorWrapper } from './CitationEditorWrapper';
28
29
  import { createEditableNodeView } from './creators';
@@ -36,14 +37,28 @@ export class CitationEditableView extends CitationView {
36
37
  super(...arguments);
37
38
  this.decoder = new Decoder(new Map());
38
39
  this.selectNode = () => {
39
- if (!isDeleted(this.node)) {
40
- this.showPopper();
41
- this.dom.classList.add('ProseMirror-selectednode');
40
+ var _a;
41
+ const dataTracked = this.node.attrs.dataTracked;
42
+ const isSelectedSuggestion = !!((_a = selectedSuggestionKey
43
+ .getState(this.view.state)) === null || _a === void 0 ? void 0 : _a.find(this.getPos(), this.getPos() + this.node.nodeSize).length);
44
+ this.dom.classList.add('ProseMirror-selectednode');
45
+ if (dataTracked && !isSelectedSuggestion) {
46
+ this.view.dispatch(this.view.state.tr.setMeta(SET_SUGGESTION_ID, dataTracked[0].id));
47
+ }
48
+ else {
49
+ if (!isDeleted(this.node)) {
50
+ const citation = this.getCitation();
51
+ const rids = citation.embeddedCitationItems.map((i) => i.bibliographyItem);
52
+ if (!rids.length) {
53
+ this.showPopper();
54
+ }
55
+ else {
56
+ this.showContextMenu();
57
+ }
58
+ }
42
59
  }
43
60
  };
44
61
  this.deselectNode = () => {
45
- var _a;
46
- (_a = this.editor) === null || _a === void 0 ? void 0 : _a.remove();
47
62
  this.dom.classList.remove('ProseMirror-selectednode');
48
63
  this.props.popper.destroy();
49
64
  };
@@ -52,7 +67,18 @@ export class CitationEditableView extends CitationView {
52
67
  (_a = this.editor) === null || _a === void 0 ? void 0 : _a.remove();
53
68
  this.props.popper.destroy();
54
69
  };
70
+ this.showContextMenu = () => {
71
+ const componentProps = {
72
+ actions: [
73
+ { label: 'Edit', action: this.handleEdit, icon: 'EditIcon' },
74
+ { label: 'Comment', action: this.handleComment, icon: 'AddComment' },
75
+ ],
76
+ };
77
+ this.contextMenu = ReactSubView(this.props, ContextMenu, componentProps, this.node, this.getPos, this.view, 'context-menu');
78
+ this.props.popper.show(this.dom, this.contextMenu, 'right-start', false);
79
+ };
55
80
  this.showPopper = () => {
81
+ this.props.popper.destroy();
56
82
  const can = this.props.getCapabilities();
57
83
  const citation = this.getCitation();
58
84
  const rids = citation.embeddedCitationItems.map((i) => i.bibliographyItem);
@@ -85,6 +111,9 @@ export class CitationEditableView extends CitationView {
85
111
  }
86
112
  this.props.popper.show(this.dom, this.editor, 'right');
87
113
  };
114
+ this.handleEdit = () => {
115
+ this.showPopper();
116
+ };
88
117
  this.handleCancel = () => {
89
118
  const selection = TextSelection.create(this.view.state.tr.doc, this.getPos() + 1);
90
119
  this.view.dispatch(this.view.state.tr.setSelection(selection));
@@ -19,6 +19,7 @@ interface SelectedSuggestionProps {
19
19
  setEditorSelectedSuggestion: (id?: string) => void;
20
20
  }
21
21
  export declare const SET_SUGGESTION_ID = "SET_SELECTED_SUGGESTION_ID";
22
+ export declare const CLEAR_SUGGESTION_ID = "CLEAR_SUGGESTION_ID";
22
23
  export declare const selectedSuggestionKey: PluginKey<DecorationSet>;
23
24
  declare const _default: (props: SelectedSuggestionProps) => Plugin<DecorationSet>;
24
25
  export default _default;
@@ -23,16 +23,20 @@ interface BibliographyElementViewProps extends BaseNodeProps {
23
23
  export declare class BibliographyElementBlockView<PropsType extends BibliographyElementViewProps & EditableBlockProps> extends BlockView<PropsType> {
24
24
  private container;
25
25
  private editor;
26
+ private contextMenu;
26
27
  private decoder;
27
- gutterButtons: () => HTMLElement[];
28
+ private clickedElementId;
28
29
  showPopper: (id: string) => void;
29
30
  stopEvent: () => boolean;
30
31
  ignoreMutation: () => boolean;
32
+ private handleEdit;
33
+ private handleComment;
34
+ showContextMenu: (elementId: string) => void;
35
+ private onClickHandler;
31
36
  updateContents: () => Promise<void>;
32
37
  createElement: () => void;
33
38
  private handleSave;
34
39
  private handleDelete;
35
- private addClickListenerToBibItem;
36
40
  }
37
41
  declare const _default: (props: BaseNodeProps, dispatch?: import("..").Dispatch | undefined) => import("../types").NodeViewCreator<BibliographyElementBlockView<any>>;
38
42
  export default _default;
@@ -19,7 +19,6 @@ export declare class CitationView<PropsType extends BaseNodeProps> extends BaseN
19
19
  ignoreMutation: () => boolean;
20
20
  initialise: () => this;
21
21
  updateContents: () => void;
22
- renderTrackChangesReview: () => HTMLSpanElement;
23
22
  getCitation: () => import("@manuscripts/json-schema/dist/types").Citation;
24
23
  }
25
24
  declare const _default: (props: BaseNodeProps, dispatch?: import("..").Dispatch | undefined) => import("../types").NodeViewCreator<CitationView<any>>;
@@ -18,10 +18,13 @@ import { EditableBlockProps } from './editable_block';
18
18
  export declare class CitationEditableView extends CitationView<EditableBlockProps> {
19
19
  private decoder;
20
20
  private editor;
21
+ private contextMenu;
21
22
  selectNode: () => void;
22
23
  deselectNode: () => void;
23
24
  destroy: () => void;
25
+ showContextMenu: () => void;
24
26
  showPopper: () => void;
27
+ private handleEdit;
25
28
  private handleCancel;
26
29
  private handleSave;
27
30
  private handleUncite;
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.7.25",
4
+ "version": "1.7.26",
5
5
  "repository": "github:Atypon-OpenSource/manuscripts-body-editor",
6
6
  "license": "Apache-2.0",
7
7
  "main": "dist/cjs",
@@ -31,7 +31,7 @@
31
31
  "@manuscripts/assets": "^0.6.4",
32
32
  "@manuscripts/json-schema": "^2.2.6",
33
33
  "@manuscripts/library": "^1.3.5",
34
- "@manuscripts/style-guide": "1.8.1",
34
+ "@manuscripts/style-guide": "1.8.2",
35
35
  "@manuscripts/track-changes-plugin": "1.7.8",
36
36
  "@manuscripts/transform": "^2.1.6",
37
37
  "astrocite-eutils": "^0.16.4",
@@ -741,6 +741,7 @@ Next levels are shifted 'up' by 1
741
741
  .citation-wrapper {
742
742
  position: relative;
743
743
  }
744
+
744
745
  .track-changes-review {
745
746
  display: none;
746
747
  height: 36px;
package/styles/Editor.css CHANGED
@@ -671,6 +671,10 @@
671
671
  cursor: ns-resize;
672
672
  opacity: 0;
673
673
  transition: 0.2s all;
674
+ }
675
+
676
+ .ProseMirror .block-section_title .block-gutter,
677
+ .ProseMirror .block-paragraph .block-gutter {
674
678
  margin-top: 16px;
675
679
  }
676
680
 
package/styles/popper.css CHANGED
@@ -1,11 +1,10 @@
1
1
  .popper {
2
2
  color: #353535;
3
3
  font-family: 'PT Sans', sans-serif;
4
- min-width: 100px;
4
+ /* min-width: 100px; */
5
5
  position: absolute;
6
6
  width: auto;
7
7
  z-index: 5;
8
- /*opacity: 0.9;*/
9
8
  }
10
9
 
11
10
  .popper-arrow {
@@ -136,7 +135,8 @@
136
135
  .popper .cross-reference-editor,
137
136
  .popper .citation-references,
138
137
  .popper .track-changes-review-panel,
139
- .popper .table-footnote-editor {
138
+ .popper .table-footnote-editor,
139
+ .popper .context-menu {
140
140
  background: #fff;
141
141
  border: 1px solid #e2e2e2;
142
142
  border-radius: 8px;
@@ -144,6 +144,11 @@
144
144
  height: auto;
145
145
  }
146
146
 
147
+ .popper .context-menu {
148
+ width: auto;
149
+ top: -12px;
150
+ }
151
+
147
152
  .popper .conflict-dropdown {
148
153
  background: #fff;
149
154
  box-shadow: 0 4px 9px 0 rgba(84, 83, 83, 0.3);