aboutsummaryrefslogtreecommitdiffstats
path: root/ui/jquery.ui.sortable.js
diff options
context:
space:
mode:
authorJohn Chen <zhang.z.chen@intel.com>2012-08-17 16:20:45 +0800
committerScott González <scott.gonzalez@gmail.com>2012-10-10 14:56:03 -0400
commitbae06d2b1ef6bbc946dce9fae91f68cc41abccda (patch)
treec1ccf8aa1d5c022ab6b75a5a7cf547f269b1b604 /ui/jquery.ui.sortable.js
parent20e6064711abca6f540e18ec9feca8ece3720324 (diff)
downloadjquery-ui-bae06d2b1ef6bbc946dce9fae91f68cc41abccda.tar.gz
jquery-ui-bae06d2b1ef6bbc946dce9fae91f68cc41abccda.zip
Sortable: Calculating item distance and direction using a more robust algorithm to better support sorting among nested sortables. Fixes #8572 - Wrong placeholder positions. Fixes #8573 - Can't drag an item out of an inner sortable. Fixes #8574 - Hard to put an item between two inner sortables.
Use the item which has the least distance between the mouse pointer and one of its borders to rearrange, with direction being determined by the nearest border. Also we use this algorithm to rearrange even when currentContainer is not changed to override the defective rearrangment in _mouseDrag
Diffstat (limited to 'ui/jquery.ui.sortable.js')
-rw-r--r--ui/jquery.ui.sortable.js18
1 files changed, 14 insertions, 4 deletions
diff --git a/ui/jquery.ui.sortable.js b/ui/jquery.ui.sortable.js
index 0768fdf6e..a2132a9bd 100644
--- a/ui/jquery.ui.sortable.js
+++ b/ui/jquery.ui.sortable.js
@@ -734,16 +734,26 @@ $.widget("ui.sortable", $.ui.mouse, {
if(this.containers.length === 1) {
this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
this.containers[innermostIndex].containerCache.over = 1;
- } else if(this.currentContainer != this.containers[innermostIndex]) {
+ } else {
//When entering a new container, we will find the item with the least distance and append our item near it
- var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
+ var dist = 10000; var itemWithLeastDistance = null;
+ var posProperty = this.containers[innermostIndex].floating ? 'left' : 'top';
+ var sizeProperty = this.containers[innermostIndex].floating ? 'width' : 'height';
+ var base = this.positionAbs[posProperty] + this.offset.click[posProperty];
for (var j = this.items.length - 1; j >= 0; j--) {
if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
- var cur = this.containers[innermostIndex].floating ? this.items[j].item.offset().left : this.items[j].item.offset().top;
+ if(this.items[j].item[0] == this.currentItem[0]) continue;
+ var cur = this.items[j].item.offset()[posProperty];
+ var nearBottom = false;
+ if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
+ nearBottom = true;
+ cur += this.items[j][sizeProperty];
+ }
+
if(Math.abs(cur - base) < dist) {
dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
- this.direction = (cur - base > 0) ? 'down' : 'up';
+ this.direction = nearBottom ? "up": "down";
}
}