@seafile/sdoc-editor 1.0.212 → 1.0.214
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/basic-sdk/extension/constants/element-type.js +4 -1
- package/dist/basic-sdk/extension/constants/index.js +6 -0
- package/dist/basic-sdk/extension/core/transforms/index.js +12 -1
- package/dist/basic-sdk/extension/core/transforms/rebase.js +75 -0
- package/dist/basic-sdk/extension/core/transforms/replace-node.js +2 -16
- package/dist/basic-sdk/extension/core/transforms/update-parent-node.js +8 -5
- package/dist/basic-sdk/extension/plugins/group/index.js +13 -0
- package/dist/basic-sdk/extension/plugins/group/render-elem.js +25 -0
- package/dist/basic-sdk/extension/plugins/index.js +8 -1
- package/dist/basic-sdk/extension/plugins/list/plugin/normalize-list.js +3 -2
- package/dist/basic-sdk/extension/plugins/list/transforms/normalize-list-item.js +1 -1
- package/dist/basic-sdk/extension/plugins/seatable-tables/render-element/index.css +2 -1
- package/dist/basic-sdk/extension/plugins/seatable-tables/render-element/record-item.js +1 -1
- package/dist/basic-sdk/extension/render/custom-element.js +5 -0
- package/dist/basic-sdk/extension/render/element-decorate/rebase-decorate/index.css +2 -1
- package/dist/basic-sdk/extension/render/element-decorate/rebase-decorate/rebase-delete-modify-decorate.js +1 -1
- package/dist/basic-sdk/extension/render/element-decorate/rebase-decorate/rebase-modify-delete-decorate.js +1 -1
- package/dist/basic-sdk/extension/render/element-decorate/rebase-decorate/rebase-modify-modify-decorate.js +63 -31
- package/dist/basic-sdk/outline/index.js +7 -6
- package/dist/basic-sdk/outline/outline-item.js +19 -2
- package/dist/basic-sdk/utils/diff.js +2 -0
- package/dist/basic-sdk/utils/rebase.js +63 -16
- package/dist/components/doc-operations/revision-operations/revisions/index.css +1 -1
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.WIKI_LINK = exports.VIDEO_LINK = exports.VIDEO = exports.UNORDERED_LIST = exports.TWO_COLUMN = exports.TOP_LEVEL_TYPES = exports.TITLE = exports.THREE_COLUMN = exports.TABLE_ROW = exports.TABLE_CELL = exports.TABLE = exports.SUBTITLE = exports.SEATABLE_TABLE = exports.SEATABLE_COLUMN = exports.SDOC_LINK = exports.QUICK_INSERT = exports.PARAGRAPH = exports.ORDERED_LIST = exports.MULTI_COLUMN = exports.MENTION_TEMP = exports.MENTION = exports.LIST_ITEM = exports.LINK = exports.INLINE_LEVEL_TYPES = exports.IMAGE_BLOCK = exports.IMAGE = exports.HEADER6 = exports.HEADER5 = exports.HEADER4 = exports.HEADER3 = exports.HEADER2 = exports.HEADER1 = exports.HEADER = exports.FOUR_COLUMN = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = exports.FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK = exports.COLUMN = exports.CODE_LINE = exports.CODE_BLOCK = exports.CHECK_LIST_ITEM = exports.CALL_OUT = exports.BLOCKQUOTE = exports.ASK_AI = void 0;
|
|
6
|
+
exports.WIKI_LINK = exports.VIDEO_LINK = exports.VIDEO = exports.UNORDERED_LIST = exports.TWO_COLUMN = exports.TOP_LEVEL_TYPES = exports.TITLE = exports.THREE_COLUMN = exports.TABLE_ROW = exports.TABLE_CELL = exports.TABLE = exports.SUBTITLE = exports.SEATABLE_TABLE = exports.SEATABLE_COLUMN = exports.SDOC_LINK = exports.QUICK_INSERT = exports.PARAGRAPH = exports.ORDERED_LIST = exports.MULTI_COLUMN = exports.MENTION_TEMP = exports.MENTION = exports.LIST_ITEM = exports.LINK = exports.INLINE_LEVEL_TYPES = exports.IMAGE_BLOCK = exports.IMAGE = exports.HEADER6 = exports.HEADER5 = exports.HEADER4 = exports.HEADER3 = exports.HEADER2 = exports.HEADER1 = exports.HEADER = exports.GROUP = exports.FOUR_COLUMN = exports.FONT_SIZE_REDUCE = exports.FONT_SIZE_INCREASE = exports.FONT_SIZE = exports.FIVE_COLUMN = exports.FILE_LINK_INSET_INPUT_TEMP = exports.FILE_LINK = exports.COLUMN = exports.CODE_LINE = exports.CODE_BLOCK = exports.CHECK_LIST_ITEM = exports.CALL_OUT = exports.BLOCKQUOTE = exports.ASK_AI = void 0;
|
|
7
7
|
const BLOCKQUOTE = exports.BLOCKQUOTE = 'blockquote';
|
|
8
8
|
const TITLE = exports.TITLE = 'title';
|
|
9
9
|
const SUBTITLE = exports.SUBTITLE = 'subtitle';
|
|
@@ -51,5 +51,8 @@ const ASK_AI = exports.ASK_AI = 'ask_ai';
|
|
|
51
51
|
const FONT_SIZE = exports.FONT_SIZE = 'font-size';
|
|
52
52
|
const FONT_SIZE_INCREASE = exports.FONT_SIZE_INCREASE = 'font-size-increase';
|
|
53
53
|
const FONT_SIZE_REDUCE = exports.FONT_SIZE_REDUCE = 'font-size-reduce';
|
|
54
|
+
|
|
55
|
+
// group
|
|
56
|
+
const GROUP = exports.GROUP = 'group';
|
|
54
57
|
const TOP_LEVEL_TYPES = exports.TOP_LEVEL_TYPES = [BLOCKQUOTE, HEADER1, HEADER2, HEADER3, HEADER4, HEADER5, HEADER6, ORDERED_LIST, UNORDERED_LIST, CHECK_LIST_ITEM, PARAGRAPH, CODE_BLOCK, TABLE];
|
|
55
58
|
const INLINE_LEVEL_TYPES = exports.INLINE_LEVEL_TYPES = [IMAGE, LINK, MENTION, MENTION_TEMP];
|
|
@@ -158,6 +158,12 @@ Object.defineProperty(exports, "GOOGLE_FONT_CLASS", {
|
|
|
158
158
|
return _font.GOOGLE_FONT_CLASS;
|
|
159
159
|
}
|
|
160
160
|
});
|
|
161
|
+
Object.defineProperty(exports, "GROUP", {
|
|
162
|
+
enumerable: true,
|
|
163
|
+
get: function () {
|
|
164
|
+
return _elementType.GROUP;
|
|
165
|
+
}
|
|
166
|
+
});
|
|
161
167
|
Object.defineProperty(exports, "HEADER", {
|
|
162
168
|
enumerable: true,
|
|
163
169
|
get: function () {
|
|
@@ -47,7 +47,7 @@ Object.keys(_replaceNode).forEach(function (key) {
|
|
|
47
47
|
}
|
|
48
48
|
});
|
|
49
49
|
});
|
|
50
|
-
var _updateParentNode = require("./update-parent-node
|
|
50
|
+
var _updateParentNode = require("./update-parent-node");
|
|
51
51
|
Object.keys(_updateParentNode).forEach(function (key) {
|
|
52
52
|
if (key === "default" || key === "__esModule") return;
|
|
53
53
|
if (key in exports && exports[key] === _updateParentNode[key]) return;
|
|
@@ -57,4 +57,15 @@ Object.keys(_updateParentNode).forEach(function (key) {
|
|
|
57
57
|
return _updateParentNode[key];
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
|
+
});
|
|
61
|
+
var _rebase = require("./rebase");
|
|
62
|
+
Object.keys(_rebase).forEach(function (key) {
|
|
63
|
+
if (key === "default" || key === "__esModule") return;
|
|
64
|
+
if (key in exports && exports[key] === _rebase[key]) return;
|
|
65
|
+
Object.defineProperty(exports, key, {
|
|
66
|
+
enumerable: true,
|
|
67
|
+
get: function () {
|
|
68
|
+
return _rebase[key];
|
|
69
|
+
}
|
|
70
|
+
});
|
|
60
71
|
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.replaceRebaseNodeChildren = exports.replaceRebaseNode = exports.rebaseNode = exports.deleteRebaseNodeMark = void 0;
|
|
7
|
+
var _slate = require("@seafile/slate");
|
|
8
|
+
var _removeNodeChildren = require("./remove-node-children");
|
|
9
|
+
var _queries = require("../queries");
|
|
10
|
+
var _constants = require("../../constants");
|
|
11
|
+
const replaceRebaseNodeChildren = (editor, _ref) => {
|
|
12
|
+
let {
|
|
13
|
+
at,
|
|
14
|
+
nodes,
|
|
15
|
+
insertOptions,
|
|
16
|
+
removeOptions
|
|
17
|
+
} = _ref;
|
|
18
|
+
(0, _removeNodeChildren.removeNodeChildren)(editor, at, removeOptions);
|
|
19
|
+
_slate.Transforms.insertNodes(editor, nodes, {
|
|
20
|
+
...insertOptions,
|
|
21
|
+
at: at.concat([0])
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
exports.replaceRebaseNodeChildren = replaceRebaseNodeChildren;
|
|
25
|
+
const replaceRebaseNode = function (editor) {
|
|
26
|
+
let {
|
|
27
|
+
at,
|
|
28
|
+
nodes,
|
|
29
|
+
insertOptions,
|
|
30
|
+
removeOptions
|
|
31
|
+
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
32
|
+
const parentPath = at.slice(0, -1);
|
|
33
|
+
const parentNode = at.length > 1 ? (0, _queries.getNode)(editor, parentPath) : {};
|
|
34
|
+
if ([_constants.ELEMENT_TYPE.ORDERED_LIST, _constants.ELEMENT_TYPE.UNORDERED_LIST].includes(parentNode.type)) {
|
|
35
|
+
const newChildren = parentNode.children.slice(0);
|
|
36
|
+
newChildren.splice(at[at.length - 1], 1, ...nodes);
|
|
37
|
+
replaceRebaseNodeChildren(editor, {
|
|
38
|
+
at: parentPath,
|
|
39
|
+
nodes: newChildren
|
|
40
|
+
});
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
_slate.Transforms.removeNodes(editor, {
|
|
44
|
+
at,
|
|
45
|
+
...removeOptions
|
|
46
|
+
});
|
|
47
|
+
_slate.Transforms.insertNodes(editor, nodes, {
|
|
48
|
+
...insertOptions,
|
|
49
|
+
at
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
exports.replaceRebaseNode = replaceRebaseNode;
|
|
53
|
+
const deleteRebaseNodeMark = function (editor, path, element) {
|
|
54
|
+
let marks = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
|
|
55
|
+
const newElement = {
|
|
56
|
+
...element
|
|
57
|
+
};
|
|
58
|
+
marks.forEach(markItem => {
|
|
59
|
+
newElement[markItem] && delete newElement[markItem];
|
|
60
|
+
});
|
|
61
|
+
_slate.Transforms.removeNodes(editor, {
|
|
62
|
+
at: path
|
|
63
|
+
});
|
|
64
|
+
_slate.Transforms.insertNodes(editor, newElement, {
|
|
65
|
+
at: path
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
exports.deleteRebaseNodeMark = deleteRebaseNodeMark;
|
|
69
|
+
const rebaseNode = (editor, callback) => {
|
|
70
|
+
if (!callback) return;
|
|
71
|
+
_slate.Editor.withoutNormalizing(editor, () => {
|
|
72
|
+
callback && callback();
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
exports.rebaseNode = rebaseNode;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.replaceNodeChildren = exports.replaceNode =
|
|
6
|
+
exports.replaceNodeChildren = exports.replaceNode = void 0;
|
|
7
7
|
var _slate = require("@seafile/slate");
|
|
8
8
|
var _removeNodeChildren = require("./remove-node-children");
|
|
9
9
|
const replaceNodeChildren = (editor, _ref) => {
|
|
@@ -40,18 +40,4 @@ const replaceNode = function (editor) {
|
|
|
40
40
|
});
|
|
41
41
|
});
|
|
42
42
|
};
|
|
43
|
-
exports.replaceNode = replaceNode;
|
|
44
|
-
const deleteNodeMark = function (editor, path, element) {
|
|
45
|
-
let marks = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
|
|
46
|
-
const newElement = {
|
|
47
|
-
...element
|
|
48
|
-
};
|
|
49
|
-
marks.forEach(markItem => {
|
|
50
|
-
newElement[markItem] && delete newElement[markItem];
|
|
51
|
-
});
|
|
52
|
-
replaceNode(editor, {
|
|
53
|
-
at: path,
|
|
54
|
-
nodes: newElement
|
|
55
|
-
});
|
|
56
|
-
};
|
|
57
|
-
exports.deleteNodeMark = deleteNodeMark;
|
|
43
|
+
exports.replaceNode = replaceNode;
|
|
@@ -4,13 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.updateRebaseParentNodeByPath = void 0;
|
|
7
|
+
var _slate = require("@seafile/slate");
|
|
7
8
|
var _constants = require("../../../constants");
|
|
9
|
+
var _constants2 = require("../../constants");
|
|
8
10
|
var _queries = require("../queries");
|
|
9
|
-
var _replaceNode = require("./replace-node");
|
|
10
11
|
const updateRebaseParentNodeByPath = (editor, path) => {
|
|
11
12
|
const parentPath = path.slice(0, -1);
|
|
12
13
|
const parentNode = (0, _queries.getNode)(editor, parentPath);
|
|
13
|
-
if (
|
|
14
|
+
if (![_constants2.ELEMENT_TYPE.ORDERED_LIST, _constants2.ELEMENT_TYPE.UNORDERED_LIST].includes(parentNode.type)) return;
|
|
14
15
|
const newParentElement = {
|
|
15
16
|
...parentNode
|
|
16
17
|
};
|
|
@@ -23,9 +24,11 @@ const updateRebaseParentNodeByPath = (editor, path) => {
|
|
|
23
24
|
item[_constants.REBASE_MARK_KEY.ORIGIN] && delete item[_constants.REBASE_MARK_KEY.ORIGIN];
|
|
24
25
|
return item;
|
|
25
26
|
});
|
|
26
|
-
|
|
27
|
-
at: parentPath
|
|
28
|
-
|
|
27
|
+
_slate.Transforms.removeNodes(editor, {
|
|
28
|
+
at: parentPath
|
|
29
|
+
});
|
|
30
|
+
_slate.Transforms.insertNodes(editor, newParentElement, {
|
|
31
|
+
at: parentPath
|
|
29
32
|
});
|
|
30
33
|
};
|
|
31
34
|
exports.updateRebaseParentNodeByPath = updateRebaseParentNodeByPath;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _constants = require("../../constants");
|
|
8
|
+
var _renderElem = require("./render-elem");
|
|
9
|
+
const GroupPlugin = {
|
|
10
|
+
type: _constants.ELEMENT_TYPE.GROUP,
|
|
11
|
+
renderElements: [_renderElem.renderGroup]
|
|
12
|
+
};
|
|
13
|
+
var _default = exports.default = GroupPlugin;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.renderGroup = void 0;
|
|
8
|
+
var _react = _interopRequireDefault(require("react"));
|
|
9
|
+
const Group = _ref => {
|
|
10
|
+
let {
|
|
11
|
+
element,
|
|
12
|
+
attributes,
|
|
13
|
+
children,
|
|
14
|
+
className
|
|
15
|
+
} = _ref;
|
|
16
|
+
return /*#__PURE__*/_react.default.createElement("div", Object.assign({
|
|
17
|
+
"data-id": element.id
|
|
18
|
+
}, attributes, {
|
|
19
|
+
className: className
|
|
20
|
+
}), children);
|
|
21
|
+
};
|
|
22
|
+
const renderGroup = props => {
|
|
23
|
+
return /*#__PURE__*/_react.default.createElement(Group, props);
|
|
24
|
+
};
|
|
25
|
+
exports.renderGroup = renderGroup;
|
|
@@ -41,6 +41,12 @@ Object.defineProperty(exports, "FontPlugin", {
|
|
|
41
41
|
return _font.default;
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
|
+
Object.defineProperty(exports, "GroupPlugin", {
|
|
45
|
+
enumerable: true,
|
|
46
|
+
get: function () {
|
|
47
|
+
return _group.default;
|
|
48
|
+
}
|
|
49
|
+
});
|
|
44
50
|
Object.defineProperty(exports, "HeaderPlugin", {
|
|
45
51
|
enumerable: true,
|
|
46
52
|
get: function () {
|
|
@@ -181,7 +187,8 @@ var _quickInsert = _interopRequireDefault(require("./quick-insert"));
|
|
|
181
187
|
var _wikiLink = _interopRequireDefault(require("./wiki-link"));
|
|
182
188
|
var _seatableColumn = _interopRequireDefault(require("./seatable-column"));
|
|
183
189
|
var _seatableTables = _interopRequireDefault(require("./seatable-tables"));
|
|
184
|
-
|
|
190
|
+
var _group = _interopRequireDefault(require("./group"));
|
|
191
|
+
const Plugins = [_markdown.default, _html.default, _header.default, _link.default, _blockquote.default, _list.default, _checkList.default, _codeBlock.default, _image.default, _video.default, _table.default, _multiColumn.default, _textStyle.default, _textAlign.default, _font.default, _sdocLink.default, _paragraph.default, _fileLink.default, _callout.default, _searchReplace.default, _quickInsert.default, _group.default];
|
|
185
192
|
const WikiPlugins = exports.WikiPlugins = [...Plugins, _wikiLink.default];
|
|
186
193
|
const CommentPlugins = exports.CommentPlugins = [_markdown.default, _html.default, _paragraph.default, _textStyle.default, _list.default, _image.default, _link.default, _mention.default, _blockquote.default];
|
|
187
194
|
var _default = exports.default = Plugins;
|
|
@@ -10,6 +10,7 @@ var _core = require("../../../core");
|
|
|
10
10
|
var _queries = require("../queries");
|
|
11
11
|
var _transforms = require("../transforms");
|
|
12
12
|
var _model = require("../model");
|
|
13
|
+
const validChildrenTypes = [_constants.GROUP, _constants.LIST_ITEM];
|
|
13
14
|
const normalizeList = editor => {
|
|
14
15
|
const {
|
|
15
16
|
normalizeNode
|
|
@@ -26,7 +27,7 @@ const normalizeList = editor => {
|
|
|
26
27
|
const children = (0, _core.getChildren)([node, path]);
|
|
27
28
|
const nonLiChild = children.find(_ref2 => {
|
|
28
29
|
let [child] = _ref2;
|
|
29
|
-
return child.type
|
|
30
|
+
return !validChildrenTypes.includes(child.type);
|
|
30
31
|
});
|
|
31
32
|
if (nonLiChild) {
|
|
32
33
|
const listItem = (0, _model.generateEmptyListItem)();
|
|
@@ -39,7 +40,7 @@ const normalizeList = editor => {
|
|
|
39
40
|
if ((0, _core.match)(node, [], {
|
|
40
41
|
type: listTypes
|
|
41
42
|
})) {
|
|
42
|
-
if (!node.children.length || !node.children.find(
|
|
43
|
+
if (!node.children.length || !node.children.find(child => validChildrenTypes.includes(child.type))) {
|
|
43
44
|
_slate.Transforms.removeNodes(editor, {
|
|
44
45
|
at: path
|
|
45
46
|
});
|
|
@@ -15,7 +15,7 @@ const normalizeListItem = (editor, _ref) => {
|
|
|
15
15
|
listItem
|
|
16
16
|
} = _ref;
|
|
17
17
|
let changed = false;
|
|
18
|
-
const validLiChildrenTypes = [...(0, _queries.getListTypes)(), _constants.PARAGRAPH];
|
|
18
|
+
const validLiChildrenTypes = [...(0, _queries.getListTypes)(), _constants.PARAGRAPH, _constants.GROUP];
|
|
19
19
|
const [, liPath] = listItem;
|
|
20
20
|
const liChildren = (0, _core.getChildren)(listItem);
|
|
21
21
|
const invalidLiChildrenPathRefs = liChildren.filter(_ref2 => {
|
|
@@ -22,7 +22,7 @@ function RecordItem(_ref) {
|
|
|
22
22
|
} = element;
|
|
23
23
|
return /*#__PURE__*/_react.default.createElement("tr", {
|
|
24
24
|
className: "seatable-view-body-column-row"
|
|
25
|
-
}, element.show_record_numbers && /*#__PURE__*/_react.default.createElement("
|
|
25
|
+
}, element.show_record_numbers && /*#__PURE__*/_react.default.createElement("td", {
|
|
26
26
|
className: "seatable-view-body-column-cell first-cell"
|
|
27
27
|
}, index), columns.map(column => {
|
|
28
28
|
const width = column_width[column.key];
|
|
@@ -210,6 +210,11 @@ const CustomRenderElement = props => {
|
|
|
210
210
|
const [renderSeaTableTable] = _plugins.SeaTableViewsPlugin.renderElements;
|
|
211
211
|
return renderSeaTableTable(props, editor);
|
|
212
212
|
}
|
|
213
|
+
case _constants.ELEMENT_TYPE.GROUP:
|
|
214
|
+
{
|
|
215
|
+
const [renderGroup] = _plugins.GroupPlugin.renderElements;
|
|
216
|
+
return renderGroup(props);
|
|
217
|
+
}
|
|
213
218
|
default:
|
|
214
219
|
{
|
|
215
220
|
const [renderParagraph] = _plugins.ParagraphPlugin.renderElements;
|
|
@@ -34,7 +34,7 @@ const RebaseDeleteModifyDecorate = _ref => {
|
|
|
34
34
|
}, [editor, element]);
|
|
35
35
|
const deleteMark = (0, _react.useCallback)(() => {
|
|
36
36
|
const path = (0, _core.findPath)(editor, element);
|
|
37
|
-
(0, _core.
|
|
37
|
+
(0, _core.deleteRebaseNodeMark)(editor, path, element, _constants2.REBASE_MARKS);
|
|
38
38
|
if (element.type === _constants.ELEMENT_TYPE.LIST_ITEM) {
|
|
39
39
|
(0, _core.updateRebaseParentNodeByPath)(editor, path);
|
|
40
40
|
}
|
|
@@ -34,7 +34,7 @@ const RebaseModifyDeleteDecorate = _ref => {
|
|
|
34
34
|
}, [editor, element]);
|
|
35
35
|
const deleteMark = (0, _react.useCallback)(() => {
|
|
36
36
|
const path = (0, _core.findPath)(editor, element);
|
|
37
|
-
(0, _core.
|
|
37
|
+
(0, _core.deleteRebaseNodeMark)(editor, path, element, _constants2.REBASE_MARKS);
|
|
38
38
|
if (element.type === _constants.ELEMENT_TYPE.LIST_ITEM) {
|
|
39
39
|
(0, _core.updateRebaseParentNodeByPath)(editor, path);
|
|
40
40
|
}
|
|
@@ -24,47 +24,79 @@ const RebaseModifyModifyDecorate = _ref => {
|
|
|
24
24
|
} = (0, _reactI18next.useTranslation)('sdoc-editor');
|
|
25
25
|
const editor = (0, _slateReact.useSlateStatic)();
|
|
26
26
|
const useMasterChanges = (0, _react.useCallback)(() => {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
(0, _core.rebaseNode)(editor, () => {
|
|
28
|
+
const path = (0, _core.findPath)(editor, element);
|
|
29
|
+
|
|
30
|
+
// delete my changes
|
|
31
|
+
const nextElementPath = [...path];
|
|
32
|
+
nextElementPath[path.length - 1] = path[path.length - 1] + 1;
|
|
33
|
+
_slate.Transforms.removeNodes(editor, {
|
|
34
|
+
at: nextElementPath
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
// update master changes
|
|
38
|
+
if (element.type === _constants.ELEMENT_TYPE.GROUP) {
|
|
39
|
+
(0, _core.replaceRebaseNode)(editor, {
|
|
40
|
+
at: path,
|
|
41
|
+
nodes: element.children
|
|
42
|
+
});
|
|
43
|
+
} else {
|
|
44
|
+
(0, _core.deleteRebaseNodeMark)(editor, path, element[_constants2.REBASE_MARK_KEY.OLD_ELEMENT], _constants2.REBASE_MARKS);
|
|
45
|
+
}
|
|
35
46
|
(0, _core.updateRebaseParentNodeByPath)(editor, path);
|
|
36
|
-
}
|
|
47
|
+
});
|
|
37
48
|
|
|
38
49
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
39
50
|
}, [editor, element]);
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
const useMyChanges = (0, _react.useCallback)(() => {
|
|
52
|
+
(0, _core.rebaseNode)(editor, () => {
|
|
53
|
+
const path = (0, _core.findPath)(editor, element);
|
|
54
|
+
const currentElementPath = [...path];
|
|
55
|
+
currentElementPath[path.length - 1] = path[path.length - 1] + 1;
|
|
56
|
+
const currentElement = (0, _core.getNode)(editor, currentElementPath);
|
|
57
|
+
const newCurrentElement = (0, _deepCopy.default)(currentElement);
|
|
58
|
+
if (element.type === _constants.ELEMENT_TYPE.GROUP) {
|
|
59
|
+
(0, _core.replaceRebaseNode)(editor, {
|
|
60
|
+
at: currentElementPath,
|
|
61
|
+
nodes: newCurrentElement.children
|
|
62
|
+
});
|
|
63
|
+
} else {
|
|
64
|
+
(0, _core.deleteRebaseNodeMark)(editor, currentElementPath, newCurrentElement, _constants2.REBASE_MARKS);
|
|
65
|
+
}
|
|
66
|
+
_slate.Transforms.removeNodes(editor, {
|
|
67
|
+
at: path
|
|
68
|
+
});
|
|
51
69
|
(0, _core.updateRebaseParentNodeByPath)(editor, path);
|
|
52
|
-
}
|
|
70
|
+
});
|
|
53
71
|
|
|
54
72
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
55
73
|
}, [editor, element]);
|
|
56
74
|
const useBothChanges = (0, _react.useCallback)(() => {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
75
|
+
(0, _core.rebaseNode)(editor, () => {
|
|
76
|
+
const path = (0, _core.findPath)(editor, element);
|
|
77
|
+
const nextElementPath = [...path.slice(0, -1), path[path.length - 1] + 1];
|
|
78
|
+
const nextElement = (0, _core.getNode)(editor, nextElementPath);
|
|
79
|
+
if (element.type === _constants.ELEMENT_TYPE.GROUP) {
|
|
80
|
+
// replace next element
|
|
81
|
+
(0, _core.replaceRebaseNode)(editor, {
|
|
82
|
+
at: nextElementPath,
|
|
83
|
+
nodes: nextElement.children
|
|
84
|
+
});
|
|
60
85
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
86
|
+
// replace current element
|
|
87
|
+
(0, _core.replaceRebaseNode)(editor, {
|
|
88
|
+
at: path,
|
|
89
|
+
nodes: element.children
|
|
90
|
+
});
|
|
91
|
+
} else {
|
|
92
|
+
// delete element marks
|
|
93
|
+
(0, _core.deleteRebaseNodeMark)(editor, path, element, _constants2.REBASE_MARKS);
|
|
94
|
+
|
|
95
|
+
// delete next element marks
|
|
96
|
+
(0, _core.deleteRebaseNodeMark)(editor, nextElementPath, nextElement, _constants2.REBASE_MARKS);
|
|
97
|
+
}
|
|
66
98
|
(0, _core.updateRebaseParentNodeByPath)(editor, path);
|
|
67
|
-
}
|
|
99
|
+
});
|
|
68
100
|
|
|
69
101
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
70
102
|
}, [editor, element]);
|
|
@@ -79,7 +111,7 @@ const RebaseModifyModifyDecorate = _ref => {
|
|
|
79
111
|
className: "mr-2 ml-2"
|
|
80
112
|
}, '|'), /*#__PURE__*/_react.default.createElement("div", {
|
|
81
113
|
className: "sdoc-rebase-btn",
|
|
82
|
-
onClick:
|
|
114
|
+
onClick: useMyChanges
|
|
83
115
|
}, t('Keep_my_modification')), /*#__PURE__*/_react.default.createElement("div", {
|
|
84
116
|
className: "mr-2 ml-2"
|
|
85
117
|
}, '|'), /*#__PURE__*/_react.default.createElement("div", {
|
|
@@ -13,6 +13,7 @@ var _constants = require("../constants");
|
|
|
13
13
|
var _eventBus = _interopRequireDefault(require("../utils/event-bus"));
|
|
14
14
|
var _outlineItem = _interopRequireDefault(require("./outline-item"));
|
|
15
15
|
var _tooltip = _interopRequireDefault(require("../../components/tooltip"));
|
|
16
|
+
var _context = _interopRequireDefault(require("../../context"));
|
|
16
17
|
require("./style.css");
|
|
17
18
|
const getOutlineSetting = () => {
|
|
18
19
|
const currentValue = localStorage.getItem(_constants.SDOC_STORAGE);
|
|
@@ -37,6 +38,7 @@ const SDocOutline = _ref => {
|
|
|
37
38
|
t
|
|
38
39
|
} = _ref;
|
|
39
40
|
const [isShown, setIsShown] = (0, _react.useState)(false);
|
|
41
|
+
const isSdocRevision = _context.default.getSetting('isSdocRevision');
|
|
40
42
|
const updateOutlineState = (0, _react.useCallback)(state => {
|
|
41
43
|
setIsShown(state);
|
|
42
44
|
setOutlineSetting(state);
|
|
@@ -73,12 +75,11 @@ const SDocOutline = _ref => {
|
|
|
73
75
|
className: "mt-4 text-secondary"
|
|
74
76
|
}, t('Headings_you_add_to_the_document_will_appear_here')), list.length > 0 && /*#__PURE__*/_react.default.createElement("div", {
|
|
75
77
|
className: "sdoc-outline-list-container"
|
|
76
|
-
}, list.map((item, index) => {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
})))), !isShown && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", {
|
|
78
|
+
}, list.map((item, index) => /*#__PURE__*/_react.default.createElement(_outlineItem.default, {
|
|
79
|
+
key: index,
|
|
80
|
+
item: item,
|
|
81
|
+
isSdocRevision: isSdocRevision
|
|
82
|
+
}))))), !isShown && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", {
|
|
82
83
|
id: "sdoc-outline-menu",
|
|
83
84
|
className: "sdoc-outline-menu sdocfont sdoc-table-of-content-outline",
|
|
84
85
|
onClick: toggleShow
|
|
@@ -9,6 +9,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/es
|
|
|
9
9
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
10
10
|
var _react = _interopRequireDefault(require("react"));
|
|
11
11
|
var _constants = require("../constants");
|
|
12
|
+
var _constants2 = require("../extension/constants");
|
|
12
13
|
class OutlineItem extends _react.default.PureComponent {
|
|
13
14
|
constructor(props) {
|
|
14
15
|
super(props);
|
|
@@ -66,7 +67,8 @@ class OutlineItem extends _react.default.PureComponent {
|
|
|
66
67
|
render() {
|
|
67
68
|
const {
|
|
68
69
|
item,
|
|
69
|
-
isDisplayHorizontalBar
|
|
70
|
+
isDisplayHorizontalBar,
|
|
71
|
+
isSdocRevision
|
|
70
72
|
} = this.props;
|
|
71
73
|
const {
|
|
72
74
|
type,
|
|
@@ -91,7 +93,22 @@ class OutlineItem extends _react.default.PureComponent {
|
|
|
91
93
|
onClick: this.onItemClick,
|
|
92
94
|
onMouseOver: this.onMouseOver,
|
|
93
95
|
onMouseOut: this.onMouseOut
|
|
94
|
-
}, children.map(child => child.text || child.title).join('')
|
|
96
|
+
}, !isSdocRevision && children.map(child => child.text || child.title).join(''), isSdocRevision && children.map(child => {
|
|
97
|
+
const text = child.text || child.title;
|
|
98
|
+
const style = {
|
|
99
|
+
...(child.add && _constants2.ADDED_STYLE),
|
|
100
|
+
...(child.delete && _constants2.DELETED_STYLE),
|
|
101
|
+
backgroundColor: child.computed_background_color || undefined
|
|
102
|
+
};
|
|
103
|
+
const key = child.id;
|
|
104
|
+
const content = /*#__PURE__*/_react.default.createElement("span", {
|
|
105
|
+
style: style,
|
|
106
|
+
key: key
|
|
107
|
+
}, text);
|
|
108
|
+
return child.delete ? /*#__PURE__*/_react.default.createElement("del", {
|
|
109
|
+
key: key
|
|
110
|
+
}, content) : content;
|
|
111
|
+
}));
|
|
95
112
|
}
|
|
96
113
|
}
|
|
97
114
|
var _default = exports.default = OutlineItem;
|
|
@@ -37,7 +37,9 @@ const getTopLevelChanges = changes => {
|
|
|
37
37
|
if (parentNode instanceof Document) {
|
|
38
38
|
break;
|
|
39
39
|
} else {
|
|
40
|
+
var _dom4, _dom4$dataset;
|
|
40
41
|
dom = parentNode;
|
|
42
|
+
if ((_dom4 = dom) !== null && _dom4 !== void 0 && (_dom4$dataset = _dom4.dataset) !== null && _dom4$dataset !== void 0 && _dom4$dataset.id && !dom.classList.contains('table-cell')) break;
|
|
41
43
|
}
|
|
42
44
|
}
|
|
43
45
|
topLevelChanges.push(dom.dataset.id);
|
|
@@ -32,6 +32,49 @@ const hasConflict = content => {
|
|
|
32
32
|
return flag;
|
|
33
33
|
};
|
|
34
34
|
exports.hasConflict = hasConflict;
|
|
35
|
+
const expandGroup = content => {
|
|
36
|
+
if ([_constants2.ELEMENT_TYPE.UNORDERED_LIST, _constants2.ELEMENT_TYPE.ORDERED_LIST].includes(content.type)) {
|
|
37
|
+
return [{
|
|
38
|
+
...content,
|
|
39
|
+
children: content.children.map(item => {
|
|
40
|
+
if (item.type === _constants2.ELEMENT_TYPE.GROUP) {
|
|
41
|
+
return expandGroup(item);
|
|
42
|
+
}
|
|
43
|
+
return item;
|
|
44
|
+
}).flat(1)
|
|
45
|
+
}];
|
|
46
|
+
}
|
|
47
|
+
return content.type === _constants2.ELEMENT_TYPE.GROUP ? content.children : [content];
|
|
48
|
+
};
|
|
49
|
+
const mergeChanges = changes => {
|
|
50
|
+
if (!Array.isArray(changes) || changes.length === 0) return changes;
|
|
51
|
+
let value = [];
|
|
52
|
+
let i = 0;
|
|
53
|
+
while (i < changes.length) {
|
|
54
|
+
const change = changes[i];
|
|
55
|
+
const lastChange = value[value.length - 1];
|
|
56
|
+
if (change && lastChange && change[_constants.REBASE_MARK_KEY.MODIFY_TYPE] === _constants.MODIFY_TYPE.ADD && lastChange[_constants.REBASE_MARK_KEY.MODIFY_TYPE] === _constants.MODIFY_TYPE.DELETE) {
|
|
57
|
+
value = value.slice(0, value.length - 1);
|
|
58
|
+
lastChange[_constants.REBASE_MARK_KEY.MODIFY_TYPE] && delete lastChange[_constants.REBASE_MARK_KEY.MODIFY_TYPE];
|
|
59
|
+
change[_constants.REBASE_MARK_KEY.MODIFY_TYPE] && delete change[_constants.REBASE_MARK_KEY.MODIFY_TYPE];
|
|
60
|
+
value.push({
|
|
61
|
+
id: change.id.endsWith('_group') ? change.id : change.id + '_group',
|
|
62
|
+
type: _constants2.ELEMENT_TYPE.GROUP,
|
|
63
|
+
[_constants.REBASE_MARK_KEY.MODIFY_TYPE]: _constants.MODIFY_TYPE.MODIFY,
|
|
64
|
+
children: expandGroup(change),
|
|
65
|
+
[_constants.REBASE_MARK_KEY.OLD_ELEMENT]: {
|
|
66
|
+
id: lastChange.id.endsWith('_group') ? lastChange.id : lastChange.id + '_group',
|
|
67
|
+
type: _constants2.ELEMENT_TYPE.GROUP,
|
|
68
|
+
children: expandGroup(lastChange)
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
} else {
|
|
72
|
+
value.push(change);
|
|
73
|
+
}
|
|
74
|
+
i++;
|
|
75
|
+
}
|
|
76
|
+
return value;
|
|
77
|
+
};
|
|
35
78
|
const getChanges = function (masterContent, revisionContent) {
|
|
36
79
|
let childrenName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'children';
|
|
37
80
|
const {
|
|
@@ -51,17 +94,21 @@ const getChanges = function (masterContent, revisionContent) {
|
|
|
51
94
|
removed
|
|
52
95
|
} = idDiff;
|
|
53
96
|
if (added) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
[
|
|
57
|
-
|
|
58
|
-
|
|
97
|
+
// merge consecutive identical operations
|
|
98
|
+
content.push({
|
|
99
|
+
id: value[0] + '_group',
|
|
100
|
+
type: _constants2.ELEMENT_TYPE.GROUP,
|
|
101
|
+
[_constants.REBASE_MARK_KEY.MODIFY_TYPE]: _constants.MODIFY_TYPE.ADD,
|
|
102
|
+
children: value.map(item => currentContentMap[item])
|
|
103
|
+
});
|
|
59
104
|
} else if (removed) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
[
|
|
63
|
-
|
|
64
|
-
|
|
105
|
+
// merge consecutive identical operations
|
|
106
|
+
content.push({
|
|
107
|
+
id: value[0] + '_group',
|
|
108
|
+
type: _constants2.ELEMENT_TYPE.GROUP,
|
|
109
|
+
[_constants.REBASE_MARK_KEY.MODIFY_TYPE]: _constants.MODIFY_TYPE.DELETE,
|
|
110
|
+
children: value.map(item => masterContentMap[item])
|
|
111
|
+
});
|
|
65
112
|
} else {
|
|
66
113
|
value.forEach(elementId => {
|
|
67
114
|
if (_objectUtils.default.isSameObject(masterContentMap[elementId], currentContentMap[elementId])) {
|
|
@@ -87,7 +134,7 @@ const getChanges = function (masterContent, revisionContent) {
|
|
|
87
134
|
});
|
|
88
135
|
}
|
|
89
136
|
});
|
|
90
|
-
return content;
|
|
137
|
+
return mergeChanges(content);
|
|
91
138
|
};
|
|
92
139
|
const getMergeElement = (diffElement, baseElement) => {
|
|
93
140
|
const modifyType = diffElement[_constants.REBASE_MARK_KEY.MODIFY_TYPE];
|
|
@@ -99,7 +146,7 @@ const getMergeElement = (diffElement, baseElement) => {
|
|
|
99
146
|
// revision does not have this element, master has this element
|
|
100
147
|
if (modifyType === _constants.MODIFY_TYPE.DELETE) {
|
|
101
148
|
// base content does not have this element, indicating that it is newly added by master and needs to be retained, and will not be counted as a conflict.
|
|
102
|
-
if (!baseElement) return
|
|
149
|
+
if (!baseElement) return expandGroup(newElement);
|
|
103
150
|
|
|
104
151
|
// base content has this element, master modified it, indicating that revision deleted it, and the user manually selected the conflict
|
|
105
152
|
if (!_objectUtils.default.isSameObject(baseElement, diffElement, [_constants.REBASE_MARK_KEY.MODIFY_TYPE])) {
|
|
@@ -114,7 +161,7 @@ const getMergeElement = (diffElement, baseElement) => {
|
|
|
114
161
|
// revision has this element, master does not have this element
|
|
115
162
|
if (modifyType === _constants.MODIFY_TYPE.ADD) {
|
|
116
163
|
// base content does not have this element, indicating that it is newly added by revision and needs to be retained, and will not be counted as a conflict.
|
|
117
|
-
if (!baseElement) return
|
|
164
|
+
if (!baseElement) return expandGroup(newElement);
|
|
118
165
|
|
|
119
166
|
// master deleted it, revision modified it, and the user manually selected the conflict
|
|
120
167
|
if (!_objectUtils.default.isSameObject(baseElement, diffElement, [_constants.REBASE_MARK_KEY.MODIFY_TYPE])) {
|
|
@@ -184,10 +231,10 @@ const getMergeElement = (diffElement, baseElement) => {
|
|
|
184
231
|
[_constants.REBASE_MARK_KEY.ORIGIN]: _constants.REBASE_ORIGIN.MY
|
|
185
232
|
}];
|
|
186
233
|
}
|
|
187
|
-
if (_objectUtils.default.isSameObject(masterElement, baseElement)) return
|
|
234
|
+
if (_objectUtils.default.isSameObject(masterElement, baseElement)) return expandGroup(newElement);
|
|
188
235
|
if (_objectUtils.default.isSameObject(newElement, baseElement)) return [masterElement];
|
|
189
236
|
if (_objectUtils.default.isSameObject(masterElement, newElement, ['type'])) {
|
|
190
|
-
if (_objectUtils.default.isSameObject(masterElement, baseElement, ['type'])) return
|
|
237
|
+
if (_objectUtils.default.isSameObject(masterElement, baseElement, ['type'])) return expandGroup(newElement);
|
|
191
238
|
if (_objectUtils.default.isSameObject(newElement, baseElement, ['type'])) return [masterElement];
|
|
192
239
|
}
|
|
193
240
|
|
|
@@ -199,7 +246,7 @@ const getMergeElement = (diffElement, baseElement) => {
|
|
|
199
246
|
}];
|
|
200
247
|
}
|
|
201
248
|
newElement[_constants.REBASE_MARK_KEY.OLD_ELEMENT] && delete newElement[_constants.REBASE_MARK_KEY.OLD_ELEMENT];
|
|
202
|
-
return
|
|
249
|
+
return expandGroup(newElement);
|
|
203
250
|
};
|
|
204
251
|
const getMergeContent = function (baseContent, diffChanges) {
|
|
205
252
|
let childrenName = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'children';
|