@seafile/comment-editor 0.0.1-alpha.0 → 0.0.1-alpha.10

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 (93) hide show
  1. package/README.md +2 -4
  2. package/dist/basic-sdk/assets/css/layout.css +1 -45
  3. package/dist/basic-sdk/assets/css/sdoc-comment-editor-plugin.css +4 -4
  4. package/dist/basic-sdk/comment/utils.js +39 -0
  5. package/dist/basic-sdk/constants/index.js +1 -2
  6. package/dist/basic-sdk/context.js +9 -8
  7. package/dist/basic-sdk/editor/comment-editor.css +138 -0
  8. package/dist/basic-sdk/editor/comment-editor.js +289 -0
  9. package/dist/basic-sdk/extension/plugins/image/helpers.js +1 -1
  10. package/dist/basic-sdk/extension/plugins/image/use-copy-image.js +1 -1
  11. package/dist/basic-sdk/extension/plugins/image/use-upload-image.js +2 -1
  12. package/dist/basic-sdk/extension/plugins/link/menu/index.js +1 -1
  13. package/dist/basic-sdk/extension/plugins/mention/render-elem/participant-popover.js +3 -6
  14. package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +1 -2
  15. package/dist/basic-sdk/extension/render/render-comment-editor-element.js +1 -1
  16. package/dist/basic-sdk/extension/toolbar/comment-editor-toolbar/index.js +3 -3
  17. package/dist/basic-sdk/extension/toolbar/comment-editor-toolbar/post-comment/index.js +2 -2
  18. package/dist/basic-sdk/hooks/use-comment.js +53 -0
  19. package/dist/basic-sdk/index.js +12 -39
  20. package/dist/pages/seafile-comment-editor.js +30 -54
  21. package/package.json +2 -1
  22. package/dist/assets/css/plugin-editor.css +0 -7
  23. package/dist/assets/css/simple-viewer.css +0 -6
  24. package/dist/basic-sdk/comment/components/comment-all-participants/index.css +0 -83
  25. package/dist/basic-sdk/comment/components/comment-all-participants/index.js +0 -67
  26. package/dist/basic-sdk/comment/components/comment-all-participants/participant-avatar.js +0 -43
  27. package/dist/basic-sdk/comment/components/comment-context-menu/index.css +0 -16
  28. package/dist/basic-sdk/comment/components/comment-context-menu/index.js +0 -43
  29. package/dist/basic-sdk/comment/components/comment-context-menu/menu-item.js +0 -57
  30. package/dist/basic-sdk/comment/components/comment-delete-popover.js +0 -80
  31. package/dist/basic-sdk/comment/components/comment-editor.js +0 -165
  32. package/dist/basic-sdk/comment/components/comment-item-collapse-wrapper.js +0 -160
  33. package/dist/basic-sdk/comment/components/comment-item-content.js +0 -156
  34. package/dist/basic-sdk/comment/components/comment-item-reply.js +0 -124
  35. package/dist/basic-sdk/comment/components/comment-item-resolved-reply.js +0 -38
  36. package/dist/basic-sdk/comment/components/comment-item-wrapper.js +0 -368
  37. package/dist/basic-sdk/comment/components/comment-list.css +0 -422
  38. package/dist/basic-sdk/comment/components/comment-list.js +0 -216
  39. package/dist/basic-sdk/comment/components/comment-operation/index.css +0 -26
  40. package/dist/basic-sdk/comment/components/comment-operation/index.js +0 -31
  41. package/dist/basic-sdk/comment/components/comment-participants-editor/index.css +0 -132
  42. package/dist/basic-sdk/comment/components/comment-participants-editor/index.js +0 -69
  43. package/dist/basic-sdk/comment/components/comment-participants-editor/searched-collaborators.js +0 -62
  44. package/dist/basic-sdk/comment/components/comment-participants-editor/selected-participants.js +0 -48
  45. package/dist/basic-sdk/comment/components/editor-comment.js +0 -183
  46. package/dist/basic-sdk/comment/components/elements-comment-count/element-comment-count.js +0 -64
  47. package/dist/basic-sdk/comment/components/elements-comment-count/index.css +0 -29
  48. package/dist/basic-sdk/comment/components/elements-comment-count/index.js +0 -49
  49. package/dist/basic-sdk/comment/components/global-comment/global-comment-body-header.js +0 -87
  50. package/dist/basic-sdk/comment/components/global-comment/global-comment-editor.js +0 -36
  51. package/dist/basic-sdk/comment/components/global-comment/global-comment-header.js +0 -82
  52. package/dist/basic-sdk/comment/components/global-comment/index.css +0 -326
  53. package/dist/basic-sdk/comment/components/global-comment/index.js +0 -212
  54. package/dist/basic-sdk/comment/components/index.js +0 -21
  55. package/dist/basic-sdk/comment/components/style.css +0 -40
  56. package/dist/basic-sdk/comment/helper.js +0 -184
  57. package/dist/basic-sdk/comment/hooks/comment-hooks/use-comment-context.js +0 -20
  58. package/dist/basic-sdk/comment/hooks/comment-hooks/use-comment-list.js +0 -45
  59. package/dist/basic-sdk/comment/hooks/comment-hooks/use-comment-mount.js +0 -58
  60. package/dist/basic-sdk/comment/hooks/notification-hooks/index.js +0 -25
  61. package/dist/basic-sdk/comment/hooks/notification-hooks/use-notification-context.js +0 -20
  62. package/dist/basic-sdk/comment/hooks/notification-hooks/use-notification-mount.js +0 -74
  63. package/dist/basic-sdk/comment/hooks/use-participants.js +0 -26
  64. package/dist/basic-sdk/comment/index.js +0 -67
  65. package/dist/basic-sdk/comment/provider/comment-context-provider.js +0 -37
  66. package/dist/basic-sdk/comment/provider/index.js +0 -23
  67. package/dist/basic-sdk/comment/provider/notification-context-provider.js +0 -31
  68. package/dist/basic-sdk/comment/provider/participants-content-provider.js +0 -96
  69. package/dist/basic-sdk/comment/reducer/comment-reducer.js +0 -353
  70. package/dist/basic-sdk/comment/reducer/notification-reducer.js +0 -89
  71. package/dist/basic-sdk/comment/utils/get-event-transfer.js +0 -77
  72. package/dist/basic-sdk/comment/utils/index.js +0 -281
  73. package/dist/basic-sdk/comment/utils/notification-utils.js +0 -62
  74. package/dist/basic-sdk/editor/comment-article.js +0 -104
  75. package/dist/basic-sdk/editor/sdoc-comment-editor.js +0 -128
  76. package/dist/basic-sdk/editor/sdoc-editor.js +0 -50
  77. package/dist/basic-sdk/hooks/use-collaborators.js +0 -62
  78. package/dist/basic-sdk/hooks/use-plugins.js +0 -9
  79. package/dist/basic-sdk/layout/article-container.js +0 -89
  80. package/dist/basic-sdk/layout/editor-container.js +0 -32
  81. package/dist/basic-sdk/layout/index.js +0 -20
  82. package/dist/basic-sdk/right-panel/index.css +0 -15
  83. package/dist/basic-sdk/right-panel/index.js +0 -86
  84. package/dist/basic-sdk/right-panel/resize-width/index.css +0 -38
  85. package/dist/basic-sdk/right-panel/resize-width/index.js +0 -132
  86. package/dist/basic-sdk/socket/helpers.js +0 -299
  87. package/dist/basic-sdk/socket/index.js +0 -20
  88. package/dist/basic-sdk/socket/socket-client.js +0 -211
  89. package/dist/basic-sdk/socket/socket-manager.js +0 -386
  90. package/dist/basic-sdk/socket/with-socket-io.js +0 -73
  91. package/dist/hooks/index.js +0 -12
  92. package/dist/hooks/use-document.js +0 -75
  93. /package/dist/basic-sdk/comment/{constants/index.js → constants.js} +0 -0
@@ -1,281 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.convertComment = exports.checkMentionOperation = exports.CommentUtilities = void 0;
8
- Object.defineProperty(exports, "createNotify", {
9
- enumerable: true,
10
- get: function () {
11
- return _notificationUtils.createNotify;
12
- }
13
- });
14
- exports.focusToCommentElement = void 0;
15
- Object.defineProperty(exports, "generatorNotificationKey", {
16
- enumerable: true,
17
- get: function () {
18
- return _notificationUtils.generatorNotificationKey;
19
- }
20
- });
21
- exports.searchCollaborators = exports.getEventClassName = exports.getCommentElementById = void 0;
22
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/defineProperty"));
23
- var _slate = require("@seafile/slate");
24
- var _slateReact = require("@seafile/slate-react");
25
- var _constants = require("../../constants");
26
- var _constants2 = require("../../extension/constants");
27
- var _core = require("../../extension/core");
28
- var _helper = require("../../extension/plugins/mention/helper");
29
- var _getEventTransfer = _interopRequireDefault(require("./get-event-transfer"));
30
- var _notificationUtils = require("./notification-utils");
31
- const searchCollaborators = (collaborators, searchValue, editor) => {
32
- const validSearchValue = searchValue ? searchValue.trim().toLowerCase() : '';
33
- const validCollaborators = Array.isArray(collaborators) && collaborators.length > 0 ? collaborators : [];
34
- if (!validSearchValue) return validCollaborators;
35
-
36
- // The current character is '@' and the previous character is a null character
37
- const beforeStr = (0, _helper.getPreCharacters)(editor);
38
- const isEmptyStr = beforeStr.slice(-2, -1).trim().length === 0;
39
- if (beforeStr.slice(-1) === '@' && isEmptyStr) {
40
- return validCollaborators;
41
- }
42
- return validCollaborators.filter(collaborator => {
43
- const {
44
- name,
45
- name_pinyin = ''
46
- } = collaborator;
47
- if (name.toString().toLowerCase().indexOf(validSearchValue) > -1) return true;
48
- if (!name_pinyin) return false;
49
- const validNamePinyin = name_pinyin.toString().toLowerCase();
50
- const validSearchPinyinValue = validSearchValue.replace(/ |'/g, '');
51
-
52
- // complete: For example, seatable can be retrieved when searching for sea.
53
- if (validNamePinyin.indexOf(validSearchPinyinValue) > -1) return true;
54
- if (validNamePinyin.replace(/'/g, '').indexOf(validSearchPinyinValue) > -1) return true;
55
- const validNamePinyinList = validNamePinyin.split('\'');
56
- // acronym: For example, sea table can be retrieved when searching for st.
57
- const namePinyinAcronym = validNamePinyinList.map(item => item && item.trim() ? item.trim().slice(0, 1) : '');
58
- if (namePinyinAcronym.join('').indexOf(validSearchPinyinValue) > -1) return true;
59
- return false;
60
- });
61
- };
62
-
63
- // Mailto, file, tel, callto, sms, cid, xmpp, etc. are not support
64
- // const ALLOWED_URL_REG = /((http|https):\/\/[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|])/g;
65
- // export const textToHtml = (text) => {
66
- // if (!text) return '';
67
- // return text.replace(ALLOWED_URL_REG, '<a href="$1" target="_blank" class=' + COMMENT_URL_CLASSNAME + '>$1</a>');
68
- // };
69
- exports.searchCollaborators = searchCollaborators;
70
- const convertComment = value => {
71
- return value.replaceAll('<', '&lt;').replaceAll('>', '&gt;');
72
- };
73
- exports.convertComment = convertComment;
74
- const checkMentionOperation = event => {
75
- const {
76
- keyCode
77
- } = event;
78
- const {
79
- Escape,
80
- LeftArrow,
81
- RightArrow
82
- } = _constants.KeyCodes;
83
- if (keyCode === Escape || keyCode === LeftArrow || keyCode === RightArrow) return false;
84
- return true;
85
- };
86
- exports.checkMentionOperation = checkMentionOperation;
87
- class CommentUtilities {
88
- constructor() {
89
- (0, _defineProperty2.default)(this, "onInsertElement", _ref => {
90
- let {
91
- commentRef,
92
- selection,
93
- range,
94
- content,
95
- nodeType
96
- } = _ref;
97
- if (range) {
98
- selection.removeAllRanges();
99
- selection.addRange(range);
100
- }
101
- return this.createHtmlElement({
102
- commentRef,
103
- selection,
104
- range,
105
- content,
106
- nodeType
107
- });
108
- });
109
- (0, _defineProperty2.default)(this, "getHtmlElement", (nodeType, content) => {
110
- switch (nodeType) {
111
- case 'image':
112
- {
113
- let parentElement = document.createElement('div');
114
- parentElement.className = 'image-container';
115
- parentElement.contentEditable = 'false';
116
- let imageContainer = document.createElement('img');
117
- imageContainer.src = content;
118
- imageContainer.height = 60;
119
- parentElement.appendChild(imageContainer);
120
- return parentElement.outerHTML;
121
- }
122
- default:
123
- {
124
- return '';
125
- }
126
- }
127
- });
128
- (0, _defineProperty2.default)(this, "createHtmlElement", _ref2 => {
129
- let {
130
- commentRef,
131
- selection,
132
- range,
133
- content,
134
- nodeType
135
- } = _ref2;
136
- let spanNode1;
137
- let spanNode2;
138
- let imageContainer;
139
- if (nodeType === 'image') {
140
- spanNode1 = document.createElement('div');
141
- spanNode1.className = 'image-container';
142
- spanNode1.contentEditable = 'false';
143
- imageContainer = document.createElement('img');
144
- imageContainer.src = content;
145
- imageContainer.height = 60;
146
- spanNode1.appendChild(imageContainer);
147
- spanNode2 = document.createElement('span');
148
- spanNode2.innerHTML = ' ';
149
- }
150
- if (nodeType === 'collaborator') {
151
- spanNode1 = document.createElement('span');
152
- spanNode2 = document.createElement('span');
153
- spanNode1.className = 'at-text';
154
- spanNode1.innerHTML = `@${content.name}`;
155
- spanNode2.innerHTML = '&nbsp;';
156
- }
157
- let frag = document.createDocumentFragment();
158
- frag.appendChild(spanNode1);
159
- const lastNode = frag.appendChild(spanNode2);
160
- if (range) {
161
- range.insertNode(frag);
162
- } else {
163
- commentRef.current.appendChild(frag);
164
- range = selection.getRangeAt(0);
165
- }
166
- if (lastNode) {
167
- range = range.cloneRange();
168
- range.setStartAfter(lastNode);
169
- range.collapse(true);
170
- selection.removeAllRanges();
171
- selection.addRange(range);
172
- }
173
- return range;
174
- });
175
- (0, _defineProperty2.default)(this, "onSelectParticipant", _ref3 => {
176
- let {
177
- selection,
178
- range,
179
- participant,
180
- callBack,
181
- commentRef
182
- } = _ref3;
183
- if (range) {
184
- // delete '@xxx';
185
- selection.removeAllRanges();
186
- selection.addRange(range);
187
- const textNode = range.startContainer;
188
- const atIndex = this.getAtIndexWithAnchorPosition(range.startOffset, textNode.data);
189
- if (atIndex > -1) {
190
- range.setStart(textNode, atIndex);
191
- range.setEnd(textNode, range.endOffset);
192
- range.deleteContents();
193
- }
194
- }
195
- let newRange = this.createHtmlElement({
196
- selection,
197
- range,
198
- content: participant,
199
- nodeType: 'collaborator',
200
- commentRef
201
- });
202
- if (callBack) {
203
- callBack();
204
- }
205
- if (commentRef.current) {
206
- commentRef.current.focus();
207
- }
208
- return newRange;
209
- });
210
- /**
211
- * get the index of '@' from anchor position.
212
- * @param {*} anchorPosition '@text|anchor position|'
213
- * @param {*} text '@abc'
214
- * @returns index
215
- * e.g. '@abc|anchor position|' // 0
216
- * '@123 @|anchor position| @abc' // 5
217
- */
218
- (0, _defineProperty2.default)(this, "getAtIndexWithAnchorPosition", (anchorPosition, text) => {
219
- let atIndex = -1;
220
- for (let i = anchorPosition - 1; i > -1; i--) {
221
- if (text[i] === '@') {
222
- atIndex = i;
223
- break;
224
- }
225
- }
226
- return atIndex;
227
- });
228
- (0, _defineProperty2.default)(this, "onPaste", (event, callBack) => {
229
- event.stopPropagation();
230
- let cliperData = (0, _getEventTransfer.default)(event);
231
- if (cliperData.files) {
232
- let file = cliperData.files[0];
233
- let isImage = /image/i.test(file.type);
234
- if (isImage) {
235
- event.preventDefault();
236
- if (callBack) {
237
- callBack(cliperData.files);
238
- }
239
- }
240
- } else {
241
- event.preventDefault();
242
- let text = cliperData.text;
243
- if (document.queryCommandSupported('insertText')) {
244
- document.execCommand('insertText', false, text);
245
- } else {
246
- document.execCommand('paste', false, text);
247
- }
248
- }
249
- });
250
- }
251
- }
252
- exports.CommentUtilities = CommentUtilities;
253
- const focusToCommentElement = (editor, element) => {
254
- const path = (0, _core.findPath)(editor, element);
255
- const endOfFirstNode = _slate.Editor.end(editor, path);
256
- const startOfFirstNode = _slate.Editor.start(editor, path);
257
- const range = {
258
- anchor: [_constants2.ELEMENT_TYPE.LIST_ITEM, _constants2.ELEMENT_TYPE.ORDERED_LIST, _constants2.ELEMENT_TYPE.UNORDERED_LIST].includes(element.type) ? startOfFirstNode : endOfFirstNode,
259
- focus: endOfFirstNode
260
- };
261
- (0, _core.focusEditor)(editor, range);
262
- };
263
- exports.focusToCommentElement = focusToCommentElement;
264
- const getCommentElementById = (elementId, editor) => {
265
- let element = null;
266
- const dom = document.querySelectorAll(`[data-id="${elementId}"]`)[0];
267
- if (dom) {
268
- const slateNode = _slateReact.ReactEditor.toSlateNode(editor, dom);
269
- if (slateNode) {
270
- element = slateNode;
271
- }
272
- }
273
- return element;
274
- };
275
- exports.getCommentElementById = getCommentElementById;
276
- const getEventClassName = e => {
277
- // svg mouseEvent event.target.className is an object
278
- if (!e || !e.target) return '';
279
- return e.target.getAttribute('class') || '';
280
- };
281
- exports.getEventClassName = getEventClassName;
@@ -1,62 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.generatorNotificationKey = exports.createNotify = void 0;
8
- var _dayjs = _interopRequireDefault(require("dayjs"));
9
- var _relativeTime = _interopRequireDefault(require("dayjs/plugin/relativeTime"));
10
- var _context = _interopRequireDefault(require("../../context"));
11
- _dayjs.default.extend(_relativeTime.default);
12
- const PERMISSION_GRANTED = 'granted';
13
- const notify = ($title, $options) => {
14
- const notification = new Notification($title, $options);
15
-
16
- // auto clear notifications
17
- const timer = setTimeout(notification.close.bind(notification), 5000);
18
- notification.onshow = function (event) {
19
- const {
20
- mediaUrl
21
- } = _context.default.getSetting('mediaUrl');
22
- let newAudioElement = document.createElement('audio');
23
- newAudioElement.setAttribute('src', `${mediaUrl}audio/classic.mp3`);
24
- newAudioElement.setAttribute('autoplay', 'autoplay');
25
- newAudioElement.setAttribute('id', 'seatable-audio');
26
- let audioElement = document.getElementById('seatable-audio');
27
- if (audioElement) {
28
- document.body.removeChild(audioElement);
29
- }
30
- document.body.appendChild(newAudioElement);
31
- };
32
- notification.onclose = function () {
33
- clearTimeout(timer);
34
- };
35
- notification.onclick = function () {
36
- notification.close();
37
- };
38
- };
39
- const createNotify = (title, options) => {
40
- // Let's check if the browser supports notifications
41
- if (!('Notification' in window)) {
42
- return false;
43
- }
44
- if (Notification.permission === PERMISSION_GRANTED) {
45
- notify(title, options);
46
- } else {
47
- Notification.requestPermission(res => {
48
- if (res === PERMISSION_GRANTED) {
49
- notify(title, options);
50
- }
51
- });
52
- }
53
- };
54
- exports.createNotify = createNotify;
55
- const generatorNotificationKey = function (commentId) {
56
- let replyId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
57
- const validCommentId = commentId + '';
58
- const validReplyId = replyId + '';
59
- if (!validReplyId) return `sdoc_notification_${validCommentId}`;
60
- return `sdoc_notification_${validCommentId}_${validReplyId}`;
61
- };
62
- exports.generatorNotificationKey = generatorNotificationKey;
@@ -1,104 +0,0 @@
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 _slate = require("@seafile/slate");
11
- var _slateReact = require("@seafile/slate-react");
12
- var _isHotkey = _interopRequireDefault(require("is-hotkey"));
13
- var _scrollIntoViewIfNeeded = _interopRequireDefault(require("scroll-into-view-if-needed"));
14
- var _constants = require("../constants");
15
- var _useCursors = require("../cursor/use-cursors");
16
- var _decorates = require("../decorates");
17
- var _extension = require("../extension");
18
- var _constants2 = require("../extension/constants");
19
- var _renderCommentEditorElement = _interopRequireDefault(require("../extension/render/render-comment-editor-element"));
20
- var _eventBus = _interopRequireDefault(require("../utils/event-bus"));
21
- var _eventHandler = _interopRequireDefault(require("../utils/event-handler"));
22
- const CommentArticle = _ref => {
23
- let {
24
- editor,
25
- slateValue,
26
- updateSlateValue,
27
- type
28
- } = _ref;
29
- const {
30
- cursors
31
- } = (0, _useCursors.useCursors)(editor);
32
- const decorate = (0, _decorates.usePipDecorate)(editor);
33
- // init eventHandler
34
- // eslint-disable-next-line react-hooks/exhaustive-deps
35
- const eventProxy = (0, _react.useMemo)(() => new _eventHandler.default(editor), []);
36
- const onMouseDown = (0, _react.useCallback)(event => {
37
- if (event.button === 0) {
38
- // Compatible with the editor which unload table plugin
39
- editor.reSetTableSelectedRange && editor.reSetTableSelectedRange();
40
- const eventBus = _eventBus.default.getInstance();
41
- eventBus.dispatch(_constants.INTERNAL_EVENT.CANCEL_TABLE_SELECT_RANGE);
42
- }
43
- // eslint-disable-next-line react-hooks/exhaustive-deps
44
- }, []);
45
- const handleScrollIntoView = (0, _react.useCallback)((editor, domRange) => {
46
- try {
47
- const {
48
- selection
49
- } = editor;
50
- // Do not scroll into view, when focus on image
51
- const [imageNodeEntry] = _slate.Editor.nodes(editor, {
52
- match: n => [_constants2.IMAGE, _constants2.IMAGE_BLOCK].includes(n.type),
53
- at: selection
54
- });
55
- if (imageNodeEntry) return;
56
- const focusedNode = _slate.Node.get(editor, selection.focus.path);
57
- const domNode = _slateReact.ReactEditor.toDOMNode(editor, focusedNode);
58
- if (!domNode) return;
59
- (0, _scrollIntoViewIfNeeded.default)(domNode, {
60
- 'scrollMode': 'if-needed'
61
- });
62
- } catch (error) {
63
- //
64
- }
65
- }, []);
66
- const onKeyDown = (0, _react.useCallback)(event => {
67
- if ((0, _isHotkey.default)('enter', event)) {
68
- event.preventDefault();
69
- const eventBus = _eventBus.default.getInstance();
70
- eventBus.dispatch(_constants.INTERNAL_EVENT.COMMENT_EDITOR_POST_COMMENT, event);
71
- return;
72
- }
73
- if ((0, _isHotkey.default)('shift+enter', event)) {
74
- event.preventDefault();
75
- _slate.Editor.insertBreak(editor);
76
- return;
77
- }
78
- eventProxy.onKeyDown(event);
79
- }, [eventProxy, editor]);
80
- return /*#__PURE__*/_react.default.createElement(_slateReact.Slate, {
81
- editor: editor,
82
- value: slateValue,
83
- onChange: updateSlateValue
84
- }, /*#__PURE__*/_react.default.createElement(_slateReact.Editable, {
85
- id: "sdoc-editor",
86
- scrollSelectionIntoView: handleScrollIntoView,
87
- cursors: cursors,
88
- renderElement: props => (0, _renderCommentEditorElement.default)({
89
- ...props,
90
- commentType: type
91
- }),
92
- renderLeaf: _extension.renderLeaf,
93
- onMouseDown: onMouseDown,
94
- decorate: decorate,
95
- onCut: eventProxy.onCut,
96
- onCopy: eventProxy.onCopy,
97
- onCompositionStart: eventProxy.onCompositionStart,
98
- onCompositionUpdate: eventProxy.onCompositionUpdate,
99
- onCompositionEnd: eventProxy.onCompositionEnd,
100
- onKeyDown: onKeyDown,
101
- onBeforeInput: eventProxy.onBeforeInput
102
- }));
103
- };
104
- var _default = exports.default = CommentArticle;
@@ -1,128 +0,0 @@
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 _slate = require("@seafile/slate");
11
- var _deepCopy = _interopRequireDefault(require("deep-copy"));
12
- var _fileLoading = _interopRequireDefault(require("../components/file-loading"));
13
- var _constants = require("../constants");
14
- var _context = _interopRequireDefault(require("../context"));
15
- var _extension = require("../extension");
16
- var _core = require("../extension/core");
17
- var _commentEditorToolbar = _interopRequireDefault(require("../extension/toolbar/comment-editor-toolbar"));
18
- var _useCollaborators = require("../hooks/use-collaborators");
19
- var _useScrollContext = require("../hooks/use-scroll-context");
20
- var _layout = require("../layout");
21
- var _nodeId = _interopRequireDefault(require("../node-id"));
22
- var _socket = require("../socket");
23
- var _commentArticle = _interopRequireDefault(require("./comment-article"));
24
- const SdocCommentEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
25
- let {
26
- editor: propsEditor,
27
- document,
28
- isReloading,
29
- type,
30
- onSubmit,
31
- submitBtnText,
32
- onCancel
33
- } = _ref;
34
- const [slateValue, setSlateValue] = (0, _react.useState)(document.elements);
35
- const commentEditorContainerRef = (0, _react.useRef)(null);
36
- const validEditor = (0, _react.useMemo)(() => {
37
- if (propsEditor) return propsEditor;
38
- const defaultEditor = (0, _extension.createCommentEditor)();
39
- const editorConfig = _context.default.getEditorConfig();
40
- const newEditor = (0, _nodeId.default)((0, _socket.withSocketIO)(defaultEditor, {
41
- document,
42
- config: editorConfig
43
- }));
44
- const {
45
- cursors
46
- } = document;
47
- newEditor.cursors = cursors || {};
48
- newEditor.width = _constants.COMMENT_EDITOR_EDIT_AREA_WIDTH; // default width
49
-
50
- return newEditor;
51
- // eslint-disable-next-line react-hooks/exhaustive-deps
52
- }, []);
53
-
54
- // useMount: focus editor
55
- (0, _react.useEffect)(() => {
56
- const [firstNode] = validEditor.children;
57
- if (firstNode) {
58
- const [firstNodeFirstChild] = firstNode.children;
59
- if (firstNodeFirstChild) {
60
- const endOfFirstNode = _slate.Editor.end(validEditor, [0, 0]);
61
- const range = {
62
- anchor: endOfFirstNode,
63
- focus: endOfFirstNode
64
- };
65
- (0, _core.focusEditor)(validEditor, range);
66
- }
67
- // Force refresh to fix comment list
68
- setSlateValue([...validEditor.children]);
69
- }
70
- // eslint-disable-next-line react-hooks/exhaustive-deps
71
- }, []);
72
-
73
- // The parent component can call the method of this component through ref
74
- (0, _react.useImperativeHandle)(ref, () => ({
75
- setSlateValue: document => {
76
- // Force update of editor's child elements
77
- validEditor.children = document.elements;
78
- setSlateValue([...document.elements]);
79
- },
80
- updateDocumentVersion: document => {
81
- validEditor.updateDocumentVersion(document);
82
- },
83
- // get value
84
- getSlateValue: () => {
85
- return (0, _deepCopy.default)({
86
- ...document,
87
- elements: slateValue
88
- });
89
- }
90
-
91
- // eslint-disable-next-line react-hooks/exhaustive-deps
92
- }), [document, validEditor, slateValue]);
93
- if (isReloading) {
94
- return /*#__PURE__*/_react.default.createElement("div", {
95
- className: "h-100 w-100 d-flex align-items-center justify-content-center"
96
- }, /*#__PURE__*/_react.default.createElement(_fileLoading.default, null));
97
- }
98
- const handleFocusEditor = e => {
99
- if (e.target === commentEditorContainerRef.current) {
100
- const focusPoint = _slate.Editor.end(validEditor, []);
101
- (0, _core.focusEditor)(validEditor, focusPoint);
102
- }
103
- };
104
- return /*#__PURE__*/_react.default.createElement(_layout.EditorContainer, {
105
- editor: validEditor
106
- }, /*#__PURE__*/_react.default.createElement(_useCollaborators.CollaboratorsProvider, null, /*#__PURE__*/_react.default.createElement("div", {
107
- className: "sdoc-comment-editor-wrapper"
108
- }, /*#__PURE__*/_react.default.createElement("div", {
109
- ref: commentEditorContainerRef,
110
- className: "article sdoc-comment-editor",
111
- onClick: handleFocusEditor
112
- }, /*#__PURE__*/_react.default.createElement(_useScrollContext.ScrollContext.Provider, {
113
- value: {
114
- scrollRef: commentEditorContainerRef
115
- }
116
- }, /*#__PURE__*/_react.default.createElement(_commentArticle.default, {
117
- type: type,
118
- editor: validEditor,
119
- slateValue: slateValue,
120
- updateSlateValue: setSlateValue
121
- }))), /*#__PURE__*/_react.default.createElement(_commentEditorToolbar.default, {
122
- editor: validEditor,
123
- onSubmit: onSubmit,
124
- submitBtnText: submitBtnText,
125
- onCancel: onCancel
126
- }))));
127
- });
128
- var _default = exports.default = SdocCommentEditor;
@@ -1,50 +0,0 @@
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 _provider = _interopRequireDefault(require("../comment/provider"));
11
- var _constants = require("../constants");
12
- var _context = _interopRequireDefault(require("../context"));
13
- var _extension = require("../extension");
14
- var _nodeId = _interopRequireDefault(require("../node-id"));
15
- var _rightPanel = _interopRequireDefault(require("../right-panel"));
16
- var _socket = require("../socket");
17
- const SdocEditor = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
18
- let {
19
- editor: propsEditor,
20
- document,
21
- isReloading,
22
- showComment,
23
- isShowHeaderToolbar = true,
24
- showOutline = true
25
- } = _ref;
26
- const validEditor = (0, _react.useMemo)(() => {
27
- if (propsEditor) return propsEditor;
28
- const defaultEditor = (0, _extension.createDefaultEditor)();
29
- const editorConfig = _context.default.getEditorConfig();
30
- const newEditor = (0, _nodeId.default)((0, _socket.withSocketIO)(defaultEditor, {
31
- document,
32
- config: editorConfig
33
- }));
34
- const {
35
- cursors
36
- } = document;
37
- newEditor.cursors = cursors || {};
38
- newEditor.width = _constants.PAGE_EDIT_AREA_WIDTH; // default width
39
- return newEditor;
40
-
41
- // eslint-disable-next-line react-hooks/exhaustive-deps
42
- }, []);
43
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_provider.default, {
44
- children: _rightPanel.default,
45
- editor: validEditor
46
- }, /*#__PURE__*/_react.default.createElement(_rightPanel.default, {
47
- editor: validEditor
48
- })));
49
- });
50
- var _default = exports.default = SdocEditor;
@@ -1,62 +0,0 @@
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.useCollaborators = exports.CollaboratorsProvider = void 0;
9
- var _react = _interopRequireWildcard(require("react"));
10
- var _context = _interopRequireDefault(require("../context"));
11
- var _model = require("../model");
12
- const CollaboratorsContext = /*#__PURE__*/_react.default.createContext(null);
13
- const CollaboratorsProvider = _ref => {
14
- let {
15
- collaborators: propsCollaborators,
16
- children
17
- } = _ref;
18
- const isSdocRevision = _context.default.getSetting('isSdocRevision');
19
- const isPublished = _context.default.getSetting('isPublished');
20
- const [collaborators, setCollaborators] = (0, _react.useState)(propsCollaborators || []);
21
- (0, _react.useEffect)(() => {
22
- if (isSdocRevision && isPublished) return;
23
- if (propsCollaborators) return;
24
- _context.default.listRelatedUsers().then(res => {
25
- const collaborators = [];
26
- res.data.related_users.forEach(user => {
27
- const collaborator = new _model.User(user);
28
- collaborators.push(collaborator);
29
- });
30
- setCollaborators(collaborators);
31
- }).catch(error => {
32
- // eslint-disable-next-line
33
- console.log(error);
34
- });
35
-
36
- // eslint-disable-next-line react-hooks/exhaustive-deps
37
- }, []);
38
- (0, _react.useEffect)(() => {
39
- if (Array.isArray(propsCollaborators) && propsCollaborators.length > 0) {
40
- setCollaborators(propsCollaborators);
41
- }
42
- }, [propsCollaborators]);
43
- return /*#__PURE__*/_react.default.createElement(CollaboratorsContext.Provider, {
44
- value: {
45
- collaborators
46
- }
47
- }, children);
48
- };
49
- exports.CollaboratorsProvider = CollaboratorsProvider;
50
- const useCollaborators = () => {
51
- const context = (0, _react.useContext)(CollaboratorsContext);
52
- if (!context) {
53
- throw new Error('\'CollaboratorsContext\' is null');
54
- }
55
- const {
56
- collaborators
57
- } = context;
58
- return {
59
- collaborators
60
- };
61
- };
62
- exports.useCollaborators = useCollaborators;