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