@manuscripts/body-editor 2.7.9-LEAN-4096.2 → 2.7.9
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/commands.js +16 -1
- package/dist/cjs/components/outline/DraggableTree.js +0 -1
- package/dist/cjs/components/toolbar/InsertEmbedDialog.js +159 -0
- package/dist/cjs/components/views/FigureDropdown.js +44 -2
- package/dist/cjs/components/views/LinkForm.js +7 -7
- package/dist/cjs/configs/editor-plugins.js +0 -2
- package/dist/cjs/configs/editor-views.js +2 -0
- package/dist/cjs/index.js +0 -1
- package/dist/cjs/lib/context-menu.js +4 -71
- package/dist/cjs/lib/oembed.js +93 -0
- package/dist/cjs/lib/utils.js +1 -16
- package/dist/cjs/menus.js +8 -0
- package/dist/cjs/node-type-icons.js +1 -0
- package/dist/cjs/versions.js +1 -1
- package/dist/cjs/views/ReactSubView.js +1 -4
- package/dist/cjs/views/embed.js +84 -0
- package/dist/cjs/views/figure.js +1 -7
- package/dist/cjs/views/figure_editable.js +3 -79
- package/dist/cjs/views/figure_element.js +79 -0
- package/dist/es/commands.js +13 -0
- package/dist/es/components/outline/DraggableTree.js +0 -1
- package/dist/es/components/toolbar/InsertEmbedDialog.js +127 -0
- package/dist/es/components/views/FigureDropdown.js +43 -2
- package/dist/es/components/views/LinkForm.js +2 -2
- package/dist/es/configs/editor-plugins.js +0 -2
- package/dist/es/configs/editor-views.js +2 -0
- package/dist/es/index.js +0 -1
- package/dist/es/lib/context-menu.js +5 -72
- package/dist/es/lib/oembed.js +85 -0
- package/dist/es/lib/utils.js +0 -14
- package/dist/es/menus.js +8 -0
- package/dist/es/node-type-icons.js +2 -1
- package/dist/es/versions.js +1 -1
- package/dist/es/views/ReactSubView.js +1 -4
- package/dist/es/views/embed.js +77 -0
- package/dist/es/views/figure.js +0 -6
- package/dist/es/views/figure_editable.js +5 -81
- package/dist/es/views/figure_element.js +79 -0
- package/dist/types/commands.d.ts +1 -0
- package/dist/types/components/toolbar/InsertEmbedDialog.d.ts +29 -0
- package/dist/types/components/views/FigureDropdown.d.ts +1 -0
- package/dist/types/components/views/LinkForm.d.ts +2 -0
- package/dist/types/configs/editor-views.d.ts +1 -0
- package/dist/types/index.d.ts +0 -1
- package/dist/types/lib/context-menu.d.ts +0 -3
- package/dist/types/lib/oembed.d.ts +8 -0
- package/dist/types/lib/utils.d.ts +2 -3
- package/dist/types/versions.d.ts +1 -1
- package/dist/types/views/embed.d.ts +30 -0
- package/dist/types/views/figure.d.ts +0 -5
- package/dist/types/views/figure_editable.d.ts +0 -4
- package/dist/types/views/figure_element.d.ts +3 -0
- package/package.json +4 -3
- package/styles/AdvancedEditor.css +25 -15
- package/styles/Editor.css +0 -9
- package/styles/popper.css +4 -35
- package/dist/cjs/plugins/inspector-actions.js +0 -70
- package/dist/es/plugins/inspector-actions.js +0 -67
- package/dist/types/plugins/inspector-actions.d.ts +0 -26
package/dist/cjs/commands.js
CHANGED
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.
|
|
18
|
+
exports.addColumns = exports.addHeaderRow = exports.addRows = exports.addInlineComment = exports.addNodeComment = exports.createAndFillTableElement = exports.selectAllIsolating = exports.ignoreAtomBlockNodeForward = exports.isAtEndOfTextBlock = exports.ignoreMetaNodeBackspaceCommand = exports.ignoreAtomBlockNodeBackward = exports.isTextSelection = exports.isAtStartOfTextBlock = exports.insertTOCSection = exports.insertBibliographySection = exports.insertList = exports.insertKeywords = exports.insertAward = exports.insertAffiliation = exports.insertContributors = exports.insertAbstract = exports.insertBackmatterSection = exports.insertSection = exports.insertGraphicalAbstract = exports.insertBoxElement = exports.insertInlineFootnote = exports.insertFootnotesElement = exports.insertTableElementFooter = exports.insertInlineEquation = exports.insertCrossReference = exports.insertInlineCitation = exports.insertLink = exports.insertSectionLabel = exports.findPosBeforeFirstSubsection = exports.insertBreak = exports.deleteBlock = exports.insertBlock = exports.insertSupplement = exports.insertTable = exports.insertFigure = exports.insertGeneralTableFootnote = exports.insertInlineTableFootnote = exports.insertEmbed = exports.createBlock = exports.createSelection = exports.canInsert = exports.blockActive = exports.isNodeSelection = exports.markActive = exports.addToStart = void 0;
|
|
19
|
+
exports.autoComplete = void 0;
|
|
19
20
|
const json_schema_1 = require("@manuscripts/json-schema");
|
|
20
21
|
const track_changes_plugin_1 = require("@manuscripts/track-changes-plugin");
|
|
21
22
|
const transform_1 = require("@manuscripts/transform");
|
|
@@ -150,6 +151,11 @@ const createBlock = (nodeType, position, state, dispatch, attrs) => {
|
|
|
150
151
|
state.schema.nodes.equation.create(),
|
|
151
152
|
]);
|
|
152
153
|
break;
|
|
154
|
+
case state.schema.nodes.embed:
|
|
155
|
+
node = state.schema.nodes.embed.create(attrs, [
|
|
156
|
+
createAndFillFigcaptionElement(state),
|
|
157
|
+
]);
|
|
158
|
+
break;
|
|
153
159
|
default:
|
|
154
160
|
node = nodeType.createAndFill(attrs);
|
|
155
161
|
}
|
|
@@ -160,6 +166,15 @@ const createBlock = (nodeType, position, state, dispatch, attrs) => {
|
|
|
160
166
|
}
|
|
161
167
|
};
|
|
162
168
|
exports.createBlock = createBlock;
|
|
169
|
+
const insertEmbed = (state, dispatch, attrs) => {
|
|
170
|
+
const position = findBlockInsertPosition(state);
|
|
171
|
+
if (position === null) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
(0, exports.createBlock)(transform_1.schema.nodes.embed, position, state, dispatch, attrs);
|
|
175
|
+
return true;
|
|
176
|
+
};
|
|
177
|
+
exports.insertEmbed = insertEmbed;
|
|
163
178
|
const insertInlineTableFootnote = (state, dispatch) => {
|
|
164
179
|
const $pos = state.selection.$to;
|
|
165
180
|
const table = (0, prosemirror_utils_1.findParentNodeOfTypeClosestToPos)($pos, transform_1.schema.nodes.table);
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*!
|
|
3
|
+
* © 2024 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
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
41
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
42
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
43
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
44
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
45
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
46
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
47
|
+
});
|
|
48
|
+
};
|
|
49
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
50
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
51
|
+
};
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.openEmbedDialog = exports.NoPreviewMessageWithLink = exports.InsertEmbedDialog = void 0;
|
|
54
|
+
const style_guide_1 = require("@manuscripts/style-guide");
|
|
55
|
+
const lodash_1 = require("lodash");
|
|
56
|
+
const react_1 = __importStar(require("react"));
|
|
57
|
+
const styled_components_1 = __importDefault(require("styled-components"));
|
|
58
|
+
const commands_1 = require("../../commands");
|
|
59
|
+
const oembed_1 = require("../../lib/oembed");
|
|
60
|
+
const url_1 = require("../../lib/url");
|
|
61
|
+
const editor_props_1 = require("../../plugins/editor-props");
|
|
62
|
+
const ReactSubView_1 = __importDefault(require("../../views/ReactSubView"));
|
|
63
|
+
const LinkForm_1 = require("../views/LinkForm");
|
|
64
|
+
const Label = styled_components_1.default.label `
|
|
65
|
+
padding-bottom: 4px;
|
|
66
|
+
`;
|
|
67
|
+
const HeaderContainer = (0, styled_components_1.default)(style_guide_1.PrimaryBoldHeading) `
|
|
68
|
+
font-size: ${(props) => props.theme.font.size.large};
|
|
69
|
+
`;
|
|
70
|
+
const Container = styled_components_1.default.div `
|
|
71
|
+
display: flex;
|
|
72
|
+
flex-direction: column;
|
|
73
|
+
padding-bottom: 16px;
|
|
74
|
+
`;
|
|
75
|
+
const DialogContainer = (0, styled_components_1.default)(style_guide_1.DialogModalBody) `
|
|
76
|
+
min-width: 750px;
|
|
77
|
+
`;
|
|
78
|
+
const PreviewContainer = styled_components_1.default.div `
|
|
79
|
+
display: flex;
|
|
80
|
+
justify-content: center;
|
|
81
|
+
border: 1px solid ${(props) => props.theme.colors.border.field.default};
|
|
82
|
+
border-radius: ${(props) => props.theme.grid.radius.small};
|
|
83
|
+
padding: 6px ${(props) => props.theme.grid.unit * 4}px;
|
|
84
|
+
`;
|
|
85
|
+
const InsertEmbedDialog = ({ state, dispatch, operation, }) => {
|
|
86
|
+
const [isOpen, setOpen] = (0, react_1.useState)(true);
|
|
87
|
+
const [url, setUrl] = (0, react_1.useState)(undefined);
|
|
88
|
+
const [oembedHTML, setOEmbedHTML] = (0, react_1.useState)(undefined);
|
|
89
|
+
const action = () => {
|
|
90
|
+
if (operation === 'Insert') {
|
|
91
|
+
(0, commands_1.insertEmbed)(state, dispatch, { href: url });
|
|
92
|
+
setOpen(false);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const debouncedUrlChange = (0, lodash_1.debounce)((e) => __awaiter(void 0, void 0, void 0, function* () {
|
|
98
|
+
const url = e.target.value.trim();
|
|
99
|
+
const oEmbedUrl = yield (0, oembed_1.getOEmbedUrl)(url, 368, 217);
|
|
100
|
+
if (oEmbedUrl) {
|
|
101
|
+
const oembedJSON = yield (0, oembed_1.getOEmbedHTML)(oEmbedUrl, url);
|
|
102
|
+
setOEmbedHTML(oembedJSON);
|
|
103
|
+
}
|
|
104
|
+
setUrl(url);
|
|
105
|
+
}), 500);
|
|
106
|
+
return (react_1.default.createElement(style_guide_1.StyledModal, { isOpen: isOpen, onRequestClose: () => setOpen(false) },
|
|
107
|
+
react_1.default.createElement(DialogContainer, null,
|
|
108
|
+
react_1.default.createElement(HeaderContainer, null,
|
|
109
|
+
operation,
|
|
110
|
+
" external media"),
|
|
111
|
+
react_1.default.createElement(style_guide_1.MessageContainer, null,
|
|
112
|
+
react_1.default.createElement(Container, null,
|
|
113
|
+
react_1.default.createElement(LinkForm_1.FieldHeading, null,
|
|
114
|
+
react_1.default.createElement(Label, { htmlFor: 'embed-link' }, "Media link"),
|
|
115
|
+
url && (0, url_1.allowedHref)(url) && (react_1.default.createElement(LinkForm_1.Open, { id: 'media-link', href: url, target: '_blank', rel: 'noopener' }))),
|
|
116
|
+
react_1.default.createElement(style_guide_1.TextArea, { id: 'embed-link', rows: 2, cols: 2, autoFocus: true, required: true, placeholder: 'https://youtube.com/...', onChange: debouncedUrlChange })),
|
|
117
|
+
url && (0, url_1.allowedHref)(url) && (react_1.default.createElement(Container, null,
|
|
118
|
+
react_1.default.createElement(Label, null, "Preview"),
|
|
119
|
+
(oembedHTML && (react_1.default.createElement(PreviewContainer, { dangerouslySetInnerHTML: { __html: oembedHTML } }))) || react_1.default.createElement(NoPreviewMessage, null)))),
|
|
120
|
+
react_1.default.createElement(style_guide_1.ButtonGroup, null,
|
|
121
|
+
react_1.default.createElement(style_guide_1.SecondaryButton, { onClick: () => setOpen(false) }, "Cancel"),
|
|
122
|
+
react_1.default.createElement(style_guide_1.PrimaryButton, { onClick: action, disabled: !(url && (0, url_1.allowedHref)(url)) }, operation)))));
|
|
123
|
+
};
|
|
124
|
+
exports.InsertEmbedDialog = InsertEmbedDialog;
|
|
125
|
+
const Wrapper = styled_components_1.default.div `
|
|
126
|
+
display: flex;
|
|
127
|
+
justify-content: center;
|
|
128
|
+
padding: 50px 0;
|
|
129
|
+
`;
|
|
130
|
+
const NoPreviewMessage = () => (react_1.default.createElement(PreviewContainer, null,
|
|
131
|
+
react_1.default.createElement(Wrapper, null, "Preview not available")));
|
|
132
|
+
const NoPreviewContainer = (0, styled_components_1.default)(PreviewContainer) `
|
|
133
|
+
flex-direction: column;
|
|
134
|
+
background: #fafafa;
|
|
135
|
+
padding: 16px 56px 16px 48px;
|
|
136
|
+
`;
|
|
137
|
+
const Heading = (0, styled_components_1.default)(style_guide_1.PrimaryBoldHeading) `
|
|
138
|
+
font-size: ${(props) => props.theme.font.size.medium};
|
|
139
|
+
`;
|
|
140
|
+
const NoPreviewMessageWithLink = ({ href, }) => (react_1.default.createElement(NoPreviewContainer, null,
|
|
141
|
+
react_1.default.createElement(Heading, null, "Preview currently not available"),
|
|
142
|
+
react_1.default.createElement(style_guide_1.PrimarySmallText, null,
|
|
143
|
+
react_1.default.createElement("a", { href: href, target: '_blank', rel: "noreferrer" }, "Click here"),
|
|
144
|
+
' ',
|
|
145
|
+
"to see the source media")));
|
|
146
|
+
exports.NoPreviewMessageWithLink = NoPreviewMessageWithLink;
|
|
147
|
+
const openEmbedDialog = (view, operation = 'Insert') => {
|
|
148
|
+
if (!view) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const { state, dispatch } = view;
|
|
152
|
+
const dialog = (0, ReactSubView_1.default)((0, editor_props_1.getEditorProps)(state), exports.InsertEmbedDialog, {
|
|
153
|
+
state,
|
|
154
|
+
dispatch,
|
|
155
|
+
operation,
|
|
156
|
+
}, state.doc, () => 0, view);
|
|
157
|
+
document.body.appendChild(dialog);
|
|
158
|
+
};
|
|
159
|
+
exports.openEmbedDialog = openEmbedDialog;
|
|
@@ -3,10 +3,31 @@ 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 = void 0;
|
|
6
|
+
exports.FigureOptions = exports.FigureElementOptions = 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;
|
|
10
31
|
const FigureOptions = ({ can, files, onDownload, onUpload, onDetach, onReplace, }) => {
|
|
11
32
|
const { isOpen, toggleOpen, wrapperRef } = (0, style_guide_1.useDropdown)();
|
|
12
33
|
const otherFiles = files.others.filter((f) => (0, style_guide_1.isImageFile)(f.name));
|
|
@@ -18,6 +39,7 @@ const FigureOptions = ({ can, files, onDownload, onUpload, onDetach, onReplace,
|
|
|
18
39
|
react_1.default.createElement(OptionsButton, { className: 'options-button', onClick: toggleOpen },
|
|
19
40
|
react_1.default.createElement(style_guide_1.DotsIcon, null)),
|
|
20
41
|
isOpen && (react_1.default.createElement(OptionsDropdownList, { direction: 'right', width: 128, top: 5 },
|
|
42
|
+
react_1.default.createElement(ListItemButton, { onClick: onDownload, disabled: !showDownload }, "Download"),
|
|
21
43
|
react_1.default.createElement(NestedDropdown, { disabled: !showReplace, parentToggleOpen: toggleOpen, buttonText: 'Replace', moveLeft: true, list: react_1.default.createElement(react_1.default.Fragment, null,
|
|
22
44
|
otherFiles.map((file, index) => (react_1.default.createElement(ListItemButton, { key: file.id, id: index.toString(), onClick: () => onReplace && onReplace(file) },
|
|
23
45
|
(0, style_guide_1.getFileIcon)(file.name),
|
|
@@ -25,7 +47,6 @@ const FigureOptions = ({ can, files, onDownload, onUpload, onDetach, onReplace,
|
|
|
25
47
|
react_1.default.createElement(UploadButton, { onClick: onUpload, disabled: !showUpload },
|
|
26
48
|
react_1.default.createElement(style_guide_1.UploadIcon, null),
|
|
27
49
|
" Upload new...")) }),
|
|
28
|
-
react_1.default.createElement(ListItemButton, { onClick: onDownload, disabled: !showDownload }, "Download"),
|
|
29
50
|
react_1.default.createElement(ListItemButton, { onClick: onDetach, disabled: !showDetach }, "Detach")))));
|
|
30
51
|
};
|
|
31
52
|
exports.FigureOptions = FigureOptions;
|
|
@@ -54,6 +75,9 @@ const OptionsButton = (0, styled_components_1.default)(style_guide_1.IconButton)
|
|
|
54
75
|
margin: ${(props) => props.theme.grid.unit}px;
|
|
55
76
|
visibility: hidden;
|
|
56
77
|
background: white;
|
|
78
|
+
position: absolute;
|
|
79
|
+
top: -4px;
|
|
80
|
+
right: 4%;
|
|
57
81
|
|
|
58
82
|
&:hover {
|
|
59
83
|
background: #f2fbfc !important;
|
|
@@ -95,6 +119,24 @@ const ListItemText = styled_components_1.default.div `
|
|
|
95
119
|
text-overflow: ellipsis;
|
|
96
120
|
text-align: start;
|
|
97
121
|
`;
|
|
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
|
+
`;
|
|
98
140
|
const NestedListButton = (0, styled_components_1.default)(ListItemButton) `
|
|
99
141
|
width: 100%;
|
|
100
142
|
&:active,
|
|
@@ -41,7 +41,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
41
41
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
42
|
};
|
|
43
43
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
-
exports.LinkForm = void 0;
|
|
44
|
+
exports.LinkForm = exports.Open = exports.FieldHeading = void 0;
|
|
45
45
|
const style_guide_1 = require("@manuscripts/style-guide");
|
|
46
46
|
const react_1 = __importStar(require("react"));
|
|
47
47
|
const styled_components_1 = __importDefault(require("styled-components"));
|
|
@@ -66,7 +66,7 @@ const ActionGroup = styled_components_1.default.span `
|
|
|
66
66
|
const Field = styled_components_1.default.div `
|
|
67
67
|
margin-bottom: ${(props) => props.theme.grid.unit * 4}px;
|
|
68
68
|
`;
|
|
69
|
-
|
|
69
|
+
exports.FieldHeading = styled_components_1.default.div `
|
|
70
70
|
display: flex;
|
|
71
71
|
align-items: center;
|
|
72
72
|
justify-content: space-between;
|
|
@@ -78,7 +78,7 @@ const Label = styled_components_1.default.label `
|
|
|
78
78
|
color: ${(props) => props.theme.colors.text.tertiary};
|
|
79
79
|
font-size: ${(props) => props.theme.font.size.normal};
|
|
80
80
|
`;
|
|
81
|
-
|
|
81
|
+
exports.Open = styled_components_1.default.a `
|
|
82
82
|
display: inline-block;
|
|
83
83
|
margin-left: ${(props) => props.theme.grid.unit * 2}px;
|
|
84
84
|
text-transform: uppercase;
|
|
@@ -101,16 +101,16 @@ const LinkForm = ({ onCancel, onRemove, onSave, value, }) => {
|
|
|
101
101
|
}, [href, text, title, onSave]);
|
|
102
102
|
return (react_1.default.createElement(Form, { onSubmit: handleSubmit },
|
|
103
103
|
react_1.default.createElement(Field, null,
|
|
104
|
-
react_1.default.createElement(FieldHeading, null,
|
|
104
|
+
react_1.default.createElement(exports.FieldHeading, null,
|
|
105
105
|
react_1.default.createElement(Label, null, "URL"),
|
|
106
|
-
href && (0, url_1.allowedHref)(href) && (react_1.default.createElement(Open, { href: href, target: '_blank', rel: 'noopener' }))),
|
|
106
|
+
href && (0, url_1.allowedHref)(href) && (react_1.default.createElement(exports.Open, { href: href, target: '_blank', rel: 'noopener' }))),
|
|
107
107
|
react_1.default.createElement(style_guide_1.TextField, { type: 'url', name: 'href', value: href, autoComplete: 'off', autoFocus: true, required: true, onChange: (e) => setHref(e.target.value) })),
|
|
108
108
|
react_1.default.createElement(Field, null,
|
|
109
|
-
react_1.default.createElement(FieldHeading, null,
|
|
109
|
+
react_1.default.createElement(exports.FieldHeading, null,
|
|
110
110
|
react_1.default.createElement(Label, null, "Text")),
|
|
111
111
|
react_1.default.createElement(style_guide_1.TextField, { type: 'text', name: 'text', value: text, autoComplete: 'off', required: true, onChange: (e) => setText(e.target.value) })),
|
|
112
112
|
react_1.default.createElement(Field, null,
|
|
113
|
-
react_1.default.createElement(FieldHeading, null,
|
|
113
|
+
react_1.default.createElement(exports.FieldHeading, null,
|
|
114
114
|
react_1.default.createElement(Label, null, "Title (optional)")),
|
|
115
115
|
react_1.default.createElement(style_guide_1.TextField, { type: 'text', name: 'title', value: title, autoComplete: 'off', required: false, onChange: (e) => setTitle(e.target.value) })),
|
|
116
116
|
react_1.default.createElement(Actions, null,
|
|
@@ -34,7 +34,6 @@ 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"));
|
|
38
37
|
const objects_1 = __importDefault(require("../plugins/objects"));
|
|
39
38
|
const paragraphs_1 = __importDefault(require("../plugins/paragraphs"));
|
|
40
39
|
const persist_1 = __importDefault(require("../plugins/persist"));
|
|
@@ -76,7 +75,6 @@ exports.default = (props) => {
|
|
|
76
75
|
(0, doi_1.default)(),
|
|
77
76
|
(0, section_category_1.default)(props),
|
|
78
77
|
(0, cross_references_1.default)(),
|
|
79
|
-
(0, inspector_actions_1.default)(),
|
|
80
78
|
];
|
|
81
79
|
if (props.collabProvider) {
|
|
82
80
|
allPlugins.push((0, prosemirror_collab_1.collab)({ version: props.collabProvider.currentVersion }));
|
|
@@ -28,6 +28,7 @@ const box_element_1 = __importDefault(require("../views/box_element"));
|
|
|
28
28
|
const citation_editable_1 = __importDefault(require("../views/citation_editable"));
|
|
29
29
|
const contributors_1 = __importDefault(require("../views/contributors"));
|
|
30
30
|
const cross_reference_editable_1 = __importDefault(require("../views/cross_reference_editable"));
|
|
31
|
+
const embed_1 = __importDefault(require("../views/embed"));
|
|
31
32
|
const empty_1 = __importDefault(require("../views/empty"));
|
|
32
33
|
const equation_editable_1 = __importDefault(require("../views/equation_editable"));
|
|
33
34
|
const equation_element_editable_1 = __importDefault(require("../views/equation_element_editable"));
|
|
@@ -64,6 +65,7 @@ exports.default = (props, dispatch) => {
|
|
|
64
65
|
cross_reference: (0, cross_reference_editable_1.default)(props, dispatch),
|
|
65
66
|
contributors: (0, contributors_1.default)(props, dispatch),
|
|
66
67
|
affiliations: (0, affiliations_1.default)(props, dispatch),
|
|
68
|
+
embed: (0, embed_1.default)(props),
|
|
67
69
|
equation: (0, equation_editable_1.default)(props),
|
|
68
70
|
equation_element: (0, equation_element_editable_1.default)(props),
|
|
69
71
|
figure: (0, figure_editable_1.default)(props, dispatch),
|
package/dist/cjs/index.js
CHANGED
|
@@ -68,4 +68,3 @@ 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,13 +16,9 @@
|
|
|
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");
|
|
20
19
|
const transform_1 = require("@manuscripts/transform");
|
|
21
20
|
const prosemirror_utils_1 = require("prosemirror-utils");
|
|
22
|
-
const react_1 = require("react");
|
|
23
|
-
const server_1 = require("react-dom/server");
|
|
24
21
|
const commands_1 = require("../commands");
|
|
25
|
-
const figure_1 = require("../views/figure");
|
|
26
22
|
const popper_1 = require("./popper");
|
|
27
23
|
const utils_1 = require("./utils");
|
|
28
24
|
const popper = new popper_1.PopperManager();
|
|
@@ -46,8 +42,6 @@ const hasAny = (set, ...items) => {
|
|
|
46
42
|
return items.some((i) => set.has(i));
|
|
47
43
|
};
|
|
48
44
|
exports.contextMenuBtnClass = 'btn-context-menu';
|
|
49
|
-
const contextSubmenuBtnClass = 'context-submenu-trigger';
|
|
50
|
-
const contextSubmenuClass = 'context-submenu';
|
|
51
45
|
class ContextMenu {
|
|
52
46
|
constructor(node, view, getPos, actions = {}) {
|
|
53
47
|
this.showAddMenu = (target, after) => {
|
|
@@ -156,36 +150,6 @@ class ContextMenu {
|
|
|
156
150
|
const $pos = this.resolvePos();
|
|
157
151
|
const isBox = isBoxElementSectionTitle($pos, this.node);
|
|
158
152
|
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
|
-
}
|
|
189
153
|
if (type === transform_1.schema.nodes.list) {
|
|
190
154
|
menu.appendChild(this.createMenuSection((section) => {
|
|
191
155
|
const attrs = this.node.attrs;
|
|
@@ -250,48 +214,22 @@ class ContextMenu {
|
|
|
250
214
|
popper.show(target, menu, 'right', true);
|
|
251
215
|
this.addPopperEventListeners();
|
|
252
216
|
};
|
|
253
|
-
this.
|
|
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) => {
|
|
217
|
+
this.createMenuItem = (contents, handler) => {
|
|
264
218
|
const item = document.createElement('div');
|
|
265
219
|
item.className = 'menu-item';
|
|
266
|
-
|
|
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);
|
|
220
|
+
item.textContent = contents;
|
|
272
221
|
item.addEventListener('mousedown', (event) => {
|
|
273
222
|
event.preventDefault();
|
|
274
223
|
handler(event);
|
|
275
224
|
});
|
|
276
225
|
return item;
|
|
277
226
|
};
|
|
278
|
-
this.createMenuSection = (createMenuItems
|
|
227
|
+
this.createMenuSection = (createMenuItems) => {
|
|
279
228
|
const section = document.createElement('div');
|
|
280
229
|
section.className = 'menu-section';
|
|
281
|
-
isSubmenu && section.classList.add('menu');
|
|
282
230
|
createMenuItems(section);
|
|
283
231
|
return section;
|
|
284
232
|
};
|
|
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
|
-
};
|
|
295
233
|
this.insertableTypes = (after, insertPos, endPos) => {
|
|
296
234
|
const { nodes } = transform_1.schema;
|
|
297
235
|
const insertable = new Set();
|
|
@@ -353,8 +291,7 @@ class ContextMenu {
|
|
|
353
291
|
this.addPopperEventListeners = () => {
|
|
354
292
|
const mouseListener = (event) => {
|
|
355
293
|
const target = event.target;
|
|
356
|
-
if (target.classList.contains(exports.contextMenuBtnClass)
|
|
357
|
-
target.classList.contains(contextSubmenuBtnClass)) {
|
|
294
|
+
if (target.classList.contains(exports.contextMenuBtnClass)) {
|
|
358
295
|
return;
|
|
359
296
|
}
|
|
360
297
|
window.requestAnimationFrame(() => {
|
|
@@ -386,10 +323,6 @@ class ContextMenu {
|
|
|
386
323
|
}
|
|
387
324
|
return this.node;
|
|
388
325
|
};
|
|
389
|
-
this.toggleSubmenu = (ev) => {
|
|
390
|
-
const submenu = ev.target.nextElementSibling;
|
|
391
|
-
submenu === null || submenu === void 0 ? void 0 : submenu.classList.toggle('show');
|
|
392
|
-
};
|
|
393
326
|
this.node = node;
|
|
394
327
|
this.view = view;
|
|
395
328
|
this.getPos = getPos;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.getOEmbedHTML = exports.getOEmbedUrl = void 0;
|
|
16
|
+
const oembed_providers_1 = __importDefault(require("oembed-providers"));
|
|
17
|
+
const getOEmbedUrl = (url, width, height) => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
+
let oembedUrl;
|
|
19
|
+
for (const provider of oembed_providers_1.default) {
|
|
20
|
+
if (provider) {
|
|
21
|
+
const { provider_url, endpoints } = provider;
|
|
22
|
+
for (const endpoint of endpoints) {
|
|
23
|
+
if (endpoint.schemes &&
|
|
24
|
+
endpoint.schemes.find((schema) => globToRegex(schema).test(url))) {
|
|
25
|
+
oembedUrl = endpoint.url.replace('{format}', 'json');
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
else if (!endpoint.schemes && url.startsWith(provider_url)) {
|
|
29
|
+
oembedUrl = endpoint.url.replace('{format}', 'json');
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (oembedUrl) {
|
|
36
|
+
const params = new URLSearchParams();
|
|
37
|
+
params.append('url', url);
|
|
38
|
+
params.set('format', 'json');
|
|
39
|
+
params.append('maxwidth', width.toString());
|
|
40
|
+
params.append('maxheight', height.toString());
|
|
41
|
+
return `${oembedUrl}?${params.toString()}`;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
try {
|
|
45
|
+
const response = yield fetch(url, { method: 'HEAD' });
|
|
46
|
+
let oembedUrl;
|
|
47
|
+
const linkHeader = response.headers.get('link');
|
|
48
|
+
if (linkHeader) {
|
|
49
|
+
linkHeader.split(',').map((link) => {
|
|
50
|
+
const typeMatch = /type="([^"]*)"/.exec(link);
|
|
51
|
+
if (typeMatch &&
|
|
52
|
+
(typeMatch[1] === 'application/json+oembed' ||
|
|
53
|
+
typeMatch[1] === 'text/xml+oembed')) {
|
|
54
|
+
oembedUrl = /<([^>]*)>/.exec(link);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return oembedUrl;
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
exports.getOEmbedUrl = getOEmbedUrl;
|
|
66
|
+
const globToRegex = (glob) => {
|
|
67
|
+
const regex = glob
|
|
68
|
+
.replace(/\./g, '\\.')
|
|
69
|
+
.replace(/\*/g, '.*');
|
|
70
|
+
return new RegExp(`^${regex}$`);
|
|
71
|
+
};
|
|
72
|
+
const getOEmbedHTML = (oembedUrl, sourceLink) => __awaiter(void 0, void 0, void 0, function* () {
|
|
73
|
+
try {
|
|
74
|
+
const response = yield fetch(oembedUrl);
|
|
75
|
+
if (response.status === 200) {
|
|
76
|
+
const oembed = yield response.json();
|
|
77
|
+
return oembed.html || renderAlternativeHTML(oembed, sourceLink);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
exports.getOEmbedHTML = getOEmbedHTML;
|
|
88
|
+
const renderAlternativeHTML = (oembed, sourceLink) => {
|
|
89
|
+
if (oembed.type === 'photo') {
|
|
90
|
+
return `<img src="${oembed.url}">`;
|
|
91
|
+
}
|
|
92
|
+
return `<a href="${sourceLink}" target="_blank">${oembed.title || 'Media link'}</a>`;
|
|
93
|
+
};
|
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.
|
|
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;
|
|
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,18 +86,3 @@ 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;
|
package/dist/cjs/menus.js
CHANGED
|
@@ -20,6 +20,7 @@ const transform_1 = require("@manuscripts/transform");
|
|
|
20
20
|
const prosemirror_commands_1 = require("prosemirror-commands");
|
|
21
21
|
const prosemirror_history_1 = require("prosemirror-history");
|
|
22
22
|
const commands_1 = require("./commands");
|
|
23
|
+
const InsertEmbedDialog_1 = require("./components/toolbar/InsertEmbedDialog");
|
|
23
24
|
const InsertTableDialog_1 = require("./components/toolbar/InsertTableDialog");
|
|
24
25
|
const ListMenuItem_1 = require("./components/toolbar/ListMenuItem");
|
|
25
26
|
const hierarchy_1 = require("./lib/hierarchy");
|
|
@@ -211,6 +212,13 @@ const getEditorMenus = (editor) => {
|
|
|
211
212
|
{
|
|
212
213
|
role: 'separator',
|
|
213
214
|
},
|
|
215
|
+
{
|
|
216
|
+
id: 'insert-embed-media',
|
|
217
|
+
label: 'Embedded Media',
|
|
218
|
+
isActive: (0, commands_1.blockActive)(transform_1.schema.nodes.embed)(state),
|
|
219
|
+
isEnabled: isCommandValid((0, commands_1.canInsert)(transform_1.schema.nodes.embed)),
|
|
220
|
+
run: () => (0, InsertEmbedDialog_1.openEmbedDialog)(editor.view),
|
|
221
|
+
},
|
|
214
222
|
{
|
|
215
223
|
id: 'insert-link',
|
|
216
224
|
label: 'Link',
|