diff --git a/tests/unit/sortable/sortable_core.js b/tests/unit/sortable/sortable_core.js
index 54069a9bfbd..90d92efa47a 100644
--- a/tests/unit/sortable/sortable_core.js
+++ b/tests/unit/sortable/sortable_core.js
@@ -16,6 +16,32 @@ test( "#9314: Sortable: Items cannot be dragged directly into bottom position",
TestHelpers.sortable.sort( $( "li", el[ 1 ] )[ 0 ], 0, -12, 5, "Dragging the sortable into connected sortable" );
});
+asyncTest( "#3173: Sortable: connected sortables do not scroll on transfer", function() {
+ expect( 1 );
+
+ var element1 = $( "#sortable" ).sortable({
+ connectWith: "#sortable2"
+ }),
+ element2 = $( "#sortable2" ).sortable({
+ connectWith: "#sortable"
+ }),
+ item = element1.find( "li" ).eq( 0 );
+
+ element1.css({"height": "90px", "overflow": "hidden"});
+ element2.css({"height": "90px", "overflow-y": "scroll", "overflow-x": "hidden"});
+
+ item.simulate( "drag", {
+ dy: 175,
+ dx: 0
+ });
+
+ setTimeout(function() {
+ var top = element2.scrollTop();
+ ok( top > 0, "sortable list scrolls down" );
+ start();
+ }, 200 );
+});
+
test( "ui-sortable-handle applied to appropriate element", function() {
expect( 6 );
var item = "
",
diff --git a/ui/sortable.js b/ui/sortable.js
index c7edd3d1fd6..c484daafeb6 100644
--- a/ui/sortable.js
+++ b/ui/sortable.js
@@ -316,7 +316,8 @@ return $.widget("ui.sortable", $.ui.mouse, {
_mouseDrag: function(event) {
var i, item, itemElement, intersection,
o = this.options,
- scrolled = false;
+ scrolled = false,
+ scrollParent, placeholderParent;
//Compute the helpers position
this.position = this._generatePosition(event);
@@ -328,18 +329,27 @@ return $.widget("ui.sortable", $.ui.mouse, {
//Do scrolling
if(this.options.scroll) {
- if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {
+ scrollParent = this.scrollParent[0];
- if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {
- this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
+ if(this.placeholder && (scrollParent !== this.placeholder.parent().get(0))) {
+ placeholderParent = this.placeholder.parent();
+
+ scrollParent = placeholderParent.get(0);
+ this.overflowOffset = placeholderParent.offset();
+ }
+
+ if(scrollParent !== document && scrollParent.tagName !== "HTML") {
+
+ if((this.overflowOffset.top + scrollParent.offsetHeight) - event.pageY < o.scrollSensitivity) {
+ scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {
- this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
+ scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
}
- if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {
- this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
+ if((this.overflowOffset.left + scrollParent.offsetWidth) - event.pageX < o.scrollSensitivity) {
+ scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {
- this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
+ scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
}
} else {