Bug Tracker

Ticket #3121: ui.droppable.js.patch

File ui.droppable.js.patch, 2.5 KB (added by jeffkretz, 8 years ago)

Possible patch for "exclusive" draggable.

  • ui.droppable.js

     
    6464                if (this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) {
    6565                        $.ui.plugin.call(this, 'over', [e, this.ui(draggable)]);
    6666                        this.element.triggerHandler("dropover", [e, this.ui(draggable)], this.options.over);
     67                       
     68                        // For an exclusive draggable, note which drop zone it is currently over.
     69                        if (draggable.options.exclusive)
     70                                draggable.options.isover = this;
    6771                }
    6872               
    6973        },
     
    7579                if (this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) {
    7680                        $.ui.plugin.call(this, 'out', [e, this.ui(draggable)]);
    7781                        this.element.triggerHandler("dropout", [e, this.ui(draggable)], this.options.out);
     82                       
     83                        // Add exclusive code.
     84                        draggable.options.isover = null;
    7885                }
    7986               
    8087        },
     
    188195               
    189196        },
    190197        drop: function(draggable, e) {
    191                
     198
     199                // Check if the draggable is set for exclusive and if it has already been flagged as over the first element.
     200                var exclusive = draggable.options.exclusive;
     201                var isover = draggable.options.isover;
     202
    192203                var dropped = false;
    193204                $.each($.ui.ddmanager.droppables, function() {
    194205                       
    195206                        if(!this.options) return;
    196                         if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
     207                        if (!this.options.disabled && this.visible && (!exclusive || !isover || isover==this) && $.ui.intersect(draggable, this, this.options.tolerance))
    197208                                dropped = this.drop.call(this, e);
    198209                       
    199210                        if (!this.options.disabled && this.visible && this.options.accept.call(this.element,(draggable.currentItem || draggable.element))) {
     
    213224                //Run through all droppables and check their positions based on specific tolerance options
    214225                $.each($.ui.ddmanager.droppables, function() {
    215226                       
     227                        // Check if the draggable is set for exclusive and if it has already been flagged as over the first element.
     228                        var exclusive = draggable.options.exclusive;
     229                        var isover = draggable.options.isover;
     230                       
    216231                        if(this.options.disabled || this.greedyChild || !this.visible) return;
    217                         var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
     232                        var intersects = (!exclusive || !isover || isover==this) && $.ui.intersect(draggable, this, this.options.tolerance);
    218233                       
    219234                        var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
    220235                        if(!c) return;