@seafile/sdoc-editor 0.1.152 → 0.1.154-beta

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 (39) hide show
  1. package/dist/api/sdoc-server-api.js +10 -0
  2. package/dist/api/seafile-api.js +17 -9
  3. package/dist/basic-sdk/constants/index.js +25 -1
  4. package/dist/basic-sdk/editor/common-editor.js +50 -0
  5. package/dist/basic-sdk/editor/index.css +29 -0
  6. package/dist/basic-sdk/editor/index.js +129 -0
  7. package/dist/basic-sdk/{slate-editor.js → editor/slate-editor.js} +21 -16
  8. package/dist/basic-sdk/extension/constants/diff-view.js +14 -0
  9. package/dist/basic-sdk/extension/constants/element-type.js +3 -23
  10. package/dist/basic-sdk/extension/constants/index.js +8 -229
  11. package/dist/basic-sdk/extension/constants/menus-config.js +234 -0
  12. package/dist/basic-sdk/extension/core/transforms/replace-node-children.js +26 -0
  13. package/dist/basic-sdk/extension/plugins/check-list/menu/index.js +2 -2
  14. package/dist/basic-sdk/extension/plugins/markdown/plugin.js +7 -7
  15. package/dist/basic-sdk/extension/plugins/table/constants/index.js +5 -1
  16. package/dist/basic-sdk/extension/plugins/table/render/render-cell.js +2 -3
  17. package/dist/basic-sdk/extension/plugins/text-align/helpers.js +3 -3
  18. package/dist/basic-sdk/extension/plugins/text-style/menu/index.js +4 -4
  19. package/dist/basic-sdk/extension/render/render-element.js +247 -1
  20. package/dist/basic-sdk/socket/helpers.js +2 -0
  21. package/dist/basic-sdk/socket/socket-client.js +45 -0
  22. package/dist/basic-sdk/socket/socket-manager.js +28 -2
  23. package/dist/basic-sdk/socket/with-socket-io.js +35 -12
  24. package/dist/basic-sdk/utils/diff.js +4 -3
  25. package/dist/basic-sdk/utils/rebase.js +228 -0
  26. package/dist/basic-sdk/views/diff-viewer.js +3 -1
  27. package/dist/basic-sdk/views/viewer.js +9 -12
  28. package/dist/components/doc-operations/index.js +4 -2
  29. package/dist/components/doc-operations/revision-operations/index.js +5 -2
  30. package/dist/components/doc-operations/revision-operations/publish-button.js +6 -13
  31. package/dist/components/tip-dialog/index.js +48 -0
  32. package/dist/components/tip-dialog/tip-content.js +47 -0
  33. package/dist/constants/index.js +23 -2
  34. package/dist/context.js +34 -9
  35. package/dist/pages/simple-editor.js +250 -83
  36. package/package.json +1 -1
  37. package/public/locales/en/sdoc-editor.json +11 -1
  38. package/public/locales/zh_CN/sdoc-editor.json +10 -1
  39. package/dist/basic-sdk/editor.js +0 -105
@@ -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,45 @@ 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 (success) {
128
+ callback && callback(success);
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
+ };
154
+ this.sendSaveDocument = function (callback) {
155
+ _this.socket.emit('save-document', _this.getParams({
156
+ document: document
157
+ }), function (saveFlag) {
158
+ callback && callback(saveFlag);
159
+ });
160
+ };
122
161
  this.config = config;
123
162
  this.isReconnect = false;
124
163
  this.socket = io(config.sdocServer, {
@@ -133,6 +172,12 @@ var SocketClient = /*#__PURE__*/_createClass(function SocketClient(config) {
133
172
  this.socket.on('join-room', this.onJoinRoom);
134
173
  this.socket.on('leave-room', this.onLeaveRoom);
135
174
  this.socket.on('update-document', this.onReceiveRemoteOperations);
175
+
176
+ // doc-replaced
177
+ this.socket.on('doc-replaced', this.receiveDocumentReplaced);
178
+ this.socket.on('doc-replaced-error', this.receiveDocumentReplacedError);
179
+ this.socket.on('publish-document', this.receivePublishDocument);
180
+ this.socket.on('publish-document-error', this.receivePublishDocumentError);
136
181
  this.socket.on('update-cursor', this.receiveCursorLocation);
137
182
  this.socket.io.on('reconnect', this.onReconnect);
138
183
  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,37 @@ var STATE = {
19
20
  DISCONNECT: 'disconnect',
20
21
  NEED_RELOAD: 'need_reload'
21
22
  };
22
- var SocketManager = /*#__PURE__*/_createClass(function SocketManager(editor, document, config) {
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, callback) {
31
+ _this.socketClient.sendPublishDocument(originDocUuid, originDocName, isNeedUpdateOriginDoc, callback);
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
+ };
51
+ this.sendSaveDocument = function (callback) {
52
+ _this.socketClient.sendSaveDocument(callback);
53
+ };
29
54
  this.onReceiveLocalOperations = function (operations) {
30
55
  _this.pendingOperationList.push(operations);
31
56
  if (_this.pendingOperationList.length > 5) {
@@ -34,6 +59,7 @@ var SocketManager = /*#__PURE__*/_createClass(function SocketManager(editor, doc
34
59
  _this.sendOperations();
35
60
  };
36
61
  this.sendOperations = function () {
62
+ if (_this.editor.mode !== MODE.EDITOR) return;
37
63
  if (_this.state !== STATE.IDLE) return;
38
64
  stateDebug("State changed: ".concat(_this.state, " -> ").concat(STATE.SENDING));
39
65
  _this.state = STATE.SENDING;
@@ -292,7 +318,7 @@ var SocketManager = /*#__PURE__*/_createClass(function SocketManager(editor, doc
292
318
  _this.socketClient.disconnectWithServer();
293
319
  };
294
320
  this.editor = editor;
295
- this.document = document;
321
+ this.document = _document;
296
322
  this.socketClient = new SocketClient(config);
297
323
  this.pendingOperationList = []; // Two-dimensional arrays: [operations, operations, ...]
298
324
  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
- if (newEditor.readonly) return;
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
- // get update content value operations
31
- var updateOperations = operations.filter(function (operation) {
32
- return operation.type !== 'set_selection';
33
- });
34
- _socketManager.onReceiveLocalOperations(updateOperations);
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
- _socketManager.sendCursorLocation(editor.selection);
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, callback) {
58
+ var config = options.config;
59
+ var socketManager = SocketManager.getInstance(newEditor, document, config);
60
+ socketManager.sendPublishDocument(originDocUuid, originDocName, isNeedUpdateOriginDoc, callback);
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
  };
@@ -288,4 +288,5 @@ export var getDiff = function getDiff() {
288
288
  changes: []
289
289
  };
290
290
  return getElementDiffValue(currentContent, oldContent);
291
- };
291
+ };
292
+ window.getIdDiffs = getIdDiffs;
@@ -0,0 +1,228 @@
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, REBASE_ORIGIN } from '../constants';
7
+ import { ELEMENT_TYPE } from '../extension/constants';
8
+ import { replaceNodeId } from '../node-id/helpers';
9
+ export var hasConflict = function hasConflict(content) {
10
+ if (!Array.isArray(content) || content.length === 0) return false;
11
+ return content.filter(function (item) {
12
+ return item.rebase_type;
13
+ }).length !== 0;
14
+ };
15
+ var getChanges = function getChanges(masterContent, revisionContent) {
16
+ var _generateIdMapAndIds = generateIdMapAndIds(masterContent.children),
17
+ masterContentMap = _generateIdMapAndIds.map,
18
+ masterIds = _generateIdMapAndIds.ids;
19
+ var _generateIdMapAndIds2 = generateIdMapAndIds(revisionContent.children),
20
+ currentContentMap = _generateIdMapAndIds2.map,
21
+ currentIds = _generateIdMapAndIds2.ids;
22
+ var idDiffs = getIdDiffs(masterIds, currentIds);
23
+ var content = [];
24
+ idDiffs.forEach(function (idDiff) {
25
+ var value = idDiff.value,
26
+ added = idDiff.added,
27
+ removed = idDiff.removed;
28
+ if (added) {
29
+ var addedList = value.map(function (item) {
30
+ return _objectSpread(_objectSpread({}, currentContentMap[item]), {}, _defineProperty({}, REBASE_MARK_KEY.MODIFY_TYPE, MODIFY_TYPE.ADD));
31
+ });
32
+ content.push.apply(content, _toConsumableArray(addedList));
33
+ } else if (removed) {
34
+ var deletedList = value.map(function (item) {
35
+ return _objectSpread(_objectSpread({}, masterContentMap[item]), {}, _defineProperty({}, REBASE_MARK_KEY.MODIFY_TYPE, MODIFY_TYPE.DELETE));
36
+ });
37
+ content.push.apply(content, _toConsumableArray(deletedList));
38
+ } else {
39
+ value.forEach(function (elementId) {
40
+ if (ObjectUtils.isSameObject(masterContentMap[elementId], currentContentMap[elementId])) {
41
+ content.push(currentContentMap[elementId]);
42
+ } else {
43
+ var _objectSpread4;
44
+ var oldElement = masterContentMap[elementId];
45
+ var currentElement = currentContentMap[elementId];
46
+ 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));
47
+ if (currentElement.type === oldElement.type) {
48
+ var elementType = currentElement.type;
49
+ if ([ELEMENT_TYPE.UNORDERED_LIST, ELEMENT_TYPE.ORDERED_LIST].includes(elementType)) {
50
+ var listContent = getChanges(oldElement, currentElement);
51
+ newElement[REBASE_MARK_KEY.MODIFY_TYPE] = MODIFY_TYPE.CHILDREN_MODIFY;
52
+ newElement['children'] = listContent;
53
+ }
54
+ }
55
+ content.push(newElement);
56
+ }
57
+ });
58
+ }
59
+ });
60
+ return content;
61
+ };
62
+ var getMergeElement = function getMergeElement(diffElement, baseElement) {
63
+ var modifyType = diffElement[REBASE_MARK_KEY.MODIFY_TYPE];
64
+
65
+ // revision 没有该元素,master 有该元素
66
+ if (modifyType === MODIFY_TYPE.DELETE) {
67
+ // baseContent没有该元素,说明是 master 新增的,需要保留,不计入冲突
68
+ if (!baseElement) {
69
+ var _newElement = _objectSpread({}, diffElement);
70
+ _newElement[REBASE_MARK_KEY.MODIFY_TYPE] && delete _newElement[REBASE_MARK_KEY.MODIFY_TYPE];
71
+ return [_newElement];
72
+ }
73
+
74
+ // baseContent有该元素, master 对其进行了修改,说明 revision 将其删除了, 用户手动选择冲突
75
+ if (!ObjectUtils.isSameObject(baseElement, diffElement, [REBASE_MARK_KEY.MODIFY_TYPE])) {
76
+ var _newElement2 = _objectSpread({}, diffElement);
77
+ _newElement2[REBASE_MARK_KEY.MODIFY_TYPE] && delete _newElement2[REBASE_MARK_KEY.MODIFY_TYPE];
78
+ _newElement2[REBASE_MARK_KEY.REBASE_TYPE] = REBASE_TYPE.MODIFY_DELETE;
79
+ return [_newElement2];
80
+ }
81
+
82
+ // baseContent有该元素,master 没有对其进行了修改, 说明 revision 将其删除了,程序删除,不计入冲突
83
+ return [];
84
+ }
85
+
86
+ // revision 有该元素,master 没有该元素
87
+ if (modifyType === MODIFY_TYPE.ADD) {
88
+ // baseContent没有该元素,说明是 revision 新增的,需要保留,不计入冲突
89
+ if (!baseElement) {
90
+ var _newElement3 = _objectSpread({}, diffElement);
91
+ _newElement3[REBASE_MARK_KEY.MODIFY_TYPE] && delete _newElement3[REBASE_MARK_KEY.MODIFY_TYPE];
92
+ return [_newElement3];
93
+ }
94
+
95
+ // master 将其删除了, revision 对其进行了修改, 用户手动选择冲突
96
+ if (!ObjectUtils.isSameObject(baseElement, diffElement, [REBASE_MARK_KEY.MODIFY_TYPE])) {
97
+ var _newElement4 = _objectSpread({}, diffElement);
98
+ _newElement4[REBASE_MARK_KEY.MODIFY_TYPE] && delete _newElement4[REBASE_MARK_KEY.MODIFY_TYPE];
99
+ _newElement4[REBASE_MARK_KEY.REBASE_TYPE] = REBASE_TYPE.DELETE_MODIFY;
100
+ return [_newElement4];
101
+ }
102
+
103
+ // master 将其删除了, revision 没有对其进行了修改, 程序删除,不计入冲突
104
+ return [];
105
+ }
106
+
107
+ // revision 和 master 有差异的元素
108
+ if (modifyType === MODIFY_TYPE.MODIFY) {
109
+ var _objectSpread7, _objectSpread8;
110
+ var revisionElement = _objectSpread({}, diffElement);
111
+ var masterElement = _objectSpread({}, diffElement[REBASE_MARK_KEY.OLD_ELEMENT]);
112
+ delete revisionElement[REBASE_MARK_KEY.MODIFY_TYPE];
113
+ delete revisionElement[REBASE_MARK_KEY.OLD_ELEMENT];
114
+
115
+ // revision 和 master 同时新增了一个元素,但且内容不一样。 ===》 目前这种情况不存在,仅存在理论阶段
116
+ if (!baseElement) {
117
+ var _objectSpread5, _objectSpread6;
118
+ return [_objectSpread(_objectSpread({}, replaceNodeId(masterElement)), {}, (_objectSpread5 = {}, _defineProperty(_objectSpread5, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.MODIFY_MODIFY), _defineProperty(_objectSpread5, REBASE_MARK_KEY.OLD_ELEMENT, masterElement), _defineProperty(_objectSpread5, REBASE_MARK_KEY.ORIGIN, REBASE_ORIGIN.OTHER), _objectSpread5)), _objectSpread(_objectSpread({}, revisionElement), {}, (_objectSpread6 = {}, _defineProperty(_objectSpread6, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.MODIFY_MODIFY), _defineProperty(_objectSpread6, REBASE_MARK_KEY.ORIGIN, REBASE_ORIGIN.MY), _objectSpread6))];
119
+ }
120
+
121
+ // master 和 base 一样,说明 revision 对内容进行了修改
122
+ if (ObjectUtils.isSameObject(masterElement, baseElement)) {
123
+ return [revisionElement];
124
+ }
125
+
126
+ // revision 和 base 一样,说明 master 对内容进行了修改
127
+ if (ObjectUtils.isSameObject(revisionElement, baseElement)) {
128
+ return [masterElement];
129
+ }
130
+
131
+ // 都不一样,revision 和 master 同时修改了,有冲突,需要手动解决冲突
132
+ return [_objectSpread(_objectSpread({}, replaceNodeId(masterElement)), {}, (_objectSpread7 = {}, _defineProperty(_objectSpread7, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.MODIFY_MODIFY), _defineProperty(_objectSpread7, REBASE_MARK_KEY.OLD_ELEMENT, masterElement), _defineProperty(_objectSpread7, REBASE_MARK_KEY.ORIGIN, REBASE_ORIGIN.OTHER), _objectSpread7)), _objectSpread(_objectSpread({}, revisionElement), {}, (_objectSpread8 = {}, _defineProperty(_objectSpread8, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.MODIFY_MODIFY), _defineProperty(_objectSpread8, REBASE_MARK_KEY.ORIGIN, REBASE_ORIGIN.MY), _objectSpread8))];
133
+ }
134
+ if (modifyType === MODIFY_TYPE.CHILDREN_MODIFY) {
135
+ var _revisionElement = _objectSpread({}, diffElement);
136
+ var _masterElement = _objectSpread({}, diffElement[REBASE_MARK_KEY.OLD_ELEMENT]);
137
+ delete _revisionElement[REBASE_MARK_KEY.MODIFY_TYPE];
138
+ delete _revisionElement[REBASE_MARK_KEY.OLD_ELEMENT];
139
+
140
+ // revision 和 master 同时新增了一个元素,但且内容不一样。 ===》 目前这种情况不存在,仅存在理论阶段
141
+ if (!baseElement) {
142
+ var _objectSpread9, _objectSpread10;
143
+ return [_objectSpread(_objectSpread({}, replaceNodeId(_masterElement)), {}, (_objectSpread9 = {}, _defineProperty(_objectSpread9, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.MODIFY_MODIFY), _defineProperty(_objectSpread9, REBASE_MARK_KEY.OLD_ELEMENT, _masterElement), _defineProperty(_objectSpread9, REBASE_MARK_KEY.ORIGIN, REBASE_ORIGIN.OTHER), _objectSpread9)), _objectSpread(_objectSpread({}, _revisionElement), {}, (_objectSpread10 = {}, _defineProperty(_objectSpread10, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.MODIFY_MODIFY), _defineProperty(_objectSpread10, REBASE_MARK_KEY.ORIGIN, REBASE_ORIGIN.MY), _objectSpread10))];
144
+ }
145
+
146
+ // master 和 base 一样,说明 revision 对内容进行了修改
147
+ if (ObjectUtils.isSameObject(_masterElement, baseElement)) {
148
+ return [_revisionElement];
149
+ }
150
+
151
+ // revision 和 base 一样,说明 master 对内容进行了修改
152
+ if (ObjectUtils.isSameObject(_revisionElement, baseElement)) {
153
+ return [_masterElement];
154
+ }
155
+ if (ObjectUtils.isSameObject(_masterElement, _revisionElement, ['type'])) {
156
+ // master 和 base 一样,说明 revision 对内容进行了修改
157
+ if (ObjectUtils.isSameObject(_masterElement, baseElement, ['type'])) {
158
+ return [_revisionElement];
159
+ }
160
+
161
+ // revision 和 base 一样,说明 master 对内容进行了修改
162
+ if (ObjectUtils.isSameObject(_revisionElement, baseElement, ['type'])) {
163
+ return [_masterElement];
164
+ }
165
+ }
166
+
167
+ // 子节点内容更改了,需要 手动解决
168
+ var _getMergeContent = getMergeContent(baseElement, diffElement.children),
169
+ childrenContent = _getMergeContent.content;
170
+ return [_objectSpread(_objectSpread({}, _revisionElement), {}, _defineProperty({
171
+ children: childrenContent
172
+ }, REBASE_MARK_KEY.REBASE_TYPE, REBASE_TYPE.CHILDREN_MODIFY))];
173
+ }
174
+ var newElement = _objectSpread({}, diffElement);
175
+ newElement[REBASE_MARK_KEY.MODIFY_TYPE] && delete newElement[REBASE_MARK_KEY.MODIFY_TYPE];
176
+ newElement[REBASE_MARK_KEY.OLD_ELEMENT] && delete newElement[REBASE_MARK_KEY.OLD_ELEMENT];
177
+ return [newElement];
178
+ };
179
+ var getMergeContent = function getMergeContent(baseContent, diffChanges) {
180
+ var _generateIdMapAndIds3 = generateIdMapAndIds(diffChanges),
181
+ diffChangesContentMap = _generateIdMapAndIds3.map,
182
+ diffChangesContentIds = _generateIdMapAndIds3.ids;
183
+ var _generateIdMapAndIds4 = generateIdMapAndIds(baseContent.children),
184
+ baseContentMap = _generateIdMapAndIds4.map;
185
+ var content = [];
186
+ diffChangesContentIds.forEach(function (elementId) {
187
+ var diffElement = diffChangesContentMap[elementId];
188
+ var baseElement = baseContentMap[elementId];
189
+ var mergeElements = getMergeElement(diffElement, baseElement);
190
+ content.push.apply(content, _toConsumableArray(mergeElements));
191
+ });
192
+ var canMerge = !hasConflict(content);
193
+ return {
194
+ content: content,
195
+ canMerge: canMerge
196
+ };
197
+ };
198
+ export var getRebase = function getRebase(masterContent, baseContent, revisionContent) {
199
+ // master no changes, merged directly
200
+ if (masterContent.version === baseContent.version) {
201
+ return {
202
+ canMerge: true,
203
+ isNeedReplaceMaster: true,
204
+ value: revisionContent
205
+ };
206
+ }
207
+
208
+ // The revision content has not changed
209
+ if (baseContent.version === revisionContent.version) {
210
+ return {
211
+ canMerge: true,
212
+ isNeedReplaceMaster: false,
213
+ value: masterContent
214
+ };
215
+ }
216
+ var diffChanges = getChanges(masterContent, revisionContent);
217
+ var _getMergeContent2 = getMergeContent(baseContent, diffChanges),
218
+ canMerge = _getMergeContent2.canMerge,
219
+ content = _getMergeContent2.content;
220
+ return {
221
+ canMerge: canMerge,
222
+ isNeedReplaceMaster: true,
223
+ value: _objectSpread(_objectSpread({}, revisionContent), {}, {
224
+ children: content,
225
+ version: Math.max(masterContent.version, revisionContent.version) + 1
226
+ })
227
+ };
228
+ };
@@ -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 currentContent = _ref.currentContent,
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: {
@@ -1,4 +1,4 @@
1
- import React, { Fragment, useMemo } from 'react';
1
+ import React, { Fragment } from 'react';
2
2
  import { Editable, Slate } from '@seafile/slate-react';
3
3
  import { renderLeaf as _renderLeaf, renderElement as _renderElement, createDefaultEditor } from '../extension';
4
4
  import withNodeId from '../node-id';
@@ -8,18 +8,15 @@ import { usePipDecorate } from '../decorates';
8
8
  import { ArticleContainer, EditorContainer, EditorContent } from '../layout';
9
9
  import '../assets/css/simple-viewer.css';
10
10
  var SDocViewer = function SDocViewer(_ref) {
11
- var document = _ref.document,
11
+ var editor = _ref.editor,
12
+ document = _ref.document,
12
13
  customRenderLeaf = _ref.renderLeaf,
13
14
  customRenderElement = _ref.renderElement,
14
15
  showToolbar = _ref.showToolbar,
15
16
  showOutline = _ref.showOutline;
16
- var editor = useMemo(function () {
17
- var defaultEditor = createDefaultEditor();
18
- return withNodeId(defaultEditor);
19
- }, []);
20
- editor.readonly = true;
17
+ var validEditor = editor || withNodeId(createDefaultEditor());
21
18
  var slateValue = (document || generateDefaultDocContent()).children;
22
- var decorate = usePipDecorate(editor);
19
+ var decorate = usePipDecorate(validEditor);
23
20
  return /*#__PURE__*/React.createElement(EditorContainer, {
24
21
  editor: editor,
25
22
  showToolbar: showToolbar,
@@ -29,19 +26,19 @@ var SDocViewer = function SDocViewer(_ref) {
29
26
  readonly: true,
30
27
  showOutline: showOutline
31
28
  }, /*#__PURE__*/React.createElement(Slate, {
32
- editor: editor,
29
+ editor: validEditor,
33
30
  value: slateValue
34
31
  }, /*#__PURE__*/React.createElement(ArticleContainer, {
35
- editor: editor,
32
+ editor: validEditor,
36
33
  readOnly: true
37
34
  }, /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(SetNodeToDecorations, null), /*#__PURE__*/React.createElement(Editable, {
38
35
  readOnly: true,
39
36
  placeholder: "",
40
37
  renderElement: function renderElement(props) {
41
- return (customRenderElement || _renderElement)(props, editor);
38
+ return (customRenderElement || _renderElement)(props, validEditor);
42
39
  },
43
40
  renderLeaf: function renderLeaf(props) {
44
- return (customRenderLeaf || _renderLeaf)(props, editor);
41
+ return (customRenderLeaf || _renderLeaf)(props, validEditor);
45
42
  },
46
43
  onDOMBeforeInput: function onDOMBeforeInput(event) {},
47
44
  decorate: decorate
@@ -11,14 +11,16 @@ import './style.css';
11
11
  var DocOperations = function DocOperations(_ref) {
12
12
  var isShowChanges = _ref.isShowChanges,
13
13
  changes = _ref.changes,
14
- toggleViewChanges = _ref.toggleViewChanges;
14
+ toggleViewChanges = _ref.toggleViewChanges,
15
+ publishRevision = _ref.publishRevision;
15
16
  var isSdocRevision = context.getSetting('isSdocRevision');
16
17
  return /*#__PURE__*/React.createElement("div", {
17
18
  className: "doc-ops"
18
19
  }, /*#__PURE__*/React.createElement(RevisionOperations, {
19
20
  isShowChanges: isShowChanges,
20
21
  changes: changes,
21
- toggleViewChanges: toggleViewChanges
22
+ toggleViewChanges: toggleViewChanges,
23
+ publishRevision: publishRevision
22
24
  }), /*#__PURE__*/React.createElement(CommentsOperation, null), !isSdocRevision && /*#__PURE__*/React.createElement(ShareOperation, null), /*#__PURE__*/React.createElement(HistoryOperation, null), /*#__PURE__*/React.createElement(CollaboratorsOperation, null), !isSdocRevision && /*#__PURE__*/React.createElement(MoreOperations, null));
23
25
  };
24
26
  export default withTranslation('sdoc-editor')(DocOperations);
@@ -8,7 +8,8 @@ import ChangesCount from './changes-count';
8
8
  var RevisionOperations = function RevisionOperations(_ref) {
9
9
  var isShowChanges = _ref.isShowChanges,
10
10
  changes = _ref.changes,
11
- toggleViewChanges = _ref.toggleViewChanges;
11
+ toggleViewChanges = _ref.toggleViewChanges,
12
+ publishRevision = _ref.publishRevision;
12
13
  var isSdocRevision = context.getSetting('isSdocRevision');
13
14
  var isPublished = context.getSetting('isPublished');
14
15
  return /*#__PURE__*/React.createElement(React.Fragment, null, !isSdocRevision && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(MoreRevisionOperations, null), /*#__PURE__*/React.createElement(Revisions, null)), isSdocRevision && isShowChanges && /*#__PURE__*/React.createElement(ChangesCount, {
@@ -16,6 +17,8 @@ var RevisionOperations = function RevisionOperations(_ref) {
16
17
  }), isSdocRevision && /*#__PURE__*/React.createElement(ViewChanges, {
17
18
  isShowChanges: isShowChanges,
18
19
  toggleViewChanges: toggleViewChanges
19
- }), isSdocRevision && !isPublished && /*#__PURE__*/React.createElement(PublishRevision, null));
20
+ }), isSdocRevision && !isPublished && /*#__PURE__*/React.createElement(PublishRevision, {
21
+ publishRevision: publishRevision
22
+ }));
20
23
  };
21
24
  export default RevisionOperations;
@@ -1,21 +1,14 @@
1
1
  import React, { useCallback } from 'react';
2
+ import { useTranslation } from 'react-i18next';
2
3
  import { Button } from 'reactstrap';
3
- import { withTranslation } from 'react-i18next';
4
- import context from '../../../context';
5
- import toaster from '../../../components/toast';
6
4
  var PublishRevision = function PublishRevision(_ref) {
7
- var t = _ref.t;
8
- var repoID = context.getSetting('repoID');
9
- var siteRoot = context.getSetting('siteRoot');
5
+ var publishRevision = _ref.publishRevision;
6
+ var _useTranslation = useTranslation(),
7
+ t = _useTranslation.t;
10
8
  var publish = useCallback(function (event) {
11
9
  event.stopPropagation();
12
10
  event.nativeEvent.stopImmediatePropagation();
13
- context.publishSdocRevision().then(function (res) {
14
- var origin_file_path = res.data.origin_file_path;
15
- window.location.href = "".concat(siteRoot, "lib/").concat(repoID, "/file/").concat(origin_file_path);
16
- }).catch(function (error) {
17
- toaster.danger(t('Error'));
18
- });
11
+ publishRevision();
19
12
 
20
13
  // eslint-disable-next-line react-hooks/exhaustive-deps
21
14
  }, []);
@@ -25,4 +18,4 @@ var PublishRevision = function PublishRevision(_ref) {
25
18
  className: "ml-4"
26
19
  }, t('Publish'));
27
20
  };
28
- export default withTranslation('sdoc-editor')(PublishRevision);
21
+ export default PublishRevision;
@@ -0,0 +1,48 @@
1
+ import React, { useCallback } from 'react';
2
+ import { useTranslation } from 'react-i18next';
3
+ import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap';
4
+ import classnames from 'classnames';
5
+ import { TIP_TYPE, TIP_TITLE } from '../../constants';
6
+ import TipContent from './tip-content';
7
+ var TipDialog = function TipDialog(_ref) {
8
+ var className = _ref.className,
9
+ tipType = _ref.tipType,
10
+ toggle = _ref.toggle,
11
+ submit = _ref.submit;
12
+ var _useTranslation = useTranslation(),
13
+ t = _useTranslation.t;
14
+ var closeDialog = useCallback(function () {
15
+ toggle && toggle(false);
16
+
17
+ // eslint-disable-next-line react-hooks/exhaustive-deps
18
+ }, [tipType]);
19
+ var confirmTip = useCallback(function () {
20
+ submit && submit();
21
+
22
+ // eslint-disable-next-line react-hooks/exhaustive-deps
23
+ }, []);
24
+ return /*#__PURE__*/React.createElement(Modal, {
25
+ isOpen: true,
26
+ autoFocus: false,
27
+ zIndex: 1071,
28
+ returnFocusAfterClose: false,
29
+ toggle: closeDialog,
30
+ className: classnames('sdoc-tip-dialog', className),
31
+ contentClassName: "sdoc-tip-modal"
32
+ }, /*#__PURE__*/React.createElement(ModalHeader, {
33
+ toggle: [TIP_TYPE.HAS_BEEN_REPLACED, TIP_TYPE.HAS_BEEN_PUBLISHED].includes(tipType) ? undefined : closeDialog
34
+ }, t(TIP_TITLE[tipType])), /*#__PURE__*/React.createElement(ModalBody, {
35
+ className: "sdoc-tip-body"
36
+ }, /*#__PURE__*/React.createElement(TipContent, {
37
+ tipType: tipType
38
+ })), ![TIP_TYPE.HAS_BEEN_REPLACED, TIP_TYPE.HAS_BEEN_PUBLISHED].includes(tipType) && /*#__PURE__*/React.createElement(ModalFooter, null, /*#__PURE__*/React.createElement(Button, {
39
+ color: "secondary",
40
+ className: "mr-2",
41
+ onClick: closeDialog
42
+ }, t('Cancel')), /*#__PURE__*/React.createElement(Button, {
43
+ color: "primary",
44
+ className: "highlight-bg-color",
45
+ onClick: confirmTip
46
+ }, t('Confirm'))));
47
+ };
48
+ export default TipDialog;