@manuscripts/body-editor 2.7.8 → 2.7.9-LEAN-4096.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/views/FigureDropdown.js +2 -44
- package/dist/cjs/configs/editor-plugins.js +2 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/lib/context-menu.js +71 -4
- package/dist/cjs/lib/utils.js +16 -1
- package/dist/cjs/plugins/inspector-actions.js +70 -0
- package/dist/cjs/versions.js +1 -1
- package/dist/cjs/views/ReactSubView.js +4 -1
- package/dist/cjs/views/figure.js +7 -1
- package/dist/cjs/views/figure_editable.js +79 -3
- package/dist/cjs/views/figure_element.js +0 -79
- package/dist/es/components/views/FigureDropdown.js +2 -43
- package/dist/es/configs/editor-plugins.js +2 -0
- package/dist/es/index.js +1 -0
- package/dist/es/lib/context-menu.js +72 -5
- package/dist/es/lib/utils.js +14 -0
- package/dist/es/plugins/inspector-actions.js +67 -0
- package/dist/es/versions.js +1 -1
- package/dist/es/views/ReactSubView.js +4 -1
- package/dist/es/views/figure.js +6 -0
- package/dist/es/views/figure_editable.js +81 -5
- package/dist/es/views/figure_element.js +0 -79
- package/dist/types/components/views/FigureDropdown.d.ts +0 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/lib/context-menu.d.ts +3 -0
- package/dist/types/lib/utils.d.ts +3 -2
- package/dist/types/plugins/inspector-actions.d.ts +26 -0
- package/dist/types/versions.d.ts +1 -1
- package/dist/types/views/figure.d.ts +5 -0
- package/dist/types/views/figure_editable.d.ts +4 -0
- package/dist/types/views/figure_element.d.ts +0 -3
- package/package.json +2 -2
- package/styles/AdvancedEditor.css +17 -6
- package/styles/Editor.css +9 -0
- package/styles/popper.css +35 -4
|
@@ -3,31 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.FigureOptions =
|
|
6
|
+
exports.FigureOptions = void 0;
|
|
7
7
|
const style_guide_1 = require("@manuscripts/style-guide");
|
|
8
8
|
const react_1 = __importDefault(require("react"));
|
|
9
9
|
const styled_components_1 = __importDefault(require("styled-components"));
|
|
10
|
-
const FigureElementOptions = ({ can, files, onAdd, onUpload, hasUploadedImage, }) => {
|
|
11
|
-
const { isOpen, toggleOpen, wrapperRef } = (0, style_guide_1.useDropdown)();
|
|
12
|
-
const supplements = files.supplements
|
|
13
|
-
.map((s) => s.file)
|
|
14
|
-
.filter((f) => (0, style_guide_1.isImageFile)(f.name));
|
|
15
|
-
const others = files.others.filter((f) => (0, style_guide_1.isImageFile)(f.name));
|
|
16
|
-
return (react_1.default.createElement(FilesDropdownWrapper, { onClick: toggleOpen, ref: wrapperRef },
|
|
17
|
-
react_1.default.createElement(FilesButton, { disabled: hasUploadedImage },
|
|
18
|
-
react_1.default.createElement(style_guide_1.AttachIcon, null)),
|
|
19
|
-
isOpen && (react_1.default.createElement(style_guide_1.DropdownList, { direction: 'left', width: 208, height: 187, onClick: toggleOpen, top: 7 },
|
|
20
|
-
react_1.default.createElement(NestedDropdown, { disabled: !can.replaceFile || supplements.length < 1, parentToggleOpen: toggleOpen, buttonText: 'Supplements', list: react_1.default.createElement(react_1.default.Fragment, null, supplements.map((file) => (react_1.default.createElement(ListItemButton, { key: file.id, onClick: () => onAdd(file) },
|
|
21
|
-
(0, style_guide_1.getFileIcon)(file.name),
|
|
22
|
-
react_1.default.createElement(ListItemText, null, file.name))))) }),
|
|
23
|
-
react_1.default.createElement(NestedDropdown, { disabled: !can.replaceFile || others.length < 1, parentToggleOpen: toggleOpen, buttonText: 'Other files', list: react_1.default.createElement(react_1.default.Fragment, null, others.map((file) => (react_1.default.createElement(ListItemButton, { key: file.id, onClick: () => onAdd(file) },
|
|
24
|
-
(0, style_guide_1.getFileIcon)(file.name),
|
|
25
|
-
react_1.default.createElement(ListItemText, null, file.name))))) }),
|
|
26
|
-
react_1.default.createElement(UploadButton, { onClick: onUpload, disabled: !can.uploadFile },
|
|
27
|
-
react_1.default.createElement(style_guide_1.AddIcon, null),
|
|
28
|
-
" New file...")))));
|
|
29
|
-
};
|
|
30
|
-
exports.FigureElementOptions = FigureElementOptions;
|
|
31
10
|
const FigureOptions = ({ can, files, onDownload, onUpload, onDetach, onReplace, }) => {
|
|
32
11
|
const { isOpen, toggleOpen, wrapperRef } = (0, style_guide_1.useDropdown)();
|
|
33
12
|
const otherFiles = files.others.filter((f) => (0, style_guide_1.isImageFile)(f.name));
|
|
@@ -39,7 +18,6 @@ const FigureOptions = ({ can, files, onDownload, onUpload, onDetach, onReplace,
|
|
|
39
18
|
react_1.default.createElement(OptionsButton, { className: 'options-button', onClick: toggleOpen },
|
|
40
19
|
react_1.default.createElement(style_guide_1.DotsIcon, null)),
|
|
41
20
|
isOpen && (react_1.default.createElement(OptionsDropdownList, { direction: 'right', width: 128, top: 5 },
|
|
42
|
-
react_1.default.createElement(ListItemButton, { onClick: onDownload, disabled: !showDownload }, "Download"),
|
|
43
21
|
react_1.default.createElement(NestedDropdown, { disabled: !showReplace, parentToggleOpen: toggleOpen, buttonText: 'Replace', moveLeft: true, list: react_1.default.createElement(react_1.default.Fragment, null,
|
|
44
22
|
otherFiles.map((file, index) => (react_1.default.createElement(ListItemButton, { key: file.id, id: index.toString(), onClick: () => onReplace && onReplace(file) },
|
|
45
23
|
(0, style_guide_1.getFileIcon)(file.name),
|
|
@@ -47,6 +25,7 @@ const FigureOptions = ({ can, files, onDownload, onUpload, onDetach, onReplace,
|
|
|
47
25
|
react_1.default.createElement(UploadButton, { onClick: onUpload, disabled: !showUpload },
|
|
48
26
|
react_1.default.createElement(style_guide_1.UploadIcon, null),
|
|
49
27
|
" Upload new...")) }),
|
|
28
|
+
react_1.default.createElement(ListItemButton, { onClick: onDownload, disabled: !showDownload }, "Download"),
|
|
50
29
|
react_1.default.createElement(ListItemButton, { onClick: onDetach, disabled: !showDetach }, "Detach")))));
|
|
51
30
|
};
|
|
52
31
|
exports.FigureOptions = FigureOptions;
|
|
@@ -75,9 +54,6 @@ const OptionsButton = (0, styled_components_1.default)(style_guide_1.IconButton)
|
|
|
75
54
|
margin: ${(props) => props.theme.grid.unit}px;
|
|
76
55
|
visibility: hidden;
|
|
77
56
|
background: white;
|
|
78
|
-
position: absolute;
|
|
79
|
-
top: -4px;
|
|
80
|
-
right: 4%;
|
|
81
57
|
|
|
82
58
|
&:hover {
|
|
83
59
|
background: #f2fbfc !important;
|
|
@@ -119,24 +95,6 @@ const ListItemText = styled_components_1.default.div `
|
|
|
119
95
|
text-overflow: ellipsis;
|
|
120
96
|
text-align: start;
|
|
121
97
|
`;
|
|
122
|
-
const FilesButton = (0, styled_components_1.default)(style_guide_1.RoundIconButton) `
|
|
123
|
-
path {
|
|
124
|
-
stroke: #6e6e6e;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
&:active,
|
|
128
|
-
&:focus {
|
|
129
|
-
path {
|
|
130
|
-
stroke: #1a9bc7;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
`;
|
|
134
|
-
const FilesDropdownWrapper = styled_components_1.default.div `
|
|
135
|
-
position: absolute;
|
|
136
|
-
top: 8px;
|
|
137
|
-
left: 70px;
|
|
138
|
-
z-index: 1;
|
|
139
|
-
`;
|
|
140
98
|
const NestedListButton = (0, styled_components_1.default)(ListItemButton) `
|
|
141
99
|
width: 100%;
|
|
142
100
|
&:active,
|
|
@@ -34,6 +34,7 @@ const doi_1 = __importDefault(require("../plugins/doi"));
|
|
|
34
34
|
const editor_props_1 = __importDefault(require("../plugins/editor-props"));
|
|
35
35
|
const elements_1 = __importDefault(require("../plugins/elements"));
|
|
36
36
|
const footnotes_1 = __importDefault(require("../plugins/footnotes"));
|
|
37
|
+
const inspector_actions_1 = __importDefault(require("../plugins/inspector-actions"));
|
|
37
38
|
const objects_1 = __importDefault(require("../plugins/objects"));
|
|
38
39
|
const paragraphs_1 = __importDefault(require("../plugins/paragraphs"));
|
|
39
40
|
const persist_1 = __importDefault(require("../plugins/persist"));
|
|
@@ -75,6 +76,7 @@ exports.default = (props) => {
|
|
|
75
76
|
(0, doi_1.default)(),
|
|
76
77
|
(0, section_category_1.default)(props),
|
|
77
78
|
(0, cross_references_1.default)(),
|
|
79
|
+
(0, inspector_actions_1.default)(),
|
|
78
80
|
];
|
|
79
81
|
if (props.collabProvider) {
|
|
80
82
|
allPlugins.push((0, prosemirror_collab_1.collab)({ version: props.collabProvider.currentVersion }));
|
package/dist/cjs/index.js
CHANGED
|
@@ -68,3 +68,4 @@ Object.defineProperty(exports, "metadata", { enumerable: true, get: function ()
|
|
|
68
68
|
var authors_1 = require("./lib/authors");
|
|
69
69
|
Object.defineProperty(exports, "authorLabel", { enumerable: true, get: function () { return authors_1.authorLabel; } });
|
|
70
70
|
Object.defineProperty(exports, "affiliationLabel", { enumerable: true, get: function () { return authors_1.affiliationLabel; } });
|
|
71
|
+
__exportStar(require("./plugins/inspector-actions"), exports);
|
|
@@ -16,9 +16,13 @@
|
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.ContextMenu = exports.contextMenuBtnClass = exports.sectionLevel = void 0;
|
|
19
|
+
const style_guide_1 = require("@manuscripts/style-guide");
|
|
19
20
|
const transform_1 = require("@manuscripts/transform");
|
|
20
21
|
const prosemirror_utils_1 = require("prosemirror-utils");
|
|
22
|
+
const react_1 = require("react");
|
|
23
|
+
const server_1 = require("react-dom/server");
|
|
21
24
|
const commands_1 = require("../commands");
|
|
25
|
+
const figure_1 = require("../views/figure");
|
|
22
26
|
const popper_1 = require("./popper");
|
|
23
27
|
const utils_1 = require("./utils");
|
|
24
28
|
const popper = new popper_1.PopperManager();
|
|
@@ -42,6 +46,8 @@ const hasAny = (set, ...items) => {
|
|
|
42
46
|
return items.some((i) => set.has(i));
|
|
43
47
|
};
|
|
44
48
|
exports.contextMenuBtnClass = 'btn-context-menu';
|
|
49
|
+
const contextSubmenuBtnClass = 'context-submenu-trigger';
|
|
50
|
+
const contextSubmenuClass = 'context-submenu';
|
|
45
51
|
class ContextMenu {
|
|
46
52
|
constructor(node, view, getPos, actions = {}) {
|
|
47
53
|
this.showAddMenu = (target, after) => {
|
|
@@ -150,6 +156,36 @@ class ContextMenu {
|
|
|
150
156
|
const $pos = this.resolvePos();
|
|
151
157
|
const isBox = isBoxElementSectionTitle($pos, this.node);
|
|
152
158
|
const type = isBox ? transform_1.schema.nodes.box_element : this.node.type;
|
|
159
|
+
if (type === transform_1.schema.nodes.figure_element) {
|
|
160
|
+
const figure = (0, utils_1.getMatchingChild)(this.node, (node) => node.type === transform_1.schema.nodes.figure);
|
|
161
|
+
if (figure) {
|
|
162
|
+
const attrType = figure.attrs.type;
|
|
163
|
+
const { state, dispatch } = this.view;
|
|
164
|
+
const submenuOptions = [
|
|
165
|
+
{
|
|
166
|
+
title: 'Left',
|
|
167
|
+
action: () => (0, utils_1.updateNodeAttributes)(state, dispatch, figure.attrs.id, Object.assign(Object.assign({}, figure.attrs), { type: figure_1.figurePositions.left })),
|
|
168
|
+
Icon: style_guide_1.ImageLeftIcon,
|
|
169
|
+
selected: attrType === figure_1.figurePositions.left,
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
title: 'Default',
|
|
173
|
+
action: () => (0, utils_1.updateNodeAttributes)(state, dispatch, figure.attrs.id, Object.assign(Object.assign({}, figure.attrs), { type: figure_1.figurePositions.default })),
|
|
174
|
+
Icon: style_guide_1.ImageDefaultIcon,
|
|
175
|
+
selected: !attrType,
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
title: 'Right',
|
|
179
|
+
action: () => (0, utils_1.updateNodeAttributes)(state, dispatch, figure.attrs.id, Object.assign(Object.assign({}, figure.attrs), { type: figure_1.figurePositions.right })),
|
|
180
|
+
Icon: style_guide_1.ImageRightIcon,
|
|
181
|
+
selected: attrType === figure_1.figurePositions.right,
|
|
182
|
+
},
|
|
183
|
+
];
|
|
184
|
+
const submenuLabel = 'Position';
|
|
185
|
+
const submenu = this.createSubmenu(submenuLabel, submenuOptions);
|
|
186
|
+
menu.appendChild(submenu);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
153
189
|
if (type === transform_1.schema.nodes.list) {
|
|
154
190
|
menu.appendChild(this.createMenuSection((section) => {
|
|
155
191
|
const attrs = this.node.attrs;
|
|
@@ -214,22 +250,48 @@ class ContextMenu {
|
|
|
214
250
|
popper.show(target, menu, 'right', true);
|
|
215
251
|
this.addPopperEventListeners();
|
|
216
252
|
};
|
|
217
|
-
this.
|
|
253
|
+
this.createSubmenuTrigger = (contents) => {
|
|
254
|
+
const item = document.createElement('div');
|
|
255
|
+
item.className = 'menu-item';
|
|
256
|
+
const textNode = document.createTextNode(contents);
|
|
257
|
+
item.innerHTML = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(style_guide_1.TriangleCollapsedIcon));
|
|
258
|
+
item.prepend(textNode);
|
|
259
|
+
item.classList.add(contextSubmenuBtnClass);
|
|
260
|
+
item.addEventListener('mousedown', this.toggleSubmenu);
|
|
261
|
+
return item;
|
|
262
|
+
};
|
|
263
|
+
this.createMenuItem = (contents, handler, Icon = null, selected = false) => {
|
|
218
264
|
const item = document.createElement('div');
|
|
219
265
|
item.className = 'menu-item';
|
|
220
|
-
item.
|
|
266
|
+
selected && item.classList.add('selected');
|
|
267
|
+
if (Icon) {
|
|
268
|
+
item.innerHTML = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(Icon));
|
|
269
|
+
}
|
|
270
|
+
const textNode = document.createTextNode(contents);
|
|
271
|
+
item.appendChild(textNode);
|
|
221
272
|
item.addEventListener('mousedown', (event) => {
|
|
222
273
|
event.preventDefault();
|
|
223
274
|
handler(event);
|
|
224
275
|
});
|
|
225
276
|
return item;
|
|
226
277
|
};
|
|
227
|
-
this.createMenuSection = (createMenuItems) => {
|
|
278
|
+
this.createMenuSection = (createMenuItems, isSubmenu = false) => {
|
|
228
279
|
const section = document.createElement('div');
|
|
229
280
|
section.className = 'menu-section';
|
|
281
|
+
isSubmenu && section.classList.add('menu');
|
|
230
282
|
createMenuItems(section);
|
|
231
283
|
return section;
|
|
232
284
|
};
|
|
285
|
+
this.createSubmenu = (submenuLabel, items) => {
|
|
286
|
+
const submenu = document.createElement('div');
|
|
287
|
+
submenu.classList.add('menu-section', contextSubmenuClass);
|
|
288
|
+
submenu.append(this.createSubmenuTrigger(submenuLabel), this.createMenuSection((section) => {
|
|
289
|
+
items.forEach(({ title, action, Icon, selected }) => {
|
|
290
|
+
section.appendChild(this.createMenuItem(title, action, Icon, selected));
|
|
291
|
+
});
|
|
292
|
+
}, true));
|
|
293
|
+
return submenu;
|
|
294
|
+
};
|
|
233
295
|
this.insertableTypes = (after, insertPos, endPos) => {
|
|
234
296
|
const { nodes } = transform_1.schema;
|
|
235
297
|
const insertable = new Set();
|
|
@@ -291,7 +353,8 @@ class ContextMenu {
|
|
|
291
353
|
this.addPopperEventListeners = () => {
|
|
292
354
|
const mouseListener = (event) => {
|
|
293
355
|
const target = event.target;
|
|
294
|
-
if (target.classList.contains(exports.contextMenuBtnClass)
|
|
356
|
+
if (target.classList.contains(exports.contextMenuBtnClass) ||
|
|
357
|
+
target.classList.contains(contextSubmenuBtnClass)) {
|
|
295
358
|
return;
|
|
296
359
|
}
|
|
297
360
|
window.requestAnimationFrame(() => {
|
|
@@ -323,6 +386,10 @@ class ContextMenu {
|
|
|
323
386
|
}
|
|
324
387
|
return this.node;
|
|
325
388
|
};
|
|
389
|
+
this.toggleSubmenu = (ev) => {
|
|
390
|
+
const submenu = ev.target.nextElementSibling;
|
|
391
|
+
submenu === null || submenu === void 0 ? void 0 : submenu.classList.toggle('show');
|
|
392
|
+
};
|
|
326
393
|
this.node = node;
|
|
327
394
|
this.view = view;
|
|
328
395
|
this.getPos = getPos;
|
package/dist/cjs/lib/utils.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.createHeader = exports.isSelectionInNode = exports.isChildOfNodeTypes = exports.findParentElement = exports.findParentSection = exports.findParentNodeWithIdValue = exports.findParentNodeWithId = exports.getChildOfType = exports.getMatchingDescendant = exports.getMatchingChild = exports.iterateChildren = void 0;
|
|
18
|
+
exports.updateNodeAttributes = exports.createHeader = exports.isSelectionInNode = exports.isChildOfNodeTypes = exports.findParentElement = exports.findParentSection = exports.findParentNodeWithIdValue = exports.findParentNodeWithId = exports.getChildOfType = exports.getMatchingDescendant = exports.getMatchingChild = exports.iterateChildren = void 0;
|
|
19
19
|
const transform_1 = require("@manuscripts/transform");
|
|
20
20
|
const prosemirror_utils_1 = require("prosemirror-utils");
|
|
21
21
|
function* iterateChildren(node, recurse = false) {
|
|
@@ -86,3 +86,18 @@ const createHeader = (typeName, text) => {
|
|
|
86
86
|
return header;
|
|
87
87
|
};
|
|
88
88
|
exports.createHeader = createHeader;
|
|
89
|
+
const updateNodeAttributes = (state, dispatch, id, attrs) => {
|
|
90
|
+
let nodePosition = -1;
|
|
91
|
+
state.doc.descendants((node, pos) => {
|
|
92
|
+
if (node.attrs.id === id) {
|
|
93
|
+
nodePosition = pos;
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
if (nodePosition !== -1) {
|
|
98
|
+
dispatch(state.tr.setNodeMarkup(nodePosition, null, attrs));
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
return false;
|
|
102
|
+
};
|
|
103
|
+
exports.updateNodeAttributes = updateNodeAttributes;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* © 2022 Atypon Systems LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.inspectorActionPluginKey = void 0;
|
|
19
|
+
const prosemirror_state_1 = require("prosemirror-state");
|
|
20
|
+
exports.inspectorActionPluginKey = new prosemirror_state_1.PluginKey('inspectorActionPlugin');
|
|
21
|
+
exports.default = () => {
|
|
22
|
+
return new prosemirror_state_1.Plugin({
|
|
23
|
+
key: exports.inspectorActionPluginKey,
|
|
24
|
+
state: {
|
|
25
|
+
init: () => ({
|
|
26
|
+
inspectorOpenTabs: {
|
|
27
|
+
primaryTab: null,
|
|
28
|
+
secondaryTab: null,
|
|
29
|
+
},
|
|
30
|
+
}),
|
|
31
|
+
apply: (tr, value) => {
|
|
32
|
+
const meta = tr.getMeta(exports.inspectorActionPluginKey);
|
|
33
|
+
if (meta && meta.inspectorOpenTabs !== undefined) {
|
|
34
|
+
return Object.assign(Object.assign({}, value), { inspectorOpenTabs: meta.inspectorOpenTabs });
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
props: {
|
|
40
|
+
handleClick: (view, pos, event) => {
|
|
41
|
+
const target = event.target;
|
|
42
|
+
const inspectorOpenTabs = {
|
|
43
|
+
primaryTab: null,
|
|
44
|
+
secondaryTab: null,
|
|
45
|
+
};
|
|
46
|
+
switch (target.dataset.action) {
|
|
47
|
+
case 'open-other-files':
|
|
48
|
+
event.stopPropagation();
|
|
49
|
+
inspectorOpenTabs.primaryTab = 'files';
|
|
50
|
+
inspectorOpenTabs.secondaryTab = 'other-files';
|
|
51
|
+
break;
|
|
52
|
+
case 'open-supplement-files':
|
|
53
|
+
event.stopPropagation();
|
|
54
|
+
inspectorOpenTabs.primaryTab = 'files';
|
|
55
|
+
inspectorOpenTabs.secondaryTab = 'supplements-files';
|
|
56
|
+
break;
|
|
57
|
+
default:
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
if (inspectorOpenTabs) {
|
|
61
|
+
const tr = view.state.tr.setMeta(exports.inspectorActionPluginKey, {
|
|
62
|
+
inspectorOpenTabs,
|
|
63
|
+
});
|
|
64
|
+
view.dispatch(tr);
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
});
|
|
70
|
+
};
|
package/dist/cjs/versions.js
CHANGED
|
@@ -25,7 +25,10 @@ function createSubView(props, Component, componentProps, node, getPos, view, cla
|
|
|
25
25
|
const container = document.createElement('div');
|
|
26
26
|
container.classList.add('tools-panel');
|
|
27
27
|
if (classNames) {
|
|
28
|
-
|
|
28
|
+
const names = classNames.split(', ');
|
|
29
|
+
names.forEach((name) => {
|
|
30
|
+
container.classList.add(name);
|
|
31
|
+
});
|
|
29
32
|
container.setAttribute('data-cy', classNames);
|
|
30
33
|
}
|
|
31
34
|
container.setAttribute('contenteditable', 'false');
|
package/dist/cjs/views/figure.js
CHANGED
|
@@ -15,9 +15,15 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.FigureView = void 0;
|
|
18
|
+
exports.FigureView = exports.figurePositions = void 0;
|
|
19
19
|
const base_node_view_1 = require("./base_node_view");
|
|
20
20
|
const creators_1 = require("./creators");
|
|
21
|
+
var figurePositions;
|
|
22
|
+
(function (figurePositions) {
|
|
23
|
+
figurePositions["left"] = "half-left";
|
|
24
|
+
figurePositions["right"] = "half-right";
|
|
25
|
+
figurePositions["default"] = "";
|
|
26
|
+
})(figurePositions = exports.figurePositions || (exports.figurePositions = {}));
|
|
21
27
|
class FigureView extends base_node_view_1.BaseNodeView {
|
|
22
28
|
constructor() {
|
|
23
29
|
super(...arguments);
|
|
@@ -33,6 +33,7 @@ const react_1 = require("react");
|
|
|
33
33
|
const server_1 = require("react-dom/server");
|
|
34
34
|
const FigureDropdown_1 = require("../components/views/FigureDropdown");
|
|
35
35
|
const files_1 = require("../lib/files");
|
|
36
|
+
const utils_1 = require("../lib/utils");
|
|
36
37
|
const creators_1 = require("./creators");
|
|
37
38
|
const figure_1 = require("./figure");
|
|
38
39
|
const figure_uploader_1 = require("./figure_uploader");
|
|
@@ -84,11 +85,76 @@ class FigureEditableView extends figure_1.FigureView {
|
|
|
84
85
|
element.classList.add('figure', 'placeholder');
|
|
85
86
|
const instructions = document.createElement('div');
|
|
86
87
|
instructions.classList.add('instructions');
|
|
87
|
-
instructions.
|
|
88
|
-
|
|
88
|
+
instructions.innerHTML = `
|
|
89
|
+
<p>Drag or click here to upload image <br>
|
|
90
|
+
or drag items here from the file inspector tabs <br>
|
|
91
|
+
<a data-action='open-other-files'>Other file</a> |
|
|
92
|
+
<a data-action='open-supplement-files'>Supplements</a></p>
|
|
93
|
+
`;
|
|
89
94
|
element.appendChild(instructions);
|
|
90
95
|
return element;
|
|
91
96
|
};
|
|
97
|
+
this.createPositionMenuWrapper = () => {
|
|
98
|
+
this.positionMenuWrapper = document.createElement('div');
|
|
99
|
+
this.positionMenuWrapper.classList.add('position-menu');
|
|
100
|
+
const positionMenuButton = document.createElement('div');
|
|
101
|
+
positionMenuButton.classList.add('position-menu-button');
|
|
102
|
+
let icon;
|
|
103
|
+
switch (this.figurePosition) {
|
|
104
|
+
case figure_1.figurePositions.left:
|
|
105
|
+
icon = style_guide_1.ImageLeftIcon;
|
|
106
|
+
break;
|
|
107
|
+
case figure_1.figurePositions.right:
|
|
108
|
+
icon = style_guide_1.ImageRightIcon;
|
|
109
|
+
break;
|
|
110
|
+
default:
|
|
111
|
+
icon = style_guide_1.ImageDefaultIcon;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
if (icon) {
|
|
115
|
+
positionMenuButton.innerHTML = (0, server_1.renderToStaticMarkup)((0, react_1.createElement)(icon));
|
|
116
|
+
}
|
|
117
|
+
positionMenuButton.addEventListener('click', this.showPositionMenu);
|
|
118
|
+
this.positionMenuWrapper.appendChild(positionMenuButton);
|
|
119
|
+
return this.positionMenuWrapper;
|
|
120
|
+
};
|
|
121
|
+
this.showPositionMenu = () => {
|
|
122
|
+
this.props.popper.destroy();
|
|
123
|
+
const { state, dispatch } = this.view;
|
|
124
|
+
const figure = this.node;
|
|
125
|
+
const componentProps = {
|
|
126
|
+
actions: [
|
|
127
|
+
{
|
|
128
|
+
label: 'Left',
|
|
129
|
+
action: () => {
|
|
130
|
+
this.props.popper.destroy();
|
|
131
|
+
(0, utils_1.updateNodeAttributes)(state, dispatch, figure.attrs.id, Object.assign(Object.assign({}, figure.attrs), { type: figure_1.figurePositions.left }));
|
|
132
|
+
},
|
|
133
|
+
icon: 'ImageLeft',
|
|
134
|
+
selected: this.figurePosition === figure_1.figurePositions.left,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
label: 'Default',
|
|
138
|
+
action: () => {
|
|
139
|
+
this.props.popper.destroy();
|
|
140
|
+
(0, utils_1.updateNodeAttributes)(state, dispatch, figure.attrs.id, Object.assign(Object.assign({}, figure.attrs), { type: figure_1.figurePositions.default }));
|
|
141
|
+
},
|
|
142
|
+
icon: 'ImageDefault',
|
|
143
|
+
selected: !this.figurePosition,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
label: 'Right',
|
|
147
|
+
action: () => {
|
|
148
|
+
this.props.popper.destroy();
|
|
149
|
+
(0, utils_1.updateNodeAttributes)(state, dispatch, figure.attrs.id, Object.assign(Object.assign({}, figure.attrs), { type: figure_1.figurePositions.right }));
|
|
150
|
+
},
|
|
151
|
+
icon: 'ImageRight',
|
|
152
|
+
selected: this.figurePosition === figure_1.figurePositions.right,
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
};
|
|
156
|
+
this.props.popper.show(this.positionMenuWrapper, (0, ReactSubView_1.default)(this.props, style_guide_1.ContextMenu, componentProps, this.node, this.getPos, this.view, 'context-menu, position-menu'), 'left', false);
|
|
157
|
+
};
|
|
92
158
|
}
|
|
93
159
|
updateContents() {
|
|
94
160
|
var _a;
|
|
@@ -97,6 +163,7 @@ class FigureEditableView extends figure_1.FigureView {
|
|
|
97
163
|
const src = attrs.src;
|
|
98
164
|
const files = this.props.getFiles();
|
|
99
165
|
const file = src && files.filter((f) => f.id === src)[0];
|
|
166
|
+
this.figurePosition = attrs.type;
|
|
100
167
|
this.container.innerHTML = '';
|
|
101
168
|
const can = this.props.getCapabilities();
|
|
102
169
|
const link = file && this.props.fileManagement.previewLink(file);
|
|
@@ -128,7 +195,15 @@ class FigureEditableView extends figure_1.FigureView {
|
|
|
128
195
|
this.setSrc(result.id);
|
|
129
196
|
});
|
|
130
197
|
handleUpload = (0, figure_uploader_1.figureUploader)(upload);
|
|
131
|
-
|
|
198
|
+
const handlePlaceholderClick = (event) => {
|
|
199
|
+
const target = event.target;
|
|
200
|
+
if (target.dataset && target.dataset.action) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const triggerUpload = (0, figure_uploader_1.figureUploader)(upload);
|
|
204
|
+
triggerUpload();
|
|
205
|
+
};
|
|
206
|
+
img.addEventListener('click', handlePlaceholderClick);
|
|
132
207
|
img.addEventListener('mouseenter', () => {
|
|
133
208
|
img.classList.toggle('over', true);
|
|
134
209
|
});
|
|
@@ -176,6 +251,7 @@ class FigureEditableView extends figure_1.FigureView {
|
|
|
176
251
|
this.reactTools = (0, ReactSubView_1.default)(this.props, FigureDropdown_1.FigureOptions, componentProps, this.node, this.getPos, this.view);
|
|
177
252
|
this.dom.insertBefore(this.reactTools, this.dom.firstChild);
|
|
178
253
|
}
|
|
254
|
+
this.container.appendChild(this.createPositionMenuWrapper());
|
|
179
255
|
}
|
|
180
256
|
}
|
|
181
257
|
exports.FigureEditableView = FigureEditableView;
|
|
@@ -14,28 +14,13 @@
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
20
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
21
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
22
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
23
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
|
-
});
|
|
25
|
-
};
|
|
26
17
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
27
18
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
28
19
|
};
|
|
29
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
21
|
exports.FigureElementView = void 0;
|
|
31
|
-
const transform_1 = require("@manuscripts/transform");
|
|
32
|
-
const FigureDropdown_1 = require("../components/views/FigureDropdown");
|
|
33
|
-
const files_1 = require("../lib/files");
|
|
34
|
-
const utils_1 = require("../lib/utils");
|
|
35
22
|
const block_view_1 = __importDefault(require("./block_view"));
|
|
36
23
|
const creators_1 = require("./creators");
|
|
37
|
-
const figure_uploader_1 = require("./figure_uploader");
|
|
38
|
-
const ReactSubView_1 = __importDefault(require("./ReactSubView"));
|
|
39
24
|
class FigureElementView extends block_view_1.default {
|
|
40
25
|
constructor() {
|
|
41
26
|
super(...arguments);
|
|
@@ -50,70 +35,6 @@ class FigureElementView extends block_view_1.default {
|
|
|
50
35
|
this.container.appendChild(this.contentDOM);
|
|
51
36
|
};
|
|
52
37
|
}
|
|
53
|
-
updateContents() {
|
|
54
|
-
var _a;
|
|
55
|
-
super.updateContents();
|
|
56
|
-
if (!this.contentDOM) {
|
|
57
|
-
throw new Error('No contentDOM');
|
|
58
|
-
}
|
|
59
|
-
const can = this.props.getCapabilities();
|
|
60
|
-
let handleUpload = () => {
|
|
61
|
-
};
|
|
62
|
-
const hasUploadedImage = !!(0, utils_1.getMatchingChild)(this.node, (node) => node.type === transform_1.schema.nodes.figure && node.attrs.src);
|
|
63
|
-
const handleAdd = (file) => __awaiter(this, void 0, void 0, function* () {
|
|
64
|
-
const { state: { tr, schema, selection }, dispatch, } = this.view;
|
|
65
|
-
const src = file.id;
|
|
66
|
-
const figure = (0, utils_1.getMatchingChild)(this.node, (node) => node.type === schema.nodes.figure);
|
|
67
|
-
if (figure === null || figure === void 0 ? void 0 : figure.attrs.src) {
|
|
68
|
-
const figure = schema.nodes.figure.createAndFill({
|
|
69
|
-
src,
|
|
70
|
-
}, []);
|
|
71
|
-
let position = 0;
|
|
72
|
-
this.node.forEach((node, pos) => {
|
|
73
|
-
if (node.type === schema.nodes.figure) {
|
|
74
|
-
position = pos + node.nodeSize;
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
dispatch(tr.insert(this.getPos() + position + 1, figure));
|
|
78
|
-
}
|
|
79
|
-
else if (figure) {
|
|
80
|
-
tr.setNodeMarkup(this.getPos() + 1, undefined, Object.assign(Object.assign({}, figure.attrs), { src })).setSelection(selection.map(tr.doc, tr.mapping));
|
|
81
|
-
dispatch(tr);
|
|
82
|
-
}
|
|
83
|
-
this.deleteSupplementNode(file);
|
|
84
|
-
});
|
|
85
|
-
if (can.uploadFile) {
|
|
86
|
-
const upload = (file) => __awaiter(this, void 0, void 0, function* () {
|
|
87
|
-
const result = yield this.props.fileManagement.upload(file);
|
|
88
|
-
yield handleAdd(result);
|
|
89
|
-
});
|
|
90
|
-
handleUpload = (0, figure_uploader_1.figureUploader)(upload);
|
|
91
|
-
}
|
|
92
|
-
if (this.props.dispatch && this.props.theme) {
|
|
93
|
-
const files = this.props.getFiles();
|
|
94
|
-
const doc = this.view.state.doc;
|
|
95
|
-
const componentProps = {
|
|
96
|
-
can: can,
|
|
97
|
-
files: (0, files_1.groupFiles)(doc, files),
|
|
98
|
-
onUpload: handleUpload,
|
|
99
|
-
onAdd: handleAdd,
|
|
100
|
-
hasUploadedImage: hasUploadedImage,
|
|
101
|
-
};
|
|
102
|
-
(_a = this.reactTools) === null || _a === void 0 ? void 0 : _a.remove();
|
|
103
|
-
this.reactTools = (0, ReactSubView_1.default)(this.props, FigureDropdown_1.FigureElementOptions, componentProps, this.node, this.getPos, this.view);
|
|
104
|
-
this.dom.insertBefore(this.reactTools, this.dom.firstChild);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
deleteSupplementNode(file) {
|
|
108
|
-
const tr = this.view.state.tr;
|
|
109
|
-
this.view.state.doc.descendants((node, pos) => {
|
|
110
|
-
if (node.type === transform_1.schema.nodes.supplement &&
|
|
111
|
-
node.attrs.href === file.id) {
|
|
112
|
-
tr.delete(pos, pos + node.nodeSize);
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
this.view.dispatch(tr);
|
|
116
|
-
}
|
|
117
38
|
}
|
|
118
39
|
exports.FigureElementView = FigureElementView;
|
|
119
40
|
exports.default = (0, creators_1.createNodeView)(FigureElementView);
|