SortableJS — это легковесная и мощная библиотека для реализации перетаскивания элементов списков и сеток в JavaScript. Для начала работы необходимо подключить библиотеку к проекту. Доступно несколько способов: через CDN или установку через npm/yarn.
Подключение через CDN:
<script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/Sortable.min.js"></script>
Подключение через npm:
npm install sortablejs
После подключения создается экземпляр Sortable на
контейнере, элементы которого будут перетаскиваться:
const list = document.getElementById('items');
const sortable = new Sortable(list, {
animation: 150,
ghostClass: 'sortable-ghost'
});
Ключевые параметры:
animation — скорость анимации перемещения
элементов.ghostClass — CSS-класс для элемента-призрака при
перетаскивании.handle — селектор, ограничивающий область
перетаскивания.Одной из мощных возможностей SortableJS является контроль над тем, кто и как может перетаскивать элементы. Это особенно важно при работе с интерфейсами, где разные пользователи имеют разные уровни доступа к данным.
Ограничение по роли пользователя
Используется параметр filter для блокировки определенных
элементов:
const sortable = new Sortable(list, {
filter: '.no-drag',
onFilter: function(evt) {
console.log('Перетаскивание запрещено для этого элемента');
}
});
.no-drag не подлежат
перемещению.onFilter позволяет реагировать на попытку
перемещения заблокированного элемента.Ограничение на определенные действия
Параметр handle позволяет задавать конкретные элементы,
которые могут служить «ручкой» для перемещения:
const sortable = new Sortable(list, {
handle: '.drag-handle'
});
.drag-handle будут
перетаскиваться.SortableJS поддерживает возможность связывать несколько списков между
собой (group). Это удобно для настройки прав доступа на
уровне контейнеров.
const groupOptions = {
name: 'shared',
pull: function(to, from, dragEl) {
return dragEl.classList.contains('allowed');
},
put: function(to, from, dragEl) {
return dragEl.dataset.role === 'editor';
}
};
const sortable1 = new Sortable(document.getElementById('list1'), {
group: groupOptions
});
const sortable2 = new Sortable(document.getElementById('list2'), {
group: groupOptions
});
pull — определяет, может ли элемент покинуть текущий
контейнер.put — определяет, можно ли вставить элемент в
контейнер.dragEl.dataset.role позволяет использовать кастомные
атрибуты для контроля доступа.SortaebleJS предоставляет методы для динамического изменения прав доступа без пересоздания экземпляра:
sortable.option('disabled', true); // блокировка всех операций
sortable.option('disabled', false); // снятие блокировки
SortableJS генерирует ряд событий, которые можно использовать для реализации сложной логики контроля:
onStart — начало перетаскивания.onEnd — завершение перетаскивания.onAdd — элемент добавлен из другого списка.onRemove — элемент удален в другой список.Пример ограничения добавления элемента на основе роли:
const sortable = new Sortable(list, {
group: 'roles',
onAdd: function(evt) {
if (evt.item.dataset.role !== 'admin') {
evt.from.insertBefore(evt.item, evt.from.children[evt.oldIndex]);
alert('Нет прав для добавления этого элемента');
}
}
});
Для проектов с полноценной системой авторизации SortableJS легко интегрируется с backend-логикой:
const userRole = getCurrentUserRole(); // функция получения роли пользователя
const sortable = new Sortable(list, {
handle: userRole === 'editor' ? '.drag-handle' : null,
disabled: userRole !== 'editor'
});
handle и disabled управляются на основе
роли пользователя.Для элементов с ограниченным доступом удобно визуально сигнализировать пользователю:
.no-drag {
cursor: not-allowed;
opacity: 0.5;
}
cursor: not-allowed показывает невозможность
действия.opacity усиливает визуальное разделение
доступных и заблокированных элементов.SortableJS предоставляет гибкий набор инструментов для управления перетаскиванием элементов с детальной настройкой прав доступа. Комбинация фильтров, обработчиков событий, групп и динамических опций позволяет строить интерфейсы с разделением прав на уровне элемента, контейнера и действия пользователя.