import { toggleClass, index } from '../../src/utils.js'; let lastSwapEl; function SwapPlugin() { function Swap() { this.defaults = { swapClass: 'sortable-swap-highlight' }; } Swap.prototype = { dragStart({ dragEl }) { lastSwapEl = dragEl; }, dragOverValid({ completed, target, onMove, activeSortable, changed, cancel }) { if (!activeSortable.options.swap) return; let el = this.sortable.el, options = this.options; if (target && target !== el) { let prevSwapEl = lastSwapEl; if (onMove(target) !== false) { toggleClass(target, options.swapClass, true); lastSwapEl = target; } else { lastSwapEl = null; } if (prevSwapEl && prevSwapEl !== lastSwapEl) { toggleClass(prevSwapEl, options.swapClass, false); } } changed(); completed(true); cancel(); }, drop({ activeSortable, putSortable, dragEl }) { let toSortable = (putSortable || this.sortable); let options = this.options; lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false); if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) { if (dragEl !== lastSwapEl) { toSortable.captureAnimationState(); if (toSortable !== activeSortable) activeSortable.captureAnimationState(); swapNodes(dragEl, lastSwapEl); toSortable.animateAll(); if (toSortable !== activeSortable) activeSortable.animateAll(); } } }, nulling() { lastSwapEl = null; } }; return Object.assign(Swap, { pluginName: 'swap', eventProperties() { return { swapItem: lastSwapEl }; } }); } function swapNodes(n1, n2) { let p1 = n1.parentNode, p2 = n2.parentNode, i1, i2; if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) return; i1 = index(n1); i2 = index(n2); if (p1.isEqualNode(p2) && i1 < i2) { i2++; } p1.insertBefore(n2, p1.children[i1]); p2.insertBefore(n1, p2.children[i2]); } export default SwapPlugin;