If drag element from one leaf to another, it's hidden value becomes heighbour for target element, so, making one element child of another becomes possible if only it dragged there instantly.
I don't know, what's this, bug or feature, but it causes serious difficulties while editing sorted tree.
Patch:
Index: dragdrop.js
===================================================================
--- dragdrop.js (revision 5831)
+++ dragdrop.js (working copy)
@@ -720,8 +720,17 @@
onHover: function(element, dropon, overlap) {
if(Element.isParent(dropon, element)) return;
- if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
- return;
+ if(Sortable.options(dropon).tree && overlap > .1 && overlap < .86) {
+ if(overlap>0.1&&overlap<0.6) {
+ var oldParentNode = element.parentNode;
+ var droponOptions = Sortable.options(dropon);
+ var children = Sortable.findElements(dropon, {tag: droponOptions.treeTag, only: droponOptions.only});
+ if(dropon.tagName.toUpperCase() == Sortable.options(dropon).tag.toUpperCase() && children.length==1){
+ children[0].insertBefore(element, null);
+ Sortable.options(oldParentNode).onChange(element);
+ droponOptions.onChange(element);
+ }
+ }
} else if(overlap>0.5) {
Sortable.mark(dropon, 'before');
if(dropon.previousSibling != element) {
@@ -756,7 +765,7 @@
var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
var child = null;
- if(children) {
+ if(children.length) {
var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
for (index = 0; index < children.length; index += 1) {
When element dragged in half of dropon element and dropon element is empty and contains one <ul> node, element inserts into it. I've changed values of overlap interval, it makes dragging elements smoothly.
During search of the decision, i've noticed, that in some cases Sortable.findElements() returns empty string, it causes unnecessary calculations [Not a bug], so, i've changed "if(children) {" to "if(children.length) {"