@seafile/sdoc-editor 0.1.148 → 0.1.149-beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/sdoc-server-api.js +10 -0
- package/dist/api/seafile-api.js +27 -5
- package/dist/basic-sdk/comment/comment/comment-item-content.js +5 -0
- package/dist/basic-sdk/comment/comment/comment-item-reply.js +3 -0
- package/dist/basic-sdk/comment/comment/global-comment-header.js +5 -2
- package/dist/basic-sdk/comment/comment/global-comment.js +1 -1
- package/dist/basic-sdk/comment/comment/style.css +6 -5
- package/dist/basic-sdk/constants/index.js +20 -1
- package/dist/basic-sdk/editor/common-editor.js +50 -0
- package/dist/basic-sdk/editor/index.css +29 -0
- package/dist/basic-sdk/editor/index.js +129 -0
- package/dist/basic-sdk/{slate-editor.js → editor/slate-editor.js} +21 -16
- package/dist/basic-sdk/extension/constants/element-type.js +4 -1
- package/dist/basic-sdk/extension/core/transforms/replace-node-children.js +26 -0
- package/dist/basic-sdk/extension/render/render-element.js +213 -1
- package/dist/basic-sdk/socket/helpers.js +2 -0
- package/dist/basic-sdk/socket/socket-client.js +38 -0
- package/dist/basic-sdk/socket/socket-manager.js +25 -2
- package/dist/basic-sdk/socket/with-socket-io.js +35 -12
- package/dist/basic-sdk/utils/diff.js +2 -2
- package/dist/basic-sdk/utils/rebase.js +181 -0
- package/dist/basic-sdk/views/diff-viewer.js +3 -1
- package/dist/basic-sdk/views/viewer.js +9 -12
- package/dist/components/doc-operations/index.js +4 -2
- package/dist/components/doc-operations/revision-operations/index.js +5 -2
- package/dist/components/doc-operations/revision-operations/publish-button.js +6 -13
- package/dist/components/tip-dialog/index.js +48 -0
- package/dist/components/tip-dialog/tip-content.js +50 -0
- package/dist/constants/index.js +23 -2
- package/dist/context.js +35 -4
- package/dist/pages/simple-editor.js +255 -83
- package/package.json +1 -1
- package/public/locales/en/sdoc-editor.json +11 -1
- package/public/locales/zh_CN/sdoc-editor.json +10 -1
- package/public/media/sdoc-editor-font/iconfont.eot +0 -0
- package/public/media/sdoc-editor-font/iconfont.svg +4 -0
- package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff +0 -0
- package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
- package/public/media/sdoc-editor-font.css +14 -6
- package/dist/basic-sdk/editor.js +0 -105
|
@@ -1,10 +1,16 @@
|
|
|
1
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
2
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
1
3
|
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
4
|
import React, { useCallback } from 'react';
|
|
3
5
|
import { useSlateStatic } from '@seafile/slate-react';
|
|
6
|
+
import { Transforms } from '@seafile/slate';
|
|
7
|
+
import deepCopy from 'deep-copy';
|
|
8
|
+
import { useTranslation } from 'react-i18next';
|
|
4
9
|
import { BLOCKQUOTE, LINK, CHECK_LIST_ITEM, HEADER1, HEADER2, HEADER3, HEADER4, HEADER5, HEADER6, LIST_ITEM, LIST_LIC, ORDERED_LIST, PARAGRAPH, UNORDERED_LIST, CODE_BLOCK, CODE_LINE, IMAGE, ELEMENT_TYPE, SDOC_LINK, TITLE, SUBTITLE } from '../constants';
|
|
5
10
|
import { BlockquotePlugin, LinkPlugin, CheckListPlugin, HeaderPlugin, ListPlugin, CodeBlockPlugin, ImagePlugin, TablePlugin, SdocLinkPlugin, ParagraphPlugin } from '../plugins';
|
|
6
11
|
import EventBus from '../../utils/event-bus';
|
|
7
|
-
import { INTERNAL_EVENT } from '../../constants';
|
|
12
|
+
import { INTERNAL_EVENT, REBASE_TYPE, REBASE_MARKS, REBASE_MARK_KEY } from '../../constants';
|
|
13
|
+
import { findPath, getNode, replaceNode, generateEmptyElement, deleteNodeMark } from '../../extension/core';
|
|
8
14
|
var CustomElement = function CustomElement(props) {
|
|
9
15
|
var editor = useSlateStatic();
|
|
10
16
|
var element = props.element,
|
|
@@ -140,6 +146,212 @@ var CustomElement = function CustomElement(props) {
|
|
|
140
146
|
}
|
|
141
147
|
};
|
|
142
148
|
var RenderElement = function RenderElement(props) {
|
|
149
|
+
var editor = useSlateStatic();
|
|
150
|
+
var _useTranslation = useTranslation(),
|
|
151
|
+
t = _useTranslation.t;
|
|
152
|
+
var updateParentNodeByPath = useCallback(function (path) {
|
|
153
|
+
var parentPath = path.slice(0, -1);
|
|
154
|
+
var parentNode = getNode(editor, parentPath);
|
|
155
|
+
if (parentNode.children.filter(function (item) {
|
|
156
|
+
return item[REBASE_MARK_KEY.REBASE_TYPE];
|
|
157
|
+
}).length === 0) {
|
|
158
|
+
var newParentElement = _objectSpread({}, parentNode);
|
|
159
|
+
newParentElement[REBASE_MARK_KEY.REBASE_TYPE] && delete newParentElement[REBASE_MARK_KEY.REBASE_TYPE];
|
|
160
|
+
newParentElement[REBASE_MARK_KEY.OLD_ELEMENT] && delete newParentElement[REBASE_MARK_KEY.OLD_ELEMENT];
|
|
161
|
+
newParentElement[REBASE_MARK_KEY.ORIGIN] && delete newParentElement[REBASE_MARK_KEY.ORIGIN];
|
|
162
|
+
newParentElement['children'] = newParentElement['children'].map(function (item) {
|
|
163
|
+
item[REBASE_MARK_KEY.REBASE_TYPE] && delete item[REBASE_MARK_KEY.REBASE_TYPE];
|
|
164
|
+
item[REBASE_MARK_KEY.OLD_ELEMENT] && delete item[REBASE_MARK_KEY.OLD_ELEMENT];
|
|
165
|
+
item[REBASE_MARK_KEY.ORIGIN] && delete item[REBASE_MARK_KEY.ORIGIN];
|
|
166
|
+
return item;
|
|
167
|
+
});
|
|
168
|
+
replaceNode(editor, {
|
|
169
|
+
at: parentPath,
|
|
170
|
+
nodes: newParentElement
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
175
|
+
}, [editor]);
|
|
176
|
+
var deleteElement = useCallback(function (element) {
|
|
177
|
+
var path = findPath(editor, element);
|
|
178
|
+
Transforms.removeNodes(editor, {
|
|
179
|
+
at: path
|
|
180
|
+
});
|
|
181
|
+
if (element.type === ELEMENT_TYPE.LIST_ITEM) {
|
|
182
|
+
updateParentNodeByPath(path);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
186
|
+
}, [editor]);
|
|
187
|
+
var deleteMark = useCallback(function (element) {
|
|
188
|
+
var path = findPath(editor, element);
|
|
189
|
+
deleteNodeMark(editor, path, element, REBASE_MARKS);
|
|
190
|
+
if (element.type === ELEMENT_TYPE.LIST_ITEM) {
|
|
191
|
+
updateParentNodeByPath(path);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
195
|
+
}, [editor]);
|
|
196
|
+
var addDeletedElement = useCallback(function (element) {
|
|
197
|
+
var path = findPath(editor, element);
|
|
198
|
+
deleteNodeMark(editor, path, element, REBASE_MARKS);
|
|
199
|
+
if (element.type !== ELEMENT_TYPE.LIST_ITEM) {
|
|
200
|
+
var emptyNode = generateEmptyElement(ELEMENT_TYPE.PARAGRAPH);
|
|
201
|
+
Transforms.insertNodes(editor, emptyNode, {
|
|
202
|
+
at: [path[0]]
|
|
203
|
+
});
|
|
204
|
+
} else {
|
|
205
|
+
var _emptyNode = generateEmptyElement(ELEMENT_TYPE.LIST_ITEM);
|
|
206
|
+
_emptyNode.children[0] = generateEmptyElement(ELEMENT_TYPE.LIST_LIC);
|
|
207
|
+
var parentPath = path.slice(0, -1);
|
|
208
|
+
var parentNode = getNode(editor, parentPath);
|
|
209
|
+
var newChildren = _toConsumableArray(parentNode.children);
|
|
210
|
+
var index = path[path.length - 1];
|
|
211
|
+
newChildren.splice(index, 0, _emptyNode);
|
|
212
|
+
replaceNode(editor, {
|
|
213
|
+
at: parentPath,
|
|
214
|
+
nodes: _objectSpread(_objectSpread({}, parentNode), {}, {
|
|
215
|
+
children: newChildren
|
|
216
|
+
})
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
if (element.type === ELEMENT_TYPE.LIST_ITEM) {
|
|
220
|
+
updateParentNodeByPath(path);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
224
|
+
}, [editor]);
|
|
225
|
+
var useMasterChanges = useCallback(function (element) {
|
|
226
|
+
var path = findPath(editor, element);
|
|
227
|
+
deleteNodeMark(editor, path, element[REBASE_MARK_KEY.OLD_ELEMENT], REBASE_MARKS);
|
|
228
|
+
var nextElementPath = _toConsumableArray(path);
|
|
229
|
+
nextElementPath[path.length - 1] = path[path.length - 1] + 1;
|
|
230
|
+
Transforms.removeNodes(editor, {
|
|
231
|
+
at: nextElementPath
|
|
232
|
+
});
|
|
233
|
+
if (element.type === ELEMENT_TYPE.LIST_ITEM) {
|
|
234
|
+
updateParentNodeByPath(path);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
238
|
+
}, [editor]);
|
|
239
|
+
var useCurrentChanges = useCallback(function (element) {
|
|
240
|
+
var path = findPath(editor, element);
|
|
241
|
+
var currentElementPath = _toConsumableArray(path);
|
|
242
|
+
currentElementPath[path.length - 1] = path[path.length - 1] + 1;
|
|
243
|
+
var currentElement = getNode(editor, currentElementPath);
|
|
244
|
+
var newCurrentElement = deepCopy(currentElement);
|
|
245
|
+
deleteNodeMark(editor, currentElementPath, newCurrentElement, REBASE_MARKS);
|
|
246
|
+
Transforms.removeNodes(editor, {
|
|
247
|
+
at: path
|
|
248
|
+
});
|
|
249
|
+
if (element.type === ELEMENT_TYPE.LIST_ITEM) {
|
|
250
|
+
updateParentNodeByPath(path);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
254
|
+
}, [editor]);
|
|
255
|
+
var useBothChanges = useCallback(function (element) {
|
|
256
|
+
// delete element marks
|
|
257
|
+
var path = findPath(editor, element);
|
|
258
|
+
deleteNodeMark(editor, path, element, REBASE_MARKS);
|
|
259
|
+
|
|
260
|
+
// delete next element marks
|
|
261
|
+
var nextElementPath = [].concat(_toConsumableArray(path.slice(0, -1)), [path[path.length - 1] + 1]);
|
|
262
|
+
var nextElement = getNode(editor, nextElementPath);
|
|
263
|
+
deleteNodeMark(editor, nextElementPath, nextElement, REBASE_MARKS);
|
|
264
|
+
if (element.type === ELEMENT_TYPE.LIST_ITEM) {
|
|
265
|
+
updateParentNodeByPath(path);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
269
|
+
}, [editor]);
|
|
270
|
+
var element = props.element;
|
|
271
|
+
var rebaseType = element[REBASE_MARK_KEY.REBASE_TYPE];
|
|
272
|
+
if (!rebaseType) {
|
|
273
|
+
return /*#__PURE__*/React.createElement(CustomElement, props);
|
|
274
|
+
}
|
|
275
|
+
if (rebaseType === REBASE_TYPE.DELETE_MODIFY) {
|
|
276
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
277
|
+
className: "w-100 d-flex sdoc-rebase-btn-group",
|
|
278
|
+
contentEditable: false
|
|
279
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
280
|
+
className: "sdoc-rebase-btn",
|
|
281
|
+
onClick: function onClick() {
|
|
282
|
+
return deleteElement(element);
|
|
283
|
+
}
|
|
284
|
+
}, t('Keep_other_modification')), /*#__PURE__*/React.createElement("div", {
|
|
285
|
+
className: "mr-2 ml-2"
|
|
286
|
+
}, '|'), /*#__PURE__*/React.createElement("div", {
|
|
287
|
+
className: "sdoc-rebase-btn",
|
|
288
|
+
onClick: function onClick() {
|
|
289
|
+
return deleteMark(element);
|
|
290
|
+
}
|
|
291
|
+
}, t('Keep_my_modification')), /*#__PURE__*/React.createElement("div", {
|
|
292
|
+
className: "mr-2 ml-2"
|
|
293
|
+
}, '|'), /*#__PURE__*/React.createElement("div", {
|
|
294
|
+
className: "sdoc-rebase-btn",
|
|
295
|
+
onClick: function onClick() {
|
|
296
|
+
return addDeletedElement(element);
|
|
297
|
+
}
|
|
298
|
+
}, t('Keep_both_modification'))), /*#__PURE__*/React.createElement("div", {
|
|
299
|
+
className: "w-100 sdoc-rebase-current-changes-start",
|
|
300
|
+
contentEditable: false
|
|
301
|
+
}, '<<<<<<<'), /*#__PURE__*/React.createElement("div", {
|
|
302
|
+
className: "w-100",
|
|
303
|
+
contentEditable: false
|
|
304
|
+
}, '======='), /*#__PURE__*/React.createElement("div", {
|
|
305
|
+
className: "w-100 sdoc-rebase-incoming-changes",
|
|
306
|
+
contentEditable: false
|
|
307
|
+
}, /*#__PURE__*/React.createElement(CustomElement, props)), /*#__PURE__*/React.createElement("div", {
|
|
308
|
+
className: "w-100 sdoc-rebase-incoming-changes-end",
|
|
309
|
+
contentEditable: false
|
|
310
|
+
}, '>>>>>>>'));
|
|
311
|
+
}
|
|
312
|
+
if (rebaseType === REBASE_TYPE.MODIFY_MODIFY) {
|
|
313
|
+
if (element[REBASE_MARK_KEY.ORIGIN] === 'master') {
|
|
314
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
315
|
+
className: "w-100 d-flex sdoc-rebase-btn-group",
|
|
316
|
+
contentEditable: false
|
|
317
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
318
|
+
className: "sdoc-rebase-btn",
|
|
319
|
+
onClick: function onClick() {
|
|
320
|
+
return useMasterChanges(element);
|
|
321
|
+
}
|
|
322
|
+
}, t('Keep_other_modification')), /*#__PURE__*/React.createElement("div", {
|
|
323
|
+
className: "mr-2 ml-2"
|
|
324
|
+
}, '|'), /*#__PURE__*/React.createElement("div", {
|
|
325
|
+
className: "sdoc-rebase-btn",
|
|
326
|
+
onClick: function onClick() {
|
|
327
|
+
return useCurrentChanges(element);
|
|
328
|
+
}
|
|
329
|
+
}, t('Keep_my_modification')), /*#__PURE__*/React.createElement("div", {
|
|
330
|
+
className: "mr-2 ml-2"
|
|
331
|
+
}, '|'), /*#__PURE__*/React.createElement("div", {
|
|
332
|
+
className: "sdoc-rebase-btn",
|
|
333
|
+
onClick: function onClick() {
|
|
334
|
+
return useBothChanges(element);
|
|
335
|
+
}
|
|
336
|
+
}, t('Keep_both_modification'))), /*#__PURE__*/React.createElement("div", {
|
|
337
|
+
className: "w-100 sdoc-rebase-current-changes-start",
|
|
338
|
+
contentEditable: false
|
|
339
|
+
}, '<<<<<<<'), /*#__PURE__*/React.createElement("div", {
|
|
340
|
+
className: "w-100 sdoc-rebase-current-changes",
|
|
341
|
+
contentEditable: false
|
|
342
|
+
}, /*#__PURE__*/React.createElement(CustomElement, props)));
|
|
343
|
+
}
|
|
344
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
|
|
345
|
+
className: "w-100",
|
|
346
|
+
contentEditable: false
|
|
347
|
+
}, '======='), /*#__PURE__*/React.createElement("div", {
|
|
348
|
+
className: "w-100 sdoc-rebase-incoming-changes",
|
|
349
|
+
contentEditable: false
|
|
350
|
+
}, /*#__PURE__*/React.createElement(CustomElement, props)), /*#__PURE__*/React.createElement("div", {
|
|
351
|
+
className: "w-100 sdoc-rebase-incoming-changes-end",
|
|
352
|
+
contentEditable: false
|
|
353
|
+
}, '>>>>>>>'));
|
|
354
|
+
}
|
|
143
355
|
return /*#__PURE__*/React.createElement(CustomElement, props);
|
|
144
356
|
|
|
145
357
|
// const { element } = props;
|
|
@@ -4,6 +4,7 @@ import { Editor, Operation } from '@seafile/slate';
|
|
|
4
4
|
import { getNode } from '../extension/core';
|
|
5
5
|
import * as OPERATION from '../node-id/constants';
|
|
6
6
|
import { setCursor } from '../cursor/helper';
|
|
7
|
+
import { MODE } from '../../constants';
|
|
7
8
|
export var getNodePathById = function getNodePathById(rootNode, nodeId) {
|
|
8
9
|
var path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
9
10
|
if (rootNode.id === nodeId) return path;
|
|
@@ -252,6 +253,7 @@ export var reExecRevertOperationList = function reExecRevertOperationList(editor
|
|
|
252
253
|
}
|
|
253
254
|
};
|
|
254
255
|
export var syncRemoteOperations = function syncRemoteOperations(editor, remoteOperations) {
|
|
256
|
+
if (editor.mode !== MODE.EDITOR) return;
|
|
255
257
|
if (remoteOperations.length === 0) return;
|
|
256
258
|
Editor.withoutNormalizing(editor, function () {
|
|
257
259
|
for (var i = 0; i < remoteOperations.length; i++) {
|
|
@@ -119,6 +119,38 @@ var SocketClient = /*#__PURE__*/_createClass(function SocketClient(config) {
|
|
|
119
119
|
this.disconnectWithServer = function () {
|
|
120
120
|
_this.socket.disconnect();
|
|
121
121
|
};
|
|
122
|
+
this.sendPublishDocument = function (originDocUuid, originDocName, isNeedUpdateOriginDoc, callback) {
|
|
123
|
+
_this.socket.emit('publish-document', _this.getParams({
|
|
124
|
+
origin_doc_uuid: originDocUuid,
|
|
125
|
+
origin_doc_name: originDocName,
|
|
126
|
+
update_origin_doc: isNeedUpdateOriginDoc
|
|
127
|
+
}), function (result) {
|
|
128
|
+
callback && callback(result);
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
this.receivePublishDocument = function () {
|
|
132
|
+
var socketManager = SocketManager.getInstance();
|
|
133
|
+
socketManager.receivePublishDocument();
|
|
134
|
+
};
|
|
135
|
+
this.receivePublishDocumentError = function () {
|
|
136
|
+
var socketManager = SocketManager.getInstance();
|
|
137
|
+
socketManager.receivePublishDocumentError();
|
|
138
|
+
};
|
|
139
|
+
this.sendReplaceDocument = function (document, callback) {
|
|
140
|
+
_this.socket.emit('replace-document', _this.getParams({
|
|
141
|
+
document: document
|
|
142
|
+
}), function (result) {
|
|
143
|
+
callback && callback(result);
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
this.receiveDocumentReplaced = function () {
|
|
147
|
+
var socketManager = SocketManager.getInstance();
|
|
148
|
+
socketManager.receiveDocumentReplaced();
|
|
149
|
+
};
|
|
150
|
+
this.receiveDocumentReplacedError = function () {
|
|
151
|
+
var socketManager = SocketManager.getInstance();
|
|
152
|
+
socketManager.receiveDocumentReplacedError();
|
|
153
|
+
};
|
|
122
154
|
this.config = config;
|
|
123
155
|
this.isReconnect = false;
|
|
124
156
|
this.socket = io(config.sdocServer, {
|
|
@@ -133,6 +165,12 @@ var SocketClient = /*#__PURE__*/_createClass(function SocketClient(config) {
|
|
|
133
165
|
this.socket.on('join-room', this.onJoinRoom);
|
|
134
166
|
this.socket.on('leave-room', this.onLeaveRoom);
|
|
135
167
|
this.socket.on('update-document', this.onReceiveRemoteOperations);
|
|
168
|
+
|
|
169
|
+
// doc-replaced
|
|
170
|
+
this.socket.on('doc-replaced', this.receiveDocumentReplaced);
|
|
171
|
+
this.socket.on('doc-replaced-error', this.receiveDocumentReplacedError);
|
|
172
|
+
this.socket.on('publish-document', this.receivePublishDocument);
|
|
173
|
+
this.socket.on('publish-document-error', this.receivePublishDocumentError);
|
|
136
174
|
this.socket.on('update-cursor', this.receiveCursorLocation);
|
|
137
175
|
this.socket.io.on('reconnect', this.onReconnect);
|
|
138
176
|
this.socket.io.on('reconnect_attempt', this.onReconnectAttempt);
|
|
@@ -7,6 +7,7 @@ import { syncRemoteOperations, reExecRevertOperationList, revertOperationList, s
|
|
|
7
7
|
import SocketClient from './socket-client';
|
|
8
8
|
import { clientDebug, conflictDebug, serverDebug, stateDebug } from '../utils/debug';
|
|
9
9
|
import { deleteCursor } from '../cursor/helper';
|
|
10
|
+
import { EXTERNAL_EVENT, MODE } from '../../constants';
|
|
10
11
|
|
|
11
12
|
// idle --> sending --> conflict --> idle
|
|
12
13
|
// --> conflict --> idle
|
|
@@ -19,13 +20,34 @@ var STATE = {
|
|
|
19
20
|
DISCONNECT: 'disconnect',
|
|
20
21
|
NEED_RELOAD: 'need_reload'
|
|
21
22
|
};
|
|
22
|
-
var SocketManager = /*#__PURE__*/_createClass(function SocketManager(editor,
|
|
23
|
+
var SocketManager = /*#__PURE__*/_createClass(function SocketManager(editor, _document, config) {
|
|
23
24
|
var _this = this;
|
|
24
25
|
_classCallCheck(this, SocketManager);
|
|
25
26
|
this.getDocumentVersion = function () {
|
|
26
27
|
var version = _this.document.version;
|
|
27
28
|
return version;
|
|
28
29
|
};
|
|
30
|
+
this.sendPublishDocument = function (originDocUuid, originDocName, isNeedUpdateOriginDoc) {
|
|
31
|
+
_this.socketClient.sendPublishDocument(originDocUuid, originDocName, isNeedUpdateOriginDoc);
|
|
32
|
+
};
|
|
33
|
+
this.receivePublishDocument = function () {
|
|
34
|
+
_this.eventBus.dispatch(EXTERNAL_EVENT.PUBLISH_DOCUMENT);
|
|
35
|
+
};
|
|
36
|
+
this.receivePublishDocumentError = function () {
|
|
37
|
+
_this.eventBus.dispatch(EXTERNAL_EVENT.PUBLISH_DOCUMENT_ERROR);
|
|
38
|
+
};
|
|
39
|
+
this.sendReplaceDocument = function (document) {
|
|
40
|
+
_this.socketClient.sendReplaceDocument(document, function (result) {
|
|
41
|
+
var serverVersion = result.version;
|
|
42
|
+
_this.document['version'] = serverVersion;
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
this.receiveDocumentReplaced = function () {
|
|
46
|
+
_this.eventBus.dispatch(EXTERNAL_EVENT.DOCUMENT_REPLACED);
|
|
47
|
+
};
|
|
48
|
+
this.receiveDocumentReplacedError = function () {
|
|
49
|
+
_this.eventBus.dispatch(EXTERNAL_EVENT.DOCUMENT_REPLACED_ERROR);
|
|
50
|
+
};
|
|
29
51
|
this.onReceiveLocalOperations = function (operations) {
|
|
30
52
|
_this.pendingOperationList.push(operations);
|
|
31
53
|
if (_this.pendingOperationList.length > 5) {
|
|
@@ -34,6 +56,7 @@ var SocketManager = /*#__PURE__*/_createClass(function SocketManager(editor, doc
|
|
|
34
56
|
_this.sendOperations();
|
|
35
57
|
};
|
|
36
58
|
this.sendOperations = function () {
|
|
59
|
+
if (_this.editor.mode !== MODE.EDITOR) return;
|
|
37
60
|
if (_this.state !== STATE.IDLE) return;
|
|
38
61
|
stateDebug("State changed: ".concat(_this.state, " -> ").concat(STATE.SENDING));
|
|
39
62
|
_this.state = STATE.SENDING;
|
|
@@ -292,7 +315,7 @@ var SocketManager = /*#__PURE__*/_createClass(function SocketManager(editor, doc
|
|
|
292
315
|
_this.socketClient.disconnectWithServer();
|
|
293
316
|
};
|
|
294
317
|
this.editor = editor;
|
|
295
|
-
this.document =
|
|
318
|
+
this.document = _document;
|
|
296
319
|
this.socketClient = new SocketClient(config);
|
|
297
320
|
this.pendingOperationList = []; // Two-dimensional arrays: [operations, operations, ...]
|
|
298
321
|
this.remoteOperationsList = []; // Same with pending operations
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MODE } from '../../constants';
|
|
1
2
|
import { generateCursorData } from '../cursor/helper';
|
|
2
3
|
import EventBus from '../utils/event-bus';
|
|
3
4
|
import SocketManager from './socket-manager';
|
|
@@ -19,28 +20,50 @@ var withSocketIO = function withSocketIO(editor, options) {
|
|
|
19
20
|
SocketManager.destroy();
|
|
20
21
|
};
|
|
21
22
|
newEditor.onChange = function () {
|
|
22
|
-
|
|
23
|
+
var document = options.document,
|
|
24
|
+
config = options.config;
|
|
25
|
+
if (newEditor.mode === MODE.DIFF_VIEWER) return;
|
|
23
26
|
var operations = newEditor.operations;
|
|
24
27
|
if (!newEditor.isRemote && operations.length > 0) {
|
|
25
28
|
var isAllSetSelection = operations.every(function (operation) {
|
|
26
29
|
return operation.type === 'set_selection';
|
|
27
30
|
});
|
|
28
|
-
var _socketManager = SocketManager.getInstance();
|
|
31
|
+
var _socketManager = SocketManager.getInstance(newEditor, document, config);
|
|
29
32
|
if (!isAllSetSelection) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
if (newEditor.mode === MODE.EDITOR) {
|
|
34
|
+
// get update content value operations
|
|
35
|
+
var updateOperations = operations.filter(function (operation) {
|
|
36
|
+
return operation.type !== 'set_selection';
|
|
37
|
+
});
|
|
38
|
+
_socketManager.onReceiveLocalOperations(updateOperations);
|
|
39
|
+
}
|
|
35
40
|
}
|
|
36
|
-
|
|
41
|
+
if (newEditor.mode === MODE.EDITOR) {
|
|
42
|
+
_socketManager.sendCursorLocation(editor.selection);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (newEditor.mode === MODE.EDITOR) {
|
|
46
|
+
// dispatch editor change event
|
|
47
|
+
var eventBus = EventBus.getInstance(newEditor, document, config);
|
|
48
|
+
eventBus.dispatch('change');
|
|
37
49
|
}
|
|
38
|
-
|
|
39
|
-
// dispatch editor change event
|
|
40
|
-
var eventBus = EventBus.getInstance();
|
|
41
|
-
eventBus.dispatch('change');
|
|
42
50
|
onChange();
|
|
43
51
|
};
|
|
52
|
+
newEditor.rebaseContent = function (document, originFileVersion) {
|
|
53
|
+
var config = options.config;
|
|
54
|
+
var socketManager = SocketManager.getInstance(newEditor, document, config);
|
|
55
|
+
socketManager.sendRebaseContent(document, originFileVersion);
|
|
56
|
+
};
|
|
57
|
+
newEditor.publishDocument = function (originDocUuid, originDocName, isNeedUpdateOriginDoc) {
|
|
58
|
+
var config = options.config;
|
|
59
|
+
var socketManager = SocketManager.getInstance(newEditor, document, config);
|
|
60
|
+
socketManager.sendPublishDocument(originDocUuid, originDocName, isNeedUpdateOriginDoc);
|
|
61
|
+
};
|
|
62
|
+
newEditor.replaceDocument = function (document) {
|
|
63
|
+
var config = options.config;
|
|
64
|
+
var socketManager = SocketManager.getInstance(newEditor, document, config);
|
|
65
|
+
socketManager.sendReplaceDocument(document);
|
|
66
|
+
};
|
|
44
67
|
return newEditor;
|
|
45
68
|
};
|
|
46
69
|
export default withSocketIO;
|
|
@@ -31,7 +31,7 @@ var generatorDiffElement = function generatorDiffElement(element, diffType) {
|
|
|
31
31
|
return generatorDiffElement(item, diffType, style);
|
|
32
32
|
})), _objectSpread3));
|
|
33
33
|
};
|
|
34
|
-
var generateIdMapAndIds = function generateIdMapAndIds(elements) {
|
|
34
|
+
export var generateIdMapAndIds = function generateIdMapAndIds(elements) {
|
|
35
35
|
var map = {};
|
|
36
36
|
var ids = [];
|
|
37
37
|
if (!Array.isArray(elements) || elements.length === 0) return {
|
|
@@ -54,7 +54,7 @@ var hasChildren = function hasChildren(element) {
|
|
|
54
54
|
};
|
|
55
55
|
|
|
56
56
|
// id diffs
|
|
57
|
-
var getIdDiffs = function getIdDiffs(oldIds, newIds) {
|
|
57
|
+
export var getIdDiffs = function getIdDiffs(oldIds, newIds) {
|
|
58
58
|
var diff = new DiffText(oldIds, newIds);
|
|
59
59
|
return diff.getDiffs();
|
|
60
60
|
};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
3
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
4
|
+
import { generateIdMapAndIds, getIdDiffs } from './diff';
|
|
5
|
+
import ObjectUtils from './object-utils';
|
|
6
|
+
import { MODIFY_TYPE, REBASE_TYPE, REBASE_MARK_KEY } from '../constants';
|
|
7
|
+
import { ELEMENT_TYPE } from '../extension/constants';
|
|
8
|
+
import { replaceNodeId } from '../node-id/helpers';
|
|
9
|
+
var getRevisionChanges = function getRevisionChanges(masterContent, currentContent) {
|
|
10
|
+
var _generateIdMapAndIds = generateIdMapAndIds(currentContent.children),
|
|
11
|
+
currentContentMap = _generateIdMapAndIds.map,
|
|
12
|
+
currentIds = _generateIdMapAndIds.ids;
|
|
13
|
+
var _generateIdMapAndIds2 = generateIdMapAndIds(masterContent.children),
|
|
14
|
+
masterContentMap = _generateIdMapAndIds2.map,
|
|
15
|
+
masterIds = _generateIdMapAndIds2.ids;
|
|
16
|
+
var idDiffs = getIdDiffs(masterIds, currentIds);
|
|
17
|
+
var content = [];
|
|
18
|
+
idDiffs.forEach(function (idDiff) {
|
|
19
|
+
var value = idDiff.value,
|
|
20
|
+
added = idDiff.added,
|
|
21
|
+
removed = idDiff.removed;
|
|
22
|
+
if (added) {
|
|
23
|
+
var addedList = value.map(function (item) {
|
|
24
|
+
return _objectSpread(_objectSpread({}, currentContentMap[item]), {}, _defineProperty({}, REBASE_MARK_KEY.MODIFY_TYPE, MODIFY_TYPE.ADD));
|
|
25
|
+
});
|
|
26
|
+
content.push.apply(content, _toConsumableArray(addedList));
|
|
27
|
+
} else if (removed) {
|
|
28
|
+
var deletedList = value.map(function (item) {
|
|
29
|
+
return _objectSpread(_objectSpread({}, masterContentMap[item]), {}, _defineProperty({}, REBASE_MARK_KEY.MODIFY_TYPE, MODIFY_TYPE.DELETE));
|
|
30
|
+
});
|
|
31
|
+
content.push.apply(content, _toConsumableArray(deletedList));
|
|
32
|
+
} else {
|
|
33
|
+
value.forEach(function (elementId) {
|
|
34
|
+
if (ObjectUtils.isSameObject(masterContentMap[elementId], currentContentMap[elementId])) {
|
|
35
|
+
content.push(currentContentMap[elementId]);
|
|
36
|
+
} else {
|
|
37
|
+
var _objectSpread4;
|
|
38
|
+
var oldElement = masterContentMap[elementId];
|
|
39
|
+
var currentElement = currentContentMap[elementId];
|
|
40
|
+
var newElement = _objectSpread(_objectSpread({}, currentElement), {}, (_objectSpread4 = {}, _defineProperty(_objectSpread4, REBASE_MARK_KEY.MODIFY_TYPE, MODIFY_TYPE.MODIFY), _defineProperty(_objectSpread4, REBASE_MARK_KEY.OLD_ELEMENT, oldElement), _objectSpread4));
|
|
41
|
+
if (currentElement.type === oldElement.type) {
|
|
42
|
+
var elementType = currentElement.type;
|
|
43
|
+
if ([ELEMENT_TYPE.UNORDERED_LIST, ELEMENT_TYPE.ORDERED_LIST].includes(elementType)) {
|
|
44
|
+
var listContent = getRevisionChanges(oldElement, currentElement);
|
|
45
|
+
newElement[REBASE_MARK_KEY.MODIFY_TYPE] = MODIFY_TYPE.CHILDREN_MODIFY;
|
|
46
|
+
newElement['children'] = listContent;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
content.push(newElement);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return content;
|
|
55
|
+
};
|
|
56
|
+
var getMasterChanges = function getMasterChanges(masterContent, revisionChanges) {
|
|
57
|
+
var canMerge = true;
|
|
58
|
+
var _generateIdMapAndIds3 = generateIdMapAndIds(revisionChanges),
|
|
59
|
+
currentContentMap = _generateIdMapAndIds3.map,
|
|
60
|
+
currentIds = _generateIdMapAndIds3.ids;
|
|
61
|
+
var _generateIdMapAndIds4 = generateIdMapAndIds(masterContent.children),
|
|
62
|
+
masterContentMap = _generateIdMapAndIds4.map,
|
|
63
|
+
masterIds = _generateIdMapAndIds4.ids;
|
|
64
|
+
var idDiffs = getIdDiffs(masterIds, currentIds);
|
|
65
|
+
var content = [];
|
|
66
|
+
idDiffs.forEach(function (idDiff) {
|
|
67
|
+
var value = idDiff.value,
|
|
68
|
+
added = idDiff.added,
|
|
69
|
+
removed = idDiff.removed;
|
|
70
|
+
if (added) {
|
|
71
|
+
value.forEach(function (elementId) {
|
|
72
|
+
var element = currentContentMap[elementId];
|
|
73
|
+
var newElement = {
|
|
74
|
+
id: element.id,
|
|
75
|
+
children: element.children,
|
|
76
|
+
type: element.type
|
|
77
|
+
};
|
|
78
|
+
// The content has been deleted from the master, but this branch has been modified. At this time, rebase is required, and the user needs to confirm the selected content
|
|
79
|
+
// ==> delete | use modification
|
|
80
|
+
if (element[REBASE_MARK_KEY.MODIFY_TYPE] === MODIFY_TYPE.MODIFY) {
|
|
81
|
+
newElement[REBASE_MARK_KEY.REBASE_TYPE] = REBASE_TYPE.DELETE_MODIFY;
|
|
82
|
+
content.push(newElement);
|
|
83
|
+
canMerge = false;
|
|
84
|
+
} else {
|
|
85
|
+
// new direct append
|
|
86
|
+
content.push(newElement);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
} else if (removed) {
|
|
90
|
+
var deletedList = value.map(function (item) {
|
|
91
|
+
return _objectSpread({}, masterContentMap[item]);
|
|
92
|
+
});
|
|
93
|
+
content.push.apply(content, _toConsumableArray(deletedList));
|
|
94
|
+
} else {
|
|
95
|
+
value.forEach(function (elementId) {
|
|
96
|
+
var currentElement = currentContentMap[elementId];
|
|
97
|
+
var masterElement = masterContentMap[elementId];
|
|
98
|
+
|
|
99
|
+
// Unchanged
|
|
100
|
+
if (ObjectUtils.isSameObject(masterElement, currentElement)) {
|
|
101
|
+
content.push(currentElement);
|
|
102
|
+
|
|
103
|
+
// The content of the master branch is modified in the current branch, but the content of the master branch is the same as that of origin
|
|
104
|
+
} else if (ObjectUtils.isSameObject(masterElement, currentElement[REBASE_MARK_KEY.OLD_ELEMENT])) {
|
|
105
|
+
var newElement = _objectSpread({}, currentElement);
|
|
106
|
+
newElement[REBASE_MARK_KEY.OLD_ELEMENT] && delete newElement[REBASE_MARK_KEY.OLD_ELEMENT];
|
|
107
|
+
newElement[REBASE_MARK_KEY.MODIFY_TYPE] && delete newElement[REBASE_MARK_KEY.MODIFY_TYPE];
|
|
108
|
+
content.push(newElement);
|
|
109
|
+
|
|
110
|
+
// Modify at the same time
|
|
111
|
+
} else if (currentElement[REBASE_MARK_KEY.MODIFY_TYPE] === MODIFY_TYPE.MODIFY) {
|
|
112
|
+
var _objectSpread5, _objectSpread6;
|
|
113
|
+
var oldMasterElement = replaceNodeId(_objectSpread(_objectSpread({}, masterElement), {}, (_objectSpread5 = {}, _defineProperty(_objectSpread5, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.MODIFY_MODIFY), _defineProperty(_objectSpread5, REBASE_MARK_KEY.ORIGIN, 'master'), _defineProperty(_objectSpread5, REBASE_MARK_KEY.OLD_ELEMENT, masterElement), _objectSpread5)));
|
|
114
|
+
content.push(oldMasterElement);
|
|
115
|
+
var _newElement = _objectSpread(_objectSpread({}, currentElement), {}, (_objectSpread6 = {}, _defineProperty(_objectSpread6, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.MODIFY_MODIFY), _defineProperty(_objectSpread6, REBASE_MARK_KEY.ORIGIN, 'current'), _objectSpread6));
|
|
116
|
+
_newElement[REBASE_MARK_KEY.MODIFY_TYPE] && delete _newElement[REBASE_MARK_KEY.MODIFY_TYPE];
|
|
117
|
+
_newElement[REBASE_MARK_KEY.OLD_ELEMENT] && delete _newElement[REBASE_MARK_KEY.OLD_ELEMENT];
|
|
118
|
+
content.push(_newElement);
|
|
119
|
+
canMerge = false;
|
|
120
|
+
|
|
121
|
+
// children modify
|
|
122
|
+
} else if (currentElement[REBASE_MARK_KEY.MODIFY_TYPE] === MODIFY_TYPE.CHILDREN_MODIFY) {
|
|
123
|
+
canMerge = false;
|
|
124
|
+
if (currentElement.type === masterElement.type) {
|
|
125
|
+
var _getMasterChanges = getMasterChanges(masterElement, currentElement.children),
|
|
126
|
+
childrenContent = _getMasterChanges.content;
|
|
127
|
+
content.push(_objectSpread(_objectSpread({}, masterElement), {}, _defineProperty({
|
|
128
|
+
children: childrenContent
|
|
129
|
+
}, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.CHILDREN_MODIFY)));
|
|
130
|
+
} else {
|
|
131
|
+
var _objectSpread8, _objectSpread9;
|
|
132
|
+
var _oldMasterElement = replaceNodeId(_objectSpread(_objectSpread({}, masterElement), {}, (_objectSpread8 = {}, _defineProperty(_objectSpread8, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.MODIFY_MODIFY), _defineProperty(_objectSpread8, REBASE_MARK_KEY.ORIGIN, 'master'), _defineProperty(_objectSpread8, REBASE_MARK_KEY.OLD_ELEMENT, masterElement), _objectSpread8)));
|
|
133
|
+
content.push(_oldMasterElement);
|
|
134
|
+
var _newElement2 = _objectSpread(_objectSpread({}, currentElement[REBASE_MARK_KEY.OLD_ELEMENT]), {}, (_objectSpread9 = {}, _defineProperty(_objectSpread9, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.MODIFY_MODIFY), _defineProperty(_objectSpread9, REBASE_MARK_KEY.ORIGIN, 'current'), _objectSpread9));
|
|
135
|
+
content.push(_newElement2);
|
|
136
|
+
}
|
|
137
|
+
} else {
|
|
138
|
+
var _newElement3 = _objectSpread({}, currentElement);
|
|
139
|
+
_newElement3[REBASE_MARK_KEY.OLD_ELEMENT] && delete _newElement3[REBASE_MARK_KEY.OLD_ELEMENT];
|
|
140
|
+
_newElement3[REBASE_MARK_KEY.MODIFY_TYPE] && delete _newElement3[REBASE_MARK_KEY.MODIFY_TYPE];
|
|
141
|
+
content.push(_newElement3);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
return {
|
|
147
|
+
content: content,
|
|
148
|
+
canMerge: canMerge
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
export var getRebase = function getRebase(masterContent, revisionMasterContent, revisionCurrentContent) {
|
|
152
|
+
// master no changes, merged directly
|
|
153
|
+
if (masterContent.version === revisionMasterContent.version) {
|
|
154
|
+
return {
|
|
155
|
+
canMerge: true,
|
|
156
|
+
isNeedReplaceMaster: true,
|
|
157
|
+
value: revisionCurrentContent
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// The revision content has not changed
|
|
162
|
+
if (revisionMasterContent.version === revisionCurrentContent.version) {
|
|
163
|
+
return {
|
|
164
|
+
canMerge: true,
|
|
165
|
+
isNeedReplaceMaster: false,
|
|
166
|
+
value: masterContent
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
var revisionChanges = getRevisionChanges(revisionMasterContent, revisionCurrentContent);
|
|
170
|
+
var _getMasterChanges2 = getMasterChanges(masterContent, revisionChanges),
|
|
171
|
+
canMerge = _getMasterChanges2.canMerge,
|
|
172
|
+
content = _getMasterChanges2.content;
|
|
173
|
+
return {
|
|
174
|
+
canMerge: canMerge,
|
|
175
|
+
isNeedReplaceMaster: true,
|
|
176
|
+
value: _objectSpread(_objectSpread({}, revisionCurrentContent), {}, {
|
|
177
|
+
children: content,
|
|
178
|
+
version: Math.max(masterContent.version, revisionCurrentContent.version) + 1
|
|
179
|
+
})
|
|
180
|
+
};
|
|
181
|
+
};
|
|
@@ -6,7 +6,8 @@ import { ELEMENT_TYPE, ADDED_STYLE, DELETED_STYLE } from '../extension/constants
|
|
|
6
6
|
import SDocViewer from './viewer';
|
|
7
7
|
import '../../assets/css/diff-viewer.css';
|
|
8
8
|
var DiffViewer = function DiffViewer(_ref) {
|
|
9
|
-
var
|
|
9
|
+
var editor = _ref.editor,
|
|
10
|
+
currentContent = _ref.currentContent,
|
|
10
11
|
lastContent = _ref.lastContent,
|
|
11
12
|
didMountCallback = _ref.didMountCallback,
|
|
12
13
|
showToolbar = _ref.showToolbar,
|
|
@@ -38,6 +39,7 @@ var DiffViewer = function DiffViewer(_ref) {
|
|
|
38
39
|
return renderElement(props, editor);
|
|
39
40
|
}, []);
|
|
40
41
|
return /*#__PURE__*/React.createElement(SDocViewer, {
|
|
42
|
+
editor: editor,
|
|
41
43
|
showToolbar: showToolbar,
|
|
42
44
|
showOutline: showOutline,
|
|
43
45
|
document: {
|