@seafile/sdoc-editor 2.0.20 → 2.0.21

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.
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _reactI18next = require("react-i18next");
11
+ var _slateReact = require("@seafile/slate-react");
11
12
  var _useParticipants = require("../../hooks/use-participants");
12
13
  var _participantAvatar = _interopRequireDefault(require("./participant-avatar"));
13
14
  var _tooltip = _interopRequireDefault(require("../../../../components/tooltip"));
@@ -18,6 +19,7 @@ const CommentAllParticipants = () => {
18
19
  const {
19
20
  participants
20
21
  } = (0, _useParticipants.useParticipantsContext)();
22
+ const editor = (0, _slateReact.useSlateStatic)();
21
23
  const {
22
24
  t
23
25
  } = (0, _reactI18next.useTranslation)('sdoc-editor');
@@ -58,7 +60,8 @@ const CommentAllParticipants = () => {
58
60
  target: addParticipantId
59
61
  }, t('Add_participants'))), isDidMount && /*#__PURE__*/_react.default.createElement(_commentParticipantsEditor.default, {
60
62
  target: commentsParticipantsId,
61
- ref: popoverRef
63
+ ref: popoverRef,
64
+ editor: editor
62
65
  }));
63
66
  };
64
67
  var _default = exports.default = CommentAllParticipants;
@@ -17,7 +17,8 @@ var _mouseEvent = require("../../../utils/mouse-event");
17
17
  require("./index.css");
18
18
  const CommentParticipantsEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
19
19
  let {
20
- target
20
+ target,
21
+ editor
21
22
  } = _ref;
22
23
  const popoverRef = (0, _react.useRef)();
23
24
  const {
@@ -38,10 +39,10 @@ const CommentParticipantsEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref
38
39
  const onChangeSearch = (0, _react.useCallback)(event => {
39
40
  const newSearchValue = event.target.value;
40
41
  if (searchValue === newSearchValue) return;
41
- const searchedCollaborators = (0, _utils.searchCollaborators)(collaborators, newSearchValue);
42
+ const searchedCollaborators = (0, _utils.searchCollaborators)(collaborators, newSearchValue, editor);
42
43
  setSearchValue(newSearchValue);
43
44
  setSearchedCollaborators(searchedCollaborators);
44
- }, [searchValue, collaborators]);
45
+ }, [searchValue, collaborators, editor]);
45
46
  return /*#__PURE__*/_react.default.createElement(_reactstrap.UncontrolledPopover, {
46
47
  target: target,
47
48
  className: "sdoc-comments-participants-popover",
@@ -23,14 +23,22 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/es
23
23
  var _slate = require("@seafile/slate");
24
24
  var _slateReact = require("@seafile/slate-react");
25
25
  var _utils = require("../../../utils");
26
+ var _helper = require("../../extension/plugins/mention/helper");
26
27
  var _constants = require("../../../constants");
27
28
  var _notificationUtils = require("./notification-utils");
28
29
  var _core = require("../../extension/core");
29
30
  var _constants2 = require("../../extension/constants");
30
- const searchCollaborators = (collaborators, searchValue) => {
31
+ const searchCollaborators = (collaborators, searchValue, editor) => {
31
32
  const validSearchValue = searchValue ? searchValue.trim().toLowerCase() : '';
32
33
  const validCollaborators = Array.isArray(collaborators) && collaborators.length > 0 ? collaborators : [];
33
34
  if (!validSearchValue) return validCollaborators;
35
+
36
+ // The current character is '@' and the previous character is a null character
37
+ const beforeStr = (0, _helper.getPreCharacters)(editor);
38
+ const isEmptyStr = beforeStr.slice(-2, -1).trim().length === 0;
39
+ if (beforeStr.slice(-1) === '@' && isEmptyStr) {
40
+ return validCollaborators;
41
+ }
34
42
  return validCollaborators.filter(collaborator => {
35
43
  const {
36
44
  name,
@@ -74,16 +74,24 @@ const setCheckListItemType = (editor, newType, insertPosition) => {
74
74
  }
75
75
  if (!(0, _core.isRangeAcrossBlocks)(editor)) {
76
76
  const path = _slate.Editor.path(editor, editor.selection);
77
+ const [currentNode] = (0, _core.getCurrentNode)(editor);
77
78
  if (path) {
78
79
  const [targetNode, targetPath] = _slate.Editor.node(editor, [path[0]]);
79
80
  if (targetNode && [_constants.ORDERED_LIST, _constants.UNORDERED_LIST].includes(targetNode === null || targetNode === void 0 ? void 0 : targetNode.type)) {
80
81
  convertToCheck(editor, targetNode, targetPath);
82
+ if (newType === _constants.CHECK_LIST_ITEM && !_slate.Node.string(currentNode)) {
83
+ (0, _core.focusEditor)(editor);
84
+ }
81
85
  return;
82
86
  }
83
87
  }
84
88
  _slate.Transforms.setNodes(editor, {
85
89
  type: newType
86
90
  });
91
+ // When currentNode is empty
92
+ if (newType === _constants.CHECK_LIST_ITEM && !_slate.Node.string(currentNode)) {
93
+ (0, _core.focusEditor)(editor, path);
94
+ }
87
95
  } else {
88
96
  const nodes = _slate.Editor.nodes(editor, {
89
97
  match: n => {
@@ -10,6 +10,7 @@ var _core = require("../../../core");
10
10
  var _queries = require("../queries");
11
11
  var _unwrapList = require("./unwrap-list");
12
12
  var _model = require("../model");
13
+ var _slateReact = require("@seafile/slate-react");
13
14
  const wrapLineList = (editor, type) => {
14
15
  const list = (0, _model.generateEmptyList)(type);
15
16
  _slate.Transforms.wrapNodes(editor, list);
@@ -105,7 +106,8 @@ const wrapRangeList = (editor, type) => {
105
106
  });
106
107
  });
107
108
  };
108
- const toggleList = (editor, type, insertPosition) => {
109
+ const toggleList = function (editor, type, insertPosition) {
110
+ let focusSelection = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
109
111
  if (insertPosition === _constants.INSERT_POSITION.AFTER) {
110
112
  const list = (0, _model.generateEmptyList)(type);
111
113
  const listContent = (0, _model.generateEmptyListContent)();
@@ -122,6 +124,7 @@ const toggleList = (editor, type, insertPosition) => {
122
124
  selection
123
125
  } = editor;
124
126
  if (!selection) return false;
127
+ const [currentNode] = (0, _core.getCurrentNode)(editor);
125
128
 
126
129
  // selection is collapsed, anchor === focus
127
130
  // selection is in one block
@@ -147,6 +150,11 @@ const toggleList = (editor, type, insertPosition) => {
147
150
  } else {
148
151
  wrapLineList(editor, type);
149
152
  }
153
+
154
+ // When currentNode is empty
155
+ if (!_slate.Node.string(currentNode) && currentNode.children.length === 1 && focusSelection) {
156
+ (0, _core.focusEditor)(editor, editor.selection);
157
+ }
150
158
  return;
151
159
  }
152
160
 
@@ -186,7 +186,7 @@ const withMarkDown = editor => {
186
186
  _slate.Transforms.select(editor, range);
187
187
  _slate.Transforms.delete(editor);
188
188
  if (type === _constants.UNORDERED_LIST) {
189
- (0, _transforms.toggleList)(editor, type);
189
+ (0, _transforms.toggleList)(editor, type, null, false);
190
190
  return;
191
191
  }
192
192
  if (type === _constants.BLOCKQUOTE) {
@@ -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.transformToText = exports.sortCollaborators = exports.insertTemporaryMentionInput = exports.insertMention = exports.getPrevMentionIptEntry = exports.getMentionTempIptEntry = exports.getMentionEntry = void 0;
7
+ exports.transformToText = exports.sortCollaborators = exports.insertTemporaryMentionInput = exports.insertMention = exports.getPrevMentionIptEntry = exports.getPreCharacters = exports.getMentionTempIptEntry = exports.getMentionEntry = void 0;
8
8
  var _slate = require("@seafile/slate");
9
9
  var _slugid = _interopRequireDefault(require("slugid"));
10
10
  var _core = require("../../core");
@@ -163,4 +163,21 @@ const getPrevMentionIptEntry = editor => {
163
163
  }
164
164
  return;
165
165
  };
166
- exports.getPrevMentionIptEntry = getPrevMentionIptEntry;
166
+ exports.getPrevMentionIptEntry = getPrevMentionIptEntry;
167
+ const getPreCharacters = editor => {
168
+ const {
169
+ selection
170
+ } = editor;
171
+ const {
172
+ anchor,
173
+ focus
174
+ } = selection;
175
+ const path = _slate.Editor.path(editor, anchor);
176
+ const startPoint = _slate.Editor.start(editor, path);
177
+ const beforeStr = _slate.Editor.string(editor, {
178
+ anchor: startPoint,
179
+ focus
180
+ });
181
+ return beforeStr;
182
+ };
183
+ exports.getPreCharacters = getPreCharacters;
@@ -27,16 +27,20 @@ const withMention = editor => {
27
27
  const {
28
28
  selection
29
29
  } = editor;
30
- if (text === '@' && !(0, _helper.getMentionTempIptEntry)(editor)) {
31
- (0, _helper.insertTemporaryMentionInput)(newEditor);
32
- const {
33
- anchor
34
- } = selection;
35
- const path = _slate.Editor.path(editor, anchor);
36
- const abovePath = path.slice(0, path.length - 1);
37
- const focusPath = abovePath.concat(path.at(-1) + 1);
38
- (0, _core.focusEditor)(editor, focusPath);
39
- return;
30
+ if (text === '@') {
31
+ const beforeStr = (0, _helper.getPreCharacters)(editor);
32
+ const isEmptyStr = beforeStr.slice(-1).trim().length === 0;
33
+ if (!(0, _helper.getMentionTempIptEntry)(editor) && isEmptyStr) {
34
+ const {
35
+ anchor
36
+ } = selection;
37
+ const path = _slate.Editor.path(editor, anchor);
38
+ (0, _helper.insertTemporaryMentionInput)(newEditor);
39
+ const abovePath = path.slice(0, path.length - 1);
40
+ const focusPath = abovePath.concat(path.at(-1) + 1);
41
+ (0, _core.focusEditor)(editor, focusPath);
42
+ return;
43
+ }
40
44
  }
41
45
  const prevNodeEntry = _slate.Editor.previous(editor);
42
46
  if (prevNodeEntry) {
@@ -109,9 +109,9 @@ const ParticipantPopover = _ref => {
109
109
  }, [collaboratorsPopoverRef]);
110
110
  const getSearchedCollaborators = (0, _react.useCallback)(searchingText => {
111
111
  if (!searchingText.length) return validCollaborators;
112
- if (searchingText) return (0, _utils.searchCollaborators)(validCollaborators, searchingText);
112
+ if (searchingText) return (0, _utils.searchCollaborators)(validCollaborators, searchingText, editor);
113
113
  return [];
114
- }, [validCollaborators]);
114
+ }, [editor, validCollaborators]);
115
115
  const handleInvolvedKeyUp = (0, _react.useCallback)(() => {
116
116
  const searchedCollaborators = getSearchedCollaborators(searchText);
117
117
  if (searchedCollaborators.length === 0) {
@@ -189,7 +189,7 @@ const ParticipantPopover = _ref => {
189
189
  handleInvolvedKeyUp(event);
190
190
  }, [editor, handleInvolvedKeyUp, handleSelectCollaborator, handleSelectingCollaborator]);
191
191
 
192
- //Add the Enter keydown event listener during the capture phase
192
+ // Add the Enter keydown event listener during the capture phase
193
193
  (0, _react.useEffect)(() => {
194
194
  const handleKeydownCapture = event => {
195
195
  if (event.keyCode === _constants3.KeyCodes.Enter) {
@@ -140,7 +140,13 @@ const QuickInsertBlockMenu = _ref => {
140
140
  }, [editor]);
141
141
  const isDisableTable = (0, _react.useMemo)(() => {
142
142
  const callout = (0, _core.getAboveBlockNode)(editor, {
143
- match: n => [_constants.ELEMENT_TYPE.ORDERED_LIST, _constants.ELEMENT_TYPE.UNORDERED_LIST, _constants.ELEMENT_TYPE.CHECK_LIST_ITEM, _constants.ELEMENT_TYPE.MULTI_COLUMN].includes(n.type)
143
+ match: n => [_constants.ELEMENT_TYPE.ORDERED_LIST, _constants.ELEMENT_TYPE.UNORDERED_LIST, _constants.ELEMENT_TYPE.CHECK_LIST_ITEM, _constants.ELEMENT_TYPE.MULTI_COLUMN, _constants.ELEMENT_TYPE.BLOCKQUOTE, _constants.ELEMENT_TYPE.CALL_OUT].includes(n.type)
144
+ });
145
+ return !!callout;
146
+ }, [editor]);
147
+ const isDisableMultiColumn = (0, _react.useMemo)(() => {
148
+ const callout = (0, _core.getAboveBlockNode)(editor, {
149
+ match: n => [_constants.ELEMENT_TYPE.ORDERED_LIST, _constants.ELEMENT_TYPE.UNORDERED_LIST, _constants.ELEMENT_TYPE.CHECK_LIST_ITEM, _constants.ELEMENT_TYPE.MULTI_COLUMN, _constants.ELEMENT_TYPE.BLOCKQUOTE, _constants.ELEMENT_TYPE.CALL_OUT].includes(n.type)
144
150
  });
145
151
  return !!callout;
146
152
  }, [editor]);
@@ -267,6 +273,7 @@ const QuickInsertBlockMenu = _ref => {
267
273
  _constants.SIDE_INSERT_MENUS_CONFIG[_constants.ELEMENT_TYPE.MULTI_COLUMN].forEach(item => {
268
274
  items[item.id.toLowerCase()] = /*#__PURE__*/_react.default.createElement(_dropdownMenuItem.default, {
269
275
  isHidden: !quickInsertMenuSearchMap[item.type],
276
+ disabled: isDisableMultiColumn,
270
277
  className: "sdoc-insert-menu-multi-column",
271
278
  key: item.id,
272
279
  menuConfig: item,
@@ -277,7 +284,7 @@ const QuickInsertBlockMenu = _ref => {
277
284
  delete items[_constants.VIDEO];
278
285
  }
279
286
  return items;
280
- }, [quickInsertMenuSearchMap, isDisableImage, onInsertImageToggle, isDisableVideo, onInsertVideoToggle, isDisableTable, editor, createTable, callback, handleClosePopover, openLinkDialog, onInsertCodeBlock, isDisableCallout, onInsertCheckList, isEmptyNode, onInsertCallout, onInsertList, onInsert, createMultiColumn]);
287
+ }, [quickInsertMenuSearchMap, isDisableImage, onInsertImageToggle, isDisableVideo, isDisableMultiColumn, onInsertVideoToggle, isDisableTable, editor, createTable, callback, handleClosePopover, openLinkDialog, onInsertCodeBlock, isDisableCallout, onInsertCheckList, isEmptyNode, onInsertCallout, onInsertList, onInsert, createMultiColumn]);
281
288
  const getSelectItemDom = selectIndex => {
282
289
  const dropDownItemWrapper = downDownWrapperRef.current;
283
290
  const searchedDropDownItemWrapper = [];
@@ -185,6 +185,9 @@ const insertElement = (editor, type, insertPosition) => {
185
185
  _slate.Transforms.setNodes(editor, {
186
186
  type
187
187
  });
188
+ if (_constants.HEADERS.includes(type)) {
189
+ (0, _core.focusEditor)(editor, editor.selection);
190
+ }
188
191
  };
189
192
  exports.insertElement = insertElement;
190
193
  const getNodeEntry = (editor, el) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "2.0.20",
3
+ "version": "2.0.21",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -11,7 +11,7 @@
11
11
  "@seafile/slate-history": "0.86.2",
12
12
  "@seafile/slate-hyperscript": "0.81.7",
13
13
  "@seafile/slate-react": "0.92.8",
14
- "axios": "^1.7.4",
14
+ "axios": "^1.8.2",
15
15
  "classnames": "2.3.2",
16
16
  "copy-to-clipboard": "^3.3.3",
17
17
  "dayjs": "1.10.7",