@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.
Files changed (27) hide show
  1. package/dist/api/sdoc-server-api.js +1 -0
  2. package/dist/basic-sdk/comment/components/comment-context-menu/index.css +16 -0
  3. package/dist/basic-sdk/comment/components/comment-context-menu/index.js +42 -0
  4. package/dist/basic-sdk/comment/components/comment-context-menu/menu-item.js +56 -0
  5. package/dist/basic-sdk/comment/components/comment-editor.js +3 -0
  6. package/dist/basic-sdk/comment/components/comment-list.js +35 -12
  7. package/dist/basic-sdk/comment/components/editor-comment.js +45 -4
  8. package/dist/basic-sdk/comment/components/style.css +4 -0
  9. package/dist/basic-sdk/comment/provider/comment-context-provider.js +1 -0
  10. package/dist/basic-sdk/constants/index.js +2 -1
  11. package/dist/basic-sdk/editor/sdoc-editor.js +4 -1
  12. package/dist/basic-sdk/editor/wiki-editor.js +4 -1
  13. package/dist/basic-sdk/extension/plugins/ai/ai-icon/index.js +2 -2
  14. package/dist/basic-sdk/extension/plugins/link/hover/index.js +1 -1
  15. package/dist/basic-sdk/extension/plugins/search-replace/menu/index.js +2 -2
  16. package/dist/basic-sdk/extension/plugins/search-replace/popover/index.js +1 -1
  17. package/dist/basic-sdk/extension/plugins/seatable-row/dialog/add-seatable-row-dialog/row-card-header.js +1 -1
  18. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/dtable-search-input/index.js +1 -1
  19. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/filter-item.js +1 -1
  20. package/dist/basic-sdk/extension/plugins/table/popover/table-size-popover/index.js +1 -1
  21. package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +2 -1
  22. package/dist/basic-sdk/extension/toolbar/context-toolbar/index.js +1 -1
  23. package/dist/basic-sdk/hooks/use-selection-element-with-offset.js +66 -0
  24. package/dist/basic-sdk/hooks/use-selection-element.js +3 -0
  25. package/dist/basic-sdk/hooks/use-selection-position.js +12 -1
  26. package/dist/components/toast/toaster.js +1 -1
  27. package/package.json +2 -2
@@ -95,6 +95,7 @@ class SDocServerApi {
95
95
  accessToken
96
96
  } = this;
97
97
  const url = `${server}/api/v1/docs/${docUuid}/comment/`;
98
+ console.log(3, comment);
98
99
  return _axios.default.post(url, comment, {
99
100
  headers: {
100
101
  Authorization: `Token ${accessToken}`
@@ -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
- const position = (0, _useSelectionPosition.useCommentListPosition)(activeElement);
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
- const comment = {
64
- comment: content,
65
- detail: {
66
- element_id: elementId,
67
- comment: content
68
- },
69
- author: user.username,
70
- updated_at: time
71
- };
72
- insertComment(elementId, comment);
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: "comment-container-right"
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;
@@ -17,6 +17,10 @@
17
17
  left: 100%;
18
18
  }
19
19
 
20
+ .sdoc-comment-container .comment-container-right.isContextComment {
21
+ /* left: auto !important; */
22
+ }
23
+
20
24
  .sdoc-comment-container .comment-container-right .comment-add-wrapper {
21
25
  position: absolute;
22
26
  left: -22px;
@@ -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
- eventBus.dispatch(_constants.INTERNAL_EVENT.UPDATE_SEARCH_REPLACE_HIGHLIGHT, value);
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 clazznames = (0, _classnames.default)('sdoc-ask-ai-icon', className);
20
+ const classnames = (0, _classnames.default)('sdoc-ask-ai-icon', className);
21
21
  return /*#__PURE__*/_react.default.createElement("img", {
22
- className: clazznames,
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)( /*#__PURE__*/_react.default.createElement("div", {
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( /*#__PURE__*/_react.default.createElement("canvas", {
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)( /*#__PURE__*/_react.default.createElement("div", {
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)( /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
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( /*#__PURE__*/_react.default.createElement(_rowCardHeaderCell.default, {
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 ( /*#__PURE__*/_react.default.isValidElement(ClearIndicator)) {
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( /*#__PURE__*/_react.default.createElement("span", {
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( /*#__PURE__*/_react.default.createElement("div", {
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)( /*#__PURE__*/_react.default.createElement("div", {
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( /*#__PURE__*/_react.default.createElement(_toastManager.default, {
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.46",
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": "1.1.82",
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",