@seafile/sdoc-editor 3.0.246 → 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,20 +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 _getNodeEntry7 = (0, _helpers2.getNodeEntry)(editor, sourceElement),
613
- _getNodeEntry8 = (0, _slicedToArray2["default"])(_getNodeEntry7, 2),
614
- sourceNode = _getNodeEntry8[0],
615
- sourcePath = _getNodeEntry8[1];
616
- if (!sourceNode || !sourcePath) return;
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();
639
+ return;
640
+ }
641
+ var _getSafeNodeEntry7 = getSafeNodeEntry(editor, sourceElementRef.current),
642
+ _getSafeNodeEntry8 = (0, _slicedToArray2["default"])(_getSafeNodeEntry7, 2),
643
+ sourceNode = _getSafeNodeEntry8[0],
644
+ sourcePath = _getSafeNodeEntry8[1];
645
+ if (!sourceNode || !sourcePath) {
646
+ clearAllDragStyles();
647
+ return;
648
+ }
617
649
 
618
650
  // Not support node type in multi column
619
- 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
+ }
620
655
  // Return if source node is from multi column
621
656
  var topNode = _slate.Node.get(editor, [sourcePath[0]]);
622
- if ([_constants2.MULTI_COLUMN].includes(topNode.type)) return;
657
+ if ([_constants2.MULTI_COLUMN].includes(topNode.type)) {
658
+ clearAllDragStyles();
659
+ return;
660
+ }
623
661
 
624
662
  // Cursor position
625
663
  var x = event.clientX;
@@ -654,23 +692,38 @@ var SideToolbar = function SideToolbar() {
654
692
  } finally {
655
693
  _iterator2.f();
656
694
  }
657
- 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
+ }
658
699
  var prevEl = activeDragElRef.current;
659
700
  if (prevEl && prevEl !== target.el) {
660
701
  (0, _helpers2.clearDragClass)(prevEl);
661
702
  }
662
- if (((_target2 = target) === null || _target2 === void 0 ? void 0 : _target2.el) === sourceElement) return;
663
- var _getNodeEntry9 = (0, _helpers2.getNodeEntry)(editor, (_target3 = target) === null || _target3 === void 0 ? void 0 : _target3.el),
664
- _getNodeEntry0 = (0, _slicedToArray2["default"])(_getNodeEntry9, 2),
665
- targetNode = _getNodeEntry0[0],
666
- 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];
667
711
 
668
712
  // Not support node type in multi column
669
- if ([_constants2.TABLE, _constants2.VIDEO, _constants2.CODE_BLOCK, _constants2.WHITEBOARD, _constants2.FORMULA].includes(targetNode.type)) return;
670
- 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
+ }
671
721
 
672
722
  // Stop if target node is multi column node with four columns
673
- 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
+ }
674
727
 
675
728
  // Add hover style for target node multi column children.
676
729
  // Only use a fixed-width zone around each column boundary so the drop
@@ -678,7 +731,10 @@ var SideToolbar = function SideToolbar() {
678
731
  if (targetNode.type === _constants2.MULTI_COLUMN) {
679
732
  var multiColumnEl = target.el;
680
733
  var columnEls = Array.from(multiColumnEl.querySelectorAll('.sdoc-column-container'));
681
- if (!columnEls.length) return;
734
+ if (!columnEls.length) {
735
+ clearAllDragStyles();
736
+ return;
737
+ }
682
738
  columnEls.forEach(function (col) {
683
739
  return col.classList.remove('sdoc-dragging-left', 'sdoc-dragging', 'sdoc-dragging-right');
684
740
  });
@@ -702,7 +758,7 @@ var SideToolbar = function SideToolbar() {
702
758
  activeColumn.classList.add("sdoc-dragging-".concat(activeDirection));
703
759
  activeDragElRef.current = activeColumn;
704
760
  } else {
705
- activeDragElRef.current = null;
761
+ clearAllDragStyles();
706
762
  }
707
763
  return;
708
764
  }
@@ -723,25 +779,22 @@ var SideToolbar = function SideToolbar() {
723
779
  target.el.classList.remove('sdoc-dragging');
724
780
  activeDragElRef.current = target.el;
725
781
  } else {
726
- activeDragElRef.current = null;
782
+ clearAllDragStyles();
727
783
  }
728
- }, [editor]);
729
- var clearAllDragStyles = (0, _react.useCallback)(function () {
730
- var el = activeDragElRef.current;
731
- (0, _helpers2.clearDragClass)(el);
732
- activeDragElRef.current = null;
733
- }, []);
784
+ }, [clearAllDragStyles, editor]);
734
785
  var handleDrop = (0, _react.useCallback)(function () {
735
786
  var targetEl = activeDragElRef.current;
736
- var _getNodeEntry1 = (0, _helpers2.getNodeEntry)(editor, targetEl),
737
- _getNodeEntry10 = (0, _slicedToArray2["default"])(_getNodeEntry1, 2),
738
- targetNode = _getNodeEntry10[0],
739
- targetPath = _getNodeEntry10[1];
740
- var _getNodeEntry11 = (0, _helpers2.getNodeEntry)(editor, sourceElement),
741
- _getNodeEntry12 = (0, _slicedToArray2["default"])(_getNodeEntry11, 2),
742
- sourceNode = _getNodeEntry12[0],
743
- sourcePath = _getNodeEntry12[1];
744
- if (!targetPath || !sourcePath) return;
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'));
788
+ if (!hasSideDropClass) return false;
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];
797
+ if (!targetNode || !targetPath || !sourceNode || !sourcePath) return false;
745
798
 
746
799
  // When source node is list child, it is equal to drag top list node
747
800
  var topSourceNode = _slate.Node.get(editor, [sourcePath[0]]);
@@ -759,6 +812,7 @@ var SideToolbar = function SideToolbar() {
759
812
  at: [sourcePath[0]],
760
813
  to: [targetPath[0], targetPath[1] + 1, 0]
761
814
  });
815
+ return true;
762
816
  }
763
817
  // Insert source node into middle of multi column
764
818
  if (targetEl.classList.contains('sdoc-dragging-left')) {
@@ -767,8 +821,9 @@ var SideToolbar = function SideToolbar() {
767
821
  at: [sourcePath[0]],
768
822
  to: [targetPath[0], targetPath[1], 0]
769
823
  });
824
+ return true;
770
825
  }
771
- return;
826
+ return false;
772
827
  }
773
828
 
774
829
  // Drop non-multi column into non-multi column situation
@@ -776,7 +831,7 @@ var SideToolbar = function SideToolbar() {
776
831
  if ([_constants2.ORDERED_LIST, _constants2.UNORDERED_LIST].includes(targetNode.type)) {
777
832
  targetPath = _slateReact.ReactEditor.findPath(editor, targetNode);
778
833
  }
779
- if (_slate.Path.equals([sourcePath[0]], [targetPath[0]])) return;
834
+ if (_slate.Path.equals([sourcePath[0]], [targetPath[0]])) return true;
780
835
  var leftNode = null;
781
836
  var rightNode = null;
782
837
  if (targetEl.classList.contains('sdoc-dragging-left')) {
@@ -786,7 +841,7 @@ var SideToolbar = function SideToolbar() {
786
841
  leftNode = targetNode;
787
842
  rightNode = sourceNode;
788
843
  } else {
789
- return;
844
+ return false;
790
845
  }
791
846
 
792
847
  // Form multi column first and then remove source and target node
@@ -797,25 +852,50 @@ var SideToolbar = function SideToolbar() {
797
852
  _slate.Transforms.removeNodes(editor, {
798
853
  at: [sourcePath[0]]
799
854
  });
800
- return;
855
+ return true;
801
856
  }, [editor]);
857
+ var handleDropCapture = (0, _react.useCallback)(function (event) {
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;
864
+ var handled = handleDrop();
865
+ if (!handled) {
866
+ clearAllDragStyles();
867
+ return;
868
+ }
869
+
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.
872
+ event.preventDefault();
873
+ event.stopPropagation();
874
+ clearAllDragStyles();
875
+ sourceElementRef.current = null;
876
+ }, [clearAllDragStyles, handleDrop]);
802
877
  (0, _react.useEffect)(function () {
803
- var editorContainer = document.querySelector('.sdoc-article-container');
804
- editorContainer.addEventListener('dragover', handleDragover);
805
- editorContainer.addEventListener('dragend', clearAllDragStyles);
806
- editorContainer.addEventListener('dragleave', clearAllDragStyles);
807
- editorContainer.addEventListener('drop', handleDrop);
878
+ var _sideToolbarContainer2;
879
+ var editorContainer = (_sideToolbarContainer2 = sideToolbarContainerRef.current) === null || _sideToolbarContainer2 === void 0 ? void 0 : _sideToolbarContainer2.closest('.sdoc-article-container');
880
+ if (!editorContainer) return undefined;
881
+
882
+ // Capture dragover/drop because block-level handlers stop propagation.
883
+ editorContainer.addEventListener('dragover', handleDragover, true);
884
+ editorContainer.addEventListener('dragend', clearAllDragStyles, true);
885
+ editorContainer.addEventListener('dragleave', clearAllDragStyles, true);
886
+ editorContainer.addEventListener('drop', handleDropCapture, true);
808
887
  return function () {
809
- editorContainer.removeEventListener('dragover', handleDragover);
810
- editorContainer.removeEventListener('dragend', clearAllDragStyles);
811
- editorContainer.removeEventListener('dragleave', clearAllDragStyles);
812
- editorContainer.removeEventListener('drop', handleDrop);
888
+ editorContainer.removeEventListener('dragover', handleDragover, true);
889
+ editorContainer.removeEventListener('dragend', clearAllDragStyles, true);
890
+ editorContainer.removeEventListener('dragleave', clearAllDragStyles, true);
891
+ editorContainer.removeEventListener('drop', handleDropCapture, true);
813
892
  };
814
- }, [handleDragover, clearAllDragStyles, handleDrop]);
893
+ }, [clearAllDragStyles, handleDragover, handleDropCapture]);
815
894
  return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !_commonUtils.isMobile && /*#__PURE__*/_react["default"].createElement("div", {
816
895
  onAnimationEnd: function onAnimationEnd() {
817
896
  return setIsMoving(false);
818
897
  },
898
+ ref: sideToolbarContainerRef,
819
899
  className: (0, _classnames["default"])('sdoc-side-toolbar-container d-print-none', {
820
900
  'fade-out': isMoving
821
901
  }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "3.0.246",
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": "97f53b824e9f6a38da872969d632dcd238c4b947"
74
+ "gitHead": "28da2fee93d686e9cf936d227566c47084d3ebf8"
75
75
  }