@seafile/sdoc-editor 1.0.210 → 1.0.212

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 (34) hide show
  1. package/dist/basic-sdk/extension/commons/file-insert-dialog/index.js +1 -1
  2. package/dist/basic-sdk/extension/commons/insert-element-dialog/index.js +21 -0
  3. package/dist/basic-sdk/extension/commons/select-file-dialog/helpers.js +8 -3
  4. package/dist/basic-sdk/extension/commons/select-file-dialog/index.js +48 -8
  5. package/dist/basic-sdk/extension/commons/select-file-dialog/local-files/index.css +1 -0
  6. package/dist/basic-sdk/extension/commons/select-file-dialog/local-files/index.js +6 -2
  7. package/dist/basic-sdk/extension/constants/element-type.js +2 -1
  8. package/dist/basic-sdk/extension/constants/index.js +2 -1
  9. package/dist/basic-sdk/extension/core/queries/index.js +22 -1
  10. package/dist/basic-sdk/extension/plugins/check-list/plugin.js +13 -10
  11. package/dist/basic-sdk/extension/plugins/code-block/plugin.js +48 -37
  12. package/dist/basic-sdk/extension/plugins/header/plugin.js +8 -0
  13. package/dist/basic-sdk/extension/plugins/link/helpers.js +18 -19
  14. package/dist/basic-sdk/extension/plugins/link/plugin.js +1 -1
  15. package/dist/basic-sdk/extension/plugins/paragraph/plugin.js +17 -1
  16. package/dist/basic-sdk/extension/plugins/sdoc-link/helpers.js +3 -3
  17. package/dist/basic-sdk/extension/plugins/sdoc-link/render/render-elem.js +1 -1
  18. package/dist/basic-sdk/extension/plugins/video/dialog/add-video-link-dialog/index.js +99 -0
  19. package/dist/basic-sdk/extension/plugins/video/helpers.js +61 -8
  20. package/dist/basic-sdk/extension/plugins/video/index.css +4 -3
  21. package/dist/basic-sdk/extension/plugins/video/menu/index.js +24 -1
  22. package/dist/basic-sdk/extension/plugins/video/render-elem.js +20 -7
  23. package/dist/constants/index.js +1 -0
  24. package/package.json +1 -1
  25. package/public/locales/cs/sdoc-editor.json +6 -2
  26. package/public/locales/de/sdoc-editor.json +311 -307
  27. package/public/locales/en/sdoc-editor.json +6 -2
  28. package/public/locales/es/sdoc-editor.json +6 -2
  29. package/public/locales/es_AR/sdoc-editor.json +6 -2
  30. package/public/locales/es_MX/sdoc-editor.json +6 -2
  31. package/public/locales/fr/sdoc-editor.json +6 -2
  32. package/public/locales/it/sdoc-editor.json +6 -2
  33. package/public/locales/ru/sdoc-editor.json +7 -3
  34. package/public/locales/zh_CN/sdoc-editor.json +5 -1
@@ -252,7 +252,7 @@ const FileLinkInsertDialog = _ref => {
252
252
  }
253
253
  }, /*#__PURE__*/_react.default.createElement("img", {
254
254
  className: "file-item-img",
255
- src: (0, _helpers2.sdocFileIcon)(),
255
+ src: (0, _helpers2.getSdocFileIcon)(),
256
256
  alt: ""
257
257
  }), /*#__PURE__*/_react.default.createElement("span", {
258
258
  className: "file-item-name"
@@ -23,6 +23,7 @@ var _index4 = _interopRequireDefault(require("../../../../components/toast/index
23
23
  var _index5 = require("../../plugins/video/constants/index.js");
24
24
  var _constants3 = require("../../../../basic-sdk/constants");
25
25
  var _index6 = _interopRequireDefault(require("../../plugins/ai/ai-module/index.js"));
26
+ var _index7 = _interopRequireDefault(require("../../plugins/video/dialog/add-video-link-dialog/index.js"));
26
27
  const InsertElementDialog = _ref => {
27
28
  let {
28
29
  editor
@@ -32,6 +33,7 @@ const InsertElementDialog = _ref => {
32
33
  const [insertPosition, setInsertPosition] = (0, _react.useState)(_constants2.INSERT_POSITION.CURRENT);
33
34
  const [slateNode, setSlateNode] = (0, _react.useState)(null);
34
35
  const [insertLinkCallback, setInsertLinkCallback] = (0, _react.useState)(null);
36
+ const [insertVideoCallback, setInsertVideoCallback] = (0, _react.useState)(null);
35
37
  const [validEditor, setValidEditor] = (0, _react.useState)(editor);
36
38
  const [linkTitle, setLinkTitle] = (0, _react.useState)('');
37
39
  const [handleSubmit, setHandleSubmit] = (0, _react.useState)(() => void 0);
@@ -90,6 +92,7 @@ const InsertElementDialog = _ref => {
90
92
  slateNode,
91
93
  insertFileLinkCallback,
92
94
  insertSdocFileLinkCallback,
95
+ insertVideo,
93
96
  editor: paramEditor,
94
97
  linkTitle,
95
98
  // link shortcut wrapping link
@@ -103,6 +106,9 @@ const InsertElementDialog = _ref => {
103
106
  insertSdocFileLinkCallback,
104
107
  insertFileLinkCallback
105
108
  });
109
+ setInsertVideoCallback({
110
+ insertVideo
111
+ });
106
112
  setLinkTitle(linkTitle);
107
113
  setHandleSubmit(handleSubmit);
108
114
  // Apply for comment editor, as it has a different editor instance
@@ -124,6 +130,7 @@ const InsertElementDialog = _ref => {
124
130
  setElement('');
125
131
  setDialogType('');
126
132
  setInsertLinkCallback(null);
133
+ setInsertVideoCallback(null);
127
134
  setValidEditor(null);
128
135
  setLinkTitle('');
129
136
  }, []);
@@ -169,6 +176,20 @@ const InsertElementDialog = _ref => {
169
176
  };
170
177
  return /*#__PURE__*/_react.default.createElement(_index.default, fileLinkProps);
171
178
  }
179
+ case _constants2.ELEMENT_TYPE.VIDEO:
180
+ {
181
+ const videoProps = {
182
+ editor: validEditor,
183
+ dialogType,
184
+ insertVideoCallback,
185
+ closeDialog
186
+ };
187
+ return /*#__PURE__*/_react.default.createElement(_index.default, videoProps);
188
+ }
189
+ case _constants2.ELEMENT_TYPE.VIDEO_LINK:
190
+ {
191
+ return /*#__PURE__*/_react.default.createElement(_index7.default, props);
192
+ }
172
193
  case _constants2.LOCAL_IMAGE:
173
194
  {
174
195
  return /*#__PURE__*/_react.default.createElement("input", {
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.sdocFileIcon = exports.addDataToTree = void 0;
7
+ exports.getVideoFileIcon = exports.getSdocFileIcon = exports.addDataToTree = void 0;
8
8
  var _context = _interopRequireDefault(require("../../../../context"));
9
9
  const addDataToTree = (treeData, indexId, childrenData, path) => {
10
10
  for (let i = 0; i < treeData.length; i++) {
@@ -24,8 +24,13 @@ const addDataToTree = (treeData, indexId, childrenData, path) => {
24
24
  return treeData;
25
25
  };
26
26
  exports.addDataToTree = addDataToTree;
27
- const sdocFileIcon = () => {
27
+ const getSdocFileIcon = () => {
28
28
  const server = _context.default.getSetting('serviceUrl');
29
29
  return `${server}/media/img/file/256/sdoc.png`;
30
30
  };
31
- exports.sdocFileIcon = sdocFileIcon;
31
+ exports.getSdocFileIcon = getSdocFileIcon;
32
+ const getVideoFileIcon = () => {
33
+ const server = _context.default.getSetting('serviceUrl');
34
+ return `${server}/media/img/file/256/video.png`;
35
+ };
36
+ exports.getVideoFileIcon = getVideoFileIcon;
@@ -21,9 +21,9 @@ const SelectSdocFileDialog = _ref => {
21
21
  editor,
22
22
  dialogType,
23
23
  closeDialog,
24
- insertLinkCallback
24
+ insertLinkCallback,
25
+ insertVideoCallback
25
26
  } = _ref;
26
- const modalTitle = dialogType === _constants.ELEMENT_TYPE.FILE_LINK ? 'Select_file' : 'Select_sdoc_document';
27
27
  const {
28
28
  t
29
29
  } = (0, _reactI18next.useTranslation)('sdoc-editor');
@@ -31,6 +31,20 @@ const SelectSdocFileDialog = _ref => {
31
31
  const [temSearchContent, setTemSearchContent] = (0, _react.useState)('');
32
32
  const [searchContent, setSearchContent] = (0, _react.useState)('');
33
33
  const [isOpenSearch, setIsOpenSearch] = (0, _react.useState)(false);
34
+ let modalTitle;
35
+ switch (dialogType) {
36
+ case _constants.ELEMENT_TYPE.FILE_LINK:
37
+ modalTitle = 'Select_file';
38
+ break;
39
+ case _constants.ELEMENT_TYPE.SDOC_LINK:
40
+ modalTitle = 'Select_sdoc_document';
41
+ break;
42
+ case _constants.ELEMENT_TYPE.VIDEO:
43
+ modalTitle = 'Select_video_file';
44
+ break;
45
+ default:
46
+ break;
47
+ }
34
48
  const onSelectedFile = (0, _react.useCallback)(fileInfo => {
35
49
  setCurrentSelectedFile(fileInfo);
36
50
  }, []);
@@ -38,13 +52,31 @@ const SelectSdocFileDialog = _ref => {
38
52
  const {
39
53
  insertFileLinkCallback,
40
54
  insertSdocFileLinkCallback
41
- } = insertLinkCallback;
42
- if (dialogType === _constants.ELEMENT_TYPE.FILE_LINK) {
43
- insertFileLinkCallback && insertFileLinkCallback(editor, fileInfo.name, fileInfo.file_uuid);
44
- } else {
45
- insertSdocFileLinkCallback && insertSdocFileLinkCallback(editor, fileInfo.name, fileInfo.file_uuid);
55
+ } = insertLinkCallback || {};
56
+ const {
57
+ insertVideo
58
+ } = insertVideoCallback || {};
59
+ switch (dialogType) {
60
+ case _constants.ELEMENT_TYPE.FILE_LINK:
61
+ insertFileLinkCallback && insertFileLinkCallback(editor, fileInfo.name, fileInfo.file_uuid);
62
+ break;
63
+ case _constants.ELEMENT_TYPE.SDOC_LINK:
64
+ insertSdocFileLinkCallback && insertSdocFileLinkCallback(editor, fileInfo.name, fileInfo.file_uuid);
65
+ break;
66
+ case _constants.ELEMENT_TYPE.VIDEO:
67
+ const repoID = _context.default.getSetting('repoID');
68
+ const fileServerRoot = _context.default.getSetting('fileServerRoot');
69
+ // Get seafile's video download url as src
70
+ const url = `${fileServerRoot}repos/${repoID}/files${fileInfo.path}/?op=download`;
71
+ const encodedUrl = encodeURI(url);
72
+ insertVideo && insertVideo(editor, [{
73
+ name: fileInfo.name
74
+ }], [encodedUrl]);
75
+ break;
76
+ default:
77
+ break;
46
78
  }
47
- }, [insertLinkCallback, dialogType, editor]);
79
+ }, [insertLinkCallback, insertVideoCallback, dialogType, editor]);
48
80
  const onSubmit = (0, _react.useCallback)(() => {
49
81
  if (!currentSelectedFile) return;
50
82
  const {
@@ -53,6 +85,14 @@ const SelectSdocFileDialog = _ref => {
53
85
  let fileInfo = {
54
86
  ...currentSelectedFile
55
87
  };
88
+
89
+ // Insert video element in sdoc
90
+ if (dialogType === _constants.ELEMENT_TYPE.VIDEO) {
91
+ insertFile(fileInfo);
92
+ closeDialog();
93
+ return;
94
+ }
95
+
56
96
  // File has no id
57
97
  if (!file_uuid || file_uuid === '') {
58
98
  _context.default.getSdocLocalFileId(currentSelectedFile.path).then(res => {
@@ -36,6 +36,7 @@
36
36
  left: 0;
37
37
  }
38
38
 
39
+ .sdoc-file-icon-container .video-file-img,
39
40
  .sdoc-file-icon-container .sdoc-file-img {
40
41
  position: absolute;
41
42
  width: 21.6px;
@@ -155,7 +155,7 @@ const LocalFiles = _ref => {
155
155
  className: "sdoc-folder-children"
156
156
  }, ((_item$children = item.children) === null || _item$children === void 0 ? void 0 : _item$children.length) === 0 && /*#__PURE__*/_react.default.createElement("div", {
157
157
  className: "sdoc-folder-children-empty"
158
- }, `(${t('Empty')})`), ((_item$children2 = item.children) === null || _item$children2 === void 0 ? void 0 : _item$children2.length) > 0 && renderFileTree(item.children))), type === 'file' && /*#__PURE__*/_react.default.createElement("div", {
158
+ }, `(${t('Empty')})`), ((_item$children2 = item.children) === null || _item$children2 === void 0 ? void 0 : _item$children2.length) > 0 && renderFileTree(item.children))), ['file', 'video'].includes(type) && /*#__PURE__*/_react.default.createElement("div", {
159
159
  className: (0, _classnames.default)('sdoc-file-info', {
160
160
  'active': selected
161
161
  }),
@@ -170,7 +170,11 @@ const LocalFiles = _ref => {
170
170
  })
171
171
  }), fileType === 'sdoc' && /*#__PURE__*/_react.default.createElement("img", {
172
172
  className: "sdoc-file-img",
173
- src: (0, _helpers.sdocFileIcon)(),
173
+ src: (0, _helpers.getSdocFileIcon)(),
174
+ alt: ""
175
+ }), fileType === 'video' && /*#__PURE__*/_react.default.createElement("img", {
176
+ className: "video-file-img",
177
+ src: (0, _helpers.getVideoFileIcon)(),
174
178
  alt: ""
175
179
  })), /*#__PURE__*/_react.default.createElement("span", {
176
180
  className: "sdoc-file-name"
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.WIKI_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.SEATABLE_TABLE = exports.SEATABLE_COLUMN = 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.FOUR_COLUMN = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = 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.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.SEATABLE_TABLE = exports.SEATABLE_COLUMN = 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.FOUR_COLUMN = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = 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
  const BLOCKQUOTE = exports.BLOCKQUOTE = 'blockquote';
8
8
  const TITLE = exports.TITLE = 'title';
9
9
  const SUBTITLE = exports.SUBTITLE = 'subtitle';
@@ -42,6 +42,7 @@ const MENTION = exports.MENTION = 'mention';
42
42
  const MENTION_TEMP = exports.MENTION_TEMP = 'mention_temp';
43
43
  const FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK_INSET_INPUT_TEMP = 'file_link_insert_input_temp';
44
44
  const QUICK_INSERT = exports.QUICK_INSERT = 'quick_insert';
45
+ const VIDEO_LINK = exports.VIDEO_LINK = 'video_link';
45
46
  const SEATABLE_COLUMN = exports.SEATABLE_COLUMN = 'seatable_column';
46
47
  const SEATABLE_TABLE = exports.SEATABLE_TABLE = 'seatable_table';
47
48
  const ASK_AI = exports.ASK_AI = 'ask_ai';
@@ -532,7 +532,8 @@ const LIST_ITEM_SUPPORTED_TRANSFORMATION = exports.LIST_ITEM_SUPPORTED_TRANSFORM
532
532
  const ADD_POSITION_OFFSET_TYPE = exports.ADD_POSITION_OFFSET_TYPE = [_elementType.PARAGRAPH, _elementType.SUBTITLE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CHECK_LIST_ITEM, _elementType.IMAGE_BLOCK];
533
533
  const FILE_TYPE = exports.FILE_TYPE = {
534
534
  [_elementType.FILE_LINK]: 'file',
535
- [_elementType.SDOC_LINK]: 'sdoc'
535
+ [_elementType.SDOC_LINK]: 'sdoc',
536
+ [_elementType.VIDEO]: 'video'
536
537
  };
537
538
  const 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.SEATABLE_TABLE, _elementType.MULTI_COLUMN];
538
539
  const MOUSE_ENTER_EVENT_DISABLED_MAP = exports.MOUSE_ENTER_EVENT_DISABLED_MAP = {
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.someNode = exports.isTopLevelListItem = exports.isTextNode = exports.isStartPoint = exports.isSelectionAtBlockStart = exports.isSelectionAtBlockEnd = exports.isRangeInSameBlock = exports.isRangeAcrossBlocks = exports.isMultiLevelList = exports.isMiddlePoint = exports.isLastNode = exports.isLastChild = exports.isHasImg = exports.isFirstChild = exports.isEndPoint = exports.isEmptyArticle = exports.isCurrentLineHasText = exports.isCurrentLineEmpty = exports.isContainsVoidElement = exports.isBlockTextEmptyAfterSelection = exports.isBlockAboveEmpty = exports.isAncestorEmpty = exports.getTopLevelBlockNode = exports.getStartPoint = exports.getSelectedNodeEntryByType = exports.getSelectedNodeByTypes = exports.getSelectedNodeByType = exports.getSelectedElems = exports.getQueryOptions = exports.getPreviousPath = exports.getPrevNode = exports.getPointBefore = exports.getParentNode = exports.getNodes = exports.getNodeType = exports.getNodeEntries = exports.getNodeById = exports.getNode = exports.getNextSiblingNodes = exports.getNextNode = exports.getLastChildPath = exports.getLastChild = exports.getEndPoint = exports.getEditorString = exports.getDeepInlineChildren = exports.getCurrentNode = exports.getCommonNode = exports.getChildren = exports.getAboveNode = exports.getAboveBlockNode = exports.findPath = exports.findNode = exports.findDescendant = void 0;
7
+ exports.someNode = exports.isTopLevelListItem = exports.isTextNode = exports.isStartPoint = exports.isSelectionAtBlockStart = exports.isSelectionAtBlockEnd = exports.isRangeInSameBlock = exports.isRangeAcrossBlocks = exports.isMultiLevelList = exports.isMiddlePoint = exports.isLastNode = exports.isLastChild = exports.isHasImg = exports.isFirstChild = exports.isEndPoint = exports.isEmptyArticle = exports.isCursorAtBlockStart = exports.isCurrentLineHasText = exports.isCurrentLineEmpty = exports.isContainsVoidElement = exports.isBlockTextEmptyAfterSelection = exports.isBlockAboveEmpty = exports.isAncestorEmpty = exports.getTopLevelBlockNode = exports.getStartPoint = exports.getSelectedNodeEntryByType = exports.getSelectedNodeByTypes = exports.getSelectedNodeByType = exports.getSelectedElems = exports.getQueryOptions = exports.getPreviousPath = exports.getPrevNode = exports.getPointBefore = exports.getParentNode = exports.getNodes = exports.getNodeType = exports.getNodeEntries = exports.getNodeById = exports.getNode = exports.getNextSiblingNodes = exports.getNextNode = exports.getLastChildPath = exports.getLastChild = exports.getEndPoint = exports.getEditorString = exports.getDeepInlineChildren = exports.getCurrentNode = exports.getCommonNode = exports.getChildren = exports.getAboveNode = exports.getAboveBlockNode = exports.findPath = exports.findNode = exports.findDescendant = void 0;
8
8
  var _slate = require("@seafile/slate");
9
9
  var _slateReact = require("@seafile/slate-react");
10
10
  var _utils = require("../utils");
@@ -455,6 +455,27 @@ const isBlockAboveEmpty = editor => {
455
455
  return isAncestorEmpty(editor, block);
456
456
  };
457
457
  exports.isBlockAboveEmpty = isBlockAboveEmpty;
458
+ const isCursorAtBlockStart = (editor, options) => {
459
+ const {
460
+ selection
461
+ } = editor;
462
+ if (!selection) return false;
463
+ const nodeEntry = getAboveBlockNode(editor, options);
464
+ let [node, path] = nodeEntry || [];
465
+ if (!path) return false;
466
+
467
+ // Special handling of placeholders, such as link, inline image
468
+ if (_slate.Node.string(node.children[0]).length === 0) {
469
+ const {
470
+ offset,
471
+ path: point
472
+ } = selection.focus;
473
+ if (offset !== 0) return false;
474
+ return _slate.Path.equals(point, [path[0], 1, 0]);
475
+ }
476
+ return isStartPoint(editor, selection.focus, path);
477
+ };
478
+ exports.isCursorAtBlockStart = isCursorAtBlockStart;
458
479
  const isSelectionAtBlockStart = (editor, options) => {
459
480
  const {
460
481
  selection
@@ -40,19 +40,22 @@ const withCheckList = editor => {
40
40
  }
41
41
 
42
42
  // If it is check-list-item, handle your own business logic
43
- if (_slate.Node.string(node).length > 0) {
44
- _slate.Transforms.splitNodes(editor, {
45
- always: true
46
- });
47
- _slate.Transforms.setNodes(editor, {
48
- checked: false
49
- }, {
50
- at: node[1]
43
+ if ((0, _core.isCursorAtBlockStart)(editor)) {
44
+ const path = (0, _core.findPath)(editor, node);
45
+ const newNode = (0, _core.generateEmptyElement)(_constants.CHECK_LIST_ITEM);
46
+ _slate.Transforms.insertNodes(editor, newNode, {
47
+ at: path
51
48
  });
52
49
  return;
53
50
  }
54
- insertBreak();
55
- return;
51
+ _slate.Transforms.splitNodes(editor, {
52
+ always: true
53
+ });
54
+ _slate.Transforms.setNodes(editor, {
55
+ checked: false
56
+ }, {
57
+ at: node[1]
58
+ });
56
59
  };
57
60
  newEditor.deleteBackward = unit => {
58
61
  const {
@@ -68,47 +68,47 @@ const withCodeBlock = editor => {
68
68
  }
69
69
  });
70
70
  return insertFragment(data);
71
- } else {
72
- // Paste into code block
73
- if ((0, _core.getSelectedNodeByType)(editor, _constants.CODE_BLOCK)) {
74
- // Pasted data is code block split with code-line
75
- data.forEach((node, index) => {
76
- if (node.type === _constants.CODE_BLOCK) {
77
- const codeLineArr = node.children.map(line => line);
78
- data.splice(index, 1, ...codeLineArr);
79
- }
80
- });
81
- const newData = data.map(node => {
82
- const text = _slate.Node.string(node);
83
- const codeLine = {
84
- id: _slugid.default.nice(),
85
- type: _constants.CODE_LINE,
86
- children: [{
87
- text: text,
88
- id: _slugid.default.nice()
89
- }]
90
- };
91
- return codeLine;
92
- });
71
+ }
93
72
 
94
- // current focus code-line string not empty
95
- const string = _slate.Editor.string(newEditor, newEditor.selection.focus.path);
96
- if (string.length !== 0 && _slate.Range.isCollapsed(newEditor.selection)) {
97
- const [node, ...restNode] = newData;
98
- const text = _slate.Node.string(node);
99
- insertText(text);
100
- if (restNode.length !== 0) {
101
- insertBreak();
102
- insertFragment(restNode);
103
- }
104
- return;
73
+ // Paste into code block
74
+ if ((0, _core.getSelectedNodeByType)(editor, _constants.CODE_BLOCK)) {
75
+ // Pasted data is code block split with code-line
76
+ data.forEach((node, index) => {
77
+ if (node.type === _constants.CODE_BLOCK) {
78
+ const codeLineArr = node.children.map(line => line);
79
+ data.splice(index, 1, ...codeLineArr);
105
80
  }
106
- return insertFragment(newData);
107
- } else {
108
- // Paste into not a code block
109
- return insertFragment(data);
81
+ });
82
+ const newData = data.map(node => {
83
+ const text = _slate.Node.string(node);
84
+ const codeLine = {
85
+ id: _slugid.default.nice(),
86
+ type: _constants.CODE_LINE,
87
+ children: [{
88
+ text: text,
89
+ id: _slugid.default.nice()
90
+ }]
91
+ };
92
+ return codeLine;
93
+ });
94
+
95
+ // current focus code-line string not empty
96
+ const string = _slate.Editor.string(newEditor, newEditor.selection.focus.path);
97
+ if (string.length !== 0 && _slate.Range.isCollapsed(newEditor.selection)) {
98
+ const [node, ...restNode] = newData;
99
+ const text = _slate.Node.string(node);
100
+ insertText(text);
101
+ if (restNode.length !== 0) {
102
+ insertBreak();
103
+ insertFragment(restNode);
104
+ }
105
+ return;
110
106
  }
107
+ return insertFragment(newData);
111
108
  }
109
+
110
+ // Paste into not a code block
111
+ return insertFragment(data);
112
112
  };
113
113
 
114
114
  // Rewrite normalizeNode
@@ -213,6 +213,17 @@ const withCodeBlock = editor => {
213
213
  }
214
214
  }
215
215
  };
216
+ newEditor.insertBreak = () => {
217
+ const selectedNode = (0, _core.getSelectedNodeByType)(newEditor, _constants.CODE_LINE);
218
+ if (selectedNode != null && (0, _core.isCursorAtBlockStart)(newEditor)) {
219
+ const line = (0, _core.generateEmptyElement)(_constants.CODE_LINE);
220
+ _slate.Transforms.insertNodes(editor, line, {
221
+ at: selectedNode[1]
222
+ });
223
+ return;
224
+ }
225
+ insertBreak();
226
+ };
216
227
  return newEditor;
217
228
  };
218
229
  var _default = exports.default = withCodeBlock;
@@ -55,6 +55,14 @@ const withHeader = editor => {
55
55
  insertBreak();
56
56
  return;
57
57
  }
58
+ if ((0, _core.isCursorAtBlockStart)(newEditor)) {
59
+ const [currentNode, path] = match;
60
+ const newNode = (0, _core.generateEmptyElement)(currentNode.type);
61
+ _slate.Transforms.insertNodes(editor, newNode, {
62
+ at: path
63
+ });
64
+ return;
65
+ }
58
66
  const isAtLineEnd = isSelectionAtLineEnd(editor, match[1]);
59
67
  const nextNode = _slate.Editor.next(editor, {
60
68
  at: match[1]
@@ -62,8 +62,8 @@ const insertLink = function (editor, title, url) {
62
62
  let slateNode = arguments.length > 4 ? arguments[4] : undefined;
63
63
  if (position === _constants.INSERT_POSITION.CURRENT && isMenuDisabled(editor)) return;
64
64
  if (!title || !url) return;
65
+ const linkNode = genLinkNode(url, title);
65
66
  if (position === _constants.INSERT_POSITION.AFTER) {
66
- const linkNode = genLinkNode(url, title);
67
67
  let path = _slate.Editor.path(editor, editor.selection);
68
68
  if (slateNode && (slateNode === null || slateNode === void 0 ? void 0 : slateNode.type) === _constants.LIST_ITEM) {
69
69
  path = _slateReact.ReactEditor.findPath(editor, slateNode);
@@ -88,26 +88,25 @@ const insertLink = function (editor, title, url) {
88
88
  if (selection == null) return;
89
89
  const isCollapsed = _slate.Range.isCollapsed(selection);
90
90
  if (isCollapsed) {
91
- const linkNode = genLinkNode(url, title);
92
91
  _slate.Transforms.insertNodes(editor, linkNode);
93
- } else {
94
- const selectedText = _slate.Editor.string(editor, selection); // Selected text
95
- if (selectedText !== title) {
96
- // If the selected text is different from the typed text, delete the text and insert the link
97
- editor.deleteFragment();
98
- const linkNode = genLinkNode(url, title);
99
- _slate.Transforms.insertNodes(editor, linkNode);
100
- } else {
101
- // If the selected text is the same as the entered text, only the link can be wrapped
102
- const linkNode = genLinkNode(url, title);
103
- _slate.Transforms.wrapNodes(editor, linkNode, {
104
- split: true
105
- });
106
- _slate.Transforms.collapse(editor, {
107
- edge: 'end'
108
- });
109
- }
92
+ return;
110
93
  }
94
+ const selectedText = _slate.Editor.string(editor, selection); // Selected text
95
+
96
+ // If the selected text is different from the typed text, delete the text and insert the link
97
+ if (selectedText !== title) {
98
+ editor.deleteFragment();
99
+ _slate.Transforms.insertNodes(editor, linkNode);
100
+ return;
101
+ }
102
+
103
+ // If the selected text is the same as the entered text, only the link can be wrapped
104
+ _slate.Transforms.wrapNodes(editor, linkNode, {
105
+ split: true
106
+ });
107
+ _slate.Transforms.collapse(editor, {
108
+ edge: 'end'
109
+ });
111
110
  };
112
111
  exports.insertLink = insertLink;
113
112
  const updateLink = (editor, newText, newUrl) => {
@@ -129,7 +129,7 @@ const withLink = editor => {
129
129
  }
130
130
  return normalizeNode([node, path]);
131
131
  };
132
- editor.onCompositionStart = e => {
132
+ newEditor.onCompositionStart = e => {
133
133
  const {
134
134
  selection
135
135
  } = editor;
@@ -16,7 +16,8 @@ const withParagraph = editor => {
16
16
  insertText,
17
17
  deleteBackward,
18
18
  onHotKeyDown,
19
- insertFragment
19
+ insertFragment,
20
+ insertBreak
20
21
  } = editor;
21
22
  const newEditor = editor;
22
23
  newEditor.handleTab = event => {
@@ -135,6 +136,21 @@ const withParagraph = editor => {
135
136
  }
136
137
  return onHotKeyDown && onHotKeyDown(event);
137
138
  };
139
+ newEditor.insertBreak = () => {
140
+ const selectedNode = (0, _core.getSelectedNodeByType)(newEditor, _constants.PARAGRAPH);
141
+ if (selectedNode != null && (0, _core.isCursorAtBlockStart)(newEditor)) {
142
+ const paragraph = (0, _core.generateDefaultParagraph)();
143
+ const targetPath = (0, _core.findPath)(editor, selectedNode);
144
+ const parentNode = (0, _core.getParentNode)(newEditor.children, selectedNode.id);
145
+ if ((parentNode === null || parentNode === void 0 ? void 0 : parentNode.type) !== _constants.LIST_ITEM) {
146
+ _slate.Transforms.insertNodes(editor, paragraph, {
147
+ at: targetPath
148
+ });
149
+ return;
150
+ }
151
+ }
152
+ insertBreak();
153
+ };
138
154
  newEditor.insertFragment = data => {
139
155
  const paragraphBlock = (0, _core.getSelectedNodeByType)(editor, _constants.PARAGRAPH);
140
156
  const onlyOneListItem = data.length === 1 && (0, _helpers.isSingleListItem)(data[0]);
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.unwrapLinkNode = exports.sdocFileIcon = exports.removeTempInput = exports.removeShortCutSymbol = exports.onCopySdocLinkNode = exports.isTriggeredByShortcut = exports.isMenuDisabled = exports.insertTextWhenRemoveFileNameCollector = exports.insertTempInput = exports.insertSdocFileLink = exports.getUrl = exports.getType = exports.getSdocLinkEntry = exports.getNewFileListData = exports.getFileSearchInputEntry = exports.getBeforeText = exports.generateSdocFileNode = void 0;
7
+ exports.unwrapLinkNode = exports.removeTempInput = exports.removeShortCutSymbol = exports.onCopySdocLinkNode = exports.isTriggeredByShortcut = exports.isMenuDisabled = exports.insertTextWhenRemoveFileNameCollector = exports.insertTempInput = exports.insertSdocFileLink = exports.getUrl = exports.getType = exports.getSdocLinkEntry = exports.getSdocFileIcon = exports.getNewFileListData = exports.getFileSearchInputEntry = exports.getBeforeText = exports.generateSdocFileNode = void 0;
8
8
  var _slateReact = require("@seafile/slate-react");
9
9
  var _slate = require("@seafile/slate");
10
10
  var _slugid = _interopRequireDefault(require("slugid"));
@@ -274,11 +274,11 @@ const insertTextWhenRemoveFileNameCollector = (editor, searchInputNode) => {
274
274
  removeTempInput(editor, searchInputNode);
275
275
  };
276
276
  exports.insertTextWhenRemoveFileNameCollector = insertTextWhenRemoveFileNameCollector;
277
- const sdocFileIcon = () => {
277
+ const getSdocFileIcon = () => {
278
278
  const server = _context.default.getSetting('serviceUrl');
279
279
  return `${server}/media/img/file/256/sdoc.png`;
280
280
  };
281
- exports.sdocFileIcon = sdocFileIcon;
281
+ exports.getSdocFileIcon = getSdocFileIcon;
282
282
  const getSdocLinkEntry = function (editor) {
283
283
  let at = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : editor.selection;
284
284
  const aboveNodeEntry = _slate.Editor.above(editor, {
@@ -147,7 +147,7 @@ const SdocFileLink = _ref => {
147
147
  style: style
148
148
  }, element.type !== _elementType.WIKI_LINK && /*#__PURE__*/_react.default.createElement("img", {
149
149
  className: "file-link-img",
150
- src: (0, _helpers.sdocFileIcon)(),
150
+ src: (0, _helpers.getSdocFileIcon)(),
151
151
  alt: ""
152
152
  }), element.type === _elementType.WIKI_LINK && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, icon && /*#__PURE__*/_react.default.createElement("span", null, icon), !icon && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isDir ? /*#__PURE__*/_react.default.createElement("span", {
153
153
  className: "sf3-font sf3-font-files2"