Dragula — это лёгкая и интуитивно понятная библиотека для реализации drag-and-drop интерфейсов на JavaScript. Она позволяет легко перемещать элементы между контейнерами и внутри них. Одной из продвинутых возможностей является использование опции copySortSource, которая влияет на поведение исходного контейнера при копировании элементов.
Опция copySortSource используется вместе с параметром copy, который отвечает за создание копий элементов при перетаскивании. Когда copy = true, элемент, который перемещается, дублируется, а оригинал остаётся на месте. В стандартном режиме исходный контейнер становится «не сортируемым», если в него перетаскивается копия. Чтобы сохранить возможность сортировки внутри исходного контейнера даже при использовании копирования, включается copySortSource.
copySortSource = true позволяет:
copySortSource = false (значение по умолчанию):
Для работы с этой функцией необходимо подключить библиотеку Dragula, после чего создать экземпляр с нужными настройками:
const containers = document.querySelectorAll('.container');
const drake = dragula([...containers], {
copy: true,
copySortSource: true,
moves: (el, source, handle, sibling) => true
});
Пояснения к коду:
copy: true — включение режима копирования.copySortSource: true — позволяет сортировать элементы в
исходном контейнере.moves — функция, которая возвращает true
для разрешения перетаскивания элементов. Можно добавлять фильтры по
классу, атрибуту или позиции.С включённой опцией copySortSource Dragula ведёт себя следующим образом:
drag, drop,
remove, и shadow продолжают корректно работать
с исходным контейнером.Это делает copySortSource особенно полезным для интерфейсов типа «канбан», где есть список задач, которые можно как дублировать, так и сортировать внутри исходного списка.
const columns = document.querySelectorAll('.kanban-column');
const drake = dragula([...columns], {
copy: true,
copySortSource: true,
accepts: (el, target) => target !== el.parentNode
});
const templateList = document.querySelector('.templates');
const board = document.querySelector('.board');
const drake = dragula([templateList, board], {
copy: true,
copySortSource: true
});
templateList содержит шаблонные элементы, которые можно
перетаскивать в board.templateList можно переставлять внутри
списка.board элементы добавляются в виде копий.Dragula предоставляет ряд событий для контроля поведения элементов:
drag — срабатывает при начале перетаскивания.drop — срабатывает при завершении перетаскивания.over и out — позволяют визуально
подсвечивать контейнеры при наведении.shadow — создаёт визуальный «плейсхолдер» для
перемещаемого элемента.Пример обработки событий:
drake.on('drop', (el, target, source, sibling) => {
if(source === templateList) {
console.log('Элемент скопирован из шаблонов');
} else {
console.log('Элемент перемещён внутри списка');
}
});
Ключевые моменты:
copySortSource = true делает исходный контейнер
сортируемым при активном копировании.copy позволяет строить сложные интерфейсы
«перетаскивания с дублированием».Использование этой опции открывает возможности для создания гибких и динамичных drag-and-drop интерфейсов с удобной работой как с исходными, так и с целевыми контейнерами.