@seafile/sdoc-editor 3.0.76 → 3.0.78
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/constants/index.js +5 -2
- package/dist/editor/sdoc-editor.js +7 -2
- package/dist/editor/wiki-editor.js +6 -2
- package/dist/extension/commons/insert-element-dialog/index.js +41 -14
- package/dist/extension/constants/element-type.js +2 -1
- package/dist/extension/constants/index.js +8 -2
- package/dist/extension/constants/menus-config.js +13 -4
- package/dist/extension/plugins/callout/menu/index.js +1 -0
- package/dist/extension/plugins/formula/formula.css +32 -0
- package/dist/extension/plugins/formula/helper.js +55 -0
- package/dist/extension/plugins/formula/hover-menu/index.css +79 -0
- package/dist/extension/plugins/formula/hover-menu/index.js +97 -0
- package/dist/extension/plugins/formula/index.js +19 -0
- package/dist/extension/plugins/formula/menu/formula-modal.js +97 -0
- package/dist/extension/plugins/formula/menu/index.js +32 -0
- package/dist/extension/plugins/formula/plugin.js +41 -0
- package/dist/extension/plugins/formula/render-element.js +165 -0
- package/dist/extension/plugins/index.js +8 -1
- package/dist/extension/plugins/link/hover/index.js +1 -1
- package/dist/extension/plugins/link/render-elem.js +13 -9
- package/dist/extension/render/custom-element.js +6 -0
- package/dist/extension/toolbar/header-toolbar/insert-toolbar/index.js +8 -7
- package/dist/extension/toolbar/insert-element-toolbar/index.js +30 -1
- package/dist/hooks/use-mathjax.js +51 -0
- package/package.json +3 -3
package/dist/constants/index.js
CHANGED
|
@@ -12,7 +12,7 @@ Object.defineProperty(exports, "KeyCodes", {
|
|
|
12
12
|
return _keyCodes["default"];
|
|
13
13
|
}
|
|
14
14
|
});
|
|
15
|
-
exports.PAGE_EDIT_AREA_WIDTH = exports.MODIFY_TYPE = exports.LEFT_OUTLINE_WIDTH = void 0;
|
|
15
|
+
exports.PAGE_EDIT_AREA_WIDTH = exports.MODIFY_TYPE = exports.MAXTH_JAX_SOURCE_RUL = exports.LEFT_OUTLINE_WIDTH = void 0;
|
|
16
16
|
Object.defineProperty(exports, "PLUGIN_BTN_POSITION", {
|
|
17
17
|
enumerable: true,
|
|
18
18
|
get: function get() {
|
|
@@ -127,4 +127,7 @@ var LEFT_OUTLINE_WIDTH = exports.LEFT_OUTLINE_WIDTH = 280;
|
|
|
127
127
|
var ARTICLE_DEFAULT_WIDTH = exports.ARTICLE_DEFAULT_WIDTH = '794px';
|
|
128
128
|
// Width in full width mode
|
|
129
129
|
var ARTICLE_FULL_WIDTH = exports.ARTICLE_FULL_WIDTH = 'calc(100% - 50px - 50px)'; // The left and right sides are 50
|
|
130
|
-
var ARTICLE_FULL_MIN_WIDTH = exports.ARTICLE_FULL_MIN_WIDTH = '400px';
|
|
130
|
+
var ARTICLE_FULL_MIN_WIDTH = exports.ARTICLE_FULL_MIN_WIDTH = '400px';
|
|
131
|
+
|
|
132
|
+
// formula display mathjax url
|
|
133
|
+
var MAXTH_JAX_SOURCE_RUL = exports.MAXTH_JAX_SOURCE_RUL = '/media/js/mathjax/text-svg.js';
|
|
@@ -28,6 +28,7 @@ var _constants2 = require("../extension/constants");
|
|
|
28
28
|
var _core = require("../extension/core");
|
|
29
29
|
var _helpers = require("../extension/plugins/ai/ai-module/helpers");
|
|
30
30
|
var _useColorContext = require("../hooks/use-color-context");
|
|
31
|
+
var _useMathjax = _interopRequireDefault(require("../hooks/use-mathjax"));
|
|
31
32
|
var _layout = require("../layout");
|
|
32
33
|
var _nodeId = _interopRequireDefault(require("../node-id"));
|
|
33
34
|
var _socket = require("../socket");
|
|
@@ -44,7 +45,9 @@ var SdocEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
|
44
45
|
_ref$isShowHeaderTool = _ref.isShowHeaderToolbar,
|
|
45
46
|
isShowHeaderToolbar = _ref$isShowHeaderTool === void 0 ? true : _ref$isShowHeaderTool,
|
|
46
47
|
_ref$showOutline = _ref.showOutline,
|
|
47
|
-
showOutline = _ref$showOutline === void 0 ? true : _ref$showOutline
|
|
48
|
+
showOutline = _ref$showOutline === void 0 ? true : _ref$showOutline,
|
|
49
|
+
_ref$mathJaxSource = _ref.mathJaxSource,
|
|
50
|
+
mathJaxSource = _ref$mathJaxSource === void 0 ? _constants.MAXTH_JAX_SOURCE_RUL : _ref$mathJaxSource;
|
|
48
51
|
var _useState = (0, _react.useState)(false),
|
|
49
52
|
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
50
53
|
showFullScreen = _useState2[0],
|
|
@@ -72,6 +75,8 @@ var SdocEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
|
72
75
|
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
|
73
76
|
isEdit = _useState6[0],
|
|
74
77
|
setIsEdit = _useState6[1];
|
|
78
|
+
var _useMathJax = (0, _useMathjax["default"])(mathJaxSource),
|
|
79
|
+
isLoadingMathJax = _useMathJax.isLoadingMathJax;
|
|
75
80
|
|
|
76
81
|
// Fix: The editor's children are not updated when the document is updated in revision
|
|
77
82
|
// In revision mode, the document is updated, but the editor's children are not updated,as onValueChange override the new document.elements. This unexpected action cause the editor to display the old content
|
|
@@ -248,7 +253,7 @@ var SdocEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
|
248
253
|
}
|
|
249
254
|
};
|
|
250
255
|
var isFreezed = _context["default"].getSetting('isFreezed');
|
|
251
|
-
if (isReloading) {
|
|
256
|
+
if (isReloading || isLoadingMathJax) {
|
|
252
257
|
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
253
258
|
className: "h-100 w-100 d-flex align-items-center justify-content-center"
|
|
254
259
|
}, /*#__PURE__*/_react["default"].createElement(_fileLoading["default"], null));
|
|
@@ -21,6 +21,7 @@ var _insertElementDialog = _interopRequireDefault(require("../extension/commons/
|
|
|
21
21
|
var _constants2 = require("../extension/constants");
|
|
22
22
|
var _helpers = require("../extension/plugins/ai/ai-module/helpers");
|
|
23
23
|
var _useColorContext = require("../hooks/use-color-context");
|
|
24
|
+
var _useMathjax = _interopRequireDefault(require("../hooks/use-mathjax"));
|
|
24
25
|
var _useScrollContext = require("../hooks/use-scroll-context");
|
|
25
26
|
var _layout = require("../layout");
|
|
26
27
|
var _nodeId = _interopRequireDefault(require("../node-id"));
|
|
@@ -38,7 +39,8 @@ var WikiEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
|
38
39
|
isWikiReadOnly = _ref.isWikiReadOnly,
|
|
39
40
|
scrollRef = _ref.scrollRef,
|
|
40
41
|
showComment = _ref.showComment,
|
|
41
|
-
|
|
42
|
+
_ref$mathJaxSource = _ref.mathJaxSource,
|
|
43
|
+
mathJaxSource = _ref$mathJaxSource === void 0 ? _constants.MAXTH_JAX_SOURCE_RUL : _ref$mathJaxSource;
|
|
42
44
|
var validEditor = (0, _react.useMemo)(function () {
|
|
43
45
|
if (propsEditor) return propsEditor;
|
|
44
46
|
var defaultEditor = (0, _extension.createDefaultEditor)();
|
|
@@ -58,6 +60,8 @@ var WikiEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
|
58
60
|
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
59
61
|
slateValue = _useState2[0],
|
|
60
62
|
_setSlateValue = _useState2[1];
|
|
63
|
+
var _useMathJax = (0, _useMathjax["default"])(mathJaxSource),
|
|
64
|
+
isLoadingMathJax = _useMathJax.isLoadingMathJax;
|
|
61
65
|
|
|
62
66
|
// Fix: The editor's children are not updated when the document is updated in revision
|
|
63
67
|
// In revision mode, the document is updated, but the editor's children are not updated,as onValueChange override the new document.elements. This unexpected action cause the editor to display the old content
|
|
@@ -139,7 +143,7 @@ var WikiEditor = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
|
|
|
139
143
|
}, 0);
|
|
140
144
|
_setSlateValue(value);
|
|
141
145
|
};
|
|
142
|
-
if (isReloading) {
|
|
146
|
+
if (isReloading || isLoadingMathJax) {
|
|
143
147
|
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
144
148
|
className: "h-100 w-100 d-flex align-items-center justify-content-center"
|
|
145
149
|
}, /*#__PURE__*/_react["default"].createElement(_fileLoading["default"], null));
|
|
@@ -16,6 +16,7 @@ var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
|
|
|
16
16
|
var _constants2 = require("../../constants");
|
|
17
17
|
var _index = _interopRequireDefault(require("../../plugins/ai/ai-module/index.js"));
|
|
18
18
|
var _index2 = _interopRequireDefault(require("../../plugins/file-view/insert-view-dialog/index.js"));
|
|
19
|
+
var _formulaModal = _interopRequireDefault(require("../../plugins/formula/menu/formula-modal.js"));
|
|
19
20
|
var _helpers = require("../../plugins/image/helpers");
|
|
20
21
|
var _addLinkDialog = _interopRequireDefault(require("../../plugins/link/dialog/add-link-dialog"));
|
|
21
22
|
var _dialogs = require("../../plugins/table/dialogs");
|
|
@@ -73,6 +74,10 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
|
|
|
73
74
|
_useState20 = (0, _slicedToArray2["default"])(_useState19, 2),
|
|
74
75
|
data = _useState20[0],
|
|
75
76
|
setData = _useState20[1];
|
|
77
|
+
var _useState21 = (0, _react.useState)(''),
|
|
78
|
+
_useState22 = (0, _slicedToArray2["default"])(_useState21, 2),
|
|
79
|
+
formula = _useState22[0],
|
|
80
|
+
setFormula = _useState22[1];
|
|
76
81
|
var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
|
|
77
82
|
t = _useTranslation.t;
|
|
78
83
|
var uploadLocalImageInputRef = (0, _react.useRef)();
|
|
@@ -109,28 +114,41 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
|
|
|
109
114
|
});
|
|
110
115
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
111
116
|
}, [validEditor, uploadLocalImageInputRef, insertPosition, slateNode]);
|
|
117
|
+
var handleOpenLinkModal = (0, _react.useCallback)(function (_ref2) {
|
|
118
|
+
var formulaElement = _ref2.element,
|
|
119
|
+
editor = _ref2.editor;
|
|
120
|
+
if (formulaElement && editor) {
|
|
121
|
+
var _ref3 = formulaElement.data || {},
|
|
122
|
+
_formula = _ref3.formula;
|
|
123
|
+
setFormula(_formula);
|
|
124
|
+
setDialogType(_constants2.FORMULA);
|
|
125
|
+
setValidEditor(editor);
|
|
126
|
+
}
|
|
127
|
+
}, []);
|
|
112
128
|
(0, _react.useEffect)(function () {
|
|
113
129
|
var eventBus = _eventBus["default"].getInstance();
|
|
114
130
|
var toggleDialogSubscribe = eventBus.subscribe(_constants.INTERNAL_EVENT.INSERT_ELEMENT, toggleDialog);
|
|
131
|
+
var unsubscribe = eventBus.subscribe(_constants.INTERNAL_EVENT.ON_OPEN_FORMULA_DIALOG, handleOpenLinkModal);
|
|
115
132
|
return function () {
|
|
116
133
|
toggleDialogSubscribe();
|
|
134
|
+
unsubscribe();
|
|
117
135
|
};
|
|
118
136
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
119
137
|
}, []);
|
|
120
|
-
var toggleDialog = (0, _react.useCallback)(function (
|
|
121
|
-
var type =
|
|
122
|
-
element =
|
|
123
|
-
|
|
124
|
-
insertPosition =
|
|
125
|
-
slateNode =
|
|
126
|
-
insertFileLinkCallback =
|
|
127
|
-
insertSdocFileLinkCallback =
|
|
128
|
-
insertVideo =
|
|
129
|
-
insertWhiteboard =
|
|
130
|
-
paramEditor =
|
|
131
|
-
linkTitle =
|
|
132
|
-
handleSubmit =
|
|
133
|
-
data =
|
|
138
|
+
var toggleDialog = (0, _react.useCallback)(function (_ref4) {
|
|
139
|
+
var type = _ref4.type,
|
|
140
|
+
element = _ref4.element,
|
|
141
|
+
_ref4$insertPosition = _ref4.insertPosition,
|
|
142
|
+
insertPosition = _ref4$insertPosition === void 0 ? _constants2.INSERT_POSITION.CURRENT : _ref4$insertPosition,
|
|
143
|
+
slateNode = _ref4.slateNode,
|
|
144
|
+
insertFileLinkCallback = _ref4.insertFileLinkCallback,
|
|
145
|
+
insertSdocFileLinkCallback = _ref4.insertSdocFileLinkCallback,
|
|
146
|
+
insertVideo = _ref4.insertVideo,
|
|
147
|
+
insertWhiteboard = _ref4.insertWhiteboard,
|
|
148
|
+
paramEditor = _ref4.editor,
|
|
149
|
+
linkTitle = _ref4.linkTitle,
|
|
150
|
+
handleSubmit = _ref4.handleSubmit,
|
|
151
|
+
data = _ref4.data;
|
|
134
152
|
setInsertPosition(insertPosition);
|
|
135
153
|
setSlateNode(slateNode);
|
|
136
154
|
setElement(element);
|
|
@@ -147,6 +165,7 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
|
|
|
147
165
|
});
|
|
148
166
|
setLinkTitle(linkTitle);
|
|
149
167
|
setHandleSubmit(handleSubmit);
|
|
168
|
+
setFormula('');
|
|
150
169
|
// Apply for comment editor, as it has a different editor instance
|
|
151
170
|
setValidEditor(paramEditor || editor);
|
|
152
171
|
setData(data);
|
|
@@ -252,6 +271,14 @@ var InsertElementDialog = function InsertElementDialog(_ref) {
|
|
|
252
271
|
};
|
|
253
272
|
return /*#__PURE__*/_react["default"].createElement(_index2["default"], _props);
|
|
254
273
|
}
|
|
274
|
+
case _constants2.ELEMENT_TYPE.FORMULA:
|
|
275
|
+
{
|
|
276
|
+
return /*#__PURE__*/_react["default"].createElement(_formulaModal["default"], {
|
|
277
|
+
onCloseModal: closeDialog,
|
|
278
|
+
editor: validEditor,
|
|
279
|
+
formula: formula
|
|
280
|
+
});
|
|
281
|
+
}
|
|
255
282
|
case _constants2.LOCAL_IMAGE:
|
|
256
283
|
{
|
|
257
284
|
return /*#__PURE__*/_react["default"].createElement("input", {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.WIKI_LINK = exports.WHITEBOARD = exports.VIDEO_LINK = exports.VIDEO = exports.UNORDERED_LIST = exports.TWO_COLUMN = exports.TOP_LEVEL_TYPES = exports.TITLE = exports.THREE_COLUMN = exports.TABLE_ROW = exports.TABLE_CELL = exports.TABLE = exports.SUBTITLE = exports.SDOC_LINK = exports.QUICK_INSERT = exports.PARAGRAPH = exports.ORDERED_LIST = exports.MULTI_COLUMN = exports.MENTION_TEMP = exports.MENTION = exports.LIST_ITEM = exports.LINK = exports.INLINE_LEVEL_TYPES = exports.IMAGE_BLOCK = exports.IMAGE = exports.HEADER6 = exports.HEADER5 = exports.HEADER4 = exports.HEADER3 = exports.HEADER2 = exports.HEADER1 = exports.HEADER = exports.GROUP = exports.FOUR_COLUMN = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = exports.FILE_VIEW = exports.FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK = exports.COLUMN = exports.CODE_LINE = exports.CODE_BLOCK = exports.CHECK_LIST_ITEM = exports.CALL_OUT = exports.BLOCKQUOTE = exports.ASK_AI = void 0;
|
|
6
|
+
exports.WIKI_LINK = exports.WHITEBOARD = exports.VIDEO_LINK = exports.VIDEO = exports.UNORDERED_LIST = exports.TWO_COLUMN = exports.TOP_LEVEL_TYPES = exports.TITLE = exports.THREE_COLUMN = exports.TABLE_ROW = exports.TABLE_CELL = exports.TABLE = exports.SUBTITLE = exports.SDOC_LINK = exports.QUICK_INSERT = exports.PARAGRAPH = exports.ORDERED_LIST = exports.MULTI_COLUMN = exports.MENTION_TEMP = exports.MENTION = exports.LIST_ITEM = exports.LINK = exports.INLINE_LEVEL_TYPES = exports.IMAGE_BLOCK = exports.IMAGE = exports.HEADER6 = exports.HEADER5 = exports.HEADER4 = exports.HEADER3 = exports.HEADER2 = exports.HEADER1 = exports.HEADER = exports.GROUP = exports.FOUR_COLUMN = exports.FORMULA = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = exports.FILE_VIEW = exports.FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK = exports.COLUMN = exports.CODE_LINE = exports.CODE_BLOCK = exports.CHECK_LIST_ITEM = exports.CALL_OUT = exports.BLOCKQUOTE = exports.ASK_AI = void 0;
|
|
7
7
|
var BLOCKQUOTE = exports.BLOCKQUOTE = 'blockquote';
|
|
8
8
|
var TITLE = exports.TITLE = 'title';
|
|
9
9
|
var SUBTITLE = exports.SUBTITLE = 'subtitle';
|
|
@@ -45,6 +45,7 @@ var QUICK_INSERT = exports.QUICK_INSERT = 'quick_insert';
|
|
|
45
45
|
var VIDEO_LINK = exports.VIDEO_LINK = 'video_link';
|
|
46
46
|
var WHITEBOARD = exports.WHITEBOARD = 'whiteboard';
|
|
47
47
|
var FILE_VIEW = exports.FILE_VIEW = 'file_view';
|
|
48
|
+
var FORMULA = exports.FORMULA = 'formula';
|
|
48
49
|
var ASK_AI = exports.ASK_AI = 'ask_ai';
|
|
49
50
|
|
|
50
51
|
// font
|
|
@@ -147,6 +147,12 @@ Object.defineProperty(exports, "FONT_SIZE", {
|
|
|
147
147
|
return _font.FONT_SIZE;
|
|
148
148
|
}
|
|
149
149
|
});
|
|
150
|
+
Object.defineProperty(exports, "FORMULA", {
|
|
151
|
+
enumerable: true,
|
|
152
|
+
get: function get() {
|
|
153
|
+
return _elementType.FORMULA;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
150
156
|
Object.defineProperty(exports, "FOUR_COLUMN", {
|
|
151
157
|
enumerable: true,
|
|
152
158
|
get: function get() {
|
|
@@ -550,6 +556,6 @@ var FILEEXT_TYPE_MAP = exports.FILEEXT_TYPE_MAP = {
|
|
|
550
556
|
EXCALIDRAW: 'draw',
|
|
551
557
|
DOCUMENT: 'word'
|
|
552
558
|
};
|
|
553
|
-
var SUPPORTED_SIDE_OPERATION_TYPE = exports.SUPPORTED_SIDE_OPERATION_TYPE = [_elementType.PARAGRAPH, _elementType.SUBTITLE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CHECK_LIST_ITEM, _elementType.CODE_BLOCK, _elementType.TABLE, _elementType.BLOCKQUOTE, _elementType.CALL_OUT, _elementType.IMAGE_BLOCK, _elementType.VIDEO, _elementType.WHITEBOARD];
|
|
559
|
+
var SUPPORTED_SIDE_OPERATION_TYPE = exports.SUPPORTED_SIDE_OPERATION_TYPE = [_elementType.PARAGRAPH, _elementType.SUBTITLE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CHECK_LIST_ITEM, _elementType.CODE_BLOCK, _elementType.TABLE, _elementType.BLOCKQUOTE, _elementType.CALL_OUT, _elementType.IMAGE_BLOCK, _elementType.VIDEO, _elementType.WHITEBOARD, _elementType.FORMULA];
|
|
554
560
|
var MOUSE_ENTER_EVENT_DISABLED_MAP = exports.MOUSE_ENTER_EVENT_DISABLED_MAP = (_MOUSE_ENTER_EVENT_DI = {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_MOUSE_ENTER_EVENT_DI, _elementType.PARAGRAPH, [_elementType.CALL_OUT]), _elementType.TITLE, [_elementType.CALL_OUT]), _elementType.SUBTITLE, [_elementType.CALL_OUT]), _elementType.CHECK_LIST_ITEM, [_elementType.CALL_OUT]), _elementType.ORDERED_LIST, [_elementType.CALL_OUT]), _elementType.UNORDERED_LIST, [_elementType.CALL_OUT]), _elementType.LIST_ITEM, [_elementType.CALL_OUT]), _elementType.BLOCKQUOTE, [_elementType.CALL_OUT]), _elementType.HEADER1, [_elementType.CALL_OUT]), _elementType.HEADER2, [_elementType.CALL_OUT]), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_MOUSE_ENTER_EVENT_DI, _elementType.HEADER3, [_elementType.CALL_OUT]), _elementType.HEADER4, [_elementType.CALL_OUT]), _elementType.HEADER5, [_elementType.CALL_OUT]), _elementType.HEADER6, [_elementType.CALL_OUT]), _elementType.CALL_OUT, [_elementType.CALL_OUT]));
|
|
555
|
-
var ROOT_ELEMENT_TYPES = exports.ROOT_ELEMENT_TYPES = [_elementType.PARAGRAPH, _elementType.TITLE, _elementType.SUBTITLE, _elementType.CHECK_LIST_ITEM, _elementType.ORDERED_LIST, _elementType.UNORDERED_LIST, _elementType.BLOCKQUOTE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CALL_OUT, _elementType.TABLE, _elementType.CODE_BLOCK, _elementType.IMAGE_BLOCK, _elementType.VIDEO, _elementType.WHITEBOARD];
|
|
561
|
+
var ROOT_ELEMENT_TYPES = exports.ROOT_ELEMENT_TYPES = [_elementType.PARAGRAPH, _elementType.TITLE, _elementType.SUBTITLE, _elementType.CHECK_LIST_ITEM, _elementType.ORDERED_LIST, _elementType.UNORDERED_LIST, _elementType.BLOCKQUOTE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CALL_OUT, _elementType.TABLE, _elementType.CODE_BLOCK, _elementType.IMAGE_BLOCK, _elementType.VIDEO, _elementType.WHITEBOARD, _elementType.FORMULA];
|
|
@@ -97,7 +97,11 @@ var MENUS_CONFIG_MAP = exports.MENUS_CONFIG_MAP = (_MENUS_CONFIG_MAP = {}, (0, _
|
|
|
97
97
|
id: "sdoc_".concat(_elementType.TABLE),
|
|
98
98
|
iconClass: 'sdocfont sdoc-table',
|
|
99
99
|
text: 'Table'
|
|
100
|
-
}), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_MENUS_CONFIG_MAP,
|
|
100
|
+
}), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_MENUS_CONFIG_MAP, _elementType.FORMULA, {
|
|
101
|
+
id: "seafile_".concat(_elementType.FORMULA),
|
|
102
|
+
iconClass: 'sdocfont sdoc-formula',
|
|
103
|
+
text: 'Formula'
|
|
104
|
+
}), TEXT_STYLE, [{
|
|
101
105
|
id: ITALIC,
|
|
102
106
|
iconClass: 'sdocfont sdoc-italic',
|
|
103
107
|
text: 'Italic',
|
|
@@ -201,7 +205,7 @@ var MENUS_CONFIG_MAP = exports.MENUS_CONFIG_MAP = (_MENUS_CONFIG_MAP = {}, (0, _
|
|
|
201
205
|
id: "sdoc_".concat(_elementType.CALL_OUT),
|
|
202
206
|
iconClass: 'sdocfont sdoc-callout',
|
|
203
207
|
text: 'Callout'
|
|
204
|
-
}), SEARCH_REPLACE, {
|
|
208
|
+
}), (0, _defineProperty2["default"])(_MENUS_CONFIG_MAP, SEARCH_REPLACE, {
|
|
205
209
|
id: "sdoc_".concat(SEARCH_REPLACE),
|
|
206
210
|
iconClass: 'sdocfont sdoc-find-replace',
|
|
207
211
|
text: 'Search_and_replace'
|
|
@@ -336,7 +340,7 @@ var SIDE_INSERT_MENUS_CONFIG = exports.SIDE_INSERT_MENUS_CONFIG = (_SIDE_INSERT_
|
|
|
336
340
|
iconClass: 'sdocfont sdoc-text',
|
|
337
341
|
type: _elementType.PARAGRAPH,
|
|
338
342
|
text: 'Paragraph'
|
|
339
|
-
}), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_INSERT_MENUS_CO, _elementType.HEADER, [{
|
|
343
|
+
}), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_INSERT_MENUS_CO, _elementType.HEADER, [{
|
|
340
344
|
id: _elementType.HEADER1,
|
|
341
345
|
iconClass: 'sdocfont sdoc-header1',
|
|
342
346
|
type: _elementType.HEADER1,
|
|
@@ -376,9 +380,14 @@ var SIDE_INSERT_MENUS_CONFIG = exports.SIDE_INSERT_MENUS_CONFIG = (_SIDE_INSERT_
|
|
|
376
380
|
iconClass: 'sdocfont sdoc-file-view',
|
|
377
381
|
type: _elementType.FILE_VIEW,
|
|
378
382
|
text: 'File_view'
|
|
383
|
+
}), _elementType.FORMULA, {
|
|
384
|
+
id: 'sdoc-side-menu-item-formula',
|
|
385
|
+
iconClass: 'sdocfont sdoc-formula',
|
|
386
|
+
type: _elementType.FORMULA,
|
|
387
|
+
text: 'Formula'
|
|
379
388
|
}));
|
|
380
389
|
var SIDE_INSERT_MENUS_SEARCH_MAP = exports.SIDE_INSERT_MENUS_SEARCH_MAP = (_SIDE_INSERT_MENUS_SE = {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_INSERT_MENUS_SE, _elementType.IMAGE, 'Image'), _elementType.VIDEO, 'Video'), _elementType.TABLE, 'Table'), _elementType.COLUMN, 'Column'), _elementType.TWO_COLUMN, 'Two_column'), _elementType.THREE_COLUMN, 'Three_column'), _elementType.FOUR_COLUMN, 'Four_column'), _elementType.LINK, 'Link'), _elementType.CODE_BLOCK, 'Code_block'), _elementType.CALL_OUT, 'Callout'), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_INSERT_MENUS_SE, _elementType.UNORDERED_LIST, 'Unordered_list'), _elementType.ORDERED_LIST, 'Ordered_list'), _elementType.CHECK_LIST_ITEM, 'Check_list'), _elementType.PARAGRAPH, 'Paragraph'), _elementType.HEADER1, 'Header_one'), _elementType.HEADER2, 'Header_two'), _elementType.HEADER3, 'Header_three'), _elementType.HEADER4, 'Header_four'), _elementType.FILE_VIEW, 'File_view'));
|
|
381
|
-
var SIDE_QUICK_INSERT_MENUS_SEARCH_MAP = exports.SIDE_QUICK_INSERT_MENUS_SEARCH_MAP = (_SIDE_QUICK_INSERT_ME = {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_QUICK_INSERT_ME, _elementType.IMAGE, 'Image'), _elementType.VIDEO, 'Video'), _elementType.TABLE, 'Table'), _elementType.COLUMN, 'Column'), _elementType.TWO_COLUMN, 'Two_column'), _elementType.THREE_COLUMN, 'Three_column'), _elementType.FOUR_COLUMN, 'Four_column'), _elementType.LINK, 'Link'), _elementType.CODE_BLOCK, 'Code_block'), _elementType.CALL_OUT, 'Callout'), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_QUICK_INSERT_ME, _elementType.UNORDERED_LIST, 'Unordered_list'), _elementType.ORDERED_LIST, 'Ordered_list'), _elementType.CHECK_LIST_ITEM, 'Check_list'), _elementType.PARAGRAPH, 'Paragraph'), _elementType.HEADER1, 'Header_one'), _elementType.HEADER2, 'Header_two'), _elementType.HEADER3, 'Header_three'), _elementType.HEADER4, 'Header_four'), _elementType.FILE_VIEW, 'File_view'));
|
|
390
|
+
var SIDE_QUICK_INSERT_MENUS_SEARCH_MAP = exports.SIDE_QUICK_INSERT_MENUS_SEARCH_MAP = (_SIDE_QUICK_INSERT_ME = {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_QUICK_INSERT_ME, _elementType.IMAGE, 'Image'), _elementType.VIDEO, 'Video'), _elementType.TABLE, 'Table'), _elementType.COLUMN, 'Column'), _elementType.TWO_COLUMN, 'Two_column'), _elementType.THREE_COLUMN, 'Three_column'), _elementType.FOUR_COLUMN, 'Four_column'), _elementType.LINK, 'Link'), _elementType.CODE_BLOCK, 'Code_block'), _elementType.CALL_OUT, 'Callout'), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_SIDE_QUICK_INSERT_ME, _elementType.UNORDERED_LIST, 'Unordered_list'), _elementType.ORDERED_LIST, 'Ordered_list'), _elementType.CHECK_LIST_ITEM, 'Check_list'), _elementType.PARAGRAPH, 'Paragraph'), _elementType.HEADER1, 'Header_one'), _elementType.HEADER2, 'Header_two'), _elementType.HEADER3, 'Header_three'), _elementType.HEADER4, 'Header_four'), _elementType.FILE_VIEW, 'File_view'), _elementType.FORMULA, 'Formula'));
|
|
382
391
|
|
|
383
392
|
// Other operations menu config
|
|
384
393
|
var SIDE_OTHER_OPERATIONS_MENUS_SEARCH_MAP = exports.SIDE_OTHER_OPERATIONS_MENUS_SEARCH_MAP = {
|
|
@@ -25,6 +25,7 @@ var CalloutMenu = function CalloutMenu(_ref) {
|
|
|
25
25
|
t = _useTranslation.t;
|
|
26
26
|
var handleDisplayAlert = (0, _react.useCallback)(function (type) {
|
|
27
27
|
setTimeout(function () {
|
|
28
|
+
if (typeof type !== 'string') return;
|
|
28
29
|
_toast["default"].warning("".concat(t('The_current_location_does_not_support_pasting')).concat(t(type && type.at(0).toUpperCase() + type.slice(1))));
|
|
29
30
|
}, 0);
|
|
30
31
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/* formula */
|
|
2
|
+
.sdoc-selected-formula {
|
|
3
|
+
display: block;
|
|
4
|
+
user-select: none;
|
|
5
|
+
outline: 2px solid #007bff;
|
|
6
|
+
cursor: pointer;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.sdoc-block-formula {
|
|
10
|
+
margin: 5px 0;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.sdoc-block-formula svg,
|
|
14
|
+
.sdoc-block-formula svg * {
|
|
15
|
+
pointer-events: none;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
.sdoc-selected-formula .MathJax {
|
|
20
|
+
margin: 0;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.formula-dialog-wrapper .form-check-label {
|
|
24
|
+
margin-bottom: 4px;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.formula-dialog-wrapper .formula-preview {
|
|
28
|
+
padding: 10px;
|
|
29
|
+
border: 2px dashed #ebebeb;
|
|
30
|
+
min-height: 40px;
|
|
31
|
+
overflow-x: auto;
|
|
32
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.updateFormula = exports.onCopyFormulaNode = exports.insertFormula = void 0;
|
|
8
|
+
var _slate = require("@seafile/slate");
|
|
9
|
+
var _slateReact = require("@seafile/slate-react");
|
|
10
|
+
var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
|
|
11
|
+
var _slugid = _interopRequireDefault(require("slugid"));
|
|
12
|
+
var _elementType = require("../../constants/element-type");
|
|
13
|
+
var _core = require("../../core");
|
|
14
|
+
var insertFormula = exports.insertFormula = function insertFormula(editor, data) {
|
|
15
|
+
var formula = {
|
|
16
|
+
id: _slugid["default"].nice(),
|
|
17
|
+
type: _elementType.FORMULA,
|
|
18
|
+
data: {
|
|
19
|
+
formula: data.formula
|
|
20
|
+
},
|
|
21
|
+
children: [(0, _core.generateDefaultText)()]
|
|
22
|
+
};
|
|
23
|
+
_slate.Transforms.insertNodes(editor, formula, {
|
|
24
|
+
at: data.at,
|
|
25
|
+
"void": true
|
|
26
|
+
});
|
|
27
|
+
(0, _core.focusEditor)(editor);
|
|
28
|
+
};
|
|
29
|
+
var updateFormula = exports.updateFormula = function updateFormula(editor, data) {
|
|
30
|
+
var formula = data.formula,
|
|
31
|
+
at = data.at;
|
|
32
|
+
_slate.Transforms.setNodes(editor, {
|
|
33
|
+
data: {
|
|
34
|
+
formula: formula
|
|
35
|
+
}
|
|
36
|
+
}, {
|
|
37
|
+
at: at,
|
|
38
|
+
"void": true
|
|
39
|
+
});
|
|
40
|
+
(0, _core.focusEditor)(editor);
|
|
41
|
+
};
|
|
42
|
+
var onCopyFormulaNode = exports.onCopyFormulaNode = function onCopyFormulaNode(editor, element) {
|
|
43
|
+
if (editor.selection == null || _slate.Range.isExpanded(editor.selection)) return;
|
|
44
|
+
var p = _slateReact.ReactEditor.findPath(editor, element);
|
|
45
|
+
_slate.Transforms.select(editor, p);
|
|
46
|
+
var newData = editor.setFragmentData(new DataTransfer());
|
|
47
|
+
(0, _copyToClipboard["default"])('copy', {
|
|
48
|
+
onCopy: function onCopy(clipboardData) {
|
|
49
|
+
newData.types.forEach(function (type) {
|
|
50
|
+
var data = newData.getData(type);
|
|
51
|
+
clipboardData.setData(type, data);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
.sdoc-formula-hover-menu-container {
|
|
2
|
+
position: absolute;
|
|
3
|
+
height: 42px;
|
|
4
|
+
z-index: 101;
|
|
5
|
+
width: fit-content;
|
|
6
|
+
max-width: 250px;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.sdoc-formula-hover-menu-container .hover-menu-container {
|
|
10
|
+
height: 36px;
|
|
11
|
+
width: 100%;
|
|
12
|
+
padding: 7px 8px;
|
|
13
|
+
background-color: #fff;
|
|
14
|
+
display: flex;
|
|
15
|
+
justify-content: space-around;
|
|
16
|
+
align-items: center;
|
|
17
|
+
border-radius: 3px;
|
|
18
|
+
box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08);
|
|
19
|
+
border: 1px solid #e8e8e8;
|
|
20
|
+
color: #212529;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.sdoc-formula-hover-menu-container .sdocfont {
|
|
24
|
+
line-height: 1;
|
|
25
|
+
font-size: 14px;
|
|
26
|
+
color: #666;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.sdoc-formula-hover-menu-container .hover-menu-container .active {
|
|
30
|
+
text-decoration: none;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.sdoc-formula-hover-menu-container .hover-menu-container .op-item {
|
|
34
|
+
position: relative;
|
|
35
|
+
height: 100%;
|
|
36
|
+
width: 100%;
|
|
37
|
+
font-size: 12px;
|
|
38
|
+
border-radius: 2px;
|
|
39
|
+
text-align: center;
|
|
40
|
+
line-height: 20px;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.sdoc-formula-hover-menu-container .sdoc-formula-hover-operation-item.sdoc-formula-hover-operation-lang .op-item {
|
|
44
|
+
padding: 0 5px;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.sdoc-formula-hover-menu-container .hover-menu-container .sdoc-formula-hover-operation-lang .sdocfont {
|
|
48
|
+
display: inline-flex;
|
|
49
|
+
align-items: center;
|
|
50
|
+
justify-content: center;
|
|
51
|
+
margin-left: 8px;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.sdoc-formula-hover-menu-container .sdoc-formula-hover-operation-item {
|
|
55
|
+
height: 20px;
|
|
56
|
+
width: 20px;
|
|
57
|
+
text-align: center;
|
|
58
|
+
justify-content: center;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.sdoc-formula-hover-menu-container .sdoc-formula-hover-operation-item.sdoc-formula-hover-operation-lang {
|
|
62
|
+
width: fit-content;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.sdoc-formula-hover-menu-container .sdoc-formula-hover-operation-lang .sdoc-arrow-down {
|
|
66
|
+
font-size: 12px;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.sdoc-formula-hover-menu-container .sdoc-formula-hover-operation-divider {
|
|
70
|
+
height: 20px;
|
|
71
|
+
width: 1px;
|
|
72
|
+
background-color: #e5e5e5;
|
|
73
|
+
margin: 0 8px;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.sdoc-formula-hover-menu-container .hover-menu-container .op-item:hover {
|
|
77
|
+
text-decoration: none;
|
|
78
|
+
background: #F5F5F5;
|
|
79
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _reactI18next = require("react-i18next");
|
|
12
|
+
var _toast = _interopRequireDefault(require("../../../../components/toast"));
|
|
13
|
+
var _tooltip = _interopRequireDefault(require("../../../../components/tooltip"));
|
|
14
|
+
var _commons = require("../../../commons/");
|
|
15
|
+
var _helper = require("../helper");
|
|
16
|
+
require("./index.css");
|
|
17
|
+
var FormulaHoverMenu = function FormulaHoverMenu(_ref) {
|
|
18
|
+
var editor = _ref.editor,
|
|
19
|
+
element = _ref.element,
|
|
20
|
+
menuPosition = _ref.menuPosition,
|
|
21
|
+
onDeleteFormula = _ref.onDeleteFormula,
|
|
22
|
+
t = _ref.t,
|
|
23
|
+
onHideInsertHoverMenu = _ref.onHideInsertHoverMenu,
|
|
24
|
+
onEditFormula = _ref.onEditFormula;
|
|
25
|
+
var _useState = (0, _react.useState)(false),
|
|
26
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
27
|
+
isShowTooltip = _useState2[0],
|
|
28
|
+
setIsShowTooltip = _useState2[1];
|
|
29
|
+
(0, _react.useEffect)(function () {
|
|
30
|
+
setIsShowTooltip(true);
|
|
31
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
32
|
+
}, []);
|
|
33
|
+
var onDelete = (0, _react.useCallback)(function () {
|
|
34
|
+
onDeleteFormula();
|
|
35
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
36
|
+
}, []);
|
|
37
|
+
var onCopy = (0, _react.useCallback)(function (e) {
|
|
38
|
+
e.stopPropagation();
|
|
39
|
+
(0, _helper.onCopyFormulaNode)(editor, element);
|
|
40
|
+
_toast["default"].success(t('Copied'), {
|
|
41
|
+
hasCloseButton: false,
|
|
42
|
+
duration: 2
|
|
43
|
+
});
|
|
44
|
+
onHideInsertHoverMenu();
|
|
45
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
46
|
+
}, []);
|
|
47
|
+
return /*#__PURE__*/_react["default"].createElement(_commons.ElementPopover, null, /*#__PURE__*/_react["default"].createElement("div", {
|
|
48
|
+
className: "sdoc-formula-hover-menu-container",
|
|
49
|
+
style: menuPosition
|
|
50
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
51
|
+
className: "hover-menu-container"
|
|
52
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
53
|
+
id: "sdoc_formula_edit",
|
|
54
|
+
className: "sdoc-formula-hover-operation-item"
|
|
55
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
56
|
+
role: "button",
|
|
57
|
+
className: "op-item",
|
|
58
|
+
onClick: onEditFormula
|
|
59
|
+
}, /*#__PURE__*/_react["default"].createElement("i", {
|
|
60
|
+
className: "sdocfont sdoc-rename"
|
|
61
|
+
})), isShowTooltip && /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
|
|
62
|
+
target: "sdoc_formula_edit",
|
|
63
|
+
placement: "top",
|
|
64
|
+
fade: true
|
|
65
|
+
}, t('Edit_formula'))), /*#__PURE__*/_react["default"].createElement("div", {
|
|
66
|
+
className: "sdoc-formula-hover-operation-divider"
|
|
67
|
+
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
68
|
+
id: "sdoc_formula_copy",
|
|
69
|
+
className: "sdoc-formula-hover-operation-item"
|
|
70
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
71
|
+
role: "button",
|
|
72
|
+
className: "op-item",
|
|
73
|
+
onClick: onCopy
|
|
74
|
+
}, /*#__PURE__*/_react["default"].createElement("i", {
|
|
75
|
+
className: "sdocfont sdoc-copy"
|
|
76
|
+
})), isShowTooltip && /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
|
|
77
|
+
target: "sdoc_formula_copy",
|
|
78
|
+
placement: "top",
|
|
79
|
+
fade: true
|
|
80
|
+
}, t('Copy'))), /*#__PURE__*/_react["default"].createElement("div", {
|
|
81
|
+
className: "sdoc-formula-hover-operation-divider"
|
|
82
|
+
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
83
|
+
id: "sdoc_formula_delete",
|
|
84
|
+
className: "sdoc-formula-hover-operation-item"
|
|
85
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
86
|
+
role: "button",
|
|
87
|
+
className: "op-item",
|
|
88
|
+
onClick: onDelete
|
|
89
|
+
}, /*#__PURE__*/_react["default"].createElement("i", {
|
|
90
|
+
className: "sdocfont sdoc-delete"
|
|
91
|
+
})), isShowTooltip && /*#__PURE__*/_react["default"].createElement(_tooltip["default"], {
|
|
92
|
+
target: "sdoc_formula_delete",
|
|
93
|
+
placement: "top",
|
|
94
|
+
fade: true
|
|
95
|
+
}, t('Delete'))))));
|
|
96
|
+
};
|
|
97
|
+
var _default = exports["default"] = (0, _reactI18next.withTranslation)('sdoc-editor')(FormulaHoverMenu);
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _elementType = require("../../constants/element-type");
|
|
9
|
+
var _menu = _interopRequireDefault(require("./menu"));
|
|
10
|
+
var _plugin = _interopRequireDefault(require("./plugin"));
|
|
11
|
+
var _renderElement = _interopRequireDefault(require("./render-element"));
|
|
12
|
+
var FormulaPlugin = {
|
|
13
|
+
type: _elementType.FORMULA,
|
|
14
|
+
nodeType: 'element',
|
|
15
|
+
editorMenus: [_menu["default"]],
|
|
16
|
+
editorPlugin: _plugin["default"],
|
|
17
|
+
renderElements: [_renderElement["default"]]
|
|
18
|
+
};
|
|
19
|
+
var _default = exports["default"] = FormulaPlugin;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
var _reactI18next = require("react-i18next");
|
|
12
|
+
var _reactstrap = require("reactstrap");
|
|
13
|
+
var _core = require("../../../core");
|
|
14
|
+
var _helper = require("../helper");
|
|
15
|
+
var FormulaModal = function FormulaModal(_ref) {
|
|
16
|
+
var editor = _ref.editor,
|
|
17
|
+
formula = _ref.formula,
|
|
18
|
+
onCloseModal = _ref.onCloseModal;
|
|
19
|
+
var oldFormulaRef = (0, _react.useRef)(formula);
|
|
20
|
+
var _useState = (0, _react.useState)(formula),
|
|
21
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
22
|
+
newFormula = _useState2[0],
|
|
23
|
+
setNewFormula = _useState2[1];
|
|
24
|
+
var _useState3 = (0, _react.useState)(null),
|
|
25
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
26
|
+
modifyPath = _useState4[0],
|
|
27
|
+
setModifyPath = _useState4[1];
|
|
28
|
+
var _useState5 = (0, _react.useState)(true),
|
|
29
|
+
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
|
30
|
+
isDisabled = _useState6[0],
|
|
31
|
+
setIsDisabled = _useState6[1];
|
|
32
|
+
var formulaPreviewRef = (0, _react.useRef)(null);
|
|
33
|
+
var _useTranslation = (0, _reactI18next.useTranslation)('sdoc-editor'),
|
|
34
|
+
t = _useTranslation.t;
|
|
35
|
+
|
|
36
|
+
// record current selection position
|
|
37
|
+
(0, _react.useEffect)(function () {
|
|
38
|
+
var node = (0, _core.getAboveBlockNode)(editor);
|
|
39
|
+
if (node) {
|
|
40
|
+
setModifyPath(node[1]);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
44
|
+
}, []);
|
|
45
|
+
(0, _react.useEffect)(function () {
|
|
46
|
+
if (formulaPreviewRef.current) {
|
|
47
|
+
formulaPreviewRef.current.innerHTML = '';
|
|
48
|
+
var dom = window.MathJax.tex2svg(newFormula);
|
|
49
|
+
formulaPreviewRef.current.appendChild(dom);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
var onFormulaChange = (0, _react.useCallback)(function (event) {
|
|
53
|
+
setIsDisabled(false);
|
|
54
|
+
setNewFormula(event.target.value);
|
|
55
|
+
}, []);
|
|
56
|
+
var handleUpdateFormula = (0, _react.useCallback)(function () {
|
|
57
|
+
var data = {
|
|
58
|
+
formula: newFormula,
|
|
59
|
+
at: modifyPath
|
|
60
|
+
};
|
|
61
|
+
if (oldFormulaRef.current) {
|
|
62
|
+
(0, _helper.updateFormula)(editor, data);
|
|
63
|
+
} else {
|
|
64
|
+
(0, _helper.insertFormula)(editor, data);
|
|
65
|
+
}
|
|
66
|
+
onCloseModal();
|
|
67
|
+
}, [editor, modifyPath, newFormula, onCloseModal]);
|
|
68
|
+
return /*#__PURE__*/_react["default"].createElement(_reactstrap.Modal, {
|
|
69
|
+
isOpen: true,
|
|
70
|
+
toggle: onCloseModal,
|
|
71
|
+
autoFocus: false,
|
|
72
|
+
wrapClassName: "formula-dialog-wrapper"
|
|
73
|
+
}, /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalHeader, {
|
|
74
|
+
toggle: onCloseModal
|
|
75
|
+
}, t('Insert_formula')), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalBody, null, /*#__PURE__*/_react["default"].createElement("div", {
|
|
76
|
+
className: "form-group"
|
|
77
|
+
}, /*#__PURE__*/_react["default"].createElement("label", {
|
|
78
|
+
className: "form-check-label"
|
|
79
|
+
}, t('Formula')), /*#__PURE__*/_react["default"].createElement(_reactstrap.Input, {
|
|
80
|
+
type: "textarea",
|
|
81
|
+
className: "form-control",
|
|
82
|
+
value: newFormula,
|
|
83
|
+
autoFocus: true,
|
|
84
|
+
onChange: onFormulaChange
|
|
85
|
+
})), /*#__PURE__*/_react["default"].createElement("div", {
|
|
86
|
+
ref: formulaPreviewRef,
|
|
87
|
+
className: "formula-preview"
|
|
88
|
+
})), /*#__PURE__*/_react["default"].createElement(_reactstrap.ModalFooter, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
|
|
89
|
+
color: "secondary",
|
|
90
|
+
onClick: onCloseModal
|
|
91
|
+
}, t('Cancel')), /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
|
|
92
|
+
color: "primary",
|
|
93
|
+
disabled: isDisabled,
|
|
94
|
+
onClick: handleUpdateFormula
|
|
95
|
+
}, t('Insert_formula'))));
|
|
96
|
+
};
|
|
97
|
+
var _default = exports["default"] = FormulaModal;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
var _constants = require("../../../../constants");
|
|
10
|
+
var _eventBus = _interopRequireDefault(require("../../../../utils/event-bus"));
|
|
11
|
+
var _dropdownMenuItem = _interopRequireDefault(require("../../../commons/dropdown-menu-item"));
|
|
12
|
+
var _constants2 = require("../../../constants");
|
|
13
|
+
var FormulaMenu = function FormulaMenu(_ref) {
|
|
14
|
+
var editor = _ref.editor,
|
|
15
|
+
readonly = _ref.readonly,
|
|
16
|
+
toggle = _ref.toggle;
|
|
17
|
+
var menuConfig = _constants2.MENUS_CONFIG_MAP[_constants2.ELEMENT_TYPE.FORMULA];
|
|
18
|
+
var OpenFormulaModal = function OpenFormulaModal() {
|
|
19
|
+
toggle && toggle();
|
|
20
|
+
var eventBus = _eventBus["default"].getInstance();
|
|
21
|
+
eventBus.dispatch(_constants.INTERNAL_EVENT.INSERT_ELEMENT, {
|
|
22
|
+
type: _constants2.ELEMENT_TYPE.FORMULA,
|
|
23
|
+
editor: editor
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
return /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
|
|
27
|
+
disabled: readonly,
|
|
28
|
+
menuConfig: menuConfig,
|
|
29
|
+
onClick: OpenFormulaModal
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
var _default = exports["default"] = FormulaMenu;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
9
|
+
var _slate = require("@seafile/slate");
|
|
10
|
+
var _constants = require("../../constants");
|
|
11
|
+
var _core = require("../../core");
|
|
12
|
+
var withFormula = function withFormula(editor) {
|
|
13
|
+
var isVoid = editor.isVoid,
|
|
14
|
+
normalizeNode = editor.normalizeNode;
|
|
15
|
+
var newEditor = editor;
|
|
16
|
+
newEditor.isVoid = function (element) {
|
|
17
|
+
var type = element.type;
|
|
18
|
+
if (type === _constants.ELEMENT_TYPE.FORMULA) return true;
|
|
19
|
+
return isVoid(element);
|
|
20
|
+
};
|
|
21
|
+
newEditor.normalizeNode = function (_ref) {
|
|
22
|
+
var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
|
|
23
|
+
node = _ref2[0],
|
|
24
|
+
path = _ref2[1];
|
|
25
|
+
var type = (0, _core.getNodeType)(node);
|
|
26
|
+
if (type !== _constants.ELEMENT_TYPE.FORMULA) {
|
|
27
|
+
return normalizeNode([node, path]);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// insert empty node,continue editor
|
|
31
|
+
var isLast = (0, _core.isLastNode)(newEditor, node);
|
|
32
|
+
if (isLast) {
|
|
33
|
+
var p = (0, _core.generateEmptyElement)(_constants.PARAGRAPH);
|
|
34
|
+
_slate.Transforms.insertNodes(newEditor, p, {
|
|
35
|
+
at: [path[0] + 1]
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
return newEditor;
|
|
40
|
+
};
|
|
41
|
+
var _default = exports["default"] = withFormula;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
|
|
4
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createForOfIteratorHelper"));
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
11
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
12
|
+
var _slate = require("@seafile/slate");
|
|
13
|
+
var _slateReact = require("@seafile/slate-react");
|
|
14
|
+
var _constants = require("../../../constants");
|
|
15
|
+
var _useScrollContext = require("../../../hooks/use-scroll-context");
|
|
16
|
+
var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
|
|
17
|
+
var _core = require("../../core");
|
|
18
|
+
var _hoverMenu = _interopRequireDefault(require("./hover-menu"));
|
|
19
|
+
require("./formula.css");
|
|
20
|
+
var Formula = function Formula(_ref) {
|
|
21
|
+
var attributes = _ref.attributes,
|
|
22
|
+
element = _ref.element,
|
|
23
|
+
children = _ref.children,
|
|
24
|
+
editor = _ref.editor;
|
|
25
|
+
var readOnly = (0, _slateReact.useReadOnly)();
|
|
26
|
+
var isSelected = (0, _slateReact.useSelected)();
|
|
27
|
+
var scrollRef = (0, _useScrollContext.useScrollContext)();
|
|
28
|
+
var formulaContainerRef = (0, _react.useRef)(null);
|
|
29
|
+
// const [mathJaxReady, setMathJaxReady] = useState(false);
|
|
30
|
+
var _useState = (0, _react.useState)({
|
|
31
|
+
top: '',
|
|
32
|
+
left: ''
|
|
33
|
+
}),
|
|
34
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
35
|
+
menuPosition = _useState2[0],
|
|
36
|
+
setMenuPosition = _useState2[1];
|
|
37
|
+
var _useState3 = (0, _react.useState)(false),
|
|
38
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
39
|
+
showHoverMenu = _useState4[0],
|
|
40
|
+
setShowHoverMenu = _useState4[1];
|
|
41
|
+
var formulaBlockRef = (0, _react.useRef)(null);
|
|
42
|
+
var setPosition = (0, _react.useCallback)(function (elem) {
|
|
43
|
+
if (readOnly) return;
|
|
44
|
+
if (elem) {
|
|
45
|
+
var _elem$getBoundingClie = elem.getBoundingClientRect(),
|
|
46
|
+
top = _elem$getBoundingClie.top,
|
|
47
|
+
left = _elem$getBoundingClie.left;
|
|
48
|
+
var menuTop = top - 42; // top = top distance - menu height
|
|
49
|
+
var newMenuPosition = {
|
|
50
|
+
top: menuTop,
|
|
51
|
+
left: left // left = code-block left distance
|
|
52
|
+
};
|
|
53
|
+
setMenuPosition(newMenuPosition);
|
|
54
|
+
}
|
|
55
|
+
setShowHoverMenu(true);
|
|
56
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
57
|
+
}, []);
|
|
58
|
+
var handleClick = (0, _react.useCallback)(function (e) {
|
|
59
|
+
if (showHoverMenu) {
|
|
60
|
+
e.stopPropagation();
|
|
61
|
+
} else {
|
|
62
|
+
formulaBlockRef.current && setPosition(formulaBlockRef.current);
|
|
63
|
+
setShowHoverMenu(true);
|
|
64
|
+
}
|
|
65
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
66
|
+
}, []);
|
|
67
|
+
var onDeleteFormula = (0, _react.useCallback)(function () {
|
|
68
|
+
var path = _slateReact.ReactEditor.findPath(editor, element);
|
|
69
|
+
_slate.Transforms.removeNodes(editor, {
|
|
70
|
+
at: path
|
|
71
|
+
});
|
|
72
|
+
(0, _core.focusEditor)(editor);
|
|
73
|
+
_slate.Transforms.select(editor, editor.selection);
|
|
74
|
+
}, [editor, element]);
|
|
75
|
+
var toggleFormulaEditor = (0, _react.useCallback)(function () {
|
|
76
|
+
var eventBus = _eventBus["default"].getInstance();
|
|
77
|
+
eventBus.dispatch(_constants.INTERNAL_EVENT.ON_OPEN_FORMULA_DIALOG, {
|
|
78
|
+
element: element,
|
|
79
|
+
editor: editor
|
|
80
|
+
});
|
|
81
|
+
}, [element, editor]);
|
|
82
|
+
var onHideInsertHoverMenu = (0, _react.useCallback)(function (e) {
|
|
83
|
+
setShowHoverMenu(false);
|
|
84
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
85
|
+
}, []);
|
|
86
|
+
var onScroll = (0, _react.useCallback)(function (e) {
|
|
87
|
+
if (!formulaBlockRef.current) return;
|
|
88
|
+
setPosition(formulaBlockRef.current);
|
|
89
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
90
|
+
}, []);
|
|
91
|
+
(0, _react.useEffect)(function () {
|
|
92
|
+
var observerRefValue = null;
|
|
93
|
+
var resizeObserver = null;
|
|
94
|
+
if (showHoverMenu) {
|
|
95
|
+
scrollRef.current && scrollRef.current.addEventListener('scroll', onScroll);
|
|
96
|
+
observerRefValue = scrollRef.current;
|
|
97
|
+
resizeObserver = new ResizeObserver(function (entries) {
|
|
98
|
+
var _iterator = (0, _createForOfIteratorHelper2["default"])(entries),
|
|
99
|
+
_step;
|
|
100
|
+
try {
|
|
101
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
102
|
+
var entry = _step.value;
|
|
103
|
+
if (resizeObserver) {
|
|
104
|
+
onScroll();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
} catch (err) {
|
|
108
|
+
_iterator.e(err);
|
|
109
|
+
} finally {
|
|
110
|
+
_iterator.f();
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
resizeObserver.observe(scrollRef.current);
|
|
114
|
+
} else {
|
|
115
|
+
scrollRef.current && scrollRef.current.removeEventListener('scroll', onScroll);
|
|
116
|
+
}
|
|
117
|
+
return function () {
|
|
118
|
+
if (observerRefValue) {
|
|
119
|
+
observerRefValue.removeEventListener('scroll', onScroll);
|
|
120
|
+
}
|
|
121
|
+
if (resizeObserver) {
|
|
122
|
+
resizeObserver.disconnect();
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
126
|
+
}, [showHoverMenu]);
|
|
127
|
+
(0, _react.useEffect)(function () {
|
|
128
|
+
var _ref2 = element.data || {},
|
|
129
|
+
_ref2$formula = _ref2.formula,
|
|
130
|
+
formula = _ref2$formula === void 0 ? '' : _ref2$formula;
|
|
131
|
+
if (!formula) return;
|
|
132
|
+
if (typeof window.MathJax.tex2svg !== 'function') return;
|
|
133
|
+
if (formulaContainerRef.current && window.MathJax) {
|
|
134
|
+
var domHtml = window.MathJax.tex2svg(formula).outerHTML;
|
|
135
|
+
formulaContainerRef.current.innerHTML = domHtml;
|
|
136
|
+
}
|
|
137
|
+
}, [element]);
|
|
138
|
+
return /*#__PURE__*/_react["default"].createElement("div", Object.assign({}, attributes, {
|
|
139
|
+
"data-id": element.id,
|
|
140
|
+
onDoubleClick: toggleFormulaEditor,
|
|
141
|
+
onClick: handleClick,
|
|
142
|
+
className: 'sdoc-block-formula' + (isSelected ? ' sdoc-selected-formula' : '')
|
|
143
|
+
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
144
|
+
ref: formulaBlockRef
|
|
145
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
146
|
+
contentEditable: false,
|
|
147
|
+
ref: formulaContainerRef
|
|
148
|
+
}), /*#__PURE__*/_react["default"].createElement("span", {
|
|
149
|
+
contentEditable: "false",
|
|
150
|
+
suppressContentEditableWarning: true
|
|
151
|
+
}, children)), isSelected && showHoverMenu && /*#__PURE__*/_react["default"].createElement(_hoverMenu["default"], {
|
|
152
|
+
editor: editor,
|
|
153
|
+
element: element,
|
|
154
|
+
menuPosition: menuPosition,
|
|
155
|
+
onDeleteFormula: onDeleteFormula,
|
|
156
|
+
onEditFormula: toggleFormulaEditor,
|
|
157
|
+
onHideInsertHoverMenu: onHideInsertHoverMenu
|
|
158
|
+
}));
|
|
159
|
+
};
|
|
160
|
+
var renderFormula = function renderFormula(props, editor) {
|
|
161
|
+
return /*#__PURE__*/_react["default"].createElement(Formula, Object.assign({}, props, {
|
|
162
|
+
editor: editor
|
|
163
|
+
}));
|
|
164
|
+
};
|
|
165
|
+
var _default = exports["default"] = renderFormula;
|
|
@@ -47,6 +47,12 @@ Object.defineProperty(exports, "FontPlugin", {
|
|
|
47
47
|
return _font["default"];
|
|
48
48
|
}
|
|
49
49
|
});
|
|
50
|
+
Object.defineProperty(exports, "FormulaPlugin", {
|
|
51
|
+
enumerable: true,
|
|
52
|
+
get: function get() {
|
|
53
|
+
return _formula["default"];
|
|
54
|
+
}
|
|
55
|
+
});
|
|
50
56
|
Object.defineProperty(exports, "GroupPlugin", {
|
|
51
57
|
enumerable: true,
|
|
52
58
|
get: function get() {
|
|
@@ -169,6 +175,7 @@ var _codeBlock = _interopRequireDefault(require("./code-block"));
|
|
|
169
175
|
var _fileLink = _interopRequireDefault(require("./file-link"));
|
|
170
176
|
var _fileView = _interopRequireDefault(require("./file-view"));
|
|
171
177
|
var _font = _interopRequireDefault(require("./font"));
|
|
178
|
+
var _formula = _interopRequireDefault(require("./formula"));
|
|
172
179
|
var _group = _interopRequireDefault(require("./group"));
|
|
173
180
|
var _header = _interopRequireDefault(require("./header"));
|
|
174
181
|
var _html = _interopRequireDefault(require("./html"));
|
|
@@ -188,7 +195,7 @@ var _textStyle = _interopRequireDefault(require("./text-style"));
|
|
|
188
195
|
var _video = _interopRequireDefault(require("./video"));
|
|
189
196
|
var _whiteboard = _interopRequireDefault(require("./whiteboard"));
|
|
190
197
|
var _wikiLink = _interopRequireDefault(require("./wiki-link"));
|
|
191
|
-
var Plugins = [_markdown["default"], _html["default"], _header["default"], _link["default"], _blockquote["default"], _list["default"], _checkList["default"], _codeBlock["default"], _image["default"], _video["default"], _table["default"], _multiColumn["default"], _textStyle["default"], _textAlign["default"], _font["default"], _sdocLink["default"], _paragraph["default"], _fileLink["default"], _callout["default"], _searchReplace["default"], _quickInsert["default"], _group["default"], _whiteboard["default"], _fileView["default"]];
|
|
198
|
+
var Plugins = [_markdown["default"], _html["default"], _header["default"], _link["default"], _blockquote["default"], _list["default"], _checkList["default"], _codeBlock["default"], _image["default"], _video["default"], _table["default"], _multiColumn["default"], _textStyle["default"], _textAlign["default"], _font["default"], _sdocLink["default"], _paragraph["default"], _fileLink["default"], _callout["default"], _searchReplace["default"], _quickInsert["default"], _group["default"], _whiteboard["default"], _fileView["default"], _formula["default"]];
|
|
192
199
|
var WikiPlugins = exports.WikiPlugins = [].concat(Plugins, [_wikiLink["default"], _fileView["default"]]);
|
|
193
200
|
var CommentPlugins = exports.CommentPlugins = [_markdown["default"], _html["default"], _paragraph["default"], _textStyle["default"], _list["default"], _image["default"], _link["default"], _mention["default"], _blockquote["default"]];
|
|
194
201
|
var _default = exports["default"] = Plugins;
|
|
@@ -39,7 +39,7 @@ var LinkHover = function LinkHover(_ref) {
|
|
|
39
39
|
var onMouseDown = (0, _react.useCallback)(function (event) {
|
|
40
40
|
if (!(0, _isUrl["default"])(element.href)) {
|
|
41
41
|
event.preventDefault();
|
|
42
|
-
_toast["default"].danger('The_link_is_invalid');
|
|
42
|
+
_toast["default"].danger(t('The_link_is_invalid'));
|
|
43
43
|
return;
|
|
44
44
|
}
|
|
45
45
|
event.stopPropagation();
|
|
@@ -12,6 +12,7 @@ var _callSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/cal
|
|
|
12
12
|
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/inherits"));
|
|
13
13
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/defineProperty"));
|
|
14
14
|
var _react = _interopRequireDefault(require("react"));
|
|
15
|
+
var _reactI18next = require("react-i18next");
|
|
15
16
|
var _slate = require("@seafile/slate");
|
|
16
17
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
17
18
|
var _isUrl = _interopRequireDefault(require("is-url"));
|
|
@@ -114,10 +115,12 @@ var Link = /*#__PURE__*/function (_React$Component) {
|
|
|
114
115
|
(0, _helpers.unWrapLinkNode)(editor);
|
|
115
116
|
});
|
|
116
117
|
(0, _defineProperty2["default"])(_this, "onOpenLink", function (event) {
|
|
117
|
-
var
|
|
118
|
+
var _this$props = _this.props,
|
|
119
|
+
element = _this$props.element,
|
|
120
|
+
t = _this$props.t;
|
|
118
121
|
if (!(0, _isUrl["default"])(element.href)) {
|
|
119
122
|
event.preventDefault();
|
|
120
|
-
_toast["default"].danger('The_link_is_invalid');
|
|
123
|
+
_toast["default"].danger(t('The_link_is_invalid'));
|
|
121
124
|
return;
|
|
122
125
|
}
|
|
123
126
|
if (!(0, _helpers.isWeChat)()) {
|
|
@@ -154,12 +157,12 @@ var Link = /*#__PURE__*/function (_React$Component) {
|
|
|
154
157
|
key: "render",
|
|
155
158
|
value: function render() {
|
|
156
159
|
var _element$children$2;
|
|
157
|
-
var _this$
|
|
158
|
-
attributes = _this$
|
|
159
|
-
children = _this$
|
|
160
|
-
element = _this$
|
|
161
|
-
editor = _this$
|
|
162
|
-
readonly = _this$
|
|
160
|
+
var _this$props2 = this.props,
|
|
161
|
+
attributes = _this$props2.attributes,
|
|
162
|
+
children = _this$props2.children,
|
|
163
|
+
element = _this$props2.element,
|
|
164
|
+
editor = _this$props2.editor,
|
|
165
|
+
readonly = _this$props2.readonly;
|
|
163
166
|
var _this$state = this.state,
|
|
164
167
|
isShowLinkMenu = _this$state.isShowLinkMenu,
|
|
165
168
|
menuPosition = _this$state.menuPosition;
|
|
@@ -195,8 +198,9 @@ var Link = /*#__PURE__*/function (_React$Component) {
|
|
|
195
198
|
}]);
|
|
196
199
|
}(_react["default"].Component);
|
|
197
200
|
(0, _defineProperty2["default"])(Link, "contextType", _useScrollContext.ScrollContext);
|
|
201
|
+
var SdocLink = (0, _reactI18next.withTranslation)('sdoc-editor')(Link);
|
|
198
202
|
var renderLink = function renderLink(props, editor, readonly) {
|
|
199
|
-
return /*#__PURE__*/_react["default"].createElement(
|
|
203
|
+
return /*#__PURE__*/_react["default"].createElement(SdocLink, Object.assign({}, props, {
|
|
200
204
|
editor: editor,
|
|
201
205
|
readonly: readonly
|
|
202
206
|
}));
|
|
@@ -246,6 +246,12 @@ var CustomRenderElement = function CustomRenderElement(props) {
|
|
|
246
246
|
renderFileView = _FileViewPlugin$rende[0];
|
|
247
247
|
return renderFileView((0, _objectSpread2["default"])({}, props));
|
|
248
248
|
}
|
|
249
|
+
case _elementType.FORMULA:
|
|
250
|
+
{
|
|
251
|
+
var _FormulaPlugin$render = (0, _slicedToArray2["default"])(_plugins.FormulaPlugin.renderElements, 1),
|
|
252
|
+
renderFormula = _FormulaPlugin$render[0];
|
|
253
|
+
return renderFormula((0, _objectSpread2["default"])({}, props), editor);
|
|
254
|
+
}
|
|
249
255
|
default:
|
|
250
256
|
{
|
|
251
257
|
var _ParagraphPlugin$rend3 = (0, _slicedToArray2["default"])(_plugins.ParagraphPlugin.renderElements, 1),
|
|
@@ -15,12 +15,13 @@ var _tooltip = _interopRequireDefault(require("../../../../components/tooltip"))
|
|
|
15
15
|
var _eventBus = _interopRequireDefault(require("../../../../utils/event-bus"));
|
|
16
16
|
var _menu = _interopRequireDefault(require("../../../plugins/code-block/menu"));
|
|
17
17
|
var _menu2 = _interopRequireDefault(require("../../../plugins/file-link/menu"));
|
|
18
|
-
var _menu3 = _interopRequireDefault(require("../../../plugins/
|
|
19
|
-
var _menu4 = _interopRequireDefault(require("../../../plugins/
|
|
20
|
-
var _menu5 = _interopRequireDefault(require("../../../plugins/
|
|
18
|
+
var _menu3 = _interopRequireDefault(require("../../../plugins/formula/menu"));
|
|
19
|
+
var _menu4 = _interopRequireDefault(require("../../../plugins/image/menu"));
|
|
20
|
+
var _menu5 = _interopRequireDefault(require("../../../plugins/link/menu"));
|
|
21
|
+
var _menu6 = _interopRequireDefault(require("../../../plugins/sdoc-link/menu"));
|
|
21
22
|
var _tableMenu = _interopRequireDefault(require("../../../plugins/table/menu/table-menu"));
|
|
22
|
-
var
|
|
23
|
-
var
|
|
23
|
+
var _menu7 = _interopRequireDefault(require("../../../plugins/video/menu"));
|
|
24
|
+
var _menu8 = _interopRequireDefault(require("../../../plugins/whiteboard/menu"));
|
|
24
25
|
require("./index.css");
|
|
25
26
|
var InsertToolbar = function InsertToolbar(_ref) {
|
|
26
27
|
var _ref$isRichEditor = _ref.isRichEditor,
|
|
@@ -102,8 +103,8 @@ var InsertToolbar = function InsertToolbar(_ref) {
|
|
|
102
103
|
style: {
|
|
103
104
|
maxHeight: window.innerHeight - bottom - 100
|
|
104
105
|
}
|
|
105
|
-
}, /*#__PURE__*/_react["default"].createElement(
|
|
106
|
+
}, /*#__PURE__*/_react["default"].createElement(_menu4["default"], props), /*#__PURE__*/_react["default"].createElement(_tableMenu["default"], props), /*#__PURE__*/_react["default"].createElement(_menu7["default"], props), /*#__PURE__*/_react["default"].createElement(_menu8["default"], props), /*#__PURE__*/_react["default"].createElement(_menu5["default"], props), /*#__PURE__*/_react["default"].createElement(_menu["default"], props), /*#__PURE__*/_react["default"].createElement(_menu3["default"], props), /*#__PURE__*/_react["default"].createElement("div", {
|
|
106
107
|
className: "sdoc-dropdown-menu-divider"
|
|
107
|
-
}), /*#__PURE__*/_react["default"].createElement(
|
|
108
|
+
}), /*#__PURE__*/_react["default"].createElement(_menu6["default"], props), /*#__PURE__*/_react["default"].createElement(_menu2["default"], props))));
|
|
108
109
|
};
|
|
109
110
|
var _default = exports["default"] = InsertToolbar;
|
|
@@ -70,6 +70,19 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
|
|
|
70
70
|
});
|
|
71
71
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
72
72
|
}, [editor, insertPosition]);
|
|
73
|
+
var onInsertFormula = (0, _react.useCallback)(function () {
|
|
74
|
+
callback && callback();
|
|
75
|
+
var eventBus = _eventBus["default"].getInstance();
|
|
76
|
+
if (insertPosition === _constants2.INSERT_POSITION.CURRENT) {
|
|
77
|
+
_slate.Transforms.select(editor, editor.selection.focus);
|
|
78
|
+
}
|
|
79
|
+
eventBus.dispatch(_constants.INTERNAL_EVENT.INSERT_ELEMENT, {
|
|
80
|
+
type: _constants2.FORMULA,
|
|
81
|
+
insertPosition: insertPosition,
|
|
82
|
+
slateNode: slateNode
|
|
83
|
+
});
|
|
84
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
85
|
+
}, [editor, insertPosition]);
|
|
73
86
|
var onInsertVideoToggle = (0, _react.useCallback)(function () {
|
|
74
87
|
callback && callback();
|
|
75
88
|
var eventBus = _eventBus["default"].getInstance();
|
|
@@ -170,6 +183,16 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
|
|
|
170
183
|
return !!callout;
|
|
171
184
|
}, [editor]);
|
|
172
185
|
|
|
186
|
+
// Disable images in list elements
|
|
187
|
+
var isDisableFormula = (0, _react.useMemo)(function () {
|
|
188
|
+
var callout = (0, _core.getAboveBlockNode)(editor, {
|
|
189
|
+
match: function match(n) {
|
|
190
|
+
return [_constants2.ELEMENT_TYPE.ORDERED_LIST, _constants2.ELEMENT_TYPE.UNORDERED_LIST, _constants2.ELEMENT_TYPE.CHECK_LIST_ITEM, _constants2.ELEMENT_TYPE.BLOCKQUOTE, _constants2.ELEMENT_TYPE.CALL_OUT].includes(n.type);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
return !!callout;
|
|
194
|
+
}, [editor]);
|
|
195
|
+
|
|
173
196
|
// Disable images in list elements
|
|
174
197
|
var isDisableImage = (0, _react.useMemo)(function () {
|
|
175
198
|
var callout = (0, _core.getAboveBlockNode)(editor, {
|
|
@@ -321,7 +344,7 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
|
|
|
321
344
|
}, t('Add_video_link')), editor.editorType !== _constants.WIKI_EDITOR && /*#__PURE__*/_react["default"].createElement("div", {
|
|
322
345
|
className: "sdoc-dropdown-menu-item",
|
|
323
346
|
onClick: openSelectVideoFileDialog
|
|
324
|
-
}, t('Link_video_file'))))))), {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants2.TABLE,
|
|
347
|
+
}, t('Link_video_file'))))))), {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants2.TABLE,
|
|
325
348
|
/*#__PURE__*/
|
|
326
349
|
// eslint-disable-next-line react/jsx-indent
|
|
327
350
|
_react["default"].createElement(_dropdownMenuItem["default"], {
|
|
@@ -361,6 +384,12 @@ var QuickInsertBlockMenu = function QuickInsertBlockMenu(_ref) {
|
|
|
361
384
|
onClick: function onClick() {
|
|
362
385
|
return onInsertCallout(_constants2.PARAGRAPH);
|
|
363
386
|
}
|
|
387
|
+
})), _constants2.FORMULA, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
|
|
388
|
+
isHidden: !quickInsertMenuSearchMap[_constants2.FORMULA],
|
|
389
|
+
disabled: isDisableFormula,
|
|
390
|
+
key: "sdoc-insert-menu-formula",
|
|
391
|
+
menuConfig: (0, _objectSpread6["default"])({}, _constants2.SIDE_INSERT_MENUS_CONFIG[_constants2.ELEMENT_TYPE.FORMULA]),
|
|
392
|
+
onClick: onInsertFormula
|
|
364
393
|
})));
|
|
365
394
|
if (_commonUtils.isMobile) {
|
|
366
395
|
items = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _constants2.PARAGRAPH, /*#__PURE__*/_react["default"].createElement(_dropdownMenuItem["default"], {
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports["default"] = void 0;
|
|
8
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
9
|
+
var _react = require("react");
|
|
10
|
+
var useMathJax = function useMathJax(mathJaxSource) {
|
|
11
|
+
var _useState = (0, _react.useState)(true),
|
|
12
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
13
|
+
isLoading = _useState2[0],
|
|
14
|
+
setIsLoading = _useState2[1];
|
|
15
|
+
(0, _react.useEffect)(function () {
|
|
16
|
+
if (!mathJaxSource) {
|
|
17
|
+
setIsLoading(false);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
window.MathJax = {
|
|
21
|
+
options: {
|
|
22
|
+
enableMenu: false
|
|
23
|
+
},
|
|
24
|
+
tex: {
|
|
25
|
+
inlineMath: [['$', '$']],
|
|
26
|
+
displayMath: [['$$', '$$']]
|
|
27
|
+
},
|
|
28
|
+
svg: {
|
|
29
|
+
fontCache: 'global'
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
if (!document.querySelector('#mathjax')) {
|
|
33
|
+
var script = document.createElement('script');
|
|
34
|
+
script.src = mathJaxSource;
|
|
35
|
+
script.id = 'mathjax';
|
|
36
|
+
document.body.appendChild(script);
|
|
37
|
+
script.onload = function () {
|
|
38
|
+
setIsLoading(false);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return function () {
|
|
42
|
+
var script = document.getElementById('mathjax');
|
|
43
|
+
script && script.parentNode.removeChild(script);
|
|
44
|
+
};
|
|
45
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
46
|
+
}, []);
|
|
47
|
+
return {
|
|
48
|
+
isLoadingMathJax: isLoading
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
var _default = exports["default"] = useMathJax;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.78",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "jest",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"license": "ISC",
|
|
18
18
|
"description": "",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@seafile/comment-editor": "~1.0.
|
|
20
|
+
"@seafile/comment-editor": "~1.0.16",
|
|
21
21
|
"@seafile/print-js": "1.6.6",
|
|
22
22
|
"@seafile/react-image-lightbox": "5.0.4",
|
|
23
23
|
"@seafile/seafile-database": "0.0.19",
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"publishConfig": {
|
|
73
73
|
"access": "public"
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "bbda01e681bef4b6ffc952f145768951ef6025cf"
|
|
76
76
|
}
|