@seafile/sdoc-editor 1.0.212 → 1.0.213

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 (22) hide show
  1. package/dist/basic-sdk/extension/constants/element-type.js +4 -1
  2. package/dist/basic-sdk/extension/constants/index.js +6 -0
  3. package/dist/basic-sdk/extension/core/transforms/index.js +12 -1
  4. package/dist/basic-sdk/extension/core/transforms/rebase.js +75 -0
  5. package/dist/basic-sdk/extension/core/transforms/replace-node.js +2 -16
  6. package/dist/basic-sdk/extension/core/transforms/update-parent-node.js +8 -5
  7. package/dist/basic-sdk/extension/plugins/group/index.js +13 -0
  8. package/dist/basic-sdk/extension/plugins/group/render-elem.js +25 -0
  9. package/dist/basic-sdk/extension/plugins/index.js +8 -1
  10. package/dist/basic-sdk/extension/plugins/list/plugin/normalize-list.js +3 -2
  11. package/dist/basic-sdk/extension/plugins/list/transforms/normalize-list-item.js +1 -1
  12. package/dist/basic-sdk/extension/render/custom-element.js +5 -0
  13. package/dist/basic-sdk/extension/render/element-decorate/rebase-decorate/index.css +2 -1
  14. package/dist/basic-sdk/extension/render/element-decorate/rebase-decorate/rebase-delete-modify-decorate.js +1 -1
  15. package/dist/basic-sdk/extension/render/element-decorate/rebase-decorate/rebase-modify-delete-decorate.js +1 -1
  16. package/dist/basic-sdk/extension/render/element-decorate/rebase-decorate/rebase-modify-modify-decorate.js +63 -31
  17. package/dist/basic-sdk/outline/index.js +7 -6
  18. package/dist/basic-sdk/outline/outline-item.js +19 -2
  19. package/dist/basic-sdk/utils/diff.js +2 -0
  20. package/dist/basic-sdk/utils/rebase.js +63 -16
  21. package/dist/components/doc-operations/revision-operations/revisions/index.css +1 -1
  22. 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.js");
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 = exports.deleteNodeMark = void 0;
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 (parentNode.children.filter(item => item[_constants.REBASE_MARK_KEY.REBASE_TYPE]).length !== 0) return;
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
- (0, _replaceNode.replaceNode)(editor, {
27
- at: parentPath,
28
- nodes: newParentElement
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
- 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];
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 !== _constants.LIST_ITEM;
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(item => item.type === _constants.LIST_ITEM)) {
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 => {
@@ -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;
@@ -41,6 +41,7 @@
41
41
 
42
42
  .sdoc-rebase-my-changes > *:first-child,
43
43
  .sdoc-rebase-other-changes > *:first-child {
44
- margin: 0;
44
+ margin-top: 0 !important;
45
+ margin-bottom: 0 !important;
45
46
  padding: 0.8em 0 0.8em 0.2em;
46
47
  }
@@ -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.deleteNodeMark)(editor, path, element, _constants2.REBASE_MARKS);
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.deleteNodeMark)(editor, path, element, _constants2.REBASE_MARKS);
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
- const path = (0, _core.findPath)(editor, element);
28
- (0, _core.deleteNodeMark)(editor, path, element[_constants2.REBASE_MARK_KEY.OLD_ELEMENT], _constants2.REBASE_MARKS);
29
- const nextElementPath = [...path];
30
- nextElementPath[path.length - 1] = path[path.length - 1] + 1;
31
- _slate.Transforms.removeNodes(editor, {
32
- at: nextElementPath
33
- });
34
- if (element.type === _constants.ELEMENT_TYPE.LIST_ITEM) {
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 useCurrentChanges = (0, _react.useCallback)(() => {
41
- const path = (0, _core.findPath)(editor, element);
42
- const currentElementPath = [...path];
43
- currentElementPath[path.length - 1] = path[path.length - 1] + 1;
44
- const currentElement = (0, _core.getNode)(editor, currentElementPath);
45
- const newCurrentElement = (0, _deepCopy.default)(currentElement);
46
- (0, _core.deleteNodeMark)(editor, currentElementPath, newCurrentElement, _constants2.REBASE_MARKS);
47
- _slate.Transforms.removeNodes(editor, {
48
- at: path
49
- });
50
- if (element.type === _constants.ELEMENT_TYPE.LIST_ITEM) {
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
- // delete element marks
58
- const path = (0, _core.findPath)(editor, element);
59
- (0, _core.deleteNodeMark)(editor, path, element, _constants2.REBASE_MARKS);
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
- // delete next element marks
62
- const nextElementPath = [...path.slice(0, -1), path[path.length - 1] + 1];
63
- const nextElement = (0, _core.getNode)(editor, nextElementPath);
64
- (0, _core.deleteNodeMark)(editor, nextElementPath, nextElement, _constants2.REBASE_MARKS);
65
- if (element.type === _constants.ELEMENT_TYPE.LIST_ITEM) {
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: useCurrentChanges
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
- return /*#__PURE__*/_react.default.createElement(_outlineItem.default, {
78
- key: index,
79
- item: item
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
- const addedList = value.map(item => ({
55
- ...currentContentMap[item],
56
- [_constants.REBASE_MARK_KEY.MODIFY_TYPE]: _constants.MODIFY_TYPE.ADD
57
- }));
58
- content.push(...addedList);
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
- const deletedList = value.map(item => ({
61
- ...masterContentMap[item],
62
- [_constants.REBASE_MARK_KEY.MODIFY_TYPE]: _constants.MODIFY_TYPE.DELETE
63
- }));
64
- content.push(...deletedList);
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 [newElement];
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 [newElement];
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 [newElement];
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 [newElement];
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 [newElement];
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';
@@ -3,7 +3,7 @@
3
3
  width: fit-content;
4
4
  border: 1px solid #E5E5E5;
5
5
  border-radius: 3px;
6
- line-height: 28px;
6
+ line-height: 26px;
7
7
  text-align: center;
8
8
  padding: 0 16px;
9
9
  margin-left: 1rem;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "1.0.212",
3
+ "version": "1.0.213",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",