I’m adding support for dragging and dropping rows to jQuery, and as you can probably tell from reading this blog, I’m lazy. I don’t want to reinvent the wheel, so I was not very keen on the idea of trying to implement dragging from scratch. jQuery UI to the rescue! But some quick Googling had me discouraged. I couldn’t find any examples where people had successfully used the draggable and droppable plugins in the manner I wanted. Ugh.
Still, I decided to give it a shot, and low-and-behold, I got it working! The hard part was figuring out some of the options because the jQuery UI documentation is not very helpful. The actual code was quite simple.
CSS:
<style type="text/css">
tr.draggable > td > div.ui-state-default
{
cursor: move;
}
.ghost
{
background-color: Gray;
opacity: 0.5;
}
</style>
Markup:
<table>
<tr class="draggable droppable">
<td><div class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-grip-dotted-vertical"/></div></td>
<td>Test 1</td>
<td>Test 1</td>
</tr>
<tr class="draggable droppable">
<td><div class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-grip-dotted-vertical"/></div></td>
<td>Test 2</td>
<td>Test 2</td>
</tr>
<tr class="draggable droppable">
<td><div class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-grip-dotted-vertical"/></div></td>
<td>Test 3</td>
<td>Test 3</td>
</tr>
<tr class="draggable droppable">
<td><div class="ui-state-default ui-corner-all"><span class="ui-icon ui-icon-grip-dotted-vertical"/></div></td>
<td>Test 4</td>
<td>Test 4</td>
</tr>
</table>
And finally script:
$(".draggable").draggable(
{
helper: function() { return "<div class='ghost'></div>"; },
start: resizeGhost,
revert: 'invalid',
handle: 'span'
});
function resizeGhost(event, ui) {
var helper = ui.helper;
var element = $(event.target);
helper.width(element.width());
helper.height(element.height());
}
$(".droppable").droppable({
hoverClass: 'ui-state-active',
drop: function(event, ui) {
var target = $(event.target);
var draggable = ui.draggable;
draggable.insertBefore(target);
}
});
Note that most of the jQuery UI classes I’ve applied are not required, I just used them to get a nice drag handle.
Tags: