@seafile/sdoc-editor 1.0.67 → 1.0.68

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.
@@ -1,11 +1,6 @@
1
1
  .sdoc-comment-drawer {
2
- position: relative;
3
- width: 360px;
4
- min-width: 360px;
5
- max-width: 620px;
6
- border-left: 1px solid #e2e3e6;
7
- /* Prevent the image menu from still appearing above the comment drawer when scrolled hidden. */
8
- z-index: 102;
2
+ width: 100%;
3
+ height: 100%;
9
4
  }
10
5
 
11
6
  .sdoc-comment-drawer .comments-panel-wrapper {
@@ -20,96 +20,34 @@ var _globalCommentEditor = _interopRequireDefault(require("./global-comment-edit
20
20
  var _constants2 = require("../../../constants");
21
21
  var _core = require("../../../extension/core");
22
22
  require("./index.css");
23
+ var _hooks = require("../../../../hooks");
23
24
  const GlobalComment = _ref => {
24
25
  let {
25
26
  deleteUnseenNotifications,
26
27
  editor
27
28
  } = _ref;
28
29
  const [activeComment, setActiveComment] = (0, _react.useState)(null);
29
- const [isShowCommentList, setShowCommentList] = (0, _react.useState)(false);
30
30
  const [showEditor, setShowEditor] = (0, _react.useState)(false);
31
- const [draggerStyle, setDraggerStyle] = (0, _react.useState)({});
32
31
  const [isScrollDisplayed, setIsScrollDisplayed] = (0, _react.useState)(false);
33
32
  const commentRef = (0, _react.useRef)(null);
34
33
  const contentRef = (0, _react.useRef)(null);
35
- const commentDrawerRef = (0, _react.useRef)(null);
36
- const isResizingRef = (0, _react.useRef)(false);
37
- const commentResizeHandler = (0, _react.useRef)(null);
38
34
  const {
39
35
  commentList,
40
36
  commentType,
41
37
  setCommentType
42
38
  } = (0, _useCommentList.default)();
43
- const setArticleContainerStyle = (0, _react.useCallback)(() => {
44
- const eventBus = _eventBus.default.getInstance();
45
- eventBus.dispatch(_constants2.INTERNAL_EVENT.OUTLINE_STATE_CHANGED, {
46
- scrollIntoArticle: true
47
- });
48
- }, []);
49
- (0, _react.useEffect)(() => {
50
- if (isShowCommentList) {
51
- setArticleContainerStyle();
52
- }
53
- }, [isShowCommentList, setArticleContainerStyle]);
54
- const toggle = (0, _react.useCallback)(() => {
55
- if (isShowCommentList) {
56
- setActiveComment(null);
57
- setShowCommentList(false);
58
- setShowEditor(false);
59
- return;
60
- }
61
- setShowCommentList(true);
62
- }, [isShowCommentList]);
63
- const handleHideDragger = (0, _react.useCallback)(event => {
64
- if (isResizingRef.current) return;
65
- setDraggerStyle({
66
- display: 'none'
67
- });
68
- }, []);
69
- const handleResizeEnd = (0, _react.useCallback)(e => {
70
- isResizingRef.current = false;
71
- document.removeEventListener('mouseup', handleResizeEnd);
72
- handleHideDragger();
73
- }, [handleHideDragger]);
39
+ const {
40
+ closePlugin
41
+ } = (0, _hooks.usePlugins)();
74
42
  const detectScroll = (0, _react.useCallback)(() => {
75
43
  if (!contentRef.current) return;
76
44
  const contentContainer = contentRef.current;
77
45
  const isShowScroll = contentContainer.scrollHeight > contentContainer.clientHeight;
78
46
  setIsScrollDisplayed(isShowScroll);
79
47
  }, []);
80
- const handleResizing = (0, _react.useCallback)(e => {
81
- const commentDrawer = commentDrawerRef.current;
82
- if (isResizingRef.current && commentDrawer) {
83
- let width = commentDrawer.offsetWidth - e.movementX;
84
- // Limit the width of the comment drawer
85
- width = Math.min(width, 620);
86
- width = Math.max(width, 360);
87
- commentDrawer.style.width = `${width}px`;
88
- const isShrink = e.movementX > 0;
89
- setArticleContainerStyle({
90
- width,
91
- isShrink
92
- });
93
- detectScroll();
94
- }
95
- }, [detectScroll, setArticleContainerStyle]);
96
- const handleResizeStart = (0, _react.useCallback)(e => {
97
- isResizingRef.current = true;
98
- document.addEventListener('mouseup', handleResizeEnd);
99
- document.addEventListener('mousemove', handleResizing);
100
- }, [handleResizeEnd, handleResizing]);
101
- (0, _react.useEffect)(() => {
102
- const eventBus = _eventBus.default.getInstance();
103
- const unsubscribe = eventBus.subscribe(_constants2.INTERNAL_EVENT.COMMENT_LIST_CLICK, toggle);
104
- return () => {
105
- unsubscribe();
106
- document.removeEventListener('mousemove', handleResizing);
107
- eventBus.dispatch(_constants2.INTERNAL_EVENT.OUTLINE_STATE_CHANGED);
108
- };
109
- }, [handleResizing, toggle]);
110
48
  (0, _react.useEffect)(() => {
111
49
  detectScroll();
112
- }, [commentList, detectScroll, isShowCommentList]);
50
+ }, [commentList, detectScroll]);
113
51
  const updateScrollPosition = (0, _react.useCallback)(() => {
114
52
  const resolvedDom = document.querySelector('.sdoc-resolved');
115
53
  contentRef.current.scrollTo({
@@ -174,44 +112,18 @@ const GlobalComment = _ref => {
174
112
  const hiddenCommentEditor = (0, _react.useCallback)(() => {
175
113
  setShowEditor(false);
176
114
  }, []);
177
- const handleDisplayDragger = (0, _react.useCallback)(event => {
178
- if (isShowCommentList) {
179
- const {
180
- pageY
181
- } = event;
182
- const {
183
- top
184
- } = commentResizeHandler.current.getBoundingClientRect();
185
- // 15 is the half height of the dragger
186
- const topSize = pageY - top - 15;
187
- setDraggerStyle({
188
- top: `${topSize}px`,
189
- display: 'block'
190
- });
191
- }
192
- }, [isShowCommentList]);
193
115
  const isClickCommentPanelBody = (0, _react.useCallback)(event => {
194
116
  if (contentRef.current && contentRef.current.contains(event.target)) return true;
195
117
  return false;
196
118
  }, []);
197
- if (!isShowCommentList) return null;
119
+ console.log(commentList);
198
120
  return /*#__PURE__*/_react.default.createElement("div", {
199
- className: "sdoc-comment-drawer",
200
- ref: commentDrawerRef
201
- }, /*#__PURE__*/_react.default.createElement("div", {
202
- ref: commentResizeHandler,
203
- className: "sdoc-comment-resize-handler",
204
- onMouseDown: handleResizeStart,
205
- onMouseLeave: handleHideDragger,
206
- onMouseMove: handleDisplayDragger
121
+ className: "sdoc-comment-drawer"
207
122
  }, /*#__PURE__*/_react.default.createElement("div", {
208
- style: draggerStyle,
209
- className: "sdoc-comment-move-dragger"
210
- })), /*#__PURE__*/_react.default.createElement("div", {
211
123
  ref: commentRef,
212
124
  className: "comments-panel-wrapper"
213
125
  }, /*#__PURE__*/_react.default.createElement(_globalCommentHeader.default, {
214
- toggle: toggle,
126
+ toggle: closePlugin,
215
127
  toggleGlobalCommentEditor: toggleGlobalCommentEditor
216
128
  }), /*#__PURE__*/_react.default.createElement("div", {
217
129
  className: "comments-panel-body"
@@ -226,6 +138,7 @@ const GlobalComment = _ref => {
226
138
  id: "global-comment-list-container",
227
139
  className: "sdoc-comment-list-container"
228
140
  }, Array.isArray(commentList) && commentList.map(comment => {
141
+ console.log(comment);
229
142
  const elementId = comment.detail.element_id;
230
143
  const element = elementId !== _constants.DOC_COMMENT_ELEMENT_ID ? (0, _core.getNodeById)(editor.children, elementId) : null;
231
144
  const isActive = activeComment && activeComment.id === comment.id;
@@ -13,9 +13,10 @@ const useCommentList = () => {
13
13
  } = (0, _useCommentContext.useCommentContext)();
14
14
  const {
15
15
  comment_list
16
- } = commentsInfo || [];
16
+ } = commentsInfo || {};
17
+ console.log(comment_list);
17
18
  const [commentType, setCommentType] = (0, _react.useState)(_constants.COMMENT_TYPES.ALL);
18
- const [commentList, setCommentList] = (0, _react.useState)([comment_list]);
19
+ const [commentList, setCommentList] = (0, _react.useState)([]);
19
20
  (0, _react.useEffect)(() => {
20
21
  if (commentType === _constants.COMMENT_TYPES.ALL) {
21
22
  setCommentList(comment_list);
@@ -4,9 +4,23 @@ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWild
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.Z_INDEX = exports.WIKI_EDITOR = exports.REVISION_DIFF_VALUE = exports.REVISION_DIFF_KEY = exports.REBASE_TYPES = exports.REBASE_TYPE = exports.REBASE_ORIGIN = exports.REBASE_MARK_KEY = exports.REBASE_MARKS = exports.PAGE_EDIT_AREA_WIDTH = exports.MODIFY_TYPE = exports.INTERNAL_EVENT = exports.DOCUMENT_PLUGIN_EDITOR = exports.DIFF_VIEWER = exports.COMMENT_EDITOR_EDIT_AREA_WIDTH = exports.COMMENT_EDITOR = void 0;
7
+ exports.PAGE_EDIT_AREA_WIDTH = exports.MODIFY_TYPE = exports.INTERNAL_EVENT = exports.DOCUMENT_PLUGIN_EDITOR = exports.DIFF_VIEWER = exports.COMMENT_EDITOR_EDIT_AREA_WIDTH = exports.COMMENT_EDITOR = void 0;
8
+ Object.defineProperty(exports, "PLUGIN_BTN_POSITION", {
9
+ enumerable: true,
10
+ get: function () {
11
+ return _plugin.PLUGIN_BTN_POSITION;
12
+ }
13
+ });
14
+ Object.defineProperty(exports, "PLUGIN_DISPLAY_TYPE", {
15
+ enumerable: true,
16
+ get: function () {
17
+ return _plugin.PLUGIN_DISPLAY_TYPE;
18
+ }
19
+ });
20
+ exports.Z_INDEX = exports.WIKI_EDITOR = exports.REVISION_DIFF_VALUE = exports.REVISION_DIFF_KEY = exports.REBASE_TYPES = exports.REBASE_TYPE = exports.REBASE_ORIGIN = exports.REBASE_MARK_KEY = exports.REBASE_MARKS = void 0;
8
21
  var Z_INDEX = _interopRequireWildcard(require("./z-index"));
9
22
  exports.Z_INDEX = Z_INDEX;
23
+ var _plugin = require("./plugin");
10
24
  const INTERNAL_EVENT = exports.INTERNAL_EVENT = {
11
25
  CANCEL_TABLE_SELECT_RANGE: 'cancel_table_select_range',
12
26
  SET_TABLE_SELECT_RANGE: 'set_table_select_range',
@@ -19,7 +33,6 @@ const INTERNAL_EVENT = exports.INTERNAL_EVENT = {
19
33
  OUTLINE_STATE_CHANGED: 'outline_state_changed',
20
34
  RELOAD_IMAGE: 'reload_image',
21
35
  ARTICLE_CLICK: 'hidden_comment',
22
- COMMENT_LIST_CLICK: 'comment_list_click',
23
36
  UNSEEN_NOTIFICATIONS_COUNT: 'unseen_notifications_count',
24
37
  CLOSE_CALLOUT_COLOR_PICKER: 'close_callout_color_picker',
25
38
  OPEN_SEARCH_REPLACE_MODAL: 'open_search_replace_modal',
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.PLUGIN_DISPLAY_TYPE = exports.PLUGIN_BTN_POSITION = void 0;
7
+ const PLUGIN_DISPLAY_TYPE = exports.PLUGIN_DISPLAY_TYPE = {
8
+ INLAY_RIGHT: 'inlay-right',
9
+ DIALOG: 'dialog'
10
+ };
11
+ const PLUGIN_BTN_POSITION = exports.PLUGIN_BTN_POSITION = {
12
+ MORE_MENU: 'more-menu',
13
+ DEFAULT: 'default'
14
+ };
@@ -22,7 +22,6 @@ var _editableArticle = _interopRequireDefault(require("./editable-article"));
22
22
  var _useColorContext = require("../hooks/use-color-context");
23
23
  var _readonlyArticle = _interopRequireDefault(require("../views/readonly-article"));
24
24
  var _utils = require("../../utils");
25
- var _hooks = require("../../hooks");
26
25
  var _basicSdk = require("../../basic-sdk");
27
26
  var _constants2 = require("../../constants");
28
27
  const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
@@ -32,7 +31,8 @@ const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
32
31
  isReloading,
33
32
  showComment,
34
33
  isShowHeaderToolbar = true,
35
- showOutline = true
34
+ showOutline = true,
35
+ plugins = []
36
36
  } = _ref;
37
37
  const validEditor = (0, _react.useMemo)(() => {
38
38
  if (propsEditor) return propsEditor;
@@ -158,7 +158,7 @@ const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
158
158
  return /*#__PURE__*/_react.default.createElement(_layout.EditorContainer, {
159
159
  editor: validEditor,
160
160
  readonly: isFreezed
161
- }, /*#__PURE__*/_react.default.createElement(_hooks.CollaboratorsProvider, null, /*#__PURE__*/_react.default.createElement(_useColorContext.ColorProvider, null, isShowHeaderToolbar && /*#__PURE__*/_react.default.createElement(_extension.HeaderToolbar, {
161
+ }, /*#__PURE__*/_react.default.createElement(_useColorContext.ColorProvider, null, isShowHeaderToolbar && /*#__PURE__*/_react.default.createElement(_extension.HeaderToolbar, {
162
162
  editor: validEditor,
163
163
  readonly: isFreezed
164
164
  }), /*#__PURE__*/_react.default.createElement(_layout.EditorContent, {
@@ -171,13 +171,12 @@ const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
171
171
  editor: validEditor,
172
172
  slateValue: slateValue,
173
173
  showComment: true
174
- })))));
174
+ }))));
175
175
  }
176
176
  const isShowComment = typeof showComment === 'boolean' ? showComment : true;
177
- const Provider = isShowComment ? _hooks.CollaboratorsProvider : _react.Fragment;
178
177
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_layout.EditorContainer, {
179
178
  editor: validEditor
180
- }, /*#__PURE__*/_react.default.createElement(Provider, null, /*#__PURE__*/_react.default.createElement(_useColorContext.ColorProvider, null, isShowHeaderToolbar && /*#__PURE__*/_react.default.createElement(_extension.HeaderToolbar, {
179
+ }, /*#__PURE__*/_react.default.createElement(_useColorContext.ColorProvider, null, isShowHeaderToolbar && /*#__PURE__*/_react.default.createElement(_extension.HeaderToolbar, {
181
180
  editor: validEditor
182
181
  }), /*#__PURE__*/_react.default.createElement(_layout.EditorContent, {
183
182
  docValue: slateValue,
@@ -189,7 +188,7 @@ const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
189
188
  slateValue: slateValue,
190
189
  updateSlateValue: onValueChange,
191
190
  showComment: isShowComment
192
- }))))), /*#__PURE__*/_react.default.createElement(_insertElementDialog.default, {
191
+ })))), /*#__PURE__*/_react.default.createElement(_insertElementDialog.default, {
193
192
  editor: validEditor
194
193
  }));
195
194
  });
@@ -10,9 +10,9 @@ var _react = _interopRequireWildcard(require("react"));
10
10
  var _useScrollContext = require("../hooks/use-scroll-context");
11
11
  var _outline = _interopRequireDefault(require("../outline"));
12
12
  var _classnames = _interopRequireDefault(require("classnames"));
13
- var _comment = _interopRequireDefault(require("../comment"));
14
13
  var _provider = _interopRequireDefault(require("../comment/provider"));
15
14
  var _useParticipants = require("../comment/hooks/use-participants");
15
+ var _rightPanel = _interopRequireDefault(require("../right-panel"));
16
16
  const EditorContent = _ref => {
17
17
  let {
18
18
  readonly,
@@ -34,30 +34,7 @@ const EditorContent = _ref => {
34
34
  'readonly': readonly,
35
35
  'no-outline': !showOutline
36
36
  });
37
- if (!showComment) {
38
- return /*#__PURE__*/_react.default.createElement("div", {
39
- className: "sdoc-content-wrapper"
40
- }, /*#__PURE__*/_react.default.createElement("div", {
41
- ref: scrollRef,
42
- className: "sdoc-scroll-container",
43
- onScroll: onWrapperScroll,
44
- id: "sdoc-scroll-container"
45
- }, /*#__PURE__*/_react.default.createElement(_useScrollContext.ScrollContext.Provider, {
46
- value: {
47
- scrollRef
48
- }
49
- }, /*#__PURE__*/_react.default.createElement("div", {
50
- className: className
51
- }, showOutline && /*#__PURE__*/_react.default.createElement(_outline.default, {
52
- scrollLeft: scrollLeft,
53
- doc: docValue
54
- }), children))));
55
- }
56
- return /*#__PURE__*/_react.default.createElement("div", {
57
- className: "sdoc-content-wrapper"
58
- }, /*#__PURE__*/_react.default.createElement(_provider.default, {
59
- editor: editor
60
- }, /*#__PURE__*/_react.default.createElement(_useParticipants.ParticipantsProvider, null, /*#__PURE__*/_react.default.createElement("div", {
37
+ const dom = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
61
38
  ref: scrollRef,
62
39
  className: "sdoc-scroll-container",
63
40
  onScroll: onWrapperScroll,
@@ -71,10 +48,19 @@ const EditorContent = _ref => {
71
48
  }, showOutline && /*#__PURE__*/_react.default.createElement(_outline.default, {
72
49
  scrollLeft: scrollLeft,
73
50
  doc: docValue
74
- }), children))), /*#__PURE__*/_react.default.createElement(_comment.default, {
75
- editor: editor,
76
- type: "global"
77
- }))));
51
+ }), children))), /*#__PURE__*/_react.default.createElement(_rightPanel.default, {
52
+ editor: editor
53
+ }));
54
+ if (!showComment) {
55
+ return /*#__PURE__*/_react.default.createElement("div", {
56
+ className: "sdoc-content-wrapper"
57
+ }, dom);
58
+ }
59
+ return /*#__PURE__*/_react.default.createElement("div", {
60
+ className: "sdoc-content-wrapper"
61
+ }, /*#__PURE__*/_react.default.createElement(_provider.default, {
62
+ editor: editor
63
+ }, /*#__PURE__*/_react.default.createElement(_useParticipants.ParticipantsProvider, null, dom)));
78
64
  };
79
65
  EditorContent.defaultProps = {
80
66
  readonly: false,
@@ -0,0 +1,14 @@
1
+ .sdoc-content-right-panel-wrapper {
2
+ display: flex;
3
+ flex-direction: row;
4
+ max-width: 620px;
5
+ min-width: 360px;
6
+ position: relative;
7
+ }
8
+
9
+ .sdoc-content-right-panel-wrapper .sdoc-content-right-panel {
10
+ width: 100%;
11
+ height: 100%;
12
+ overflow: hidden;
13
+ border-left: 1px solid #d8d8d8;
14
+ }
@@ -0,0 +1,82 @@
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 _hooks = require("../../hooks");
11
+ var _resizeWidth = _interopRequireDefault(require("./resize-width"));
12
+ require("./index.css");
13
+ const MIN_PANEL_WIDTH = 360;
14
+ const MAX_PANEL_WIDTH = 620;
15
+ const RightPanel = _ref => {
16
+ let {
17
+ editor
18
+ } = _ref;
19
+ const {
20
+ plugins,
21
+ displayPluginName,
22
+ closePlugin
23
+ } = (0, _hooks.usePlugins)();
24
+ const panelWrapperRef = (0, _react.useRef)(null);
25
+ const {
26
+ collaborators
27
+ } = (0, _hooks.useCollaborators)();
28
+ const [width, setWidth] = (0, _react.useState)(MIN_PANEL_WIDTH);
29
+ const panelWrapperStyle = (0, _react.useMemo)(() => {
30
+ if (!displayPluginName) return null;
31
+ let style = {
32
+ width,
33
+ zIndex: 101
34
+ };
35
+ if (!style.width || style.width < MIN_PANEL_WIDTH) {
36
+ style.width = MIN_PANEL_WIDTH;
37
+ } else if (style.width > MAX_PANEL_WIDTH) {
38
+ style.width = MAX_PANEL_WIDTH;
39
+ }
40
+ return style;
41
+ }, [width, displayPluginName]);
42
+ const resizeWidth = (0, _react.useCallback)(width => {
43
+ setWidth(width);
44
+ }, [panelWrapperRef]);
45
+ const resizeWidthEnd = (0, _react.useCallback)(width => {
46
+ const panelWidth = JSON.parse(window.localStorage.getItem('sdoc-panel-width', '{}'));
47
+ window.localStorage.setItem('sdoc-panel-width', JSON.stringify({
48
+ ...panelWidth,
49
+ [displayPluginName]: width
50
+ }));
51
+ }, [displayPluginName]);
52
+ (0, _react.useEffect)(() => {
53
+ const panelWidth = JSON.parse(window.localStorage.getItem('sdoc-panel-width', '{}')) || {};
54
+ const width = Math.max(parseInt(panelWidth[displayPluginName] || MIN_PANEL_WIDTH), MAX_PANEL_WIDTH);
55
+ setWidth(width);
56
+ }, [displayPluginName]);
57
+ if (!displayPluginName) return null;
58
+ const plugin = plugins.find(p => p.name === displayPluginName);
59
+ if (!plugin) return null;
60
+ const Component = plugin.Component;
61
+ if (!Component) return null;
62
+ return /*#__PURE__*/_react.default.createElement("div", {
63
+ className: "sdoc-content-right-panel-wrapper",
64
+ ref: panelWrapperRef,
65
+ style: panelWrapperStyle
66
+ }, plugin.resizable_width && /*#__PURE__*/_react.default.createElement(_resizeWidth.default, {
67
+ minWidth: MIN_PANEL_WIDTH,
68
+ maxWidth: MAX_PANEL_WIDTH,
69
+ resizeWidth: resizeWidth,
70
+ resizeWidthEnd: resizeWidthEnd
71
+ }), /*#__PURE__*/_react.default.createElement("div", {
72
+ className: "sdoc-content-right-panel",
73
+ id: "sdoc-content-right-panel"
74
+ }, /*#__PURE__*/_react.default.createElement(Component, {
75
+ editor: editor,
76
+ type: "global",
77
+ collaborators: collaborators,
78
+ onClose: closePlugin,
79
+ width: width
80
+ })));
81
+ };
82
+ var _default = exports.default = RightPanel;
@@ -0,0 +1,38 @@
1
+ .sdoc-resize-width-handler {
2
+ height: 100%;
3
+ position: absolute;
4
+ right: 0;
5
+ top: 0;
6
+ width: 6px;
7
+ }
8
+
9
+ .sdoc-resize-width-handler.resize-handler-placement-right {
10
+ left: 0;
11
+ right: auto;
12
+ }
13
+
14
+ .sdoc-resize-width-handler:hover {
15
+ cursor: col-resize;
16
+ }
17
+
18
+ .sdoc-resize-width-handler .sdoc-resize-width-handler-content {
19
+ background-color: initial;
20
+ height: 100%;
21
+ position: relative;
22
+ width: 2px;
23
+ }
24
+
25
+ .sdoc-resize-width-handler:hover .sdoc-resize-width-handler-content {
26
+ background-color: #ccc;
27
+ }
28
+
29
+ .sdoc-resize-width-handler .sdoc-resize-width-handler-bar {
30
+ background-color: #2d7ff9;
31
+ border-radius: 3px;
32
+ content: "";
33
+ left: 50%;
34
+ margin-left: -3px;
35
+ position: absolute;
36
+ width: 6px;
37
+ }
38
+
@@ -0,0 +1,134 @@
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 _classnames = _interopRequireDefault(require("classnames"));
11
+ require("./index.css");
12
+ const ResizeWidth = _ref => {
13
+ let {
14
+ minWidth,
15
+ maxWidth,
16
+ resizeWidth: resizeWidthAPI,
17
+ resizeWidthEnd
18
+ } = _ref;
19
+ const [isShowHandlerBar, setIsShowHandlerBar] = (0, _react.useState)(false);
20
+ const [drag, setDrag] = (0, _react.useState)(null);
21
+ const handlerRef = (0, _react.useRef)(null);
22
+ const handlerBarRef = (0, _react.useRef)(null);
23
+ const setHandlerBarTop = handlerTop => {
24
+ if (!handlerBarRef.current || handlerTop < 0) return;
25
+ handlerBarRef.current.style.top = handlerTop + 'px';
26
+ };
27
+ const setHandlerBarPosition = event => {
28
+ if (!handlerRef.current) return;
29
+ const {
30
+ top
31
+ } = handlerRef.current.getBoundingClientRect();
32
+ const handlerTop = event.pageY - top - 26 / 2;
33
+ setHandlerBarTop(handlerTop);
34
+ };
35
+ const getWidthFromMouseEvent = event => {
36
+ return event.pageX || event.touches && event.touches[0] && event.touches[0].pageX || event.changedTouches && event.changedTouches[event.changedTouches.length - 1].pageX;
37
+ };
38
+ const calculateResizedWidth = event => {
39
+ const width = getWidthFromMouseEvent(event);
40
+ const resizedWidth = document.body.clientWidth - width;
41
+ if (minWidth && resizedWidth < minWidth || maxWidth && resizedWidth > maxWidth) return -1;
42
+ return resizedWidth;
43
+ };
44
+ const onResizeWidth = event => {
45
+ const resizedWidth = calculateResizedWidth(event);
46
+ if (resizedWidth < 0) return;
47
+ if (resizeWidthAPI) {
48
+ resizeWidthAPI(resizedWidth);
49
+ }
50
+ };
51
+ const onDrag = event => {
52
+ onResizeWidth(event);
53
+ };
54
+ const onDragStart = (0, _react.useCallback)(event => {
55
+ if (event && event.dataTransfer && event.dataTransfer.setData) {
56
+ event.dataTransfer.setData('text/plain', 'dummy');
57
+ }
58
+ }, []);
59
+ const onDragEnd = event => {
60
+ onResizeWidth(event);
61
+ };
62
+ const onMouseLeave = () => {
63
+ setIsShowHandlerBar(false);
64
+ };
65
+ const onMouseEnter = event => {
66
+ setIsShowHandlerBar(true);
67
+ setHandlerBarPosition(event);
68
+ if (handlerRef.current) {
69
+ handlerRef.current.addEventListener('mouseleave', onMouseLeave);
70
+ }
71
+ };
72
+ const onMouseOver = (0, _react.useCallback)(event => {
73
+ setHandlerBarPosition(event);
74
+ }, [setHandlerBarPosition]);
75
+ const onMouseDown = event => {
76
+ event.preventDefault && event.preventDefault();
77
+ const currDrag = onDragStart(event);
78
+ if (currDrag === null && event.button !== 0) return;
79
+ window.addEventListener('mouseup', onMouseUp);
80
+ window.addEventListener('mousemove', onMouseMove);
81
+ if (handlerRef.current) {
82
+ handlerRef.current.removeEventListener('mouseleave', onMouseLeave);
83
+ }
84
+ setDrag(currDrag);
85
+ };
86
+ const onMouseMove = event => {
87
+ event.preventDefault && event.preventDefault();
88
+ if (!drag === null) return;
89
+ onDrag(event);
90
+ };
91
+ const onMouseUp = event => {
92
+ window.removeEventListener('mouseup', onMouseUp);
93
+ window.removeEventListener('mousemove', onMouseMove);
94
+ onDragEnd(event, drag);
95
+ setHandlerBarTop(-9999);
96
+ setDrag(null);
97
+ setIsShowHandlerBar(false);
98
+ if (resizeWidthEnd) {
99
+ const resizeWidth = calculateResizedWidth(event);
100
+ if (resizeWidth < 0) return;
101
+ resizeWidthEnd(resizeWidth);
102
+ }
103
+ };
104
+ (0, _react.useEffect)(() => {
105
+ return () => {
106
+ window.removeEventListener('mouseup', onMouseUp);
107
+ window.removeEventListener('mousemove', onMouseMove);
108
+ };
109
+
110
+ // eslint-disable-next-line
111
+ }, []);
112
+ return /*#__PURE__*/_react.default.createElement("div", {
113
+ className: "sdoc-resize-width-handler resize-handler-placement-right",
114
+ ref: handlerRef,
115
+ onMouseDown: onMouseDown,
116
+ onMouseOver: onMouseOver,
117
+ onMouseEnter: onMouseEnter,
118
+ onDrag: onDrag,
119
+ onDragStart: onDragStart,
120
+ onDragEnd: onDragEnd,
121
+ style: {
122
+ zIndex: 4
123
+ }
124
+ }, /*#__PURE__*/_react.default.createElement("div", {
125
+ className: "sdoc-resize-width-handler-content"
126
+ }, isShowHandlerBar && /*#__PURE__*/_react.default.createElement("div", {
127
+ className: "sdoc-resize-width-handler-bar",
128
+ ref: handlerBarRef,
129
+ style: {
130
+ height: 26
131
+ }
132
+ })));
133
+ };
134
+ var _default = exports.default = ResizeWidth;
@@ -11,8 +11,8 @@ var _context = _interopRequireDefault(require("../../context"));
11
11
  var _revisionOperations = _interopRequireDefault(require("./revision-operations"));
12
12
  var _collaboratorsOperation = _interopRequireDefault(require("./collaborators-operation"));
13
13
  var _moreOperations = _interopRequireDefault(require("./more-operations"));
14
- var _commentsOperation = _interopRequireDefault(require("./comments-operation"));
15
14
  var _shareOperation = _interopRequireDefault(require("./share-operation"));
15
+ var _pluginsOperations = _interopRequireDefault(require("./plugins-operations"));
16
16
  var _utils = require("../../utils");
17
17
  require("./style.css");
18
18
  const DocOperations = _ref => {
@@ -39,6 +39,6 @@ const DocOperations = _ref => {
39
39
  handleViewChangesToggle: handleViewChangesToggle,
40
40
  handleRevisionMerged: handleRevisionMerged,
41
41
  handleRevisionPublished: handleRevisionPublished
42
- }), !isPublished && /*#__PURE__*/_react.default.createElement(_commentsOperation.default, null), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_shareOperation.default, null), !isPublished && /*#__PURE__*/_react.default.createElement(_collaboratorsOperation.default, null), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_moreOperations.default, null));
42
+ }), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_pluginsOperations.default, null), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_shareOperation.default, null), !isPublished && /*#__PURE__*/_react.default.createElement(_collaboratorsOperation.default, null), !isSdocRevision && /*#__PURE__*/_react.default.createElement(_moreOperations.default, null));
43
43
  };
44
44
  var _default = exports.default = (0, _reactI18next.withTranslation)('sdoc-editor')(DocOperations);
@@ -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
+ var _classnames = _interopRequireDefault(require("classnames"));
11
+ var _hooks = require("../../hooks");
12
+ var _mouseEvent = require("../../basic-sdk/utils/mouse-event");
13
+ const PluginsOperations = () => {
14
+ const {
15
+ plugins,
16
+ updateDisplayPlugin
17
+ } = (0, _hooks.usePlugins)();
18
+ const onClick = (0, _react.useCallback)((event, pluginName) => {
19
+ (0, _mouseEvent.eventStopPropagation)(event);
20
+ updateDisplayPlugin(pluginName);
21
+ }, [updateDisplayPlugin]);
22
+ return plugins.map(plugin => {
23
+ const {
24
+ name,
25
+ icon
26
+ } = plugin;
27
+ let iconDom = '';
28
+ if (typeof icon !== 'string') {
29
+ iconDom = icon;
30
+ } else {
31
+ iconDom = /*#__PURE__*/_react.default.createElement("i", {
32
+ className: (0, _classnames.default)('sdocfont', icon)
33
+ });
34
+ }
35
+ return /*#__PURE__*/_react.default.createElement("span", {
36
+ className: "op-item sdoc-plugin-operation-btn-container",
37
+ onClick: e => onClick(e, name),
38
+ key: name
39
+ }, iconDom);
40
+ });
41
+ };
42
+ var _default = exports.default = PluginsOperations;
@@ -9,6 +9,12 @@ Object.defineProperty(exports, "CollaboratorsProvider", {
9
9
  return _useCollaborators.CollaboratorsProvider;
10
10
  }
11
11
  });
12
+ Object.defineProperty(exports, "PluginsProvider", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _usePlugins.PluginsProvider;
16
+ }
17
+ });
12
18
  Object.defineProperty(exports, "useCollaborators", {
13
19
  enumerable: true,
14
20
  get: function () {
@@ -21,5 +27,12 @@ Object.defineProperty(exports, "useDocument", {
21
27
  return _useDocument.useDocument;
22
28
  }
23
29
  });
30
+ Object.defineProperty(exports, "usePlugins", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _usePlugins.usePlugins;
34
+ }
35
+ });
24
36
  var _useCollaborators = require("./use-collaborators");
25
- var _useDocument = require("./use-document");
37
+ var _useDocument = require("./use-document");
38
+ var _usePlugins = require("./use-plugins");
@@ -10,12 +10,17 @@ var _react = _interopRequireWildcard(require("react"));
10
10
  var _context = _interopRequireDefault(require("../context"));
11
11
  var _model = require("../model");
12
12
  const CollaboratorsContext = /*#__PURE__*/_react.default.createContext(null);
13
- const CollaboratorsProvider = props => {
13
+ const CollaboratorsProvider = _ref => {
14
+ let {
15
+ collaborators: propsCollaborators,
16
+ children
17
+ } = _ref;
14
18
  const isSdocRevision = _context.default.getSetting('isSdocRevision');
15
19
  const isPublished = _context.default.getSetting('isPublished');
16
- const [collaborators, setCollaborators] = (0, _react.useState)([]);
20
+ const [collaborators, setCollaborators] = (0, _react.useState)(propsCollaborators || []);
17
21
  (0, _react.useEffect)(() => {
18
22
  if (isSdocRevision && isPublished) return;
23
+ if (propsCollaborators) return;
19
24
  _context.default.listRelatedUsers().then(res => {
20
25
  const collaborators = [];
21
26
  res.data.related_users.forEach(user => {
@@ -34,7 +39,7 @@ const CollaboratorsProvider = props => {
34
39
  value: {
35
40
  collaborators
36
41
  }
37
- }, props.children);
42
+ }, children);
38
43
  };
39
44
  exports.CollaboratorsProvider = CollaboratorsProvider;
40
45
  const useCollaborators = () => {
@@ -0,0 +1,64 @@
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.usePlugins = exports.PluginsProvider = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _constants = require("../basic-sdk/constants");
11
+ var _comment = _interopRequireDefault(require("../basic-sdk/comment"));
12
+ const PluginsContext = /*#__PURE__*/_react.default.createContext(null);
13
+ const PluginsProvider = _ref => {
14
+ let {
15
+ showComment,
16
+ plugins: propsPlugins,
17
+ children
18
+ } = _ref;
19
+ const [displayName, setDisplayName] = (0, _react.useState)('');
20
+ const closePlugin = (0, _react.useCallback)(() => {
21
+ setDisplayName('');
22
+ }, []);
23
+ const plugins = (0, _react.useMemo)(() => {
24
+ const allPlugins = propsPlugins;
25
+ if (showComment) {
26
+ allPlugins.push({
27
+ name: 'sdoc-comment',
28
+ icon: 'sdoc-comments',
29
+ position: '',
30
+ resizable_width: true,
31
+ display_type: 'inlay-right',
32
+ Component: _comment.default
33
+ });
34
+ }
35
+ return allPlugins;
36
+ }, [showComment, propsPlugins]);
37
+ const updateDisplayPlugin = (0, _react.useCallback)(name => {
38
+ if (!name || displayName === name) {
39
+ setDisplayName('');
40
+ return;
41
+ }
42
+ const plugin = plugins.find(plugin => plugin.name === name);
43
+ if ((plugin === null || plugin === void 0 ? void 0 : plugin.display_type) === _constants.PLUGIN_DISPLAY_TYPE.INLAY_RIGHT) {
44
+ setDisplayName(name);
45
+ }
46
+ }, [displayName, plugins]);
47
+ return /*#__PURE__*/_react.default.createElement(PluginsContext.Provider, {
48
+ value: {
49
+ plugins,
50
+ displayPluginName: displayName,
51
+ updateDisplayPlugin,
52
+ closePlugin
53
+ }
54
+ }, children);
55
+ };
56
+ exports.PluginsProvider = PluginsProvider;
57
+ const usePlugins = () => {
58
+ const context = (0, _react.useContext)(PluginsContext);
59
+ if (!context) {
60
+ throw new Error('\'PluginsContext\' is null');
61
+ }
62
+ return context;
63
+ };
64
+ exports.usePlugins = usePlugins;
@@ -26,7 +26,9 @@ const SimpleEditor = _ref => {
26
26
  showComment,
27
27
  showDocOperations = true,
28
28
  showFileTags = true,
29
- t
29
+ t,
30
+ plugins = [],
31
+ collaborators
30
32
  } = _ref;
31
33
  _context.default.initApi();
32
34
  const editorRef = (0, _react.useRef)(null);
@@ -140,7 +142,12 @@ const SimpleEditor = _ref => {
140
142
  className: "error-tip"
141
143
  }, t(errorMessage)));
142
144
  }
143
- return /*#__PURE__*/_react.default.createElement(_errorBoundary.default, null, /*#__PURE__*/_react.default.createElement(_layout.default, null, /*#__PURE__*/_react.default.createElement(_layout.Header, null, /*#__PURE__*/_react.default.createElement(_docInfo.default, {
145
+ return /*#__PURE__*/_react.default.createElement(_errorBoundary.default, null, /*#__PURE__*/_react.default.createElement(_hooks.CollaboratorsProvider, {
146
+ collaborators: collaborators
147
+ }, /*#__PURE__*/_react.default.createElement(_hooks.PluginsProvider, {
148
+ plugins: plugins,
149
+ showComment: showComment
150
+ }, /*#__PURE__*/_react.default.createElement(_layout.default, null, /*#__PURE__*/_react.default.createElement(_layout.Header, null, /*#__PURE__*/_react.default.createElement(_docInfo.default, {
144
151
  isStarred: isStarred,
145
152
  isDraft: isDraft,
146
153
  showFileTags: showFileTags,
@@ -153,6 +160,6 @@ const SimpleEditor = _ref => {
153
160
  handleViewChangesToggle: handleViewChangesToggle,
154
161
  handleRevisionMerged: handleRevisionMerged,
155
162
  handleRevisionPublished: handleRevisionPublished
156
- })), /*#__PURE__*/_react.default.createElement(_layout.Content, null, renderEditor())));
163
+ })), /*#__PURE__*/_react.default.createElement(_layout.Content, null, renderEditor())))));
157
164
  };
158
165
  var _default = exports.default = (0, _reactI18next.withTranslation)('sdoc-editor')(SimpleEditor);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "1.0.67",
3
+ "version": "1.0.68",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -14,6 +14,8 @@
14
14
  />
15
15
  <missing-glyph />
16
16
 
17
+ <glyph glyph-name="sdoc-info" unicode="&#58999;" d="M512 896c281.6 0 512-230.4 512-512s-230.4-512-512-512S0 102.4 0 384 230.4 896 512 896z m0-96C281.6 800 96 614.4 96 384s185.6-416 416-416 416 185.6 416 416c0 108.8-44.8 217.6-121.6 294.4S620.8 800 512 800z m32-352c19.2 0 32-12.8 32-32v-256c0-19.2-12.8-32-32-32h-64c-19.2 0-32 12.8-32 32V416c0 19.2 12.8 32 32 32h64z m-19.2 192c9.6 0 16-3.2 22.4-9.6 3.2-3.2 6.4-6.4 9.6-6.4 25.6-25.6 25.6-64 0-89.6-3.2-3.2-6.4-6.4-9.6-6.4-6.4-3.2-16-6.4-22.4-9.6h-25.6c-9.6 0-16 3.2-22.4 9.6-3.2 3.2-6.4 6.4-9.6 6.4-25.6 25.6-25.6 64 0 89.6 3.2 3.2 6.4 6.4 9.6 6.4 6.4 3.2 16 6.4 22.4 9.6h25.6z" horiz-adv-x="1024" />
18
+
17
19
  <glyph glyph-name="sdoc-inline-code" unicode="&#58998;" d="M1024 384l-272-288-67.2 70.4 204.8 217.6-204.8 217.6L752 672l272-288zM0 384l272-288 67.2 70.4L134.4 384l204.8 217.6L272 672 0 384z m451.2-512l-99.2 3.2L579.2 896h99.2l-227.2-1024z" horiz-adv-x="1024" />
18
20
 
19
21
  <glyph glyph-name="sdoc-sort" unicode="&#58996;" d="M294.4 790.4l201.6-204.8c19.2-19.2 19.2-51.2 0-73.6-19.2-19.2-51.2-19.2-70.4 0L320 620.8v-604.8c0-25.6-22.4-48-48-48S224-9.6 224 16V620.8L118.4 512c-19.2-19.2-48-19.2-67.2-3.2l-3.2 3.2c-19.2 19.2-19.2 51.2 0 73.6l201.6 204.8c12.8 12.8 32 12.8 44.8 0zM752 800c25.6 0 48-22.4 48-48v-604.8l105.6 108.8c19.2 19.2 51.2 19.2 70.4 0 19.2-19.2 19.2-51.2 0-73.6l-201.6-204.8c-12.8-12.8-32-12.8-44.8 0l-201.6 204.8c-19.2 19.2-19.2 51.2 0 73.6l3.2 3.2c19.2 16 48 16 67.2-3.2l105.6-108.8V752c0 25.6 22.4 48 48 48z" horiz-adv-x="1024" />
@@ -1,11 +1,11 @@
1
1
  @font-face {
2
2
  font-family: "sdocfont"; /* Project id 4097705 */
3
- src: url('./sdoc-editor-font/iconfont.eot?t=1724747529924'); /* IE9 */
4
- src: url('./sdoc-editor-font/iconfont.eot?t=1724747529924#iefix') format('embedded-opentype'), /* IE6-IE8 */
5
- url('./sdoc-editor-font/iconfont.woff2?t=1724747529924') format('woff2'),
6
- url('./sdoc-editor-font/iconfont.woff?t=1724747529924') format('woff'),
7
- url('./sdoc-editor-font/iconfont.ttf?t=1724747529924') format('truetype'),
8
- url('./sdoc-editor-font/iconfont.svg?t=1724747529924#sdocfont') format('svg');
3
+ src: url('./sdoc-editor-font/iconfont.eot?t=1725002301707'); /* IE9 */
4
+ src: url('./sdoc-editor-font/iconfont.eot?t=1725002301707#iefix') format('embedded-opentype'), /* IE6-IE8 */
5
+ url('./sdoc-editor-font/iconfont.woff2?t=1725002301707') format('woff2'),
6
+ url('./sdoc-editor-font/iconfont.woff?t=1725002301707') format('woff'),
7
+ url('./sdoc-editor-font/iconfont.ttf?t=1725002301707') format('truetype'),
8
+ url('./sdoc-editor-font/iconfont.svg?t=1725002301707#sdocfont') format('svg');
9
9
  }
10
10
 
11
11
  .sdocfont {
@@ -16,6 +16,10 @@
16
16
  -moz-osx-font-smoothing: grayscale;
17
17
  }
18
18
 
19
+ .sdoc-info:before {
20
+ content: "\e677";
21
+ }
22
+
19
23
  .sdoc-inline-code:before {
20
24
  content: "\e676";
21
25
  }