@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.
- package/README.md +2 -4
- package/dist/basic-sdk/assets/css/layout.css +1 -45
- package/dist/basic-sdk/assets/css/sdoc-comment-editor-plugin.css +4 -4
- package/dist/basic-sdk/comment/utils.js +39 -0
- package/dist/basic-sdk/constants/index.js +1 -2
- package/dist/basic-sdk/context.js +9 -8
- package/dist/basic-sdk/editor/comment-editor.css +138 -0
- package/dist/basic-sdk/editor/comment-editor.js +289 -0
- package/dist/basic-sdk/extension/plugins/image/helpers.js +1 -1
- package/dist/basic-sdk/extension/plugins/image/use-copy-image.js +1 -1
- package/dist/basic-sdk/extension/plugins/image/use-upload-image.js +2 -1
- package/dist/basic-sdk/extension/plugins/link/menu/index.js +1 -1
- package/dist/basic-sdk/extension/plugins/mention/render-elem/participant-popover.js +3 -6
- package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +1 -2
- package/dist/basic-sdk/extension/render/render-comment-editor-element.js +1 -1
- package/dist/basic-sdk/extension/toolbar/comment-editor-toolbar/index.js +3 -3
- package/dist/basic-sdk/extension/toolbar/comment-editor-toolbar/post-comment/index.js +2 -2
- package/dist/basic-sdk/hooks/use-comment.js +53 -0
- package/dist/basic-sdk/index.js +12 -39
- package/dist/pages/seafile-comment-editor.js +30 -54
- package/package.json +2 -1
- package/dist/assets/css/plugin-editor.css +0 -7
- package/dist/assets/css/simple-viewer.css +0 -6
- package/dist/basic-sdk/comment/components/comment-all-participants/index.css +0 -83
- package/dist/basic-sdk/comment/components/comment-all-participants/index.js +0 -67
- package/dist/basic-sdk/comment/components/comment-all-participants/participant-avatar.js +0 -43
- package/dist/basic-sdk/comment/components/comment-context-menu/index.css +0 -16
- package/dist/basic-sdk/comment/components/comment-context-menu/index.js +0 -43
- package/dist/basic-sdk/comment/components/comment-context-menu/menu-item.js +0 -57
- package/dist/basic-sdk/comment/components/comment-delete-popover.js +0 -80
- package/dist/basic-sdk/comment/components/comment-editor.js +0 -165
- package/dist/basic-sdk/comment/components/comment-item-collapse-wrapper.js +0 -160
- package/dist/basic-sdk/comment/components/comment-item-content.js +0 -156
- package/dist/basic-sdk/comment/components/comment-item-reply.js +0 -124
- package/dist/basic-sdk/comment/components/comment-item-resolved-reply.js +0 -38
- package/dist/basic-sdk/comment/components/comment-item-wrapper.js +0 -368
- package/dist/basic-sdk/comment/components/comment-list.css +0 -422
- package/dist/basic-sdk/comment/components/comment-list.js +0 -216
- package/dist/basic-sdk/comment/components/comment-operation/index.css +0 -26
- package/dist/basic-sdk/comment/components/comment-operation/index.js +0 -31
- package/dist/basic-sdk/comment/components/comment-participants-editor/index.css +0 -132
- package/dist/basic-sdk/comment/components/comment-participants-editor/index.js +0 -69
- package/dist/basic-sdk/comment/components/comment-participants-editor/searched-collaborators.js +0 -62
- package/dist/basic-sdk/comment/components/comment-participants-editor/selected-participants.js +0 -48
- package/dist/basic-sdk/comment/components/editor-comment.js +0 -183
- package/dist/basic-sdk/comment/components/elements-comment-count/element-comment-count.js +0 -64
- package/dist/basic-sdk/comment/components/elements-comment-count/index.css +0 -29
- package/dist/basic-sdk/comment/components/elements-comment-count/index.js +0 -49
- package/dist/basic-sdk/comment/components/global-comment/global-comment-body-header.js +0 -87
- package/dist/basic-sdk/comment/components/global-comment/global-comment-editor.js +0 -36
- package/dist/basic-sdk/comment/components/global-comment/global-comment-header.js +0 -82
- package/dist/basic-sdk/comment/components/global-comment/index.css +0 -326
- package/dist/basic-sdk/comment/components/global-comment/index.js +0 -212
- package/dist/basic-sdk/comment/components/index.js +0 -21
- package/dist/basic-sdk/comment/components/style.css +0 -40
- package/dist/basic-sdk/comment/helper.js +0 -184
- package/dist/basic-sdk/comment/hooks/comment-hooks/use-comment-context.js +0 -20
- package/dist/basic-sdk/comment/hooks/comment-hooks/use-comment-list.js +0 -45
- package/dist/basic-sdk/comment/hooks/comment-hooks/use-comment-mount.js +0 -58
- package/dist/basic-sdk/comment/hooks/notification-hooks/index.js +0 -25
- package/dist/basic-sdk/comment/hooks/notification-hooks/use-notification-context.js +0 -20
- package/dist/basic-sdk/comment/hooks/notification-hooks/use-notification-mount.js +0 -74
- package/dist/basic-sdk/comment/hooks/use-participants.js +0 -26
- package/dist/basic-sdk/comment/index.js +0 -67
- package/dist/basic-sdk/comment/provider/comment-context-provider.js +0 -37
- package/dist/basic-sdk/comment/provider/index.js +0 -23
- package/dist/basic-sdk/comment/provider/notification-context-provider.js +0 -31
- package/dist/basic-sdk/comment/provider/participants-content-provider.js +0 -96
- package/dist/basic-sdk/comment/reducer/comment-reducer.js +0 -353
- package/dist/basic-sdk/comment/reducer/notification-reducer.js +0 -89
- package/dist/basic-sdk/comment/utils/get-event-transfer.js +0 -77
- package/dist/basic-sdk/comment/utils/index.js +0 -281
- package/dist/basic-sdk/comment/utils/notification-utils.js +0 -62
- package/dist/basic-sdk/editor/comment-article.js +0 -104
- package/dist/basic-sdk/editor/sdoc-comment-editor.js +0 -128
- package/dist/basic-sdk/editor/sdoc-editor.js +0 -50
- package/dist/basic-sdk/hooks/use-collaborators.js +0 -62
- package/dist/basic-sdk/hooks/use-plugins.js +0 -9
- package/dist/basic-sdk/layout/article-container.js +0 -89
- package/dist/basic-sdk/layout/editor-container.js +0 -32
- package/dist/basic-sdk/layout/index.js +0 -20
- package/dist/basic-sdk/right-panel/index.css +0 -15
- package/dist/basic-sdk/right-panel/index.js +0 -86
- package/dist/basic-sdk/right-panel/resize-width/index.css +0 -38
- package/dist/basic-sdk/right-panel/resize-width/index.js +0 -132
- package/dist/basic-sdk/socket/helpers.js +0 -299
- package/dist/basic-sdk/socket/index.js +0 -20
- package/dist/basic-sdk/socket/socket-client.js +0 -211
- package/dist/basic-sdk/socket/socket-manager.js +0 -386
- package/dist/basic-sdk/socket/with-socket-io.js +0 -73
- package/dist/hooks/index.js +0 -12
- package/dist/hooks/use-document.js +0 -75
- /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('<', '<').replaceAll('>', '>');
|
|
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 = ' ';
|
|
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;
|