@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.
@@ -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
- isShowRightPanel = _ref.isShowRightPanel;
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 (_ref2) {
121
- var type = _ref2.type,
122
- element = _ref2.element,
123
- _ref2$insertPosition = _ref2.insertPosition,
124
- insertPosition = _ref2$insertPosition === void 0 ? _constants2.INSERT_POSITION.CURRENT : _ref2$insertPosition,
125
- slateNode = _ref2.slateNode,
126
- insertFileLinkCallback = _ref2.insertFileLinkCallback,
127
- insertSdocFileLinkCallback = _ref2.insertSdocFileLinkCallback,
128
- insertVideo = _ref2.insertVideo,
129
- insertWhiteboard = _ref2.insertWhiteboard,
130
- paramEditor = _ref2.editor,
131
- linkTitle = _ref2.linkTitle,
132
- handleSubmit = _ref2.handleSubmit,
133
- data = _ref2.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, TEXT_STYLE, [{
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 element = _this.props.element;
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$props = this.props,
158
- attributes = _this$props.attributes,
159
- children = _this$props.children,
160
- element = _this$props.element,
161
- editor = _this$props.editor,
162
- readonly = _this$props.readonly;
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(Link, Object.assign({}, props, {
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/image/menu"));
19
- var _menu4 = _interopRequireDefault(require("../../../plugins/link/menu"));
20
- var _menu5 = _interopRequireDefault(require("../../../plugins/sdoc-link/menu"));
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 _menu6 = _interopRequireDefault(require("../../../plugins/video/menu"));
23
- var _menu7 = _interopRequireDefault(require("../../../plugins/whiteboard/menu"));
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(_menu3["default"], props), /*#__PURE__*/_react["default"].createElement(_tableMenu["default"], props), /*#__PURE__*/_react["default"].createElement(_menu6["default"], props), /*#__PURE__*/_react["default"].createElement(_menu7["default"], props), /*#__PURE__*/_react["default"].createElement(_menu4["default"], props), /*#__PURE__*/_react["default"].createElement(_menu["default"], props), /*#__PURE__*/_react["default"].createElement("div", {
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(_menu5["default"], props), /*#__PURE__*/_react["default"].createElement(_menu2["default"], props))));
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.76",
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.15",
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": "505f9405730c95e54e8b47fc131ad5a3bf959eeb"
75
+ "gitHead": "bbda01e681bef4b6ffc952f145768951ef6025cf"
76
76
  }