Вы захотите добавить еще немного структуры в ваш HTML, чтобы при перемещении элементов вы действительно просто перемещали контейнер.
Например: https://jsfiddle.net/Twisty/0hkn2Lbu/
HTML
<h4 style="display:inline">Monday</h4>
<ul id="class_1" class="list-unstyled connectedSortable ui-sortable">
<li class="panel ui-sortable-handle" id="emp_1801">
<div class="emp-time">
<span class="time-block dpw_5"> </span>
<span class="name-label">Allan</span>
</div>
</li>
<li class="panel ui-sortable-handle" id="emp_1822">
<div class="emp-time">
<span class="time-block dpw_5"> </span>
<span class="name-label">Becca</span>
</div>
</li>
</ul>
<hr>
<h4 style="display:inline">Tuesday</h4>
<ul id="class_2" class="list-unstyled connectedSortable ui-sortable">
<li class="panel ui-sortable-handle" id="emp_1811">
<div class="emp-time">
<span class="time-block dpw_3"> </span>
<span class="name-label">Charlie</span>
</div>
</li>
<li class="panel ui-sortable-handle" id="emp_1823">
<div class="emp-time">
<span class="time-block dpw_2"> </span>
<span class="name-label">Diane</span>
</div>
</li>
</ul>
Это также означает добавление большего количества CSS для стилизации, как вы хотите.Я наложу метку поверх блока.
CSS
.emp-time {
position: relative;
width: 100%;
}
.name-label {
position: absolute;
top: 0;
left: 0;
font-weight: bold;
padding-left: 5px;
}
.time-block {
display: block;
position: absolute;
top: 0;
left: 0;
border-radius: 3px;
}
.dpw_5 {
width: 100%;
background-color: #fff;
}
.dpw_3 {
width: 60%;
background-color: #ccc;
}
.dpw_2 {
width: 40%;
background-color: #999;
}
Это упрощает обращение к большему количеству элементов.В ваш JavaScript не было внесено никаких изменений, за исключением его переноса.
JavaScript
$(function() {
var panelList = $("#class_1, #class_2, #class_3, #class_4, #class_5, #class_6, #class_7, #class_8, #class_12");
panelList.sortable({
connectWith: ".connectedSortable",
forcePlaceholderSize: true,
placeholder: "panel sortable-placeholder",
stop: function(event, ui) {
var class_obj = {};
var class_id = 0;
panelList.each(function(class_index, class_element) {
class_id = $(class_element).attr("id").slice(6);
class_obj[class_id] = [];
$("#class_" + class_id + " li").each(function(child_index, child_element) {
class_obj[class_id].push($(child_element).attr("id").slice(6));
})
});
$.post('enrollment_ajax.php', {
action: "saveData",
location_id: "'.$location_id.'",
month: "'.$month_time.'",
data: JSON.stringify(class_obj)
});
}
});
});
Надеюсь, что это поможет.
Теперь, чтобы разрешитьони могут быть встроены, вы можете рассмотреть это:
https://jqueryui.com/sortable/#display-grid
Но я подозреваю, что это не будет работать для вас, как вы намерены.Похоже, вам нужно больше сценария перетаскивания.Если наименьшее количество часов, которое может работать сотрудник, составляет 2 часа из 10-часовой смены, это будет 20%, 4 часа: 40%, 6 часов: 60% и 10 часов: 100%.
Это будет определять, что каждый день может содержать 5 блоков времени.Таким образом, контейнер мог бы содержать от 0 до 5 блоков времени.Поскольку мы перетаскиваем часть времени, у каждого из них будет свое значение и визуальная очередь.
Пример:
+ -- -- -- -- -- +
| A (5) |
+ -- -- -- -- -- +
| B (3) | C (2)|
+ -- -- -- -- -- +
Каждый контейнер является областью удаления, но он будет проверятьКаждое удаление и допускается только до значения 5. Вы можете сделать это также с помощью Sortable, где каждый день является сортируемым списком, и он проверяет обновления, чтобы убедиться, что мы не переполнили его.Это немного сложнее сделать.
Я обновлю случай с лучшим примером.
Обновление 1
https://jsfiddle.net/Twisty/0hkn2Lbu/14/
Здесь вы можете видеть сортировку списков.