@seafile/sdoc-editor 2.0.46 → 2.0.48-alpha-2.0.0
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/api/sdoc-server-api.js +1 -0
- package/dist/basic-sdk/comment/components/comment-context-menu/index.css +16 -0
- package/dist/basic-sdk/comment/components/comment-context-menu/index.js +42 -0
- package/dist/basic-sdk/comment/components/comment-context-menu/menu-item.js +56 -0
- package/dist/basic-sdk/comment/components/comment-editor.js +3 -0
- package/dist/basic-sdk/comment/components/comment-list.js +35 -12
- package/dist/basic-sdk/comment/components/editor-comment.js +45 -4
- package/dist/basic-sdk/comment/components/style.css +4 -0
- package/dist/basic-sdk/comment/provider/comment-context-provider.js +1 -0
- package/dist/basic-sdk/constants/index.js +2 -1
- package/dist/basic-sdk/editor/sdoc-editor.js +4 -1
- package/dist/basic-sdk/editor/wiki-editor.js +4 -1
- package/dist/basic-sdk/extension/plugins/ai/ai-icon/index.js +2 -2
- package/dist/basic-sdk/extension/plugins/link/hover/index.js +1 -1
- package/dist/basic-sdk/extension/plugins/search-replace/menu/index.js +2 -2
- package/dist/basic-sdk/extension/plugins/search-replace/popover/index.js +1 -1
- package/dist/basic-sdk/extension/plugins/seatable-row/dialog/add-seatable-row-dialog/row-card-header.js +1 -1
- package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/dtable-search-input/index.js +1 -1
- package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/filter-item.js +1 -1
- package/dist/basic-sdk/extension/plugins/table/popover/table-size-popover/index.js +1 -1
- package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +2 -1
- package/dist/basic-sdk/extension/toolbar/context-toolbar/index.js +1 -1
- package/dist/basic-sdk/hooks/use-selection-element-with-offset.js +66 -0
- package/dist/basic-sdk/hooks/use-selection-element.js +3 -0
- package/dist/basic-sdk/hooks/use-selection-position.js +12 -1
- package/dist/components/toast/toaster.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
.menu-group-item.sdoc-comment-menu-container {
|
|
2
|
+
width: 63px;
|
|
3
|
+
color: #212529;
|
|
4
|
+
font-size: 14px;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.sdoc-comment-menu-item .sdoc-comments {
|
|
8
|
+
margin-right: 4px;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.sdoc-context-menu-divider {
|
|
12
|
+
margin-right: 8px;
|
|
13
|
+
border-left: 1px solid #e5e5e5;
|
|
14
|
+
width: 1px;
|
|
15
|
+
height: 24px;
|
|
16
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
+
require("./index.css");
|
|
11
|
+
var _menuItem = _interopRequireDefault(require("./menu-item"));
|
|
12
|
+
var _eventBus = _interopRequireDefault(require("../../../utils/event-bus"));
|
|
13
|
+
var _constants = require("../../../constants");
|
|
14
|
+
// import EventBus from '../../../../utils/event-bus';
|
|
15
|
+
// import { INTERNAL_EVENT } from '../../../../constants';
|
|
16
|
+
// import { ELEMENT_TYPE } from '../../../constants';
|
|
17
|
+
|
|
18
|
+
const CommentContextMenu = _ref => {
|
|
19
|
+
let {
|
|
20
|
+
isRichEditor
|
|
21
|
+
} = _ref;
|
|
22
|
+
const onCommentClick = (0, _react.useCallback)(event => {
|
|
23
|
+
const eventBus = _eventBus.default.getInstance();
|
|
24
|
+
eventBus.dispatch(_constants.INTERNAL_EVENT.ADD_CONTEXT_COMMENT);
|
|
25
|
+
}, []);
|
|
26
|
+
const commentProps = {
|
|
27
|
+
id: 'context-toolbar-comment',
|
|
28
|
+
isRichEditor,
|
|
29
|
+
className: 'menu-group-item sdoc-comment-menu-container',
|
|
30
|
+
disabled: false,
|
|
31
|
+
isActive: false,
|
|
32
|
+
onMouseDown: onCommentClick,
|
|
33
|
+
iconClass: 'sdocfont sdoc-comments',
|
|
34
|
+
text: 'Comment',
|
|
35
|
+
ariaLabel: 'Add_Comment',
|
|
36
|
+
type: 'sdoc-add-comment'
|
|
37
|
+
};
|
|
38
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
39
|
+
className: "sdoc-context-menu-divider"
|
|
40
|
+
}), /*#__PURE__*/_react.default.createElement(_menuItem.default, commentProps));
|
|
41
|
+
};
|
|
42
|
+
var _default = exports.default = CommentContextMenu;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
9
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _reactI18next = require("react-i18next");
|
|
11
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
12
|
+
// import Tooltip from '../../../../../components/tooltip';
|
|
13
|
+
|
|
14
|
+
const MenuItem = _ref => {
|
|
15
|
+
let {
|
|
16
|
+
isRichEditor = true,
|
|
17
|
+
className = 'menu-group-item',
|
|
18
|
+
disabled,
|
|
19
|
+
isActive,
|
|
20
|
+
type,
|
|
21
|
+
onMouseDown,
|
|
22
|
+
id,
|
|
23
|
+
text,
|
|
24
|
+
ariaLabel,
|
|
25
|
+
iconClass
|
|
26
|
+
} = _ref;
|
|
27
|
+
const {
|
|
28
|
+
t
|
|
29
|
+
} = (0, _reactI18next.useTranslation)('sdoc-editor');
|
|
30
|
+
const onClick = (0, _react.useCallback)(event => {
|
|
31
|
+
if (disabled) return;
|
|
32
|
+
onMouseDown(event, type);
|
|
33
|
+
|
|
34
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
35
|
+
}, [disabled, type]);
|
|
36
|
+
const validClassName = (0, _classnames.default)('', className, {
|
|
37
|
+
'btn btn-icon btn-secondary btn-active': !isRichEditor,
|
|
38
|
+
'rich-icon-btn': isRichEditor,
|
|
39
|
+
'rich-icon-btn-disabled': isRichEditor && disabled,
|
|
40
|
+
'rich-icon-btn-hover': isRichEditor && !disabled
|
|
41
|
+
});
|
|
42
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("button", {
|
|
43
|
+
id: id,
|
|
44
|
+
type: "button",
|
|
45
|
+
"aria-label": ariaLabel,
|
|
46
|
+
className: validClassName,
|
|
47
|
+
disabled: disabled,
|
|
48
|
+
"data-active": isActive,
|
|
49
|
+
onClick: onClick
|
|
50
|
+
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
51
|
+
className: "sdoc-comment-menu-item"
|
|
52
|
+
}, /*#__PURE__*/_react.default.createElement("span", {
|
|
53
|
+
className: iconClass
|
|
54
|
+
}), /*#__PURE__*/_react.default.createElement("span", null, t(text)))));
|
|
55
|
+
};
|
|
56
|
+
var _default = exports.default = MenuItem;
|
|
@@ -75,12 +75,15 @@ const CommentEditor = _ref => {
|
|
|
75
75
|
}, [document]);
|
|
76
76
|
const updateValue = (0, _react.useCallback)(value => {
|
|
77
77
|
if (!value || value.trim() === '') return;
|
|
78
|
+
console.log(0, content, editor);
|
|
78
79
|
if (!content) return insertContent(value);
|
|
79
80
|
updateContent && updateContent(value);
|
|
80
81
|
}, [content, insertContent, updateContent]);
|
|
81
82
|
const onSubmit = (0, _react.useCallback)(event => {
|
|
83
|
+
console.log(66);
|
|
82
84
|
event && event.stopPropagation();
|
|
83
85
|
const mdString = (0, _slateToMd.default)(editor.children);
|
|
86
|
+
console.log(2, mdString);
|
|
84
87
|
updateValue(mdString);
|
|
85
88
|
addParticipants(userInfo.username);
|
|
86
89
|
editor.children = [(0, _core.generateEmptyElement)(_constants.PARAGRAPH, {
|
|
@@ -21,11 +21,14 @@ const CommentList = _ref => {
|
|
|
21
21
|
activeElement,
|
|
22
22
|
commentDetail = {},
|
|
23
23
|
onSetCommentDetail,
|
|
24
|
+
isContextComment = false,
|
|
25
|
+
selectedContext,
|
|
24
26
|
t
|
|
25
27
|
} = _ref;
|
|
26
28
|
const commentPopover = (0, _react.useRef)(null);
|
|
27
29
|
const commentDetailRef = (0, _react.useRef)(null);
|
|
28
|
-
|
|
30
|
+
console.log(1, isContextComment);
|
|
31
|
+
const position = (0, _useSelectionPosition.useCommentListPosition)(activeElement, isContextComment, selectedContext);
|
|
29
32
|
const {
|
|
30
33
|
dispatch
|
|
31
34
|
} = (0, _useCommentContext.useCommentContext)();
|
|
@@ -36,6 +39,7 @@ const CommentList = _ref => {
|
|
|
36
39
|
const isCollapseCommentEditor = !isEmptyComment && !showEditor;
|
|
37
40
|
const insertComment = (0, _react.useCallback)(async (elementId, comment) => {
|
|
38
41
|
const res = await _context.default.insertComment(comment);
|
|
42
|
+
console.log(2, res);
|
|
39
43
|
const {
|
|
40
44
|
comment: returnComment
|
|
41
45
|
} = res.data;
|
|
@@ -58,18 +62,34 @@ const CommentList = _ref => {
|
|
|
58
62
|
}, [dispatch, onSetCommentDetail]);
|
|
59
63
|
const addNewComment = (0, _react.useCallback)(content => {
|
|
60
64
|
const user = _context.default.getUserInfo();
|
|
61
|
-
const elementId = activeElement === null || activeElement === void 0 ? void 0 : activeElement.id;
|
|
62
65
|
const time = (0, _dayjs.default)().format('YYYY-MM-DD HH:mm:ss');
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
comment: content
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
66
|
+
let comment = {};
|
|
67
|
+
if (isContextComment) {
|
|
68
|
+
var _activeElement$;
|
|
69
|
+
comment = {
|
|
70
|
+
comment: content,
|
|
71
|
+
detail: {
|
|
72
|
+
elements: activeElement,
|
|
73
|
+
comment: content
|
|
74
|
+
},
|
|
75
|
+
author: user.username,
|
|
76
|
+
updated_at: time
|
|
77
|
+
};
|
|
78
|
+
console.log(3, activeElement);
|
|
79
|
+
insertComment((_activeElement$ = activeElement[0]) === null || _activeElement$ === void 0 ? void 0 : _activeElement$.element.id, comment);
|
|
80
|
+
} else {
|
|
81
|
+
const elementId = activeElement === null || activeElement === void 0 ? void 0 : activeElement.id;
|
|
82
|
+
comment = {
|
|
83
|
+
comment: content,
|
|
84
|
+
detail: {
|
|
85
|
+
element_id: elementId,
|
|
86
|
+
comment: content
|
|
87
|
+
},
|
|
88
|
+
author: user.username,
|
|
89
|
+
updated_at: time
|
|
90
|
+
};
|
|
91
|
+
insertComment(elementId, comment);
|
|
92
|
+
}
|
|
73
93
|
}, [insertComment, activeElement === null || activeElement === void 0 ? void 0 : activeElement.id]);
|
|
74
94
|
const replyComment = (0, _react.useCallback)(content => {
|
|
75
95
|
if (commentDetailRef !== null && commentDetailRef !== void 0 && commentDetailRef.current) {
|
|
@@ -101,6 +121,9 @@ const CommentList = _ref => {
|
|
|
101
121
|
className: "sdoc-comment-list-container sdoc-comment-list-container-popover",
|
|
102
122
|
style: {
|
|
103
123
|
top: position.y,
|
|
124
|
+
...(isContextComment ? {
|
|
125
|
+
right: position.right
|
|
126
|
+
} : {}),
|
|
104
127
|
width: '300px',
|
|
105
128
|
transform: `translateY(${translateY}px)`
|
|
106
129
|
}
|
|
@@ -17,11 +17,15 @@ var _elementsCommentCount = _interopRequireDefault(require("./elements-comment-c
|
|
|
17
17
|
var _index = require("../utils/index");
|
|
18
18
|
var _constants = require("../../extension/constants");
|
|
19
19
|
var _constants2 = require("../../constants");
|
|
20
|
+
var _eventBus = _interopRequireDefault(require("../../utils/event-bus"));
|
|
21
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
22
|
+
var _useSelectionElementWithOffset = require("../../hooks/use-selection-element-with-offset");
|
|
20
23
|
const EditorComment = _ref => {
|
|
21
24
|
let {
|
|
22
25
|
editor
|
|
23
26
|
} = _ref;
|
|
24
27
|
(0, _useSelectionUpdate.default)();
|
|
28
|
+
console.log(1, editor.selection);
|
|
25
29
|
const {
|
|
26
30
|
element_comments_map
|
|
27
31
|
} = (0, _useCommentContext.useCommentContext)().commentsInfo;
|
|
@@ -31,8 +35,11 @@ const EditorComment = _ref => {
|
|
|
31
35
|
const [activeElement, setActiveElement] = (0, _react.useState)(null); // The slate node currently activated by clicking
|
|
32
36
|
const [isShowComments, setIsShowComments] = (0, _react.useState)(false);
|
|
33
37
|
const [commentDetail, setCommentDetail] = (0, _react.useState)({});
|
|
38
|
+
const [isContextComment, setIsContextComment] = (0, _react.useState)(false);
|
|
39
|
+
const [selectedContext, setSelectedContext] = (0, _react.useState)({});
|
|
34
40
|
const onAddCommentToggle = (0, _react.useCallback)(event => {
|
|
35
|
-
event.stopPropagation();
|
|
41
|
+
if (event) event.stopPropagation();
|
|
42
|
+
console.log(3, currentSelectionElement);
|
|
36
43
|
let activeElement = currentSelectionElement;
|
|
37
44
|
// Add comments to image elements in the image block
|
|
38
45
|
if (currentSelectionElement.type === _constants.ELEMENT_TYPE.IMAGE_BLOCK) {
|
|
@@ -41,6 +48,7 @@ const EditorComment = _ref => {
|
|
|
41
48
|
setActiveElement(activeElement);
|
|
42
49
|
setIsShowComments(true);
|
|
43
50
|
setCommentDetail({});
|
|
51
|
+
console.log(2, activeElement);
|
|
44
52
|
}, [currentSelectionElement]);
|
|
45
53
|
const onSelectElement = (0, _react.useCallback)(elementId => {
|
|
46
54
|
const activeElement = (0, _index.getCommentElementById)(elementId, editor);
|
|
@@ -55,6 +63,7 @@ const EditorComment = _ref => {
|
|
|
55
63
|
const hiddenComment = (0, _react.useCallback)(() => {
|
|
56
64
|
setCommentDetail({});
|
|
57
65
|
setIsShowComments(false);
|
|
66
|
+
setIsContextComment(false);
|
|
58
67
|
}, []);
|
|
59
68
|
|
|
60
69
|
// Comments are updated to modify the current comment
|
|
@@ -68,12 +77,40 @@ const EditorComment = _ref => {
|
|
|
68
77
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
69
78
|
}, [element_comments_map]);
|
|
70
79
|
(0, _react.useEffect)(() => {
|
|
80
|
+
console.log(1, selectedContext);
|
|
71
81
|
// Close when the currently selected element changes
|
|
72
82
|
if (isShowComments) {
|
|
73
83
|
hiddenComment();
|
|
74
84
|
}
|
|
75
85
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
76
|
-
}, [currentSelectionElement]);
|
|
86
|
+
}, [currentSelectionElement, editor.selection]);
|
|
87
|
+
const handleAddContextComment = () => {
|
|
88
|
+
console.log(4, editor.selection);
|
|
89
|
+
// const selectedContext
|
|
90
|
+
const content = window.getSelection().toString();
|
|
91
|
+
console.log(3, content);
|
|
92
|
+
// selectedContext
|
|
93
|
+
const domSelection = window.getSelection();
|
|
94
|
+
setSelectedContext(domSelection);
|
|
95
|
+
let activeElement = (0, _useSelectionElementWithOffset.getSelectedElemsWithOffsets)(editor);
|
|
96
|
+
// // Add comments to image elements in the image block
|
|
97
|
+
// if (currentSelectionElement.type === ELEMENT_TYPE.IMAGE_BLOCK) {
|
|
98
|
+
// activeElement = currentSelectionElement.children.find(item => item?.type === ELEMENT_TYPE.IMAGE);
|
|
99
|
+
// }
|
|
100
|
+
console.log(29, activeElement);
|
|
101
|
+
setActiveElement(activeElement);
|
|
102
|
+
setIsShowComments(true);
|
|
103
|
+
setCommentDetail({});
|
|
104
|
+
setIsContextComment(true);
|
|
105
|
+
console.log(2, activeElement);
|
|
106
|
+
};
|
|
107
|
+
(0, _react.useEffect)(() => {
|
|
108
|
+
const eventBus = _eventBus.default.getInstance();
|
|
109
|
+
const unsubscribeAddContextComment = eventBus.subscribe(_constants2.INTERNAL_EVENT.ADD_CONTEXT_COMMENT, handleAddContextComment);
|
|
110
|
+
return () => {
|
|
111
|
+
unsubscribeAddContextComment();
|
|
112
|
+
};
|
|
113
|
+
}, []);
|
|
77
114
|
const cursor = (0, _helper.useCursorPosition)();
|
|
78
115
|
const style = (0, _react.useMemo)(() => {
|
|
79
116
|
var _Node$string;
|
|
@@ -101,7 +138,9 @@ const EditorComment = _ref => {
|
|
|
101
138
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
102
139
|
className: "comment-container-main"
|
|
103
140
|
}), /*#__PURE__*/_react.default.createElement("div", {
|
|
104
|
-
className:
|
|
141
|
+
className: (0, _classnames.default)('comment-container-right', {
|
|
142
|
+
'isContextComment': isContextComment
|
|
143
|
+
})
|
|
105
144
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
106
145
|
className: "comment-add-wrapper",
|
|
107
146
|
style: style
|
|
@@ -118,7 +157,9 @@ const EditorComment = _ref => {
|
|
|
118
157
|
}), isShowComments && /*#__PURE__*/_react.default.createElement(_commentList.default, {
|
|
119
158
|
activeElement: activeElement,
|
|
120
159
|
commentDetail: commentDetail,
|
|
121
|
-
onSetCommentDetail: onSetCommentDetail
|
|
160
|
+
onSetCommentDetail: onSetCommentDetail,
|
|
161
|
+
isContextComment: isContextComment,
|
|
162
|
+
selectedContext: selectedContext
|
|
122
163
|
})));
|
|
123
164
|
};
|
|
124
165
|
var _default = exports.default = EditorComment;
|
|
@@ -20,6 +20,7 @@ const CommentContextProvider = _ref => {
|
|
|
20
20
|
const [commentsInfo, dispatch] = (0, _react.useReducer)(_commentReducer.commentReducer, _commentReducer.initCommentsInfo);
|
|
21
21
|
(0, _useCommentMount.useCommentsMount)(dispatch);
|
|
22
22
|
(0, _react.useEffect)(() => {
|
|
23
|
+
console.log(1, commentsInfo);
|
|
23
24
|
if (Object.keys(commentsInfo.element_comments_map).length) {
|
|
24
25
|
editor.element_comments_map = commentsInfo.element_comments_map;
|
|
25
26
|
const eventBus = _eventBus.default.getInstance();
|
|
@@ -49,7 +49,8 @@ const INTERNAL_EVENT = exports.INTERNAL_EVENT = {
|
|
|
49
49
|
RESIZE_ARTICLE: 'resize_article',
|
|
50
50
|
ON_VIDEO_FILES_UPLOADED: 'on_video_files_uploaded',
|
|
51
51
|
RELOAD_COMMENT: 'reload_comment',
|
|
52
|
-
ASK_AI: 'ask_ai'
|
|
52
|
+
ASK_AI: 'ask_ai',
|
|
53
|
+
ADD_CONTEXT_COMMENT: 'add_context_comment'
|
|
53
54
|
};
|
|
54
55
|
const REVISION_DIFF_KEY = exports.REVISION_DIFF_KEY = 'diff';
|
|
55
56
|
const REVISION_DIFF_VALUE = exports.REVISION_DIFF_VALUE = '1';
|
|
@@ -153,8 +153,11 @@ const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
|
|
|
153
153
|
}), [document, validEditor, slateValue]);
|
|
154
154
|
const onValueChange = value => {
|
|
155
155
|
const eventBus = _basicSdk.EventBus.getInstance();
|
|
156
|
-
eventBus.dispatch(_constants.INTERNAL_EVENT.UPDATE_SEARCH_REPLACE_HIGHLIGHT, value);
|
|
157
156
|
setSlateValue(value);
|
|
157
|
+
// After the content is updated, update the search content
|
|
158
|
+
setTimeout(() => {
|
|
159
|
+
eventBus.dispatch(_constants.INTERNAL_EVENT.UPDATE_SEARCH_REPLACE_HIGHLIGHT, value);
|
|
160
|
+
}, 0);
|
|
158
161
|
if (_utils.isMobile) {
|
|
159
162
|
(0, _outlineModule.updateOutlineValue)(value);
|
|
160
163
|
}
|
|
@@ -135,7 +135,10 @@ const WikiEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
|
|
|
135
135
|
}), [document, validEditor, slateValue]);
|
|
136
136
|
const onValueChange = value => {
|
|
137
137
|
const eventBus = _basicSdk.EventBus.getInstance();
|
|
138
|
-
|
|
138
|
+
// After the content is updated, update the search content
|
|
139
|
+
setTimeout(() => {
|
|
140
|
+
eventBus.dispatch(_constants.INTERNAL_EVENT.UPDATE_SEARCH_REPLACE_HIGHLIGHT, value);
|
|
141
|
+
}, 0);
|
|
139
142
|
setSlateValue(value);
|
|
140
143
|
};
|
|
141
144
|
if (isReloading) {
|
|
@@ -17,9 +17,9 @@ function AIIcon(_ref) {
|
|
|
17
17
|
const {
|
|
18
18
|
t
|
|
19
19
|
} = (0, _reactI18next.useTranslation)('sdoc-editor');
|
|
20
|
-
const
|
|
20
|
+
const classnames = (0, _classnames.default)('sdoc-ask-ai-icon', className);
|
|
21
21
|
return /*#__PURE__*/_react.default.createElement("img", {
|
|
22
|
-
className:
|
|
22
|
+
className: classnames,
|
|
23
23
|
src: _sdocAskAi.default,
|
|
24
24
|
alt: t('Ask_AI')
|
|
25
25
|
});
|
|
@@ -32,7 +32,7 @@ const LinkHover = _ref => {
|
|
|
32
32
|
location.href = element.href;
|
|
33
33
|
}
|
|
34
34
|
}, [element.href]);
|
|
35
|
-
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/(0, _reactDom.createPortal)(
|
|
35
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/(0, _reactDom.createPortal)(/*#__PURE__*/_react.default.createElement("div", {
|
|
36
36
|
id: "link-op-menu",
|
|
37
37
|
className: "link-op-menu",
|
|
38
38
|
style: menuPosition
|
|
@@ -54,7 +54,7 @@ const SearchReplaceMenu = _ref => {
|
|
|
54
54
|
const canvasList = [];
|
|
55
55
|
for (let index = 0; index < generateCount; index++) {
|
|
56
56
|
const top = index * 5000;
|
|
57
|
-
canvasList.push(
|
|
57
|
+
canvasList.push(/*#__PURE__*/_react.default.createElement("canvas", {
|
|
58
58
|
key: 'sdoc-find-search-' + index,
|
|
59
59
|
id: `sdoc-find-search-${index}`,
|
|
60
60
|
className: "sdoc-find-search-highlight-canvas",
|
|
@@ -79,7 +79,7 @@ const SearchReplaceMenu = _ref => {
|
|
|
79
79
|
readonly: readonly,
|
|
80
80
|
isOpen: isOpenPopover,
|
|
81
81
|
closePopover: onMouseDown
|
|
82
|
-
}), isOpenPopover && /*#__PURE__*/(0, _reactDom.createPortal)(
|
|
82
|
+
}), isOpenPopover && /*#__PURE__*/(0, _reactDom.createPortal)(/*#__PURE__*/_react.default.createElement("div", {
|
|
83
83
|
style: {
|
|
84
84
|
height: articleContainerSize.clientHeight
|
|
85
85
|
},
|
|
@@ -168,7 +168,7 @@ const SearchReplacePopover = _ref => {
|
|
|
168
168
|
if ((0, _isHotkey.default)('enter', e)) handleNext();
|
|
169
169
|
if ((0, _isHotkey.default)('enter+shift', e)) handleLast();
|
|
170
170
|
};
|
|
171
|
-
return /*#__PURE__*/(0, _reactDom.createPortal)(
|
|
171
|
+
return /*#__PURE__*/(0, _reactDom.createPortal)(/*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
|
|
172
172
|
className: "sdoc-search-replace-popover-container",
|
|
173
173
|
onMouseDown: handleStartMove,
|
|
174
174
|
onMouseMove: handleMouseMove,
|
|
@@ -78,7 +78,7 @@ class RowCardHeader extends _react.default.Component {
|
|
|
78
78
|
// Start from the second column without name
|
|
79
79
|
for (let i = 1; i < renderedColumns.length; i++) {
|
|
80
80
|
const renderedColumn = renderedColumns[i];
|
|
81
|
-
cardHeaderCells.push(
|
|
81
|
+
cardHeaderCells.push(/*#__PURE__*/_react.default.createElement(_rowCardHeaderCell.default, {
|
|
82
82
|
key: renderedColumn.key,
|
|
83
83
|
column: renderedColumn,
|
|
84
84
|
rowCardType: rowCardType,
|
|
@@ -70,7 +70,7 @@ class DtableSearchInput extends _react.Component {
|
|
|
70
70
|
const {
|
|
71
71
|
ClearIndicator
|
|
72
72
|
} = components;
|
|
73
|
-
if (
|
|
73
|
+
if (/*#__PURE__*/_react.default.isValidElement(ClearIndicator)) {
|
|
74
74
|
return /*#__PURE__*/_react.default.cloneElement(ClearIndicator, {
|
|
75
75
|
clearValue: this.clearSearch
|
|
76
76
|
});
|
|
@@ -310,7 +310,7 @@ class FilterItem extends _react.default.Component {
|
|
|
310
310
|
background: inOption.color,
|
|
311
311
|
color: inOption.textColor || null
|
|
312
312
|
};
|
|
313
|
-
labelArray.push(
|
|
313
|
+
labelArray.push(/*#__PURE__*/_react.default.createElement("span", {
|
|
314
314
|
className: className,
|
|
315
315
|
style: optionStyle,
|
|
316
316
|
key: 'option_' + item,
|
|
@@ -205,7 +205,7 @@ const TableSizePopover = _ref => {
|
|
|
205
205
|
});
|
|
206
206
|
children.push(child);
|
|
207
207
|
}
|
|
208
|
-
tableSize.push(
|
|
208
|
+
tableSize.push(/*#__PURE__*/_react.default.createElement("div", {
|
|
209
209
|
key: `sdoc-table-size-row-${i}`,
|
|
210
210
|
className: "sdoc-table-size-row d-flex"
|
|
211
211
|
}, children));
|
|
@@ -22,6 +22,7 @@ var _useColorContext = require("../../../../hooks/use-color-context");
|
|
|
22
22
|
var _constants = require("../../../constants");
|
|
23
23
|
var _constants2 = require("../../../../../basic-sdk/constants");
|
|
24
24
|
var _context = _interopRequireDefault(require("../../../../../context"));
|
|
25
|
+
var _commentContextMenu = _interopRequireDefault(require("../../../../comment/components/comment-context-menu"));
|
|
25
26
|
const TextStyleMenuList = _ref => {
|
|
26
27
|
let {
|
|
27
28
|
editor,
|
|
@@ -154,7 +155,7 @@ const TextStyleMenuList = _ref => {
|
|
|
154
155
|
tipMessage: t('Reduce_font_size')
|
|
155
156
|
}, /*#__PURE__*/_react.default.createElement("i", {
|
|
156
157
|
className: "sdocfont sdoc-reduce-font-size"
|
|
157
|
-
}))), idPrefix && enableSeafileAI && /*#__PURE__*/_react.default.createElement(_aiMenu.AIContextMenu, {
|
|
158
|
+
}))), idPrefix && /*#__PURE__*/_react.default.createElement(_commentContextMenu.default, null), idPrefix && enableSeafileAI && /*#__PURE__*/_react.default.createElement(_aiMenu.AIContextMenu, {
|
|
158
159
|
isRichEditor: isRichEditor
|
|
159
160
|
}));
|
|
160
161
|
};
|
|
@@ -62,7 +62,7 @@ const ContextToolbar = () => {
|
|
|
62
62
|
el.removeAttribute('style');
|
|
63
63
|
}
|
|
64
64
|
}, []);
|
|
65
|
-
return /*#__PURE__*/(0, _reactDom.createPortal)(
|
|
65
|
+
return /*#__PURE__*/(0, _reactDom.createPortal)(/*#__PURE__*/_react.default.createElement("div", {
|
|
66
66
|
ref: ref,
|
|
67
67
|
className: "sdoc-context-toolbar",
|
|
68
68
|
onMouseDown: onMouseDown,
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getSelectedElemsWithOffsets = void 0;
|
|
7
|
+
var _slate = require("@seafile/slate");
|
|
8
|
+
const getSelectedElemsWithOffsets = editor => {
|
|
9
|
+
const {
|
|
10
|
+
selection
|
|
11
|
+
} = editor;
|
|
12
|
+
const selectedElems = [];
|
|
13
|
+
const nodeEntries = Array.from(_slate.Editor.nodes(editor, {
|
|
14
|
+
match: n => _slate.Element.isElement(n) && _slate.Editor.isBlock(editor, n),
|
|
15
|
+
mode: 'lowest'
|
|
16
|
+
}));
|
|
17
|
+
const isSelectionForward = _slate.Point.compare(editor.selection.anchor, editor.selection.focus) === -1;
|
|
18
|
+
for (let index = 0; index < nodeEntries.length; index++) {
|
|
19
|
+
const [node] = nodeEntries[index];
|
|
20
|
+
console.log(99, node);
|
|
21
|
+
let startOffset = 0;
|
|
22
|
+
let endOffset = 0;
|
|
23
|
+
if (isSelectionForward) {
|
|
24
|
+
startOffset = selection.anchor.offset;
|
|
25
|
+
endOffset = selection.focus.offset;
|
|
26
|
+
} else {
|
|
27
|
+
startOffset = selection.focus.offset;
|
|
28
|
+
endOffset = selection.anchor.offset;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Selection in only one element
|
|
32
|
+
if (nodeEntries.length === 1) {
|
|
33
|
+
selectedElems.push({
|
|
34
|
+
element: node,
|
|
35
|
+
startOffset,
|
|
36
|
+
endOffset
|
|
37
|
+
});
|
|
38
|
+
return selectedElems;
|
|
39
|
+
}
|
|
40
|
+
if (index === 0) {
|
|
41
|
+
endOffset = node.children[0].text.length - startOffset;
|
|
42
|
+
selectedElems.push({
|
|
43
|
+
element: node,
|
|
44
|
+
startOffset,
|
|
45
|
+
endOffset
|
|
46
|
+
});
|
|
47
|
+
} else if (index === nodeEntries.length - 1) {
|
|
48
|
+
startOffset = 0;
|
|
49
|
+
selectedElems.push({
|
|
50
|
+
element: node,
|
|
51
|
+
startOffset,
|
|
52
|
+
endOffset
|
|
53
|
+
});
|
|
54
|
+
} else {
|
|
55
|
+
startOffset = 0;
|
|
56
|
+
endOffset = node.children[0].text.length;
|
|
57
|
+
selectedElems.push({
|
|
58
|
+
element: node,
|
|
59
|
+
startOffset,
|
|
60
|
+
endOffset
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return selectedElems;
|
|
65
|
+
};
|
|
66
|
+
exports.getSelectedElemsWithOffsets = getSelectedElemsWithOffsets;
|
|
@@ -6,10 +6,12 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.useSelectionElement = void 0;
|
|
7
7
|
var _slate = require("@seafile/slate");
|
|
8
8
|
var _react = require("react");
|
|
9
|
+
var _core = require("../extension/core");
|
|
9
10
|
const useSelectionElement = _ref => {
|
|
10
11
|
let {
|
|
11
12
|
editor
|
|
12
13
|
} = _ref;
|
|
14
|
+
// console.log(2, editor.selection, getSelectedElems(editor));
|
|
13
15
|
const nodeEntry = (0, _react.useMemo)(() => {
|
|
14
16
|
const nodeEntry = _slate.Editor.above(editor, {
|
|
15
17
|
mode: 'lowest',
|
|
@@ -18,6 +20,7 @@ const useSelectionElement = _ref => {
|
|
|
18
20
|
return nodeEntry;
|
|
19
21
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
20
22
|
}, [editor.selection]);
|
|
23
|
+
// console.log(1, nodeEntry);
|
|
21
24
|
if (nodeEntry && nodeEntry[0]) {
|
|
22
25
|
return nodeEntry[0];
|
|
23
26
|
}
|
|
@@ -29,13 +29,24 @@ const useSelectionPosition = node => {
|
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
31
|
exports.useSelectionPosition = useSelectionPosition;
|
|
32
|
-
const useCommentListPosition = selectionElement => {
|
|
32
|
+
const useCommentListPosition = (selectionElement, isContextComment, selectedContext) => {
|
|
33
33
|
const selectionPosition = useSelectionPosition(selectionElement);
|
|
34
34
|
const headerHeight = 100;
|
|
35
35
|
const scrollRef = (0, _useScrollContext.useScrollContext)();
|
|
36
36
|
const {
|
|
37
37
|
scrollTop = 0
|
|
38
38
|
} = scrollRef.current || {};
|
|
39
|
+
if (isContextComment) {
|
|
40
|
+
const domRange = selectedContext.getRangeAt(0);
|
|
41
|
+
const rect = domRange.getBoundingClientRect();
|
|
42
|
+
const editorArticleRight = document.getElementById('sdoc-editor-print-wrapper').getBoundingClientRect().right;
|
|
43
|
+
rect.y = rect.bottom - headerHeight + 15;
|
|
44
|
+
const rightPara = editorArticleRight - rect.left - 300; // 300 is comment container's width
|
|
45
|
+
return {
|
|
46
|
+
right: rightPara,
|
|
47
|
+
y: rect.y
|
|
48
|
+
};
|
|
49
|
+
}
|
|
39
50
|
if (selectionPosition.y !== 0) {
|
|
40
51
|
selectionPosition.y = selectionPosition.y - headerHeight + scrollTop;
|
|
41
52
|
}
|
|
@@ -67,7 +67,7 @@ class Toaster {
|
|
|
67
67
|
container.setAttribute('data-evergreen-toaster-container', '');
|
|
68
68
|
document.body.appendChild(container);
|
|
69
69
|
const root = (0, _client.createRoot)(container);
|
|
70
|
-
root.render(
|
|
70
|
+
root.render(/*#__PURE__*/_react.default.createElement(_toastManager.default, {
|
|
71
71
|
bindNotify: this._bindNotify,
|
|
72
72
|
bindGetToasts: this._bindGetToasts,
|
|
73
73
|
bindCloseAll: this._bindCloseAll
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.48-alpha-2.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "This is a sdoc editor",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"remark-parse": "11.0.0",
|
|
40
40
|
"remark-rehype": "11.0.0",
|
|
41
41
|
"remark-stringify": "11.0.0",
|
|
42
|
-
"sea-chart": "
|
|
42
|
+
"sea-chart": "2.0.9",
|
|
43
43
|
"slugid": "3.2.0",
|
|
44
44
|
"socket.io-client": "4.8.1",
|
|
45
45
|
"type-of": "2.0.1",
|