]> source.dussan.org Git - jquery-ui.git/commitdiff
Sortable: Fix positioning when moving a Draggable item into a Sortable
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>
Mon, 15 Nov 2021 17:39:25 +0000 (18:39 +0100)
committerGitHub <noreply@github.com>
Mon, 15 Nov 2021 17:39:25 +0000 (18:39 +0100)
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

tests/unit/sortable/options.js
ui/widgets/sortable.js

index 8af1a2682d089e25564b656241622f746fa04e2c..0905de73cf144dba5d9a4ca4896b510709b7f372 100644 (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.");
index 37ce4b7bb266ece630579f497d8323b637578733..f5dc5ecce31a77d2ac953ecc35b543087669b4c6 100644 (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;