@seafile/sdoc-editor 3.0.81 → 3.0.82
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/assets/css/sdoc-editor-article.css +29 -1
- package/dist/assets/css/sdoc-editor-plugins.css +5 -2
- package/dist/extension/constants/index.js +1 -1
- package/dist/extension/plugins/callout/render-elem/index.js +1 -1
- package/dist/extension/plugins/check-list/render-elem.js +1 -1
- package/dist/extension/plugins/header/render-elem.js +2 -2
- package/dist/extension/plugins/list/render-elem.js +3 -2
- package/dist/extension/plugins/multi-column/helper.js +83 -2
- package/dist/extension/toolbar/side-toolbar/helpers.js +24 -1
- package/dist/extension/toolbar/side-toolbar/index.js +201 -5
- package/package.json +2 -2
|
@@ -25,10 +25,38 @@
|
|
|
25
25
|
left: -60px;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
.sdoc-editor__article .sdoc-
|
|
28
|
+
.sdoc-editor__article .sdoc-dragging {
|
|
29
29
|
border-bottom: 2px solid rgba(35, 131, 226);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
.sdoc-editor__article .sdoc-dragging-right,
|
|
33
|
+
.sdoc-editor__article .sdoc-dragging-left {
|
|
34
|
+
position: relative;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.sdoc-editor__article .sdoc-dragging-left::before {
|
|
38
|
+
content: '';
|
|
39
|
+
position: absolute;
|
|
40
|
+
top: 0;
|
|
41
|
+
bottom: 0;
|
|
42
|
+
left: -5px;
|
|
43
|
+
width: 2px;
|
|
44
|
+
background: rgba(35, 131, 226);
|
|
45
|
+
pointer-events: none;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.sdoc-editor__article .sdoc-dragging-right::before {
|
|
49
|
+
content: '';
|
|
50
|
+
position: absolute;
|
|
51
|
+
top: 0;
|
|
52
|
+
bottom: 0;
|
|
53
|
+
right: -5px;
|
|
54
|
+
left: unset;
|
|
55
|
+
width: 2px;
|
|
56
|
+
background: rgba(35, 131, 226);
|
|
57
|
+
pointer-events: none;
|
|
58
|
+
}
|
|
59
|
+
|
|
32
60
|
.sdoc-editor__article .sdoc-code-block-pre {
|
|
33
61
|
font-size: 10pt;
|
|
34
62
|
}
|
|
@@ -45,8 +45,11 @@
|
|
|
45
45
|
cursor: pointer;
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
/* only for firefox browser */
|
|
49
|
+
@-moz-document url-prefix() {
|
|
50
|
+
.sdoc-editor__article .list-container .sdoc-li-content {
|
|
51
|
+
display: inline-grid;
|
|
52
|
+
}
|
|
50
53
|
}
|
|
51
54
|
|
|
52
55
|
.sdoc-editor__article .list-container .sdoc-li-prefix {
|
|
@@ -558,4 +558,4 @@ var FILEEXT_TYPE_MAP = exports.FILEEXT_TYPE_MAP = {
|
|
|
558
558
|
};
|
|
559
559
|
var SUPPORTED_SIDE_OPERATION_TYPE = exports.SUPPORTED_SIDE_OPERATION_TYPE = [_elementType.PARAGRAPH, _elementType.SUBTITLE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CHECK_LIST_ITEM, _elementType.CODE_BLOCK, _elementType.TABLE, _elementType.BLOCKQUOTE, _elementType.CALL_OUT, _elementType.IMAGE_BLOCK, _elementType.VIDEO, _elementType.WHITEBOARD, _elementType.FORMULA];
|
|
560
560
|
var MOUSE_ENTER_EVENT_DISABLED_MAP = exports.MOUSE_ENTER_EVENT_DISABLED_MAP = (_MOUSE_ENTER_EVENT_DI = {}, (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_MOUSE_ENTER_EVENT_DI, _elementType.PARAGRAPH, [_elementType.CALL_OUT]), _elementType.TITLE, [_elementType.CALL_OUT]), _elementType.SUBTITLE, [_elementType.CALL_OUT]), _elementType.CHECK_LIST_ITEM, [_elementType.CALL_OUT]), _elementType.ORDERED_LIST, [_elementType.CALL_OUT]), _elementType.UNORDERED_LIST, [_elementType.CALL_OUT]), _elementType.LIST_ITEM, [_elementType.CALL_OUT]), _elementType.BLOCKQUOTE, [_elementType.CALL_OUT]), _elementType.HEADER1, [_elementType.CALL_OUT]), _elementType.HEADER2, [_elementType.CALL_OUT]), (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])(_MOUSE_ENTER_EVENT_DI, _elementType.HEADER3, [_elementType.CALL_OUT]), _elementType.HEADER4, [_elementType.CALL_OUT]), _elementType.HEADER5, [_elementType.CALL_OUT]), _elementType.HEADER6, [_elementType.CALL_OUT]), _elementType.CALL_OUT, [_elementType.CALL_OUT]));
|
|
561
|
-
var ROOT_ELEMENT_TYPES = exports.ROOT_ELEMENT_TYPES = [_elementType.PARAGRAPH, _elementType.TITLE, _elementType.SUBTITLE, _elementType.CHECK_LIST_ITEM, _elementType.ORDERED_LIST, _elementType.UNORDERED_LIST, _elementType.BLOCKQUOTE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CALL_OUT, _elementType.TABLE, _elementType.CODE_BLOCK, _elementType.IMAGE_BLOCK, _elementType.VIDEO, _elementType.WHITEBOARD, _elementType.FORMULA];
|
|
561
|
+
var ROOT_ELEMENT_TYPES = exports.ROOT_ELEMENT_TYPES = [_elementType.PARAGRAPH, _elementType.TITLE, _elementType.SUBTITLE, _elementType.CHECK_LIST_ITEM, _elementType.ORDERED_LIST, _elementType.UNORDERED_LIST, _elementType.BLOCKQUOTE, _elementType.HEADER1, _elementType.HEADER2, _elementType.HEADER3, _elementType.HEADER4, _elementType.HEADER5, _elementType.HEADER6, _elementType.CALL_OUT, _elementType.TABLE, _elementType.CODE_BLOCK, _elementType.IMAGE_BLOCK, _elementType.VIDEO, _elementType.WHITEBOARD, _elementType.FORMULA, _elementType.MULTI_COLUMN];
|
|
@@ -138,7 +138,7 @@ var renderCallout = function renderCallout(_ref, editor) {
|
|
|
138
138
|
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
139
139
|
onClick: handleClick,
|
|
140
140
|
ref: calloutRef,
|
|
141
|
-
className: "
|
|
141
|
+
className: "sdoc-callout-container",
|
|
142
142
|
style: containerStyle
|
|
143
143
|
}, element.callout_icon && /*#__PURE__*/_react["default"].createElement("div", {
|
|
144
144
|
className: "callout-icon"
|
|
@@ -56,7 +56,7 @@ var CheckListItem = /*#__PURE__*/function (_React$PureComponent) {
|
|
|
56
56
|
return /*#__PURE__*/_react["default"].createElement("div", Object.assign({
|
|
57
57
|
"data-id": id
|
|
58
58
|
}, attributes, {
|
|
59
|
-
className: "sdoc-checkbox-container
|
|
59
|
+
className: "sdoc-checkbox-container",
|
|
60
60
|
style: style
|
|
61
61
|
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
62
62
|
className: "sdoc-checkbox-input-wrapper"
|
|
@@ -38,7 +38,7 @@ var renderSubtitle = exports.renderSubtitle = function renderSubtitle(props, edi
|
|
|
38
38
|
return /*#__PURE__*/_react["default"].createElement("div", Object.assign({
|
|
39
39
|
"data-id": element.id
|
|
40
40
|
}, attributes, {
|
|
41
|
-
className: "sdoc-header-subtitle
|
|
41
|
+
className: "sdoc-header-subtitle",
|
|
42
42
|
style: (0, _objectSpread2["default"])({}, style)
|
|
43
43
|
}), children);
|
|
44
44
|
};
|
|
@@ -63,7 +63,7 @@ var renderHeader = exports.renderHeader = function renderHeader(props, editor) {
|
|
|
63
63
|
"data-id": element.id,
|
|
64
64
|
id: element.id // used for click left outline item, page scroll this element
|
|
65
65
|
}, attributes, {
|
|
66
|
-
className: "sdoc-header-".concat(level
|
|
66
|
+
className: "sdoc-header-".concat(level),
|
|
67
67
|
style: (0, _objectSpread2["default"])({
|
|
68
68
|
position: isShowPlaceHolder ? 'relative' : ''
|
|
69
69
|
}, style)
|
|
@@ -16,9 +16,10 @@ var renderList = exports.renderList = function renderList(props, editor) {
|
|
|
16
16
|
node = props.element;
|
|
17
17
|
var Tag = node.type === _constants.ORDERED_LIST ? 'ol' : 'ul';
|
|
18
18
|
return /*#__PURE__*/_react["default"].createElement(Tag, Object.assign({
|
|
19
|
-
"data-id": node.id
|
|
19
|
+
"data-id": node.id
|
|
20
|
+
}, attributes, {
|
|
20
21
|
className: "list-container d-flex flex-column"
|
|
21
|
-
}
|
|
22
|
+
}), children);
|
|
22
23
|
};
|
|
23
24
|
var renderListItem = exports.renderListItem = function renderListItem(props, editor) {
|
|
24
25
|
var attributes = props.attributes,
|
|
@@ -4,10 +4,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.updateColumnWidthOnDeletion = exports.updateColumnWidth = exports.insertMultiColumn = exports.hasImageInColumn = exports.handleInsertMultiColumn = exports.getCurrentPageWidth = exports.generateEmptyMultiColumn = void 0;
|
|
7
|
+
exports.updateColumnWidthOnDeletion = exports.updateColumnWidth = exports.insertMultiColumn = exports.hasImageInColumn = exports.handleInsertMultiColumn = exports.getCurrentPageWidth = exports.generateEmptyMultiColumn = exports.generateEmptyColumn = exports.addMiddleColumnInMultiColumn = exports.addLastColumnInMultiColumn = void 0;
|
|
8
8
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
9
9
|
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/createForOfIteratorHelper"));
|
|
10
10
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectSpread2"));
|
|
11
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
|
|
11
12
|
var _slate = require("@seafile/slate");
|
|
12
13
|
var _slateReact = require("@seafile/slate-react");
|
|
13
14
|
var _slugid = _interopRequireDefault(require("slugid"));
|
|
@@ -83,6 +84,86 @@ var generateEmptyMultiColumn = exports.generateEmptyMultiColumn = function gener
|
|
|
83
84
|
}
|
|
84
85
|
};
|
|
85
86
|
};
|
|
87
|
+
var generateEmptyColumn = exports.generateEmptyColumn = function generateEmptyColumn(editor, columnNum) {
|
|
88
|
+
var currentPageWidth = getCurrentPageWidth(editor) + _constants3.LAST_COLUMN_MARGIN_RIGHT_WIDTH;
|
|
89
|
+
var initialColumnWidth = Math.max(_constants3.COLUMN_MIN_WIDTH, parseInt(currentPageWidth / columnNum));
|
|
90
|
+
var emptyColumn = {
|
|
91
|
+
id: _slugid["default"].nice(),
|
|
92
|
+
type: _constants2.ELEMENT_TYPE.COLUMN,
|
|
93
|
+
width: initialColumnWidth,
|
|
94
|
+
children: [{
|
|
95
|
+
id: _slugid["default"].nice(),
|
|
96
|
+
type: _constants2.PARAGRAPH,
|
|
97
|
+
children: [{
|
|
98
|
+
text: '',
|
|
99
|
+
id: _slugid["default"].nice()
|
|
100
|
+
}]
|
|
101
|
+
}]
|
|
102
|
+
};
|
|
103
|
+
return emptyColumn;
|
|
104
|
+
};
|
|
105
|
+
var addLastColumnInMultiColumn = exports.addLastColumnInMultiColumn = function addLastColumnInMultiColumn(editor, topTargetNode, targetPath) {
|
|
106
|
+
var columnsNum = topTargetNode.children.length + 1;
|
|
107
|
+
var currentPageWidth = getCurrentPageWidth(editor) + _constants3.LAST_COLUMN_MARGIN_RIGHT_WIDTH;
|
|
108
|
+
var initialColumnWidth = Math.max(_constants3.COLUMN_MIN_WIDTH, parseInt(currentPageWidth / columnsNum));
|
|
109
|
+
var newEmptyColumn = generateEmptyColumn(editor, columnsNum);
|
|
110
|
+
|
|
111
|
+
// Insert last column
|
|
112
|
+
var middleColumn = [].concat((0, _toConsumableArray2["default"])(topTargetNode.column), [{
|
|
113
|
+
key: newEmptyColumn.id,
|
|
114
|
+
width: initialColumnWidth
|
|
115
|
+
}]);
|
|
116
|
+
|
|
117
|
+
// Recalculate width of every left column
|
|
118
|
+
var newColumn = middleColumn.map(function (column, index) {
|
|
119
|
+
return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, column), {}, {
|
|
120
|
+
left: index * initialColumnWidth,
|
|
121
|
+
width: initialColumnWidth
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
_slate.Transforms.setNodes(editor, {
|
|
125
|
+
column: newColumn,
|
|
126
|
+
style: {
|
|
127
|
+
gridTemplateColumns: "repeat(".concat(columnsNum, ", ").concat(initialColumnWidth, "px)")
|
|
128
|
+
}
|
|
129
|
+
}, {
|
|
130
|
+
at: [targetPath[0]]
|
|
131
|
+
});
|
|
132
|
+
_slate.Transforms.insertNodes(editor, newEmptyColumn, {
|
|
133
|
+
at: [targetPath[0], targetPath[1] + 1]
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
var addMiddleColumnInMultiColumn = exports.addMiddleColumnInMultiColumn = function addMiddleColumnInMultiColumn(editor, topTargetNode, targetPath) {
|
|
137
|
+
var columnNum = topTargetNode.children.length + 1;
|
|
138
|
+
var currentPageWidth = getCurrentPageWidth(editor) + _constants3.LAST_COLUMN_MARGIN_RIGHT_WIDTH;
|
|
139
|
+
var initialColumnWidth = Math.max(_constants3.COLUMN_MIN_WIDTH, parseInt(currentPageWidth / columnNum));
|
|
140
|
+
var insertedEmptyColumn = generateEmptyColumn(editor, columnNum);
|
|
141
|
+
|
|
142
|
+
// Insert middle column
|
|
143
|
+
var insertIndex = targetPath[1];
|
|
144
|
+
var middleColumn = [].concat((0, _toConsumableArray2["default"])(topTargetNode.column.slice(0, insertIndex)), [{
|
|
145
|
+
key: insertedEmptyColumn.id,
|
|
146
|
+
width: initialColumnWidth
|
|
147
|
+
}], (0, _toConsumableArray2["default"])(topTargetNode.column.slice(insertIndex)));
|
|
148
|
+
// Recalculate width of every left column
|
|
149
|
+
var newColumn = middleColumn.map(function (column, index) {
|
|
150
|
+
return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, column), {}, {
|
|
151
|
+
left: index * initialColumnWidth,
|
|
152
|
+
width: initialColumnWidth
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
_slate.Transforms.setNodes(editor, {
|
|
156
|
+
column: newColumn,
|
|
157
|
+
style: {
|
|
158
|
+
gridTemplateColumns: "repeat(".concat(newColumn.length, ", ").concat(initialColumnWidth, "px)")
|
|
159
|
+
}
|
|
160
|
+
}, {
|
|
161
|
+
at: [targetPath[0]]
|
|
162
|
+
});
|
|
163
|
+
_slate.Transforms.insertNodes(editor, insertedEmptyColumn, {
|
|
164
|
+
at: [targetPath[0], targetPath[1]]
|
|
165
|
+
});
|
|
166
|
+
};
|
|
86
167
|
var updateColumnWidth = exports.updateColumnWidth = function updateColumnWidth(editor, element, column, newPath) {
|
|
87
168
|
var path = (0, _core.findPath)(editor, element, newPath);
|
|
88
169
|
var gridTemplateColumns = column.map(function (column) {
|
|
@@ -154,7 +235,7 @@ var updateColumnWidthOnDeletion = exports.updateColumnWidthOnDeletion = function
|
|
|
154
235
|
var remainingColumn = column.filter(function (_, index) {
|
|
155
236
|
return index !== targetColumnIndex;
|
|
156
237
|
});
|
|
157
|
-
var currentPageWidth = getCurrentPageWidth(editor);
|
|
238
|
+
var currentPageWidth = getCurrentPageWidth(editor) + _constants3.LAST_COLUMN_MARGIN_RIGHT_WIDTH;
|
|
158
239
|
var columnWidth = Math.max(_constants3.COLUMN_MIN_WIDTH, parseInt(currentPageWidth / remainingColumn.length));
|
|
159
240
|
|
|
160
241
|
// Recalculate width of every left column
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.setSelection = exports.onWrapMultiListItemToNonListTypeTarget = exports.onWrapMultiListItem = exports.onWrapListItemFromMultiColumn = exports.onWrapListItem = exports.onSetNodeType = exports.onDeleteNode = exports.onCopyNode = exports.normalizeCopyData = exports.isNotSupportTransform = exports.isMultiColumn = exports.isListItem = exports.isList = exports.isInMultiColumnNode = exports.isBlockquote = exports.insertEmptyListNodeAtTarget = exports.insertElement = exports.getTransformMenusConfig = exports.getTopValue = exports.getSearchedOperations = exports.getNodeEntry = exports.getListNodeFromMultiColumn = exports.getListNode = exports.deleteNodesFromBack = exports.createDragPreviewContainer = void 0;
|
|
7
|
+
exports.wrapIntoMultiColumn = exports.setSelection = exports.onWrapMultiListItemToNonListTypeTarget = exports.onWrapMultiListItem = exports.onWrapListItemFromMultiColumn = exports.onWrapListItem = exports.onSetNodeType = exports.onDeleteNode = exports.onCopyNode = exports.normalizeCopyData = exports.isNotSupportTransform = exports.isMultiColumn = exports.isListItem = exports.isList = exports.isInMultiColumnNode = exports.isBlockquote = exports.insertEmptyListNodeAtTarget = exports.insertElement = exports.getTransformMenusConfig = exports.getTopValue = exports.getSearchedOperations = exports.getNodeEntry = exports.getListNodeFromMultiColumn = exports.getListNode = exports.deleteNodesFromBack = exports.createDragPreviewContainer = exports.clearDragClass = void 0;
|
|
8
8
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/toConsumableArray"));
|
|
9
9
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
|
|
10
10
|
var _slate = require("@seafile/slate");
|
|
@@ -272,6 +272,7 @@ var insertElement = exports.insertElement = function insertElement(editor, type,
|
|
|
272
272
|
}
|
|
273
273
|
};
|
|
274
274
|
var getNodeEntry = exports.getNodeEntry = function getNodeEntry(editor, el) {
|
|
275
|
+
if (!el) return [];
|
|
275
276
|
var node = _slateReact.ReactEditor.toSlateNode(editor, el);
|
|
276
277
|
var path = _slateReact.ReactEditor.findPath(editor, node);
|
|
277
278
|
if (isList(editor, path)) {
|
|
@@ -501,4 +502,26 @@ var normalizeCopyData = exports.normalizeCopyData = function normalizeCopyData(e
|
|
|
501
502
|
var newData = (0, _helpers.replacePastedDataId)(parsed);
|
|
502
503
|
var normalizeNewData = (0, _documentUtils.normalizeCopyNodes)(editor, newData);
|
|
503
504
|
return normalizeNewData;
|
|
505
|
+
};
|
|
506
|
+
var clearDragClass = exports.clearDragClass = function clearDragClass(el) {
|
|
507
|
+
if (!el) return;
|
|
508
|
+
el.classList.remove('sdoc-dragging-right', 'sdoc-dragging-left', 'sdoc-dragging');
|
|
509
|
+
};
|
|
510
|
+
var wrapIntoMultiColumn = exports.wrapIntoMultiColumn = function wrapIntoMultiColumn(editor, leftNode, rightNode, targetPath) {
|
|
511
|
+
var emptyMultiColumnNode = (0, _helper2.generateEmptyMultiColumn)(editor, _constants2.TWO_COLUMN);
|
|
512
|
+
_slate.Transforms.insertNodes(editor, emptyMultiColumnNode, {
|
|
513
|
+
at: [targetPath[0]]
|
|
514
|
+
});
|
|
515
|
+
_slate.Transforms.insertNodes(editor, leftNode, {
|
|
516
|
+
at: [targetPath[0], 0, 0]
|
|
517
|
+
});
|
|
518
|
+
_slate.Transforms.insertNodes(editor, rightNode, {
|
|
519
|
+
at: [targetPath[0], 1, 0]
|
|
520
|
+
});
|
|
521
|
+
_slate.Transforms.removeNodes(editor, {
|
|
522
|
+
at: [targetPath[0], 0, 1]
|
|
523
|
+
});
|
|
524
|
+
_slate.Transforms.removeNodes(editor, {
|
|
525
|
+
at: [targetPath[0], 1, 1]
|
|
526
|
+
});
|
|
504
527
|
};
|
|
@@ -65,6 +65,7 @@ var SideToolbar = function SideToolbar() {
|
|
|
65
65
|
var selectedNodesRef = (0, _react.useRef)(null);
|
|
66
66
|
var showSelectedNodesRef = (0, _react.useRef)(null);
|
|
67
67
|
var draggedPreviewContainer = (0, _react.useRef)(null);
|
|
68
|
+
var activeDragElRef = (0, _react.useRef)(null);
|
|
68
69
|
var onReset = (0, _react.useCallback)(function () {
|
|
69
70
|
setShowSideMenu(false);
|
|
70
71
|
setMenuPosition({});
|
|
@@ -300,18 +301,18 @@ var SideToolbar = function SideToolbar() {
|
|
|
300
301
|
var dragTypes = event.dataTransfer.types;
|
|
301
302
|
if (!dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT)) return;
|
|
302
303
|
var overElement = event.currentTarget;
|
|
303
|
-
if (!overElement.classList.contains('sdoc-
|
|
304
|
-
overElement.classList.add('sdoc-
|
|
304
|
+
if (!overElement.classList.contains('sdoc-dragging')) {
|
|
305
|
+
overElement.classList.add('sdoc-dragging');
|
|
305
306
|
}
|
|
306
307
|
}, []);
|
|
307
308
|
var dragLeave = (0, _react.useCallback)(function (event) {
|
|
308
309
|
var leaveElement = event.currentTarget;
|
|
309
|
-
leaveElement.classList.remove('sdoc-
|
|
310
|
+
leaveElement.classList.remove('sdoc-dragging');
|
|
310
311
|
}, []);
|
|
311
312
|
var drop = (0, _react.useCallback)(function (event) {
|
|
312
313
|
var _parentNode$children$;
|
|
313
314
|
targetElement = event.currentTarget;
|
|
314
|
-
targetElement.classList.remove('sdoc-
|
|
315
|
+
targetElement.classList.remove('sdoc-dragging');
|
|
315
316
|
var dragTypes = event.dataTransfer.types;
|
|
316
317
|
if (!dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT) && dragTypes[0] !== 'Files') return;
|
|
317
318
|
|
|
@@ -343,7 +344,7 @@ var SideToolbar = function SideToolbar() {
|
|
|
343
344
|
var _parentNode = _slate.Node.parent(editor, targetPath);
|
|
344
345
|
var topNode = _slate.Node.get(editor, [targetPath[0]]);
|
|
345
346
|
|
|
346
|
-
// Drag into list nods
|
|
347
|
+
// Drag into list nods in blockquote, callout or multi_column block node
|
|
347
348
|
if (topNode.type === _constants2.CALL_OUT && _parentNode.type === _constants2.LIST_ITEM || topNode.type === _constants2.MULTI_COLUMN && _parentNode.type === _constants2.LIST_ITEM) {
|
|
348
349
|
currentTargetPath = _slate.Path.next(targetPath.slice(0, -1));
|
|
349
350
|
(0, _helpers2.onWrapMultiListItem)(editor, currentTargetPath, selectedNodesRef.current);
|
|
@@ -604,6 +605,201 @@ var SideToolbar = function SideToolbar() {
|
|
|
604
605
|
var onMouseLeave = (0, _react.useCallback)(function () {
|
|
605
606
|
setIsEnterMoreVertical(false);
|
|
606
607
|
}, []);
|
|
608
|
+
var handleDragover = (0, _react.useCallback)(function (event) {
|
|
609
|
+
var _target, _target2, _target3, _target4, _target5;
|
|
610
|
+
event.preventDefault();
|
|
611
|
+
var _getNodeEntry7 = (0, _helpers2.getNodeEntry)(editor, sourceElement),
|
|
612
|
+
_getNodeEntry8 = (0, _slicedToArray2["default"])(_getNodeEntry7, 2),
|
|
613
|
+
sourceNode = _getNodeEntry8[0],
|
|
614
|
+
sourcePath = _getNodeEntry8[1];
|
|
615
|
+
if (!sourceNode || !sourcePath) return;
|
|
616
|
+
|
|
617
|
+
// Not support node type in multi column
|
|
618
|
+
if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FILE_VIEW, _constants2.FORMULA].includes(sourceNode.type)) return;
|
|
619
|
+
// Return if source node is from multi column
|
|
620
|
+
var topNode = _slate.Node.get(editor, [sourcePath[0]]);
|
|
621
|
+
if ([_constants2.MULTI_COLUMN].includes(topNode.type)) return;
|
|
622
|
+
|
|
623
|
+
// Cursor position
|
|
624
|
+
var x = event.clientX;
|
|
625
|
+
var y = event.clientY;
|
|
626
|
+
var editorContainer = event.currentTarget;
|
|
627
|
+
var containerRect = editorContainer.getBoundingClientRect();
|
|
628
|
+
|
|
629
|
+
// Current visible area of editor container
|
|
630
|
+
var visibleTop = Math.max(containerRect.top, 0);
|
|
631
|
+
var visibleBottom = Math.min(containerRect.bottom, window.innerHeight);
|
|
632
|
+
var target = null;
|
|
633
|
+
|
|
634
|
+
// Get target element where cursor is close to
|
|
635
|
+
var _iterator2 = (0, _createForOfIteratorHelper2["default"])(editorContainer.querySelectorAll('[data-root="true"]')),
|
|
636
|
+
_step2;
|
|
637
|
+
try {
|
|
638
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
639
|
+
var el = _step2.value;
|
|
640
|
+
var rect = el.getBoundingClientRect();
|
|
641
|
+
if (rect.bottom < visibleTop) continue;
|
|
642
|
+
if (rect.top > visibleBottom) break;
|
|
643
|
+
if (y > rect.top && y < rect.bottom) {
|
|
644
|
+
target = {
|
|
645
|
+
el: el,
|
|
646
|
+
rect: rect
|
|
647
|
+
};
|
|
648
|
+
break;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
} catch (err) {
|
|
652
|
+
_iterator2.e(err);
|
|
653
|
+
} finally {
|
|
654
|
+
_iterator2.f();
|
|
655
|
+
}
|
|
656
|
+
if (!((_target = target) !== null && _target !== void 0 && _target.el)) return;
|
|
657
|
+
var prevEl = activeDragElRef.current;
|
|
658
|
+
if (prevEl && prevEl !== target.el) {
|
|
659
|
+
(0, _helpers2.clearDragClass)(prevEl);
|
|
660
|
+
}
|
|
661
|
+
if (((_target2 = target) === null || _target2 === void 0 ? void 0 : _target2.el) === sourceElement) return;
|
|
662
|
+
var _getNodeEntry9 = (0, _helpers2.getNodeEntry)(editor, (_target3 = target) === null || _target3 === void 0 ? void 0 : _target3.el),
|
|
663
|
+
_getNodeEntry0 = (0, _slicedToArray2["default"])(_getNodeEntry9, 2),
|
|
664
|
+
targetNode = _getNodeEntry0[0],
|
|
665
|
+
targetPath = _getNodeEntry0[1];
|
|
666
|
+
|
|
667
|
+
// Not support node type in multi column
|
|
668
|
+
if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FILE_VIEW, _constants2.FORMULA].includes(targetNode.type)) return;
|
|
669
|
+
if (!targetNode || targetPath.length === 0 && ![_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(targetNode.type)) return;
|
|
670
|
+
|
|
671
|
+
// Stop if target node is multi column node with four columns
|
|
672
|
+
if (targetNode.type === _constants2.MULTI_COLUMN && targetNode.children.length === 4) return;
|
|
673
|
+
|
|
674
|
+
// Add hover style for target node multi column children
|
|
675
|
+
if (targetNode.type === _constants2.MULTI_COLUMN) {
|
|
676
|
+
var multiColumnEl = target.el;
|
|
677
|
+
var columnEls = multiColumnEl.querySelectorAll('.sdoc-column-container');
|
|
678
|
+
if (!columnEls.length) return;
|
|
679
|
+
columnEls.forEach(function (col) {
|
|
680
|
+
return col.classList.remove('sdoc-dragging-left', 'sdoc-dragging', 'sdoc-dragging-right');
|
|
681
|
+
});
|
|
682
|
+
var preColRect = null;
|
|
683
|
+
columnEls.forEach(function (colEl, index) {
|
|
684
|
+
var rect = colEl.getBoundingClientRect();
|
|
685
|
+
if (x < rect.left && index === 0) {
|
|
686
|
+
colEl.classList.add('sdoc-dragging-left');
|
|
687
|
+
activeDragElRef.current = colEl;
|
|
688
|
+
}
|
|
689
|
+
if (preColRect && x < rect.left && x > preColRect.right) {
|
|
690
|
+
colEl.classList.add('sdoc-dragging-left');
|
|
691
|
+
activeDragElRef.current = colEl;
|
|
692
|
+
}
|
|
693
|
+
if (x > rect.right && index === columnEls.length - 1) {
|
|
694
|
+
colEl.classList.add('sdoc-dragging-right');
|
|
695
|
+
activeDragElRef.current = colEl;
|
|
696
|
+
}
|
|
697
|
+
preColRect = rect;
|
|
698
|
+
});
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
// Add hover style for target node as non-multi column children
|
|
703
|
+
var isLeftOutside = x < ((_target4 = target) === null || _target4 === void 0 ? void 0 : _target4.rect.left);
|
|
704
|
+
var isRightOutside = x > ((_target5 = target) === null || _target5 === void 0 ? void 0 : _target5.rect.right);
|
|
705
|
+
if (isLeftOutside && !target.el.classList.contains('sdoc-dragging-left')) {
|
|
706
|
+
target.el.classList.add('sdoc-dragging-left');
|
|
707
|
+
target.el.classList.remove('sdoc-dragging-right');
|
|
708
|
+
target.el.classList.remove('sdoc-dragging');
|
|
709
|
+
}
|
|
710
|
+
if (isRightOutside && !target.el.classList.contains('sdoc-dragging-right')) {
|
|
711
|
+
target.el.classList.add('sdoc-dragging-right');
|
|
712
|
+
target.el.classList.remove('sdoc-dragging-left');
|
|
713
|
+
target.el.classList.remove('sdoc-dragging');
|
|
714
|
+
}
|
|
715
|
+
activeDragElRef.current = target.el;
|
|
716
|
+
}, [editor]);
|
|
717
|
+
var clearAllDragStyles = (0, _react.useCallback)(function () {
|
|
718
|
+
var el = activeDragElRef.current;
|
|
719
|
+
(0, _helpers2.clearDragClass)(el);
|
|
720
|
+
activeDragElRef.current = null;
|
|
721
|
+
}, []);
|
|
722
|
+
var handleDrop = (0, _react.useCallback)(function () {
|
|
723
|
+
var targetEl = activeDragElRef.current;
|
|
724
|
+
var _getNodeEntry1 = (0, _helpers2.getNodeEntry)(editor, targetEl),
|
|
725
|
+
_getNodeEntry10 = (0, _slicedToArray2["default"])(_getNodeEntry1, 2),
|
|
726
|
+
targetNode = _getNodeEntry10[0],
|
|
727
|
+
targetPath = _getNodeEntry10[1];
|
|
728
|
+
var _getNodeEntry11 = (0, _helpers2.getNodeEntry)(editor, sourceElement),
|
|
729
|
+
_getNodeEntry12 = (0, _slicedToArray2["default"])(_getNodeEntry11, 2),
|
|
730
|
+
sourceNode = _getNodeEntry12[0],
|
|
731
|
+
sourcePath = _getNodeEntry12[1];
|
|
732
|
+
if (!targetPath || !sourcePath) return;
|
|
733
|
+
|
|
734
|
+
// When source node is list child, it is equal to drag top list node
|
|
735
|
+
var topSourceNode = _slate.Node.get(editor, [sourcePath[0]]);
|
|
736
|
+
if ([_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(topSourceNode.type)) {
|
|
737
|
+
sourceNode = topSourceNode;
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
// Drop non-multi column into multi column situation
|
|
741
|
+
if (_constants2.COLUMN === targetNode.type) {
|
|
742
|
+
var topTargetNode = _slate.Node.get(editor, [targetPath[0]]); // Top multi column Node
|
|
743
|
+
// Insert source node into last of multi column
|
|
744
|
+
if (targetEl.classList.contains('sdoc-dragging-right')) {
|
|
745
|
+
(0, _helper2.addLastColumnInMultiColumn)(editor, topTargetNode, targetPath);
|
|
746
|
+
_slate.Transforms.moveNodes(editor, {
|
|
747
|
+
at: [sourcePath[0]],
|
|
748
|
+
to: [targetPath[0], targetPath[1] + 1, 0]
|
|
749
|
+
});
|
|
750
|
+
}
|
|
751
|
+
// Insert source node into middle of multi column
|
|
752
|
+
if (targetEl.classList.contains('sdoc-dragging-left')) {
|
|
753
|
+
(0, _helper2.addMiddleColumnInMultiColumn)(editor, topTargetNode, targetPath);
|
|
754
|
+
_slate.Transforms.moveNodes(editor, {
|
|
755
|
+
at: [sourcePath[0]],
|
|
756
|
+
to: [targetPath[0], targetPath[1], 0]
|
|
757
|
+
});
|
|
758
|
+
}
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
// Drop non-multi column into non-multi column situation
|
|
763
|
+
// When target node is list, get real list path
|
|
764
|
+
if ([_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(targetNode.type)) {
|
|
765
|
+
targetPath = _slateReact.ReactEditor.findPath(editor, targetNode);
|
|
766
|
+
}
|
|
767
|
+
if (_slate.Path.equals([sourcePath[0]], [targetPath[0]])) return;
|
|
768
|
+
var leftNode = null;
|
|
769
|
+
var rightNode = null;
|
|
770
|
+
if (targetEl.classList.contains('sdoc-dragging-left')) {
|
|
771
|
+
leftNode = sourceNode;
|
|
772
|
+
rightNode = targetNode;
|
|
773
|
+
} else if (targetEl.classList.contains('sdoc-dragging-right')) {
|
|
774
|
+
leftNode = targetNode;
|
|
775
|
+
rightNode = sourceNode;
|
|
776
|
+
} else {
|
|
777
|
+
return;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// Form multi column first and then remove source and target node
|
|
781
|
+
(0, _helpers2.wrapIntoMultiColumn)(editor, leftNode, rightNode, targetPath);
|
|
782
|
+
_slate.Transforms.removeNodes(editor, {
|
|
783
|
+
at: _slate.Path.next([targetPath[0]])
|
|
784
|
+
});
|
|
785
|
+
_slate.Transforms.removeNodes(editor, {
|
|
786
|
+
at: [sourcePath[0]]
|
|
787
|
+
});
|
|
788
|
+
return;
|
|
789
|
+
}, [editor]);
|
|
790
|
+
(0, _react.useEffect)(function () {
|
|
791
|
+
var editorContainer = document.querySelector('.sdoc-article-container');
|
|
792
|
+
editorContainer.addEventListener('dragover', handleDragover);
|
|
793
|
+
editorContainer.addEventListener('dragend', clearAllDragStyles);
|
|
794
|
+
editorContainer.addEventListener('dragleave', clearAllDragStyles);
|
|
795
|
+
editorContainer.addEventListener('drop', handleDrop);
|
|
796
|
+
return function () {
|
|
797
|
+
editorContainer.removeEventListener('dragover', handleDragover);
|
|
798
|
+
editorContainer.removeEventListener('dragend', clearAllDragStyles);
|
|
799
|
+
editorContainer.removeEventListener('dragleave', clearAllDragStyles);
|
|
800
|
+
editorContainer.removeEventListener('drop', handleDrop);
|
|
801
|
+
};
|
|
802
|
+
}, [handleDragover, clearAllDragStyles, handleDrop]);
|
|
607
803
|
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !_commonUtils.isMobile && /*#__PURE__*/_react["default"].createElement("div", {
|
|
608
804
|
onAnimationEnd: function onAnimationEnd() {
|
|
609
805
|
return setIsMoving(false);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.82",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "jest",
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"publishConfig": {
|
|
73
73
|
"access": "public"
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "48881a70148e952676a5ae0da8d560743dc887da"
|
|
76
76
|
}
|