@seafile/sdoc-editor 2.0.20 → 2.0.22
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.
- package/dist/basic-sdk/comment/components/comment-all-participants/index.js +4 -1
- package/dist/basic-sdk/comment/components/comment-participants-editor/index.js +4 -3
- package/dist/basic-sdk/comment/utils/index.js +9 -1
- package/dist/basic-sdk/extension/plugins/check-list/helpers.js +8 -0
- package/dist/basic-sdk/extension/plugins/list/transforms/toggle-list.js +9 -1
- package/dist/basic-sdk/extension/plugins/markdown/plugin.js +1 -1
- package/dist/basic-sdk/extension/plugins/mention/helper.js +19 -2
- package/dist/basic-sdk/extension/plugins/mention/plugin.js +14 -10
- package/dist/basic-sdk/extension/plugins/mention/render-elem/participant-popover.js +3 -3
- package/dist/basic-sdk/extension/toolbar/insert-element-toolbar/index.js +9 -2
- package/dist/basic-sdk/extension/toolbar/side-toolbar/helpers.js +3 -0
- package/package.json +3 -3
|
@@ -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 === '@'
|
|
31
|
-
(0, _helper.
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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.
|
|
3
|
+
"version": "2.0.22",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "This is a sdoc editor",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -11,12 +11,12 @@
|
|
|
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.
|
|
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",
|
|
18
18
|
"deep-copy": "1.4.2",
|
|
19
|
-
"dtable-ui-component": "^6.0.
|
|
19
|
+
"dtable-ui-component": "^6.0.3",
|
|
20
20
|
"is-hotkey": "0.2.0",
|
|
21
21
|
"is-url": "^1.2.4",
|
|
22
22
|
"lodash.isequal": "4.5.0",
|