From d2d87dfd2be26523ba3ce1dbfeb987e67a70dff8 Mon Sep 17 00:00:00 2001 From: mohamed yahia Date: Fri, 27 Jun 2025 13:51:39 +0300 Subject: [PATCH] fix drag and drop (#6553) --- .../utils/sorter/DropLocationDeterminer.ts | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/packages/core/src/utils/sorter/DropLocationDeterminer.ts b/packages/core/src/utils/sorter/DropLocationDeterminer.ts index e41e60938..32c887d32 100644 --- a/packages/core/src/utils/sorter/DropLocationDeterminer.ts +++ b/packages/core/src/utils/sorter/DropLocationDeterminer.ts @@ -117,6 +117,7 @@ export class DropLocationDeterminer> ext this.adjustForScroll(); const { targetNode: lastTargetNode } = this.lastMoveData; this.eventHandlers.onMouseMove?.(mouseEvent); + this.cacheContainerPosition(); const { mouseXRelative: mouseX, mouseYRelative: mouseY } = this.getMousePositionRelativeToContainer( mouseEvent.clientX, mouseEvent.clientY, @@ -279,17 +280,6 @@ export class DropLocationDeterminer> ext return newHoveredNode; } - /** - * Checks if the target node has changed and returns the last one if they are identical. - * - * @param targetNode - The newly calculated target node. - * @returns The new or reused target node. - */ - private getOrReuseTargetNode(targetNode?: NodeType): NodeType | undefined { - const lastTargetNode = this.lastMoveData.targetNode; - return targetNode?.equals(lastTargetNode) ? lastTargetNode : targetNode; - } - private getMouseTargetElement(mouseEvent: MouseEvent) { const customTarget = this.containerContext.customTarget; let mouseTarget = this.containerContext.document.elementFromPoint( @@ -382,16 +372,22 @@ export class DropLocationDeterminer> ext targetNode: lastTargetNode, hoveredNode: lastHoveredNode, hoveredIndex: lastHoveredIndex, + mouseEvent: lastMouseEvent, } = this.lastMoveData; const sameHoveredNode = targetNode.equals(lastHoveredNode); targetNode.nodeDimensions = sameHoveredNode ? lastHoveredNode!.nodeDimensions! : this.getDim(targetNode.element!); const hoverIndex = this.getIndexInParent(targetNode, targetNode.nodeDimensions!, mouseX, mouseY); const sameHoveredIndex = hoverIndex === lastHoveredIndex; - const sameHoverPosition = sameHoveredNode && sameHoveredIndex; + const isWithinDropArea = targetNode.isWithinDropBounds(mouseX, mouseY); + const sameHoverPosition = + sameHoveredNode && + sameHoveredIndex && + isWithinDropArea === targetNode.isWithinDropBounds(lastMouseEvent?.clientX ?? 0, lastMouseEvent?.clientY ?? 0); + if (sameHoverPosition && lastTargetNode) return lastTargetNode; - if (!targetNode.isWithinDropBounds(mouseX, mouseY)) { + if (!isWithinDropArea) { return this.handleParentTraversal(targetNode, mouseX, mouseY); } @@ -532,7 +528,8 @@ export class DropLocationDeterminer> ext * * @private */ - private cacheContainerPosition(container: HTMLElement): void { + private cacheContainerPosition(): void { + const container = this.containerContext.container; const containerOffset = offset(container); const containerOffsetTop = this.positionOptions.windowMargin ? Math.abs(containerOffset.top) : containerOffset.top; const containerOffsetLeft = this.positionOptions.windowMargin