Bug Tracker

Ticket #3121: ui.droppable.js.patch

File ui.droppable.js.patch, 2.5 KB (added by jeffkretz, 6 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;