@seafile/seafile-editor 2.0.30 → 2.0.31-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.
@@ -20,6 +20,6 @@ const EXTERNAL_EVENTS = exports.EXTERNAL_EVENTS = {
20
20
  ON_ARTICLE_INFO_TOGGLE: 'on_article_info_toggle',
21
21
  ON_LINK_CLICK: 'on_link_click',
22
22
  ON_INSERT_IMAGE: 'on_insert_image',
23
- INSERT_IMAGE: 'insert_image',
23
+ INSERT_ATTACHMENTS: 'insert_attachments',
24
24
  CLEAR_ARTICLE: 'clear_article'
25
25
  };
@@ -18,10 +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
+ var _useAttachments = _interopRequireDefault(require("../../hooks/use-attachments"));
22
22
  require("./index.css");
23
23
  const isMacOS = (0, _common.isMac)();
24
- const InlineEditor = _ref => {
24
+ const InlineEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
25
25
  let {
26
26
  enableEdit,
27
27
  value,
@@ -50,7 +50,7 @@ const InlineEditor = _ref => {
50
50
  const eventProxy = (0, _react.useMemo)(() => {
51
51
  return new _eventHandler.default(editor);
52
52
  }, [editor]);
53
- (0, _useInsertImage.default)(editor);
53
+ (0, _useAttachments.default)(editor);
54
54
  const decorate = (0, _extension.useHighlight)(editor);
55
55
  const onChange = (0, _react.useCallback)(value => {
56
56
  setSlateValue(value);
@@ -129,7 +129,8 @@ const InlineEditor = _ref => {
129
129
  };
130
130
  // eslint-disable-next-line react-hooks/exhaustive-deps
131
131
  }, []);
132
- const handleClear = (0, _react.useCallback)(() => {
132
+ const handleClear = (0, _react.useCallback)(editorId => {
133
+ if (editorId !== editor._id) return;
133
134
  editor.children = [{
134
135
  type: _elementTypes.PARAGRAPH,
135
136
  id: _slugid.default.nice(),
@@ -158,8 +159,12 @@ const InlineEditor = _ref => {
158
159
  return () => {
159
160
  clearSubscribe();
160
161
  };
161
- // eslint-disable-next-line react-hooks/exhaustive-deps
162
- }, []);
162
+ }, [handleClear]);
163
+ (0, _react.useImperativeHandle)(ref, () => {
164
+ return {
165
+ getEditor: () => editor
166
+ };
167
+ }, [editor]);
163
168
  const onEditorClick = (0, _react.useCallback)(() => {
164
169
  if (!enableEdit) {
165
170
  focusRangeRef.current = editor.selection;
@@ -201,5 +206,5 @@ const InlineEditor = _ref => {
201
206
  onKeyDown: eventProxy.onKeyDown,
202
207
  onCopy: eventProxy.onCopy
203
208
  })))))));
204
- };
209
+ });
205
210
  var _default = exports.default = InlineEditor;
@@ -16,7 +16,7 @@ var _withPropsEditor = _interopRequireDefault(require("./with-props-editor"));
16
16
  var _editorHelp = _interopRequireDefault(require("./editor-help"));
17
17
  var _core = require("../../extension/core");
18
18
  var _useScrollContext = require("../../hooks/use-scroll-context");
19
- var _useInsertImage = _interopRequireDefault(require("../../hooks/use-insert-image"));
19
+ var _useAttachments = _interopRequireDefault(require("../../hooks/use-attachments"));
20
20
  var _common = require("../../utils/common");
21
21
  var _outline = _interopRequireDefault(require("../../containers/outline"));
22
22
  var _useContainerStyle = _interopRequireDefault(require("../../hooks/use-container-style"));
@@ -28,6 +28,7 @@ function SlateEditor(_ref) {
28
28
  editorApi,
29
29
  onSave,
30
30
  onContentChanged,
31
+ isReadonly,
31
32
  isSupportFormula,
32
33
  isSupportInsertSeafileImage,
33
34
  children
@@ -44,7 +45,7 @@ function SlateEditor(_ref) {
44
45
  const eventProxy = (0, _react.useMemo)(() => {
45
46
  return new _eventHandler.default(editor);
46
47
  }, [editor]);
47
- (0, _useInsertImage.default)(editor);
48
+ (0, _useAttachments.default)(editor);
48
49
  const decorate = (0, _extension.useHighlight)(editor);
49
50
  const onChange = (0, _react.useCallback)(value => {
50
51
  setSlateValue(value);
@@ -111,6 +112,7 @@ function SlateEditor(_ref) {
111
112
  className: `sf-slate-editor-container ${_common.isMobile && 'mobile'}`
112
113
  }, /*#__PURE__*/_react.default.createElement(_extension.Toolbar, {
113
114
  editor: editor,
115
+ readonly: isReadonly,
114
116
  isRichEditor: true,
115
117
  isSupportFormula: isSupportFormula,
116
118
  isSupportInsertSeafileImage: isSupportInsertSeafileImage
@@ -138,6 +140,7 @@ function SlateEditor(_ref) {
138
140
  }, /*#__PURE__*/_react.default.createElement("div", {
139
141
  className: "article"
140
142
  }, /*#__PURE__*/_react.default.createElement(_extension.SetNodeToDecorations, null), /*#__PURE__*/_react.default.createElement(_slateReact.Editable, {
143
+ readOnly: isReadonly,
141
144
  decorate: decorate,
142
145
  renderElement: _extension.renderElement,
143
146
  renderLeaf: _extension.renderLeaf,
@@ -8,13 +8,14 @@ exports.inlineEditor = exports.createSlateEditor = exports.baseEditor = void 0;
8
8
  var _slate = require("slate");
9
9
  var _slateHistory = require("slate-history");
10
10
  var _slateReact = require("slate-react");
11
- var _plugins = _interopRequireDefault(require("./plugins"));
12
11
  var _slugid = require("slugid");
12
+ var _plugins = _interopRequireDefault(require("./plugins"));
13
13
  const baseEditor = exports.baseEditor = _plugins.default.reduce((editor, pluginItem) => {
14
14
  const withPlugin = pluginItem.editorPlugin;
15
15
  if (withPlugin) {
16
16
  return withPlugin(editor);
17
17
  }
18
+ editor._id = (0, _slugid.nice)();
18
19
  return editor;
19
20
  }, (0, _slateHistory.withHistory)((0, _slateReact.withReact)((0, _slate.createEditor)())));
20
21
  const inlineEditor = () => {
@@ -25,6 +26,7 @@ const inlineEditor = () => {
25
26
  }
26
27
  return editor;
27
28
  }, (0, _slateHistory.withHistory)((0, _slateReact.withReact)((0, _slate.createEditor)())));
29
+ editor._id = (0, _slugid.nice)();
28
30
  return editor;
29
31
  };
30
32
  exports.inlineEditor = inlineEditor;
@@ -10,15 +10,16 @@ var _eventBus = _interopRequireDefault(require("../utils/event-bus"));
10
10
  var _eventTypes = require("../constants/event-types");
11
11
  var _helper = require("../extension/plugins/image/helper");
12
12
  var _helper2 = require("../extension/plugins/link/helper");
13
- const useSeafileUtils = editor => {
13
+ const useAttachments = editor => {
14
14
  (0, _react.useEffect)(() => {
15
- const insertImage = _ref => {
15
+ const insertImage = (editorId, _ref) => {
16
16
  let {
17
17
  title,
18
18
  url,
19
19
  isImage,
20
20
  selection = editor.selection
21
21
  } = _ref;
22
+ if (editorId !== editor._id) return;
22
23
  if (isImage) {
23
24
  (0, _helper.insertSeafileImage)({
24
25
  editor,
@@ -36,8 +37,8 @@ const useSeafileUtils = editor => {
36
37
  }
37
38
  };
38
39
  const eventBus = _eventBus.default.getInstance();
39
- const subscribe = eventBus.subscribe(_eventTypes.EXTERNAL_EVENTS.INSERT_IMAGE, insertImage);
40
+ const subscribe = eventBus.subscribe(_eventTypes.EXTERNAL_EVENTS.INSERT_ATTACHMENTS, insertImage);
40
41
  return subscribe;
41
42
  }, [editor]);
42
43
  };
43
- var _default = exports.default = useSeafileUtils;
44
+ var _default = exports.default = useAttachments;
@@ -8,9 +8,10 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _isHotkey = _interopRequireDefault(require("is-hotkey"));
11
+ var _slugid = require("slugid");
11
12
  var _eventBus = _interopRequireDefault(require("../../utils/event-bus"));
12
13
  var _eventTypes = require("../../constants/event-types");
13
- const FallbackEditor = _ref => {
14
+ const FallbackEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
14
15
  let {
15
16
  enableEdit,
16
17
  value: propsValue,
@@ -20,16 +21,20 @@ const FallbackEditor = _ref => {
20
21
  const [value, setValue] = (0, _react.useState)(propsValue);
21
22
  const showEditorRef = (0, _react.useRef)(false);
22
23
  const inputRef = (0, _react.useRef)(null);
24
+ const editor = (0, _react.useMemo)(() => ({
25
+ _id: (0, _slugid.nice)(4)
26
+ }), []);
23
27
  (0, _react.useEffect)(() => {
24
28
  if (enableEdit === showEditorRef.current) return;
25
29
  if (enableEdit && !showEditorRef.current) {
26
30
  setTimeout(() => inputRef.current.focus());
27
31
  }
28
32
  }, [enableEdit]);
29
- const handleClear = (0, _react.useCallback)(() => {
33
+ const handleClear = (0, _react.useCallback)(editorId => {
34
+ if (editorId !== editor._id) return;
30
35
  setValue('');
31
36
  inputRef.current.focus();
32
- }, []);
37
+ }, [editor]);
33
38
  (0, _react.useEffect)(() => {
34
39
  const eventBus = _eventBus.default.getInstance();
35
40
  const clearSubscribe = eventBus.subscribe(_eventTypes.EXTERNAL_EVENTS.CLEAR_ARTICLE, handleClear);
@@ -71,6 +76,11 @@ const FallbackEditor = _ref => {
71
76
  images: []
72
77
  });
73
78
  }, [value, propsOnChange]);
79
+ (0, _react.useImperativeHandle)(ref, () => {
80
+ return {
81
+ getEditor: () => editor
82
+ };
83
+ }, [editor]);
74
84
  return /*#__PURE__*/_react.default.createElement("textarea", {
75
85
  className: "form-control sf-long-text-inline-fallback-editor-container",
76
86
  ref: inputRef,
@@ -81,5 +91,5 @@ const FallbackEditor = _ref => {
81
91
  onPaste: onPaste,
82
92
  onCut: onCut
83
93
  });
84
- };
94
+ });
85
95
  var _default = exports.default = FallbackEditor;
@@ -34,6 +34,7 @@ const LongTextInlineEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) =>
34
34
  text: value
35
35
  } : value);
36
36
  const longTextValueChangedRef = (0, _react.useRef)(false);
37
+ const editorRef = (0, _react.useRef)(null);
37
38
  const {
38
39
  isWindowsWechat
39
40
  } = (0, _react.useMemo)(() => {
@@ -70,12 +71,14 @@ const LongTextInlineEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) =>
70
71
  }
71
72
  }, [enableEdit, closeEditor]);
72
73
  (0, _react.useImperativeHandle)(ref, () => {
74
+ var _editorRef$current;
73
75
  return {
74
76
  enableEdit: enableEdit,
75
77
  openEditor: openEditor,
76
- closeEditor: closeEditor
78
+ closeEditor: closeEditor,
79
+ getEditor: ((_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 ? void 0 : _editorRef$current.getEditor) || (() => null)
77
80
  };
78
- }, [enableEdit, openEditor, closeEditor]);
81
+ }, [enableEdit, openEditor, closeEditor, editorRef]);
79
82
  const handelEnableEdit = (0, _react.useCallback)(() => {
80
83
  onClick && onClick();
81
84
  openEditor();
@@ -86,11 +89,13 @@ const LongTextInlineEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) =>
86
89
  className: "w-100",
87
90
  onKeyDown: onHotKey
88
91
  }, isWindowsWechat ? /*#__PURE__*/_react.default.createElement(_fallbackEditor.default, {
92
+ ref: editorRef,
89
93
  enableEdit: enableEdit,
90
94
  value: valueRef.current.text,
91
95
  onChange: onEditorValueChanged,
92
96
  closeEditor: closeEditor
93
97
  }) : /*#__PURE__*/_react.default.createElement(_normalEditor.default, {
98
+ ref: editorRef,
94
99
  enableEdit: enableEdit,
95
100
  handelEnableEdit: handelEnableEdit,
96
101
  lang: lang,
@@ -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,
@@ -93,6 +93,15 @@ const NormalEditor = _ref => {
93
93
  timer && clearTimeout(timer);
94
94
  };
95
95
  }, [autoSave, saveDelay, handelAutoSave]);
96
+ (0, _react.useImperativeHandle)(ref, () => {
97
+ return {
98
+ getEditor: () => {
99
+ var _editorRef$current, _editorRef$current2;
100
+ const editor = ((_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 ? void 0 : _editorRef$current.getEditor) && ((_editorRef$current2 = editorRef.current) === null || _editorRef$current2 === void 0 ? void 0 : _editorRef$current2.getEditor());
101
+ return editor || null;
102
+ }
103
+ };
104
+ }, [editorRef]);
96
105
  if (!enableEdit && !valueRef.current.text) {
97
106
  return /*#__PURE__*/_react.default.createElement("div", {
98
107
  className: (0, _classnames.default)('sf-long-text-inline-editor-container', {
@@ -144,5 +153,5 @@ const NormalEditor = _ref => {
144
153
  onEditorValueChanged: saveValue,
145
154
  onCloseEditorDialog: onCloseEditorDialog
146
155
  }));
147
- };
156
+ });
148
157
  var _default = exports.default = NormalEditor;
@@ -14,6 +14,7 @@ var _slateEditor = _interopRequireDefault(require("../editors/slate-editor"));
14
14
  var _core = require("../extension/core");
15
15
  const SimpleEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
16
16
  let {
17
+ isReadonly = false,
17
18
  isFetching,
18
19
  value,
19
20
  initValue,
@@ -53,6 +54,7 @@ const SimpleEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
53
54
  propsOnContentChanged && propsOnContentChanged();
54
55
  }, [propsOnContentChanged]);
55
56
  const props = {
57
+ isReadonly: isReadonly,
56
58
  isSupportFormula: !!mathJaxSource,
57
59
  isSupportInsertSeafileImage,
58
60
  value: richValue,
@@ -29,7 +29,9 @@ 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)();
32
33
  (0, _react.useImperativeHandle)(ref, () => {
34
+ var _editorRef$current;
33
35
  return {
34
36
  getValue: () => {
35
37
  const mdStringValue = (0, _slateConvert.slateToMdString)(richValue);
@@ -37,9 +39,10 @@ const SimpleEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
37
39
  },
38
40
  getSlateValue: () => {
39
41
  return richValue;
40
- }
42
+ },
43
+ getEditor: ((_editorRef$current = editorRef.current) === null || _editorRef$current === void 0 ? void 0 : _editorRef$current.getEditor) || (() => null)
41
44
  };
42
- }, [richValue]);
45
+ }, [richValue, editorRef]);
43
46
  (0, _react.useEffect)(() => {
44
47
  if (!isFetching) {
45
48
  const richValue = (0, _slateConvert.mdStringToSlate)(value);
@@ -65,8 +68,12 @@ const SimpleEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
65
68
  return /*#__PURE__*/_react.default.createElement(_loading.default, null);
66
69
  }
67
70
  if (isInline) {
68
- return /*#__PURE__*/_react.default.createElement(_inlineEditor.default, props);
71
+ return /*#__PURE__*/_react.default.createElement(_inlineEditor.default, Object.assign({}, props, {
72
+ ref: editorRef
73
+ }));
69
74
  }
70
- return /*#__PURE__*/_react.default.createElement(_simpleSlateEditor.default, props);
75
+ return /*#__PURE__*/_react.default.createElement(_simpleSlateEditor.default, Object.assign({}, props, {
76
+ ref: editorRef
77
+ }));
71
78
  });
72
79
  var _default = exports.default = SimpleEditor;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/seafile-editor",
3
- "version": "2.0.30",
3
+ "version": "2.0.31beta",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {