JSFiddle - React, Tailwind, and code Playground

by Tom DeBerardine

HTML

<div id="sortable1-div">
     <h5>Available Columns</h5>

    <ul id="sortable1" class="connectedSortable">
        <li class="ui-state-default">Item 1</li>
        <li class="ui-state-default">Item 2</li>
        <li class="ui-state-default">Item 3</li>
        <li class="ui-state-default">Item 4</li>
        <li class="ui-state-default">Item 5</li>
    </ul>
</div>
<div id="middle-div"> <a href="#" class="arrow add">&gt;</a>

    <br/>
    <br /> <a href="#" class="arrow remove">&lt;</a>

</div>
<div id="sortable2-div">
     <h5>Selected Columns</h5>

    <ul id="sortable2" class="connectedSortable">
        <li class="ui-state-highlight">Item 1</li>
        <li class="ui-state-highlight">Item 2</li>
        <li class="ui-state-highlight">Item 3</li>
        <li class="ui-state-highlight">Item 4</li>
        <li class="ui-state-highlight">Item 5</li>
    </ul>
</div>

CSS

#sortable1, #sortable2 {
    border: 1px solid #ccc;
    list-style-type: none;
    margin: 0;
    padding: 0 0 2.5em;
    float: left;
    margin-right: 10px;
}
#sortable1-div, #sortable2-div {
    list-style-type: none;
    margin: 0;
    padding: 0 0 2.5em;
    float: left;
    margin-right: 10px;
    width: 220px;
}
#sortable1 li, #sortable2 li {
    margin: 0 5px 5px 5px;
    padding: 5px;
    font-size: 1.2em;
    width: 120px;
}
#middle-div {
    padding: 30px 25px 10px 10px;
    float: left;
    width: 30px;
}
a {
    text-decoration: none;
}
.arrow {
    padding: 10px;
    border: 1px solid #ccc;
    margin-bottom: 10px;
}
h5 {
    margin: 0;
    color: #666;
    font-weight: 100;
}
ul {
    list-style: none;
    margin: 0;
    padding: 0;
}
li {
    background: white;
    position:relative;
    margin: 1em 0;
    padding: 1em;
    border: 2px solid gray;
    list-style: none;
    padding-left: 42px !important;
}
li .handle {
    background: #f8f8f8;
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    padding:8px;
}
.ui-selecting {
    background: #eee;
}
.ui-selecting .handle {
    background: #ddd;
}
.ui-selected {
    background: #def;
}
.ui-selected .handle {
    background: #cde;
}

JavaScript

$(function () {
    $("#sortable1, #sortable2").sortable({
        connectWith: ".connectedSortable"
    }).sortable({
        handle: ".handle"
    })
        .selectable({
        filter: "li",
        cancel: ".handle"
    })
        .find("li")
        .addClass("ui-corner-all")
        .prepend("<div class='handle'><span class='ui-icon ui-icon-carat-2-n-s'></span></div>");
    $('.add').click(function (e) {
        e.preventDefault();
        $("#sortable1 .ui-selected").appendTo("#sortable2").removeClass('ui-selected').addClass('ui-selectee');
    });
    $('.remove').click(function (e) {
        e.preventDefault();
        $("#sortable2 .ui-selected").appendTo("#sortable1").removeClass('ui-selected').addClass('ui-selectee');
    });
});