@seafile/sdoc-editor 3.0.247 → 3.0.248

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,25 @@ 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 sourceElement = null;
31
- var targetElement = null;
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 isEventInCurrentEditor = (0, _react.useCallback)(function (event) {
44
+ var _sideToolbarContainer;
45
+ var editorContainer = (_sideToolbarContainer = sideToolbarContainerRef.current) === null || _sideToolbarContainer === void 0 ? void 0 : _sideToolbarContainer.closest('.sdoc-article-container');
46
+ var eventTarget = event.target || event.currentTarget;
47
+ return Boolean(editorContainer && eventTarget && editorContainer.contains(eventTarget));
48
+ }, []);
36
49
  var _useState = (0, _react.useState)(null),
37
50
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
38
51
  slateNode = _useState2[0],
@@ -255,6 +268,7 @@ var SideToolbar = function SideToolbar() {
255
268
  }, [editor, isShowSideMenu, slateNode]);
256
269
  var dragStart = (0, _react.useCallback)(function (event) {
257
270
  event.stopPropagation();
271
+ sourceElementRef.current = null;
258
272
  // Create the preview container when dragging more than one listNodes
259
273
  var noDrag = _slate.Path.equals(editor.selection.focus.path, editor.selection.anchor.path);
260
274
  if (showSelectedNodesRef.current && showSelectedNodesRef.current.length > 1 && !noDrag) {
@@ -285,7 +299,7 @@ var SideToolbar = function SideToolbar() {
285
299
  }, 0);
286
300
  return;
287
301
  }
288
- sourceElement = _slateReact.ReactEditor.toDOMNode(editor, slateNode);
302
+ sourceElementRef.current = _slateReact.ReactEditor.toDOMNode(editor, slateNode);
289
303
  var path = _slateReact.ReactEditor.findPath(editor, slateNode);
290
304
 
291
305
  // Dragging the first element within the blockquote drags the entire blockquote by default.
@@ -293,26 +307,29 @@ var SideToolbar = function SideToolbar() {
293
307
  return p === 0;
294
308
  })) {
295
309
  var nodeEntry = _slate.Editor.node(editor, [path[0]]);
296
- sourceElement = _slateReact.ReactEditor.toDOMNode(editor, nodeEntry[0]);
310
+ sourceElementRef.current = _slateReact.ReactEditor.toDOMNode(editor, nodeEntry[0]);
297
311
  }
298
- event.dataTransfer.setDragImage(sourceElement, 0, 0);
312
+ event.dataTransfer.setDragImage(sourceElementRef.current, 0, 0);
299
313
  event.dataTransfer.setData(_event.DRAG_SDOC_EDITOR_ELEMENT, true);
300
314
  }, [editor, slateNode]);
301
315
  var dragOver = (0, _react.useCallback)(function (event) {
316
+ if (!isEventInCurrentEditor(event)) return;
302
317
  var dragTypes = event.dataTransfer.types;
303
318
  if (!dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT)) return;
304
319
  var overElement = event.currentTarget;
305
320
  if (!overElement.classList.contains('sdoc-dragging')) {
306
321
  overElement.classList.add('sdoc-dragging');
307
322
  }
308
- }, []);
323
+ }, [isEventInCurrentEditor]);
309
324
  var dragLeave = (0, _react.useCallback)(function (event) {
325
+ if (!isEventInCurrentEditor(event)) return;
310
326
  var leaveElement = event.currentTarget;
311
327
  leaveElement.classList.remove('sdoc-dragging');
312
- }, []);
328
+ }, [isEventInCurrentEditor]);
313
329
  var drop = (0, _react.useCallback)(function (event) {
314
330
  var _parentNode$children$;
315
- targetElement = event.currentTarget;
331
+ if (!isEventInCurrentEditor(event)) return;
332
+ var targetElement = event.currentTarget;
316
333
  targetElement.classList.remove('sdoc-dragging');
317
334
  var dragTypes = event.dataTransfer.types;
318
335
  if (!dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT) && dragTypes[0] !== 'Files') return;
@@ -322,16 +339,18 @@ var SideToolbar = function SideToolbar() {
322
339
 
323
340
  // Drag local image files to sdoc
324
341
  if (event.dataTransfer.files.length > 0) {
325
- var _getNodeEntry = (0, _helpers2.getNodeEntry)(editor, targetElement),
326
- _getNodeEntry2 = (0, _slicedToArray2["default"])(_getNodeEntry, 2),
327
- _targetPath = _getNodeEntry2[1];
342
+ var _getSafeNodeEntry = getSafeNodeEntry(editor, targetElement),
343
+ _getSafeNodeEntry2 = (0, _slicedToArray2["default"])(_getSafeNodeEntry, 2),
344
+ _targetPath = _getSafeNodeEntry2[1];
328
345
  (0, _helpers.insertImageFiles)(event.dataTransfer.files, editor, _targetPath);
329
346
  return;
330
347
  }
331
- var _getNodeEntry3 = (0, _helpers2.getNodeEntry)(editor, targetElement),
332
- _getNodeEntry4 = (0, _slicedToArray2["default"])(_getNodeEntry3, 2),
333
- targetNode = _getNodeEntry4[0],
334
- targetPath = _getNodeEntry4[1];
348
+ var _getSafeNodeEntry3 = getSafeNodeEntry(editor, targetElement),
349
+ _getSafeNodeEntry4 = (0, _slicedToArray2["default"])(_getSafeNodeEntry3, 2),
350
+ targetNode = _getSafeNodeEntry4[0],
351
+ targetPath = _getSafeNodeEntry4[1];
352
+ if (!targetNode || !targetPath) return;
353
+
335
354
  // Drag multiple list_items nodes
336
355
  if (draggedSourcePaths.current) {
337
356
  try {
@@ -387,10 +406,12 @@ var SideToolbar = function SideToolbar() {
387
406
  event.dataTransfer.clearData();
388
407
  }
389
408
  }
390
- var _getNodeEntry5 = (0, _helpers2.getNodeEntry)(editor, sourceElement),
391
- _getNodeEntry6 = (0, _slicedToArray2["default"])(_getNodeEntry5, 2),
392
- sourceNode = _getNodeEntry6[0],
393
- sourcePath = _getNodeEntry6[1];
409
+ var _getSafeNodeEntry5 = getSafeNodeEntry(editor, sourceElementRef.current),
410
+ _getSafeNodeEntry6 = (0, _slicedToArray2["default"])(_getSafeNodeEntry5, 2),
411
+ sourceNode = _getSafeNodeEntry6[0],
412
+ sourcePath = _getSafeNodeEntry6[1];
413
+ if (!sourceNode || !sourcePath) return;
414
+
394
415
  // Dragging into a quoteBlock is not supported
395
416
  if ([_constants2.CODE_BLOCK, _constants2.TABLE, _constants2.BLOCKQUOTE].includes(sourceNode.type) && (0, _helpers2.isBlockquote)(editor, [targetPath[0]]) && targetPath.length > 1) {
396
417
  return;
@@ -586,9 +607,8 @@ var SideToolbar = function SideToolbar() {
586
607
  }
587
608
 
588
609
  // reset
589
- sourceElement = null;
590
- targetElement = null;
591
- }, [editor]);
610
+ sourceElementRef.current = null;
611
+ }, [editor, isEventInCurrentEditor]);
592
612
  (0, _react.useEffect)(function () {
593
613
  var eventBus = _eventBus["default"].getInstance();
594
614
  var unSubscribeDragOver = eventBus.subscribe(_constants.INTERNAL_EVENT.ON_DRAG_OVER_BLOCK, dragOver);
@@ -606,30 +626,38 @@ var SideToolbar = function SideToolbar() {
606
626
  var onMouseLeave = (0, _react.useCallback)(function () {
607
627
  setIsEnterMoreVertical(false);
608
628
  }, []);
629
+ var clearAllDragStyles = (0, _react.useCallback)(function () {
630
+ (0, _helpers2.clearDragClass)(activeDragElRef.current);
631
+ activeDragElRef.current = null;
632
+ }, []);
609
633
  var handleDragover = (0, _react.useCallback)(function (event) {
610
- var _target, _target2, _target3;
634
+ var _event$dataTransfer, _target;
611
635
  event.preventDefault();
612
- var dragTypes = event.dataTransfer.types;
613
- if (!dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT)) {
614
- (0, _helpers2.clearDragClass)(activeDragElRef.current);
615
- activeDragElRef.current = null;
636
+ var dragTypes = (_event$dataTransfer = event.dataTransfer) === null || _event$dataTransfer === void 0 ? void 0 : _event$dataTransfer.types;
637
+ if (!(dragTypes !== null && dragTypes !== void 0 && dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT))) {
638
+ clearAllDragStyles();
616
639
  return;
617
640
  }
618
- var _getNodeEntry7 = (0, _helpers2.getNodeEntry)(editor, sourceElement),
619
- _getNodeEntry8 = (0, _slicedToArray2["default"])(_getNodeEntry7, 2),
620
- sourceNode = _getNodeEntry8[0],
621
- sourcePath = _getNodeEntry8[1];
641
+ var _getSafeNodeEntry7 = getSafeNodeEntry(editor, sourceElementRef.current),
642
+ _getSafeNodeEntry8 = (0, _slicedToArray2["default"])(_getSafeNodeEntry7, 2),
643
+ sourceNode = _getSafeNodeEntry8[0],
644
+ sourcePath = _getSafeNodeEntry8[1];
622
645
  if (!sourceNode || !sourcePath) {
623
- (0, _helpers2.clearDragClass)(activeDragElRef.current);
624
- activeDragElRef.current = null;
646
+ clearAllDragStyles();
625
647
  return;
626
648
  }
627
649
 
628
650
  // Not support node type in multi column
629
- if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(sourceNode.type)) return;
651
+ if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(sourceNode.type)) {
652
+ clearAllDragStyles();
653
+ return;
654
+ }
630
655
  // Return if source node is from multi column
631
656
  var topNode = _slate.Node.get(editor, [sourcePath[0]]);
632
- if ([_constants2.MULTI_COLUMN].includes(topNode.type)) return;
657
+ if ([_constants2.MULTI_COLUMN].includes(topNode.type)) {
658
+ clearAllDragStyles();
659
+ return;
660
+ }
633
661
 
634
662
  // Cursor position
635
663
  var x = event.clientX;
@@ -664,23 +692,38 @@ var SideToolbar = function SideToolbar() {
664
692
  } finally {
665
693
  _iterator2.f();
666
694
  }
667
- if (!((_target = target) !== null && _target !== void 0 && _target.el)) return;
695
+ if (!((_target = target) !== null && _target !== void 0 && _target.el)) {
696
+ clearAllDragStyles();
697
+ return;
698
+ }
668
699
  var prevEl = activeDragElRef.current;
669
700
  if (prevEl && prevEl !== target.el) {
670
701
  (0, _helpers2.clearDragClass)(prevEl);
671
702
  }
672
- if (((_target2 = target) === null || _target2 === void 0 ? void 0 : _target2.el) === sourceElement) return;
673
- var _getNodeEntry9 = (0, _helpers2.getNodeEntry)(editor, (_target3 = target) === null || _target3 === void 0 ? void 0 : _target3.el),
674
- _getNodeEntry0 = (0, _slicedToArray2["default"])(_getNodeEntry9, 2),
675
- targetNode = _getNodeEntry0[0],
676
- targetPath = _getNodeEntry0[1];
703
+ if (target.el === sourceElementRef.current) {
704
+ clearAllDragStyles();
705
+ return;
706
+ }
707
+ var _getSafeNodeEntry9 = getSafeNodeEntry(editor, target.el),
708
+ _getSafeNodeEntry0 = (0, _slicedToArray2["default"])(_getSafeNodeEntry9, 2),
709
+ targetNode = _getSafeNodeEntry0[0],
710
+ targetPath = _getSafeNodeEntry0[1];
677
711
 
678
712
  // Not support node type in multi column
679
- if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(targetNode.type)) return;
680
- if (!targetNode || targetPath.length === 0 && ![_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(targetNode.type)) return;
713
+ if (!targetNode || !targetPath || [_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(targetNode.type)) {
714
+ clearAllDragStyles();
715
+ return;
716
+ }
717
+ if (targetPath.length === 0 && ![_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(targetNode.type)) {
718
+ clearAllDragStyles();
719
+ return;
720
+ }
681
721
 
682
722
  // Stop if target node is multi column node with four columns
683
- if (targetNode.type === _constants2.MULTI_COLUMN && targetNode.children.length === 4) return;
723
+ if (targetNode.type === _constants2.MULTI_COLUMN && targetNode.children.length === 4) {
724
+ clearAllDragStyles();
725
+ return;
726
+ }
684
727
 
685
728
  // Add hover style for target node multi column children.
686
729
  // Only use a fixed-width zone around each column boundary so the drop
@@ -688,7 +731,10 @@ var SideToolbar = function SideToolbar() {
688
731
  if (targetNode.type === _constants2.MULTI_COLUMN) {
689
732
  var multiColumnEl = target.el;
690
733
  var columnEls = Array.from(multiColumnEl.querySelectorAll('.sdoc-column-container'));
691
- if (!columnEls.length) return;
734
+ if (!columnEls.length) {
735
+ clearAllDragStyles();
736
+ return;
737
+ }
692
738
  columnEls.forEach(function (col) {
693
739
  return col.classList.remove('sdoc-dragging-left', 'sdoc-dragging', 'sdoc-dragging-right');
694
740
  });
@@ -712,7 +758,7 @@ var SideToolbar = function SideToolbar() {
712
758
  activeColumn.classList.add("sdoc-dragging-".concat(activeDirection));
713
759
  activeDragElRef.current = activeColumn;
714
760
  } else {
715
- activeDragElRef.current = null;
761
+ clearAllDragStyles();
716
762
  }
717
763
  return;
718
764
  }
@@ -733,26 +779,21 @@ var SideToolbar = function SideToolbar() {
733
779
  target.el.classList.remove('sdoc-dragging');
734
780
  activeDragElRef.current = target.el;
735
781
  } else {
736
- activeDragElRef.current = null;
782
+ clearAllDragStyles();
737
783
  }
738
- }, [editor]);
739
- var clearAllDragStyles = (0, _react.useCallback)(function () {
740
- var el = activeDragElRef.current;
741
- (0, _helpers2.clearDragClass)(el);
742
- activeDragElRef.current = null;
743
- }, []);
784
+ }, [clearAllDragStyles, editor]);
744
785
  var handleDrop = (0, _react.useCallback)(function () {
745
786
  var targetEl = activeDragElRef.current;
746
787
  var hasSideDropClass = (targetEl === null || targetEl === void 0 ? void 0 : targetEl.classList.contains('sdoc-dragging-left')) || (targetEl === null || targetEl === void 0 ? void 0 : targetEl.classList.contains('sdoc-dragging-right'));
747
788
  if (!hasSideDropClass) return false;
748
- var _getNodeEntry1 = (0, _helpers2.getNodeEntry)(editor, targetEl),
749
- _getNodeEntry10 = (0, _slicedToArray2["default"])(_getNodeEntry1, 2),
750
- targetNode = _getNodeEntry10[0],
751
- targetPath = _getNodeEntry10[1];
752
- var _getNodeEntry11 = (0, _helpers2.getNodeEntry)(editor, sourceElement),
753
- _getNodeEntry12 = (0, _slicedToArray2["default"])(_getNodeEntry11, 2),
754
- sourceNode = _getNodeEntry12[0],
755
- sourcePath = _getNodeEntry12[1];
789
+ var _getSafeNodeEntry1 = getSafeNodeEntry(editor, targetEl),
790
+ _getSafeNodeEntry10 = (0, _slicedToArray2["default"])(_getSafeNodeEntry1, 2),
791
+ targetNode = _getSafeNodeEntry10[0],
792
+ targetPath = _getSafeNodeEntry10[1];
793
+ var _getSafeNodeEntry11 = getSafeNodeEntry(editor, sourceElementRef.current),
794
+ _getSafeNodeEntry12 = (0, _slicedToArray2["default"])(_getSafeNodeEntry11, 2),
795
+ sourceNode = _getSafeNodeEntry12[0],
796
+ sourcePath = _getSafeNodeEntry12[1];
756
797
  if (!targetNode || !targetPath || !sourceNode || !sourcePath) return false;
757
798
 
758
799
  // When source node is list child, it is equal to drag top list node
@@ -771,6 +812,7 @@ var SideToolbar = function SideToolbar() {
771
812
  at: [sourcePath[0]],
772
813
  to: [targetPath[0], targetPath[1] + 1, 0]
773
814
  });
815
+ return true;
774
816
  }
775
817
  // Insert source node into middle of multi column
776
818
  if (targetEl.classList.contains('sdoc-dragging-left')) {
@@ -779,8 +821,9 @@ var SideToolbar = function SideToolbar() {
779
821
  at: [sourcePath[0]],
780
822
  to: [targetPath[0], targetPath[1], 0]
781
823
  });
824
+ return true;
782
825
  }
783
- return true;
826
+ return false;
784
827
  }
785
828
 
786
829
  // Drop non-multi column into non-multi column situation
@@ -798,7 +841,7 @@ var SideToolbar = function SideToolbar() {
798
841
  leftNode = targetNode;
799
842
  rightNode = sourceNode;
800
843
  } else {
801
- return true;
844
+ return false;
802
845
  }
803
846
 
804
847
  // Form multi column first and then remove source and target node
@@ -812,25 +855,31 @@ var SideToolbar = function SideToolbar() {
812
855
  return true;
813
856
  }, [editor]);
814
857
  var handleDropCapture = (0, _react.useCallback)(function (event) {
815
- var _event$dataTransfer;
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;
858
+ var _event$dataTransfer2;
859
+ var dragTypes = (_event$dataTransfer2 = event.dataTransfer) === null || _event$dataTransfer2 === void 0 ? void 0 : _event$dataTransfer2.types;
860
+ if (!(dragTypes !== null && dragTypes !== void 0 && dragTypes.includes(_event.DRAG_SDOC_EDITOR_ELEMENT))) return;
861
+ var targetEl = activeDragElRef.current;
862
+ var hasSideDropClass = (targetEl === null || targetEl === void 0 ? void 0 : targetEl.classList.contains('sdoc-dragging-left')) || (targetEl === null || targetEl === void 0 ? void 0 : targetEl.classList.contains('sdoc-dragging-right'));
863
+ if (!hasSideDropClass) return;
818
864
  var handled = handleDrop();
819
- if (!handled) return;
865
+ if (!handled) {
866
+ clearAllDragStyles();
867
+ return;
868
+ }
820
869
 
821
- // Block-level onDrop handlers stop propagation. Capture the event on the
822
- // article container so side drops are handled before those handlers run.
870
+ // Only side drops create/extend a multi-column. Stop before the block
871
+ // handlers can process the same drop and mutate Slate a second time.
823
872
  event.preventDefault();
824
873
  event.stopPropagation();
825
874
  clearAllDragStyles();
826
- sourceElement = null;
827
- targetElement = null;
875
+ sourceElementRef.current = null;
828
876
  }, [clearAllDragStyles, handleDrop]);
829
877
  (0, _react.useEffect)(function () {
830
- var editorContainer = document.querySelector('.sdoc-article-container');
878
+ var _sideToolbarContainer2;
879
+ var editorContainer = (_sideToolbarContainer2 = sideToolbarContainerRef.current) === null || _sideToolbarContainer2 === void 0 ? void 0 : _sideToolbarContainer2.closest('.sdoc-article-container');
831
880
  if (!editorContainer) return undefined;
832
881
 
833
- // Use capture phase because block-level drag handlers stop propagation.
882
+ // Capture dragover/drop because block-level handlers stop propagation.
834
883
  editorContainer.addEventListener('dragover', handleDragover, true);
835
884
  editorContainer.addEventListener('dragend', clearAllDragStyles, true);
836
885
  editorContainer.addEventListener('dragleave', clearAllDragStyles, true);
@@ -841,11 +890,12 @@ var SideToolbar = function SideToolbar() {
841
890
  editorContainer.removeEventListener('dragleave', clearAllDragStyles, true);
842
891
  editorContainer.removeEventListener('drop', handleDropCapture, true);
843
892
  };
844
- }, [handleDragover, clearAllDragStyles, handleDropCapture]);
893
+ }, [clearAllDragStyles, handleDragover, handleDropCapture]);
845
894
  return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !_commonUtils.isMobile && /*#__PURE__*/_react["default"].createElement("div", {
846
895
  onAnimationEnd: function onAnimationEnd() {
847
896
  return setIsMoving(false);
848
897
  },
898
+ ref: sideToolbarContainerRef,
849
899
  className: (0, _classnames["default"])('sdoc-side-toolbar-container d-print-none', {
850
900
  'fade-out': isMoving
851
901
  }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "3.0.247",
3
+ "version": "3.0.248",
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": "057969db030ac81ad1c976b6e961e9e4e86774e4"
74
+ "gitHead": "28da2fee93d686e9cf936d227566c47084d3ebf8"
75
75
  }