@seafile/seafile-editor 2.0.23 → 2.0.25-beta

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.
Files changed (28) hide show
  1. package/dist/editors/inline-editor/index.js +9 -2
  2. package/dist/editors/slate-editor/style.css +2 -2
  3. package/dist/extension/commons/dropdown-menu-item/index.css +0 -2
  4. package/dist/extension/commons/insert-element-dialog/index.js +0 -6
  5. package/dist/extension/commons/menu/menu.css +2 -1
  6. package/dist/extension/commons/select/index.js +1 -1
  7. package/dist/extension/commons/select/style.css +3 -3
  8. package/dist/extension/plugins/image/menu/index.js +4 -12
  9. package/dist/extension/plugins/table/context-menu/index.js +1 -1
  10. package/dist/extension/plugins/table/context-menu/style.css +2 -2
  11. package/dist/extension/plugins/table/menu/index.js +1 -1
  12. package/dist/extension/toolbar/header-toolbar/index.js +10 -1
  13. package/dist/extension/toolbar/header-toolbar/insert-toolbar/index.js +5 -3
  14. package/dist/extension/toolbar/inline-toolbar/index.css +4 -0
  15. package/dist/extension/toolbar/inline-toolbar/index.js +12 -3
  16. package/dist/hooks/use-insert-image.js +3 -0
  17. package/dist/pages/longtext-inline-editor/index.css +4 -0
  18. package/dist/pages/longtext-inline-editor/index.js +7 -2
  19. package/dist/pages/longtext-inline-editor/normal-editor.js +7 -2
  20. package/dist/pages/simple-editor.js +13 -3
  21. package/dist/slate-convert/slate-to-md/index.js +14 -5
  22. package/package.json +2 -2
  23. package/public/media/seafile-editor-font/iconfont.eot +0 -0
  24. package/public/media/seafile-editor-font/iconfont.svg +2 -2
  25. package/public/media/seafile-editor-font/iconfont.ttf +0 -0
  26. package/public/media/seafile-editor-font/iconfont.woff +0 -0
  27. package/public/media/seafile-editor-font/iconfont.woff2 +0 -0
  28. package/public/media/seafile-editor-font.css +10 -12
@@ -18,9 +18,10 @@ var _core = require("../../extension/core");
18
18
  var _common = require("../../utils/common");
19
19
  var _eventTypes = require("../../constants/event-types");
20
20
  var _elementTypes = require("../../extension/constants/element-types");
21
+ var _useInsertImage = _interopRequireDefault(require("../../hooks/use-insert-image"));
21
22
  require("./index.css");
22
23
  const isMacOS = (0, _common.isMac)();
23
- const InlineEditor = _ref => {
24
+ const InlineEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
24
25
  let {
25
26
  enableEdit,
26
27
  value,
@@ -45,6 +46,7 @@ const InlineEditor = _ref => {
45
46
  const eventProxy = (0, _react.useMemo)(() => {
46
47
  return new _eventHandler.default(editor);
47
48
  }, [editor]);
49
+ (0, _useInsertImage.default)(editor);
48
50
  const decorate = (0, _extension.useHighlight)(editor);
49
51
  const onChange = (0, _react.useCallback)(value => {
50
52
  setSlateValue(value);
@@ -154,6 +156,11 @@ const InlineEditor = _ref => {
154
156
  };
155
157
  // eslint-disable-next-line react-hooks/exhaustive-deps
156
158
  }, []);
159
+ (0, _react.useImperativeHandle)(ref, () => {
160
+ return {
161
+ getEditor: () => editor
162
+ };
163
+ }, [editor]);
157
164
  const onEditorClick = (0, _react.useCallback)(() => {
158
165
  if (!enableEdit) {
159
166
  focusRangeRef.current = editor.selection;
@@ -195,5 +202,5 @@ const InlineEditor = _ref => {
195
202
  onKeyDown: eventProxy.onKeyDown,
196
203
  onCopy: eventProxy.onCopy
197
204
  })))))));
198
- };
205
+ });
199
206
  var _default = exports.default = InlineEditor;
@@ -10,7 +10,7 @@
10
10
  .sf-slate-editor-container .sf-slate-editor-toolbar {
11
11
  display: flex;
12
12
  justify-content: center;
13
- height: 44px;
13
+ height: 37px;
14
14
  align-items: center;
15
15
  padding: 0 10px;
16
16
  background-color: #fff;
@@ -26,7 +26,7 @@
26
26
 
27
27
  .sf-slate-editor-container .sf-slate-editor-content {
28
28
  width: 100%;
29
- height: calc(100% - 44px);
29
+ height: calc(100% - 37px);
30
30
  display: flex;
31
31
  background: #f5f5f5;
32
32
  position: relative;
@@ -13,7 +13,6 @@
13
13
 
14
14
  .sf-dropdown-menu .sf-dropdown-item-right-icon {
15
15
  color: #999;
16
- transform: scale(.8);
17
16
  }
18
17
 
19
18
  .sf-dropdown-menu .sf-dropdown-item-with-left-icon {
@@ -45,7 +44,6 @@
45
44
 
46
45
  .sf-dropdown-menu .sf-dropdown-item-right-icon {
47
46
  color: #999;
48
- transform: scale(.8);
49
47
  }
50
48
 
51
49
  .sf-dropdown-menu .sf-dropdown-item-content .sf-dropdown-item-content-icon {
@@ -12,7 +12,6 @@ var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
12
12
  var _eventTypes = require("../../../constants/event-types");
13
13
  var _constants = require("../../constants");
14
14
  var _linkModal = _interopRequireDefault(require("../../plugins/link/menu/link-modal"));
15
- var _imageMenuDialog = _interopRequireDefault(require("../../plugins/image/menu/image-menu-dialog"));
16
15
  var _formulaModal = _interopRequireDefault(require("../../plugins/formula/menu/formula-modal"));
17
16
  const InsertElementDialog = _ref => {
18
17
  let {
@@ -78,11 +77,6 @@ const InsertElementDialog = _ref => {
78
77
  linkTitle: linkInfo.linkTitle,
79
78
  linkUrl: linkInfo.linkUrl
80
79
  });
81
- } else if (_constants.ELementTypes.IMAGE === dialogType) {
82
- return isOpenLinkModal && /*#__PURE__*/_react.default.createElement(_imageMenuDialog.default, {
83
- closeDialog: onCloseModal,
84
- editor: editor
85
- });
86
80
  } else if (_constants.ELementTypes.FORMULA === dialogType) {
87
81
  return isOpenLinkModal && /*#__PURE__*/_react.default.createElement(_formulaModal.default, {
88
82
  onCloseModal: onCloseModal,
@@ -7,6 +7,7 @@
7
7
  display: flex;
8
8
  align-items: center;
9
9
  justify-content: center;
10
+ border-radius: 0 !important;
10
11
  }
11
12
 
12
13
  .sf-menu-group .sf-menu-group-item {
@@ -33,7 +34,7 @@
33
34
  }
34
35
 
35
36
  .sf-menu-group .sf-menu-group-item .iconfont {
36
- font-size: 13px;
37
+ font-size: 12px;
37
38
  }
38
39
 
39
40
  /* sf-menu-with-dropdown */
@@ -108,7 +108,7 @@ class Select extends _react.default.Component {
108
108
  className: `control-container ${isActive ? 'active' : ''}`,
109
109
  onClick: this.onSelectToggle
110
110
  }, !currentOption && /*#__PURE__*/_react.default.createElement("span", {
111
- className: "label placeholder"
111
+ className: "label placeholder-content"
112
112
  }, placeholder), currentOption && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", {
113
113
  className: `control-icon ${currentOption.iconClass}`
114
114
  }), /*#__PURE__*/_react.default.createElement("span", {
@@ -25,7 +25,7 @@
25
25
  box-shadow: 0 0 0 2px rgb(70 127 207 / 25%);
26
26
  }
27
27
 
28
- .select-container .control-container .placeholder {
28
+ .select-container .control-container .placeholder-content {
29
29
  color: #BFBFBF;
30
30
  }
31
31
 
@@ -59,7 +59,7 @@
59
59
  position: absolute;
60
60
  left: 0;
61
61
  display: flex;
62
- min-width: 80px;
62
+ min-width: 120px;
63
63
  max-height: 265px;
64
64
  margin-top: 4px;
65
65
  padding: 8px 0;
@@ -112,7 +112,7 @@
112
112
  flex-shrink: 0;
113
113
  display: flex;
114
114
  align-items: center;
115
- min-width: 80px;
115
+ min-width: 120px;
116
116
  height: 32px;
117
117
  padding: 0 12px;
118
118
  cursor: pointer;
@@ -9,8 +9,6 @@ exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _elementTypes = require("../../../constants/element-types");
11
11
  var _menusConfig = require("../../../constants/menus-config");
12
- var _eventBus = _interopRequireDefault(require("../../../../utils/event-bus"));
13
- var _eventTypes = require("../../../../constants/event-types");
14
12
  var _helper = require("../helper");
15
13
  var _dropdownMenuItem = _interopRequireDefault(require("../../../commons/dropdown-menu-item"));
16
14
  var _reactstrap = require("reactstrap");
@@ -22,7 +20,8 @@ const ImageMenu = _ref => {
22
20
  let {
23
21
  readonly,
24
22
  editor,
25
- toggle
23
+ toggle,
24
+ setIsShowInternetImageModal
26
25
  } = _ref;
27
26
  const {
28
27
  t
@@ -35,13 +34,6 @@ const ImageMenu = _ref => {
35
34
  e.nativeEvent.stopImmediatePropagation();
36
35
  (_fileInputRef$current = fileInputRef.current) === null || _fileInputRef$current === void 0 ? void 0 : _fileInputRef$current.click();
37
36
  }, [toggle]);
38
- const handleInsertNetworkImage = () => {
39
- toggle && toggle();
40
- const eventBus = _eventBus.default.getInstance();
41
- eventBus.dispatch(_eventTypes.INTERNAL_EVENTS.INSERT_ELEMENT, {
42
- type: _elementTypes.IMAGE
43
- });
44
- };
45
37
  const handleUploadLocalImage = (0, _react.useCallback)(async e => {
46
38
  const file = e.target.files[0];
47
39
  if (!file) return;
@@ -53,7 +45,7 @@ const ImageMenu = _ref => {
53
45
  menuConfig: menuConfig,
54
46
  className: "pr-2"
55
47
  }, !readonly && /*#__PURE__*/_react.default.createElement("i", {
56
- className: "iconfont icon-sdoc-right-slide sf-dropdown-item-right-icon"
48
+ className: "iconfont icon-right-slide sf-dropdown-item-right-icon"
57
49
  })), !readonly && /*#__PURE__*/_react.default.createElement(_reactstrap.UncontrolledPopover, {
58
50
  target: menuConfig.id,
59
51
  trigger: "hover",
@@ -68,7 +60,7 @@ const ImageMenu = _ref => {
68
60
  onClick: openFileDIalog
69
61
  }, t('Upload_local_image')), /*#__PURE__*/_react.default.createElement("div", {
70
62
  className: "sf-dropdown-menu-item",
71
- onClick: handleInsertNetworkImage
63
+ onClick: () => setIsShowInternetImageModal(true)
72
64
  }, t('Insert_network_image')))), /*#__PURE__*/_react.default.createElement("input", {
73
65
  ref: fileInputRef,
74
66
  onClick: openFileDIalog,
@@ -114,7 +114,7 @@ const ContextMenu = _ref => {
114
114
  ref: horizontalAlignRef,
115
115
  className: "sf-context-menu-item sf-dropdown-menu-item side-extendable"
116
116
  }, /*#__PURE__*/_react.default.createElement("span", null, t('Horizontal_align')), /*#__PURE__*/_react.default.createElement("i", {
117
- className: "iconfont icon-sdoc-right-slide"
117
+ className: "iconfont icon-right-slide"
118
118
  })), horizontalAlignRef.current && /*#__PURE__*/_react.default.createElement(_horizontalAlignPopover.default, {
119
119
  target: horizontalAlignRef,
120
120
  editor: editor,
@@ -78,9 +78,9 @@
78
78
  color: #adb5bd;
79
79
  }
80
80
 
81
- .side-extendable .icon-sdoc-right-slide {
81
+ .side-extendable .icon-right-slide {
82
82
  color: #fff;
83
- transform: scale(.6);
83
+ font-size: 12px;
84
84
  }
85
85
 
86
86
  .sf-context-menu .sf-dropdown-menu-item:hover {
@@ -35,7 +35,7 @@ const TableMenu = _ref => {
35
35
  menuConfig: menuConfig,
36
36
  className: "pr-2"
37
37
  }, !disabled && /*#__PURE__*/_react.default.createElement("i", {
38
- className: "iconfont icon-sdoc-right-slide sf-dropdown-item-right-icon"
38
+ className: "iconfont icon-right-slide sf-dropdown-item-right-icon"
39
39
  })), !disabled && isOpenTableSizeSelector && /*#__PURE__*/_react.default.createElement(_tableSizeSelector.default, {
40
40
  ref: tablePopoverRef,
41
41
  editor: editor,
@@ -21,6 +21,7 @@ var _menu7 = _interopRequireDefault(require("../../plugins/clear-format/menu"));
21
21
  var _shortcutDialog = _interopRequireDefault(require("../user-help/shortcut-dialog"));
22
22
  var _insertElementDialog = _interopRequireDefault(require("../../commons/insert-element-dialog"));
23
23
  var _insertToolbar = _interopRequireDefault(require("./insert-toolbar"));
24
+ var _imageMenuDialog = _interopRequireDefault(require("../../plugins/image/menu/image-menu-dialog"));
24
25
  require("./style.css");
25
26
  const Toolbar = _ref => {
26
27
  let {
@@ -32,10 +33,14 @@ const Toolbar = _ref => {
32
33
  isSupportColumn = false
33
34
  } = _ref;
34
35
  (0, _useSelectionUpdate.default)();
36
+ const [isShowInternetImageModal, setIsShowInternetImageModal] = (0, _react.useState)(false);
35
37
  const [isShowHelpModal, setIsShowHelpModal] = (0, _react.useState)(false);
36
38
  const onHelpIconToggle = (0, _react.useCallback)(() => {
37
39
  setIsShowHelpModal(!isShowHelpModal);
38
40
  }, [isShowHelpModal]);
41
+ const onToggleImageDialog = (0, _react.useCallback)(() => {
42
+ setIsShowInternetImageModal(false);
43
+ }, []);
39
44
  const commonProps = {
40
45
  editor,
41
46
  readonly,
@@ -47,7 +52,8 @@ const Toolbar = _ref => {
47
52
  editor: editor,
48
53
  readonly: readonly,
49
54
  isSupportFormula: isSupportFormula,
50
- isSupportColumn: isSupportColumn
55
+ isSupportColumn: isSupportColumn,
56
+ setIsShowInternetImageModal: setIsShowInternetImageModal
51
57
  })), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu2.default, commonProps)), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu3.default, Object.assign({}, commonProps, {
52
58
  type: _constants.TEXT_STYLE_MAP.ITALIC
53
59
  })), /*#__PURE__*/_react.default.createElement(_menu3.default, Object.assign({}, commonProps, {
@@ -70,6 +76,9 @@ const Toolbar = _ref => {
70
76
  toggleShortcutDialog: onHelpIconToggle
71
77
  }), /*#__PURE__*/_react.default.createElement(_insertElementDialog.default, {
72
78
  editor: editor
79
+ }), isShowInternetImageModal && /*#__PURE__*/_react.default.createElement(_imageMenuDialog.default, {
80
+ editor: editor,
81
+ closeDialog: onToggleImageDialog
73
82
  }));
74
83
  };
75
84
  var _default = exports.default = Toolbar;
@@ -25,7 +25,8 @@ const InsertToolbar = _ref => {
25
25
  editor,
26
26
  readonly,
27
27
  isSupportFormula,
28
- isSupportColumn
28
+ isSupportColumn,
29
+ setIsShowInternetImageModal
29
30
  } = _ref;
30
31
  const [isShowMenu, setMenuShow] = (0, _react.useState)(false);
31
32
  const {
@@ -61,7 +62,8 @@ const InsertToolbar = _ref => {
61
62
  const props = {
62
63
  editor,
63
64
  readonly,
64
- toggle
65
+ toggle,
66
+ setIsShowInternetImageModal
65
67
  };
66
68
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("button", {
67
69
  type: "button",
@@ -72,7 +74,7 @@ const InsertToolbar = _ref => {
72
74
  }, /*#__PURE__*/_react.default.createElement("div", {
73
75
  className: "sf-menu-with-dropdown-icon"
74
76
  }, /*#__PURE__*/_react.default.createElement("i", {
75
- className: "iconfont icon-sdoc-insert mr-1"
77
+ className: "iconfont icon-insert mr-1"
76
78
  }), /*#__PURE__*/_react.default.createElement("span", {
77
79
  className: "text-truncate"
78
80
  }, t('Insert'))), /*#__PURE__*/_react.default.createElement("div", {
@@ -39,6 +39,10 @@
39
39
  font-size: 13px;
40
40
  }
41
41
 
42
+ .sf-long-text-inline-editor-container .sf-header-menu {
43
+ min-width: 100px;
44
+ }
45
+
42
46
  .sf-long-text-inline-editor-container .sf-header-menu .sf-header-popover {
43
47
  min-width: 145px;
44
48
  }
@@ -20,6 +20,7 @@ var _elementTypes = require("../../constants/element-types");
20
20
  var _menu7 = _interopRequireDefault(require("../../plugins/clear-format/menu"));
21
21
  var _shortcutDialog = _interopRequireDefault(require("../user-help/shortcut-dialog"));
22
22
  var _insertToolbar = _interopRequireDefault(require("../header-toolbar/insert-toolbar"));
23
+ var _imageMenuDialog = _interopRequireDefault(require("../../plugins/image/menu/image-menu-dialog"));
23
24
  require("./index.css");
24
25
  const InlineToolbar = _ref => {
25
26
  let {
@@ -32,10 +33,14 @@ const InlineToolbar = _ref => {
32
33
  onExpandEditorToggle
33
34
  } = _ref;
34
35
  (0, _useSelectionUpdate.default)();
36
+ const [isShowInternetImageModal, setIsShowInternetImageModal] = (0, _react.useState)(false);
35
37
  const [isShowHelpModal, setIsShowHelpModal] = (0, _react.useState)(false);
36
38
  const onHelpIconToggle = (0, _react.useCallback)(() => {
37
39
  setIsShowHelpModal(!isShowHelpModal);
38
40
  }, [isShowHelpModal]);
41
+ const onToggleImageDialog = (0, _react.useCallback)(() => {
42
+ setIsShowInternetImageModal(false);
43
+ }, []);
39
44
  const commonProps = {
40
45
  editor,
41
46
  readonly,
@@ -47,7 +52,8 @@ const InlineToolbar = _ref => {
47
52
  editor: editor,
48
53
  readonly: readonly,
49
54
  isSupportFormula: isSupportFormula,
50
- isSupportColumn: isSupportColumn
55
+ isSupportColumn: isSupportColumn,
56
+ setIsShowInternetImageModal: setIsShowInternetImageModal
51
57
  })), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu2.default, commonProps)), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu3.default, Object.assign({}, commonProps, {
52
58
  type: _constants.TEXT_STYLE_MAP.ITALIC
53
59
  })), /*#__PURE__*/_react.default.createElement(_menu3.default, Object.assign({}, commonProps, {
@@ -56,11 +62,11 @@ const InlineToolbar = _ref => {
56
62
  type: _constants.TEXT_STYLE_MAP.UNDERLINE
57
63
  })), /*#__PURE__*/_react.default.createElement(_menu3.default, Object.assign({}, commonProps, {
58
64
  type: _constants.TEXT_STYLE_MAP.CODE
59
- })), /*#__PURE__*/_react.default.createElement(_menu4.default, commonProps)), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu.default, commonProps), /*#__PURE__*/_react.default.createElement(_menu5.default, commonProps), /*#__PURE__*/_react.default.createElement(_menu6.default, Object.assign({}, commonProps, {
65
+ })), /*#__PURE__*/_react.default.createElement(_menu4.default, commonProps)), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu.default, commonProps), /*#__PURE__*/_react.default.createElement(_menu5.default, commonProps)), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_commons.MoreMenu, commonProps, /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu6.default, Object.assign({}, commonProps, {
60
66
  type: _elementTypes.ORDERED_LIST
61
67
  })), /*#__PURE__*/_react.default.createElement(_menu6.default, Object.assign({}, commonProps, {
62
68
  type: _elementTypes.UNORDERED_LIST
63
- }))), /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_commons.MoreMenu, commonProps, /*#__PURE__*/_react.default.createElement(_commons.MenuGroup, null, /*#__PURE__*/_react.default.createElement(_menu7.default, commonProps)), !isRichEditor && /*#__PURE__*/_react.default.createElement("div", {
69
+ })), /*#__PURE__*/_react.default.createElement(_menu7.default, commonProps)), !isRichEditor && /*#__PURE__*/_react.default.createElement("div", {
64
70
  className: "sf-menu-group-item sf-slate-help-info-control",
65
71
  onClick: onHelpIconToggle
66
72
  }, /*#__PURE__*/_react.default.createElement("span", {
@@ -70,6 +76,9 @@ const InlineToolbar = _ref => {
70
76
  }))), isShowHelpModal && /*#__PURE__*/_react.default.createElement(_shortcutDialog.default, {
71
77
  isRichEditor: isRichEditor,
72
78
  toggleShortcutDialog: onHelpIconToggle
79
+ }), isShowInternetImageModal && /*#__PURE__*/_react.default.createElement(_imageMenuDialog.default, {
80
+ editor: editor,
81
+ closeDialog: onToggleImageDialog
73
82
  }));
74
83
  };
75
84
  var _default = exports.default = InlineToolbar;
@@ -19,6 +19,7 @@ const useSeafileUtils = editor => {
19
19
  isImage,
20
20
  selection
21
21
  } = _ref;
22
+ console.log('insertImage');
22
23
  if (isImage) {
23
24
  (0, _helper.insertSeafileImage)({
24
25
  editor,
@@ -27,6 +28,7 @@ const useSeafileUtils = editor => {
27
28
  selection
28
29
  });
29
30
  } else {
31
+ console.log('insertSeafileLink');
30
32
  (0, _helper2.insertSeafileLink)({
31
33
  editor,
32
34
  title,
@@ -35,6 +37,7 @@ const useSeafileUtils = editor => {
35
37
  });
36
38
  }
37
39
  };
40
+ console.log('123232');
38
41
  const eventBus = _eventBus.default.getInstance();
39
42
  const subscribe = eventBus.subscribe(_eventTypes.EXTERNAL_EVENTS.INSERT_IMAGE, insertImage);
40
43
  return subscribe;
@@ -56,6 +56,10 @@
56
56
  padding: 0 3px 0 6px !important;
57
57
  }
58
58
 
59
+ .sf-long-text-inline-editor-container .article h2 {
60
+ border-bottom: none;
61
+ }
62
+
59
63
  .sf-editor-menu-popover .popover-inner {
60
64
  display: flex;
61
65
  }
@@ -32,6 +32,7 @@ const LongTextInlineEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) =>
32
32
  text: value
33
33
  } : value);
34
34
  const longTextValueChangedRef = (0, _react.useRef)(false);
35
+ const editorRef = (0, _react.useRef)(null);
35
36
  const {
36
37
  isWindowsWechat
37
38
  } = (0, _react.useMemo)(() => {
@@ -69,11 +70,13 @@ const LongTextInlineEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) =>
69
70
  }, [enableEdit, closeEditor]);
70
71
  (0, _react.useImperativeHandle)(ref, () => {
71
72
  return {
73
+ isWindowsWechat: isWindowsWechat,
72
74
  enableEdit: enableEdit,
73
75
  openEditor: openEditor,
74
- closeEditor: closeEditor
76
+ closeEditor: closeEditor,
77
+ getEditor: () => editorRef.current.getEditor()
75
78
  };
76
- }, [enableEdit, openEditor, closeEditor]);
79
+ }, [enableEdit, openEditor, closeEditor, isWindowsWechat, editorRef]);
77
80
  const handelEnableEdit = (0, _react.useCallback)(() => {
78
81
  onClick && onClick();
79
82
  openEditor();
@@ -86,6 +89,7 @@ const LongTextInlineEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) =>
86
89
  }, isWindowsWechat ? /*#__PURE__*/_react.default.createElement(_fallbackEditor.default, {
87
90
  enableEdit: enableEdit,
88
91
  value: valueRef.current.text,
92
+ ref: editorRef,
89
93
  onChange: onEditorValueChanged,
90
94
  closeEditor: closeEditor
91
95
  }) : /*#__PURE__*/_react.default.createElement(_normalEditor.default, {
@@ -97,6 +101,7 @@ const LongTextInlineEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) =>
97
101
  autoSave: autoSave,
98
102
  saveDelay: saveDelay,
99
103
  isCheckBrowser: isCheckBrowser,
104
+ ref: editorRef,
100
105
  editorApi: editorApi,
101
106
  onSaveEditorValue: onSaveEditorValue,
102
107
  onEditorValueChanged: onEditorValueChanged
@@ -13,7 +13,7 @@ var _getPreviewContent = _interopRequireDefault(require("../../utils/get-preview
13
13
  var _markdownPreview = _interopRequireDefault(require("../markdown-preview"));
14
14
  var _longtextEditorDialog = _interopRequireDefault(require("../longtext-editor-dialog"));
15
15
  var _slateConvert = require("../../slate-convert");
16
- const NormalEditor = _ref => {
16
+ const NormalEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
17
17
  let {
18
18
  enableEdit,
19
19
  handelEnableEdit,
@@ -91,6 +91,11 @@ const NormalEditor = _ref => {
91
91
  timer && clearTimeout(timer);
92
92
  };
93
93
  }, [autoSave, saveDelay, handelAutoSave]);
94
+ (0, _react.useImperativeHandle)(ref, () => {
95
+ return {
96
+ getEditor: () => editorRef.current.getEditor()
97
+ };
98
+ }, [editorRef]);
94
99
  if (!enableEdit && !valueRef.current.text) {
95
100
  return /*#__PURE__*/_react.default.createElement("div", {
96
101
  className: (0, _classnames.default)('sf-long-text-inline-editor-container', {
@@ -138,5 +143,5 @@ const NormalEditor = _ref => {
138
143
  onEditorValueChanged: saveValue,
139
144
  onCloseEditorDialog: onCloseEditorDialog
140
145
  }));
141
- };
146
+ });
142
147
  var _default = exports.default = NormalEditor;
@@ -29,8 +29,13 @@ const SimpleEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
29
29
  const {
30
30
  isLoadingMathJax
31
31
  } = (0, _useMathjax.default)(mathJaxSource);
32
+ const editorRef = (0, _react.useRef)(null);
32
33
  (0, _react.useImperativeHandle)(ref, () => {
33
34
  return {
35
+ getEditor: () => {
36
+ var _editorRef$current;
37
+ return (_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 ? void 0 : _editorRef$current.getEditor();
38
+ },
34
39
  getValue: () => {
35
40
  const mdStringValue = (0, _slateConvert.slateToMdString)(richValue);
36
41
  return mdStringValue;
@@ -39,7 +44,7 @@ const SimpleEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
39
44
  return richValue;
40
45
  }
41
46
  };
42
- }, [richValue]);
47
+ }, [richValue, editorRef]);
43
48
  (0, _react.useEffect)(() => {
44
49
  if (!isFetching) {
45
50
  const richValue = (0, _slateConvert.mdStringToSlate)(value);
@@ -61,12 +66,17 @@ const SimpleEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
61
66
  onContentChanged: onContentChanged,
62
67
  ...otherProps
63
68
  };
69
+ console.log(otherProps);
64
70
  if (isFetching || isLoading || isLoadingMathJax) {
65
71
  return /*#__PURE__*/_react.default.createElement(_loading.default, null);
66
72
  }
67
73
  if (isInline) {
68
- return /*#__PURE__*/_react.default.createElement(_inlineEditor.default, props);
74
+ return /*#__PURE__*/_react.default.createElement(_inlineEditor.default, Object.assign({}, props, {
75
+ ref: editorRef
76
+ }));
69
77
  }
70
- return /*#__PURE__*/_react.default.createElement(_simpleSlateEditor.default, props);
78
+ return /*#__PURE__*/_react.default.createElement(_simpleSlateEditor.default, Object.assign({}, props, {
79
+ ref: editorRef
80
+ }));
71
81
  });
72
82
  var _default = exports.default = SimpleEditor;
@@ -17,16 +17,25 @@ const isContentValid = value => {
17
17
  if (!value || !Array.isArray(value)) return false;
18
18
  return true;
19
19
  };
20
+ const isEmptyParagraph = node => {
21
+ const voidNodeTypes = ['image', 'column', 'formula'];
22
+ if (node.type !== _constants.PARAGRAPH) return false;
23
+ const hasBlock = node.children.some(item => voidNodeTypes.includes(item.type));
24
+ const hasHtml = node.children.some(item => item.type === 'html');
25
+ if (hasBlock) return false;
26
+ if (hasHtml) return false;
27
+ if (_slate.Node.string(node).length !== 0) return false;
28
+ return true;
29
+ };
20
30
 
21
31
  // slateNode -> mdast -> mdString
22
32
  const slateToMdString = value => {
23
33
  if (!isContentValid(value)) return '';
24
34
  if (value.length === 0) return '';
25
- if (value.length === 1) {
26
- const child = value[0];
27
- if (child.type === _constants.PARAGRAPH && _slate.Node.string(child).length === 0) {
28
- return '';
29
- }
35
+
36
+ // is only one empty paragraph child
37
+ if (value.length === 1 && isEmptyParagraph(value[0])) {
38
+ return '';
30
39
  }
31
40
 
32
41
  // slateNode -> mdast
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/seafile-editor",
3
- "version": "2.0.23",
3
+ "version": "2.0.25beta",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -64,7 +64,7 @@
64
64
  "react-i18next": "12.1.4",
65
65
  "react-router": "6.16.0",
66
66
  "react-router-dom": "6.16.0",
67
- "seafile-js": "0.2.234",
67
+ "seafile-js": "0.2.238",
68
68
  "style-loader": "3.3.3",
69
69
  "terser-webpack-plugin": "5.3.9",
70
70
  "url-loader": "4.1.1",
@@ -14,9 +14,9 @@
14
14
  />
15
15
  <missing-glyph />
16
16
 
17
- <glyph glyph-name="sdoc-insert" unicode="&#59046;" d="M512 896c281.6 0 512-230.4 512-512s-230.4-512-512-512S0 102.4 0 384 230.4 896 512 896z m0-96C281.6 800 96 614.4 96 384s185.6-416 416-416 416 185.6 416 416S742.4 800 512 800z m0-160c25.6 0 48-22.4 48-48v-160h160c25.6 0 48-22.4 48-48s-22.4-48-48-48H560v-160c0-25.6-22.4-48-48-48s-48 22.4-48 48V336H304c-25.6 0-48 22.4-48 48s22.4 48 48 48h160V592c0 25.6 22.4 48 48 48z" horiz-adv-x="1024" />
17
+ <glyph glyph-name="insert" unicode="&#59046;" d="M512 896c281.6 0 512-230.4 512-512s-230.4-512-512-512S0 102.4 0 384 230.4 896 512 896z m0-96C281.6 800 96 614.4 96 384s185.6-416 416-416 416 185.6 416 416S742.4 800 512 800z m0-160c25.6 0 48-22.4 48-48v-160h160c25.6 0 48-22.4 48-48s-22.4-48-48-48H560v-160c0-25.6-22.4-48-48-48s-48 22.4-48 48V336H304c-25.6 0-48 22.4-48 48s22.4 48 48 48h160V592c0 25.6 22.4 48 48 48z" horiz-adv-x="1024" />
18
18
 
19
- <glyph glyph-name="sdoc-right-slide" unicode="&#59047;" d="M806.4 438.4L336 812.8c-54.4 44.8-144 9.6-144-54.4v-748.8c0-64 86.4-99.2 144-54.4l470.4 374.4c35.2 28.8 35.2 80 0 108.8z" horiz-adv-x="1024" />
19
+ <glyph glyph-name="right-slide" unicode="&#59047;" d="M672 416l-268.8 214.4c-32 25.6-83.2 6.4-83.2-32v-428.8c0-35.2 48-57.6 83.2-32L672 352c19.2 16 19.2 48 0 64z" horiz-adv-x="1024" />
20
20
 
21
21
  <glyph glyph-name="center-horizontally" unicode="&#59039;" d="M800 832v-96H224V832h576z m224-352v96H0v-96h1024z m0-544v96H0v-96h1024zM224 288v-96h576v96H224z" horiz-adv-x="1024" />
22
22
 
@@ -1,14 +1,11 @@
1
1
  @font-face {
2
- font-family: "iconfont";
3
- /* Project id 4375832 */
4
- src: url('./seafile-editor-font/iconfont.eot?t=1752721246164');
5
- /* IE9 */
6
- src: url('./seafile-editor-font/iconfont.eot?t=1752721246164#iefix') format('embedded-opentype'),
7
- /* IE6-IE8 */
8
- url('./seafile-editor-font/iconfont.woff2?t=1752721246164') format('woff2'),
9
- url('./seafile-editor-font/iconfont.woff?t=1752721246164') format('woff'),
10
- url('./seafile-editor-font/iconfont.ttf?t=1752721246164') format('truetype'),
11
- url('./seafile-editor-font/iconfont.svg?t=1752721246164#iconfont') format('svg');
2
+ font-family: "iconfont"; /* Project id 4375832 */
3
+ src: url('./seafile-editor-font/iconfont.eot?t=1753239248033'); /* IE9 */
4
+ src: url('./seafile-editor-font/iconfont.eot?t=1753239248033#iefix') format('embedded-opentype'), /* IE6-IE8 */
5
+ url('./seafile-editor-font/iconfont.woff2?t=1753239248033') format('woff2'),
6
+ url('./seafile-editor-font/iconfont.woff?t=1753239248033') format('woff'),
7
+ url('./seafile-editor-font/iconfont.ttf?t=1753239248033') format('truetype'),
8
+ url('./seafile-editor-font/iconfont.svg?t=1753239248033#iconfont') format('svg');
12
9
  }
13
10
 
14
11
  .iconfont {
@@ -19,11 +16,11 @@
19
16
  -moz-osx-font-smoothing: grayscale;
20
17
  }
21
18
 
22
- .icon-sdoc-insert:before {
19
+ .icon-insert:before {
23
20
  content: "\e6a6";
24
21
  }
25
22
 
26
- .icon-sdoc-right-slide:before {
23
+ .icon-right-slide:before {
27
24
  content: "\e6a7";
28
25
  }
29
26
 
@@ -278,3 +275,4 @@
278
275
  .icon-users:before {
279
276
  content: "\e67f";
280
277
  }
278
+