Hello,

Here is a patch for adding the ability to drop an item as a child of
another one when the other one has no child. Maybe this is not clear
so:

<ul>
<li>item 1<ul></ul></li>
<li>item 2<ul></ul></li>
</ul>

It matches wish list item http://dev.rubyonrails.org/ticket/4691.

For now, you cannot drop item 1 as a child of item 2. My patch try to
add that feature. It use the horizontal offset of the the draggable
over the droppable element to see if the draggable must be added after
the droppable or as an child of the droppable.

It has some problem for which I need some help.

1. on line 53 of the patch, I need to add the draggable (element) as a
child of the droppable (dropon).

I do this:

Sortable.findTreeElements(dropon, Sortable.options(dropon))[0].appendChild(element);

I think there might be a better way.

2. in my example, it does not allow to drop item 1 on the top level
after item 2

3. I suppose you have some problems with it ;)


Any feedback is appreciated.


Damien

--
Damien Merenne <[EMAIL PROTECTED]>
http://blog.cosinux.org/


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Spinoffs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/rubyonrails-spinoffs
-~----------~----~----~----~------~----~------~--~---

Index: src/dragdrop.js
===================================================================
--- src/dragdrop.js	(révision 5155)
+++ src/dragdrop.js	(copie de travail)
@@ -99,8 +99,13 @@
     if(affected.length>0) {
       drop = Droppables.findDeepestChild(affected);
       Position.within(drop.element, point[0], point[1]);
+      var offset = 0;
+      if (drop.overlap == 'horizontal')
+	offset = point[1] - Position.cumulativeOffset(drop)[1];
+      else
+	offset = point[0] - Position.cumulativeOffset(drop)[0];
       if(drop.onHover)
-        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element), offset);
       
       Droppables.activate(drop);
     }
@@ -611,6 +616,7 @@
       dropOnEmpty: false,
       tree:        false,
       treeTag:     'ul',
+      treeChildOffset: 50,
       overlap:     'vertical', // one of 'vertical', 'horizontal'
       constraint:  'vertical', // one of 'vertical', 'horizontal', false
       containment: element,    // also takes array of elements (or id's); or false
@@ -725,7 +731,7 @@
       element, options.only, options.tree ? true : false, options.treeTag);
   },
 
-  onHover: function(element, dropon, overlap) {
+  onHover: function(element, dropon, overlap, offset) {
     if(Element.isParent(dropon, element)) return;
 
     if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
@@ -742,14 +748,23 @@
       }
     } else {
       Sortable.mark(dropon, 'after');
-      var nextElement = dropon.nextSibling || null;
-      if(nextElement != element) {
-        var oldParentNode = element.parentNode;
-        element.style.visibility = "hidden"; // fix gecko rendering
-        dropon.parentNode.insertBefore(element, nextElement);
-        if(dropon.parentNode!=oldParentNode) 
-          Sortable.options(oldParentNode).onChange(element);
-        Sortable.options(dropon.parentNode).onChange(element);
+      if(Sortable.options(dropon).tree 
+	 && Sortable.options(element.parentNode).treeChildOffset < offset) {
+	var oldParentNode = element.parentNode;
+	element.style.visibility = "hidden"; // fix gecko rendering
+	Sortable.findTreeElements(dropon, Sortable.options(dropon))[0].appendChild(element);
+	Sortable.options(oldParentNode).onChange(element);
+	Sortable.options(dropon).onChange(element);
+      } else {
+	var nextElement = dropon.nextSibling || null;
+	if(nextElement != element) {
+	  var oldParentNode = element.parentNode;
+	  element.style.visibility = "hidden"; // fix gecko rendering
+	  dropon.parentNode.insertBefore(element, nextElement);
+	  if(dropon.parentNode!=oldParentNode) 
+	    Sortable.options(oldParentNode).onChange(element);
+	  Sortable.options(dropon.parentNode).onChange(element);
+	}
       }
     }
   },

Reply via email to