@seafile/sdoc-editor 3.0.249 → 3.0.251

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.
@@ -26,7 +26,8 @@ var _event = require("./event");
26
26
  var _helpers2 = require("./helpers");
27
27
  var _sideMenu = _interopRequireDefault(require("./side-menu"));
28
28
  require("./index.css");
29
- var HORIZONTAL_DROP_ZONE_WIDTH = 48;
29
+ // Keep the visual drop indicator narrow, but make the invisible hit area easier to reach.
30
+ var HORIZONTAL_DROP_ZONE_WIDTH = 72;
30
31
  var getSafeNodeEntry = function getSafeNodeEntry(editor, element) {
31
32
  try {
32
33
  return (0, _helpers2.getNodeEntry)(editor, element);
@@ -278,6 +279,7 @@ var SideToolbar = function SideToolbar() {
278
279
  event.stopPropagation();
279
280
  sourceElementRef.current = null;
280
281
  isDraggingEditorElementRef.current = true;
282
+ event.dataTransfer.effectAllowed = 'move';
281
283
  // Create the preview container when dragging more than one listNodes
282
284
  var noDrag = _slate.Path.equals(editor.selection.focus.path, editor.selection.anchor.path);
283
285
  if (showSelectedNodesRef.current && showSelectedNodesRef.current.length > 1 && !noDrag) {
@@ -645,9 +647,8 @@ var SideToolbar = function SideToolbar() {
645
647
  isDraggingEditorElementRef.current = false;
646
648
  }, [clearAllDragStyles]);
647
649
  var handleDragover = (0, _react.useCallback)(function (event) {
648
- var _target;
650
+ var _event$target, _event$target$closest, _target;
649
651
  if (!isEditorDrag()) return;
650
- event.preventDefault();
651
652
  var _getSafeNodeEntry7 = getSafeNodeEntry(editor, sourceElementRef.current),
652
653
  _getSafeNodeEntry8 = (0, _slicedToArray2["default"])(_getSafeNodeEntry7, 2),
653
654
  sourceNode = _getSafeNodeEntry8[0],
@@ -677,6 +678,11 @@ var SideToolbar = function SideToolbar() {
677
678
  clearAllDragStyles();
678
679
  return;
679
680
  }
681
+ var eventEditorContainer = (_event$target = event.target) === null || _event$target === void 0 ? void 0 : (_event$target$closest = _event$target.closest) === null || _event$target$closest === void 0 ? void 0 : _event$target$closest.call(_event$target, '.sdoc-article-container');
682
+ if (eventEditorContainer && eventEditorContainer !== editorContainer) {
683
+ clearAllDragStyles();
684
+ return;
685
+ }
680
686
  var containerRect = editorContainer.getBoundingClientRect();
681
687
 
682
688
  // Current visible area of editor container
@@ -769,6 +775,9 @@ var SideToolbar = function SideToolbar() {
769
775
  previousRect = rect;
770
776
  });
771
777
  if (activeColumn) {
778
+ event.preventDefault();
779
+ event.stopPropagation();
780
+ event.dataTransfer.dropEffect = 'move';
772
781
  activeColumn.classList.add("sdoc-dragging-".concat(activeDirection));
773
782
  activeDragElRef.current = activeColumn;
774
783
  pendingSideDropRef.current = {
@@ -806,11 +815,20 @@ var SideToolbar = function SideToolbar() {
806
815
  };
807
816
  } else {
808
817
  clearAllDragStyles();
818
+ return;
809
819
  }
820
+ event.preventDefault();
821
+ event.stopPropagation();
822
+ event.dataTransfer.dropEffect = 'move';
810
823
  }, [clearAllDragStyles, editor, getEditorContainer, isEditorDrag]);
811
824
  var handleDragLeave = (0, _react.useCallback)(function (event) {
825
+ var _pendingSideDropRef$c;
812
826
  var editorContainer = event.currentTarget;
813
827
  var relatedTarget = event.relatedTarget;
828
+ var pendingDropElement = (_pendingSideDropRef$c = pendingSideDropRef.current) === null || _pendingSideDropRef$c === void 0 ? void 0 : _pendingSideDropRef$c.element;
829
+
830
+ // Preserve a pending move within this editor until drop or dragend.
831
+ if (pendingDropElement && editorContainer.contains(pendingDropElement)) return;
814
832
 
815
833
  // Ignore dragleave events from descendants. Some browsers report a null
816
834
  // relatedTarget when moving between block elements, so clearing here
@@ -892,48 +910,36 @@ var SideToolbar = function SideToolbar() {
892
910
  return true;
893
911
  }, [editor]);
894
912
  var handleDropCapture = (0, _react.useCallback)(function (event) {
895
- if (!isEditorDrag() || !pendingSideDropRef.current) return;
913
+ if (!isEditorDrag()) return;
896
914
 
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.
900
- event.preventDefault();
901
- event.stopPropagation();
902
- var handled = handleDrop();
903
- if (!handled) {
904
- resetDragState();
905
- return;
906
- }
915
+ // Recheck the final position and stop the normal block drop for side hits.
916
+ handleDragover(event);
917
+ if (!pendingSideDropRef.current) return;
918
+ handleDrop();
907
919
  resetDragState();
908
- }, [handleDrop, isEditorDrag, resetDragState]);
920
+ }, [handleDragover, handleDrop, isEditorDrag, resetDragState]);
909
921
  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.
922
+ // dragend also fires when the user cancels a drag or releases outside the
923
+ // editor. Only a confirmed drop event may mutate the Slate document.
912
924
  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
925
  resetDragState();
921
- }, [handleDrop, resetDragState]);
926
+ }, [resetDragState]);
922
927
  (0, _react.useEffect)(function () {
923
928
  var editorContainer = getEditorContainer();
924
929
  if (!editorContainer) return undefined;
925
930
 
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.
928
- editorContainer.addEventListener('dragover', handleDragover, true);
931
+ // Side hit areas can extend outside the editor container. Accept them at
932
+ // document level, while the handlers still validate this editor's drag.
933
+ var dragEventTarget = editorContainer.ownerDocument;
934
+ dragEventTarget.addEventListener('dragover', handleDragover, true);
929
935
  editorContainer.addEventListener('dragend', handleDragEnd, true);
930
936
  editorContainer.addEventListener('dragleave', handleDragLeave, true);
931
- editorContainer.addEventListener('drop', handleDropCapture, true);
937
+ dragEventTarget.addEventListener('drop', handleDropCapture, true);
932
938
  return function () {
933
- editorContainer.removeEventListener('dragover', handleDragover, true);
939
+ dragEventTarget.removeEventListener('dragover', handleDragover, true);
934
940
  editorContainer.removeEventListener('dragend', handleDragEnd, true);
935
941
  editorContainer.removeEventListener('dragleave', handleDragLeave, true);
936
- editorContainer.removeEventListener('drop', handleDropCapture, true);
942
+ dragEventTarget.removeEventListener('drop', handleDropCapture, true);
937
943
  };
938
944
  }, [getEditorContainer, handleDragEnd, handleDragLeave, handleDragover, handleDropCapture]);
939
945
  return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, !_commonUtils.isMobile && /*#__PURE__*/_react["default"].createElement("div", {
@@ -950,7 +956,6 @@ var SideToolbar = function SideToolbar() {
950
956
  onMouseDown: onMouseDown,
951
957
  draggable: true,
952
958
  onDragStart: dragStart,
953
- onDragEnd: handleDragEnd,
954
959
  className: "sdoc-side-op-icon",
955
960
  onClick: onShowSideMenuToggle,
956
961
  onMouseEnter: onMouseEnter,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "3.0.249",
3
+ "version": "3.0.251",
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": "c7f6bb39019dd763b4a9bc3f55f04e397d09b04a"
74
+ "gitHead": "fff8d3dc8f019c7a0f0168e906ed6091e11ad0ab"
75
75
  }