JSFiddle - React, Tailwind, and code Playground
by Abdullah Ramzan
HTML
<!-- Latest Sortable -->
<script src="//rubaxa.github.io/Sortable/Sortable.js"></script>
<!-- jQuery -->
<script src="//code.jquery.com/jquery-3.2.1.min.js"></script>
<!-- Connected lists -->
<div class="container" style="height: 520px">
<div data-force="18" class="layer block" style="left: 5%; top: 20px; width: 40%">
<div class="layer title">Column 1</div>
<ul id="foo" class="block__list block__list_words">
<li data-id="event_date" class="item">Event Date</li>
<li data-id="event_details" class="item">Event Details</li>
<li data-id="event_schedule" class="item">Event Schedule</li>
<li data-id="event_segments" class="item">Event Segments</li>
</ul>
</div>
<input type="text" hidden="" name="sep_event_layout_col1" value="event_date,event_details,event_schedule,event_segments" class="visuaplayoutCol01">
<div data-force="20" class="layer block" style="left: 40%; top: 20px; width: 40%;">
<div class="layer title">Column 2</div>
<ul id="bar" class="block__list block__list_words">
<li data-id="event_image" class="item">Event Image</li>
<li data-id="event_desc" class="item">Event Description</li>
<li data-id="event_map" class="item">Event Map</li>
<li data-id="event_venue" class="item">Event Venue</li>
</ul>
</div>
<input type="text" hidden="" name="sep_event_layout_col2" value="event_image,event_desc,event_map,event_venue" class="visuaplayoutCol02">
</div>
<div class="clear"></div>
CSS
/*
* Visual Layout Settings
*/
.container {
width: 80%;
margin: auto;
min-width: 1100px;
max-width: 1300px;
position: relative;
}
.layer .title {
background-color: #ff7373;
color: #fff;
display: inline-block;
padding: 3px 10px;
position: relative;
z-index: 1000;
}
#foo .sortable-drag {
background: #daf4ff;
}
.item{
list-style:none;
}
.block {
opacity: 1;
position: absolute;
}
.block__list {
padding: 20px 0;
max-width: 360px;
margin-top: -8px;
margin-left: 5px;
background-color: #fff;
}
.block__list-title {
margin: -20px 0 0;
padding: 10px;
text-align: center;
background: #5F9EDF;
}
.block__list li { cursor: move; }
.block__list_words li {
background-color: #fff;
padding: 10px 40px;
}
.block__list_words .sortable-ghost {
opacity: 0.4;
background-color: #F4E2C9;
}
.block__list_words li:first-letter {
text-transform: uppercase;
}
#editable {}
#editable li {
position: relative;
}
#editable i {
-webkit-transition: opacity .2s;
transition: opacity .2s;
opacity: 0;
display: block;
cursor: pointer;
color: #c00;
top: 10px;
right: 40px;
position: absolute;
font-style: normal;
}
#editable li:hover i {
opacity: 1;
}
#filter {}
#filter button {
color: #fff;
width: 100%;
border: none;
outline: 0;
opacity: .5;
margin: 10px 0 0;
transition: opacity .1s ease;
cursor: pointer;
background: #5F9EDF;
padding: 10px 0;
font-size: 20px;
}
#filter button:hover {
opacity: 1;
}
#filter .block__list {
padding-bottom: 0;
}
.drag-handle {
margin-right: 10px;
font: bold 20px Sans-Serif;
color: #5F9EDF;
display: inline-block;
cursor: move;
cursor: -webkit-grabbing; /* overrides 'move' */
}
JavaScript
var foo = document.getElementById("foo");
Sortable.create(foo, {
group: "words",
animation: 150,
dataIdAttr: 'data-id',
draggable: '.item',
store: {
get: function (sortable) {
var order = localStorage.getItem(sortable.options.group);
return order ? order.split('|') : [];
},
set: function (sortable) {
var order = sortable.toArray();
console.log(order, 'FOO');
$('.visuaplayoutCol02').attr('value', order);
}
},
onEnd: function (/**Event*/evt) {
console.log(evt.item.dataset.id, 'datasetID'); // element's new index within parent
$('.visuaplayoutCol01').attr('value', $('.visuaplayoutCol01').attr('value') + ',' + evt.item.dataset.id);
},
onAdd: function (/**Event*/evt) {
var itemEl = evt.item; // dragged HTMLElement
},
});
var bar = document.getElementById("bar");
Sortable.create(bar, {
group: "words",
animation: 150,
dataIdAttr: 'data-id',
draggable: '.item',
store: {
get: function (sortable) {
var order = localStorage.getItem(sortable.options.group);
return order ? order.split('|') : [];
},
set: function (sortable) {
var order = sortable.toArray();
console.log(order, 'BAR');
$('.visuaplayoutCol01').attr('value', order);
}
},
onAdd: function (/**Event*/evt) {
console.log(evt.item.dataset.id, 'datasetID');
$('.visuaplayoutCol02').attr('value', $('.visuaplayoutCol02').attr('value') + ',' + evt.item.dataset.id);
},
});