Ticket #4703: ui.sortable.js.diff

File ui.sortable.js.diff, 4.7 KB (added by kae, 10 years ago)

much better patch - use this one instead

  • trunk/ui/ui.sortable.js

     
    258258                                &&      this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
    259259                                &&      !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
    260260                                && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
     261                                && itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
    261262                        ) {
    262263
    263264                                this.direction = intersection == 1 ? "down" : "up";
     
    640641        },
    641642
    642643        _contactContainers: function(event) {
     644                // get innermost container that intersects with item
     645                var innermostContainer = null, innermostIndex = null;
    643646                for (var i = this.containers.length - 1; i >= 0; i--){
     647                        // never consider a container that's located within the item itself
     648                        if($.ui.contains(this.currentItem[0],this.containers[i].element[0]))continue;
    644649
    645650                        if(this._intersectsWith(this.containers[i].containerCache)) {
    646                                 if(!this.containers[i].containerCache.over) {
     651                                // if we've already found a container and it's more "inner" than this, then continue
     652                                if(innermostContainer && $.ui.contains(this.containers[i].element[0],innermostContainer.element[0]))continue;
    647653
    648                                         if(this.currentContainer != this.containers[i]) {
    649 
    650                                                 //When entering a new container, we will find the item with the least distance and append our item near it
    651                                                 var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[i].floating ? 'left' : 'top'];
    652                                                 for (var j = this.items.length - 1; j >= 0; j--) {
    653                                                         if(!$.ui.contains(this.containers[i].element[0], this.items[j].item[0])) continue;
    654                                                         var cur = this.items[j][this.containers[i].floating ? 'left' : 'top'];
    655                                                         if(Math.abs(cur - base) < dist) {
    656                                                                 dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
    657                                                         }
    658                                                 }
    659 
    660                                                 if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
    661                                                         continue;
    662 
    663                                                 this.currentContainer = this.containers[i];
    664                                                 itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[i].element, true);
    665                                                 this._trigger("change", event, this._uiHash());
    666                                                 this.containers[i]._trigger("change", event, this._uiHash(this));
    667 
    668                                                 //Update the placeholder
    669                                                 this.options.placeholder.update(this.currentContainer, this.placeholder);
    670 
    671                                         }
    672 
    673                                         this.containers[i]._trigger("over", event, this._uiHash(this));
    674                                         this.containers[i].containerCache.over = 1;
    675                                 }
     654                                innermostContainer = this.containers[i];
     655                                innermostIndex = i;
    676656                        } else {
     657                                // container doesn't intersect. trigger "out" event if necessary
    677658                                if(this.containers[i].containerCache.over) {
    678659                                        this.containers[i]._trigger("out", event, this._uiHash(this));
    679660                                        this.containers[i].containerCache.over = 0;
    680661                                }
    681662                        }
     663                }
    682664
    683                 };
     665                // if no intersecting containers found, return
     666                if(!innermostContainer) return;
     667
     668                // move the item into the container if it's not there already
     669                if(this.currentContainer != this.containers[innermostIndex]) {
     670
     671                        //When entering a new container, we will find the item with the least distance and append our item near it
     672                        var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top'];
     673                        for (var j = this.items.length - 1; j >= 0; j--) {
     674                                if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
     675                                var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top'];
     676                                if(Math.abs(cur - base) < dist) {
     677                                        dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
     678                                }
     679                        }
     680
     681                        if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
     682                                return;
     683
     684                        this.currentContainer = this.containers[innermostIndex];
     685                        itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
     686                        this._trigger("change", event, this._uiHash());
     687                        this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
     688
     689                        //Update the placeholder
     690                        this.options.placeholder.update(this.currentContainer, this.placeholder);
     691
     692                }
     693
     694                this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
     695                this.containers[innermostIndex].containerCache.over = 1;
    684696        },
    685697
    686698        _createHelper: function(event) {