jquery jquery-ui nested jquery-ui-sortable

jquery - crear niños con ordenables anidados



jquery-ui nested (1)

Estoy tratando de lograr lo que he visto algunos complementos como este , pero no puedo hacerlo funcionar correctamente.

Quiero poder crear nuevos hijos a partir de un ordenamiento anidado, por ejemplo: cuando arrastro el nodo "4", me gustaría ponerlo debajo del nodo "xx2" y un poco a la derecha. En esa acción, el marcador de posición debe sangrar a la derecha, por lo que crea una pista de que aparecerá una nueva rama.

Pude crear la pista, pero no puedo ingresar a ese nuevo espacio.

IMPORTANTE: Sé que un posible hack es para cada li tener y vaciar el ul , pero necesito tener una estructura como se muestra a continuación. Entonces cualquier nuevo niño se crea sobre la marcha .

HTML

<div class="tree"> <ul> <li> <a> <label> <span>A</span> </label> </a> <ul> <li> <a> <label> <span>1</span> </label> </a> <ul> <li> <a> <label> <span>x</span> </label> </a> <ul> <li> <a> <label> <span>xx1</span> </label> </a> </li> <li> <a> <label> <span>xx2</span> </label> </a> </li> </ul> </li> </ul> </li> <li> <a> <label> <span>2</span> </label> </a> </li> </ul> </li> <li> <a> <label> <span>B</span> </label> </a> <ul> <li> <a> <label> <span>3</span> </label> </a> </li> <li> <a> <label> <span>4</span> </label> </a> </li> <li> <a> <label> <span>5</span> </label> </a> </li> </ul> </li> <li> <a> <label> <span>C</span> </label> </a> <ul> <li> <a> <label> <span>6</span> </label> </a> <ul> <li> <a> <label> <span>y</span> </label> </a> <ul> <li> <a> <label> <span>yy1</span> </label> </a> <ul> <li> <a> <label> <span>yyy1</span> </label> </a> </li> </ul> </li> </ul> </li> </ul> </li> </ul> </li> </ul> </div>

JS

$("div.tree ul").sortable({ items: "li", connectWith: "ul", placeholder: "placeholder", toleranceElement: "> a", opacity: 0.5, sort: function( event, ui ) { $("ul:empty").remove(); var prev_li = ui.placeholder.prev("li"); if(prev_li.length) { if(ui.helper.position().left > prev_li.position().left + 50) { if(!prev_li.children("ul").length) { prev_li.append("<ul class=''new''></ul>"); } } } }, stop: function( event, ui ) { $("ul.new:empty").remove(); } }).disableSelection();

CSS

.placeholder { height: 20px; border: 1px dotted red;} ul.new {border: 1px dashed blue; height: 20px;}

FIDDLE: https://jsfiddle.net/wa614ago/5/


Edité tu código para que la lista se comportara como lo describiste. Resulta que el selector $(ul:empty) vuelve a estar vacío cuando un ul tiene espacios en blanco.

$("div.tree ul").sortable({ items: "li", connectWith: "ul", placeholder: "placeholder", toleranceElement: "> a", opacity: 0.5, sort: function(event, ui) { $("ul.ui-sortable:empty").remove(); var prev_li = ui.placeholder.prev("li"); if (prev_li.length) { if (ui.helper.position().left > prev_li.position().left + 50) { // If the current element has some empty ui sortables prev_li.find("ul:not(:has(li))").remove(); // If the li has no ul''s if (!prev_li.children("ul").length //or if the ul contains the element that we are currently dragging then we append the new ul || prev_li.children("ul").find(''li'').first().hasClass(''ui-sortable-helper'')) { // If there''s any other new elements in the list, remove them $("ul.new:empty").remove(); //append hint prev_li.append("<ul class=''new''></ul>"); } } } }, out: function(event, ui) { // As we move out of a drop zone we clean it from old uls var prev_li = ui.placeholder.prev("li"); prev_li.find(''ul.new'').remove() prev_li.find(''ul.ui-sortable:empty'').remove() }, stop: function(event, ui) { // We drop our element into the new ul $(''ul.new'').removeClass(''new'').append(ui.item); // Clean the whole list of empty ul''s $("ul:empty").remove(); $("ul.ui-sortable:empty").remove(); } }).disableSelection();

Aquí está el violín: https://jsfiddle.net/Lsn6aj22/3/

Espero que esto te ayude en el camino!