02d822950010040302678600b6ef055db683bdb9 tdreszer Thu Jun 2 12:03:59 2011 -0700 Found bug that caused some sets not to budge. Caused by mix between string and number math. Cleaned up no longer needed debugging aid and extra protections that were not needed. Decided to bind mousemove only at dragStart. diff --git src/hg/js/jquery.tablednd.js src/hg/js/jquery.tablednd.js index af1251b..d52a476 100644 --- src/hg/js/jquery.tablednd.js +++ src/hg/js/jquery.tablednd.js @@ -98,69 +98,77 @@ // This is bound to each matching table, set up the defaults and override with user options this.tableDnDConfig = jQuery.extend({ onDragStyle: null, onDropStyle: null, // Add in the default class for whileDragging onDragClass: "tDnD_whileDrag", onDrop: null, onDragStart: null, scrollAmount: 5, serializeRegexp: /[^\-]*$/, // The regular expression to use to trim row IDs serializeParamName: null, // If you want to specify another parameter name instead of the table ID dragHandle: null, // If you give the name of a class here, then only Cells with this class will be draggable dragObjects: [], // UCSC: Allows setting multiple rows to be dragged at one time downOffset: 0, // UCSC: Dragging set, then offset Y to bottom of set upOffset: 0, // UCSC: Dragging set, then offset Y to bottom of set - mouseMoving: false,// UCSC: Prevent overlapping calls to mouse move dragStartIndex : 0 }, options || {}); // Now make the rows draggable jQuery.tableDnD.makeDraggable(this); }); - // Now we need to capture the mouse up and mouse move event - // We can use bind so that we don't interfere with other event handlers - jQuery(document) - .bind('mousemove', jQuery.tableDnD.mousemove) - .bind('mouseup', jQuery.tableDnD.mouseup); + /////// UCSC Move the binding so that it is only done on dragStart + /////// UCSC // Now we need to capture the mouse up and mouse move event + /////// UCSC // We can use bind so that we don't interfere with other event handlers + /////// UCSC jQuery(document) + /////// UCSC .bind('mousemove', jQuery.tableDnD.mousemove) + /////// UCSC .bind('mouseup', jQuery.tableDnD.mouseup); // Don't break the chain return this; }, /** This function makes all the rows on the table draggable apart from those marked as "NoDrag" */ makeDraggable: function(table) { var config = table.tableDnDConfig; if (table.tableDnDConfig.dragHandle) { // We only need to add the event to the specified cells var cells = jQuery("td."+table.tableDnDConfig.dragHandle, table); cells.each(function() { // The cell is bound to "this" jQuery(this).mousedown(function(ev) { if(ev.button > 1) return true; if(jQuery.tableDnD == undefined) return false; jQuery.tableDnD.dragObject = this.parentNode; jQuery.tableDnD.currentTable = table; jQuery.tableDnD.mouseOffset = jQuery.tableDnD.getMouseOffset(this, ev); config.dragStartIndex = $(jQuery.tableDnD.dragObject).attr('rowIndex'); if (config.onDragStart) { // Call the onDrop method if there is one config.onDragStart(ev, table, this.parentNode); /////// UCSC + // Initialize oldY to avoid movingDown as first action + jQuery.tableDnD.oldY = jQuery.tableDnD.mouseCoords(ev).y - jQuery.tableDnD.mouseOffset.y; + + // Capture the mouse move events only if dragStart + jQuery(document) + .bind('mousemove', jQuery.tableDnD.mousemove) + .bind('mouseup', jQuery.tableDnD.mouseup); + config.downOffset = 0; config.upOffset = 0; if (config.dragObjects.length > 1) { for(var ix = 0; ix < config.dragObjects.length; ix++) { var row = config.dragObjects[ix]; var rowIx = $(row).attr('rowIndex'); if (rowIx < config.dragStartIndex) config.upOffset -= $(row).height(); else if (rowIx > config.dragStartIndex) config.downOffset += $(row).height(); } } /////// UCSC } return false; @@ -240,183 +248,158 @@ while (e.offsetParent){ left += e.offsetLeft; top += e.offsetTop; e = e.offsetParent; } left += e.offsetLeft; top += e.offsetTop; ///////return {x:left, y:top}; return {x:left, y:top, height:eHeight}; ///////////// Height was added by tim because of tall tracks }, mousemove: function(ev) { - if(jQuery.tableDnD == undefined) { + if(jQuery.tableDnD == undefined + || jQuery.tableDnD.dragObject == null) { //// UCSC Binding should occur at dragStart jQuery(document) .unbind('mousemove')//, jQuery.tableDnD.mousemove); .unbind('mouseup');//, jQuery.tableDnD.mouseup); return; } - if (jQuery.tableDnD.dragObject == null) { - return; - } - ////////// UCSC - if (jQuery.tableDnD.currentTable.mouseMoving == true) - return; - jQuery.tableDnD.currentTable.mouseMoving = true; - ////////// UCSC + ///// UCSC if (jQuery.tableDnD.dragObject == null) { + ///// UCSC return; + ///// UCSC } var dragObj = jQuery(jQuery.tableDnD.dragObject); var config = jQuery.tableDnD.currentTable.tableDnDConfig; var mousePos = jQuery.tableDnD.mouseCoords(ev); var y = mousePos.y - jQuery.tableDnD.mouseOffset.y; - ////////// UCSC added truncation and ignoring old zero - y = y.toPrecision(); - if (jQuery.tableDnD.oldY == 0) { - jQuery.tableDnD.oldY = y; - } - ////////// UCSC //auto scroll the window var yOffset = window.pageYOffset; if (document.all) { // Windows version //yOffset=document.body.scrollTop; if (typeof document.compatMode != 'undefined' && document.compatMode != 'BackCompat') { yOffset = document.documentElement.scrollTop; } else if (typeof document.body != 'undefined') { yOffset=document.body.scrollTop; } } if (mousePos.y - yOffset < config.scrollAmount) { window.scrollBy(0, -config.scrollAmount); } else { var windowHeight = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight; if (windowHeight-(mousePos.y - yOffset) < config.scrollAmount) { window.scrollBy(0, config.scrollAmount); } } - ///// UCSC if (y != jQuery.tableDnD.oldY) { - if (Math.abs(y - jQuery.tableDnD.oldY) > 8) { //// UCSC some minimal move before handling + if (y != jQuery.tableDnD.oldY) { // work out if we're going up or down... var movingDown = y > jQuery.tableDnD.oldY; // update the old value - ////// UCSC jQuery.tableDnD.oldY = y; // Do this below, only when rows have moved. + jQuery.tableDnD.oldY = y; // update the style to show we're dragging if (config.onDragClass) { ////// UCSC if (config.dragObjects.length > 1) config.dragObjects.addClass(config.onDragClass); else ////// UCSC dragObj.addClass(config.onDragClass); } else { ////// UCSC if (config.dragObjects.length > 1) config.css(config.onDragStyle); else ////// UCSC dragObj.css(config.onDragStyle); } // If we're over a row then move the dragged row to there so that the user sees the // effect dynamically - var currentRow = jQuery.tableDnD.findDropTargetRow(dragObj, y); ////// UCSC + var currentRow = null; // While dragObjects is the set, the order could vary from table order. Therefore us rowIndexes. var rows = jQuery.tableDnD.currentTable.rows; var firstDragRowIx = 9999; // Discover indexes var lastDragRowIx = 0; if (config.dragObjects.length > 1) { for (var ix=0;ix < config.dragObjects.length;ix++) { var thisIx = $( config.dragObjects[ix] ).attr('rowIndex'); if (firstDragRowIx > thisIx) firstDragRowIx = thisIx; if (lastDragRowIx < thisIx) lastDragRowIx = thisIx; } if (movingDown) currentRow = jQuery.tableDnD.findDropTargetRow(rows[lastDragRowIx], y + config.downOffset); else currentRow = jQuery.tableDnD.findDropTargetRow(rows[firstDragRowIx], y + config.upOffset); - } ////// UCSC + } else ////// UCSC + currentRow = jQuery.tableDnD.findDropTargetRow(dragObj, y); + if (currentRow) { ////// UCSC if (config.dragObjects.length > 1) { var targetRowIx = $( currentRow ).attr('rowIndex'); if (targetRowIx >= 0 && targetRowIx < rows.length) { if (movingDown) { // && config.dragObjects[config.dragObjects.length - 1] != currentRow) { // A whole new tack: since movingUp never fails, always move target (and others) up if ((lastDragRowIx - firstDragRowIx) == (config.dragObjects.length - 1) && firstDragRowIx >= 0 && lastDragRowIx < targetRowIx) { var plusIx=0; for(var ix=lastDragRowIx+1; ix <= targetRowIx; ix++) { - //try { // use try/catch because sometimes rows go missing when moving $( rows[ix] ).insertBefore( $( rows[firstDragRowIx + plusIx] ) ); plusIx++; - //} catch (err) { - // warn('movingDown: lastDragRowIx:'+lastDragRowIx+' targetRowIx:'+targetRowIx+' y:'+y+' oldY:'+jQuery.tableDnD.oldY+'
' + err); - //} } - jQuery.tableDnD.oldY = y; - } //else - // warn('down blocked: targetRowIx:'+targetRowIx+' dragRows:'+firstDragRowIx+'-'+lastDragRowIx+' y:'+y+' oldY:'+jQuery.tableDnD.oldY); - + } } else if (!movingDown) { // && config.dragObjects[0] != currentRow) { if ((lastDragRowIx - firstDragRowIx) == (config.dragObjects.length - 1) && firstDragRowIx >= 0 && firstDragRowIx > targetRowIx) { var plusIx=0; for(var ix=firstDragRowIx; ix <= lastDragRowIx; ix++) { - //try { // use try/catch because sometimes rows go missing when moving $(rows[ix]).insertBefore( rows[targetRowIx + plusIx] ); plusIx++; - //} catch (err) { // just put them all back - // warn('movingUp: targetRowIx:'+targetRowIx+' dragRows:'+firstDragRowIx+'-'+lastDragRowIx+' y:'+y+' oldY:'+jQuery.tableDnD.oldY+'
' + err); - //} } - jQuery.tableDnD.oldY = y; - } //else - // warn('up blocked: targetRowIx:'+targetRowIx+' dragRows:'+firstDragRowIx+'-'+lastDragRowIx+' y:'+y+' oldY:'+jQuery.tableDnD.oldY); } - } else - warn('blocked: targetRowIx:'+targetRowIx+' dragRows:'+firstDragRowIx+'-'+lastDragRowIx+' y:'+y+' oldY:'+jQuery.tableDnD.oldY); + } + } } else { ////// UCSC // TODO worry about what happens when there are multiple TBODIES if (movingDown && jQuery.tableDnD.dragObject != currentRow) { jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow.nextSibling); } else if (! movingDown && jQuery.tableDnD.dragObject != currentRow) { jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow); } - jQuery.tableDnD.oldY = y; } ////// UCSC } } - jQuery.tableDnD.currentTable.mouseMoving = false; ////////// UCSC return false; }, /** We're only worried about the y position really, because we can only move rows up and down */ findDropTargetRow: function(draggedRow, y) { var rows = jQuery.tableDnD.currentTable.rows; for (var i=0; i