Konstantinos-infogeek
2/10/2016 - 10:11 PM

Drag & Drop with dynamic list

Drag & Drop with dynamic list

<button id="create-element">Create Draggable</button>

<section id="wrapper">
    <!-- Area in which the draggable element get into -->
    <div class="container dropable" dropzone="link">

    </div>

    <!-- Area with draggable items -->
    <div class="container draggable">

    </div>
</section>
(function(){

    //Create global variables
    var createdElements = [];
    var selectedElements = [];
    var current;

    /*
     Set event listener for the button
     if the button is clicked adds an extra object to the createElements array
     */
    _$('#create-element').addEventListener('click', function(evt){
        var buttonObject = {
            "id": createdElements.length,
            "name": "Element " + createdElements.length
        };
        createdElements.push(buttonObject);
        createElement(buttonObject, _$('.draggable')[0]);
    });

    //Set the listeners for the DragDrop Events
    _$('.dropable', true).addEventListener('dragover', function(evt){
        evt.preventDefault();
    });

    _$('.draggable', true).addEventListener('dragstart', function(evt){
        current = evt.target.id.replace("-element", "");
    });

    /*
     Set event listener for the button
     if something falls into, creates a new element and populates the selectedElements array
     */
    _$('.dropable', true).addEventListener('drop', function(evt){
        evt.preventDefault();

        var data = current;
        loadElement(current);

        return false;
    });


    //Alias for the document querySelector
    function _$(selector, first){

        if((selector.indexOf('#') > -1) || first){
            return document.querySelector(selector);
        }
        return document.querySelectorAll(selector);
    }

    //Creates a draggable element
    function createElement(obj, parent){
        var elem = document.createElement('div');
        elem.setAttribute('id', createdElements.length + "-element");
        elem.setAttribute('draggable', "true");

        elem.innerHTML = obj.name || "draggable element";
        parent.appendChild(elem);
    }

    //loads a selected element
    function loadElement(id){
        selectedElements.push(id);
        createElement(createdElements[id - 1], _$('.dropable')[0]);
    }

}());
.transit {
  transition: background-color 300ms ease-in-out;
}

html {
 font-family: sans-serif;
  font-size: 16px;
}
button {
  padding: 1em 2em;
  background-color: lightgray;
  border: 2px solid #b2b2b2;
  font-weight: bold;
  font-size: 120%;

  cursor: pointer;

  @extend .transit;
}
button:hover,
button:active,
button:focus {
  background-color: #a7a7a7;
}

#create-element {

}
#wrapper {
  margin-top: 2em;
  display: flex;
  flex-direction: row;
  justify-content: space-around;
  height: 500px;
  width: 100%;

  .container {
    width: 500px;
    height: 100%;

    > div {
      box-sizing: border-box;
      padding: 1.5em .5em;
      width: 100%;
      height: 80px;
      line-height: 36px;
      border-bottom: 2px solid #708b97;
      cursor: pointer;
      @extend .transit;

      &:hover {
        background-color: rgba(0,0,0,.3);
      }
    }

  }

  .draggable {
    background-color: lightblue;
  }
  .dropable {
    background-color: lightpink;
  }
}