bevacqua / react-dragula

:ok_hand: Drag and drop so simple it hurts
http://bevacqua.github.io/react-dragula
MIT License
995 stars 77 forks source link

Nested Containers not working #12

Open essekia opened 8 years ago

essekia commented 8 years ago

The drag event does not trigger when I try to drag an element which is also a container ( to its children ). If I remove its container "privilege", I can drag it.

I am using react-dragula@1.1.15.

essekia commented 8 years ago

Can anyone tell me how they got the nested draggable containers working? I cannot seem to be able to do that.

Doesn't this part of the code prevent that?

function canStart (item) {
    if (drake.dragging && _mirror) {
      return;
    }
    if (isContainer(item)) {
      return; // don't drag container itself
    }

@cfenzo , tried your solution, doesn't seem to work for me. Not sure if this is an issue with react or my own setup. Has anyone tried nested containers with react?

albertotorresfoltyn commented 8 years ago

Same problem here :S. I'm looking for a workaround but nothing yet

initFabian commented 8 years ago

A PR for this issue was created quite a while back in the Dragula repo.

https://github.com/bevacqua/dragula/pull/358

initFabian commented 8 years ago

I was able to hack up a solution by modifying the source code.

I commented out that return; // don't drag container itself line, but that caused the following line inside of function drag (e) to throw all these exceptions:

dropTarget.insertBefore(item, reference);

reference at this point is null. To avoid making my console from logging out all exceptions. I just wrapped it in a try...catch block. The solution sits as such:

  function drag (e) {

    ...

    if (
      (reference === null && changed) ||
      reference !== item &&
      reference !== nextEl(item)
    ) {
      _currentSibling = reference;
      try {
         dropTarget.insertBefore(item, reference);
      }
      catch (e) {}

      drake.emit('shadow', item, dropTarget, _source);
    }
    function moved (type) { drake.emit(type, item, _lastDropTarget, _source); }
    function over () { if (changed) { moved('over'); } }
    function out () { if (_lastDropTarget) { moved('out'); } }
  }

Of course this is not a good solution given the purpose of these wrappers is to not modify the source code.... but until https://github.com/bevacqua/dragula/pull/358 finds it's way into the source code, this is the best solution I could come up with.