@seafile/sdoc-editor 2.0.115 → 2.0.116

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.
@@ -4,7 +4,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.removeMarks = exports.markdownTableRenderer = exports.insertHtmlTransferredNodes = void 0;
7
+ exports.validateNestedStructure = exports.removeMarks = exports.markdownTableRenderer = exports.isRangeOverlapping = exports.insertHtmlTransferredNodes = exports.handleSelectElements = exports.getSelectedChildren = exports.findValidLists = exports.findInsertableLists = void 0;
8
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
9
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
11
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createForOfIteratorHelper"));
8
12
  var _react = _interopRequireDefault(require("react"));
9
13
  var _slate = require("@seafile/slate");
10
14
  var _constants = require("../../../constants");
@@ -38,6 +42,204 @@ var markdownTableRenderer = exports.markdownTableRenderer = function markdownTab
38
42
  }
39
43
  });
40
44
  };
45
+ var isRangeOverlapping = exports.isRangeOverlapping = function isRangeOverlapping(rangeA, rangeB) {
46
+ var aStart = _slate.Range.start(rangeA);
47
+ var aEnd = _slate.Range.end(rangeA);
48
+ var bStart = _slate.Range.start(rangeB);
49
+ var bEnd = _slate.Range.end(rangeB);
50
+
51
+ // The starting or ending point of A is within the range of B
52
+ var aStartInB = (_slate.Path.isBefore(bStart.path, aStart.path) || _slate.Path.equals(bStart.path, aStart.path)) && (_slate.Path.isBefore(aStart.path, bEnd.path) || _slate.Path.equals(aStart.path, bEnd.path));
53
+ var aEndInB = (_slate.Path.isBefore(bStart.path, aEnd.path) || _slate.Path.equals(bStart.path, aEnd.path)) && (_slate.Path.isBefore(aEnd.path, bEnd.path) || _slate.Path.equals(aEnd.path, bEnd.path));
54
+
55
+ // B is included by A
56
+ var bWithinA = (_slate.Path.isBefore(aStart.path, bStart.path) || _slate.Path.equals(aStart.path, bStart.path)) && (_slate.Path.isBefore(bEnd.path, aEnd.path) || _slate.Path.equals(bEnd.path, aEnd.path));
57
+ return aStartInB || aEndInB || bWithinA;
58
+ };
59
+ var _validateNestedStructure = exports.validateNestedStructure = function validateNestedStructure(nodes) {
60
+ var validateNode = function validateNode(node) {
61
+ if (!Array.isArray(node.children) || node.children.length !== 1) {
62
+ return false;
63
+ }
64
+ return _validateNestedStructure(node.children);
65
+ };
66
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(nodes),
67
+ _step;
68
+ try {
69
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
70
+ var node = _step.value;
71
+ if (!node.type) continue;
72
+ if ([_constants.UNORDERED_LIST, _constants.ORDERED_LIST, _constants.BLOCKQUOTE, _constants.LIST_ITEM].includes(node.type)) {
73
+ if (!validateNode(node)) {
74
+ return false;
75
+ }
76
+ }
77
+ }
78
+ } catch (err) {
79
+ _iterator.e(err);
80
+ } finally {
81
+ _iterator.f();
82
+ }
83
+ return true;
84
+ };
85
+ var _getSelectedChildren = exports.getSelectedChildren = function getSelectedChildren(editor, parentNode, parentPath) {
86
+ var selection = editor.selection;
87
+ var selectedItems = [];
88
+ parentNode.children.forEach(function (childNode, index) {
89
+ var childPath = [].concat((0, _toConsumableArray2["default"])(parentPath), [index]);
90
+ var childRange = {
91
+ anchor: _slate.Editor.start(editor, childPath),
92
+ focus: _slate.Editor.end(editor, childPath)
93
+ };
94
+
95
+ // Determine whether a child node has been selected
96
+ if (isRangeOverlapping(selection, childRange)) {
97
+ // If it is a list node, recursively process its nested sub lists
98
+ var newChildNode = (0, _objectSpread2["default"])({}, childNode);
99
+ if (childNode.type === _constants.LIST_ITEM || childNode.type === _constants.ORDERED_LIST || childNode.type === _constants.UNORDERED_LIST) {
100
+ var nestedSelectedItems = _getSelectedChildren(editor, childNode, childPath);
101
+ // If there are selected items in the nested list, keep the current list structure
102
+ // Keep only selected nested sub items
103
+ if (nestedSelectedItems.length > 0) {
104
+ selectedItems.push((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, newChildNode), {}, {
105
+ children: nestedSelectedItems
106
+ }));
107
+ }
108
+ } else {
109
+ // non list nodes
110
+ if (childNode.children) {
111
+ var _nestedSelectedItems = _getSelectedChildren(editor, childNode, childPath);
112
+ if (_nestedSelectedItems.length > 0) {
113
+ selectedItems.push((0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, newChildNode), {}, {
114
+ children: _nestedSelectedItems
115
+ }));
116
+ }
117
+ return;
118
+ }
119
+ // Add non children nodes directly
120
+ selectedItems.push(childNode);
121
+ }
122
+ }
123
+ });
124
+ return selectedItems;
125
+ };
126
+ var handleSelectElements = exports.handleSelectElements = function handleSelectElements(editor) {
127
+ var selection = editor.selection;
128
+ var selectedElements = [];
129
+ var blockNodes = _slate.Editor.nodes(editor, {
130
+ at: selection,
131
+ match: function match(n) {
132
+ return _slate.Element.isElement(n) && _slate.Editor.isBlock(editor, n);
133
+ },
134
+ mode: 'highest'
135
+ });
136
+ var _iterator2 = (0, _createForOfIteratorHelper2["default"])(blockNodes),
137
+ _step2;
138
+ try {
139
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
140
+ var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 2),
141
+ node = _step2$value[0],
142
+ path = _step2$value[1];
143
+ var selectedItems = _getSelectedChildren(editor, node, path);
144
+ // Keep only selected items
145
+ if (selectedItems.length > 0) {
146
+ selectedElements.push([(0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, node), {}, {
147
+ children: selectedItems
148
+ }), path]);
149
+ }
150
+ }
151
+ } catch (err) {
152
+ _iterator2.e(err);
153
+ } finally {
154
+ _iterator2.f();
155
+ }
156
+ selectedElements[0].forEach(function (childNode, index) {
157
+ if (childNode.type === _constants.UNORDERED_LIST || childNode.type === _constants.ORDERED_LIST) {
158
+ selectedElements[0][index] = findValidLists(childNode)[0];
159
+ }
160
+ });
161
+ return selectedElements;
162
+ };
163
+ var hasValidListItem = function hasValidListItem(list) {
164
+ if (![_constants.UNORDERED_LIST, _constants.ORDERED_LIST].includes(list.type)) return false;
165
+ return list.children.some(function (item) {
166
+ if (item.type !== _constants.LIST_ITEM) return false;
167
+ var paragraph = item.children.find(function (child) {
168
+ return child.type === _constants.PARAGRAPH;
169
+ });
170
+ if (!paragraph) return false;
171
+ var textNode = paragraph.children.find(function (child) {
172
+ return 'text' in child;
173
+ });
174
+ return textNode !== undefined;
175
+ });
176
+ };
177
+ var isListCompletelyValid = function isListCompletelyValid(list) {
178
+ if (![_constants.UNORDERED_LIST, _constants.ORDERED_LIST].includes(list.type)) return false;
179
+ return list.children.every(function (item) {
180
+ if (item.type !== _constants.LIST_ITEM) return false;
181
+ var paragraph = item.children.find(function (child) {
182
+ return child.type === _constants.PARAGRAPH;
183
+ });
184
+ if (!paragraph) return false;
185
+ var textNode = paragraph.children.find(function (child) {
186
+ return 'text' in child;
187
+ });
188
+ return textNode !== undefined;
189
+ });
190
+ };
191
+ var findValidLists = exports.findValidLists = function findValidLists(node) {
192
+ var result = [];
193
+ var _traverse = function traverse(currentNode) {
194
+ if (!currentNode) return;
195
+ // Check if the current node meets the criteria
196
+ if ([_constants.UNORDERED_LIST, _constants.ORDERED_LIST].includes(currentNode.type) && hasValidListItem(currentNode)) {
197
+ result.push(currentNode);
198
+ return;
199
+ }
200
+ // Recursive traversal of child nodes
201
+ if (currentNode.children && Array.isArray(currentNode.children)) {
202
+ currentNode.children.forEach(_traverse);
203
+ }
204
+ };
205
+ _traverse(node);
206
+ return result;
207
+ };
208
+ var findInsertableLists = exports.findInsertableLists = function findInsertableLists(node) {
209
+ var result = [];
210
+ if ([_constants.UNORDERED_LIST, _constants.ORDERED_LIST].includes(node.type) && isListCompletelyValid(node)) {
211
+ result.push(node);
212
+ return result;
213
+ }
214
+ var isValidListItem = function isValidListItem(item) {
215
+ if (item.type !== _constants.LIST_ITEM) return false;
216
+ var paragraph = item.children.find(function (child) {
217
+ return child.type === _constants.PARAGRAPH;
218
+ });
219
+ if (!paragraph) return false;
220
+ var textNode = paragraph.children.find(function (child) {
221
+ return 'text' in child;
222
+ });
223
+ return !!textNode;
224
+ };
225
+ var _traverse2 = function traverse(currentNode) {
226
+ if (!currentNode) return;
227
+ if ([_constants.UNORDERED_LIST, _constants.ORDERED_LIST].includes(currentNode.type)) {
228
+ var validChildren = currentNode.children.filter(isValidListItem);
229
+ if (validChildren.length > 0) {
230
+ var newList = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, currentNode), {}, {
231
+ children: validChildren
232
+ });
233
+ result.push(newList);
234
+ }
235
+ }
236
+ if (currentNode.children && Array.isArray(currentNode.children)) {
237
+ currentNode.children.forEach(_traverse2);
238
+ }
239
+ };
240
+ _traverse2(node);
241
+ return result;
242
+ };
41
243
  var insertHtmlTransferredNodes = exports.insertHtmlTransferredNodes = function insertHtmlTransferredNodes(slateNodeList, nextPath, editor) {
42
244
  slateNodeList.forEach(function (childNode) {
43
245
  // Insert paragraph nodes
@@ -62,9 +264,17 @@ var insertHtmlTransferredNodes = exports.insertHtmlTransferredNodes = function i
62
264
 
63
265
  // Insert non-paragraph nodes
64
266
  if (childNode.type !== _constants.PARAGRAPH) {
65
- _slate.Transforms.insertNodes(editor, childNode, {
66
- at: nextPath
67
- });
267
+ // unordered_list or ordered_list
268
+ if (childNode.type === _constants.UNORDERED_LIST || childNode.type === _constants.ORDERED_LIST) {
269
+ var insertSlateElement = findInsertableLists(childNode);
270
+ _slate.Transforms.insertNodes(editor, insertSlateElement, {
271
+ at: nextPath
272
+ });
273
+ } else {
274
+ _slate.Transforms.insertNodes(editor, childNode, {
275
+ at: nextPath
276
+ });
277
+ }
68
278
  nextPath = _slate.Path.next(nextPath);
69
279
  }
70
280
  });
@@ -19,6 +19,7 @@ var _toast = _interopRequireDefault(require("../../../../components/toast"));
19
19
  var _context2 = _interopRequireDefault(require("../../../../context"));
20
20
  var _mdToHtml = _interopRequireDefault(require("../../../../slate-convert/md-to-html"));
21
21
  var _mdToSlate = _interopRequireDefault(require("../../../../slate-convert/md-to-slate"));
22
+ var _slateToMd = _interopRequireDefault(require("../../../../slate-convert/slate-to-md"));
22
23
  var _commons = require("../../../commons");
23
24
  var _dropdownMenuItem = _interopRequireDefault(require("../../../commons/dropdown-menu-item"));
24
25
  var _constants = require("../../../constants");
@@ -83,8 +84,17 @@ function AIModule(_ref) {
83
84
  scrollTop = _scrollRef$current.scrollTop,
84
85
  scrollHeight = _scrollRef$current.scrollHeight;
85
86
  if (!element) {
86
- var _content = window.getSelection().toString();
87
- if (_content) {
87
+ var selectElements = (0, _helpers.handleSelectElements)(editor);
88
+ var _content = '';
89
+ if (selectElements) {
90
+ if ((0, _helpers.validateNestedStructure)(selectElements[0])) {
91
+ // list.length === 1
92
+ _content = window.getSelection().toString();
93
+ } else {
94
+ selectElements.forEach(function (item) {
95
+ _content += (0, _slateToMd["default"])(item);
96
+ });
97
+ }
88
98
  setSelectedValue(_content);
89
99
  }
90
100
  var domSelection = window.getSelection();
package/dist/index.js CHANGED
@@ -112,6 +112,12 @@ Object.defineProperty(exports, "SDocWikiViewer", {
112
112
  return _views.SDocWikiViewer;
113
113
  }
114
114
  });
115
+ Object.defineProperty(exports, "SocketManager", {
116
+ enumerable: true,
117
+ get: function get() {
118
+ return _socket.SocketManager;
119
+ }
120
+ });
115
121
  Object.defineProperty(exports, "Tooltip", {
116
122
  enumerable: true,
117
123
  get: function get() {
@@ -81,6 +81,18 @@ var SocketClient = /*#__PURE__*/(0, _createClass2["default"])(function SocketCli
81
81
  callback && callback(result);
82
82
  });
83
83
  });
84
+ (0, _defineProperty2["default"])(this, "sendUserUpdated", function (name) {
85
+ (0, _debug.clientDebug)('send user change event: %s', name);
86
+ var _this$config2 = _this.config,
87
+ user = _this$config2.user,
88
+ docUuid = _this$config2.docUuid;
89
+ _this.socket.emit('user-updated', {
90
+ user: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, user), {}, {
91
+ name: name
92
+ }),
93
+ doc_uuid: docUuid
94
+ });
95
+ });
84
96
  (0, _defineProperty2["default"])(this, "onJoinRoom", function (userInfo) {
85
97
  (0, _debug.serverDebug)('%s joined room success.', userInfo.username);
86
98
  var socketManager = _socketManager["default"].getInstance();
@@ -91,6 +103,11 @@ var SocketClient = /*#__PURE__*/(0, _createClass2["default"])(function SocketCli
91
103
  var socketManager = _socketManager["default"].getInstance();
92
104
  socketManager.dispatchConnectState('leave-room', username);
93
105
  });
106
+ (0, _defineProperty2["default"])(this, "onUserUpdated", function (userInfo) {
107
+ (0, _debug.serverDebug)('%s name updated: %s', userInfo.username, userInfo.name);
108
+ var socketManager = _socketManager["default"].getInstance();
109
+ socketManager.dispatchConnectState('user-updated', userInfo);
110
+ });
94
111
  /**
95
112
  * receive remote broadcast operations
96
113
  * @param {*} params {operations, version}
@@ -179,6 +196,7 @@ var SocketClient = /*#__PURE__*/(0, _createClass2["default"])(function SocketCli
179
196
  this.socket.on('connect_error', this.onConnectError);
180
197
  this.socket.on('join-room', this.onJoinRoom);
181
198
  this.socket.on('leave-room', this.onLeaveRoom);
199
+ this.socket.on('user-updated', this.onUserUpdated);
182
200
  this.socket.on('update-document', this.onReceiveRemoteOperations);
183
201
 
184
202
  // doc replaced
@@ -58,6 +58,9 @@ var SocketManager = /*#__PURE__*/(0, _createClass2["default"])(function SocketMa
58
58
  (0, _defineProperty2["default"])(this, "receiveNewNotification", function (notification) {
59
59
  _this.eventBus.dispatch(_constants.INTERNAL_EVENT.NEW_NOTIFICATION, notification);
60
60
  });
61
+ (0, _defineProperty2["default"])(this, "sendUserUpdated", function (name) {
62
+ _this.socketClient.sendUserUpdated(name);
63
+ });
61
64
  (0, _defineProperty2["default"])(this, "onReceiveLocalOperations", function (operations) {
62
65
  if (_this.editor.readonly) return;
63
66
  _this.pendingOperationList.push(operations);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "2.0.115",
3
+ "version": "2.0.116",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -70,5 +70,5 @@
70
70
  "publishConfig": {
71
71
  "access": "public"
72
72
  },
73
- "gitHead": "90b92ce7a4734fb67256a9b67aa78596f6160f70"
73
+ "gitHead": "d5d10d54c29fa8ba70624108d8f26462597f6485"
74
74
  }