[jQuery] ReNestableTree, raw code
Hi,
I just cooked up this code allowing a tree structure to be re-nested.
It works very similar to the NestedSortables plugin, except that it
doesn't allow to sort the list, only to change the nesting of
elements. Its way more stable than NestedSortables (at least in my
tests so far), has no dependencies other than ui.draggable and
ui.droppable, works with the latest versions of jQuery and is very
minimalist.
What's it good for?
It's perfect as an admin interface for tree structured data, like,
say, a category tree.
What's needed?
Developed on jQuery 1.2.6 with jquery.ui.draggable and
jquery.ui.droppable version 1.6b.
Expects a nested list of data like:
<div id="list_container">
<ul id="sortable_list">
<li id="1">Item 1</li>
<li id="2">Item 2
<ul>
<li id="3">Item 3</li>
...
</ul>
</li>
...
</ul>
</div>
Here's the code:
jQuery(function () {
$('#sortable_list li').draggable({
revert : 'invalid',
start : function (e, ui) {
// creating a temporary <div> that will be dragged around.
// works around some unwanted behavior, like being able to
// drag elements onto their own children.
// can be customized via CSS class .dragHelper
$(this).hide();
var helper_id = this.id+"-helper";
$(document.createElement('div')).append($(this).html())
.css({ position : 'absolute' })
.appendTo('#list_container')
.attr({ id : helper_id, class : 'dragHelper'});
$('body').mousemove(function (e) {
$('#'+helper_id).css({
top : (e.pageY - ($('#'+helper_id).height()/2))+'px',
left : (e.pageX - ($('#'+helper_id).width()/2))+'px'
});
});
},
stop : function (e, ui) {
$(this).show().css({ top : 'inherit', left : 'inherit' });
$('body').unbind('mousemove');
$('#'+this.id+'-helper').remove();
}
}).droppable({
hoverClass : 'hoverDroppable',
tolerance : 'pointer',
accept : 'li',
drop : function (e, ui) {
if ($(this).children('ul').length) {
$(this).children('ul:first').append(ui.draggable);
} else {
$(this).append($
(document.createElement('ul')).append(ui.draggable));
}
$('#output').html(ui.draggable.attr('id') + ' is now a child of ' +
this.id);
}
});
});
The last line ($('#output')...) should be changed to send the element
id and new parent id to the server, where it can be saved to the
database, or whatever else needs to be done.
It's far from being a ready-to-use plugin, but I thought somebody
might find this useful to play around with.
Chrs,
Dav