@seafile/sdoc-editor 3.0.247 → 3.0.249
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.
|
@@ -27,12 +27,32 @@ var _helpers2 = require("./helpers");
|
|
|
27
27
|
var _sideMenu = _interopRequireDefault(require("./side-menu"));
|
|
28
28
|
require("./index.css");
|
|
29
29
|
var HORIZONTAL_DROP_ZONE_WIDTH = 48;
|
|
30
|
-
var
|
|
31
|
-
|
|
30
|
+
var getSafeNodeEntry = function getSafeNodeEntry(editor, element) {
|
|
31
|
+
try {
|
|
32
|
+
return (0, _helpers2.getNodeEntry)(editor, element);
|
|
33
|
+
} catch (error) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
};
|
|
32
37
|
var SideToolbar = function SideToolbar() {
|
|
33
38
|
var editor = (0, _slateReact.useSlateStatic)();
|
|
34
39
|
var scrollRef = (0, _useScrollContext.useScrollContext)();
|
|
35
40
|
var menuRef = (0, _react.useRef)(null);
|
|
41
|
+
var sideToolbarContainerRef = (0, _react.useRef)(null);
|
|
42
|
+
var sourceElementRef = (0, _react.useRef)(null);
|
|
43
|
+
var isDraggingEditorElementRef = (0, _react.useRef)(false);
|
|
44
|
+
var getEditorContainer = (0, _react.useCallback)(function () {
|
|
45
|
+
var _sideToolbarContainer;
|
|
46
|
+
return (_sideToolbarContainer = sideToolbarContainerRef.current) === null || _sideToolbarContainer === void 0 ? void 0 : _sideToolbarContainer.closest('.sdoc-article-container');
|
|
47
|
+
}, []);
|
|
48
|
+
var isEventInCurrentEditor = (0, _react.useCallback)(function (event) {
|
|
49
|
+
var editorContainer = getEditorContainer();
|
|
50
|
+
var eventTarget = event.target || event.currentTarget;
|
|
51
|
+
return Boolean(editorContainer && eventTarget && editorContainer.contains(eventTarget));
|
|
52
|
+
}, [getEditorContainer]);
|
|
53
|
+
var isEditorDrag = (0, _react.useCallback)(function () {
|
|
54
|
+
return isDraggingEditorElementRef.current;
|
|
55
|
+
}, []);
|
|
36
56
|
var _useState = (0, _react.useState)(null),
|
|
37
57
|
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
38
58
|
slateNode = _useState2[0],
|
|
@@ -67,6 +87,7 @@ var SideToolbar = function SideToolbar() {
|
|
|
67
87
|
var showSelectedNodesRef = (0, _react.useRef)(null);
|
|
68
88
|
var draggedPreviewContainer = (0, _react.useRef)(null);
|
|
69
89
|
var activeDragElRef = (0, _react.useRef)(null);
|
|
90
|
+
var pendingSideDropRef = (0, _react.useRef)(null);
|
|
70
91
|
var onReset = (0, _react.useCallback)(function () {
|
|
71
92
|
setShowSideMenu(false);
|
|
72
93
|
setMenuPosition({});
|
|
@@ -255,6 +276,8 @@ var SideToolbar = function SideToolbar() {
|
|
|
255
276
|
}, [editor, isShowSideMenu, slateNode]);
|
|
256
277
|
var dragStart = (0, _react.useCallback)(function (event) {
|
|
257
278
|
event.stopPropagation();
|
|
279
|
+
sourceElementRef.current = null;
|
|
280
|
+
isDraggingEditorElementRef.current = true;
|
|
258
281
|
// Create the preview container when dragging more than one listNodes
|
|
259
282
|
var noDrag = _slate.Path.equals(editor.selection.focus.path, editor.selection.anchor.path);
|
|
260
283
|
if (showSelectedNodesRef.current && showSelectedNodesRef.current.length > 1 && !noDrag) {
|
|
@@ -285,7 +308,7 @@ var SideToolbar = function SideToolbar() {
|
|
|
285
308
|
}, 0);
|
|
286
309
|
return;
|
|
287
310
|
}
|
|
288
|
-
|
|
311
|
+
sourceElementRef.current = _slateReact.ReactEditor.toDOMNode(editor, slateNode);
|
|
289
312
|
var path = _slateReact.ReactEditor.findPath(editor, slateNode);
|
|
290
313
|
|
|
291
314
|
// Dragging the first element within the blockquote drags the entire blockquote by default.
|
|
@@ -293,45 +316,49 @@ var SideToolbar = function SideToolbar() {
|
|
|
293
316
|
return p === 0;
|
|
294
317
|
})) {
|
|
295
318
|
var nodeEntry = _slate.Editor.node(editor, [path[0]]);
|
|
296
|
-
|
|
319
|
+
sourceElementRef.current = _slateReact.ReactEditor.toDOMNode(editor, nodeEntry[0]);
|
|
297
320
|
}
|
|
298
|
-
event.dataTransfer.setDragImage(
|
|
321
|
+
event.dataTransfer.setDragImage(sourceElementRef.current, 0, 0);
|
|
299
322
|
event.dataTransfer.setData(_event.DRAG_SDOC_EDITOR_ELEMENT, true);
|
|
300
323
|
}, [editor, slateNode]);
|
|
301
324
|
var dragOver = (0, _react.useCallback)(function (event) {
|
|
302
|
-
|
|
303
|
-
if (!
|
|
325
|
+
if (!isEventInCurrentEditor(event)) return;
|
|
326
|
+
if (!isEditorDrag()) return;
|
|
304
327
|
var overElement = event.currentTarget;
|
|
305
328
|
if (!overElement.classList.contains('sdoc-dragging')) {
|
|
306
329
|
overElement.classList.add('sdoc-dragging');
|
|
307
330
|
}
|
|
308
|
-
}, []);
|
|
331
|
+
}, [isEditorDrag, isEventInCurrentEditor]);
|
|
309
332
|
var dragLeave = (0, _react.useCallback)(function (event) {
|
|
333
|
+
if (!isEventInCurrentEditor(event)) return;
|
|
310
334
|
var leaveElement = event.currentTarget;
|
|
311
335
|
leaveElement.classList.remove('sdoc-dragging');
|
|
312
|
-
}, []);
|
|
336
|
+
}, [isEventInCurrentEditor]);
|
|
313
337
|
var drop = (0, _react.useCallback)(function (event) {
|
|
314
|
-
var _parentNode$children$;
|
|
315
|
-
|
|
338
|
+
var _event$dataTransfer, _parentNode$children$;
|
|
339
|
+
if (!isEventInCurrentEditor(event)) return;
|
|
340
|
+
var targetElement = event.currentTarget;
|
|
316
341
|
targetElement.classList.remove('sdoc-dragging');
|
|
317
|
-
var dragTypes = event.dataTransfer.types;
|
|
318
|
-
if (!
|
|
342
|
+
var dragTypes = ((_event$dataTransfer = event.dataTransfer) === null || _event$dataTransfer === void 0 ? void 0 : _event$dataTransfer.types) || [];
|
|
343
|
+
if (!isEditorDrag() && dragTypes[0] !== 'Files') return;
|
|
319
344
|
|
|
320
345
|
// Prevent dragging table data to the editor
|
|
321
346
|
if (dragTypes.includes(_constants2.TABLE_DRAG_KEY)) return;
|
|
322
347
|
|
|
323
348
|
// Drag local image files to sdoc
|
|
324
349
|
if (event.dataTransfer.files.length > 0) {
|
|
325
|
-
var
|
|
326
|
-
|
|
327
|
-
_targetPath =
|
|
350
|
+
var _getSafeNodeEntry = getSafeNodeEntry(editor, targetElement),
|
|
351
|
+
_getSafeNodeEntry2 = (0, _slicedToArray2["default"])(_getSafeNodeEntry, 2),
|
|
352
|
+
_targetPath = _getSafeNodeEntry2[1];
|
|
328
353
|
(0, _helpers.insertImageFiles)(event.dataTransfer.files, editor, _targetPath);
|
|
329
354
|
return;
|
|
330
355
|
}
|
|
331
|
-
var
|
|
332
|
-
|
|
333
|
-
targetNode =
|
|
334
|
-
targetPath =
|
|
356
|
+
var _getSafeNodeEntry3 = getSafeNodeEntry(editor, targetElement),
|
|
357
|
+
_getSafeNodeEntry4 = (0, _slicedToArray2["default"])(_getSafeNodeEntry3, 2),
|
|
358
|
+
targetNode = _getSafeNodeEntry4[0],
|
|
359
|
+
targetPath = _getSafeNodeEntry4[1];
|
|
360
|
+
if (!targetNode || !targetPath) return;
|
|
361
|
+
|
|
335
362
|
// Drag multiple list_items nodes
|
|
336
363
|
if (draggedSourcePaths.current) {
|
|
337
364
|
try {
|
|
@@ -387,10 +414,12 @@ var SideToolbar = function SideToolbar() {
|
|
|
387
414
|
event.dataTransfer.clearData();
|
|
388
415
|
}
|
|
389
416
|
}
|
|
390
|
-
var
|
|
391
|
-
|
|
392
|
-
sourceNode =
|
|
393
|
-
sourcePath =
|
|
417
|
+
var _getSafeNodeEntry5 = getSafeNodeEntry(editor, sourceElementRef.current),
|
|
418
|
+
_getSafeNodeEntry6 = (0, _slicedToArray2["default"])(_getSafeNodeEntry5, 2),
|
|
419
|
+
sourceNode = _getSafeNodeEntry6[0],
|
|
420
|
+
sourcePath = _getSafeNodeEntry6[1];
|
|
421
|
+
if (!sourceNode || !sourcePath) return;
|
|
422
|
+
|
|
394
423
|
// Dragging into a quoteBlock is not supported
|
|
395
424
|
if ([_constants2.CODE_BLOCK, _constants2.TABLE, _constants2.BLOCKQUOTE].includes(sourceNode.type) && (0, _helpers2.isBlockquote)(editor, [targetPath[0]]) && targetPath.length > 1) {
|
|
396
425
|
return;
|
|
@@ -586,9 +615,8 @@ var SideToolbar = function SideToolbar() {
|
|
|
586
615
|
}
|
|
587
616
|
|
|
588
617
|
// reset
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
}, [editor]);
|
|
618
|
+
sourceElementRef.current = null;
|
|
619
|
+
}, [editor, isEditorDrag, isEventInCurrentEditor]);
|
|
592
620
|
(0, _react.useEffect)(function () {
|
|
593
621
|
var eventBus = _eventBus["default"].getInstance();
|
|
594
622
|
var unSubscribeDragOver = eventBus.subscribe(_constants.INTERNAL_EVENT.ON_DRAG_OVER_BLOCK, dragOver);
|
|
@@ -606,35 +634,49 @@ var SideToolbar = function SideToolbar() {
|
|
|
606
634
|
var onMouseLeave = (0, _react.useCallback)(function () {
|
|
607
635
|
setIsEnterMoreVertical(false);
|
|
608
636
|
}, []);
|
|
637
|
+
var clearAllDragStyles = (0, _react.useCallback)(function () {
|
|
638
|
+
(0, _helpers2.clearDragClass)(activeDragElRef.current);
|
|
639
|
+
activeDragElRef.current = null;
|
|
640
|
+
pendingSideDropRef.current = null;
|
|
641
|
+
}, []);
|
|
642
|
+
var resetDragState = (0, _react.useCallback)(function () {
|
|
643
|
+
clearAllDragStyles();
|
|
644
|
+
sourceElementRef.current = null;
|
|
645
|
+
isDraggingEditorElementRef.current = false;
|
|
646
|
+
}, [clearAllDragStyles]);
|
|
609
647
|
var handleDragover = (0, _react.useCallback)(function (event) {
|
|
610
|
-
var _target
|
|
648
|
+
var _target;
|
|
649
|
+
if (!isEditorDrag()) return;
|
|
611
650
|
event.preventDefault();
|
|
612
|
-
var
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
return;
|
|
617
|
-
}
|
|
618
|
-
var _getNodeEntry7 = (0, _helpers2.getNodeEntry)(editor, sourceElement),
|
|
619
|
-
_getNodeEntry8 = (0, _slicedToArray2["default"])(_getNodeEntry7, 2),
|
|
620
|
-
sourceNode = _getNodeEntry8[0],
|
|
621
|
-
sourcePath = _getNodeEntry8[1];
|
|
651
|
+
var _getSafeNodeEntry7 = getSafeNodeEntry(editor, sourceElementRef.current),
|
|
652
|
+
_getSafeNodeEntry8 = (0, _slicedToArray2["default"])(_getSafeNodeEntry7, 2),
|
|
653
|
+
sourceNode = _getSafeNodeEntry8[0],
|
|
654
|
+
sourcePath = _getSafeNodeEntry8[1];
|
|
622
655
|
if (!sourceNode || !sourcePath) {
|
|
623
|
-
(
|
|
624
|
-
activeDragElRef.current = null;
|
|
656
|
+
clearAllDragStyles();
|
|
625
657
|
return;
|
|
626
658
|
}
|
|
627
659
|
|
|
628
660
|
// Not support node type in multi column
|
|
629
|
-
if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(sourceNode.type))
|
|
661
|
+
if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(sourceNode.type)) {
|
|
662
|
+
clearAllDragStyles();
|
|
663
|
+
return;
|
|
664
|
+
}
|
|
630
665
|
// Return if source node is from multi column
|
|
631
666
|
var topNode = _slate.Node.get(editor, [sourcePath[0]]);
|
|
632
|
-
if ([_constants2.MULTI_COLUMN].includes(topNode.type))
|
|
667
|
+
if ([_constants2.MULTI_COLUMN].includes(topNode.type)) {
|
|
668
|
+
clearAllDragStyles();
|
|
669
|
+
return;
|
|
670
|
+
}
|
|
633
671
|
|
|
634
672
|
// Cursor position
|
|
635
673
|
var x = event.clientX;
|
|
636
674
|
var y = event.clientY;
|
|
637
|
-
var editorContainer =
|
|
675
|
+
var editorContainer = getEditorContainer();
|
|
676
|
+
if (!editorContainer) {
|
|
677
|
+
clearAllDragStyles();
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
638
680
|
var containerRect = editorContainer.getBoundingClientRect();
|
|
639
681
|
|
|
640
682
|
// Current visible area of editor container
|
|
@@ -664,23 +706,38 @@ var SideToolbar = function SideToolbar() {
|
|
|
664
706
|
} finally {
|
|
665
707
|
_iterator2.f();
|
|
666
708
|
}
|
|
667
|
-
if (!((_target = target) !== null && _target !== void 0 && _target.el))
|
|
709
|
+
if (!((_target = target) !== null && _target !== void 0 && _target.el)) {
|
|
710
|
+
clearAllDragStyles();
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
668
713
|
var prevEl = activeDragElRef.current;
|
|
669
714
|
if (prevEl && prevEl !== target.el) {
|
|
670
715
|
(0, _helpers2.clearDragClass)(prevEl);
|
|
671
716
|
}
|
|
672
|
-
if (
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
717
|
+
if (target.el === sourceElementRef.current) {
|
|
718
|
+
clearAllDragStyles();
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
721
|
+
var _getSafeNodeEntry9 = getSafeNodeEntry(editor, target.el),
|
|
722
|
+
_getSafeNodeEntry0 = (0, _slicedToArray2["default"])(_getSafeNodeEntry9, 2),
|
|
723
|
+
targetNode = _getSafeNodeEntry0[0],
|
|
724
|
+
targetPath = _getSafeNodeEntry0[1];
|
|
677
725
|
|
|
678
726
|
// Not support node type in multi column
|
|
679
|
-
if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(targetNode.type))
|
|
680
|
-
|
|
727
|
+
if (!targetNode || !targetPath || [_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(targetNode.type)) {
|
|
728
|
+
clearAllDragStyles();
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
if (targetPath.length === 0 && ![_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(targetNode.type)) {
|
|
732
|
+
clearAllDragStyles();
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
681
735
|
|
|
682
736
|
// Stop if target node is multi column node with four columns
|
|
683
|
-
if (targetNode.type === _constants2.MULTI_COLUMN && targetNode.children.length === 4)
|
|
737
|
+
if (targetNode.type === _constants2.MULTI_COLUMN && targetNode.children.length === 4) {
|
|
738
|
+
clearAllDragStyles();
|
|
739
|
+
return;
|
|
740
|
+
}
|
|
684
741
|
|
|
685
742
|
// Add hover style for target node multi column children.
|
|
686
743
|
// Only use a fixed-width zone around each column boundary so the drop
|
|
@@ -688,7 +745,10 @@ var SideToolbar = function SideToolbar() {
|
|
|
688
745
|
if (targetNode.type === _constants2.MULTI_COLUMN) {
|
|
689
746
|
var multiColumnEl = target.el;
|
|
690
747
|
var columnEls = Array.from(multiColumnEl.querySelectorAll('.sdoc-column-container'));
|
|
691
|
-
if (!columnEls.length)
|
|
748
|
+
if (!columnEls.length) {
|
|
749
|
+
clearAllDragStyles();
|
|
750
|
+
return;
|
|
751
|
+
}
|
|
692
752
|
columnEls.forEach(function (col) {
|
|
693
753
|
return col.classList.remove('sdoc-dragging-left', 'sdoc-dragging', 'sdoc-dragging-right');
|
|
694
754
|
});
|
|
@@ -711,8 +771,12 @@ var SideToolbar = function SideToolbar() {
|
|
|
711
771
|
if (activeColumn) {
|
|
712
772
|
activeColumn.classList.add("sdoc-dragging-".concat(activeDirection));
|
|
713
773
|
activeDragElRef.current = activeColumn;
|
|
774
|
+
pendingSideDropRef.current = {
|
|
775
|
+
element: activeColumn,
|
|
776
|
+
direction: activeDirection
|
|
777
|
+
};
|
|
714
778
|
} else {
|
|
715
|
-
|
|
779
|
+
clearAllDragStyles();
|
|
716
780
|
}
|
|
717
781
|
return;
|
|
718
782
|
}
|
|
@@ -727,32 +791,46 @@ var SideToolbar = function SideToolbar() {
|
|
|
727
791
|
target.el.classList.remove('sdoc-dragging-right');
|
|
728
792
|
target.el.classList.remove('sdoc-dragging');
|
|
729
793
|
activeDragElRef.current = target.el;
|
|
794
|
+
pendingSideDropRef.current = {
|
|
795
|
+
element: target.el,
|
|
796
|
+
direction: 'left'
|
|
797
|
+
};
|
|
730
798
|
} else if (isRightDropZone) {
|
|
731
799
|
target.el.classList.add('sdoc-dragging-right');
|
|
732
800
|
target.el.classList.remove('sdoc-dragging-left');
|
|
733
801
|
target.el.classList.remove('sdoc-dragging');
|
|
734
802
|
activeDragElRef.current = target.el;
|
|
803
|
+
pendingSideDropRef.current = {
|
|
804
|
+
element: target.el,
|
|
805
|
+
direction: 'right'
|
|
806
|
+
};
|
|
735
807
|
} else {
|
|
736
|
-
|
|
808
|
+
clearAllDragStyles();
|
|
737
809
|
}
|
|
738
|
-
}, [editor]);
|
|
739
|
-
var
|
|
740
|
-
var
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
810
|
+
}, [clearAllDragStyles, editor, getEditorContainer, isEditorDrag]);
|
|
811
|
+
var handleDragLeave = (0, _react.useCallback)(function (event) {
|
|
812
|
+
var editorContainer = event.currentTarget;
|
|
813
|
+
var relatedTarget = event.relatedTarget;
|
|
814
|
+
|
|
815
|
+
// Ignore dragleave events from descendants. Some browsers report a null
|
|
816
|
+
// relatedTarget when moving between block elements, so clearing here
|
|
817
|
+
// would remove the active drop zone before the drop event arrives.
|
|
818
|
+
var isLeavingEditor = event.target === editorContainer && (!relatedTarget || !editorContainer.contains(relatedTarget));
|
|
819
|
+
if (isLeavingEditor) clearAllDragStyles();
|
|
820
|
+
}, [clearAllDragStyles]);
|
|
744
821
|
var handleDrop = (0, _react.useCallback)(function () {
|
|
745
|
-
var
|
|
746
|
-
var
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
822
|
+
var pendingDrop = pendingSideDropRef.current;
|
|
823
|
+
var targetEl = (pendingDrop === null || pendingDrop === void 0 ? void 0 : pendingDrop.element) || activeDragElRef.current;
|
|
824
|
+
var direction = (pendingDrop === null || pendingDrop === void 0 ? void 0 : pendingDrop.direction) || (targetEl !== null && targetEl !== void 0 && targetEl.classList.contains('sdoc-dragging-left') ? 'left' : null) || (targetEl !== null && targetEl !== void 0 && targetEl.classList.contains('sdoc-dragging-right') ? 'right' : null);
|
|
825
|
+
if (!targetEl || !direction) return false;
|
|
826
|
+
var _getSafeNodeEntry1 = getSafeNodeEntry(editor, targetEl),
|
|
827
|
+
_getSafeNodeEntry10 = (0, _slicedToArray2["default"])(_getSafeNodeEntry1, 2),
|
|
828
|
+
targetNode = _getSafeNodeEntry10[0],
|
|
829
|
+
targetPath = _getSafeNodeEntry10[1];
|
|
830
|
+
var _getSafeNodeEntry11 = getSafeNodeEntry(editor, sourceElementRef.current),
|
|
831
|
+
_getSafeNodeEntry12 = (0, _slicedToArray2["default"])(_getSafeNodeEntry11, 2),
|
|
832
|
+
sourceNode = _getSafeNodeEntry12[0],
|
|
833
|
+
sourcePath = _getSafeNodeEntry12[1];
|
|
756
834
|
if (!targetNode || !targetPath || !sourceNode || !sourcePath) return false;
|
|
757
835
|
|
|
758
836
|
// When source node is list child, it is equal to drag top list node
|
|
@@ -765,22 +843,24 @@ var SideToolbar = function SideToolbar() {
|
|
|
765
843
|
if (_constants2.COLUMN === targetNode.type) {
|
|
766
844
|
var topTargetNode = _slate.Node.get(editor, [targetPath[0]]); // Top multi column Node
|
|
767
845
|
// Insert source node into last of multi column
|
|
768
|
-
if (
|
|
846
|
+
if (direction === 'right') {
|
|
769
847
|
(0, _helper2.addLastColumnInMultiColumn)(editor, topTargetNode, targetPath);
|
|
770
848
|
_slate.Transforms.moveNodes(editor, {
|
|
771
849
|
at: [sourcePath[0]],
|
|
772
850
|
to: [targetPath[0], targetPath[1] + 1, 0]
|
|
773
851
|
});
|
|
852
|
+
return true;
|
|
774
853
|
}
|
|
775
854
|
// Insert source node into middle of multi column
|
|
776
|
-
if (
|
|
855
|
+
if (direction === 'left') {
|
|
777
856
|
(0, _helper2.addMiddleColumnInMultiColumn)(editor, topTargetNode, targetPath);
|
|
778
857
|
_slate.Transforms.moveNodes(editor, {
|
|
779
858
|
at: [sourcePath[0]],
|
|
780
859
|
to: [targetPath[0], targetPath[1], 0]
|
|
781
860
|
});
|
|
861
|
+
return true;
|
|
782
862
|
}
|
|
783
|
-
return
|
|
863
|
+
return false;
|
|
784
864
|
}
|
|
785
865
|
|
|
786
866
|
// Drop non-multi column into non-multi column situation
|
|
@@ -791,14 +871,14 @@ var SideToolbar = function SideToolbar() {
|
|
|
791
871
|
if (_slate.Path.equals([sourcePath[0]], [targetPath[0]])) return true;
|
|
792
872
|
var leftNode = null;
|
|
793
873
|
var rightNode = null;
|
|
794
|
-
if (
|
|
874
|
+
if (direction === 'left') {
|
|
795
875
|
leftNode = sourceNode;
|
|
796
876
|
rightNode = targetNode;
|
|
797
|
-
} else if (
|
|
877
|
+
} else if (direction === 'right') {
|
|
798
878
|
leftNode = targetNode;
|
|
799
879
|
rightNode = sourceNode;
|
|
800
880
|
} else {
|
|
801
|
-
return
|
|
881
|
+
return false;
|
|
802
882
|
}
|
|
803
883
|
|
|
804
884
|
// Form multi column first and then remove source and target node
|
|
@@ -812,40 +892,55 @@ var SideToolbar = function SideToolbar() {
|
|
|
812
892
|
return true;
|
|
813
893
|
}, [editor]);
|
|
814
894
|
var handleDropCapture = (0, _react.useCallback)(function (event) {
|
|
815
|
-
|
|
816
|
-
var dragTypes = (_event$dataTransfer = event.dataTransfer) === null || _event$dataTransfer === void 0 ? void 0 : _event$dataTransfer.types;
|
|
817
|
-
if (!(dragTypes !== null && dragTypes !== void 0 && dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT)) || !activeDragElRef.current) return;
|
|
818
|
-
var handled = handleDrop();
|
|
819
|
-
if (!handled) return;
|
|
895
|
+
if (!isEditorDrag() || !pendingSideDropRef.current) return;
|
|
820
896
|
|
|
821
|
-
//
|
|
822
|
-
//
|
|
897
|
+
// Stop the normal block drop before mutating Slate. The actual target and
|
|
898
|
+
// direction were recorded during dragover, so this path does not depend
|
|
899
|
+
// on the final drop event target or on a final dragover being delivered.
|
|
823
900
|
event.preventDefault();
|
|
824
901
|
event.stopPropagation();
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
902
|
+
var handled = handleDrop();
|
|
903
|
+
if (!handled) {
|
|
904
|
+
resetDragState();
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
907
|
+
resetDragState();
|
|
908
|
+
}, [handleDrop, isEditorDrag, resetDragState]);
|
|
909
|
+
var handleDragEnd = (0, _react.useCallback)(function () {
|
|
910
|
+
// Both the document listener and React's onDragEnd can observe the same
|
|
911
|
+
// native event. Only the first one owns the drag session and may commit it.
|
|
912
|
+
if (!isDraggingEditorElementRef.current) return;
|
|
913
|
+
|
|
914
|
+
// Some deployed browsers do not deliver the drop event to the editor.
|
|
915
|
+
// The source draggable still receives dragend, so commit a pending side
|
|
916
|
+
// drop here as a fallback.
|
|
917
|
+
if (pendingSideDropRef.current) {
|
|
918
|
+
handleDrop();
|
|
919
|
+
}
|
|
920
|
+
resetDragState();
|
|
921
|
+
}, [handleDrop, resetDragState]);
|
|
829
922
|
(0, _react.useEffect)(function () {
|
|
830
|
-
var editorContainer =
|
|
923
|
+
var editorContainer = getEditorContainer();
|
|
831
924
|
if (!editorContainer) return undefined;
|
|
832
925
|
|
|
833
|
-
//
|
|
926
|
+
// Keep drag events scoped to the current editor container. Capture phase
|
|
927
|
+
// still lets this handler run before block-level handlers in the editor.
|
|
834
928
|
editorContainer.addEventListener('dragover', handleDragover, true);
|
|
835
|
-
editorContainer.addEventListener('dragend',
|
|
836
|
-
editorContainer.addEventListener('dragleave',
|
|
929
|
+
editorContainer.addEventListener('dragend', handleDragEnd, true);
|
|
930
|
+
editorContainer.addEventListener('dragleave', handleDragLeave, true);
|
|
837
931
|
editorContainer.addEventListener('drop', handleDropCapture, true);
|
|
838
932
|
return function () {
|
|
839
933
|
editorContainer.removeEventListener('dragover', handleDragover, true);
|
|
840
|
-
editorContainer.removeEventListener('dragend',
|
|
841
|
-
editorContainer.removeEventListener('dragleave',
|
|
934
|
+
editorContainer.removeEventListener('dragend', handleDragEnd, true);
|
|
935
|
+
editorContainer.removeEventListener('dragleave', handleDragLeave, true);
|
|
842
936
|
editorContainer.removeEventListener('drop', handleDropCapture, true);
|
|
843
937
|
};
|
|
844
|
-
}, [
|
|
938
|
+
}, [getEditorContainer, handleDragEnd, handleDragLeave, handleDragover, handleDropCapture]);
|
|
845
939
|
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !_commonUtils.isMobile && /*#__PURE__*/_react["default"].createElement("div", {
|
|
846
940
|
onAnimationEnd: function onAnimationEnd() {
|
|
847
941
|
return setIsMoving(false);
|
|
848
942
|
},
|
|
943
|
+
ref: sideToolbarContainerRef,
|
|
849
944
|
className: (0, _classnames["default"])('sdoc-side-toolbar-container d-print-none', {
|
|
850
945
|
'fade-out': isMoving
|
|
851
946
|
}),
|
|
@@ -855,6 +950,7 @@ var SideToolbar = function SideToolbar() {
|
|
|
855
950
|
onMouseDown: onMouseDown,
|
|
856
951
|
draggable: true,
|
|
857
952
|
onDragStart: dragStart,
|
|
953
|
+
onDragEnd: handleDragEnd,
|
|
858
954
|
className: "sdoc-side-op-icon",
|
|
859
955
|
onClick: onShowSideMenuToggle,
|
|
860
956
|
onMouseEnter: onMouseEnter,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seafile/sdoc-editor",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.249",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"test": "jest",
|
|
@@ -71,5 +71,5 @@
|
|
|
71
71
|
"publishConfig": {
|
|
72
72
|
"access": "public"
|
|
73
73
|
},
|
|
74
|
-
"gitHead": "
|
|
74
|
+
"gitHead": "c7f6bb39019dd763b4a9bc3f55f04e397d09b04a"
|
|
75
75
|
}
|