JSFiddle - React, Tailwind, and code Playground

by mecano

HTML

<div id="menu">
  <div id="modules">
    <div id="mod01"><img src="http://zupimages.net/up/17/32/bgot.jpg" width="120" height="80"></div>
    <div id="mod02"><img src="http://zupimages.net/up/17/32/hffw.jpg" width="120" height="80"></div>
    <div id="mod03"><img src="http://zupimages.net/up/17/32/g790.jpg" width="120" height="80"></div>

    <div id="dropdown" style="display:none;">
      <div class="div_mod" data-type="mod01" data-id="1">
        <img src="http://zupimages.net/up/17/32/bgot.jpg" width="240" height="70">
      </div>
      <div class="div_mod" data-type="mod02" data-id="2">
        <div class="margin-elt float-elt"><img src="http://zupimages.net/up/17/32/bgot.jpg" width="50" height="50"></div>
        <div class="size-paragraphe">Oportunum est, ut arbitror, explanare nunc causam, quae ad exitium praecipitem.</div>
      </div>
      <div class="div_mod" data-type="mod03" data-id="3">
        <p class="size-paragraphe margin-elt">Oportunum est, ut arbitror, explanare nunc causam, quae ad exitium praecipitems portunum est, ut arbitror.</p>
      </div>
    </div>
  </div>
</div>
<div id="container">
  <div id="bloc_1" style="display:none;">
    <div class="div_mod01 row drag-drop" data-id="1" data-position="1" data-type="images">
      <img src="http://zupimages.net/up/17/32/bgot.jpg" width="240" height="70">
    </div>
    <div class="div_mod02 row drag-drop" data-id="2" data-position="2" data-type="texte-image">
      <div class="margin-elt float-elt"><img src="http://zupimages.net/up/17/32/bgot.jpg" width="50" height="50"></div>
      <div class="size-paragraphe">Oportunum est, ut arbitror, explanare nunc causam, quae ad exitium praecipitem.</div>
    </div>
    <div class="div_mod03 row drag-drop" data-id="3" data-position="3" data-type="textes">
      <p class="size-paragraphe margin-elt">Oportunum est, ut arbitror, explanare nunc causam, quae ad exitium praecipitems portunum est, ut arbitror.</p>
    </div>
  </div>
  <div id="bloc_2">
   ...

CSS

#menu {
  width: 300px;
}

#mod01,
#mod02,
#mod03 {
  width: 120px;
  margin: 0 auto;
}

#container {
  width: 300px;
  margin-left: 20px;
}

#bloc_1,
#bloc_2,
#dropdown {
  padding: 20px;
}

.div_mod01,
.div_mod02,
.div_mod03,
#div_1,
#div_2,
#div_3,
.div_mod {
  border: 1px dashed #000;
  margin: 10px auto;
}

.div_mod03 p {
  text-align: center;
}

.size-paragraphe {
  font-size: 12px;
}

.margin-elt {
  margin-right: 10px;
}

#container,
#menu,
.float-elt {
  float: left;
}

#container,
#menu {
  border: 1px dotted #000;
  margin-bottom: 20px;
}

.add {
  text-align: center;
  cursor: pointer;
  background: #000;
  color: #fff;
  padding: 5px;
}

.add:hover {
  background: green;
  color: #fff;
}

#btn_update {
  clear: both;
  margin: 0 0 0 320px;
}

#update,
#save {
  background: red;
  color: #fff;
  padding: 10px;
  text-align: center;
  cursor: pointer;
}

JavaScript

(function() {
                $("#modules").hover(
                    function() {
                        $("#dropdown").fadeIn(200);
                    },
                    function() {
                        $("#dropdown").fadeOut(200);
                    }
                );
                $("#mod01").hover(function() {
                    $(".div_mod[data-type='mod01']").show();
                    $(".div_mod[data-type='mod02']").hide();
                    $(".div_mod[data-type='mod03']").hide();
                });
                $("#mod02").hover(function() {
                    $(".div_mod[data-type='mod01']").hide();
                    $(".div_mod[data-type='mod02']").show();
                    $(".div_mod[data-type='mod03']").hide();
                });
                $("#mod03").hover(function() {
                    $(".div_mod[data-type='mod01']").hide();
                    $(".div_mod[data-type='mod02']").hide();
                    $(".div_mod[data-type='mod03']").show();
                });
                $(".div_mod").hover(
                    function() {
                        $(this).append('<div class="add"><i class="fa fa-plus"></i>Insert</div>');
                        $('.add').click(function() {
                            $("#bloc_2")
                            .prepend(
                                $("#bloc_1 .row[data-id='" + $(this).parent().attr("data-id") + "']")
                                .clone()
                                .attr('data-position','1'))
                                .find("div.drag-drop").each(function(){
                                // On calcule sa position
                                index = parseInt($(this).index()+1);
                                // On met le data à jour
                                $(this).attr("data-position",index);
                            });
                        });
                    },
                    function() {
                ...