@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.
- package/dist/cjs/plugins/selected-suggestion-ui.js +4 -4
- package/dist/cjs/views/bibliography_element.js +55 -36
- package/dist/cjs/views/citation.js +0 -22
- package/dist/cjs/views/citation_editable.js +34 -5
- package/dist/es/plugins/selected-suggestion-ui.js +1 -1
- package/dist/es/views/bibliography_element.js +58 -39
- package/dist/es/views/citation.js +1 -20
- package/dist/es/views/citation_editable.js +35 -6
- package/dist/types/plugins/selected-suggestion-ui.d.ts +1 -0
- package/dist/types/views/bibliography_element.d.ts +6 -2
- package/dist/types/views/citation.d.ts +0 -1
- package/dist/types/views/citation_editable.d.ts +3 -0
- package/package.json +2 -2
- package/styles/AdvancedEditor.css +1 -0
- package/styles/Editor.css +4 -0
- package/styles/popper.css +8 -3
|
@@ -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
|
-
|
|
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.
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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 {
|
|
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 {
|
|
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.
|
|
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
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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",
|
package/styles/Editor.css
CHANGED
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);
|