Sortable: Fix positioning when moving a Draggable item into a Sortable

PR gh-1793 removed setting `this.offset.parent` in the Draggable
`refreshPositions` method which broke position calculations when moving
a Draggable item into a connected Sortable. restore that assignment.

Ref gh-1793
Fixes gh-2001
Closes gh-2009
This commit is contained in:
Michał Gołębiowski-Owczarek 2021-11-15 18:39:25 +01:00 committed by GitHub
parent efe3b22517
commit b52ee4012d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 63 additions and 0 deletions

View File

@ -488,6 +488,63 @@ QUnit.test( "{ placholder: String } tbody", function( assert ) {
} );
} );
// gh-2001
// Sortable: Draggable items moved into a sortable had incorrect position
QUnit.test( "{ connectToSortable: Selector } positioning (gh-2001)", function( assert ) {
assert.expect( 1 );
// Code from jQuery Simulate with minor modifications.
function findCenter( elem ) {
var offset,
document = $( elem[ 0 ].ownerDocument );
offset = elem.offset();
return {
x: Math.floor( offset.left + elem.outerWidth() / 2 - document.scrollLeft() ),
y: Math.floor( offset.top + elem.outerHeight() / 2 - document.scrollTop( ) )
};
}
var sortableElem = $( "#sortable" );
sortableElem.css( "position", "relative" );
var item = $( "<div></div>" )
.text( "6" )
.insertBefore( "#sortable" );
// Padding
$( "<div></div>" )
.css( {
width: "100px",
height: "100px"
} )
.insertBefore( "#sortable" );
item.draggable( {
connectToSortable: "#sortable"
} );
sortableElem.sortable();
// Simulate a drag without a drop.
var center = findCenter( item );
item.simulate( "mousedown", {
clientX: center.x,
clientY: center.y
} );
item.simulate( "mousemove", {
clientX: center.x,
clientY: center.y + 60
} );
item.simulate( "mousemove", {
clientX: center.x,
clientY: center.y + 120
} );
assert.ok( item.offset().top > sortableElem.children().eq( 0 ).offset().top,
"Draggable offset correct after moving into a sortable" );
} );
/*
Test("{ revert: false }, default", function() {
ok(false, "missing test - untested code is broken code.");

View File

@ -885,6 +885,12 @@ return $.widget( "ui.sortable", $.ui.mouse, {
this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
false;
// This has to be redone because due to the item being moved out/into the offsetParent,
// the offsetParent's position will change
if ( this.offsetParent && this.helper ) {
this.offset.parent = this._getParentOffset();
}
this._refreshItemPositions( fast );
var i, p;