diff --git a/Sortable.js b/Sortable.js index af5b2ab10..41c2d1640 100644 --- a/Sortable.js +++ b/Sortable.js @@ -1,5 +1,5 @@ /**! - * Sortable 1.15.0 + * Sortable 1.15.1 * @author RubaXa * @author owenm * @license MIT @@ -12,26 +12,20 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); - if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); - if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } - keys.push.apply(keys, symbols); } - return keys; } - function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; - if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); @@ -44,10 +38,8 @@ }); } } - return target; } - function _typeof(obj) { "@babel/helpers - typeof"; @@ -60,10 +52,8 @@ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } - return _typeof(obj); } - function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { @@ -75,53 +65,40 @@ } else { obj[key] = value; } - return obj; } - function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; - for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } - return target; }; - return _extends.apply(this, arguments); } - function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; - for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } - return target; } - function _objectWithoutProperties(source, excluded) { if (source == null) return {}; - var target = _objectWithoutPropertiesLoose(source, excluded); - var key, i; - if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; @@ -129,22 +106,17 @@ target[key] = source[key]; } } - return target; } - function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } - function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } - function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } - function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); @@ -153,27 +125,22 @@ if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - return arr2; } - function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - var version = "1.15.0"; + var version = "1.15.1"; function userAgent(pattern) { if (typeof window !== 'undefined' && window.navigator) { return !! /*@__PURE__*/navigator.userAgent.match(pattern); } } - var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i); var Edge = userAgent(/Edge/i); var FireFox = userAgent(/firefox/i); @@ -185,23 +152,15 @@ capture: false, passive: false }; - function on(el, event, fn) { el.addEventListener(event, fn, !IE11OrLess && captureMode); } - function off(el, event, fn) { el.removeEventListener(event, fn, !IE11OrLess && captureMode); } - - function matches( - /**HTMLElement*/ - el, - /**String*/ - selector) { + function matches( /**HTMLElement*/el, /**String*/selector) { if (!selector) return; selector[0] === '>' && (selector = selector.substring(1)); - if (el) { try { if (el.matches) { @@ -215,39 +174,25 @@ return false; } } - return false; } - function getParentOrHost(el) { return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode; } - - function closest( - /**HTMLElement*/ - el, - /**String*/ - selector, - /**HTMLElement*/ - ctx, includeCTX) { + function closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) { if (el) { ctx = ctx || document; - do { if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) { return el; } - if (el === ctx) break; /* jshint boss:true */ } while (el = getParentOrHost(el)); } - return null; } - var R_SPACE = /\s+/g; - function toggleClass(el, name, state) { if (el && name) { if (el.classList) { @@ -258,10 +203,8 @@ } } } - function css(el, prop, val) { var style = el && el.style; - if (style) { if (val === void 0) { if (document.defaultView && document.defaultView.getComputedStyle) { @@ -269,68 +212,55 @@ } else if (el.currentStyle) { val = el.currentStyle; } - return prop === void 0 ? val : val[prop]; } else { if (!(prop in style) && prop.indexOf('webkit') === -1) { prop = '-webkit-' + prop; } - style[prop] = val + (typeof val === 'string' ? '' : 'px'); } } } - function matrix(el, selfOnly) { var appliedTransforms = ''; - if (typeof el === 'string') { appliedTransforms = el; } else { do { var transform = css(el, 'transform'); - if (transform && transform !== 'none') { appliedTransforms = transform + ' ' + appliedTransforms; } /* jshint boss:true */ - } while (!selfOnly && (el = el.parentNode)); } - var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix; /*jshint -W056 */ - return matrixFn && new matrixFn(appliedTransforms); } - function find(ctx, tagName, iterator) { if (ctx) { var list = ctx.getElementsByTagName(tagName), - i = 0, - n = list.length; - + i = 0, + n = list.length; if (iterator) { for (; i < n; i++) { iterator(list[i], i); } } - return list; } - return []; } - function getWindowScrollingElement() { var scrollingElement = document.scrollingElement; - if (scrollingElement) { return scrollingElement; } else { return document.documentElement; } } + /** * Returns the "bounding client rect" of given element * @param {HTMLElement} el The element whose boundingClientRect is wanted @@ -340,12 +270,9 @@ * @param {[HTMLElement]} container The parent the element will be placed in * @return {Object} The boundingClientRect of el, with specified adjustments */ - - function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) { if (!el.getBoundingClientRect && el !== window) return; var elRect, top, left, bottom, right, height, width; - if (el !== window && el.parentNode && el !== getWindowScrollingElement()) { elRect = el.getBoundingClientRect(); top = elRect.top; @@ -362,17 +289,18 @@ height = window.innerHeight; width = window.innerWidth; } - if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) { // Adjust for translate() - container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312) - // Not needed on <= IE11 + container = container || el.parentNode; + // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312) + // Not needed on <= IE11 if (!IE11OrLess) { do { if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) { - var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container + var containerRect = container.getBoundingClientRect(); + // Set relative to edges of padding box of container top -= containerRect.top + parseInt(css(container, 'border-top-width')); left -= containerRect.left + parseInt(css(container, 'border-left-width')); bottom = top + elRect.height; @@ -380,17 +308,14 @@ break; } /* jshint boss:true */ - } while (container = container.parentNode); } } - if (undoScale && el !== window) { // Adjust for scale() var elMatrix = matrix(container || el), - scaleX = elMatrix && elMatrix.a, - scaleY = elMatrix && elMatrix.d; - + scaleX = elMatrix && elMatrix.a, + scaleY = elMatrix && elMatrix.d; if (elMatrix) { top /= scaleY; left /= scaleX; @@ -400,7 +325,6 @@ right = left + width; } } - return { top: top, left: left, @@ -410,6 +334,27 @@ height: height }; } + + /** + * Returns the content rect of the element (bounding rect minus border and padding) + * @param {HTMLElement} el + */ + function getContentRect(el) { + var rect = getRect(el); + var paddingLeft = parseInt(css(el, 'padding-left')), + paddingTop = parseInt(css(el, 'padding-top')), + paddingRight = parseInt(css(el, 'padding-right')), + paddingBottom = parseInt(css(el, 'padding-bottom')); + rect.top += paddingTop + parseInt(css(el, 'border-top-width')); + rect.left += paddingLeft + parseInt(css(el, 'border-left-width')); + // Client Width/Height includes padding only + rect.width = el.clientWidth - paddingLeft - paddingRight; + rect.height = el.clientHeight - paddingTop - paddingBottom; + rect.bottom = rect.top + rect.height; + rect.right = rect.left + rect.width; + return rect; + } + /** * Checks if a side of an element is scrolled past a side of its parents * @param {HTMLElement} el The element who's side being scrolled out of view is in question @@ -417,30 +362,26 @@ * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom') * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element */ - - function isScrolledPast(el, elSide, parentSide) { var parent = getParentAutoScrollElement(el, true), - elSideVal = getRect(el)[elSide]; - /* jshint boss:true */ + elSideVal = getRect(el)[elSide]; + /* jshint boss:true */ while (parent) { var parentSideVal = getRect(parent)[parentSide], - visible = void 0; - + visible = void 0; if (parentSide === 'top' || parentSide === 'left') { visible = elSideVal >= parentSideVal; } else { visible = elSideVal <= parentSideVal; } - if (!visible) return parent; if (parent === getWindowScrollingElement()) break; parent = getParentAutoScrollElement(parent, false); } - return false; } + /** * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible) * and non-draggable elements @@ -449,44 +390,36 @@ * @param {Object} options Parent Sortable's options * @return {HTMLElement} The child at index childNum, or null if not found */ - - function getChild(el, childNum, options, includeDragEl) { var currentChild = 0, - i = 0, - children = el.children; - + i = 0, + children = el.children; while (i < children.length) { if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) { if (currentChild === childNum) { return children[i]; } - currentChild++; } - i++; } - return null; } + /** * Gets the last child in the el, ignoring ghostEl or invisible elements (clones) * @param {HTMLElement} el Parent element * @param {selector} selector Any other elements that should be ignored * @return {HTMLElement} The last child, ignoring ghostEl */ - - function lastChild(el, selector) { var last = el.lastElementChild; - while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) { last = last.previousElementSibling; } - return last || null; } + /** * Returns the index of an element within its parent for a selected set of * elements @@ -494,81 +427,67 @@ * @param {selector} selector * @return {number} */ - - function index(el, selector) { var index = 0; - if (!el || !el.parentNode) { return -1; } - /* jshint boss:true */ - + /* jshint boss:true */ while (el = el.previousElementSibling) { if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) { index++; } } - return index; } + /** * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements. * The value is returned in real pixels. * @param {HTMLElement} el * @return {Array} Offsets in the format of [left, top] */ - - function getRelativeScrollOffset(el) { var offsetLeft = 0, - offsetTop = 0, - winScroller = getWindowScrollingElement(); - + offsetTop = 0, + winScroller = getWindowScrollingElement(); if (el) { do { var elMatrix = matrix(el), - scaleX = elMatrix.a, - scaleY = elMatrix.d; + scaleX = elMatrix.a, + scaleY = elMatrix.d; offsetLeft += el.scrollLeft * scaleX; offsetTop += el.scrollTop * scaleY; } while (el !== winScroller && (el = el.parentNode)); } - return [offsetLeft, offsetTop]; } + /** * Returns the index of the object within the given array * @param {Array} arr Array that may or may not hold the object * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find * @return {Number} The index of the object in the array, or -1 */ - - function indexOfObject(arr, obj) { for (var i in arr) { if (!arr.hasOwnProperty(i)) continue; - for (var key in obj) { if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i); } } - return -1; } - function getParentAutoScrollElement(el, includeSelf) { // skip to window if (!el || !el.getBoundingClientRect) return getWindowScrollingElement(); var elem = el; var gotSelf = false; - do { // we don't need to get elem css if it isn't even overflowing in the first place (performance) if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) { var elemCSS = css(elem); - if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) { if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement(); if (gotSelf || includeSelf) return elem; @@ -576,12 +495,9 @@ } } /* jshint boss:true */ - } while (elem = elem.parentNode); - return getWindowScrollingElement(); } - function extend(dst, src) { if (dst && src) { for (var key in src) { @@ -590,49 +506,39 @@ } } } - return dst; } - function isRectEqual(rect1, rect2) { return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width); } - var _throttleTimeout; - function throttle(callback, ms) { return function () { if (!_throttleTimeout) { var args = arguments, - _this = this; - + _this = this; if (args.length === 1) { callback.call(_this, args[0]); } else { callback.apply(_this, args); } - _throttleTimeout = setTimeout(function () { _throttleTimeout = void 0; }, ms); } }; } - function cancelThrottle() { clearTimeout(_throttleTimeout); _throttleTimeout = void 0; } - function scrollBy(el, x, y) { el.scrollLeft += x; el.scrollTop += y; } - function clone(el) { var Polymer = window.Polymer; var $ = window.jQuery || window.Zepto; - if (Polymer && Polymer.dom) { return Polymer.dom(el).cloneNode(true); } else if ($) { @@ -641,7 +547,6 @@ return el.cloneNode(true); } } - function setRect(el, rect) { css(el, 'position', 'absolute'); css(el, 'top', rect.top); @@ -649,7 +554,6 @@ css(el, 'width', rect.width); css(el, 'height', rect.height); } - function unsetRect(el) { css(el, 'position', ''); css(el, 'top', ''); @@ -657,12 +561,11 @@ css(el, 'width', ''); css(el, 'height', ''); } - var expando = 'Sortable' + new Date().getTime(); function AnimationStateManager() { var animationStates = [], - animationCallbackId; + animationCallbackId; return { captureAnimationState: function captureAnimationState() { animationStates = []; @@ -674,19 +577,16 @@ target: child, rect: getRect(child) }); + var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); - var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation - - + // If animating: compensate for current animation if (child.thisAnimationDuration) { var childMatrix = matrix(child, true); - if (childMatrix) { fromRect.top -= childMatrix.f; fromRect.left -= childMatrix.e; } } - child.fromRect = fromRect; }); }, @@ -700,54 +600,47 @@ }, animateAll: function animateAll(callback) { var _this = this; - if (!this.options.animation) { clearTimeout(animationCallbackId); if (typeof callback === 'function') callback(); return; } - var animating = false, - animationTime = 0; + animationTime = 0; animationStates.forEach(function (state) { var time = 0, - target = state.target, - fromRect = target.fromRect, - toRect = getRect(target), - prevFromRect = target.prevFromRect, - prevToRect = target.prevToRect, - animatingRect = state.rect, - targetMatrix = matrix(target, true); - + target = state.target, + fromRect = target.fromRect, + toRect = getRect(target), + prevFromRect = target.prevFromRect, + prevToRect = target.prevToRect, + animatingRect = state.rect, + targetMatrix = matrix(target, true); if (targetMatrix) { // Compensate for current animation toRect.top -= targetMatrix.f; toRect.left -= targetMatrix.e; } - target.toRect = toRect; - if (target.thisAnimationDuration) { // Could also check if animatingRect is between fromRect and toRect - if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect + if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && + // Make sure animatingRect is on line between toRect & fromRect (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) { // If returning to same place as started from animation and on same axis time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options); } - } // if fromRect != toRect: animate - + } + // if fromRect != toRect: animate if (!isRectEqual(toRect, fromRect)) { target.prevFromRect = fromRect; target.prevToRect = toRect; - if (!time) { time = _this.options.animation; } - _this.animate(target, animatingRect, toRect, time); } - if (time) { animating = true; animationTime = Math.max(animationTime, time); @@ -763,7 +656,6 @@ } }); clearTimeout(animationCallbackId); - if (!animating) { if (typeof callback === 'function') callback(); } else { @@ -771,7 +663,6 @@ if (typeof callback === 'function') callback(); }, animationTime); } - animationStates = []; }, animate: function animate(target, currentRect, toRect, duration) { @@ -779,10 +670,10 @@ css(target, 'transition', ''); css(target, 'transform', ''); var elMatrix = matrix(this.el), - scaleX = elMatrix && elMatrix.a, - scaleY = elMatrix && elMatrix.d, - translateX = (currentRect.left - toRect.left) / (scaleX || 1), - translateY = (currentRect.top - toRect.top) / (scaleY || 1); + scaleX = elMatrix && elMatrix.a, + scaleY = elMatrix && elMatrix.d, + translateX = (currentRect.left - toRect.left) / (scaleX || 1), + translateY = (currentRect.top - toRect.top) / (scaleY || 1); target.animatingX = !!translateX; target.animatingY = !!translateY; css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)'); @@ -802,11 +693,9 @@ } }; } - function repaint(target) { return target.offsetWidth; } - function calculateRealTime(animatingRect, fromRect, toRect, options) { return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation; } @@ -823,7 +712,6 @@ plugin[option] = defaults[option]; } } - plugins.forEach(function (p) { if (p.pluginName === plugin.pluginName) { throw "Sortable: Cannot mount plugin ".concat(plugin.pluginName, " more than once"); @@ -833,25 +721,22 @@ }, pluginEvent: function pluginEvent(eventName, sortable, evt) { var _this = this; - this.eventCanceled = false; - evt.cancel = function () { _this.eventCanceled = true; }; - var eventNameGlobal = eventName + 'Global'; plugins.forEach(function (plugin) { - if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable - + if (!sortable[plugin.pluginName]) return; + // Fire global events if it exists in this sortable if (sortable[plugin.pluginName][eventNameGlobal]) { sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({ sortable: sortable }, evt)); - } // Only fire plugin event if plugin is enabled in this sortable, - // and plugin has event defined - + } + // Only fire plugin event if plugin is enabled in this sortable, + // and plugin has event defined if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) { sortable[plugin.pluginName][eventName](_objectSpread2({ sortable: sortable @@ -866,15 +751,14 @@ var initialized = new plugin(sortable, el, sortable.options); initialized.sortable = sortable; initialized.options = sortable.options; - sortable[pluginName] = initialized; // Add default options from plugin + sortable[pluginName] = initialized; + // Add default options from plugin _extends(defaults, initialized.defaults); }); - for (var option in sortable.options) { if (!sortable.options.hasOwnProperty(option)) continue; var modified = this.modifyOption(sortable, option, sortable.options[option]); - if (typeof modified !== 'undefined') { sortable.options[option] = modified; } @@ -884,7 +768,6 @@ var eventProperties = {}; plugins.forEach(function (plugin) { if (typeof plugin.eventProperties !== 'function') return; - _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name)); }); return eventProperties; @@ -893,8 +776,9 @@ var modifiedValue; plugins.forEach(function (plugin) { // Plugin must exist on the Sortable - if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin + if (!sortable[plugin.pluginName]) return; + // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') { modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value); } @@ -905,25 +789,25 @@ function dispatchEvent(_ref) { var sortable = _ref.sortable, - rootEl = _ref.rootEl, - name = _ref.name, - targetEl = _ref.targetEl, - cloneEl = _ref.cloneEl, - toEl = _ref.toEl, - fromEl = _ref.fromEl, - oldIndex = _ref.oldIndex, - newIndex = _ref.newIndex, - oldDraggableIndex = _ref.oldDraggableIndex, - newDraggableIndex = _ref.newDraggableIndex, - originalEvent = _ref.originalEvent, - putSortable = _ref.putSortable, - extraEventProperties = _ref.extraEventProperties; + rootEl = _ref.rootEl, + name = _ref.name, + targetEl = _ref.targetEl, + cloneEl = _ref.cloneEl, + toEl = _ref.toEl, + fromEl = _ref.fromEl, + oldIndex = _ref.oldIndex, + newIndex = _ref.newIndex, + oldDraggableIndex = _ref.oldDraggableIndex, + newDraggableIndex = _ref.newDraggableIndex, + originalEvent = _ref.originalEvent, + putSortable = _ref.putSortable, + extraEventProperties = _ref.extraEventProperties; sortable = sortable || rootEl && rootEl[expando]; if (!sortable) return; var evt, - options = sortable.options, - onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature - + options = sortable.options, + onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); + // Support for new CustomEvent feature if (window.CustomEvent && !IE11OrLess && !Edge) { evt = new CustomEvent(name, { bubbles: true, @@ -933,7 +817,6 @@ evt = document.createEvent('Event'); evt.initEvent(name, true, true); } - evt.to = toEl || rootEl; evt.from = fromEl || rootEl; evt.item = targetEl || rootEl; @@ -944,29 +827,23 @@ evt.newDraggableIndex = newDraggableIndex; evt.originalEvent = originalEvent; evt.pullMode = putSortable ? putSortable.lastPutMode : undefined; - var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable)); - for (var option in allEventProperties) { evt[option] = allEventProperties[option]; } - if (rootEl) { rootEl.dispatchEvent(evt); } - if (options[onName]) { options[onName].call(sortable, evt); } } var _excluded = ["evt"]; - var pluginEvent = function pluginEvent(eventName, sortable) { var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - originalEvent = _ref.evt, - data = _objectWithoutProperties(_ref, _excluded); - + originalEvent = _ref.evt, + data = _objectWithoutProperties(_ref, _excluded); PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({ dragEl: dragEl, parentEl: parentEl, @@ -1001,7 +878,6 @@ } }, data)); }; - function _dispatchEvent(info) { dispatchEvent(_objectSpread2({ putSortable: putSortable, @@ -1014,62 +890,61 @@ newDraggableIndex: newDraggableIndex }, info)); } - var dragEl, - parentEl, - ghostEl, - rootEl, - nextEl, - lastDownEl, - cloneEl, - cloneHidden, - oldIndex, - newIndex, - oldDraggableIndex, - newDraggableIndex, - activeGroup, - putSortable, - awaitingDragStarted = false, - ignoreNextClick = false, - sortables = [], - tapEvt, - touchEvt, - lastDx, - lastDy, - tapDistanceLeft, - tapDistanceTop, - moved, - lastTarget, - lastDirection, - pastFirstInvertThresh = false, - isCircumstantialInvert = false, - targetMoveDistance, - // For positioning ghost absolutely - ghostRelativeParent, - ghostRelativeParentInitialScroll = [], - // (left, top) - _silent = false, - savedInputChecked = []; - /** @const */ + parentEl, + ghostEl, + rootEl, + nextEl, + lastDownEl, + cloneEl, + cloneHidden, + oldIndex, + newIndex, + oldDraggableIndex, + newDraggableIndex, + activeGroup, + putSortable, + awaitingDragStarted = false, + ignoreNextClick = false, + sortables = [], + tapEvt, + touchEvt, + lastDx, + lastDy, + tapDistanceLeft, + tapDistanceTop, + moved, + lastTarget, + lastDirection, + pastFirstInvertThresh = false, + isCircumstantialInvert = false, + targetMoveDistance, + // For positioning ghost absolutely + ghostRelativeParent, + ghostRelativeParentInitialScroll = [], + // (left, top) + + _silent = false, + savedInputChecked = []; + /** @const */ var documentExists = typeof document !== 'undefined', - PositionGhostAbsolutely = IOS, - CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float', - // This will not pass for IE9, because IE9 DnD only works on anchors - supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'), - supportCssPointerEvents = function () { - if (!documentExists) return; // false when <= IE11 - - if (IE11OrLess) { - return false; - } - - var el = document.createElement('x'); - el.style.cssText = 'pointer-events:auto'; - return el.style.pointerEvents === 'auto'; - }(), - _detectDirection = function _detectDirection(el, options) { - var elCSS = css(el), + PositionGhostAbsolutely = IOS, + CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float', + // This will not pass for IE9, because IE9 DnD only works on anchors + supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'), + supportCssPointerEvents = function () { + if (!documentExists) return; + // false when <= IE11 + if (IE11OrLess) { + return false; + } + var el = document.createElement('x'); + el.style.cssText = 'pointer-events:auto'; + return el.style.pointerEvents === 'auto'; + }(), + _detectDirection = function _detectDirection(el, options) { + var elCSS = css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = getChild(el, 0, options), child2 = getChild(el, 1, options), @@ -1077,102 +952,92 @@ secondChildCSS = child2 && css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width; - - if (elCSS.display === 'flex') { - return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal'; - } - - if (elCSS.display === 'grid') { - return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal'; - } - - if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') { - var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right'; - return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal'; - } - - return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal'; - }, - _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) { - var dragElS1Opp = vertical ? dragRect.left : dragRect.top, + if (elCSS.display === 'flex') { + return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal'; + } + if (elCSS.display === 'grid') { + return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal'; + } + if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') { + var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right'; + return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal'; + } + return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal'; + }, + _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) { + var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height; - return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; - }, - - /** - * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold. - * @param {Number} x X position - * @param {Number} y Y position - * @return {HTMLElement} Element of the first found nearest Sortable - */ - _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) { - var ret; - sortables.some(function (sortable) { - var threshold = sortable[expando].options.emptyInsertThreshold; - if (!threshold || lastChild(sortable)) return; - var rect = getRect(sortable), + return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; + }, + /** + * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold. + * @param {Number} x X position + * @param {Number} y Y position + * @return {HTMLElement} Element of the first found nearest Sortable + */ + _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) { + var ret; + sortables.some(function (sortable) { + var threshold = sortable[expando].options.emptyInsertThreshold; + if (!threshold || lastChild(sortable)) return; + var rect = getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold; - - if (insideHorizontally && insideVertically) { - return ret = sortable; - } - }); - return ret; - }, - _prepareGroup = function _prepareGroup(options) { - function toFn(value, pull) { - return function (to, from, dragEl, evt) { - var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; - - if (value == null && (pull || sameGroup)) { - // Default pull value - // Default pull and put value if same group - return true; - } else if (value == null || value === false) { - return false; - } else if (pull && value === 'clone') { - return value; - } else if (typeof value === 'function') { - return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt); - } else { - var otherGroup = (pull ? to : from).options.group.name; - return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; + if (insideHorizontally && insideVertically) { + return ret = sortable; } - }; - } - - var group = {}; - var originalGroup = options.group; - - if (!originalGroup || _typeof(originalGroup) != 'object') { - originalGroup = { - name: originalGroup - }; - } - - group.name = originalGroup.name; - group.checkPull = toFn(originalGroup.pull, true); - group.checkPut = toFn(originalGroup.put); - group.revertClone = originalGroup.revertClone; - options.group = group; - }, - _hideGhostForTarget = function _hideGhostForTarget() { - if (!supportCssPointerEvents && ghostEl) { - css(ghostEl, 'display', 'none'); - } - }, - _unhideGhostForTarget = function _unhideGhostForTarget() { - if (!supportCssPointerEvents && ghostEl) { - css(ghostEl, 'display', ''); - } - }; // #1184 fix - Prevent click event on fallback if dragged but item not changed position - + }); + return ret; + }, + _prepareGroup = function _prepareGroup(options) { + function toFn(value, pull) { + return function (to, from, dragEl, evt) { + var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; + if (value == null && (pull || sameGroup)) { + // Default pull value + // Default pull and put value if same group + return true; + } else if (value == null || value === false) { + return false; + } else if (pull && value === 'clone') { + return value; + } else if (typeof value === 'function') { + return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt); + } else { + var otherGroup = (pull ? to : from).options.group.name; + return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; + } + }; + } + var group = {}; + var originalGroup = options.group; + if (!originalGroup || _typeof(originalGroup) != 'object') { + originalGroup = { + name: originalGroup + }; + } + group.name = originalGroup.name; + group.checkPull = toFn(originalGroup.pull, true); + group.checkPut = toFn(originalGroup.put); + group.revertClone = originalGroup.revertClone; + options.group = group; + }, + _hideGhostForTarget = function _hideGhostForTarget() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, 'display', 'none'); + } + }, + _unhideGhostForTarget = function _unhideGhostForTarget() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, 'display', ''); + } + }; + // #1184 fix - Prevent click event on fallback if dragged but item not changed position if (documentExists && !ChromeForAndroid) { document.addEventListener('click', function (evt) { if (ignoreNextClick) { @@ -1184,53 +1049,44 @@ } }, true); } - var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) { if (dragEl) { evt = evt.touches ? evt.touches[0] : evt; - var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY); - if (nearest) { // Create imitation event var event = {}; - for (var i in evt) { if (evt.hasOwnProperty(i)) { event[i] = evt[i]; } } - event.target = event.rootEl = nearest; event.preventDefault = void 0; event.stopPropagation = void 0; - nearest[expando]._onDragOver(event); } } }; - var _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) { if (dragEl) { dragEl.parentNode[expando]._isOutsideThisEl(evt.target); } }; + /** * @class Sortable * @param {HTMLElement} el * @param {Object} [options] */ - - function Sortable(el, options) { if (!(el && el.nodeType && el.nodeType === 1)) { throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(el)); } - this.el = el; // root element + this.options = options = _extends({}, options); - this.options = options = _extends({}, options); // Export instance - + // Export instance el[expando] = this; var defaults = { group: null, @@ -1277,52 +1133,48 @@ supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari, emptyInsertThreshold: 5 }; - PluginManager.initializePlugins(this, el, defaults); // Set default options + PluginManager.initializePlugins(this, el, defaults); + // Set default options for (var name in defaults) { !(name in options) && (options[name] = defaults[name]); } + _prepareGroup(options); - _prepareGroup(options); // Bind all private methods - - + // Bind all private methods for (var fn in this) { if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { this[fn] = this[fn].bind(this); } - } // Setup drag mode - + } + // Setup drag mode this.nativeDraggable = options.forceFallback ? false : supportDraggable; - if (this.nativeDraggable) { // Touch start threshold cannot be greater than the native dragstart threshold this.options.touchStartThreshold = 1; - } // Bind events - + } + // Bind events if (options.supportPointer) { on(el, 'pointerdown', this._onTapStart); } else { on(el, 'mousedown', this._onTapStart); on(el, 'touchstart', this._onTapStart); } - if (this.nativeDraggable) { on(el, 'dragover', this); on(el, 'dragenter', this); } + sortables.push(this.el); - sortables.push(this.el); // Restore sorting - - options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager + // Restore sorting + options.store && options.store.get && this.sort(options.store.get(this) || []); + // Add animation state manager _extends(this, AnimationStateManager()); } - - Sortable.prototype = - /** @lends Sortable.prototype */ - { + Sortable.prototype = /** @lends Sortable.prototype */{ constructor: Sortable, _isOutsideThisEl: function _isOutsideThisEl(target) { if (!this.el.contains(target) && target !== this.el) { @@ -1332,57 +1184,50 @@ _getDirection: function _getDirection(evt, target) { return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction; }, - _onTapStart: function _onTapStart( - /** Event|TouchEvent */ - evt) { + _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) { if (!evt.cancelable) return; - var _this = this, - el = this.el, - options = this.options, - preventOnFilter = options.preventOnFilter, - type = evt.type, - touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt, - target = (touch || evt).target, - originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, - filter = options.filter; - - _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group. - - + el = this.el, + options = this.options, + preventOnFilter = options.preventOnFilter, + type = evt.type, + touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt, + target = (touch || evt).target, + originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, + filter = options.filter; + _saveInputCheckedState(el); + + // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group. if (dragEl) { return; } - if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) { return; // only left button and enabled - } // cancel dnd if original target is content editable - + } + // cancel dnd if original target is content editable if (originalTarget.isContentEditable) { return; - } // Safari ignores further event handling after mousedown - + } + // Safari ignores further event handling after mousedown if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') { return; } - target = closest(target, options.draggable, el, false); - if (target && target.animated) { return; } - if (lastDownEl === target) { // Ignoring duplicate `down` return; - } // Get the index of the dragged element within its parent - + } + // Get the index of the dragged element within its parent oldIndex = index(target); - oldDraggableIndex = index(target, options.draggable); // Check filter + oldDraggableIndex = index(target, options.draggable); + // Check filter if (typeof filter === 'function') { if (filter.call(this, evt, target, this)) { _dispatchEvent({ @@ -1393,7 +1238,6 @@ toEl: el, fromEl: el }); - pluginEvent('filter', _this, { evt: evt }); @@ -1403,7 +1247,6 @@ } else if (filter) { filter = filter.split(',').some(function (criteria) { criteria = closest(originalTarget, criteria.trim(), el, false); - if (criteria) { _dispatchEvent({ sortable: _this, @@ -1413,40 +1256,30 @@ fromEl: el, toEl: el }); - pluginEvent('filter', _this, { evt: evt }); return true; } }); - if (filter) { preventOnFilter && evt.cancelable && evt.preventDefault(); return; // cancel dnd } } - if (options.handle && !closest(originalTarget, options.handle, el, false)) { return; - } // Prepare `dragstart` - + } + // Prepare `dragstart` this._prepareDragStart(evt, touch, target); }, - _prepareDragStart: function _prepareDragStart( - /** Event */ - evt, - /** Touch */ - touch, - /** HTMLElement */ - target) { + _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) { var _this = this, - el = _this.el, - options = _this.options, - ownerDocument = el.ownerDocument, - dragStartFn; - + el = _this.el, + options = _this.options, + ownerDocument = el.ownerDocument, + dragStartFn; if (target && !dragEl && target.parentNode === el) { var dragRect = getRect(target); rootEl = el; @@ -1466,41 +1299,36 @@ this._lastX = (touch || evt).clientX; this._lastY = (touch || evt).clientY; dragEl.style['will-change'] = 'all'; - dragStartFn = function dragStartFn() { pluginEvent('delayEnded', _this, { evt: evt }); - if (Sortable.eventCanceled) { _this._onDrop(); - return; - } // Delayed drag has been triggered + } + // Delayed drag has been triggered // we can re-enable the events: touchmove/mousemove - - _this._disableDelayedDragEvents(); - if (!FireFox && _this.nativeDraggable) { dragEl.draggable = true; - } // Bind the events: dragstart/dragend - - - _this._triggerDragStart(evt, touch); // Drag start event + } + // Bind the events: dragstart/dragend + _this._triggerDragStart(evt, touch); + // Drag start event _dispatchEvent({ sortable: _this, name: 'choose', originalEvent: evt - }); // Chosen item - + }); + // Chosen item toggleClass(dragEl, options.chosenClass, true); - }; // Disable "draggable" - + }; + // Disable "draggable" options.ignore.split(',').forEach(function (criteria) { find(dragEl, criteria.trim(), _disableDraggable); }); @@ -1509,27 +1337,26 @@ on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent); on(ownerDocument, 'mouseup', _this._onDrop); on(ownerDocument, 'touchend', _this._onDrop); - on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox) + on(ownerDocument, 'touchcancel', _this._onDrop); + // Make dragEl draggable (must be before delay for FireFox) if (FireFox && this.nativeDraggable) { this.options.touchStartThreshold = 4; dragEl.draggable = true; } - pluginEvent('delayStart', this, { evt: evt - }); // Delay is impossible for native DnD in Edge or IE + }); + // Delay is impossible for native DnD in Edge or IE if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) { if (Sortable.eventCanceled) { this._onDrop(); - return; - } // If the user moves the pointer or let go the click or touch + } + // If the user moves the pointer or let go the click or touch // before the delay has been reached: // disable the delayed drag - - on(ownerDocument, 'mouseup', _this._disableDelayedDrag); on(ownerDocument, 'touchend', _this._disableDelayedDrag); on(ownerDocument, 'touchcancel', _this._disableDelayedDrag); @@ -1542,11 +1369,8 @@ } } }, - _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( - /** TouchEvent|PointerEvent **/ - e) { + _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) { var touch = e.touches ? e.touches[0] : e; - if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) { this._disableDelayedDrag(); } @@ -1554,7 +1378,6 @@ _disableDelayedDrag: function _disableDelayedDrag() { dragEl && _disableDraggable(dragEl); clearTimeout(this._dragStartTimer); - this._disableDelayedDragEvents(); }, _disableDelayedDragEvents: function _disableDelayedDragEvents() { @@ -1566,13 +1389,8 @@ off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler); off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler); }, - _triggerDragStart: function _triggerDragStart( - /** Event */ - evt, - /** Touch */ - touch) { + _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) { touch = touch || evt.pointerType == 'touch' && evt; - if (!this.nativeDraggable || touch) { if (this.options.supportPointer) { on(document, 'pointermove', this._onTouchMove); @@ -1585,7 +1403,6 @@ on(dragEl, 'dragend', this); on(rootEl, 'dragstart', this._onDragStart); } - try { if (document.selection) { // Timeout neccessary for IE9 @@ -1598,25 +1415,23 @@ } catch (err) {} }, _dragStarted: function _dragStarted(fallback, evt) { - awaitingDragStarted = false; - if (rootEl && dragEl) { pluginEvent('dragStarted', this, { evt: evt }); - if (this.nativeDraggable) { on(document, 'dragover', _checkOutsideTargetEl); } + var options = this.options; - var options = this.options; // Apply effect - + // Apply effect !fallback && toggleClass(dragEl, options.dragClass, false); toggleClass(dragEl, options.ghostClass, true); Sortable.active = this; - fallback && this._appendGhost(); // Drag start event + fallback && this._appendGhost(); + // Drag start event _dispatchEvent({ sortable: this, name: 'start', @@ -1630,20 +1445,15 @@ if (touchEvt) { this._lastX = touchEvt.clientX; this._lastY = touchEvt.clientY; - _hideGhostForTarget(); - var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY); var parent = target; - while (target && target.shadowRoot) { target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY); if (target === parent) break; parent = target; } - dragEl.parentNode[expando]._isOutsideThisEl(target); - if (parent) { do { if (parent[expando]) { @@ -1654,44 +1464,37 @@ target: target, rootEl: parent }); - if (inserted && !this.options.dragoverBubble) { break; } } - target = parent; // store last element } - /* jshint boss:true */ - while (parent = parent.parentNode); + /* jshint boss:true */ while (parent = parent.parentNode); } - _unhideGhostForTarget(); } }, - _onTouchMove: function _onTouchMove( - /**TouchEvent*/ - evt) { + _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) { if (tapEvt) { var options = this.options, - fallbackTolerance = options.fallbackTolerance, - fallbackOffset = options.fallbackOffset, - touch = evt.touches ? evt.touches[0] : evt, - ghostMatrix = ghostEl && matrix(ghostEl, true), - scaleX = ghostEl && ghostMatrix && ghostMatrix.a, - scaleY = ghostEl && ghostMatrix && ghostMatrix.d, - relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), - dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), - dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging - + fallbackTolerance = options.fallbackTolerance, + fallbackOffset = options.fallbackOffset, + touch = evt.touches ? evt.touches[0] : evt, + ghostMatrix = ghostEl && matrix(ghostEl, true), + scaleX = ghostEl && ghostMatrix && ghostMatrix.a, + scaleY = ghostEl && ghostMatrix && ghostMatrix.d, + relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), + dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), + dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); + + // only set the status to dragging, when we are actually dragging if (!Sortable.active && !awaitingDragStarted) { if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) { return; } - this._onDragStart(evt, true); } - if (ghostEl) { if (ghostMatrix) { ghostMatrix.e += dx - (lastDx || 0); @@ -1706,7 +1509,6 @@ f: dy }; } - var cssMatrix = "matrix(".concat(ghostMatrix.a, ",").concat(ghostMatrix.b, ",").concat(ghostMatrix.c, ",").concat(ghostMatrix.d, ",").concat(ghostMatrix.e, ",").concat(ghostMatrix.f, ")"); css(ghostEl, 'webkitTransform', cssMatrix); css(ghostEl, 'mozTransform', cssMatrix); @@ -1716,7 +1518,6 @@ lastDy = dy; touchEvt = touch; } - evt.cancelable && evt.preventDefault(); } }, @@ -1725,17 +1526,16 @@ // Not being adjusted for if (!ghostEl) { var container = this.options.fallbackOnBody ? document.body : rootEl, - rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), - options = this.options; // Position absolutely + rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), + options = this.options; + // Position absolutely if (PositionGhostAbsolutely) { // Get relatively positioned parent ghostRelativeParent = container; - while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) { ghostRelativeParent = ghostRelativeParent.parentNode; } - if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) { if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement(); rect.top += ghostRelativeParent.scrollTop; @@ -1743,10 +1543,8 @@ } else { ghostRelativeParent = getWindowScrollingElement(); } - ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent); } - ghostEl = dragEl.cloneNode(true); toggleClass(ghostEl, options.ghostClass, false); toggleClass(ghostEl, options.fallbackClass, true); @@ -1764,62 +1562,50 @@ css(ghostEl, 'zIndex', '100000'); css(ghostEl, 'pointerEvents', 'none'); Sortable.ghost = ghostEl; - container.appendChild(ghostEl); // Set transform-origin + container.appendChild(ghostEl); + // Set transform-origin css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%'); } }, - _onDragStart: function _onDragStart( - /**Event*/ - evt, - /**boolean*/ - fallback) { + _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) { var _this = this; - var dataTransfer = evt.dataTransfer; var options = _this.options; pluginEvent('dragStart', this, { evt: evt }); - if (Sortable.eventCanceled) { this._onDrop(); - return; } - pluginEvent('setupClone', this); - if (!Sortable.eventCanceled) { cloneEl = clone(dragEl); cloneEl.removeAttribute("id"); cloneEl.draggable = false; cloneEl.style['will-change'] = ''; - this._hideClone(); - toggleClass(cloneEl, this.options.chosenClass, false); Sortable.clone = cloneEl; - } // #1143: IFrame support workaround - + } + // #1143: IFrame support workaround _this.cloneId = _nextTick(function () { pluginEvent('clone', _this); if (Sortable.eventCanceled) return; - if (!_this.options.removeCloneOnHide) { rootEl.insertBefore(cloneEl, dragEl); } - _this._hideClone(); - _dispatchEvent({ sortable: _this, name: 'clone' }); }); - !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events + !fallback && toggleClass(dragEl, options.dragClass, true); + // Set proper drop events if (fallback) { ignoreNextClick = true; _this._loopId = setInterval(_this._emulateDragOver, 50); @@ -1828,47 +1614,40 @@ off(document, 'mouseup', _this._onDrop); off(document, 'touchend', _this._onDrop); off(document, 'touchcancel', _this._onDrop); - if (dataTransfer) { dataTransfer.effectAllowed = 'move'; options.setData && options.setData.call(_this, dataTransfer, dragEl); } + on(document, 'drop', _this); - on(document, 'drop', _this); // #1276 fix: - + // #1276 fix: css(dragEl, 'transform', 'translateZ(0)'); } - awaitingDragStarted = true; _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt)); on(document, 'selectstart', _this); moved = true; - if (Safari) { css(document.body, 'user-select', 'none'); } }, // Returns true - if no further action is needed (either inserted or another condition) - _onDragOver: function _onDragOver( - /**Event*/ - evt) { + _onDragOver: function _onDragOver( /**Event*/evt) { var el = this.el, - target = evt.target, - dragRect, - targetRect, - revert, - options = this.options, - group = options.group, - activeSortable = Sortable.active, - isOwner = activeGroup === group, - canSort = options.sort, - fromSortable = putSortable || activeSortable, - vertical, - _this = this, - completedFired = false; - + target = evt.target, + dragRect, + targetRect, + revert, + options = this.options, + group = options.group, + activeSortable = Sortable.active, + isOwner = activeGroup === group, + canSort = options.sort, + fromSortable = putSortable || activeSortable, + vertical, + _this = this, + completedFired = false; if (_silent) return; - function dragOverEvent(name, extra) { pluginEvent(name, _this, _objectSpread2({ evt: evt, @@ -1886,25 +1665,22 @@ }, changed: changed }, extra)); - } // Capture animation state - + } + // Capture animation state function capture() { dragOverEvent('dragOverAnimationCapture'); - _this.captureAnimationState(); - if (_this !== fromSortable) { fromSortable.captureAnimationState(); } - } // Return invocation when dragEl is inserted (or completed) - + } + // Return invocation when dragEl is inserted (or completed) function completed(insertion) { dragOverEvent('dragOverCompleted', { insertion: insertion }); - if (insertion) { // Clones must be hidden before folding animation to capture dragRectAbsolute properly if (isOwner) { @@ -1912,57 +1688,51 @@ } else { activeSortable._showClone(_this); } - if (_this !== fromSortable) { // Set ghost class to new sortable's ghost class toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false); toggleClass(dragEl, options.ghostClass, true); } - if (putSortable !== _this && _this !== Sortable.active) { putSortable = _this; } else if (_this === Sortable.active && putSortable) { putSortable = null; - } // Animation - + } + // Animation if (fromSortable === _this) { _this._ignoreWhileAnimating = target; } - _this.animateAll(function () { dragOverEvent('dragOverAnimationComplete'); _this._ignoreWhileAnimating = null; }); - if (_this !== fromSortable) { fromSortable.animateAll(); fromSortable._ignoreWhileAnimating = null; } - } // Null lastTarget if it is not inside a previously swapped element - + } + // Null lastTarget if it is not inside a previously swapped element if (target === dragEl && !dragEl.animated || target === el && !target.animated) { lastTarget = null; - } // no bubbling and not fallback - + } + // no bubbling and not fallback if (!options.dragoverBubble && !evt.rootEl && target !== document) { - dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted - + dragEl.parentNode[expando]._isOutsideThisEl(evt.target); + // Do not detect for empty insert if already inserted !insertion && nearestEmptyInsertDetectEvent(evt); } - !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation(); return completedFired = true; - } // Call when dragEl has been inserted - + } + // Call when dragEl has been inserted function changed() { newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); - _dispatchEvent({ sortable: _this, name: 'change', @@ -1972,37 +1742,27 @@ originalEvent: evt }); } - if (evt.preventDefault !== void 0) { evt.cancelable && evt.preventDefault(); } - target = closest(target, options.draggable, el, true); dragOverEvent('dragOver'); if (Sortable.eventCanceled) return completedFired; - if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) { return completed(false); } - ignoreNextClick = false; - if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) { vertical = this._getDirection(evt, target) === 'vertical'; dragRect = getRect(dragEl); dragOverEvent('dragOverValid'); if (Sortable.eventCanceled) return completedFired; - if (revert) { parentEl = rootEl; // actualization - capture(); - this._hideClone(); - dragOverEvent('revert'); - if (!Sortable.eventCanceled) { if (nextEl) { rootEl.insertBefore(dragEl, nextEl); @@ -2010,38 +1770,32 @@ rootEl.appendChild(dragEl); } } - return completed(true); } - var elLastChild = lastChild(el, options.draggable); - if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) { // Insert to end of list + // If already at end of list: Do not insert if (elLastChild === dragEl) { return completed(false); - } // if there is a last element, it is the target - + } + // if there is a last element, it is the target if (elLastChild && el === evt.target) { target = elLastChild; } - if (target) { targetRect = getRect(target); } - if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) { capture(); - if (elLastChild && elLastChild.nextSibling) { // the last draggable element is not the last node el.insertBefore(dragEl, elLastChild.nextSibling); } else { el.appendChild(dragEl); } - parentEl = el; // actualization changed(); @@ -2050,14 +1804,11 @@ } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) { // Insert to start of list var firstChild = getChild(el, 0, options, true); - if (firstChild === dragEl) { return completed(false); } - target = firstChild; targetRect = getRect(target); - if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) { capture(); el.insertBefore(dragEl, firstChild); @@ -2069,82 +1820,68 @@ } else if (target.parentNode === el) { targetRect = getRect(target); var direction = 0, - targetBeforeFirstSwap, - differentLevel = dragEl.parentNode !== el, - differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), - side1 = vertical ? 'top' : 'left', - scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'), - scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; - + targetBeforeFirstSwap, + differentLevel = dragEl.parentNode !== el, + differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), + side1 = vertical ? 'top' : 'left', + scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'), + scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; if (lastTarget !== target) { targetBeforeFirstSwap = targetRect[side1]; pastFirstInvertThresh = false; isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel; } - direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target); var sibling; - if (direction !== 0) { // Check if target is beside dragEl in respective direction (ignoring hidden elements) var dragIndex = index(dragEl); - do { dragIndex -= direction; sibling = parentEl.children[dragIndex]; } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl)); - } // If dragEl is already beside target: Do not insert - - + } + // If dragEl is already beside target: Do not insert if (direction === 0 || sibling === target) { return completed(false); } - lastTarget = target; lastDirection = direction; var nextSibling = target.nextElementSibling, - after = false; + after = false; after = direction === 1; - var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after); - if (moveVector !== false) { if (moveVector === 1 || moveVector === -1) { after = moveVector === 1; } - _silent = true; setTimeout(_unsilent, 30); capture(); - if (after && !nextSibling) { el.appendChild(dragEl); } else { target.parentNode.insertBefore(dragEl, after ? nextSibling : target); - } // Undo chrome's scroll adjustment (has no effect on other browsers) - + } + // Undo chrome's scroll adjustment (has no effect on other browsers) if (scrolledPastTop) { scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop); } - parentEl = dragEl.parentNode; // actualization - // must be done before animation + // must be done before animation if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) { targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]); } - changed(); return completed(true); } } - if (el.contains(dragEl)) { return completed(false); } } - return false; }, _ignoreWhileAnimating: null, @@ -2164,83 +1901,69 @@ off(ownerDocument, 'touchcancel', this._onDrop); off(document, 'selectstart', this); }, - _onDrop: function _onDrop( - /**Event*/ - evt) { + _onDrop: function _onDrop( /**Event*/evt) { var el = this.el, - options = this.options; // Get the index of the dragged element within its parent + options = this.options; + // Get the index of the dragged element within its parent newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); pluginEvent('drop', this, { evt: evt }); - parentEl = dragEl && dragEl.parentNode; // Get again after plugin event + parentEl = dragEl && dragEl.parentNode; + // Get again after plugin event newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); - if (Sortable.eventCanceled) { this._nulling(); - return; } - awaitingDragStarted = false; isCircumstantialInvert = false; pastFirstInvertThresh = false; clearInterval(this._loopId); clearTimeout(this._dragStartTimer); - _cancelNextTick(this.cloneId); + _cancelNextTick(this._dragStartId); - _cancelNextTick(this._dragStartId); // Unbind events - - + // Unbind events if (this.nativeDraggable) { off(document, 'drop', this); off(el, 'dragstart', this._onDragStart); } - this._offMoveEvents(); - this._offUpEvents(); - if (Safari) { css(document.body, 'user-select', ''); } - css(dragEl, 'transform', ''); - if (evt) { if (moved) { evt.cancelable && evt.preventDefault(); !options.dropBubble && evt.stopPropagation(); } - ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl); - if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { // Remove clone(s) cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl); } - if (dragEl) { if (this.nativeDraggable) { off(dragEl, 'dragend', this); } - _disableDraggable(dragEl); + dragEl.style['will-change'] = ''; - dragEl.style['will-change'] = ''; // Remove classes + // Remove classes // ghostClass is added in dragStarted - if (moved && !awaitingDragStarted) { toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false); } + toggleClass(dragEl, this.options.chosenClass, false); - toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event - + // Drag stop event _dispatchEvent({ sortable: this, name: 'unchoose', @@ -2249,7 +1972,6 @@ newDraggableIndex: null, originalEvent: evt }); - if (rootEl !== parentEl) { if (newIndex >= 0) { // Add event @@ -2259,17 +1981,17 @@ toEl: parentEl, fromEl: rootEl, originalEvent: evt - }); // Remove event - + }); + // Remove event _dispatchEvent({ sortable: this, name: 'remove', toEl: parentEl, originalEvent: evt - }); // drag from one list and drop into another - + }); + // drag from one list and drop into another _dispatchEvent({ rootEl: parentEl, name: 'sort', @@ -2277,7 +1999,6 @@ fromEl: rootEl, originalEvent: evt }); - _dispatchEvent({ sortable: this, name: 'sort', @@ -2285,7 +2006,6 @@ originalEvent: evt }); } - putSortable && putSortable.save(); } else { if (newIndex !== oldIndex) { @@ -2297,7 +2017,6 @@ toEl: parentEl, originalEvent: evt }); - _dispatchEvent({ sortable: this, name: 'sort', @@ -2307,27 +2026,24 @@ } } } - if (Sortable.active) { /* jshint eqnull:true */ if (newIndex == null || newIndex === -1) { newIndex = oldIndex; newDraggableIndex = oldDraggableIndex; } - _dispatchEvent({ sortable: this, name: 'end', toEl: parentEl, originalEvent: evt - }); // Save sorting - + }); + // Save sorting this.save(); } } } - this._nulling(); }, _nulling: function _nulling() { @@ -2338,65 +2054,52 @@ }); savedInputChecked.length = lastDx = lastDy = 0; }, - handleEvent: function handleEvent( - /**Event*/ - evt) { + handleEvent: function handleEvent( /**Event*/evt) { switch (evt.type) { case 'drop': case 'dragend': this._onDrop(evt); - break; - case 'dragenter': case 'dragover': if (dragEl) { this._onDragOver(evt); - _globalDragOver(evt); } - break; - case 'selectstart': evt.preventDefault(); break; } }, - /** * Serializes the item into an array of string. * @returns {String[]} */ toArray: function toArray() { var order = [], - el, - children = this.el.children, - i = 0, - n = children.length, - options = this.options; - + el, + children = this.el.children, + i = 0, + n = children.length, + options = this.options; for (; i < n; i++) { el = children[i]; - if (closest(el, options.draggable, this.el, false)) { order.push(el.getAttribute(options.dataIdAttr) || _generateId(el)); } } - return order; }, - /** * Sorts the elements according to the array. * @param {String[]} order order of the items */ sort: function sort(order, useAnimation) { var items = {}, - rootEl = this.el; + rootEl = this.el; this.toArray().forEach(function (id, i) { var el = rootEl.children[i]; - if (closest(el, this.options.draggable, rootEl, false)) { items[id] = el; } @@ -2410,7 +2113,6 @@ }); useAnimation && this.animateAll(); }, - /** * Save the current sorting */ @@ -2418,7 +2120,6 @@ var store = this.options.store; store && store.set && store.set(this); }, - /** * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. * @param {HTMLElement} el @@ -2428,7 +2129,6 @@ closest: function closest$1(el, selector) { return closest(el, selector || this.options.draggable, this.el, false); }, - /** * Set/get option * @param {string} name @@ -2437,24 +2137,20 @@ */ option: function option(name, value) { var options = this.options; - if (value === void 0) { return options[name]; } else { var modifiedValue = PluginManager.modifyOption(this, name, value); - if (typeof modifiedValue !== 'undefined') { options[name] = modifiedValue; } else { options[name] = value; } - if (name === 'group') { _prepareGroup(options); } } }, - /** * Destroy */ @@ -2465,23 +2161,16 @@ off(el, 'mousedown', this._onTapStart); off(el, 'touchstart', this._onTapStart); off(el, 'pointerdown', this._onTapStart); - if (this.nativeDraggable) { off(el, 'dragover', this); off(el, 'dragenter', this); - } // Remove draggable attributes - - + } + // Remove draggable attributes Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) { el.removeAttribute('draggable'); }); - - if (el === rootEl) { - this._onDrop(); - } - + this._onDrop(); this._disableDelayedDragEvents(); - sortables.splice(sortables.indexOf(this.el), 1); this.el = el = null; }, @@ -2490,25 +2179,22 @@ pluginEvent('hideClone', this); if (Sortable.eventCanceled) return; css(cloneEl, 'display', 'none'); - if (this.options.removeCloneOnHide && cloneEl.parentNode) { cloneEl.parentNode.removeChild(cloneEl); } - cloneHidden = true; } }, _showClone: function _showClone(putSortable) { if (putSortable.lastPutMode !== 'clone') { this._hideClone(); - return; } - if (cloneHidden) { pluginEvent('showClone', this); - if (Sortable.eventCanceled) return; // show clone at dragEl or original position + if (Sortable.eventCanceled) return; + // show clone at dragEl or original position if (dragEl.parentNode == rootEl && !this.options.group.revertClone) { rootEl.insertBefore(cloneEl, dragEl); } else if (nextEl) { @@ -2516,33 +2202,26 @@ } else { rootEl.appendChild(cloneEl); } - if (this.options.group.revertClone) { this.animate(dragEl, cloneEl); } - css(cloneEl, 'display', ''); cloneHidden = false; } } }; - - function _globalDragOver( - /**Event*/ - evt) { + function _globalDragOver( /**Event*/evt) { if (evt.dataTransfer) { evt.dataTransfer.dropEffect = 'move'; } - evt.cancelable && evt.preventDefault(); } - function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) { var evt, - sortable = fromEl[expando], - onMoveFn = sortable.options.onMove, - retVal; // Support for new CustomEvent feature - + sortable = fromEl[expando], + onMoveFn = sortable.options.onMove, + retVal; + // Support for new CustomEvent feature if (window.CustomEvent && !IE11OrLess && !Edge) { evt = new CustomEvent('move', { bubbles: true, @@ -2552,7 +2231,6 @@ evt = document.createEvent('Event'); evt.initEvent('move', true, true); } - evt.to = toEl; evt.from = fromEl; evt.dragged = dragEl; @@ -2562,41 +2240,35 @@ evt.willInsertAfter = willInsertAfter; evt.originalEvent = originalEvent; fromEl.dispatchEvent(evt); - if (onMoveFn) { retVal = onMoveFn.call(sortable, evt, originalEvent); } - return retVal; } - function _disableDraggable(el) { el.draggable = false; } - function _unsilent() { _silent = false; } - function _ghostIsFirst(evt, vertical, sortable) { - var rect = getRect(getChild(sortable.el, 0, sortable.options, true)); + var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true)); + var sortableContentRect = getContentRect(sortable.el); var spacer = 10; - return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left; + return vertical ? evt.clientX < sortableContentRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < sortableContentRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left; } - function _ghostIsLast(evt, vertical, sortable) { - var rect = getRect(lastChild(sortable.el, sortable.options.draggable)); + var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable)); + var sortableContentRect = getContentRect(sortable.el); var spacer = 10; - return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer; + return vertical ? evt.clientX > sortableContentRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > sortableContentRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top; } - function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) { var mouseOnAxis = vertical ? evt.clientY : evt.clientX, - targetLength = vertical ? targetRect.height : targetRect.width, - targetS1 = vertical ? targetRect.top : targetRect.left, - targetS2 = vertical ? targetRect.bottom : targetRect.right, - invert = false; - + targetLength = vertical ? targetRect.height : targetRect.width, + targetS1 = vertical ? targetRect.top : targetRect.left, + targetS2 = vertical ? targetRect.bottom : targetRect.right, + invert = false; if (!invertSwap) { // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) { @@ -2606,7 +2278,6 @@ // past first invert threshold, do not restrict inverted threshold to dragEl shadow pastFirstInvertThresh = true; } - if (!pastFirstInvertThresh) { // dragEl shadow (target move distance shadow) if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow @@ -2623,26 +2294,22 @@ } } } - invert = invert || invertSwap; - if (invert) { // Invert of regular if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) { return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1; } } - return 0; } + /** * Gets the direction dragEl must be swapped relative to target in order to make it * seem that dragEl has been "inserted" into that element's position * @param {HTMLElement} target The target whose position dragEl is being inserted at * @return {Number} Direction dragEl must be swapped */ - - function _getInsertDirection(target) { if (index(dragEl) < index(target)) { return 1; @@ -2650,55 +2317,48 @@ return -1; } } + /** * Generate id * @param {HTMLElement} el * @returns {String} * @private */ - - function _generateId(el) { var str = el.tagName + el.className + el.src + el.href + el.textContent, - i = str.length, - sum = 0; - + i = str.length, + sum = 0; while (i--) { sum += str.charCodeAt(i); } - return sum.toString(36); } - function _saveInputCheckedState(root) { savedInputChecked.length = 0; var inputs = root.getElementsByTagName('input'); var idx = inputs.length; - while (idx--) { var el = inputs[idx]; el.checked && savedInputChecked.push(el); } } - function _nextTick(fn) { return setTimeout(fn, 0); } - function _cancelNextTick(id) { return clearTimeout(id); - } // Fixed #973: - + } + // Fixed #973: if (documentExists) { on(document, 'touchmove', function (evt) { if ((Sortable.active || awaitingDragStarted) && evt.cancelable) { evt.preventDefault(); } }); - } // Export utils - + } + // Export utils Sortable.utils = { on: on, off: off, @@ -2718,59 +2378,54 @@ detectDirection: _detectDirection, getChild: getChild }; + /** * Get the Sortable instance of an element * @param {HTMLElement} element The element * @return {Sortable|undefined} The instance of Sortable */ - Sortable.get = function (element) { return element[expando]; }; + /** * Mount a plugin to Sortable * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted */ - - Sortable.mount = function () { for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) { plugins[_key] = arguments[_key]; } - if (plugins[0].constructor === Array) plugins = plugins[0]; plugins.forEach(function (plugin) { if (!plugin.prototype || !plugin.prototype.constructor) { throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin)); } - if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils); PluginManager.mount(plugin); }); }; + /** * Create sortable instance * @param {HTMLElement} el * @param {Object} [options] */ - - Sortable.create = function (el, options) { return new Sortable(el, options); - }; // Export - + }; + // Export Sortable.version = version; var autoScrolls = [], - scrollEl, - scrollRootEl, - scrolling = false, - lastAutoScrollX, - lastAutoScrollY, - touchEvt$1, - pointerElemChangedInterval; - + scrollEl, + scrollRootEl, + scrolling = false, + lastAutoScrollX, + lastAutoScrollY, + touchEvt$1, + pointerElemChangedInterval; function AutoScrollPlugin() { function AutoScroll() { this.defaults = { @@ -2779,19 +2434,18 @@ scrollSensitivity: 30, scrollSpeed: 10, bubbleScroll: true - }; // Bind all private methods + }; + // Bind all private methods for (var fn in this) { if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { this[fn] = this[fn].bind(this); } } } - AutoScroll.prototype = { dragStarted: function dragStarted(_ref) { var originalEvent = _ref.originalEvent; - if (this.sortable.nativeDraggable) { on(document, 'dragover', this._handleAutoScroll); } else { @@ -2806,7 +2460,6 @@ }, dragOverCompleted: function dragOverCompleted(_ref2) { var originalEvent = _ref2.originalEvent; - // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached) if (!this.options.dragOverBubble && !originalEvent.rootEl) { this._handleAutoScroll(originalEvent); @@ -2820,7 +2473,6 @@ off(document, 'touchmove', this._handleFallbackAutoScroll); off(document, 'mousemove', this._handleFallbackAutoScroll); } - clearPointerElemChangedInterval(); clearAutoScrolls(); cancelThrottle(); @@ -2834,31 +2486,29 @@ }, _handleAutoScroll: function _handleAutoScroll(evt, fallback) { var _this = this; - var x = (evt.touches ? evt.touches[0] : evt).clientX, - y = (evt.touches ? evt.touches[0] : evt).clientY, - elem = document.elementFromPoint(x, y); - touchEvt$1 = evt; // IE does not seem to have native autoscroll, + y = (evt.touches ? evt.touches[0] : evt).clientY, + elem = document.elementFromPoint(x, y); + touchEvt$1 = evt; + + // IE does not seem to have native autoscroll, // Edge's autoscroll seems too conditional, // MACOS Safari does not have autoscroll, // Firefox and Chrome are good - if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) { - autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change + autoScroll(evt, this.options, elem, fallback); + // Listener for pointer element change var ogElemScroller = getParentAutoScrollElement(elem, true); - if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) { - pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour - + pointerElemChangedInterval && clearPointerElemChangedInterval(); + // Detect for pointer elem change, emulating native DnD behaviour pointerElemChangedInterval = setInterval(function () { var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true); - if (newElem !== ogElemScroller) { ogElemScroller = newElem; clearAutoScrolls(); } - autoScroll(evt, _this.options, newElem, fallback); }, 10); lastAutoScrollX = x; @@ -2870,7 +2520,6 @@ clearAutoScrolls(); return; } - autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false); } } @@ -2880,60 +2529,54 @@ initializeByDefault: true }); } - function clearAutoScrolls() { autoScrolls.forEach(function (autoScroll) { clearInterval(autoScroll.pid); }); autoScrolls = []; } - function clearPointerElemChangedInterval() { clearInterval(pointerElemChangedInterval); } - var autoScroll = throttle(function (evt, options, rootEl, isFallback) { // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521 if (!options.scroll) return; var x = (evt.touches ? evt.touches[0] : evt).clientX, - y = (evt.touches ? evt.touches[0] : evt).clientY, - sens = options.scrollSensitivity, - speed = options.scrollSpeed, - winScroller = getWindowScrollingElement(); + y = (evt.touches ? evt.touches[0] : evt).clientY, + sens = options.scrollSensitivity, + speed = options.scrollSpeed, + winScroller = getWindowScrollingElement(); var scrollThisInstance = false, - scrollCustomFn; // New scroll root, set scrollEl + scrollCustomFn; + // New scroll root, set scrollEl if (scrollRootEl !== rootEl) { scrollRootEl = rootEl; clearAutoScrolls(); scrollEl = options.scroll; scrollCustomFn = options.scrollFn; - if (scrollEl === true) { scrollEl = getParentAutoScrollElement(rootEl, true); } } - var layersOut = 0; var currentParent = scrollEl; - do { var el = currentParent, - rect = getRect(el), - top = rect.top, - bottom = rect.bottom, - left = rect.left, - right = rect.right, - width = rect.width, - height = rect.height, - canScrollX = void 0, - canScrollY = void 0, - scrollWidth = el.scrollWidth, - scrollHeight = el.scrollHeight, - elCSS = css(el), - scrollPosX = el.scrollLeft, - scrollPosY = el.scrollTop; - + rect = getRect(el), + top = rect.top, + bottom = rect.bottom, + left = rect.left, + right = rect.right, + width = rect.width, + height = rect.height, + canScrollX = void 0, + canScrollY = void 0, + scrollWidth = el.scrollWidth, + scrollHeight = el.scrollHeight, + elCSS = css(el), + scrollPosX = el.scrollLeft, + scrollPosY = el.scrollTop; if (el === winScroller) { canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible'); canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible'); @@ -2941,10 +2584,8 @@ canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll'); canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll'); } - var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX); var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY); - if (!autoScrolls[layersOut]) { for (var i = 0; i <= layersOut; i++) { if (!autoScrolls[i]) { @@ -2952,61 +2593,51 @@ } } } - if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) { autoScrolls[layersOut].el = el; autoScrolls[layersOut].vx = vx; autoScrolls[layersOut].vy = vy; clearInterval(autoScrolls[layersOut].pid); - if (vx != 0 || vy != 0) { scrollThisInstance = true; /* jshint loopfunc:true */ - autoScrolls[layersOut].pid = setInterval(function () { // emulate drag over during autoscroll (fallback), emulating native DnD behaviour if (isFallback && this.layer === 0) { Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely - } - var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0; var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0; - if (typeof scrollCustomFn === 'function') { if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') { return; } } - scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY); }.bind({ layer: layersOut }), 24); } } - layersOut++; } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false))); - scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not }, 30); var drop = function drop(_ref) { var originalEvent = _ref.originalEvent, - putSortable = _ref.putSortable, - dragEl = _ref.dragEl, - activeSortable = _ref.activeSortable, - dispatchSortableEvent = _ref.dispatchSortableEvent, - hideGhostForTarget = _ref.hideGhostForTarget, - unhideGhostForTarget = _ref.unhideGhostForTarget; + putSortable = _ref.putSortable, + dragEl = _ref.dragEl, + activeSortable = _ref.activeSortable, + dispatchSortableEvent = _ref.dispatchSortableEvent, + hideGhostForTarget = _ref.hideGhostForTarget, + unhideGhostForTarget = _ref.unhideGhostForTarget; if (!originalEvent) return; var toSortable = putSortable || activeSortable; hideGhostForTarget(); var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent; var target = document.elementFromPoint(touch.clientX, touch.clientY); unhideGhostForTarget(); - if (toSortable && !toSortable.el.contains(target)) { dispatchSortableEvent('spill'); this.onSpill({ @@ -3015,9 +2646,7 @@ }); } }; - function Revert() {} - Revert.prototype = { startIndex: null, dragStart: function dragStart(_ref2) { @@ -3026,40 +2655,32 @@ }, onSpill: function onSpill(_ref3) { var dragEl = _ref3.dragEl, - putSortable = _ref3.putSortable; + putSortable = _ref3.putSortable; this.sortable.captureAnimationState(); - if (putSortable) { putSortable.captureAnimationState(); } - var nextSibling = getChild(this.sortable.el, this.startIndex, this.options); - if (nextSibling) { this.sortable.el.insertBefore(dragEl, nextSibling); } else { this.sortable.el.appendChild(dragEl); } - this.sortable.animateAll(); - if (putSortable) { putSortable.animateAll(); } }, drop: drop }; - _extends(Revert, { pluginName: 'revertOnSpill' }); - function Remove() {} - Remove.prototype = { onSpill: function onSpill(_ref4) { var dragEl = _ref4.dragEl, - putSortable = _ref4.putSortable; + putSortable = _ref4.putSortable; var parentSortable = putSortable || this.sortable; parentSortable.captureAnimationState(); dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); @@ -3067,20 +2688,17 @@ }, drop: drop }; - _extends(Remove, { pluginName: 'removeOnSpill' }); var lastSwapEl; - function SwapPlugin() { function Swap() { this.defaults = { swapClass: 'sortable-swap-highlight' }; } - Swap.prototype = { dragStart: function dragStart(_ref) { var dragEl = _ref.dragEl; @@ -3088,42 +2706,37 @@ }, dragOverValid: function dragOverValid(_ref2) { var completed = _ref2.completed, - target = _ref2.target, - onMove = _ref2.onMove, - activeSortable = _ref2.activeSortable, - changed = _ref2.changed, - cancel = _ref2.cancel; + target = _ref2.target, + onMove = _ref2.onMove, + activeSortable = _ref2.activeSortable, + changed = _ref2.changed, + cancel = _ref2.cancel; if (!activeSortable.options.swap) return; var el = this.sortable.el, - options = this.options; - + options = this.options; if (target && target !== el) { var 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: function drop(_ref3) { var activeSortable = _ref3.activeSortable, - putSortable = _ref3.putSortable, - dragEl = _ref3.dragEl; + putSortable = _ref3.putSortable, + dragEl = _ref3.dragEl; var toSortable = putSortable || this.sortable; var options = this.options; lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false); - if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) { if (dragEl !== lastSwapEl) { toSortable.captureAnimationState(); @@ -3147,38 +2760,34 @@ } }); } - function swapNodes(n1, n2) { var p1 = n1.parentNode, - p2 = n2.parentNode, - i1, - i2; + 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]); } var multiDragElements = [], - multiDragClones = [], - lastMultiDragSelect, - // for selection with modifier key down (SHIFT) - multiDragSortable, - initialFolding = false, - // Initial multi-drag fold when drag started - folding = false, - // Folding any other time - dragStarted = false, - dragEl$1, - clonesFromRect, - clonesHidden; - + multiDragClones = [], + lastMultiDragSelect, + // for selection with modifier key down (SHIFT) + multiDragSortable, + initialFolding = false, + // Initial multi-drag fold when drag started + folding = false, + // Folding any other time + dragStarted = false, + dragEl$1, + clonesFromRect, + clonesHidden; function MultiDragPlugin() { function MultiDrag(sortable) { // Bind all private methods @@ -3187,7 +2796,6 @@ this[fn] = this[fn].bind(this); } } - if (!sortable.options.avoidImplicitDeselect) { if (sortable.options.supportPointer) { on(document, 'pointerup', this._deselectMultiDrag); @@ -3196,7 +2804,6 @@ on(document, 'touchend', this._deselectMultiDrag); } } - on(document, 'keydown', this._checkKeyDown); on(document, 'keyup', this._checkKeyUp); this.defaults = { @@ -3205,7 +2812,6 @@ avoidImplicitDeselect: false, setData: function setData(dataTransfer, dragEl) { var data = ''; - if (multiDragElements.length && multiDragSortable === sortable) { multiDragElements.forEach(function (multiDragElement, i) { data += (!i ? '' : ', ') + multiDragElement.textContent; @@ -3213,12 +2819,10 @@ } else { data = dragEl.textContent; } - dataTransfer.setData('Text', data); } }; } - MultiDrag.prototype = { multiDragKeyDown: false, isMultiDrag: false, @@ -3231,9 +2835,8 @@ }, setupClone: function setupClone(_ref2) { var sortable = _ref2.sortable, - cancel = _ref2.cancel; + cancel = _ref2.cancel; if (!this.isMultiDrag) return; - for (var i = 0; i < multiDragElements.length; i++) { multiDragClones.push(clone(multiDragElements[i])); multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex; @@ -3242,18 +2845,15 @@ toggleClass(multiDragClones[i], this.options.selectedClass, false); multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false); } - sortable._hideClone(); - cancel(); }, clone: function clone(_ref3) { var sortable = _ref3.sortable, - rootEl = _ref3.rootEl, - dispatchSortableEvent = _ref3.dispatchSortableEvent, - cancel = _ref3.cancel; + rootEl = _ref3.rootEl, + dispatchSortableEvent = _ref3.dispatchSortableEvent, + cancel = _ref3.cancel; if (!this.isMultiDrag) return; - if (!this.options.removeCloneOnHide) { if (multiDragElements.length && multiDragSortable === sortable) { insertMultiDragClones(true, rootEl); @@ -3264,8 +2864,8 @@ }, showClone: function showClone(_ref4) { var cloneNowShown = _ref4.cloneNowShown, - rootEl = _ref4.rootEl, - cancel = _ref4.cancel; + rootEl = _ref4.rootEl, + cancel = _ref4.cancel; if (!this.isMultiDrag) return; insertMultiDragClones(false, rootEl); multiDragClones.forEach(function (clone) { @@ -3277,14 +2877,12 @@ }, hideClone: function hideClone(_ref5) { var _this = this; - var sortable = _ref5.sortable, - cloneNowHidden = _ref5.cloneNowHidden, - cancel = _ref5.cancel; + cloneNowHidden = _ref5.cloneNowHidden, + cancel = _ref5.cancel; if (!this.isMultiDrag) return; multiDragClones.forEach(function (clone) { css(clone, 'display', 'none'); - if (_this.options.removeCloneOnHide && clone.parentNode) { clone.parentNode.removeChild(clone); } @@ -3295,15 +2893,14 @@ }, dragStartGlobal: function dragStartGlobal(_ref6) { var sortable = _ref6.sortable; - if (!this.isMultiDrag && multiDragSortable) { multiDragSortable.multiDrag._deselectMultiDrag(); } - multiDragElements.forEach(function (multiDragElement) { multiDragElement.sortableIndex = index(multiDragElement); - }); // Sort multi-drag elements + }); + // Sort multi-drag elements multiDragElements = multiDragElements.sort(function (a, b) { return a.sortableIndex - b.sortableIndex; }); @@ -3311,10 +2908,8 @@ }, dragStarted: function dragStarted(_ref7) { var _this2 = this; - var sortable = _ref7.sortable; if (!this.isMultiDrag) return; - if (this.options.sort) { // Capture rects, // hide multi drag elements (by positioning them absolute), @@ -3322,8 +2917,8 @@ // show multi drag elements, // animate to rects, // unset rects & remove from DOM - sortable.captureAnimationState(); + sortable.captureAnimationState(); if (this.options.animation) { multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; @@ -3338,18 +2933,16 @@ initialFolding = true; } } - sortable.animateAll(function () { folding = false; initialFolding = false; - if (_this2.options.animation) { multiDragElements.forEach(function (multiDragElement) { unsetRect(multiDragElement); }); - } // Remove all auxiliary multidrag items from el, if sorting enabled - + } + // Remove all auxiliary multidrag items from el, if sorting enabled if (_this2.options.sort) { removeMultiDragElements(); } @@ -3357,9 +2950,8 @@ }, dragOver: function dragOver(_ref8) { var target = _ref8.target, - completed = _ref8.completed, - cancel = _ref8.cancel; - + completed = _ref8.completed, + cancel = _ref8.cancel; if (folding && ~multiDragElements.indexOf(target)) { completed(false); cancel(); @@ -3367,10 +2959,9 @@ }, revert: function revert(_ref9) { var fromSortable = _ref9.fromSortable, - rootEl = _ref9.rootEl, - sortable = _ref9.sortable, - dragRect = _ref9.dragRect; - + rootEl = _ref9.rootEl, + sortable = _ref9.sortable, + dragRect = _ref9.dragRect; if (multiDragElements.length > 1) { // Setup unfold animation multiDragElements.forEach(function (multiDragElement) { @@ -3388,47 +2979,44 @@ }, dragOverCompleted: function dragOverCompleted(_ref10) { var sortable = _ref10.sortable, - isOwner = _ref10.isOwner, - insertion = _ref10.insertion, - activeSortable = _ref10.activeSortable, - parentEl = _ref10.parentEl, - putSortable = _ref10.putSortable; + isOwner = _ref10.isOwner, + insertion = _ref10.insertion, + activeSortable = _ref10.activeSortable, + parentEl = _ref10.parentEl, + putSortable = _ref10.putSortable; var options = this.options; - if (insertion) { // Clones must be hidden before folding animation to capture dragRectAbsolute properly if (isOwner) { activeSortable._hideClone(); } - - initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location - + initialFolding = false; + // If leaving sort:false root, or already folding - Fold to new location if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) { // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible var dragRectAbsolute = getRect(dragEl$1, false, true, true); multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; - setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted - // while folding, and so that we can capture them again because old sortable will no longer be fromSortable + setRect(multiDragElement, dragRectAbsolute); + // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted + // while folding, and so that we can capture them again because old sortable will no longer be fromSortable parentEl.appendChild(multiDragElement); }); folding = true; - } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out - + } + // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out if (!isOwner) { // Only remove if not folding (folding will remove them anyways) if (!folding) { removeMultiDragElements(); } - if (multiDragElements.length > 1) { var clonesHiddenBefore = clonesHidden; + activeSortable._showClone(sortable); - activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden - - + // Unfold animation for clones if showing from hidden if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) { multiDragClones.forEach(function (clone) { activeSortable.addAnimationState({ @@ -3447,12 +3035,11 @@ }, dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) { var dragRect = _ref11.dragRect, - isOwner = _ref11.isOwner, - activeSortable = _ref11.activeSortable; + isOwner = _ref11.isOwner, + activeSortable = _ref11.activeSortable; multiDragElements.forEach(function (multiDragElement) { multiDragElement.thisAnimationDuration = null; }); - if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) { clonesFromRect = _extends({}, dragRect); var dragMatrix = matrix(dragEl$1, true); @@ -3468,24 +3055,23 @@ }, drop: function drop(_ref12) { var evt = _ref12.originalEvent, - rootEl = _ref12.rootEl, - parentEl = _ref12.parentEl, - sortable = _ref12.sortable, - dispatchSortableEvent = _ref12.dispatchSortableEvent, - oldIndex = _ref12.oldIndex, - putSortable = _ref12.putSortable; + rootEl = _ref12.rootEl, + parentEl = _ref12.parentEl, + sortable = _ref12.sortable, + dispatchSortableEvent = _ref12.dispatchSortableEvent, + oldIndex = _ref12.oldIndex, + putSortable = _ref12.putSortable; var toSortable = putSortable || this.sortable; if (!evt) return; var options = this.options, - children = parentEl.children; // Multi-drag selection + children = parentEl.children; + // Multi-drag selection if (!dragStarted) { if (options.multiDragKey && !this.multiDragKeyDown) { this._deselectMultiDrag(); } - toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1)); - if (!~multiDragElements.indexOf(dragEl$1)) { multiDragElements.push(dragEl$1); dispatchEvent({ @@ -3494,17 +3080,16 @@ name: 'select', targetEl: dragEl$1, originalEvent: evt - }); // Modifier activated, select from last to dragEl + }); + // Modifier activated, select from last to dragEl if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) { var lastIndex = index(lastMultiDragSelect), - currentIndex = index(dragEl$1); - + currentIndex = index(dragEl$1); if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) { // Must include lastMultiDragSelect (select it), in case modified selection from no selection // (but previous selection existed) var n, i; - if (currentIndex > lastIndex) { i = lastIndex; n = currentIndex; @@ -3512,7 +3097,6 @@ i = currentIndex; n = lastIndex + 1; } - for (; i < n; i++) { if (~multiDragElements.indexOf(children[i])) continue; toggleClass(children[i], options.selectedClass, true); @@ -3529,7 +3113,6 @@ } else { lastMultiDragSelect = dragEl$1; } - multiDragSortable = toSortable; } else { multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1); @@ -3542,38 +3125,37 @@ originalEvent: evt }); } - } // Multi-drag drop - + } + // Multi-drag drop if (dragStarted && this.isMultiDrag) { - folding = false; // Do not "unfold" after around dragEl if reverted - + folding = false; + // Do not "unfold" after around dragEl if reverted if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) { var dragRect = getRect(dragEl$1), - multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')'); + multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')'); if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null; toSortable.captureAnimationState(); - if (!initialFolding) { if (options.animation) { dragEl$1.fromRect = dragRect; multiDragElements.forEach(function (multiDragElement) { multiDragElement.thisAnimationDuration = null; - if (multiDragElement !== dragEl$1) { var rect = folding ? getRect(multiDragElement) : dragRect; - multiDragElement.fromRect = rect; // Prepare unfold animation + multiDragElement.fromRect = rect; + // Prepare unfold animation toSortable.addAnimationState({ target: multiDragElement, rect: rect }); } }); - } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert - // properly they must all be removed - + } + // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert + // properly they must all be removed removeMultiDragElements(); multiDragElements.forEach(function (multiDragElement) { if (children[multiDragIndex]) { @@ -3581,12 +3163,12 @@ } else { parentEl.appendChild(multiDragElement); } - multiDragIndex++; - }); // If initial folding is done, the elements may have changed position because they are now + }); + + // If initial folding is done, the elements may have changed position because they are now // unfolding around dragEl, even though dragEl may not have his index changed, so update event // must be fired here as Sortable will not. - if (oldIndex === index(dragEl$1)) { var update = false; multiDragElements.forEach(function (multiDragElement) { @@ -3595,24 +3177,23 @@ return; } }); - if (update) { dispatchSortableEvent('update'); + dispatchSortableEvent('sort'); } } - } // Must be done after capturing individual rects (scroll bar) - + } + // Must be done after capturing individual rects (scroll bar) multiDragElements.forEach(function (multiDragElement) { unsetRect(multiDragElement); }); toSortable.animateAll(); } - multiDragSortable = toSortable; - } // Remove clones if necessary - + } + // Remove clones if necessary if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { multiDragClones.forEach(function (clone) { clone.parentNode && clone.parentNode.removeChild(clone); @@ -3625,7 +3206,6 @@ }, destroyGlobal: function destroyGlobal() { this._deselectMultiDrag(); - off(document, 'pointerup', this._deselectMultiDrag); off(document, 'mouseup', this._deselectMultiDrag); off(document, 'touchend', this._deselectMultiDrag); @@ -3633,14 +3213,16 @@ off(document, 'keyup', this._checkKeyUp); }, _deselectMultiDrag: function _deselectMultiDrag(evt) { - if (typeof dragStarted !== "undefined" && dragStarted) return; // Only deselect if selection is in this sortable + if (typeof dragStarted !== "undefined" && dragStarted) return; - if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable + // Only deselect if selection is in this sortable + if (multiDragSortable !== this.sortable) return; - if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click + // Only deselect if target is not item in this sortable + if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; + // Only deselect if left click if (evt && evt.button !== 0) return; - while (multiDragElements.length) { var el = multiDragElements[0]; toggleClass(el, this.options.selectedClass, false); @@ -3676,24 +3258,20 @@ select: function select(el) { var sortable = el.parentNode[expando]; if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return; - if (multiDragSortable && multiDragSortable !== sortable) { multiDragSortable.multiDrag._deselectMultiDrag(); - multiDragSortable = sortable; } - toggleClass(el, sortable.options.selectedClass, true); multiDragElements.push(el); }, - /** * Deselects the provided multi-drag item * @param {HTMLElement} el The element to be deselected */ deselect: function deselect(el) { var sortable = el.parentNode[expando], - index = multiDragElements.indexOf(el); + index = multiDragElements.indexOf(el); if (!sortable || !sortable.options.multiDrag || !~index) return; toggleClass(el, sortable.options.selectedClass, false); multiDragElements.splice(index, 1); @@ -3701,17 +3279,16 @@ }, eventProperties: function eventProperties() { var _this3 = this; - var oldIndicies = [], - newIndicies = []; + newIndicies = []; multiDragElements.forEach(function (multiDragElement) { oldIndicies.push({ multiDragElement: multiDragElement, index: multiDragElement.sortableIndex - }); // multiDragElements will already be sorted if folding + }); + // multiDragElements will already be sorted if folding var newIndex; - if (folding && multiDragElement !== dragEl$1) { newIndex = -1; } else if (folding) { @@ -3719,7 +3296,6 @@ } else { newIndex = index(multiDragElement); } - newIndicies.push({ multiDragElement: multiDragElement, index: newIndex @@ -3735,23 +3311,19 @@ optionListeners: { multiDragKey: function multiDragKey(key) { key = key.toLowerCase(); - if (key === 'ctrl') { key = 'Control'; } else if (key.length > 1) { key = key.charAt(0).toUpperCase() + key.substr(1); } - return key; } } }); } - function insertMultiDragElements(clonesInserted, rootEl) { multiDragElements.forEach(function (multiDragElement, i) { var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)]; - if (target) { rootEl.insertBefore(multiDragElement, target); } else { @@ -3759,17 +3331,15 @@ } }); } + /** * Insert multi-drag clones * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted * @param {HTMLElement} rootEl */ - - function insertMultiDragClones(elementsInserted, rootEl) { multiDragClones.forEach(function (clone, i) { var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)]; - if (target) { rootEl.insertBefore(clone, target); } else { @@ -3777,7 +3347,6 @@ } }); } - function removeMultiDragElements() { multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; diff --git a/Sortable.min.js b/Sortable.min.js index 17bb16c73..1a9f19982 100644 --- a/Sortable.min.js +++ b/Sortable.min.js @@ -1,2 +1,2 @@ -/*! Sortable 1.15.0 - MIT | git://github.com/SortableJS/Sortable.git */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Sortable=e()}(this,function(){"use strict";function e(e,t){var n,o=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),o.push.apply(o,n)),o}function M(o){for(var t=1;tt.length)&&(e=t.length);for(var n=0,o=new Array(e);n"===e[0]&&(e=e.substring(1)),t))try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return}}function N(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"!==e[0]||t.parentNode===n)&&p(t,e)||o&&t===n)return t}while(t!==n&&(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode))}var i;return null}var g,m=/\s+/g;function I(t,e,n){var o;t&&e&&(t.classList?t.classList[n?"add":"remove"](e):(o=(" "+t.className+" ").replace(m," ").replace(" "+e+" "," "),t.className=(o+(n?" "+e:"")).replace(m," ")))}function P(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];o[e=!(e in o||-1!==e.indexOf("webkit"))?"-webkit-"+e:e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=P(t,"transform")}while(o&&"none"!==o&&(n=o+" "+n),!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function b(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=n.left-e&&i<=n.right+e,e=r>=n.top-e&&r<=n.bottom+e;return o&&e?a=t:void 0}}),a);if(e){var n,o={};for(n in t)t.hasOwnProperty(n)&&(o[n]=t[n]);o.target=o.rootEl=e,o.preventDefault=void 0,o.stopPropagation=void 0,e[j]._onDragOver(o)}}var i,r,a}function Yt(t){q&&q.parentNode[j]._isOutsideThisEl(t.target)}function Bt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[j]=this;var n,o,i={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return It(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Bt.supportPointer&&"PointerEvent"in window&&!u,emptyInsertThreshold:5};for(n in K.initializePlugins(this,t,i),i)n in e||(e[n]=i[n]);for(o in Pt(e),this)"_"===o.charAt(0)&&"function"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!e.forceFallback&&Mt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?h(t,"pointerdown",this._onTapStart):(h(t,"mousedown",this._onTapStart),h(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(h(t,"dragover",this),h(t,"dragenter",this)),Et.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,x())}function Ft(t,e,n,o,i,r,a,l){var s,c,u=t[j],d=u.options.onMove;return!window.CustomEvent||y||w?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||k(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),c=d?d.call(u,s,a):c}function jt(t){t.draggable=!1}function Ht(){Ct=!1}function Lt(t){return setTimeout(t,0)}function Kt(t){return clearTimeout(t)}Bt.prototype={constructor:Bt,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(gt=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,q):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(!function(t){Tt.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&Tt.push(o)}}(o),!q&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled)&&!s.isContentEditable&&(this.nativeDraggable||!u||!l||"SELECT"!==l.tagName.toUpperCase())&&!((l=N(l,t.draggable,o,!1))&&l.animated||J===l)){if(nt=B(l),it=B(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return U({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),z("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c=c&&c.split(",").some(function(t){if(t=N(s,t.trim(),o,!1))return U({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),z("filter",n,{evt:e}),!0}))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!N(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;n&&!q&&n.parentNode===r&&(o=k(n),$=r,V=(q=n).parentNode,Q=q.nextSibling,J=n,at=a.group,st={target:Bt.dragged=q,clientX:(e||t).clientX,clientY:(e||t).clientY},ht=st.clientX-o.left,ft=st.clientY-o.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,q.style["will-change"]="all",o=function(){z("delayEnded",i,{evt:t}),Bt.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!s&&i.nativeDraggable&&(q.draggable=!0),i._triggerDragStart(t,e),U({sortable:i,name:"choose",originalEvent:t}),I(q,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){b(q,t.trim(),jt)}),h(l,"dragover",Xt),h(l,"mousemove",Xt),h(l,"touchmove",Xt),h(l,"mouseup",i._onDrop),h(l,"touchend",i._onDrop),h(l,"touchcancel",i._onDrop),s&&this.nativeDraggable&&(this.options.touchStartThreshold=4,q.draggable=!0),z("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(w||y)?o():Bt.eventCanceled?this._onDrop():(h(l,"mouseup",i._disableDelayedDrag),h(l,"touchend",i._disableDelayedDrag),h(l,"touchcancel",i._disableDelayedDrag),h(l,"mousemove",i._delayedDragTouchMoveHandler),h(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&h(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)))},_delayedDragTouchMoveHandler:function(t){t=t.touches?t.touches[0]:t;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){q&&jt(q),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;f(t,"mouseup",this._disableDelayedDrag),f(t,"touchend",this._disableDelayedDrag),f(t,"touchcancel",this._disableDelayedDrag),f(t,"mousemove",this._delayedDragTouchMoveHandler),f(t,"touchmove",this._delayedDragTouchMoveHandler),f(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?h(document,"pointermove",this._onTouchMove):h(document,e?"touchmove":"mousemove",this._onTouchMove):(h(q,"dragend",this),h($,"dragstart",this._onDragStart));try{document.selection?Lt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){var n;yt=!1,$&&q?(z("dragStarted",this,{evt:e}),this.nativeDraggable&&h(document,"dragover",Yt),n=this.options,t||I(q,n.dragClass,!1),I(q,n.ghostClass,!0),Bt.active=this,t&&this._appendGhost(),U({sortable:this,name:"start",originalEvent:e})):this._nulling()},_emulateDragOver:function(){if(ct){this._lastX=ct.clientX,this._lastY=ct.clientY,kt();for(var t=document.elementFromPoint(ct.clientX,ct.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(ct.clientX,ct.clientY))!==e;)e=t;if(q.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j])if(e[j]._onDragOver({clientX:ct.clientX,clientY:ct.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}while(e=(t=e).parentNode);Rt()}},_onTouchMove:function(t){if(st){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=Z&&v(Z,!0),a=Z&&r&&r.a,l=Z&&r&&r.d,e=Ot&&bt&&E(bt),a=(i.clientX-st.clientX+o.x)/(a||1)+(e?e[0]-_t[0]:0)/(a||1),l=(i.clientY-st.clientY+o.y)/(l||1)+(e?e[1]-_t[1]:0)/(l||1);if(!Bt.active&&!yt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))n.right+10||t.clientX<=n.right&&t.clientY>n.bottom&&t.clientX>=n.left:t.clientX>n.right&&t.clientY>n.top||t.clientX<=n.right&&t.clientY>n.bottom+10}(n,r,this)&&!g.animated){if(g===q)return O(!1);if((l=g&&a===n.target?g:l)&&(w=k(l)),!1!==Ft($,a,q,o,l,w,n,!!l))return x(),g&&g.nextSibling?a.insertBefore(q,g.nextSibling):a.appendChild(q),V=a,A(),O(!0)}else if(g&&function(t,e,n){n=k(X(n.el,0,n.options,!0));return e?t.clientXt.length)&&(e=t.length);for(var n=0,o=new Array(e);n"===e[0]&&(e=e.substring(1)),t))try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"!==e[0]||t.parentNode===n)&&f(t,e)||o&&t===n)return t}while(t!==n&&(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode))}var i;return null}var g,m=/\s+/g;function k(t,e,n){var o;t&&e&&(t.classList?t.classList[n?"add":"remove"](e):(o=(" "+t.className+" ").replace(m," ").replace(" "+e+" "," "),t.className=(o+(n?" "+e:"")).replace(m," ")))}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];o[e=!(e in o||-1!==e.indexOf("webkit"))?"-webkit-"+e:e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform")}while(o&&"none"!==o&&(n=o+" "+n),!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return i&&new i(n)}function b(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=n.left-e&&i<=n.right+e,e=r>=n.top-e&&r<=n.bottom+e;return o&&e?a=t:void 0}}),a);if(e){var n,o={};for(n in t)t.hasOwnProperty(n)&&(o[n]=t[n]);o.target=o.rootEl=e,o.preventDefault=void 0,o.stopPropagation=void 0,e[W]._onDragOver(o)}}var i,r,a}function Bt(t){V&&V.parentNode[W]._isOutsideThisEl(t.target)}function Ft(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[W]=this;var n,o,i={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Pt(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Ft.supportPointer&&"PointerEvent"in window&&!u,emptyInsertThreshold:5};for(n in K.initializePlugins(this,t,i),i)n in e||(e[n]=i[n]);for(o in kt(e),this)"_"===o.charAt(0)&&"function"==typeof this[o]&&(this[o]=this[o].bind(this));this.nativeDraggable=!e.forceFallback&&It,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?h(t,"pointerdown",this._onTapStart):(h(t,"mousedown",this._onTapStart),h(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(h(t,"dragover",this),h(t,"dragenter",this)),Dt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,x())}function jt(t,e,n,o,i,r,a,l){var s,c,u=t[W],d=u.options.onMove;return!window.CustomEvent||y||w?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),c=d?d.call(u,s,a):c}function Ht(t){t.draggable=!1}function Lt(){Tt=!1}function Wt(t){return setTimeout(t,0)}function Kt(t){return clearTimeout(t)}Ft.prototype={constructor:Ft,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(mt=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,V):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(!function(t){xt.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&xt.push(o)}}(o),!V&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled)&&!s.isContentEditable&&(this.nativeDraggable||!u||!l||"SELECT"!==l.tagName.toUpperCase())&&!((l=P(l,t.draggable,o,!1))&&l.animated||tt===l)){if(ot=H(l),rt=H(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return q({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),G("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c=c&&c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return q({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),G("filter",n,{evt:e}),!0}))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;n&&!V&&n.parentNode===r&&(o=X(n),Q=r,Z=(V=n).parentNode,J=V.nextSibling,tt=n,lt=a.group,ct={target:Ft.dragged=V,clientX:(e||t).clientX,clientY:(e||t).clientY},pt=ct.clientX-o.left,ft=ct.clientY-o.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,V.style["will-change"]="all",o=function(){G("delayEnded",i,{evt:t}),Ft.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!s&&i.nativeDraggable&&(V.draggable=!0),i._triggerDragStart(t,e),q({sortable:i,name:"choose",originalEvent:t}),k(V,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){b(V,t.trim(),Ht)}),h(l,"dragover",Yt),h(l,"mousemove",Yt),h(l,"touchmove",Yt),h(l,"mouseup",i._onDrop),h(l,"touchend",i._onDrop),h(l,"touchcancel",i._onDrop),s&&this.nativeDraggable&&(this.options.touchStartThreshold=4,V.draggable=!0),G("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(w||y)?o():Ft.eventCanceled?this._onDrop():(h(l,"mouseup",i._disableDelayedDrag),h(l,"touchend",i._disableDelayedDrag),h(l,"touchcancel",i._disableDelayedDrag),h(l,"mousemove",i._delayedDragTouchMoveHandler),h(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&h(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)))},_delayedDragTouchMoveHandler:function(t){t=t.touches?t.touches[0]:t;Math.max(Math.abs(t.clientX-this._lastX),Math.abs(t.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){V&&Ht(V),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;p(t,"mouseup",this._disableDelayedDrag),p(t,"touchend",this._disableDelayedDrag),p(t,"touchcancel",this._disableDelayedDrag),p(t,"mousemove",this._delayedDragTouchMoveHandler),p(t,"touchmove",this._delayedDragTouchMoveHandler),p(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?h(document,"pointermove",this._onTouchMove):h(document,e?"touchmove":"mousemove",this._onTouchMove):(h(V,"dragend",this),h(Q,"dragstart",this._onDragStart));try{document.selection?Wt(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){var n;wt=!1,Q&&V?(G("dragStarted",this,{evt:e}),this.nativeDraggable&&h(document,"dragover",Bt),n=this.options,t||k(V,n.dragClass,!1),k(V,n.ghostClass,!0),Ft.active=this,t&&this._appendGhost(),q({sortable:this,name:"start",originalEvent:e})):this._nulling()},_emulateDragOver:function(){if(ut){this._lastX=ut.clientX,this._lastY=ut.clientY,Rt();for(var t=document.elementFromPoint(ut.clientX,ut.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(ut.clientX,ut.clientY))!==e;)e=t;if(V.parentNode[W]._isOutsideThisEl(t),e)do{if(e[W])if(e[W]._onDragOver({clientX:ut.clientX,clientY:ut.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}while(e=(t=e).parentNode);Xt()}},_onTouchMove:function(t){if(ct){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=$&&v($,!0),a=$&&r&&r.a,l=$&&r&&r.d,e=At&&yt&&E(yt),a=(i.clientX-ct.clientX+o.x)/(a||1)+(e?e[0]-Ct[0]:0)/(a||1),l=(i.clientY-ct.clientY+o.y)/(l||1)+(e?e[1]-Ct[1]:0)/(l||1);if(!Ft.active&&!wt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))D.right+10||S.clientY>x.bottom&&S.clientX>x.left:S.clientY>D.bottom+10||S.clientX>x.right&&S.clientY>x.top)||m.animated)){if(m&&(t=n,e=r,C=X(F((_=this).el,0,_.options,!0)),_=Y(_.el),e?t.clientX<_.left-10||t.clientY * @author owenm * @license MIT */ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); - if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); - if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } - keys.push.apply(keys, symbols); } - return keys; } - function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; - if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); @@ -38,10 +32,8 @@ function _objectSpread2(target) { }); } } - return target; } - function _typeof(obj) { "@babel/helpers - typeof"; @@ -54,10 +46,8 @@ function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } - return _typeof(obj); } - function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { @@ -69,53 +59,40 @@ function _defineProperty(obj, key, value) { } else { obj[key] = value; } - return obj; } - function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; - for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } - return target; }; - return _extends.apply(this, arguments); } - function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; - for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } - return target; } - function _objectWithoutProperties(source, excluded) { if (source == null) return {}; - var target = _objectWithoutPropertiesLoose(source, excluded); - var key, i; - if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; @@ -123,22 +100,17 @@ function _objectWithoutProperties(source, excluded) { target[key] = source[key]; } } - return target; } - function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } - function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } - function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } - function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); @@ -147,27 +119,22 @@ function _unsupportedIterableToArray(o, minLen) { if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - return arr2; } - function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -var version = "1.15.0"; +var version = "1.15.1"; function userAgent(pattern) { if (typeof window !== 'undefined' && window.navigator) { return !! /*@__PURE__*/navigator.userAgent.match(pattern); } } - var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i); var Edge = userAgent(/Edge/i); var FireFox = userAgent(/firefox/i); @@ -179,23 +146,15 @@ var captureMode = { capture: false, passive: false }; - function on(el, event, fn) { el.addEventListener(event, fn, !IE11OrLess && captureMode); } - function off(el, event, fn) { el.removeEventListener(event, fn, !IE11OrLess && captureMode); } - -function matches( -/**HTMLElement*/ -el, -/**String*/ -selector) { +function matches( /**HTMLElement*/el, /**String*/selector) { if (!selector) return; selector[0] === '>' && (selector = selector.substring(1)); - if (el) { try { if (el.matches) { @@ -209,39 +168,25 @@ selector) { return false; } } - return false; } - function getParentOrHost(el) { return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode; } - -function closest( -/**HTMLElement*/ -el, -/**String*/ -selector, -/**HTMLElement*/ -ctx, includeCTX) { +function closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) { if (el) { ctx = ctx || document; - do { if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) { return el; } - if (el === ctx) break; /* jshint boss:true */ } while (el = getParentOrHost(el)); } - return null; } - var R_SPACE = /\s+/g; - function toggleClass(el, name, state) { if (el && name) { if (el.classList) { @@ -252,10 +197,8 @@ function toggleClass(el, name, state) { } } } - function css(el, prop, val) { var style = el && el.style; - if (style) { if (val === void 0) { if (document.defaultView && document.defaultView.getComputedStyle) { @@ -263,68 +206,55 @@ function css(el, prop, val) { } else if (el.currentStyle) { val = el.currentStyle; } - return prop === void 0 ? val : val[prop]; } else { if (!(prop in style) && prop.indexOf('webkit') === -1) { prop = '-webkit-' + prop; } - style[prop] = val + (typeof val === 'string' ? '' : 'px'); } } } - function matrix(el, selfOnly) { var appliedTransforms = ''; - if (typeof el === 'string') { appliedTransforms = el; } else { do { var transform = css(el, 'transform'); - if (transform && transform !== 'none') { appliedTransforms = transform + ' ' + appliedTransforms; } /* jshint boss:true */ - } while (!selfOnly && (el = el.parentNode)); } - var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix; /*jshint -W056 */ - return matrixFn && new matrixFn(appliedTransforms); } - function find(ctx, tagName, iterator) { if (ctx) { var list = ctx.getElementsByTagName(tagName), - i = 0, - n = list.length; - + i = 0, + n = list.length; if (iterator) { for (; i < n; i++) { iterator(list[i], i); } } - return list; } - return []; } - function getWindowScrollingElement() { var scrollingElement = document.scrollingElement; - if (scrollingElement) { return scrollingElement; } else { return document.documentElement; } } + /** * Returns the "bounding client rect" of given element * @param {HTMLElement} el The element whose boundingClientRect is wanted @@ -334,12 +264,9 @@ function getWindowScrollingElement() { * @param {[HTMLElement]} container The parent the element will be placed in * @return {Object} The boundingClientRect of el, with specified adjustments */ - - function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) { if (!el.getBoundingClientRect && el !== window) return; var elRect, top, left, bottom, right, height, width; - if (el !== window && el.parentNode && el !== getWindowScrollingElement()) { elRect = el.getBoundingClientRect(); top = elRect.top; @@ -356,17 +283,18 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS height = window.innerHeight; width = window.innerWidth; } - if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) { // Adjust for translate() - container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312) - // Not needed on <= IE11 + container = container || el.parentNode; + // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312) + // Not needed on <= IE11 if (!IE11OrLess) { do { if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) { - var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container + var containerRect = container.getBoundingClientRect(); + // Set relative to edges of padding box of container top -= containerRect.top + parseInt(css(container, 'border-top-width')); left -= containerRect.left + parseInt(css(container, 'border-left-width')); bottom = top + elRect.height; @@ -374,17 +302,14 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS break; } /* jshint boss:true */ - } while (container = container.parentNode); } } - if (undoScale && el !== window) { // Adjust for scale() var elMatrix = matrix(container || el), - scaleX = elMatrix && elMatrix.a, - scaleY = elMatrix && elMatrix.d; - + scaleX = elMatrix && elMatrix.a, + scaleY = elMatrix && elMatrix.d; if (elMatrix) { top /= scaleY; left /= scaleX; @@ -394,7 +319,6 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS right = left + width; } } - return { top: top, left: left, @@ -404,6 +328,27 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS height: height }; } + +/** + * Returns the content rect of the element (bounding rect minus border and padding) + * @param {HTMLElement} el + */ +function getContentRect(el) { + var rect = getRect(el); + var paddingLeft = parseInt(css(el, 'padding-left')), + paddingTop = parseInt(css(el, 'padding-top')), + paddingRight = parseInt(css(el, 'padding-right')), + paddingBottom = parseInt(css(el, 'padding-bottom')); + rect.top += paddingTop + parseInt(css(el, 'border-top-width')); + rect.left += paddingLeft + parseInt(css(el, 'border-left-width')); + // Client Width/Height includes padding only + rect.width = el.clientWidth - paddingLeft - paddingRight; + rect.height = el.clientHeight - paddingTop - paddingBottom; + rect.bottom = rect.top + rect.height; + rect.right = rect.left + rect.width; + return rect; +} + /** * Checks if a side of an element is scrolled past a side of its parents * @param {HTMLElement} el The element who's side being scrolled out of view is in question @@ -411,30 +356,26 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom') * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element */ - - function isScrolledPast(el, elSide, parentSide) { var parent = getParentAutoScrollElement(el, true), - elSideVal = getRect(el)[elSide]; - /* jshint boss:true */ + elSideVal = getRect(el)[elSide]; + /* jshint boss:true */ while (parent) { var parentSideVal = getRect(parent)[parentSide], - visible = void 0; - + visible = void 0; if (parentSide === 'top' || parentSide === 'left') { visible = elSideVal >= parentSideVal; } else { visible = elSideVal <= parentSideVal; } - if (!visible) return parent; if (parent === getWindowScrollingElement()) break; parent = getParentAutoScrollElement(parent, false); } - return false; } + /** * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible) * and non-draggable elements @@ -443,44 +384,36 @@ function isScrolledPast(el, elSide, parentSide) { * @param {Object} options Parent Sortable's options * @return {HTMLElement} The child at index childNum, or null if not found */ - - function getChild(el, childNum, options, includeDragEl) { var currentChild = 0, - i = 0, - children = el.children; - + i = 0, + children = el.children; while (i < children.length) { if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) { if (currentChild === childNum) { return children[i]; } - currentChild++; } - i++; } - return null; } + /** * Gets the last child in the el, ignoring ghostEl or invisible elements (clones) * @param {HTMLElement} el Parent element * @param {selector} selector Any other elements that should be ignored * @return {HTMLElement} The last child, ignoring ghostEl */ - - function lastChild(el, selector) { var last = el.lastElementChild; - while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) { last = last.previousElementSibling; } - return last || null; } + /** * Returns the index of an element within its parent for a selected set of * elements @@ -488,81 +421,67 @@ function lastChild(el, selector) { * @param {selector} selector * @return {number} */ - - function index(el, selector) { var index = 0; - if (!el || !el.parentNode) { return -1; } - /* jshint boss:true */ - + /* jshint boss:true */ while (el = el.previousElementSibling) { if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) { index++; } } - return index; } + /** * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements. * The value is returned in real pixels. * @param {HTMLElement} el * @return {Array} Offsets in the format of [left, top] */ - - function getRelativeScrollOffset(el) { var offsetLeft = 0, - offsetTop = 0, - winScroller = getWindowScrollingElement(); - + offsetTop = 0, + winScroller = getWindowScrollingElement(); if (el) { do { var elMatrix = matrix(el), - scaleX = elMatrix.a, - scaleY = elMatrix.d; + scaleX = elMatrix.a, + scaleY = elMatrix.d; offsetLeft += el.scrollLeft * scaleX; offsetTop += el.scrollTop * scaleY; } while (el !== winScroller && (el = el.parentNode)); } - return [offsetLeft, offsetTop]; } + /** * Returns the index of the object within the given array * @param {Array} arr Array that may or may not hold the object * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find * @return {Number} The index of the object in the array, or -1 */ - - function indexOfObject(arr, obj) { for (var i in arr) { if (!arr.hasOwnProperty(i)) continue; - for (var key in obj) { if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i); } } - return -1; } - function getParentAutoScrollElement(el, includeSelf) { // skip to window if (!el || !el.getBoundingClientRect) return getWindowScrollingElement(); var elem = el; var gotSelf = false; - do { // we don't need to get elem css if it isn't even overflowing in the first place (performance) if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) { var elemCSS = css(elem); - if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) { if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement(); if (gotSelf || includeSelf) return elem; @@ -570,12 +489,9 @@ function getParentAutoScrollElement(el, includeSelf) { } } /* jshint boss:true */ - } while (elem = elem.parentNode); - return getWindowScrollingElement(); } - function extend(dst, src) { if (dst && src) { for (var key in src) { @@ -584,49 +500,39 @@ function extend(dst, src) { } } } - return dst; } - function isRectEqual(rect1, rect2) { return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width); } - var _throttleTimeout; - function throttle(callback, ms) { return function () { if (!_throttleTimeout) { var args = arguments, - _this = this; - + _this = this; if (args.length === 1) { callback.call(_this, args[0]); } else { callback.apply(_this, args); } - _throttleTimeout = setTimeout(function () { _throttleTimeout = void 0; }, ms); } }; } - function cancelThrottle() { clearTimeout(_throttleTimeout); _throttleTimeout = void 0; } - function scrollBy(el, x, y) { el.scrollLeft += x; el.scrollTop += y; } - function clone(el) { var Polymer = window.Polymer; var $ = window.jQuery || window.Zepto; - if (Polymer && Polymer.dom) { return Polymer.dom(el).cloneNode(true); } else if ($) { @@ -635,7 +541,6 @@ function clone(el) { return el.cloneNode(true); } } - function setRect(el, rect) { css(el, 'position', 'absolute'); css(el, 'top', rect.top); @@ -643,7 +548,6 @@ function setRect(el, rect) { css(el, 'width', rect.width); css(el, 'height', rect.height); } - function unsetRect(el) { css(el, 'position', ''); css(el, 'top', ''); @@ -651,12 +555,11 @@ function unsetRect(el) { css(el, 'width', ''); css(el, 'height', ''); } - var expando = 'Sortable' + new Date().getTime(); function AnimationStateManager() { var animationStates = [], - animationCallbackId; + animationCallbackId; return { captureAnimationState: function captureAnimationState() { animationStates = []; @@ -668,19 +571,16 @@ function AnimationStateManager() { target: child, rect: getRect(child) }); + var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); - var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation - - + // If animating: compensate for current animation if (child.thisAnimationDuration) { var childMatrix = matrix(child, true); - if (childMatrix) { fromRect.top -= childMatrix.f; fromRect.left -= childMatrix.e; } } - child.fromRect = fromRect; }); }, @@ -694,54 +594,47 @@ function AnimationStateManager() { }, animateAll: function animateAll(callback) { var _this = this; - if (!this.options.animation) { clearTimeout(animationCallbackId); if (typeof callback === 'function') callback(); return; } - var animating = false, - animationTime = 0; + animationTime = 0; animationStates.forEach(function (state) { var time = 0, - target = state.target, - fromRect = target.fromRect, - toRect = getRect(target), - prevFromRect = target.prevFromRect, - prevToRect = target.prevToRect, - animatingRect = state.rect, - targetMatrix = matrix(target, true); - + target = state.target, + fromRect = target.fromRect, + toRect = getRect(target), + prevFromRect = target.prevFromRect, + prevToRect = target.prevToRect, + animatingRect = state.rect, + targetMatrix = matrix(target, true); if (targetMatrix) { // Compensate for current animation toRect.top -= targetMatrix.f; toRect.left -= targetMatrix.e; } - target.toRect = toRect; - if (target.thisAnimationDuration) { // Could also check if animatingRect is between fromRect and toRect - if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect + if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && + // Make sure animatingRect is on line between toRect & fromRect (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) { // If returning to same place as started from animation and on same axis time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options); } - } // if fromRect != toRect: animate - + } + // if fromRect != toRect: animate if (!isRectEqual(toRect, fromRect)) { target.prevFromRect = fromRect; target.prevToRect = toRect; - if (!time) { time = _this.options.animation; } - _this.animate(target, animatingRect, toRect, time); } - if (time) { animating = true; animationTime = Math.max(animationTime, time); @@ -757,7 +650,6 @@ function AnimationStateManager() { } }); clearTimeout(animationCallbackId); - if (!animating) { if (typeof callback === 'function') callback(); } else { @@ -765,7 +657,6 @@ function AnimationStateManager() { if (typeof callback === 'function') callback(); }, animationTime); } - animationStates = []; }, animate: function animate(target, currentRect, toRect, duration) { @@ -773,10 +664,10 @@ function AnimationStateManager() { css(target, 'transition', ''); css(target, 'transform', ''); var elMatrix = matrix(this.el), - scaleX = elMatrix && elMatrix.a, - scaleY = elMatrix && elMatrix.d, - translateX = (currentRect.left - toRect.left) / (scaleX || 1), - translateY = (currentRect.top - toRect.top) / (scaleY || 1); + scaleX = elMatrix && elMatrix.a, + scaleY = elMatrix && elMatrix.d, + translateX = (currentRect.left - toRect.left) / (scaleX || 1), + translateY = (currentRect.top - toRect.top) / (scaleY || 1); target.animatingX = !!translateX; target.animatingY = !!translateY; css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)'); @@ -796,11 +687,9 @@ function AnimationStateManager() { } }; } - function repaint(target) { return target.offsetWidth; } - function calculateRealTime(animatingRect, fromRect, toRect, options) { return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation; } @@ -817,7 +706,6 @@ var PluginManager = { plugin[option] = defaults[option]; } } - plugins.forEach(function (p) { if (p.pluginName === plugin.pluginName) { throw "Sortable: Cannot mount plugin ".concat(plugin.pluginName, " more than once"); @@ -827,25 +715,22 @@ var PluginManager = { }, pluginEvent: function pluginEvent(eventName, sortable, evt) { var _this = this; - this.eventCanceled = false; - evt.cancel = function () { _this.eventCanceled = true; }; - var eventNameGlobal = eventName + 'Global'; plugins.forEach(function (plugin) { - if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable - + if (!sortable[plugin.pluginName]) return; + // Fire global events if it exists in this sortable if (sortable[plugin.pluginName][eventNameGlobal]) { sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({ sortable: sortable }, evt)); - } // Only fire plugin event if plugin is enabled in this sortable, - // and plugin has event defined - + } + // Only fire plugin event if plugin is enabled in this sortable, + // and plugin has event defined if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) { sortable[plugin.pluginName][eventName](_objectSpread2({ sortable: sortable @@ -860,15 +745,14 @@ var PluginManager = { var initialized = new plugin(sortable, el, sortable.options); initialized.sortable = sortable; initialized.options = sortable.options; - sortable[pluginName] = initialized; // Add default options from plugin + sortable[pluginName] = initialized; + // Add default options from plugin _extends(defaults, initialized.defaults); }); - for (var option in sortable.options) { if (!sortable.options.hasOwnProperty(option)) continue; var modified = this.modifyOption(sortable, option, sortable.options[option]); - if (typeof modified !== 'undefined') { sortable.options[option] = modified; } @@ -878,7 +762,6 @@ var PluginManager = { var eventProperties = {}; plugins.forEach(function (plugin) { if (typeof plugin.eventProperties !== 'function') return; - _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name)); }); return eventProperties; @@ -887,8 +770,9 @@ var PluginManager = { var modifiedValue; plugins.forEach(function (plugin) { // Plugin must exist on the Sortable - if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin + if (!sortable[plugin.pluginName]) return; + // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') { modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value); } @@ -899,25 +783,25 @@ var PluginManager = { function dispatchEvent(_ref) { var sortable = _ref.sortable, - rootEl = _ref.rootEl, - name = _ref.name, - targetEl = _ref.targetEl, - cloneEl = _ref.cloneEl, - toEl = _ref.toEl, - fromEl = _ref.fromEl, - oldIndex = _ref.oldIndex, - newIndex = _ref.newIndex, - oldDraggableIndex = _ref.oldDraggableIndex, - newDraggableIndex = _ref.newDraggableIndex, - originalEvent = _ref.originalEvent, - putSortable = _ref.putSortable, - extraEventProperties = _ref.extraEventProperties; + rootEl = _ref.rootEl, + name = _ref.name, + targetEl = _ref.targetEl, + cloneEl = _ref.cloneEl, + toEl = _ref.toEl, + fromEl = _ref.fromEl, + oldIndex = _ref.oldIndex, + newIndex = _ref.newIndex, + oldDraggableIndex = _ref.oldDraggableIndex, + newDraggableIndex = _ref.newDraggableIndex, + originalEvent = _ref.originalEvent, + putSortable = _ref.putSortable, + extraEventProperties = _ref.extraEventProperties; sortable = sortable || rootEl && rootEl[expando]; if (!sortable) return; var evt, - options = sortable.options, - onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature - + options = sortable.options, + onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); + // Support for new CustomEvent feature if (window.CustomEvent && !IE11OrLess && !Edge) { evt = new CustomEvent(name, { bubbles: true, @@ -927,7 +811,6 @@ function dispatchEvent(_ref) { evt = document.createEvent('Event'); evt.initEvent(name, true, true); } - evt.to = toEl || rootEl; evt.from = fromEl || rootEl; evt.item = targetEl || rootEl; @@ -938,29 +821,23 @@ function dispatchEvent(_ref) { evt.newDraggableIndex = newDraggableIndex; evt.originalEvent = originalEvent; evt.pullMode = putSortable ? putSortable.lastPutMode : undefined; - var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable)); - for (var option in allEventProperties) { evt[option] = allEventProperties[option]; } - if (rootEl) { rootEl.dispatchEvent(evt); } - if (options[onName]) { options[onName].call(sortable, evt); } } var _excluded = ["evt"]; - var pluginEvent = function pluginEvent(eventName, sortable) { var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - originalEvent = _ref.evt, - data = _objectWithoutProperties(_ref, _excluded); - + originalEvent = _ref.evt, + data = _objectWithoutProperties(_ref, _excluded); PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({ dragEl: dragEl, parentEl: parentEl, @@ -995,7 +872,6 @@ var pluginEvent = function pluginEvent(eventName, sortable) { } }, data)); }; - function _dispatchEvent(info) { dispatchEvent(_objectSpread2({ putSortable: putSortable, @@ -1008,62 +884,61 @@ function _dispatchEvent(info) { newDraggableIndex: newDraggableIndex }, info)); } - var dragEl, - parentEl, - ghostEl, - rootEl, - nextEl, - lastDownEl, - cloneEl, - cloneHidden, - oldIndex, - newIndex, - oldDraggableIndex, - newDraggableIndex, - activeGroup, - putSortable, - awaitingDragStarted = false, - ignoreNextClick = false, - sortables = [], - tapEvt, - touchEvt, - lastDx, - lastDy, - tapDistanceLeft, - tapDistanceTop, - moved, - lastTarget, - lastDirection, - pastFirstInvertThresh = false, - isCircumstantialInvert = false, - targetMoveDistance, - // For positioning ghost absolutely -ghostRelativeParent, - ghostRelativeParentInitialScroll = [], - // (left, top) -_silent = false, - savedInputChecked = []; -/** @const */ + parentEl, + ghostEl, + rootEl, + nextEl, + lastDownEl, + cloneEl, + cloneHidden, + oldIndex, + newIndex, + oldDraggableIndex, + newDraggableIndex, + activeGroup, + putSortable, + awaitingDragStarted = false, + ignoreNextClick = false, + sortables = [], + tapEvt, + touchEvt, + lastDx, + lastDy, + tapDistanceLeft, + tapDistanceTop, + moved, + lastTarget, + lastDirection, + pastFirstInvertThresh = false, + isCircumstantialInvert = false, + targetMoveDistance, + // For positioning ghost absolutely + ghostRelativeParent, + ghostRelativeParentInitialScroll = [], + // (left, top) + + _silent = false, + savedInputChecked = []; +/** @const */ var documentExists = typeof document !== 'undefined', - PositionGhostAbsolutely = IOS, - CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float', - // This will not pass for IE9, because IE9 DnD only works on anchors -supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'), - supportCssPointerEvents = function () { - if (!documentExists) return; // false when <= IE11 - - if (IE11OrLess) { - return false; - } - - var el = document.createElement('x'); - el.style.cssText = 'pointer-events:auto'; - return el.style.pointerEvents === 'auto'; -}(), - _detectDirection = function _detectDirection(el, options) { - var elCSS = css(el), + PositionGhostAbsolutely = IOS, + CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float', + // This will not pass for IE9, because IE9 DnD only works on anchors + supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'), + supportCssPointerEvents = function () { + if (!documentExists) return; + // false when <= IE11 + if (IE11OrLess) { + return false; + } + var el = document.createElement('x'); + el.style.cssText = 'pointer-events:auto'; + return el.style.pointerEvents === 'auto'; + }(), + _detectDirection = function _detectDirection(el, options) { + var elCSS = css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = getChild(el, 0, options), child2 = getChild(el, 1, options), @@ -1071,102 +946,92 @@ supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in secondChildCSS = child2 && css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width; - - if (elCSS.display === 'flex') { - return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal'; - } - - if (elCSS.display === 'grid') { - return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal'; - } - - if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') { - var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right'; - return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal'; - } - - return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal'; -}, - _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) { - var dragElS1Opp = vertical ? dragRect.left : dragRect.top, + if (elCSS.display === 'flex') { + return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal'; + } + if (elCSS.display === 'grid') { + return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal'; + } + if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') { + var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right'; + return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal'; + } + return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal'; + }, + _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) { + var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height; - return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; -}, - -/** - * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold. - * @param {Number} x X position - * @param {Number} y Y position - * @return {HTMLElement} Element of the first found nearest Sortable - */ -_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) { - var ret; - sortables.some(function (sortable) { - var threshold = sortable[expando].options.emptyInsertThreshold; - if (!threshold || lastChild(sortable)) return; - var rect = getRect(sortable), + return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; + }, + /** + * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold. + * @param {Number} x X position + * @param {Number} y Y position + * @return {HTMLElement} Element of the first found nearest Sortable + */ + _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) { + var ret; + sortables.some(function (sortable) { + var threshold = sortable[expando].options.emptyInsertThreshold; + if (!threshold || lastChild(sortable)) return; + var rect = getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold; - - if (insideHorizontally && insideVertically) { - return ret = sortable; - } - }); - return ret; -}, - _prepareGroup = function _prepareGroup(options) { - function toFn(value, pull) { - return function (to, from, dragEl, evt) { - var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; - - if (value == null && (pull || sameGroup)) { - // Default pull value - // Default pull and put value if same group - return true; - } else if (value == null || value === false) { - return false; - } else if (pull && value === 'clone') { - return value; - } else if (typeof value === 'function') { - return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt); - } else { - var otherGroup = (pull ? to : from).options.group.name; - return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; + if (insideHorizontally && insideVertically) { + return ret = sortable; } - }; - } - - var group = {}; - var originalGroup = options.group; - - if (!originalGroup || _typeof(originalGroup) != 'object') { - originalGroup = { - name: originalGroup - }; - } - - group.name = originalGroup.name; - group.checkPull = toFn(originalGroup.pull, true); - group.checkPut = toFn(originalGroup.put); - group.revertClone = originalGroup.revertClone; - options.group = group; -}, - _hideGhostForTarget = function _hideGhostForTarget() { - if (!supportCssPointerEvents && ghostEl) { - css(ghostEl, 'display', 'none'); - } -}, - _unhideGhostForTarget = function _unhideGhostForTarget() { - if (!supportCssPointerEvents && ghostEl) { - css(ghostEl, 'display', ''); - } -}; // #1184 fix - Prevent click event on fallback if dragged but item not changed position - + }); + return ret; + }, + _prepareGroup = function _prepareGroup(options) { + function toFn(value, pull) { + return function (to, from, dragEl, evt) { + var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; + if (value == null && (pull || sameGroup)) { + // Default pull value + // Default pull and put value if same group + return true; + } else if (value == null || value === false) { + return false; + } else if (pull && value === 'clone') { + return value; + } else if (typeof value === 'function') { + return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt); + } else { + var otherGroup = (pull ? to : from).options.group.name; + return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; + } + }; + } + var group = {}; + var originalGroup = options.group; + if (!originalGroup || _typeof(originalGroup) != 'object') { + originalGroup = { + name: originalGroup + }; + } + group.name = originalGroup.name; + group.checkPull = toFn(originalGroup.pull, true); + group.checkPut = toFn(originalGroup.put); + group.revertClone = originalGroup.revertClone; + options.group = group; + }, + _hideGhostForTarget = function _hideGhostForTarget() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, 'display', 'none'); + } + }, + _unhideGhostForTarget = function _unhideGhostForTarget() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, 'display', ''); + } + }; +// #1184 fix - Prevent click event on fallback if dragged but item not changed position if (documentExists && !ChromeForAndroid) { document.addEventListener('click', function (evt) { if (ignoreNextClick) { @@ -1178,53 +1043,44 @@ if (documentExists && !ChromeForAndroid) { } }, true); } - var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) { if (dragEl) { evt = evt.touches ? evt.touches[0] : evt; - var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY); - if (nearest) { // Create imitation event var event = {}; - for (var i in evt) { if (evt.hasOwnProperty(i)) { event[i] = evt[i]; } } - event.target = event.rootEl = nearest; event.preventDefault = void 0; event.stopPropagation = void 0; - nearest[expando]._onDragOver(event); } } }; - var _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) { if (dragEl) { dragEl.parentNode[expando]._isOutsideThisEl(evt.target); } }; + /** * @class Sortable * @param {HTMLElement} el * @param {Object} [options] */ - - function Sortable(el, options) { if (!(el && el.nodeType && el.nodeType === 1)) { throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(el)); } - this.el = el; // root element + this.options = options = _extends({}, options); - this.options = options = _extends({}, options); // Export instance - + // Export instance el[expando] = this; var defaults = { group: null, @@ -1271,52 +1127,48 @@ function Sortable(el, options) { supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari, emptyInsertThreshold: 5 }; - PluginManager.initializePlugins(this, el, defaults); // Set default options + PluginManager.initializePlugins(this, el, defaults); + // Set default options for (var name in defaults) { !(name in options) && (options[name] = defaults[name]); } + _prepareGroup(options); - _prepareGroup(options); // Bind all private methods - - + // Bind all private methods for (var fn in this) { if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { this[fn] = this[fn].bind(this); } - } // Setup drag mode - + } + // Setup drag mode this.nativeDraggable = options.forceFallback ? false : supportDraggable; - if (this.nativeDraggable) { // Touch start threshold cannot be greater than the native dragstart threshold this.options.touchStartThreshold = 1; - } // Bind events - + } + // Bind events if (options.supportPointer) { on(el, 'pointerdown', this._onTapStart); } else { on(el, 'mousedown', this._onTapStart); on(el, 'touchstart', this._onTapStart); } - if (this.nativeDraggable) { on(el, 'dragover', this); on(el, 'dragenter', this); } + sortables.push(this.el); - sortables.push(this.el); // Restore sorting - - options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager + // Restore sorting + options.store && options.store.get && this.sort(options.store.get(this) || []); + // Add animation state manager _extends(this, AnimationStateManager()); } - -Sortable.prototype = -/** @lends Sortable.prototype */ -{ +Sortable.prototype = /** @lends Sortable.prototype */{ constructor: Sortable, _isOutsideThisEl: function _isOutsideThisEl(target) { if (!this.el.contains(target) && target !== this.el) { @@ -1326,57 +1178,50 @@ Sortable.prototype = _getDirection: function _getDirection(evt, target) { return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction; }, - _onTapStart: function _onTapStart( - /** Event|TouchEvent */ - evt) { + _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) { if (!evt.cancelable) return; - var _this = this, - el = this.el, - options = this.options, - preventOnFilter = options.preventOnFilter, - type = evt.type, - touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt, - target = (touch || evt).target, - originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, - filter = options.filter; - - _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group. - - + el = this.el, + options = this.options, + preventOnFilter = options.preventOnFilter, + type = evt.type, + touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt, + target = (touch || evt).target, + originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, + filter = options.filter; + _saveInputCheckedState(el); + + // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group. if (dragEl) { return; } - if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) { return; // only left button and enabled - } // cancel dnd if original target is content editable - + } + // cancel dnd if original target is content editable if (originalTarget.isContentEditable) { return; - } // Safari ignores further event handling after mousedown - + } + // Safari ignores further event handling after mousedown if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') { return; } - target = closest(target, options.draggable, el, false); - if (target && target.animated) { return; } - if (lastDownEl === target) { // Ignoring duplicate `down` return; - } // Get the index of the dragged element within its parent - + } + // Get the index of the dragged element within its parent oldIndex = index(target); - oldDraggableIndex = index(target, options.draggable); // Check filter + oldDraggableIndex = index(target, options.draggable); + // Check filter if (typeof filter === 'function') { if (filter.call(this, evt, target, this)) { _dispatchEvent({ @@ -1387,7 +1232,6 @@ Sortable.prototype = toEl: el, fromEl: el }); - pluginEvent('filter', _this, { evt: evt }); @@ -1397,7 +1241,6 @@ Sortable.prototype = } else if (filter) { filter = filter.split(',').some(function (criteria) { criteria = closest(originalTarget, criteria.trim(), el, false); - if (criteria) { _dispatchEvent({ sortable: _this, @@ -1407,40 +1250,30 @@ Sortable.prototype = fromEl: el, toEl: el }); - pluginEvent('filter', _this, { evt: evt }); return true; } }); - if (filter) { preventOnFilter && evt.cancelable && evt.preventDefault(); return; // cancel dnd } } - if (options.handle && !closest(originalTarget, options.handle, el, false)) { return; - } // Prepare `dragstart` - + } + // Prepare `dragstart` this._prepareDragStart(evt, touch, target); }, - _prepareDragStart: function _prepareDragStart( - /** Event */ - evt, - /** Touch */ - touch, - /** HTMLElement */ - target) { + _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) { var _this = this, - el = _this.el, - options = _this.options, - ownerDocument = el.ownerDocument, - dragStartFn; - + el = _this.el, + options = _this.options, + ownerDocument = el.ownerDocument, + dragStartFn; if (target && !dragEl && target.parentNode === el) { var dragRect = getRect(target); rootEl = el; @@ -1460,41 +1293,36 @@ Sortable.prototype = this._lastX = (touch || evt).clientX; this._lastY = (touch || evt).clientY; dragEl.style['will-change'] = 'all'; - dragStartFn = function dragStartFn() { pluginEvent('delayEnded', _this, { evt: evt }); - if (Sortable.eventCanceled) { _this._onDrop(); - return; - } // Delayed drag has been triggered + } + // Delayed drag has been triggered // we can re-enable the events: touchmove/mousemove - - _this._disableDelayedDragEvents(); - if (!FireFox && _this.nativeDraggable) { dragEl.draggable = true; - } // Bind the events: dragstart/dragend - - - _this._triggerDragStart(evt, touch); // Drag start event + } + // Bind the events: dragstart/dragend + _this._triggerDragStart(evt, touch); + // Drag start event _dispatchEvent({ sortable: _this, name: 'choose', originalEvent: evt - }); // Chosen item - + }); + // Chosen item toggleClass(dragEl, options.chosenClass, true); - }; // Disable "draggable" - + }; + // Disable "draggable" options.ignore.split(',').forEach(function (criteria) { find(dragEl, criteria.trim(), _disableDraggable); }); @@ -1503,27 +1331,26 @@ Sortable.prototype = on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent); on(ownerDocument, 'mouseup', _this._onDrop); on(ownerDocument, 'touchend', _this._onDrop); - on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox) + on(ownerDocument, 'touchcancel', _this._onDrop); + // Make dragEl draggable (must be before delay for FireFox) if (FireFox && this.nativeDraggable) { this.options.touchStartThreshold = 4; dragEl.draggable = true; } - pluginEvent('delayStart', this, { evt: evt - }); // Delay is impossible for native DnD in Edge or IE + }); + // Delay is impossible for native DnD in Edge or IE if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) { if (Sortable.eventCanceled) { this._onDrop(); - return; - } // If the user moves the pointer or let go the click or touch + } + // If the user moves the pointer or let go the click or touch // before the delay has been reached: // disable the delayed drag - - on(ownerDocument, 'mouseup', _this._disableDelayedDrag); on(ownerDocument, 'touchend', _this._disableDelayedDrag); on(ownerDocument, 'touchcancel', _this._disableDelayedDrag); @@ -1536,11 +1363,8 @@ Sortable.prototype = } } }, - _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( - /** TouchEvent|PointerEvent **/ - e) { + _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) { var touch = e.touches ? e.touches[0] : e; - if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) { this._disableDelayedDrag(); } @@ -1548,7 +1372,6 @@ Sortable.prototype = _disableDelayedDrag: function _disableDelayedDrag() { dragEl && _disableDraggable(dragEl); clearTimeout(this._dragStartTimer); - this._disableDelayedDragEvents(); }, _disableDelayedDragEvents: function _disableDelayedDragEvents() { @@ -1560,13 +1383,8 @@ Sortable.prototype = off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler); off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler); }, - _triggerDragStart: function _triggerDragStart( - /** Event */ - evt, - /** Touch */ - touch) { + _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) { touch = touch || evt.pointerType == 'touch' && evt; - if (!this.nativeDraggable || touch) { if (this.options.supportPointer) { on(document, 'pointermove', this._onTouchMove); @@ -1579,7 +1397,6 @@ Sortable.prototype = on(dragEl, 'dragend', this); on(rootEl, 'dragstart', this._onDragStart); } - try { if (document.selection) { // Timeout neccessary for IE9 @@ -1592,25 +1409,23 @@ Sortable.prototype = } catch (err) {} }, _dragStarted: function _dragStarted(fallback, evt) { - awaitingDragStarted = false; - if (rootEl && dragEl) { pluginEvent('dragStarted', this, { evt: evt }); - if (this.nativeDraggable) { on(document, 'dragover', _checkOutsideTargetEl); } + var options = this.options; - var options = this.options; // Apply effect - + // Apply effect !fallback && toggleClass(dragEl, options.dragClass, false); toggleClass(dragEl, options.ghostClass, true); Sortable.active = this; - fallback && this._appendGhost(); // Drag start event + fallback && this._appendGhost(); + // Drag start event _dispatchEvent({ sortable: this, name: 'start', @@ -1624,20 +1439,15 @@ Sortable.prototype = if (touchEvt) { this._lastX = touchEvt.clientX; this._lastY = touchEvt.clientY; - _hideGhostForTarget(); - var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY); var parent = target; - while (target && target.shadowRoot) { target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY); if (target === parent) break; parent = target; } - dragEl.parentNode[expando]._isOutsideThisEl(target); - if (parent) { do { if (parent[expando]) { @@ -1648,44 +1458,37 @@ Sortable.prototype = target: target, rootEl: parent }); - if (inserted && !this.options.dragoverBubble) { break; } } - target = parent; // store last element } - /* jshint boss:true */ - while (parent = parent.parentNode); + /* jshint boss:true */ while (parent = parent.parentNode); } - _unhideGhostForTarget(); } }, - _onTouchMove: function _onTouchMove( - /**TouchEvent*/ - evt) { + _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) { if (tapEvt) { var options = this.options, - fallbackTolerance = options.fallbackTolerance, - fallbackOffset = options.fallbackOffset, - touch = evt.touches ? evt.touches[0] : evt, - ghostMatrix = ghostEl && matrix(ghostEl, true), - scaleX = ghostEl && ghostMatrix && ghostMatrix.a, - scaleY = ghostEl && ghostMatrix && ghostMatrix.d, - relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), - dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), - dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging - + fallbackTolerance = options.fallbackTolerance, + fallbackOffset = options.fallbackOffset, + touch = evt.touches ? evt.touches[0] : evt, + ghostMatrix = ghostEl && matrix(ghostEl, true), + scaleX = ghostEl && ghostMatrix && ghostMatrix.a, + scaleY = ghostEl && ghostMatrix && ghostMatrix.d, + relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), + dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), + dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); + + // only set the status to dragging, when we are actually dragging if (!Sortable.active && !awaitingDragStarted) { if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) { return; } - this._onDragStart(evt, true); } - if (ghostEl) { if (ghostMatrix) { ghostMatrix.e += dx - (lastDx || 0); @@ -1700,7 +1503,6 @@ Sortable.prototype = f: dy }; } - var cssMatrix = "matrix(".concat(ghostMatrix.a, ",").concat(ghostMatrix.b, ",").concat(ghostMatrix.c, ",").concat(ghostMatrix.d, ",").concat(ghostMatrix.e, ",").concat(ghostMatrix.f, ")"); css(ghostEl, 'webkitTransform', cssMatrix); css(ghostEl, 'mozTransform', cssMatrix); @@ -1710,7 +1512,6 @@ Sortable.prototype = lastDy = dy; touchEvt = touch; } - evt.cancelable && evt.preventDefault(); } }, @@ -1719,17 +1520,16 @@ Sortable.prototype = // Not being adjusted for if (!ghostEl) { var container = this.options.fallbackOnBody ? document.body : rootEl, - rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), - options = this.options; // Position absolutely + rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), + options = this.options; + // Position absolutely if (PositionGhostAbsolutely) { // Get relatively positioned parent ghostRelativeParent = container; - while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) { ghostRelativeParent = ghostRelativeParent.parentNode; } - if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) { if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement(); rect.top += ghostRelativeParent.scrollTop; @@ -1737,10 +1537,8 @@ Sortable.prototype = } else { ghostRelativeParent = getWindowScrollingElement(); } - ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent); } - ghostEl = dragEl.cloneNode(true); toggleClass(ghostEl, options.ghostClass, false); toggleClass(ghostEl, options.fallbackClass, true); @@ -1758,62 +1556,50 @@ Sortable.prototype = css(ghostEl, 'zIndex', '100000'); css(ghostEl, 'pointerEvents', 'none'); Sortable.ghost = ghostEl; - container.appendChild(ghostEl); // Set transform-origin + container.appendChild(ghostEl); + // Set transform-origin css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%'); } }, - _onDragStart: function _onDragStart( - /**Event*/ - evt, - /**boolean*/ - fallback) { + _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) { var _this = this; - var dataTransfer = evt.dataTransfer; var options = _this.options; pluginEvent('dragStart', this, { evt: evt }); - if (Sortable.eventCanceled) { this._onDrop(); - return; } - pluginEvent('setupClone', this); - if (!Sortable.eventCanceled) { cloneEl = clone(dragEl); cloneEl.removeAttribute("id"); cloneEl.draggable = false; cloneEl.style['will-change'] = ''; - this._hideClone(); - toggleClass(cloneEl, this.options.chosenClass, false); Sortable.clone = cloneEl; - } // #1143: IFrame support workaround - + } + // #1143: IFrame support workaround _this.cloneId = _nextTick(function () { pluginEvent('clone', _this); if (Sortable.eventCanceled) return; - if (!_this.options.removeCloneOnHide) { rootEl.insertBefore(cloneEl, dragEl); } - _this._hideClone(); - _dispatchEvent({ sortable: _this, name: 'clone' }); }); - !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events + !fallback && toggleClass(dragEl, options.dragClass, true); + // Set proper drop events if (fallback) { ignoreNextClick = true; _this._loopId = setInterval(_this._emulateDragOver, 50); @@ -1822,47 +1608,40 @@ Sortable.prototype = off(document, 'mouseup', _this._onDrop); off(document, 'touchend', _this._onDrop); off(document, 'touchcancel', _this._onDrop); - if (dataTransfer) { dataTransfer.effectAllowed = 'move'; options.setData && options.setData.call(_this, dataTransfer, dragEl); } + on(document, 'drop', _this); - on(document, 'drop', _this); // #1276 fix: - + // #1276 fix: css(dragEl, 'transform', 'translateZ(0)'); } - awaitingDragStarted = true; _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt)); on(document, 'selectstart', _this); moved = true; - if (Safari) { css(document.body, 'user-select', 'none'); } }, // Returns true - if no further action is needed (either inserted or another condition) - _onDragOver: function _onDragOver( - /**Event*/ - evt) { + _onDragOver: function _onDragOver( /**Event*/evt) { var el = this.el, - target = evt.target, - dragRect, - targetRect, - revert, - options = this.options, - group = options.group, - activeSortable = Sortable.active, - isOwner = activeGroup === group, - canSort = options.sort, - fromSortable = putSortable || activeSortable, - vertical, - _this = this, - completedFired = false; - + target = evt.target, + dragRect, + targetRect, + revert, + options = this.options, + group = options.group, + activeSortable = Sortable.active, + isOwner = activeGroup === group, + canSort = options.sort, + fromSortable = putSortable || activeSortable, + vertical, + _this = this, + completedFired = false; if (_silent) return; - function dragOverEvent(name, extra) { pluginEvent(name, _this, _objectSpread2({ evt: evt, @@ -1880,25 +1659,22 @@ Sortable.prototype = }, changed: changed }, extra)); - } // Capture animation state - + } + // Capture animation state function capture() { dragOverEvent('dragOverAnimationCapture'); - _this.captureAnimationState(); - if (_this !== fromSortable) { fromSortable.captureAnimationState(); } - } // Return invocation when dragEl is inserted (or completed) - + } + // Return invocation when dragEl is inserted (or completed) function completed(insertion) { dragOverEvent('dragOverCompleted', { insertion: insertion }); - if (insertion) { // Clones must be hidden before folding animation to capture dragRectAbsolute properly if (isOwner) { @@ -1906,57 +1682,51 @@ Sortable.prototype = } else { activeSortable._showClone(_this); } - if (_this !== fromSortable) { // Set ghost class to new sortable's ghost class toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false); toggleClass(dragEl, options.ghostClass, true); } - if (putSortable !== _this && _this !== Sortable.active) { putSortable = _this; } else if (_this === Sortable.active && putSortable) { putSortable = null; - } // Animation - + } + // Animation if (fromSortable === _this) { _this._ignoreWhileAnimating = target; } - _this.animateAll(function () { dragOverEvent('dragOverAnimationComplete'); _this._ignoreWhileAnimating = null; }); - if (_this !== fromSortable) { fromSortable.animateAll(); fromSortable._ignoreWhileAnimating = null; } - } // Null lastTarget if it is not inside a previously swapped element - + } + // Null lastTarget if it is not inside a previously swapped element if (target === dragEl && !dragEl.animated || target === el && !target.animated) { lastTarget = null; - } // no bubbling and not fallback - + } + // no bubbling and not fallback if (!options.dragoverBubble && !evt.rootEl && target !== document) { - dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted - + dragEl.parentNode[expando]._isOutsideThisEl(evt.target); + // Do not detect for empty insert if already inserted !insertion && nearestEmptyInsertDetectEvent(evt); } - !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation(); return completedFired = true; - } // Call when dragEl has been inserted - + } + // Call when dragEl has been inserted function changed() { newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); - _dispatchEvent({ sortable: _this, name: 'change', @@ -1966,37 +1736,27 @@ Sortable.prototype = originalEvent: evt }); } - if (evt.preventDefault !== void 0) { evt.cancelable && evt.preventDefault(); } - target = closest(target, options.draggable, el, true); dragOverEvent('dragOver'); if (Sortable.eventCanceled) return completedFired; - if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) { return completed(false); } - ignoreNextClick = false; - if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) { vertical = this._getDirection(evt, target) === 'vertical'; dragRect = getRect(dragEl); dragOverEvent('dragOverValid'); if (Sortable.eventCanceled) return completedFired; - if (revert) { parentEl = rootEl; // actualization - capture(); - this._hideClone(); - dragOverEvent('revert'); - if (!Sortable.eventCanceled) { if (nextEl) { rootEl.insertBefore(dragEl, nextEl); @@ -2004,38 +1764,32 @@ Sortable.prototype = rootEl.appendChild(dragEl); } } - return completed(true); } - var elLastChild = lastChild(el, options.draggable); - if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) { // Insert to end of list + // If already at end of list: Do not insert if (elLastChild === dragEl) { return completed(false); - } // if there is a last element, it is the target - + } + // if there is a last element, it is the target if (elLastChild && el === evt.target) { target = elLastChild; } - if (target) { targetRect = getRect(target); } - if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) { capture(); - if (elLastChild && elLastChild.nextSibling) { // the last draggable element is not the last node el.insertBefore(dragEl, elLastChild.nextSibling); } else { el.appendChild(dragEl); } - parentEl = el; // actualization changed(); @@ -2044,14 +1798,11 @@ Sortable.prototype = } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) { // Insert to start of list var firstChild = getChild(el, 0, options, true); - if (firstChild === dragEl) { return completed(false); } - target = firstChild; targetRect = getRect(target); - if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) { capture(); el.insertBefore(dragEl, firstChild); @@ -2063,82 +1814,68 @@ Sortable.prototype = } else if (target.parentNode === el) { targetRect = getRect(target); var direction = 0, - targetBeforeFirstSwap, - differentLevel = dragEl.parentNode !== el, - differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), - side1 = vertical ? 'top' : 'left', - scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'), - scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; - + targetBeforeFirstSwap, + differentLevel = dragEl.parentNode !== el, + differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), + side1 = vertical ? 'top' : 'left', + scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'), + scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; if (lastTarget !== target) { targetBeforeFirstSwap = targetRect[side1]; pastFirstInvertThresh = false; isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel; } - direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target); var sibling; - if (direction !== 0) { // Check if target is beside dragEl in respective direction (ignoring hidden elements) var dragIndex = index(dragEl); - do { dragIndex -= direction; sibling = parentEl.children[dragIndex]; } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl)); - } // If dragEl is already beside target: Do not insert - - + } + // If dragEl is already beside target: Do not insert if (direction === 0 || sibling === target) { return completed(false); } - lastTarget = target; lastDirection = direction; var nextSibling = target.nextElementSibling, - after = false; + after = false; after = direction === 1; - var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after); - if (moveVector !== false) { if (moveVector === 1 || moveVector === -1) { after = moveVector === 1; } - _silent = true; setTimeout(_unsilent, 30); capture(); - if (after && !nextSibling) { el.appendChild(dragEl); } else { target.parentNode.insertBefore(dragEl, after ? nextSibling : target); - } // Undo chrome's scroll adjustment (has no effect on other browsers) - + } + // Undo chrome's scroll adjustment (has no effect on other browsers) if (scrolledPastTop) { scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop); } - parentEl = dragEl.parentNode; // actualization - // must be done before animation + // must be done before animation if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) { targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]); } - changed(); return completed(true); } } - if (el.contains(dragEl)) { return completed(false); } } - return false; }, _ignoreWhileAnimating: null, @@ -2158,83 +1895,69 @@ Sortable.prototype = off(ownerDocument, 'touchcancel', this._onDrop); off(document, 'selectstart', this); }, - _onDrop: function _onDrop( - /**Event*/ - evt) { + _onDrop: function _onDrop( /**Event*/evt) { var el = this.el, - options = this.options; // Get the index of the dragged element within its parent + options = this.options; + // Get the index of the dragged element within its parent newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); pluginEvent('drop', this, { evt: evt }); - parentEl = dragEl && dragEl.parentNode; // Get again after plugin event + parentEl = dragEl && dragEl.parentNode; + // Get again after plugin event newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); - if (Sortable.eventCanceled) { this._nulling(); - return; } - awaitingDragStarted = false; isCircumstantialInvert = false; pastFirstInvertThresh = false; clearInterval(this._loopId); clearTimeout(this._dragStartTimer); - _cancelNextTick(this.cloneId); + _cancelNextTick(this._dragStartId); - _cancelNextTick(this._dragStartId); // Unbind events - - + // Unbind events if (this.nativeDraggable) { off(document, 'drop', this); off(el, 'dragstart', this._onDragStart); } - this._offMoveEvents(); - this._offUpEvents(); - if (Safari) { css(document.body, 'user-select', ''); } - css(dragEl, 'transform', ''); - if (evt) { if (moved) { evt.cancelable && evt.preventDefault(); !options.dropBubble && evt.stopPropagation(); } - ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl); - if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { // Remove clone(s) cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl); } - if (dragEl) { if (this.nativeDraggable) { off(dragEl, 'dragend', this); } - _disableDraggable(dragEl); + dragEl.style['will-change'] = ''; - dragEl.style['will-change'] = ''; // Remove classes + // Remove classes // ghostClass is added in dragStarted - if (moved && !awaitingDragStarted) { toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false); } + toggleClass(dragEl, this.options.chosenClass, false); - toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event - + // Drag stop event _dispatchEvent({ sortable: this, name: 'unchoose', @@ -2243,7 +1966,6 @@ Sortable.prototype = newDraggableIndex: null, originalEvent: evt }); - if (rootEl !== parentEl) { if (newIndex >= 0) { // Add event @@ -2253,17 +1975,17 @@ Sortable.prototype = toEl: parentEl, fromEl: rootEl, originalEvent: evt - }); // Remove event - + }); + // Remove event _dispatchEvent({ sortable: this, name: 'remove', toEl: parentEl, originalEvent: evt - }); // drag from one list and drop into another - + }); + // drag from one list and drop into another _dispatchEvent({ rootEl: parentEl, name: 'sort', @@ -2271,7 +1993,6 @@ Sortable.prototype = fromEl: rootEl, originalEvent: evt }); - _dispatchEvent({ sortable: this, name: 'sort', @@ -2279,7 +2000,6 @@ Sortable.prototype = originalEvent: evt }); } - putSortable && putSortable.save(); } else { if (newIndex !== oldIndex) { @@ -2291,7 +2011,6 @@ Sortable.prototype = toEl: parentEl, originalEvent: evt }); - _dispatchEvent({ sortable: this, name: 'sort', @@ -2301,27 +2020,24 @@ Sortable.prototype = } } } - if (Sortable.active) { /* jshint eqnull:true */ if (newIndex == null || newIndex === -1) { newIndex = oldIndex; newDraggableIndex = oldDraggableIndex; } - _dispatchEvent({ sortable: this, name: 'end', toEl: parentEl, originalEvent: evt - }); // Save sorting - + }); + // Save sorting this.save(); } } } - this._nulling(); }, _nulling: function _nulling() { @@ -2332,65 +2048,52 @@ Sortable.prototype = }); savedInputChecked.length = lastDx = lastDy = 0; }, - handleEvent: function handleEvent( - /**Event*/ - evt) { + handleEvent: function handleEvent( /**Event*/evt) { switch (evt.type) { case 'drop': case 'dragend': this._onDrop(evt); - break; - case 'dragenter': case 'dragover': if (dragEl) { this._onDragOver(evt); - _globalDragOver(evt); } - break; - case 'selectstart': evt.preventDefault(); break; } }, - /** * Serializes the item into an array of string. * @returns {String[]} */ toArray: function toArray() { var order = [], - el, - children = this.el.children, - i = 0, - n = children.length, - options = this.options; - + el, + children = this.el.children, + i = 0, + n = children.length, + options = this.options; for (; i < n; i++) { el = children[i]; - if (closest(el, options.draggable, this.el, false)) { order.push(el.getAttribute(options.dataIdAttr) || _generateId(el)); } } - return order; }, - /** * Sorts the elements according to the array. * @param {String[]} order order of the items */ sort: function sort(order, useAnimation) { var items = {}, - rootEl = this.el; + rootEl = this.el; this.toArray().forEach(function (id, i) { var el = rootEl.children[i]; - if (closest(el, this.options.draggable, rootEl, false)) { items[id] = el; } @@ -2404,7 +2107,6 @@ Sortable.prototype = }); useAnimation && this.animateAll(); }, - /** * Save the current sorting */ @@ -2412,7 +2114,6 @@ Sortable.prototype = var store = this.options.store; store && store.set && store.set(this); }, - /** * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. * @param {HTMLElement} el @@ -2422,7 +2123,6 @@ Sortable.prototype = closest: function closest$1(el, selector) { return closest(el, selector || this.options.draggable, this.el, false); }, - /** * Set/get option * @param {string} name @@ -2431,24 +2131,20 @@ Sortable.prototype = */ option: function option(name, value) { var options = this.options; - if (value === void 0) { return options[name]; } else { var modifiedValue = PluginManager.modifyOption(this, name, value); - if (typeof modifiedValue !== 'undefined') { options[name] = modifiedValue; } else { options[name] = value; } - if (name === 'group') { _prepareGroup(options); } } }, - /** * Destroy */ @@ -2459,21 +2155,16 @@ Sortable.prototype = off(el, 'mousedown', this._onTapStart); off(el, 'touchstart', this._onTapStart); off(el, 'pointerdown', this._onTapStart); - if (this.nativeDraggable) { off(el, 'dragover', this); off(el, 'dragenter', this); - } // Remove draggable attributes - - + } + // Remove draggable attributes Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) { el.removeAttribute('draggable'); }); - this._onDrop(); - this._disableDelayedDragEvents(); - sortables.splice(sortables.indexOf(this.el), 1); this.el = el = null; }, @@ -2482,25 +2173,22 @@ Sortable.prototype = pluginEvent('hideClone', this); if (Sortable.eventCanceled) return; css(cloneEl, 'display', 'none'); - if (this.options.removeCloneOnHide && cloneEl.parentNode) { cloneEl.parentNode.removeChild(cloneEl); } - cloneHidden = true; } }, _showClone: function _showClone(putSortable) { if (putSortable.lastPutMode !== 'clone') { this._hideClone(); - return; } - if (cloneHidden) { pluginEvent('showClone', this); - if (Sortable.eventCanceled) return; // show clone at dragEl or original position + if (Sortable.eventCanceled) return; + // show clone at dragEl or original position if (dragEl.parentNode == rootEl && !this.options.group.revertClone) { rootEl.insertBefore(cloneEl, dragEl); } else if (nextEl) { @@ -2508,33 +2196,26 @@ Sortable.prototype = } else { rootEl.appendChild(cloneEl); } - if (this.options.group.revertClone) { this.animate(dragEl, cloneEl); } - css(cloneEl, 'display', ''); cloneHidden = false; } } }; - -function _globalDragOver( -/**Event*/ -evt) { +function _globalDragOver( /**Event*/evt) { if (evt.dataTransfer) { evt.dataTransfer.dropEffect = 'move'; } - evt.cancelable && evt.preventDefault(); } - function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) { var evt, - sortable = fromEl[expando], - onMoveFn = sortable.options.onMove, - retVal; // Support for new CustomEvent feature - + sortable = fromEl[expando], + onMoveFn = sortable.options.onMove, + retVal; + // Support for new CustomEvent feature if (window.CustomEvent && !IE11OrLess && !Edge) { evt = new CustomEvent('move', { bubbles: true, @@ -2544,7 +2225,6 @@ function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalE evt = document.createEvent('Event'); evt.initEvent('move', true, true); } - evt.to = toEl; evt.from = fromEl; evt.dragged = dragEl; @@ -2554,41 +2234,35 @@ function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalE evt.willInsertAfter = willInsertAfter; evt.originalEvent = originalEvent; fromEl.dispatchEvent(evt); - if (onMoveFn) { retVal = onMoveFn.call(sortable, evt, originalEvent); } - return retVal; } - function _disableDraggable(el) { el.draggable = false; } - function _unsilent() { _silent = false; } - function _ghostIsFirst(evt, vertical, sortable) { - var rect = getRect(getChild(sortable.el, 0, sortable.options, true)); + var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true)); + var sortableContentRect = getContentRect(sortable.el); var spacer = 10; - return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left; + return vertical ? evt.clientX < sortableContentRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < sortableContentRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left; } - function _ghostIsLast(evt, vertical, sortable) { - var rect = getRect(lastChild(sortable.el, sortable.options.draggable)); + var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable)); + var sortableContentRect = getContentRect(sortable.el); var spacer = 10; - return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer; + return vertical ? evt.clientX > sortableContentRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > sortableContentRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top; } - function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) { var mouseOnAxis = vertical ? evt.clientY : evt.clientX, - targetLength = vertical ? targetRect.height : targetRect.width, - targetS1 = vertical ? targetRect.top : targetRect.left, - targetS2 = vertical ? targetRect.bottom : targetRect.right, - invert = false; - + targetLength = vertical ? targetRect.height : targetRect.width, + targetS1 = vertical ? targetRect.top : targetRect.left, + targetS2 = vertical ? targetRect.bottom : targetRect.right, + invert = false; if (!invertSwap) { // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) { @@ -2598,7 +2272,6 @@ function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, inv // past first invert threshold, do not restrict inverted threshold to dragEl shadow pastFirstInvertThresh = true; } - if (!pastFirstInvertThresh) { // dragEl shadow (target move distance shadow) if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow @@ -2615,26 +2288,22 @@ function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, inv } } } - invert = invert || invertSwap; - if (invert) { // Invert of regular if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) { return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1; } } - return 0; } + /** * Gets the direction dragEl must be swapped relative to target in order to make it * seem that dragEl has been "inserted" into that element's position * @param {HTMLElement} target The target whose position dragEl is being inserted at * @return {Number} Direction dragEl must be swapped */ - - function _getInsertDirection(target) { if (index(dragEl) < index(target)) { return 1; @@ -2642,55 +2311,48 @@ function _getInsertDirection(target) { return -1; } } + /** * Generate id * @param {HTMLElement} el * @returns {String} * @private */ - - function _generateId(el) { var str = el.tagName + el.className + el.src + el.href + el.textContent, - i = str.length, - sum = 0; - + i = str.length, + sum = 0; while (i--) { sum += str.charCodeAt(i); } - return sum.toString(36); } - function _saveInputCheckedState(root) { savedInputChecked.length = 0; var inputs = root.getElementsByTagName('input'); var idx = inputs.length; - while (idx--) { var el = inputs[idx]; el.checked && savedInputChecked.push(el); } } - function _nextTick(fn) { return setTimeout(fn, 0); } - function _cancelNextTick(id) { return clearTimeout(id); -} // Fixed #973: - +} +// Fixed #973: if (documentExists) { on(document, 'touchmove', function (evt) { if ((Sortable.active || awaitingDragStarted) && evt.cancelable) { evt.preventDefault(); } }); -} // Export utils - +} +// Export utils Sortable.utils = { on: on, off: off, @@ -2710,59 +2372,54 @@ Sortable.utils = { detectDirection: _detectDirection, getChild: getChild }; + /** * Get the Sortable instance of an element * @param {HTMLElement} element The element * @return {Sortable|undefined} The instance of Sortable */ - Sortable.get = function (element) { return element[expando]; }; + /** * Mount a plugin to Sortable * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted */ - - Sortable.mount = function () { for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) { plugins[_key] = arguments[_key]; } - if (plugins[0].constructor === Array) plugins = plugins[0]; plugins.forEach(function (plugin) { if (!plugin.prototype || !plugin.prototype.constructor) { throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin)); } - if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils); PluginManager.mount(plugin); }); }; + /** * Create sortable instance * @param {HTMLElement} el * @param {Object} [options] */ - - Sortable.create = function (el, options) { return new Sortable(el, options); -}; // Export - +}; +// Export Sortable.version = version; var autoScrolls = [], - scrollEl, - scrollRootEl, - scrolling = false, - lastAutoScrollX, - lastAutoScrollY, - touchEvt$1, - pointerElemChangedInterval; - + scrollEl, + scrollRootEl, + scrolling = false, + lastAutoScrollX, + lastAutoScrollY, + touchEvt$1, + pointerElemChangedInterval; function AutoScrollPlugin() { function AutoScroll() { this.defaults = { @@ -2771,19 +2428,18 @@ function AutoScrollPlugin() { scrollSensitivity: 30, scrollSpeed: 10, bubbleScroll: true - }; // Bind all private methods + }; + // Bind all private methods for (var fn in this) { if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { this[fn] = this[fn].bind(this); } } } - AutoScroll.prototype = { dragStarted: function dragStarted(_ref) { var originalEvent = _ref.originalEvent; - if (this.sortable.nativeDraggable) { on(document, 'dragover', this._handleAutoScroll); } else { @@ -2798,7 +2454,6 @@ function AutoScrollPlugin() { }, dragOverCompleted: function dragOverCompleted(_ref2) { var originalEvent = _ref2.originalEvent; - // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached) if (!this.options.dragOverBubble && !originalEvent.rootEl) { this._handleAutoScroll(originalEvent); @@ -2812,7 +2467,6 @@ function AutoScrollPlugin() { off(document, 'touchmove', this._handleFallbackAutoScroll); off(document, 'mousemove', this._handleFallbackAutoScroll); } - clearPointerElemChangedInterval(); clearAutoScrolls(); cancelThrottle(); @@ -2826,31 +2480,29 @@ function AutoScrollPlugin() { }, _handleAutoScroll: function _handleAutoScroll(evt, fallback) { var _this = this; - var x = (evt.touches ? evt.touches[0] : evt).clientX, - y = (evt.touches ? evt.touches[0] : evt).clientY, - elem = document.elementFromPoint(x, y); - touchEvt$1 = evt; // IE does not seem to have native autoscroll, + y = (evt.touches ? evt.touches[0] : evt).clientY, + elem = document.elementFromPoint(x, y); + touchEvt$1 = evt; + + // IE does not seem to have native autoscroll, // Edge's autoscroll seems too conditional, // MACOS Safari does not have autoscroll, // Firefox and Chrome are good - if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) { - autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change + autoScroll(evt, this.options, elem, fallback); + // Listener for pointer element change var ogElemScroller = getParentAutoScrollElement(elem, true); - if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) { - pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour - + pointerElemChangedInterval && clearPointerElemChangedInterval(); + // Detect for pointer elem change, emulating native DnD behaviour pointerElemChangedInterval = setInterval(function () { var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true); - if (newElem !== ogElemScroller) { ogElemScroller = newElem; clearAutoScrolls(); } - autoScroll(evt, _this.options, newElem, fallback); }, 10); lastAutoScrollX = x; @@ -2862,7 +2514,6 @@ function AutoScrollPlugin() { clearAutoScrolls(); return; } - autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false); } } @@ -2872,60 +2523,54 @@ function AutoScrollPlugin() { initializeByDefault: true }); } - function clearAutoScrolls() { autoScrolls.forEach(function (autoScroll) { clearInterval(autoScroll.pid); }); autoScrolls = []; } - function clearPointerElemChangedInterval() { clearInterval(pointerElemChangedInterval); } - var autoScroll = throttle(function (evt, options, rootEl, isFallback) { // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521 if (!options.scroll) return; var x = (evt.touches ? evt.touches[0] : evt).clientX, - y = (evt.touches ? evt.touches[0] : evt).clientY, - sens = options.scrollSensitivity, - speed = options.scrollSpeed, - winScroller = getWindowScrollingElement(); + y = (evt.touches ? evt.touches[0] : evt).clientY, + sens = options.scrollSensitivity, + speed = options.scrollSpeed, + winScroller = getWindowScrollingElement(); var scrollThisInstance = false, - scrollCustomFn; // New scroll root, set scrollEl + scrollCustomFn; + // New scroll root, set scrollEl if (scrollRootEl !== rootEl) { scrollRootEl = rootEl; clearAutoScrolls(); scrollEl = options.scroll; scrollCustomFn = options.scrollFn; - if (scrollEl === true) { scrollEl = getParentAutoScrollElement(rootEl, true); } } - var layersOut = 0; var currentParent = scrollEl; - do { var el = currentParent, - rect = getRect(el), - top = rect.top, - bottom = rect.bottom, - left = rect.left, - right = rect.right, - width = rect.width, - height = rect.height, - canScrollX = void 0, - canScrollY = void 0, - scrollWidth = el.scrollWidth, - scrollHeight = el.scrollHeight, - elCSS = css(el), - scrollPosX = el.scrollLeft, - scrollPosY = el.scrollTop; - + rect = getRect(el), + top = rect.top, + bottom = rect.bottom, + left = rect.left, + right = rect.right, + width = rect.width, + height = rect.height, + canScrollX = void 0, + canScrollY = void 0, + scrollWidth = el.scrollWidth, + scrollHeight = el.scrollHeight, + elCSS = css(el), + scrollPosX = el.scrollLeft, + scrollPosY = el.scrollTop; if (el === winScroller) { canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible'); canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible'); @@ -2933,10 +2578,8 @@ var autoScroll = throttle(function (evt, options, rootEl, isFallback) { canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll'); canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll'); } - var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX); var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY); - if (!autoScrolls[layersOut]) { for (var i = 0; i <= layersOut; i++) { if (!autoScrolls[i]) { @@ -2944,61 +2587,51 @@ var autoScroll = throttle(function (evt, options, rootEl, isFallback) { } } } - if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) { autoScrolls[layersOut].el = el; autoScrolls[layersOut].vx = vx; autoScrolls[layersOut].vy = vy; clearInterval(autoScrolls[layersOut].pid); - if (vx != 0 || vy != 0) { scrollThisInstance = true; /* jshint loopfunc:true */ - autoScrolls[layersOut].pid = setInterval(function () { // emulate drag over during autoscroll (fallback), emulating native DnD behaviour if (isFallback && this.layer === 0) { Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely - } - var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0; var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0; - if (typeof scrollCustomFn === 'function') { if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') { return; } } - scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY); }.bind({ layer: layersOut }), 24); } } - layersOut++; } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false))); - scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not }, 30); var drop = function drop(_ref) { var originalEvent = _ref.originalEvent, - putSortable = _ref.putSortable, - dragEl = _ref.dragEl, - activeSortable = _ref.activeSortable, - dispatchSortableEvent = _ref.dispatchSortableEvent, - hideGhostForTarget = _ref.hideGhostForTarget, - unhideGhostForTarget = _ref.unhideGhostForTarget; + putSortable = _ref.putSortable, + dragEl = _ref.dragEl, + activeSortable = _ref.activeSortable, + dispatchSortableEvent = _ref.dispatchSortableEvent, + hideGhostForTarget = _ref.hideGhostForTarget, + unhideGhostForTarget = _ref.unhideGhostForTarget; if (!originalEvent) return; var toSortable = putSortable || activeSortable; hideGhostForTarget(); var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent; var target = document.elementFromPoint(touch.clientX, touch.clientY); unhideGhostForTarget(); - if (toSortable && !toSortable.el.contains(target)) { dispatchSortableEvent('spill'); this.onSpill({ @@ -3007,9 +2640,7 @@ var drop = function drop(_ref) { }); } }; - function Revert() {} - Revert.prototype = { startIndex: null, dragStart: function dragStart(_ref2) { @@ -3018,40 +2649,32 @@ Revert.prototype = { }, onSpill: function onSpill(_ref3) { var dragEl = _ref3.dragEl, - putSortable = _ref3.putSortable; + putSortable = _ref3.putSortable; this.sortable.captureAnimationState(); - if (putSortable) { putSortable.captureAnimationState(); } - var nextSibling = getChild(this.sortable.el, this.startIndex, this.options); - if (nextSibling) { this.sortable.el.insertBefore(dragEl, nextSibling); } else { this.sortable.el.appendChild(dragEl); } - this.sortable.animateAll(); - if (putSortable) { putSortable.animateAll(); } }, drop: drop }; - _extends(Revert, { pluginName: 'revertOnSpill' }); - function Remove() {} - Remove.prototype = { onSpill: function onSpill(_ref4) { var dragEl = _ref4.dragEl, - putSortable = _ref4.putSortable; + putSortable = _ref4.putSortable; var parentSortable = putSortable || this.sortable; parentSortable.captureAnimationState(); dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); @@ -3059,20 +2682,17 @@ Remove.prototype = { }, drop: drop }; - _extends(Remove, { pluginName: 'removeOnSpill' }); var lastSwapEl; - function SwapPlugin() { function Swap() { this.defaults = { swapClass: 'sortable-swap-highlight' }; } - Swap.prototype = { dragStart: function dragStart(_ref) { var dragEl = _ref.dragEl; @@ -3080,42 +2700,37 @@ function SwapPlugin() { }, dragOverValid: function dragOverValid(_ref2) { var completed = _ref2.completed, - target = _ref2.target, - onMove = _ref2.onMove, - activeSortable = _ref2.activeSortable, - changed = _ref2.changed, - cancel = _ref2.cancel; + target = _ref2.target, + onMove = _ref2.onMove, + activeSortable = _ref2.activeSortable, + changed = _ref2.changed, + cancel = _ref2.cancel; if (!activeSortable.options.swap) return; var el = this.sortable.el, - options = this.options; - + options = this.options; if (target && target !== el) { var 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: function drop(_ref3) { var activeSortable = _ref3.activeSortable, - putSortable = _ref3.putSortable, - dragEl = _ref3.dragEl; + putSortable = _ref3.putSortable, + dragEl = _ref3.dragEl; var toSortable = putSortable || this.sortable; var options = this.options; lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false); - if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) { if (dragEl !== lastSwapEl) { toSortable.captureAnimationState(); @@ -3139,38 +2754,34 @@ function SwapPlugin() { } }); } - function swapNodes(n1, n2) { var p1 = n1.parentNode, - p2 = n2.parentNode, - i1, - i2; + 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]); } var multiDragElements = [], - multiDragClones = [], - lastMultiDragSelect, - // for selection with modifier key down (SHIFT) -multiDragSortable, - initialFolding = false, - // Initial multi-drag fold when drag started -folding = false, - // Folding any other time -dragStarted = false, - dragEl$1, - clonesFromRect, - clonesHidden; - + multiDragClones = [], + lastMultiDragSelect, + // for selection with modifier key down (SHIFT) + multiDragSortable, + initialFolding = false, + // Initial multi-drag fold when drag started + folding = false, + // Folding any other time + dragStarted = false, + dragEl$1, + clonesFromRect, + clonesHidden; function MultiDragPlugin() { function MultiDrag(sortable) { // Bind all private methods @@ -3179,7 +2790,6 @@ function MultiDragPlugin() { this[fn] = this[fn].bind(this); } } - if (!sortable.options.avoidImplicitDeselect) { if (sortable.options.supportPointer) { on(document, 'pointerup', this._deselectMultiDrag); @@ -3188,7 +2798,6 @@ function MultiDragPlugin() { on(document, 'touchend', this._deselectMultiDrag); } } - on(document, 'keydown', this._checkKeyDown); on(document, 'keyup', this._checkKeyUp); this.defaults = { @@ -3197,7 +2806,6 @@ function MultiDragPlugin() { avoidImplicitDeselect: false, setData: function setData(dataTransfer, dragEl) { var data = ''; - if (multiDragElements.length && multiDragSortable === sortable) { multiDragElements.forEach(function (multiDragElement, i) { data += (!i ? '' : ', ') + multiDragElement.textContent; @@ -3205,12 +2813,10 @@ function MultiDragPlugin() { } else { data = dragEl.textContent; } - dataTransfer.setData('Text', data); } }; } - MultiDrag.prototype = { multiDragKeyDown: false, isMultiDrag: false, @@ -3223,9 +2829,8 @@ function MultiDragPlugin() { }, setupClone: function setupClone(_ref2) { var sortable = _ref2.sortable, - cancel = _ref2.cancel; + cancel = _ref2.cancel; if (!this.isMultiDrag) return; - for (var i = 0; i < multiDragElements.length; i++) { multiDragClones.push(clone(multiDragElements[i])); multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex; @@ -3234,18 +2839,15 @@ function MultiDragPlugin() { toggleClass(multiDragClones[i], this.options.selectedClass, false); multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false); } - sortable._hideClone(); - cancel(); }, clone: function clone(_ref3) { var sortable = _ref3.sortable, - rootEl = _ref3.rootEl, - dispatchSortableEvent = _ref3.dispatchSortableEvent, - cancel = _ref3.cancel; + rootEl = _ref3.rootEl, + dispatchSortableEvent = _ref3.dispatchSortableEvent, + cancel = _ref3.cancel; if (!this.isMultiDrag) return; - if (!this.options.removeCloneOnHide) { if (multiDragElements.length && multiDragSortable === sortable) { insertMultiDragClones(true, rootEl); @@ -3256,8 +2858,8 @@ function MultiDragPlugin() { }, showClone: function showClone(_ref4) { var cloneNowShown = _ref4.cloneNowShown, - rootEl = _ref4.rootEl, - cancel = _ref4.cancel; + rootEl = _ref4.rootEl, + cancel = _ref4.cancel; if (!this.isMultiDrag) return; insertMultiDragClones(false, rootEl); multiDragClones.forEach(function (clone) { @@ -3269,14 +2871,12 @@ function MultiDragPlugin() { }, hideClone: function hideClone(_ref5) { var _this = this; - var sortable = _ref5.sortable, - cloneNowHidden = _ref5.cloneNowHidden, - cancel = _ref5.cancel; + cloneNowHidden = _ref5.cloneNowHidden, + cancel = _ref5.cancel; if (!this.isMultiDrag) return; multiDragClones.forEach(function (clone) { css(clone, 'display', 'none'); - if (_this.options.removeCloneOnHide && clone.parentNode) { clone.parentNode.removeChild(clone); } @@ -3287,15 +2887,14 @@ function MultiDragPlugin() { }, dragStartGlobal: function dragStartGlobal(_ref6) { var sortable = _ref6.sortable; - if (!this.isMultiDrag && multiDragSortable) { multiDragSortable.multiDrag._deselectMultiDrag(); } - multiDragElements.forEach(function (multiDragElement) { multiDragElement.sortableIndex = index(multiDragElement); - }); // Sort multi-drag elements + }); + // Sort multi-drag elements multiDragElements = multiDragElements.sort(function (a, b) { return a.sortableIndex - b.sortableIndex; }); @@ -3303,10 +2902,8 @@ function MultiDragPlugin() { }, dragStarted: function dragStarted(_ref7) { var _this2 = this; - var sortable = _ref7.sortable; if (!this.isMultiDrag) return; - if (this.options.sort) { // Capture rects, // hide multi drag elements (by positioning them absolute), @@ -3314,8 +2911,8 @@ function MultiDragPlugin() { // show multi drag elements, // animate to rects, // unset rects & remove from DOM - sortable.captureAnimationState(); + sortable.captureAnimationState(); if (this.options.animation) { multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; @@ -3330,18 +2927,16 @@ function MultiDragPlugin() { initialFolding = true; } } - sortable.animateAll(function () { folding = false; initialFolding = false; - if (_this2.options.animation) { multiDragElements.forEach(function (multiDragElement) { unsetRect(multiDragElement); }); - } // Remove all auxiliary multidrag items from el, if sorting enabled - + } + // Remove all auxiliary multidrag items from el, if sorting enabled if (_this2.options.sort) { removeMultiDragElements(); } @@ -3349,9 +2944,8 @@ function MultiDragPlugin() { }, dragOver: function dragOver(_ref8) { var target = _ref8.target, - completed = _ref8.completed, - cancel = _ref8.cancel; - + completed = _ref8.completed, + cancel = _ref8.cancel; if (folding && ~multiDragElements.indexOf(target)) { completed(false); cancel(); @@ -3359,10 +2953,9 @@ function MultiDragPlugin() { }, revert: function revert(_ref9) { var fromSortable = _ref9.fromSortable, - rootEl = _ref9.rootEl, - sortable = _ref9.sortable, - dragRect = _ref9.dragRect; - + rootEl = _ref9.rootEl, + sortable = _ref9.sortable, + dragRect = _ref9.dragRect; if (multiDragElements.length > 1) { // Setup unfold animation multiDragElements.forEach(function (multiDragElement) { @@ -3380,47 +2973,44 @@ function MultiDragPlugin() { }, dragOverCompleted: function dragOverCompleted(_ref10) { var sortable = _ref10.sortable, - isOwner = _ref10.isOwner, - insertion = _ref10.insertion, - activeSortable = _ref10.activeSortable, - parentEl = _ref10.parentEl, - putSortable = _ref10.putSortable; + isOwner = _ref10.isOwner, + insertion = _ref10.insertion, + activeSortable = _ref10.activeSortable, + parentEl = _ref10.parentEl, + putSortable = _ref10.putSortable; var options = this.options; - if (insertion) { // Clones must be hidden before folding animation to capture dragRectAbsolute properly if (isOwner) { activeSortable._hideClone(); } - - initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location - + initialFolding = false; + // If leaving sort:false root, or already folding - Fold to new location if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) { // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible var dragRectAbsolute = getRect(dragEl$1, false, true, true); multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; - setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted - // while folding, and so that we can capture them again because old sortable will no longer be fromSortable + setRect(multiDragElement, dragRectAbsolute); + // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted + // while folding, and so that we can capture them again because old sortable will no longer be fromSortable parentEl.appendChild(multiDragElement); }); folding = true; - } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out - + } + // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out if (!isOwner) { // Only remove if not folding (folding will remove them anyways) if (!folding) { removeMultiDragElements(); } - if (multiDragElements.length > 1) { var clonesHiddenBefore = clonesHidden; + activeSortable._showClone(sortable); - activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden - - + // Unfold animation for clones if showing from hidden if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) { multiDragClones.forEach(function (clone) { activeSortable.addAnimationState({ @@ -3439,12 +3029,11 @@ function MultiDragPlugin() { }, dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) { var dragRect = _ref11.dragRect, - isOwner = _ref11.isOwner, - activeSortable = _ref11.activeSortable; + isOwner = _ref11.isOwner, + activeSortable = _ref11.activeSortable; multiDragElements.forEach(function (multiDragElement) { multiDragElement.thisAnimationDuration = null; }); - if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) { clonesFromRect = _extends({}, dragRect); var dragMatrix = matrix(dragEl$1, true); @@ -3460,24 +3049,23 @@ function MultiDragPlugin() { }, drop: function drop(_ref12) { var evt = _ref12.originalEvent, - rootEl = _ref12.rootEl, - parentEl = _ref12.parentEl, - sortable = _ref12.sortable, - dispatchSortableEvent = _ref12.dispatchSortableEvent, - oldIndex = _ref12.oldIndex, - putSortable = _ref12.putSortable; + rootEl = _ref12.rootEl, + parentEl = _ref12.parentEl, + sortable = _ref12.sortable, + dispatchSortableEvent = _ref12.dispatchSortableEvent, + oldIndex = _ref12.oldIndex, + putSortable = _ref12.putSortable; var toSortable = putSortable || this.sortable; if (!evt) return; var options = this.options, - children = parentEl.children; // Multi-drag selection + children = parentEl.children; + // Multi-drag selection if (!dragStarted) { if (options.multiDragKey && !this.multiDragKeyDown) { this._deselectMultiDrag(); } - toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1)); - if (!~multiDragElements.indexOf(dragEl$1)) { multiDragElements.push(dragEl$1); dispatchEvent({ @@ -3486,17 +3074,16 @@ function MultiDragPlugin() { name: 'select', targetEl: dragEl$1, originalEvent: evt - }); // Modifier activated, select from last to dragEl + }); + // Modifier activated, select from last to dragEl if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) { var lastIndex = index(lastMultiDragSelect), - currentIndex = index(dragEl$1); - + currentIndex = index(dragEl$1); if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) { // Must include lastMultiDragSelect (select it), in case modified selection from no selection // (but previous selection existed) var n, i; - if (currentIndex > lastIndex) { i = lastIndex; n = currentIndex; @@ -3504,7 +3091,6 @@ function MultiDragPlugin() { i = currentIndex; n = lastIndex + 1; } - for (; i < n; i++) { if (~multiDragElements.indexOf(children[i])) continue; toggleClass(children[i], options.selectedClass, true); @@ -3521,7 +3107,6 @@ function MultiDragPlugin() { } else { lastMultiDragSelect = dragEl$1; } - multiDragSortable = toSortable; } else { multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1); @@ -3534,38 +3119,37 @@ function MultiDragPlugin() { originalEvent: evt }); } - } // Multi-drag drop - + } + // Multi-drag drop if (dragStarted && this.isMultiDrag) { - folding = false; // Do not "unfold" after around dragEl if reverted - + folding = false; + // Do not "unfold" after around dragEl if reverted if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) { var dragRect = getRect(dragEl$1), - multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')'); + multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')'); if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null; toSortable.captureAnimationState(); - if (!initialFolding) { if (options.animation) { dragEl$1.fromRect = dragRect; multiDragElements.forEach(function (multiDragElement) { multiDragElement.thisAnimationDuration = null; - if (multiDragElement !== dragEl$1) { var rect = folding ? getRect(multiDragElement) : dragRect; - multiDragElement.fromRect = rect; // Prepare unfold animation + multiDragElement.fromRect = rect; + // Prepare unfold animation toSortable.addAnimationState({ target: multiDragElement, rect: rect }); } }); - } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert - // properly they must all be removed - + } + // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert + // properly they must all be removed removeMultiDragElements(); multiDragElements.forEach(function (multiDragElement) { if (children[multiDragIndex]) { @@ -3573,12 +3157,12 @@ function MultiDragPlugin() { } else { parentEl.appendChild(multiDragElement); } - multiDragIndex++; - }); // If initial folding is done, the elements may have changed position because they are now + }); + + // If initial folding is done, the elements may have changed position because they are now // unfolding around dragEl, even though dragEl may not have his index changed, so update event // must be fired here as Sortable will not. - if (oldIndex === index(dragEl$1)) { var update = false; multiDragElements.forEach(function (multiDragElement) { @@ -3587,24 +3171,23 @@ function MultiDragPlugin() { return; } }); - if (update) { dispatchSortableEvent('update'); + dispatchSortableEvent('sort'); } } - } // Must be done after capturing individual rects (scroll bar) - + } + // Must be done after capturing individual rects (scroll bar) multiDragElements.forEach(function (multiDragElement) { unsetRect(multiDragElement); }); toSortable.animateAll(); } - multiDragSortable = toSortable; - } // Remove clones if necessary - + } + // Remove clones if necessary if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { multiDragClones.forEach(function (clone) { clone.parentNode && clone.parentNode.removeChild(clone); @@ -3617,7 +3200,6 @@ function MultiDragPlugin() { }, destroyGlobal: function destroyGlobal() { this._deselectMultiDrag(); - off(document, 'pointerup', this._deselectMultiDrag); off(document, 'mouseup', this._deselectMultiDrag); off(document, 'touchend', this._deselectMultiDrag); @@ -3625,14 +3207,16 @@ function MultiDragPlugin() { off(document, 'keyup', this._checkKeyUp); }, _deselectMultiDrag: function _deselectMultiDrag(evt) { - if (typeof dragStarted !== "undefined" && dragStarted) return; // Only deselect if selection is in this sortable + if (typeof dragStarted !== "undefined" && dragStarted) return; - if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable + // Only deselect if selection is in this sortable + if (multiDragSortable !== this.sortable) return; - if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click + // Only deselect if target is not item in this sortable + if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; + // Only deselect if left click if (evt && evt.button !== 0) return; - while (multiDragElements.length) { var el = multiDragElements[0]; toggleClass(el, this.options.selectedClass, false); @@ -3668,24 +3252,20 @@ function MultiDragPlugin() { select: function select(el) { var sortable = el.parentNode[expando]; if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return; - if (multiDragSortable && multiDragSortable !== sortable) { multiDragSortable.multiDrag._deselectMultiDrag(); - multiDragSortable = sortable; } - toggleClass(el, sortable.options.selectedClass, true); multiDragElements.push(el); }, - /** * Deselects the provided multi-drag item * @param {HTMLElement} el The element to be deselected */ deselect: function deselect(el) { var sortable = el.parentNode[expando], - index = multiDragElements.indexOf(el); + index = multiDragElements.indexOf(el); if (!sortable || !sortable.options.multiDrag || !~index) return; toggleClass(el, sortable.options.selectedClass, false); multiDragElements.splice(index, 1); @@ -3693,17 +3273,16 @@ function MultiDragPlugin() { }, eventProperties: function eventProperties() { var _this3 = this; - var oldIndicies = [], - newIndicies = []; + newIndicies = []; multiDragElements.forEach(function (multiDragElement) { oldIndicies.push({ multiDragElement: multiDragElement, index: multiDragElement.sortableIndex - }); // multiDragElements will already be sorted if folding + }); + // multiDragElements will already be sorted if folding var newIndex; - if (folding && multiDragElement !== dragEl$1) { newIndex = -1; } else if (folding) { @@ -3711,7 +3290,6 @@ function MultiDragPlugin() { } else { newIndex = index(multiDragElement); } - newIndicies.push({ multiDragElement: multiDragElement, index: newIndex @@ -3727,23 +3305,19 @@ function MultiDragPlugin() { optionListeners: { multiDragKey: function multiDragKey(key) { key = key.toLowerCase(); - if (key === 'ctrl') { key = 'Control'; } else if (key.length > 1) { key = key.charAt(0).toUpperCase() + key.substr(1); } - return key; } } }); } - function insertMultiDragElements(clonesInserted, rootEl) { multiDragElements.forEach(function (multiDragElement, i) { var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)]; - if (target) { rootEl.insertBefore(multiDragElement, target); } else { @@ -3751,17 +3325,15 @@ function insertMultiDragElements(clonesInserted, rootEl) { } }); } + /** * Insert multi-drag clones * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted * @param {HTMLElement} rootEl */ - - function insertMultiDragClones(elementsInserted, rootEl) { multiDragClones.forEach(function (clone, i) { var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)]; - if (target) { rootEl.insertBefore(clone, target); } else { @@ -3769,7 +3341,6 @@ function insertMultiDragClones(elementsInserted, rootEl) { } }); } - function removeMultiDragElements() { multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; diff --git a/modular/sortable.core.esm.js b/modular/sortable.core.esm.js index b04c8b463..049d77c7f 100644 --- a/modular/sortable.core.esm.js +++ b/modular/sortable.core.esm.js @@ -1,31 +1,25 @@ /**! - * Sortable 1.15.0 + * Sortable 1.15.1 * @author RubaXa * @author owenm * @license MIT */ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); - if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); - if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } - keys.push.apply(keys, symbols); } - return keys; } - function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; - if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); @@ -38,10 +32,8 @@ function _objectSpread2(target) { }); } } - return target; } - function _typeof(obj) { "@babel/helpers - typeof"; @@ -54,10 +46,8 @@ function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } - return _typeof(obj); } - function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { @@ -69,53 +59,40 @@ function _defineProperty(obj, key, value) { } else { obj[key] = value; } - return obj; } - function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; - for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } - return target; }; - return _extends.apply(this, arguments); } - function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; - for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } - return target; } - function _objectWithoutProperties(source, excluded) { if (source == null) return {}; - var target = _objectWithoutPropertiesLoose(source, excluded); - var key, i; - if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; @@ -123,22 +100,17 @@ function _objectWithoutProperties(source, excluded) { target[key] = source[key]; } } - return target; } - function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } - function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } - function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } - function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); @@ -147,27 +119,22 @@ function _unsupportedIterableToArray(o, minLen) { if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - return arr2; } - function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -var version = "1.15.0"; +var version = "1.15.1"; function userAgent(pattern) { if (typeof window !== 'undefined' && window.navigator) { return !! /*@__PURE__*/navigator.userAgent.match(pattern); } } - var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i); var Edge = userAgent(/Edge/i); var FireFox = userAgent(/firefox/i); @@ -179,23 +146,15 @@ var captureMode = { capture: false, passive: false }; - function on(el, event, fn) { el.addEventListener(event, fn, !IE11OrLess && captureMode); } - function off(el, event, fn) { el.removeEventListener(event, fn, !IE11OrLess && captureMode); } - -function matches( -/**HTMLElement*/ -el, -/**String*/ -selector) { +function matches( /**HTMLElement*/el, /**String*/selector) { if (!selector) return; selector[0] === '>' && (selector = selector.substring(1)); - if (el) { try { if (el.matches) { @@ -209,39 +168,25 @@ selector) { return false; } } - return false; } - function getParentOrHost(el) { return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode; } - -function closest( -/**HTMLElement*/ -el, -/**String*/ -selector, -/**HTMLElement*/ -ctx, includeCTX) { +function closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) { if (el) { ctx = ctx || document; - do { if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) { return el; } - if (el === ctx) break; /* jshint boss:true */ } while (el = getParentOrHost(el)); } - return null; } - var R_SPACE = /\s+/g; - function toggleClass(el, name, state) { if (el && name) { if (el.classList) { @@ -252,10 +197,8 @@ function toggleClass(el, name, state) { } } } - function css(el, prop, val) { var style = el && el.style; - if (style) { if (val === void 0) { if (document.defaultView && document.defaultView.getComputedStyle) { @@ -263,68 +206,55 @@ function css(el, prop, val) { } else if (el.currentStyle) { val = el.currentStyle; } - return prop === void 0 ? val : val[prop]; } else { if (!(prop in style) && prop.indexOf('webkit') === -1) { prop = '-webkit-' + prop; } - style[prop] = val + (typeof val === 'string' ? '' : 'px'); } } } - function matrix(el, selfOnly) { var appliedTransforms = ''; - if (typeof el === 'string') { appliedTransforms = el; } else { do { var transform = css(el, 'transform'); - if (transform && transform !== 'none') { appliedTransforms = transform + ' ' + appliedTransforms; } /* jshint boss:true */ - } while (!selfOnly && (el = el.parentNode)); } - var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix; /*jshint -W056 */ - return matrixFn && new matrixFn(appliedTransforms); } - function find(ctx, tagName, iterator) { if (ctx) { var list = ctx.getElementsByTagName(tagName), - i = 0, - n = list.length; - + i = 0, + n = list.length; if (iterator) { for (; i < n; i++) { iterator(list[i], i); } } - return list; } - return []; } - function getWindowScrollingElement() { var scrollingElement = document.scrollingElement; - if (scrollingElement) { return scrollingElement; } else { return document.documentElement; } } + /** * Returns the "bounding client rect" of given element * @param {HTMLElement} el The element whose boundingClientRect is wanted @@ -334,12 +264,9 @@ function getWindowScrollingElement() { * @param {[HTMLElement]} container The parent the element will be placed in * @return {Object} The boundingClientRect of el, with specified adjustments */ - - function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) { if (!el.getBoundingClientRect && el !== window) return; var elRect, top, left, bottom, right, height, width; - if (el !== window && el.parentNode && el !== getWindowScrollingElement()) { elRect = el.getBoundingClientRect(); top = elRect.top; @@ -356,17 +283,18 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS height = window.innerHeight; width = window.innerWidth; } - if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) { // Adjust for translate() - container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312) - // Not needed on <= IE11 + container = container || el.parentNode; + // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312) + // Not needed on <= IE11 if (!IE11OrLess) { do { if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) { - var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container + var containerRect = container.getBoundingClientRect(); + // Set relative to edges of padding box of container top -= containerRect.top + parseInt(css(container, 'border-top-width')); left -= containerRect.left + parseInt(css(container, 'border-left-width')); bottom = top + elRect.height; @@ -374,17 +302,14 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS break; } /* jshint boss:true */ - } while (container = container.parentNode); } } - if (undoScale && el !== window) { // Adjust for scale() var elMatrix = matrix(container || el), - scaleX = elMatrix && elMatrix.a, - scaleY = elMatrix && elMatrix.d; - + scaleX = elMatrix && elMatrix.a, + scaleY = elMatrix && elMatrix.d; if (elMatrix) { top /= scaleY; left /= scaleX; @@ -394,7 +319,6 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS right = left + width; } } - return { top: top, left: left, @@ -404,6 +328,27 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS height: height }; } + +/** + * Returns the content rect of the element (bounding rect minus border and padding) + * @param {HTMLElement} el + */ +function getContentRect(el) { + var rect = getRect(el); + var paddingLeft = parseInt(css(el, 'padding-left')), + paddingTop = parseInt(css(el, 'padding-top')), + paddingRight = parseInt(css(el, 'padding-right')), + paddingBottom = parseInt(css(el, 'padding-bottom')); + rect.top += paddingTop + parseInt(css(el, 'border-top-width')); + rect.left += paddingLeft + parseInt(css(el, 'border-left-width')); + // Client Width/Height includes padding only + rect.width = el.clientWidth - paddingLeft - paddingRight; + rect.height = el.clientHeight - paddingTop - paddingBottom; + rect.bottom = rect.top + rect.height; + rect.right = rect.left + rect.width; + return rect; +} + /** * Checks if a side of an element is scrolled past a side of its parents * @param {HTMLElement} el The element who's side being scrolled out of view is in question @@ -411,30 +356,26 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom') * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element */ - - function isScrolledPast(el, elSide, parentSide) { var parent = getParentAutoScrollElement(el, true), - elSideVal = getRect(el)[elSide]; - /* jshint boss:true */ + elSideVal = getRect(el)[elSide]; + /* jshint boss:true */ while (parent) { var parentSideVal = getRect(parent)[parentSide], - visible = void 0; - + visible = void 0; if (parentSide === 'top' || parentSide === 'left') { visible = elSideVal >= parentSideVal; } else { visible = elSideVal <= parentSideVal; } - if (!visible) return parent; if (parent === getWindowScrollingElement()) break; parent = getParentAutoScrollElement(parent, false); } - return false; } + /** * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible) * and non-draggable elements @@ -443,44 +384,36 @@ function isScrolledPast(el, elSide, parentSide) { * @param {Object} options Parent Sortable's options * @return {HTMLElement} The child at index childNum, or null if not found */ - - function getChild(el, childNum, options, includeDragEl) { var currentChild = 0, - i = 0, - children = el.children; - + i = 0, + children = el.children; while (i < children.length) { if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) { if (currentChild === childNum) { return children[i]; } - currentChild++; } - i++; } - return null; } + /** * Gets the last child in the el, ignoring ghostEl or invisible elements (clones) * @param {HTMLElement} el Parent element * @param {selector} selector Any other elements that should be ignored * @return {HTMLElement} The last child, ignoring ghostEl */ - - function lastChild(el, selector) { var last = el.lastElementChild; - while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) { last = last.previousElementSibling; } - return last || null; } + /** * Returns the index of an element within its parent for a selected set of * elements @@ -488,81 +421,67 @@ function lastChild(el, selector) { * @param {selector} selector * @return {number} */ - - function index(el, selector) { var index = 0; - if (!el || !el.parentNode) { return -1; } - /* jshint boss:true */ - + /* jshint boss:true */ while (el = el.previousElementSibling) { if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) { index++; } } - return index; } + /** * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements. * The value is returned in real pixels. * @param {HTMLElement} el * @return {Array} Offsets in the format of [left, top] */ - - function getRelativeScrollOffset(el) { var offsetLeft = 0, - offsetTop = 0, - winScroller = getWindowScrollingElement(); - + offsetTop = 0, + winScroller = getWindowScrollingElement(); if (el) { do { var elMatrix = matrix(el), - scaleX = elMatrix.a, - scaleY = elMatrix.d; + scaleX = elMatrix.a, + scaleY = elMatrix.d; offsetLeft += el.scrollLeft * scaleX; offsetTop += el.scrollTop * scaleY; } while (el !== winScroller && (el = el.parentNode)); } - return [offsetLeft, offsetTop]; } + /** * Returns the index of the object within the given array * @param {Array} arr Array that may or may not hold the object * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find * @return {Number} The index of the object in the array, or -1 */ - - function indexOfObject(arr, obj) { for (var i in arr) { if (!arr.hasOwnProperty(i)) continue; - for (var key in obj) { if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i); } } - return -1; } - function getParentAutoScrollElement(el, includeSelf) { // skip to window if (!el || !el.getBoundingClientRect) return getWindowScrollingElement(); var elem = el; var gotSelf = false; - do { // we don't need to get elem css if it isn't even overflowing in the first place (performance) if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) { var elemCSS = css(elem); - if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) { if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement(); if (gotSelf || includeSelf) return elem; @@ -570,12 +489,9 @@ function getParentAutoScrollElement(el, includeSelf) { } } /* jshint boss:true */ - } while (elem = elem.parentNode); - return getWindowScrollingElement(); } - function extend(dst, src) { if (dst && src) { for (var key in src) { @@ -584,49 +500,39 @@ function extend(dst, src) { } } } - return dst; } - function isRectEqual(rect1, rect2) { return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width); } - var _throttleTimeout; - function throttle(callback, ms) { return function () { if (!_throttleTimeout) { var args = arguments, - _this = this; - + _this = this; if (args.length === 1) { callback.call(_this, args[0]); } else { callback.apply(_this, args); } - _throttleTimeout = setTimeout(function () { _throttleTimeout = void 0; }, ms); } }; } - function cancelThrottle() { clearTimeout(_throttleTimeout); _throttleTimeout = void 0; } - function scrollBy(el, x, y) { el.scrollLeft += x; el.scrollTop += y; } - function clone(el) { var Polymer = window.Polymer; var $ = window.jQuery || window.Zepto; - if (Polymer && Polymer.dom) { return Polymer.dom(el).cloneNode(true); } else if ($) { @@ -635,7 +541,6 @@ function clone(el) { return el.cloneNode(true); } } - function setRect(el, rect) { css(el, 'position', 'absolute'); css(el, 'top', rect.top); @@ -643,7 +548,6 @@ function setRect(el, rect) { css(el, 'width', rect.width); css(el, 'height', rect.height); } - function unsetRect(el) { css(el, 'position', ''); css(el, 'top', ''); @@ -651,12 +555,11 @@ function unsetRect(el) { css(el, 'width', ''); css(el, 'height', ''); } - var expando = 'Sortable' + new Date().getTime(); function AnimationStateManager() { var animationStates = [], - animationCallbackId; + animationCallbackId; return { captureAnimationState: function captureAnimationState() { animationStates = []; @@ -668,19 +571,16 @@ function AnimationStateManager() { target: child, rect: getRect(child) }); + var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); - var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation - - + // If animating: compensate for current animation if (child.thisAnimationDuration) { var childMatrix = matrix(child, true); - if (childMatrix) { fromRect.top -= childMatrix.f; fromRect.left -= childMatrix.e; } } - child.fromRect = fromRect; }); }, @@ -694,54 +594,47 @@ function AnimationStateManager() { }, animateAll: function animateAll(callback) { var _this = this; - if (!this.options.animation) { clearTimeout(animationCallbackId); if (typeof callback === 'function') callback(); return; } - var animating = false, - animationTime = 0; + animationTime = 0; animationStates.forEach(function (state) { var time = 0, - target = state.target, - fromRect = target.fromRect, - toRect = getRect(target), - prevFromRect = target.prevFromRect, - prevToRect = target.prevToRect, - animatingRect = state.rect, - targetMatrix = matrix(target, true); - + target = state.target, + fromRect = target.fromRect, + toRect = getRect(target), + prevFromRect = target.prevFromRect, + prevToRect = target.prevToRect, + animatingRect = state.rect, + targetMatrix = matrix(target, true); if (targetMatrix) { // Compensate for current animation toRect.top -= targetMatrix.f; toRect.left -= targetMatrix.e; } - target.toRect = toRect; - if (target.thisAnimationDuration) { // Could also check if animatingRect is between fromRect and toRect - if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect + if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && + // Make sure animatingRect is on line between toRect & fromRect (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) { // If returning to same place as started from animation and on same axis time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options); } - } // if fromRect != toRect: animate - + } + // if fromRect != toRect: animate if (!isRectEqual(toRect, fromRect)) { target.prevFromRect = fromRect; target.prevToRect = toRect; - if (!time) { time = _this.options.animation; } - _this.animate(target, animatingRect, toRect, time); } - if (time) { animating = true; animationTime = Math.max(animationTime, time); @@ -757,7 +650,6 @@ function AnimationStateManager() { } }); clearTimeout(animationCallbackId); - if (!animating) { if (typeof callback === 'function') callback(); } else { @@ -765,7 +657,6 @@ function AnimationStateManager() { if (typeof callback === 'function') callback(); }, animationTime); } - animationStates = []; }, animate: function animate(target, currentRect, toRect, duration) { @@ -773,10 +664,10 @@ function AnimationStateManager() { css(target, 'transition', ''); css(target, 'transform', ''); var elMatrix = matrix(this.el), - scaleX = elMatrix && elMatrix.a, - scaleY = elMatrix && elMatrix.d, - translateX = (currentRect.left - toRect.left) / (scaleX || 1), - translateY = (currentRect.top - toRect.top) / (scaleY || 1); + scaleX = elMatrix && elMatrix.a, + scaleY = elMatrix && elMatrix.d, + translateX = (currentRect.left - toRect.left) / (scaleX || 1), + translateY = (currentRect.top - toRect.top) / (scaleY || 1); target.animatingX = !!translateX; target.animatingY = !!translateY; css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)'); @@ -796,11 +687,9 @@ function AnimationStateManager() { } }; } - function repaint(target) { return target.offsetWidth; } - function calculateRealTime(animatingRect, fromRect, toRect, options) { return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation; } @@ -817,7 +706,6 @@ var PluginManager = { plugin[option] = defaults[option]; } } - plugins.forEach(function (p) { if (p.pluginName === plugin.pluginName) { throw "Sortable: Cannot mount plugin ".concat(plugin.pluginName, " more than once"); @@ -827,25 +715,22 @@ var PluginManager = { }, pluginEvent: function pluginEvent(eventName, sortable, evt) { var _this = this; - this.eventCanceled = false; - evt.cancel = function () { _this.eventCanceled = true; }; - var eventNameGlobal = eventName + 'Global'; plugins.forEach(function (plugin) { - if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable - + if (!sortable[plugin.pluginName]) return; + // Fire global events if it exists in this sortable if (sortable[plugin.pluginName][eventNameGlobal]) { sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({ sortable: sortable }, evt)); - } // Only fire plugin event if plugin is enabled in this sortable, - // and plugin has event defined - + } + // Only fire plugin event if plugin is enabled in this sortable, + // and plugin has event defined if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) { sortable[plugin.pluginName][eventName](_objectSpread2({ sortable: sortable @@ -860,15 +745,14 @@ var PluginManager = { var initialized = new plugin(sortable, el, sortable.options); initialized.sortable = sortable; initialized.options = sortable.options; - sortable[pluginName] = initialized; // Add default options from plugin + sortable[pluginName] = initialized; + // Add default options from plugin _extends(defaults, initialized.defaults); }); - for (var option in sortable.options) { if (!sortable.options.hasOwnProperty(option)) continue; var modified = this.modifyOption(sortable, option, sortable.options[option]); - if (typeof modified !== 'undefined') { sortable.options[option] = modified; } @@ -878,7 +762,6 @@ var PluginManager = { var eventProperties = {}; plugins.forEach(function (plugin) { if (typeof plugin.eventProperties !== 'function') return; - _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name)); }); return eventProperties; @@ -887,8 +770,9 @@ var PluginManager = { var modifiedValue; plugins.forEach(function (plugin) { // Plugin must exist on the Sortable - if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin + if (!sortable[plugin.pluginName]) return; + // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') { modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value); } @@ -899,25 +783,25 @@ var PluginManager = { function dispatchEvent(_ref) { var sortable = _ref.sortable, - rootEl = _ref.rootEl, - name = _ref.name, - targetEl = _ref.targetEl, - cloneEl = _ref.cloneEl, - toEl = _ref.toEl, - fromEl = _ref.fromEl, - oldIndex = _ref.oldIndex, - newIndex = _ref.newIndex, - oldDraggableIndex = _ref.oldDraggableIndex, - newDraggableIndex = _ref.newDraggableIndex, - originalEvent = _ref.originalEvent, - putSortable = _ref.putSortable, - extraEventProperties = _ref.extraEventProperties; + rootEl = _ref.rootEl, + name = _ref.name, + targetEl = _ref.targetEl, + cloneEl = _ref.cloneEl, + toEl = _ref.toEl, + fromEl = _ref.fromEl, + oldIndex = _ref.oldIndex, + newIndex = _ref.newIndex, + oldDraggableIndex = _ref.oldDraggableIndex, + newDraggableIndex = _ref.newDraggableIndex, + originalEvent = _ref.originalEvent, + putSortable = _ref.putSortable, + extraEventProperties = _ref.extraEventProperties; sortable = sortable || rootEl && rootEl[expando]; if (!sortable) return; var evt, - options = sortable.options, - onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature - + options = sortable.options, + onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); + // Support for new CustomEvent feature if (window.CustomEvent && !IE11OrLess && !Edge) { evt = new CustomEvent(name, { bubbles: true, @@ -927,7 +811,6 @@ function dispatchEvent(_ref) { evt = document.createEvent('Event'); evt.initEvent(name, true, true); } - evt.to = toEl || rootEl; evt.from = fromEl || rootEl; evt.item = targetEl || rootEl; @@ -938,29 +821,23 @@ function dispatchEvent(_ref) { evt.newDraggableIndex = newDraggableIndex; evt.originalEvent = originalEvent; evt.pullMode = putSortable ? putSortable.lastPutMode : undefined; - var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable)); - for (var option in allEventProperties) { evt[option] = allEventProperties[option]; } - if (rootEl) { rootEl.dispatchEvent(evt); } - if (options[onName]) { options[onName].call(sortable, evt); } } var _excluded = ["evt"]; - var pluginEvent = function pluginEvent(eventName, sortable) { var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - originalEvent = _ref.evt, - data = _objectWithoutProperties(_ref, _excluded); - + originalEvent = _ref.evt, + data = _objectWithoutProperties(_ref, _excluded); PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({ dragEl: dragEl, parentEl: parentEl, @@ -995,7 +872,6 @@ var pluginEvent = function pluginEvent(eventName, sortable) { } }, data)); }; - function _dispatchEvent(info) { dispatchEvent(_objectSpread2({ putSortable: putSortable, @@ -1008,62 +884,61 @@ function _dispatchEvent(info) { newDraggableIndex: newDraggableIndex }, info)); } - var dragEl, - parentEl, - ghostEl, - rootEl, - nextEl, - lastDownEl, - cloneEl, - cloneHidden, - oldIndex, - newIndex, - oldDraggableIndex, - newDraggableIndex, - activeGroup, - putSortable, - awaitingDragStarted = false, - ignoreNextClick = false, - sortables = [], - tapEvt, - touchEvt, - lastDx, - lastDy, - tapDistanceLeft, - tapDistanceTop, - moved, - lastTarget, - lastDirection, - pastFirstInvertThresh = false, - isCircumstantialInvert = false, - targetMoveDistance, - // For positioning ghost absolutely -ghostRelativeParent, - ghostRelativeParentInitialScroll = [], - // (left, top) -_silent = false, - savedInputChecked = []; -/** @const */ + parentEl, + ghostEl, + rootEl, + nextEl, + lastDownEl, + cloneEl, + cloneHidden, + oldIndex, + newIndex, + oldDraggableIndex, + newDraggableIndex, + activeGroup, + putSortable, + awaitingDragStarted = false, + ignoreNextClick = false, + sortables = [], + tapEvt, + touchEvt, + lastDx, + lastDy, + tapDistanceLeft, + tapDistanceTop, + moved, + lastTarget, + lastDirection, + pastFirstInvertThresh = false, + isCircumstantialInvert = false, + targetMoveDistance, + // For positioning ghost absolutely + ghostRelativeParent, + ghostRelativeParentInitialScroll = [], + // (left, top) + + _silent = false, + savedInputChecked = []; +/** @const */ var documentExists = typeof document !== 'undefined', - PositionGhostAbsolutely = IOS, - CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float', - // This will not pass for IE9, because IE9 DnD only works on anchors -supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'), - supportCssPointerEvents = function () { - if (!documentExists) return; // false when <= IE11 - - if (IE11OrLess) { - return false; - } - - var el = document.createElement('x'); - el.style.cssText = 'pointer-events:auto'; - return el.style.pointerEvents === 'auto'; -}(), - _detectDirection = function _detectDirection(el, options) { - var elCSS = css(el), + PositionGhostAbsolutely = IOS, + CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float', + // This will not pass for IE9, because IE9 DnD only works on anchors + supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'), + supportCssPointerEvents = function () { + if (!documentExists) return; + // false when <= IE11 + if (IE11OrLess) { + return false; + } + var el = document.createElement('x'); + el.style.cssText = 'pointer-events:auto'; + return el.style.pointerEvents === 'auto'; + }(), + _detectDirection = function _detectDirection(el, options) { + var elCSS = css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = getChild(el, 0, options), child2 = getChild(el, 1, options), @@ -1071,102 +946,92 @@ supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in secondChildCSS = child2 && css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width; - - if (elCSS.display === 'flex') { - return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal'; - } - - if (elCSS.display === 'grid') { - return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal'; - } - - if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') { - var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right'; - return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal'; - } - - return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal'; -}, - _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) { - var dragElS1Opp = vertical ? dragRect.left : dragRect.top, + if (elCSS.display === 'flex') { + return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal'; + } + if (elCSS.display === 'grid') { + return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal'; + } + if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') { + var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right'; + return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal'; + } + return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal'; + }, + _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) { + var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height; - return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; -}, - -/** - * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold. - * @param {Number} x X position - * @param {Number} y Y position - * @return {HTMLElement} Element of the first found nearest Sortable - */ -_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) { - var ret; - sortables.some(function (sortable) { - var threshold = sortable[expando].options.emptyInsertThreshold; - if (!threshold || lastChild(sortable)) return; - var rect = getRect(sortable), + return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; + }, + /** + * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold. + * @param {Number} x X position + * @param {Number} y Y position + * @return {HTMLElement} Element of the first found nearest Sortable + */ + _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) { + var ret; + sortables.some(function (sortable) { + var threshold = sortable[expando].options.emptyInsertThreshold; + if (!threshold || lastChild(sortable)) return; + var rect = getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold; - - if (insideHorizontally && insideVertically) { - return ret = sortable; - } - }); - return ret; -}, - _prepareGroup = function _prepareGroup(options) { - function toFn(value, pull) { - return function (to, from, dragEl, evt) { - var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; - - if (value == null && (pull || sameGroup)) { - // Default pull value - // Default pull and put value if same group - return true; - } else if (value == null || value === false) { - return false; - } else if (pull && value === 'clone') { - return value; - } else if (typeof value === 'function') { - return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt); - } else { - var otherGroup = (pull ? to : from).options.group.name; - return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; + if (insideHorizontally && insideVertically) { + return ret = sortable; } - }; - } - - var group = {}; - var originalGroup = options.group; - - if (!originalGroup || _typeof(originalGroup) != 'object') { - originalGroup = { - name: originalGroup - }; - } - - group.name = originalGroup.name; - group.checkPull = toFn(originalGroup.pull, true); - group.checkPut = toFn(originalGroup.put); - group.revertClone = originalGroup.revertClone; - options.group = group; -}, - _hideGhostForTarget = function _hideGhostForTarget() { - if (!supportCssPointerEvents && ghostEl) { - css(ghostEl, 'display', 'none'); - } -}, - _unhideGhostForTarget = function _unhideGhostForTarget() { - if (!supportCssPointerEvents && ghostEl) { - css(ghostEl, 'display', ''); - } -}; // #1184 fix - Prevent click event on fallback if dragged but item not changed position - + }); + return ret; + }, + _prepareGroup = function _prepareGroup(options) { + function toFn(value, pull) { + return function (to, from, dragEl, evt) { + var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; + if (value == null && (pull || sameGroup)) { + // Default pull value + // Default pull and put value if same group + return true; + } else if (value == null || value === false) { + return false; + } else if (pull && value === 'clone') { + return value; + } else if (typeof value === 'function') { + return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt); + } else { + var otherGroup = (pull ? to : from).options.group.name; + return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; + } + }; + } + var group = {}; + var originalGroup = options.group; + if (!originalGroup || _typeof(originalGroup) != 'object') { + originalGroup = { + name: originalGroup + }; + } + group.name = originalGroup.name; + group.checkPull = toFn(originalGroup.pull, true); + group.checkPut = toFn(originalGroup.put); + group.revertClone = originalGroup.revertClone; + options.group = group; + }, + _hideGhostForTarget = function _hideGhostForTarget() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, 'display', 'none'); + } + }, + _unhideGhostForTarget = function _unhideGhostForTarget() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, 'display', ''); + } + }; +// #1184 fix - Prevent click event on fallback if dragged but item not changed position if (documentExists && !ChromeForAndroid) { document.addEventListener('click', function (evt) { if (ignoreNextClick) { @@ -1178,53 +1043,44 @@ if (documentExists && !ChromeForAndroid) { } }, true); } - var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) { if (dragEl) { evt = evt.touches ? evt.touches[0] : evt; - var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY); - if (nearest) { // Create imitation event var event = {}; - for (var i in evt) { if (evt.hasOwnProperty(i)) { event[i] = evt[i]; } } - event.target = event.rootEl = nearest; event.preventDefault = void 0; event.stopPropagation = void 0; - nearest[expando]._onDragOver(event); } } }; - var _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) { if (dragEl) { dragEl.parentNode[expando]._isOutsideThisEl(evt.target); } }; + /** * @class Sortable * @param {HTMLElement} el * @param {Object} [options] */ - - function Sortable(el, options) { if (!(el && el.nodeType && el.nodeType === 1)) { throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(el)); } - this.el = el; // root element + this.options = options = _extends({}, options); - this.options = options = _extends({}, options); // Export instance - + // Export instance el[expando] = this; var defaults = { group: null, @@ -1271,52 +1127,48 @@ function Sortable(el, options) { supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari, emptyInsertThreshold: 5 }; - PluginManager.initializePlugins(this, el, defaults); // Set default options + PluginManager.initializePlugins(this, el, defaults); + // Set default options for (var name in defaults) { !(name in options) && (options[name] = defaults[name]); } + _prepareGroup(options); - _prepareGroup(options); // Bind all private methods - - + // Bind all private methods for (var fn in this) { if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { this[fn] = this[fn].bind(this); } - } // Setup drag mode - + } + // Setup drag mode this.nativeDraggable = options.forceFallback ? false : supportDraggable; - if (this.nativeDraggable) { // Touch start threshold cannot be greater than the native dragstart threshold this.options.touchStartThreshold = 1; - } // Bind events - + } + // Bind events if (options.supportPointer) { on(el, 'pointerdown', this._onTapStart); } else { on(el, 'mousedown', this._onTapStart); on(el, 'touchstart', this._onTapStart); } - if (this.nativeDraggable) { on(el, 'dragover', this); on(el, 'dragenter', this); } + sortables.push(this.el); - sortables.push(this.el); // Restore sorting - - options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager + // Restore sorting + options.store && options.store.get && this.sort(options.store.get(this) || []); + // Add animation state manager _extends(this, AnimationStateManager()); } - -Sortable.prototype = -/** @lends Sortable.prototype */ -{ +Sortable.prototype = /** @lends Sortable.prototype */{ constructor: Sortable, _isOutsideThisEl: function _isOutsideThisEl(target) { if (!this.el.contains(target) && target !== this.el) { @@ -1326,57 +1178,50 @@ Sortable.prototype = _getDirection: function _getDirection(evt, target) { return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction; }, - _onTapStart: function _onTapStart( - /** Event|TouchEvent */ - evt) { + _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) { if (!evt.cancelable) return; - var _this = this, - el = this.el, - options = this.options, - preventOnFilter = options.preventOnFilter, - type = evt.type, - touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt, - target = (touch || evt).target, - originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, - filter = options.filter; - - _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group. - - + el = this.el, + options = this.options, + preventOnFilter = options.preventOnFilter, + type = evt.type, + touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt, + target = (touch || evt).target, + originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, + filter = options.filter; + _saveInputCheckedState(el); + + // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group. if (dragEl) { return; } - if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) { return; // only left button and enabled - } // cancel dnd if original target is content editable - + } + // cancel dnd if original target is content editable if (originalTarget.isContentEditable) { return; - } // Safari ignores further event handling after mousedown - + } + // Safari ignores further event handling after mousedown if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') { return; } - target = closest(target, options.draggable, el, false); - if (target && target.animated) { return; } - if (lastDownEl === target) { // Ignoring duplicate `down` return; - } // Get the index of the dragged element within its parent - + } + // Get the index of the dragged element within its parent oldIndex = index(target); - oldDraggableIndex = index(target, options.draggable); // Check filter + oldDraggableIndex = index(target, options.draggable); + // Check filter if (typeof filter === 'function') { if (filter.call(this, evt, target, this)) { _dispatchEvent({ @@ -1387,7 +1232,6 @@ Sortable.prototype = toEl: el, fromEl: el }); - pluginEvent('filter', _this, { evt: evt }); @@ -1397,7 +1241,6 @@ Sortable.prototype = } else if (filter) { filter = filter.split(',').some(function (criteria) { criteria = closest(originalTarget, criteria.trim(), el, false); - if (criteria) { _dispatchEvent({ sortable: _this, @@ -1407,40 +1250,30 @@ Sortable.prototype = fromEl: el, toEl: el }); - pluginEvent('filter', _this, { evt: evt }); return true; } }); - if (filter) { preventOnFilter && evt.cancelable && evt.preventDefault(); return; // cancel dnd } } - if (options.handle && !closest(originalTarget, options.handle, el, false)) { return; - } // Prepare `dragstart` - + } + // Prepare `dragstart` this._prepareDragStart(evt, touch, target); }, - _prepareDragStart: function _prepareDragStart( - /** Event */ - evt, - /** Touch */ - touch, - /** HTMLElement */ - target) { + _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) { var _this = this, - el = _this.el, - options = _this.options, - ownerDocument = el.ownerDocument, - dragStartFn; - + el = _this.el, + options = _this.options, + ownerDocument = el.ownerDocument, + dragStartFn; if (target && !dragEl && target.parentNode === el) { var dragRect = getRect(target); rootEl = el; @@ -1460,41 +1293,36 @@ Sortable.prototype = this._lastX = (touch || evt).clientX; this._lastY = (touch || evt).clientY; dragEl.style['will-change'] = 'all'; - dragStartFn = function dragStartFn() { pluginEvent('delayEnded', _this, { evt: evt }); - if (Sortable.eventCanceled) { _this._onDrop(); - return; - } // Delayed drag has been triggered + } + // Delayed drag has been triggered // we can re-enable the events: touchmove/mousemove - - _this._disableDelayedDragEvents(); - if (!FireFox && _this.nativeDraggable) { dragEl.draggable = true; - } // Bind the events: dragstart/dragend - - - _this._triggerDragStart(evt, touch); // Drag start event + } + // Bind the events: dragstart/dragend + _this._triggerDragStart(evt, touch); + // Drag start event _dispatchEvent({ sortable: _this, name: 'choose', originalEvent: evt - }); // Chosen item - + }); + // Chosen item toggleClass(dragEl, options.chosenClass, true); - }; // Disable "draggable" - + }; + // Disable "draggable" options.ignore.split(',').forEach(function (criteria) { find(dragEl, criteria.trim(), _disableDraggable); }); @@ -1503,27 +1331,26 @@ Sortable.prototype = on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent); on(ownerDocument, 'mouseup', _this._onDrop); on(ownerDocument, 'touchend', _this._onDrop); - on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox) + on(ownerDocument, 'touchcancel', _this._onDrop); + // Make dragEl draggable (must be before delay for FireFox) if (FireFox && this.nativeDraggable) { this.options.touchStartThreshold = 4; dragEl.draggable = true; } - pluginEvent('delayStart', this, { evt: evt - }); // Delay is impossible for native DnD in Edge or IE + }); + // Delay is impossible for native DnD in Edge or IE if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) { if (Sortable.eventCanceled) { this._onDrop(); - return; - } // If the user moves the pointer or let go the click or touch + } + // If the user moves the pointer or let go the click or touch // before the delay has been reached: // disable the delayed drag - - on(ownerDocument, 'mouseup', _this._disableDelayedDrag); on(ownerDocument, 'touchend', _this._disableDelayedDrag); on(ownerDocument, 'touchcancel', _this._disableDelayedDrag); @@ -1536,11 +1363,8 @@ Sortable.prototype = } } }, - _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( - /** TouchEvent|PointerEvent **/ - e) { + _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) { var touch = e.touches ? e.touches[0] : e; - if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) { this._disableDelayedDrag(); } @@ -1548,7 +1372,6 @@ Sortable.prototype = _disableDelayedDrag: function _disableDelayedDrag() { dragEl && _disableDraggable(dragEl); clearTimeout(this._dragStartTimer); - this._disableDelayedDragEvents(); }, _disableDelayedDragEvents: function _disableDelayedDragEvents() { @@ -1560,13 +1383,8 @@ Sortable.prototype = off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler); off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler); }, - _triggerDragStart: function _triggerDragStart( - /** Event */ - evt, - /** Touch */ - touch) { + _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) { touch = touch || evt.pointerType == 'touch' && evt; - if (!this.nativeDraggable || touch) { if (this.options.supportPointer) { on(document, 'pointermove', this._onTouchMove); @@ -1579,7 +1397,6 @@ Sortable.prototype = on(dragEl, 'dragend', this); on(rootEl, 'dragstart', this._onDragStart); } - try { if (document.selection) { // Timeout neccessary for IE9 @@ -1592,25 +1409,23 @@ Sortable.prototype = } catch (err) {} }, _dragStarted: function _dragStarted(fallback, evt) { - awaitingDragStarted = false; - if (rootEl && dragEl) { pluginEvent('dragStarted', this, { evt: evt }); - if (this.nativeDraggable) { on(document, 'dragover', _checkOutsideTargetEl); } + var options = this.options; - var options = this.options; // Apply effect - + // Apply effect !fallback && toggleClass(dragEl, options.dragClass, false); toggleClass(dragEl, options.ghostClass, true); Sortable.active = this; - fallback && this._appendGhost(); // Drag start event + fallback && this._appendGhost(); + // Drag start event _dispatchEvent({ sortable: this, name: 'start', @@ -1624,20 +1439,15 @@ Sortable.prototype = if (touchEvt) { this._lastX = touchEvt.clientX; this._lastY = touchEvt.clientY; - _hideGhostForTarget(); - var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY); var parent = target; - while (target && target.shadowRoot) { target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY); if (target === parent) break; parent = target; } - dragEl.parentNode[expando]._isOutsideThisEl(target); - if (parent) { do { if (parent[expando]) { @@ -1648,44 +1458,37 @@ Sortable.prototype = target: target, rootEl: parent }); - if (inserted && !this.options.dragoverBubble) { break; } } - target = parent; // store last element } - /* jshint boss:true */ - while (parent = parent.parentNode); + /* jshint boss:true */ while (parent = parent.parentNode); } - _unhideGhostForTarget(); } }, - _onTouchMove: function _onTouchMove( - /**TouchEvent*/ - evt) { + _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) { if (tapEvt) { var options = this.options, - fallbackTolerance = options.fallbackTolerance, - fallbackOffset = options.fallbackOffset, - touch = evt.touches ? evt.touches[0] : evt, - ghostMatrix = ghostEl && matrix(ghostEl, true), - scaleX = ghostEl && ghostMatrix && ghostMatrix.a, - scaleY = ghostEl && ghostMatrix && ghostMatrix.d, - relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), - dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), - dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging - + fallbackTolerance = options.fallbackTolerance, + fallbackOffset = options.fallbackOffset, + touch = evt.touches ? evt.touches[0] : evt, + ghostMatrix = ghostEl && matrix(ghostEl, true), + scaleX = ghostEl && ghostMatrix && ghostMatrix.a, + scaleY = ghostEl && ghostMatrix && ghostMatrix.d, + relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), + dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), + dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); + + // only set the status to dragging, when we are actually dragging if (!Sortable.active && !awaitingDragStarted) { if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) { return; } - this._onDragStart(evt, true); } - if (ghostEl) { if (ghostMatrix) { ghostMatrix.e += dx - (lastDx || 0); @@ -1700,7 +1503,6 @@ Sortable.prototype = f: dy }; } - var cssMatrix = "matrix(".concat(ghostMatrix.a, ",").concat(ghostMatrix.b, ",").concat(ghostMatrix.c, ",").concat(ghostMatrix.d, ",").concat(ghostMatrix.e, ",").concat(ghostMatrix.f, ")"); css(ghostEl, 'webkitTransform', cssMatrix); css(ghostEl, 'mozTransform', cssMatrix); @@ -1710,7 +1512,6 @@ Sortable.prototype = lastDy = dy; touchEvt = touch; } - evt.cancelable && evt.preventDefault(); } }, @@ -1719,17 +1520,16 @@ Sortable.prototype = // Not being adjusted for if (!ghostEl) { var container = this.options.fallbackOnBody ? document.body : rootEl, - rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), - options = this.options; // Position absolutely + rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), + options = this.options; + // Position absolutely if (PositionGhostAbsolutely) { // Get relatively positioned parent ghostRelativeParent = container; - while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) { ghostRelativeParent = ghostRelativeParent.parentNode; } - if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) { if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement(); rect.top += ghostRelativeParent.scrollTop; @@ -1737,10 +1537,8 @@ Sortable.prototype = } else { ghostRelativeParent = getWindowScrollingElement(); } - ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent); } - ghostEl = dragEl.cloneNode(true); toggleClass(ghostEl, options.ghostClass, false); toggleClass(ghostEl, options.fallbackClass, true); @@ -1758,62 +1556,50 @@ Sortable.prototype = css(ghostEl, 'zIndex', '100000'); css(ghostEl, 'pointerEvents', 'none'); Sortable.ghost = ghostEl; - container.appendChild(ghostEl); // Set transform-origin + container.appendChild(ghostEl); + // Set transform-origin css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%'); } }, - _onDragStart: function _onDragStart( - /**Event*/ - evt, - /**boolean*/ - fallback) { + _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) { var _this = this; - var dataTransfer = evt.dataTransfer; var options = _this.options; pluginEvent('dragStart', this, { evt: evt }); - if (Sortable.eventCanceled) { this._onDrop(); - return; } - pluginEvent('setupClone', this); - if (!Sortable.eventCanceled) { cloneEl = clone(dragEl); cloneEl.removeAttribute("id"); cloneEl.draggable = false; cloneEl.style['will-change'] = ''; - this._hideClone(); - toggleClass(cloneEl, this.options.chosenClass, false); Sortable.clone = cloneEl; - } // #1143: IFrame support workaround - + } + // #1143: IFrame support workaround _this.cloneId = _nextTick(function () { pluginEvent('clone', _this); if (Sortable.eventCanceled) return; - if (!_this.options.removeCloneOnHide) { rootEl.insertBefore(cloneEl, dragEl); } - _this._hideClone(); - _dispatchEvent({ sortable: _this, name: 'clone' }); }); - !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events + !fallback && toggleClass(dragEl, options.dragClass, true); + // Set proper drop events if (fallback) { ignoreNextClick = true; _this._loopId = setInterval(_this._emulateDragOver, 50); @@ -1822,47 +1608,40 @@ Sortable.prototype = off(document, 'mouseup', _this._onDrop); off(document, 'touchend', _this._onDrop); off(document, 'touchcancel', _this._onDrop); - if (dataTransfer) { dataTransfer.effectAllowed = 'move'; options.setData && options.setData.call(_this, dataTransfer, dragEl); } + on(document, 'drop', _this); - on(document, 'drop', _this); // #1276 fix: - + // #1276 fix: css(dragEl, 'transform', 'translateZ(0)'); } - awaitingDragStarted = true; _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt)); on(document, 'selectstart', _this); moved = true; - if (Safari) { css(document.body, 'user-select', 'none'); } }, // Returns true - if no further action is needed (either inserted or another condition) - _onDragOver: function _onDragOver( - /**Event*/ - evt) { + _onDragOver: function _onDragOver( /**Event*/evt) { var el = this.el, - target = evt.target, - dragRect, - targetRect, - revert, - options = this.options, - group = options.group, - activeSortable = Sortable.active, - isOwner = activeGroup === group, - canSort = options.sort, - fromSortable = putSortable || activeSortable, - vertical, - _this = this, - completedFired = false; - + target = evt.target, + dragRect, + targetRect, + revert, + options = this.options, + group = options.group, + activeSortable = Sortable.active, + isOwner = activeGroup === group, + canSort = options.sort, + fromSortable = putSortable || activeSortable, + vertical, + _this = this, + completedFired = false; if (_silent) return; - function dragOverEvent(name, extra) { pluginEvent(name, _this, _objectSpread2({ evt: evt, @@ -1880,25 +1659,22 @@ Sortable.prototype = }, changed: changed }, extra)); - } // Capture animation state - + } + // Capture animation state function capture() { dragOverEvent('dragOverAnimationCapture'); - _this.captureAnimationState(); - if (_this !== fromSortable) { fromSortable.captureAnimationState(); } - } // Return invocation when dragEl is inserted (or completed) - + } + // Return invocation when dragEl is inserted (or completed) function completed(insertion) { dragOverEvent('dragOverCompleted', { insertion: insertion }); - if (insertion) { // Clones must be hidden before folding animation to capture dragRectAbsolute properly if (isOwner) { @@ -1906,57 +1682,51 @@ Sortable.prototype = } else { activeSortable._showClone(_this); } - if (_this !== fromSortable) { // Set ghost class to new sortable's ghost class toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false); toggleClass(dragEl, options.ghostClass, true); } - if (putSortable !== _this && _this !== Sortable.active) { putSortable = _this; } else if (_this === Sortable.active && putSortable) { putSortable = null; - } // Animation - + } + // Animation if (fromSortable === _this) { _this._ignoreWhileAnimating = target; } - _this.animateAll(function () { dragOverEvent('dragOverAnimationComplete'); _this._ignoreWhileAnimating = null; }); - if (_this !== fromSortable) { fromSortable.animateAll(); fromSortable._ignoreWhileAnimating = null; } - } // Null lastTarget if it is not inside a previously swapped element - + } + // Null lastTarget if it is not inside a previously swapped element if (target === dragEl && !dragEl.animated || target === el && !target.animated) { lastTarget = null; - } // no bubbling and not fallback - + } + // no bubbling and not fallback if (!options.dragoverBubble && !evt.rootEl && target !== document) { - dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted - + dragEl.parentNode[expando]._isOutsideThisEl(evt.target); + // Do not detect for empty insert if already inserted !insertion && nearestEmptyInsertDetectEvent(evt); } - !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation(); return completedFired = true; - } // Call when dragEl has been inserted - + } + // Call when dragEl has been inserted function changed() { newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); - _dispatchEvent({ sortable: _this, name: 'change', @@ -1966,37 +1736,27 @@ Sortable.prototype = originalEvent: evt }); } - if (evt.preventDefault !== void 0) { evt.cancelable && evt.preventDefault(); } - target = closest(target, options.draggable, el, true); dragOverEvent('dragOver'); if (Sortable.eventCanceled) return completedFired; - if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) { return completed(false); } - ignoreNextClick = false; - if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) { vertical = this._getDirection(evt, target) === 'vertical'; dragRect = getRect(dragEl); dragOverEvent('dragOverValid'); if (Sortable.eventCanceled) return completedFired; - if (revert) { parentEl = rootEl; // actualization - capture(); - this._hideClone(); - dragOverEvent('revert'); - if (!Sortable.eventCanceled) { if (nextEl) { rootEl.insertBefore(dragEl, nextEl); @@ -2004,38 +1764,32 @@ Sortable.prototype = rootEl.appendChild(dragEl); } } - return completed(true); } - var elLastChild = lastChild(el, options.draggable); - if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) { // Insert to end of list + // If already at end of list: Do not insert if (elLastChild === dragEl) { return completed(false); - } // if there is a last element, it is the target - + } + // if there is a last element, it is the target if (elLastChild && el === evt.target) { target = elLastChild; } - if (target) { targetRect = getRect(target); } - if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) { capture(); - if (elLastChild && elLastChild.nextSibling) { // the last draggable element is not the last node el.insertBefore(dragEl, elLastChild.nextSibling); } else { el.appendChild(dragEl); } - parentEl = el; // actualization changed(); @@ -2044,14 +1798,11 @@ Sortable.prototype = } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) { // Insert to start of list var firstChild = getChild(el, 0, options, true); - if (firstChild === dragEl) { return completed(false); } - target = firstChild; targetRect = getRect(target); - if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) { capture(); el.insertBefore(dragEl, firstChild); @@ -2063,82 +1814,68 @@ Sortable.prototype = } else if (target.parentNode === el) { targetRect = getRect(target); var direction = 0, - targetBeforeFirstSwap, - differentLevel = dragEl.parentNode !== el, - differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), - side1 = vertical ? 'top' : 'left', - scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'), - scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; - + targetBeforeFirstSwap, + differentLevel = dragEl.parentNode !== el, + differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), + side1 = vertical ? 'top' : 'left', + scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'), + scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; if (lastTarget !== target) { targetBeforeFirstSwap = targetRect[side1]; pastFirstInvertThresh = false; isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel; } - direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target); var sibling; - if (direction !== 0) { // Check if target is beside dragEl in respective direction (ignoring hidden elements) var dragIndex = index(dragEl); - do { dragIndex -= direction; sibling = parentEl.children[dragIndex]; } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl)); - } // If dragEl is already beside target: Do not insert - - + } + // If dragEl is already beside target: Do not insert if (direction === 0 || sibling === target) { return completed(false); } - lastTarget = target; lastDirection = direction; var nextSibling = target.nextElementSibling, - after = false; + after = false; after = direction === 1; - var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after); - if (moveVector !== false) { if (moveVector === 1 || moveVector === -1) { after = moveVector === 1; } - _silent = true; setTimeout(_unsilent, 30); capture(); - if (after && !nextSibling) { el.appendChild(dragEl); } else { target.parentNode.insertBefore(dragEl, after ? nextSibling : target); - } // Undo chrome's scroll adjustment (has no effect on other browsers) - + } + // Undo chrome's scroll adjustment (has no effect on other browsers) if (scrolledPastTop) { scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop); } - parentEl = dragEl.parentNode; // actualization - // must be done before animation + // must be done before animation if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) { targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]); } - changed(); return completed(true); } } - if (el.contains(dragEl)) { return completed(false); } } - return false; }, _ignoreWhileAnimating: null, @@ -2158,83 +1895,69 @@ Sortable.prototype = off(ownerDocument, 'touchcancel', this._onDrop); off(document, 'selectstart', this); }, - _onDrop: function _onDrop( - /**Event*/ - evt) { + _onDrop: function _onDrop( /**Event*/evt) { var el = this.el, - options = this.options; // Get the index of the dragged element within its parent + options = this.options; + // Get the index of the dragged element within its parent newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); pluginEvent('drop', this, { evt: evt }); - parentEl = dragEl && dragEl.parentNode; // Get again after plugin event + parentEl = dragEl && dragEl.parentNode; + // Get again after plugin event newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); - if (Sortable.eventCanceled) { this._nulling(); - return; } - awaitingDragStarted = false; isCircumstantialInvert = false; pastFirstInvertThresh = false; clearInterval(this._loopId); clearTimeout(this._dragStartTimer); - _cancelNextTick(this.cloneId); + _cancelNextTick(this._dragStartId); - _cancelNextTick(this._dragStartId); // Unbind events - - + // Unbind events if (this.nativeDraggable) { off(document, 'drop', this); off(el, 'dragstart', this._onDragStart); } - this._offMoveEvents(); - this._offUpEvents(); - if (Safari) { css(document.body, 'user-select', ''); } - css(dragEl, 'transform', ''); - if (evt) { if (moved) { evt.cancelable && evt.preventDefault(); !options.dropBubble && evt.stopPropagation(); } - ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl); - if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { // Remove clone(s) cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl); } - if (dragEl) { if (this.nativeDraggable) { off(dragEl, 'dragend', this); } - _disableDraggable(dragEl); + dragEl.style['will-change'] = ''; - dragEl.style['will-change'] = ''; // Remove classes + // Remove classes // ghostClass is added in dragStarted - if (moved && !awaitingDragStarted) { toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false); } + toggleClass(dragEl, this.options.chosenClass, false); - toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event - + // Drag stop event _dispatchEvent({ sortable: this, name: 'unchoose', @@ -2243,7 +1966,6 @@ Sortable.prototype = newDraggableIndex: null, originalEvent: evt }); - if (rootEl !== parentEl) { if (newIndex >= 0) { // Add event @@ -2253,17 +1975,17 @@ Sortable.prototype = toEl: parentEl, fromEl: rootEl, originalEvent: evt - }); // Remove event - + }); + // Remove event _dispatchEvent({ sortable: this, name: 'remove', toEl: parentEl, originalEvent: evt - }); // drag from one list and drop into another - + }); + // drag from one list and drop into another _dispatchEvent({ rootEl: parentEl, name: 'sort', @@ -2271,7 +1993,6 @@ Sortable.prototype = fromEl: rootEl, originalEvent: evt }); - _dispatchEvent({ sortable: this, name: 'sort', @@ -2279,7 +2000,6 @@ Sortable.prototype = originalEvent: evt }); } - putSortable && putSortable.save(); } else { if (newIndex !== oldIndex) { @@ -2291,7 +2011,6 @@ Sortable.prototype = toEl: parentEl, originalEvent: evt }); - _dispatchEvent({ sortable: this, name: 'sort', @@ -2301,27 +2020,24 @@ Sortable.prototype = } } } - if (Sortable.active) { /* jshint eqnull:true */ if (newIndex == null || newIndex === -1) { newIndex = oldIndex; newDraggableIndex = oldDraggableIndex; } - _dispatchEvent({ sortable: this, name: 'end', toEl: parentEl, originalEvent: evt - }); // Save sorting - + }); + // Save sorting this.save(); } } } - this._nulling(); }, _nulling: function _nulling() { @@ -2332,65 +2048,52 @@ Sortable.prototype = }); savedInputChecked.length = lastDx = lastDy = 0; }, - handleEvent: function handleEvent( - /**Event*/ - evt) { + handleEvent: function handleEvent( /**Event*/evt) { switch (evt.type) { case 'drop': case 'dragend': this._onDrop(evt); - break; - case 'dragenter': case 'dragover': if (dragEl) { this._onDragOver(evt); - _globalDragOver(evt); } - break; - case 'selectstart': evt.preventDefault(); break; } }, - /** * Serializes the item into an array of string. * @returns {String[]} */ toArray: function toArray() { var order = [], - el, - children = this.el.children, - i = 0, - n = children.length, - options = this.options; - + el, + children = this.el.children, + i = 0, + n = children.length, + options = this.options; for (; i < n; i++) { el = children[i]; - if (closest(el, options.draggable, this.el, false)) { order.push(el.getAttribute(options.dataIdAttr) || _generateId(el)); } } - return order; }, - /** * Sorts the elements according to the array. * @param {String[]} order order of the items */ sort: function sort(order, useAnimation) { var items = {}, - rootEl = this.el; + rootEl = this.el; this.toArray().forEach(function (id, i) { var el = rootEl.children[i]; - if (closest(el, this.options.draggable, rootEl, false)) { items[id] = el; } @@ -2404,7 +2107,6 @@ Sortable.prototype = }); useAnimation && this.animateAll(); }, - /** * Save the current sorting */ @@ -2412,7 +2114,6 @@ Sortable.prototype = var store = this.options.store; store && store.set && store.set(this); }, - /** * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. * @param {HTMLElement} el @@ -2422,7 +2123,6 @@ Sortable.prototype = closest: function closest$1(el, selector) { return closest(el, selector || this.options.draggable, this.el, false); }, - /** * Set/get option * @param {string} name @@ -2431,24 +2131,20 @@ Sortable.prototype = */ option: function option(name, value) { var options = this.options; - if (value === void 0) { return options[name]; } else { var modifiedValue = PluginManager.modifyOption(this, name, value); - if (typeof modifiedValue !== 'undefined') { options[name] = modifiedValue; } else { options[name] = value; } - if (name === 'group') { _prepareGroup(options); } } }, - /** * Destroy */ @@ -2459,21 +2155,16 @@ Sortable.prototype = off(el, 'mousedown', this._onTapStart); off(el, 'touchstart', this._onTapStart); off(el, 'pointerdown', this._onTapStart); - if (this.nativeDraggable) { off(el, 'dragover', this); off(el, 'dragenter', this); - } // Remove draggable attributes - - + } + // Remove draggable attributes Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) { el.removeAttribute('draggable'); }); - this._onDrop(); - this._disableDelayedDragEvents(); - sortables.splice(sortables.indexOf(this.el), 1); this.el = el = null; }, @@ -2482,25 +2173,22 @@ Sortable.prototype = pluginEvent('hideClone', this); if (Sortable.eventCanceled) return; css(cloneEl, 'display', 'none'); - if (this.options.removeCloneOnHide && cloneEl.parentNode) { cloneEl.parentNode.removeChild(cloneEl); } - cloneHidden = true; } }, _showClone: function _showClone(putSortable) { if (putSortable.lastPutMode !== 'clone') { this._hideClone(); - return; } - if (cloneHidden) { pluginEvent('showClone', this); - if (Sortable.eventCanceled) return; // show clone at dragEl or original position + if (Sortable.eventCanceled) return; + // show clone at dragEl or original position if (dragEl.parentNode == rootEl && !this.options.group.revertClone) { rootEl.insertBefore(cloneEl, dragEl); } else if (nextEl) { @@ -2508,33 +2196,26 @@ Sortable.prototype = } else { rootEl.appendChild(cloneEl); } - if (this.options.group.revertClone) { this.animate(dragEl, cloneEl); } - css(cloneEl, 'display', ''); cloneHidden = false; } } }; - -function _globalDragOver( -/**Event*/ -evt) { +function _globalDragOver( /**Event*/evt) { if (evt.dataTransfer) { evt.dataTransfer.dropEffect = 'move'; } - evt.cancelable && evt.preventDefault(); } - function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) { var evt, - sortable = fromEl[expando], - onMoveFn = sortable.options.onMove, - retVal; // Support for new CustomEvent feature - + sortable = fromEl[expando], + onMoveFn = sortable.options.onMove, + retVal; + // Support for new CustomEvent feature if (window.CustomEvent && !IE11OrLess && !Edge) { evt = new CustomEvent('move', { bubbles: true, @@ -2544,7 +2225,6 @@ function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalE evt = document.createEvent('Event'); evt.initEvent('move', true, true); } - evt.to = toEl; evt.from = fromEl; evt.dragged = dragEl; @@ -2554,41 +2234,35 @@ function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalE evt.willInsertAfter = willInsertAfter; evt.originalEvent = originalEvent; fromEl.dispatchEvent(evt); - if (onMoveFn) { retVal = onMoveFn.call(sortable, evt, originalEvent); } - return retVal; } - function _disableDraggable(el) { el.draggable = false; } - function _unsilent() { _silent = false; } - function _ghostIsFirst(evt, vertical, sortable) { - var rect = getRect(getChild(sortable.el, 0, sortable.options, true)); + var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true)); + var sortableContentRect = getContentRect(sortable.el); var spacer = 10; - return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left; + return vertical ? evt.clientX < sortableContentRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < sortableContentRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left; } - function _ghostIsLast(evt, vertical, sortable) { - var rect = getRect(lastChild(sortable.el, sortable.options.draggable)); + var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable)); + var sortableContentRect = getContentRect(sortable.el); var spacer = 10; - return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer; + return vertical ? evt.clientX > sortableContentRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > sortableContentRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top; } - function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) { var mouseOnAxis = vertical ? evt.clientY : evt.clientX, - targetLength = vertical ? targetRect.height : targetRect.width, - targetS1 = vertical ? targetRect.top : targetRect.left, - targetS2 = vertical ? targetRect.bottom : targetRect.right, - invert = false; - + targetLength = vertical ? targetRect.height : targetRect.width, + targetS1 = vertical ? targetRect.top : targetRect.left, + targetS2 = vertical ? targetRect.bottom : targetRect.right, + invert = false; if (!invertSwap) { // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) { @@ -2598,7 +2272,6 @@ function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, inv // past first invert threshold, do not restrict inverted threshold to dragEl shadow pastFirstInvertThresh = true; } - if (!pastFirstInvertThresh) { // dragEl shadow (target move distance shadow) if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow @@ -2615,26 +2288,22 @@ function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, inv } } } - invert = invert || invertSwap; - if (invert) { // Invert of regular if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) { return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1; } } - return 0; } + /** * Gets the direction dragEl must be swapped relative to target in order to make it * seem that dragEl has been "inserted" into that element's position * @param {HTMLElement} target The target whose position dragEl is being inserted at * @return {Number} Direction dragEl must be swapped */ - - function _getInsertDirection(target) { if (index(dragEl) < index(target)) { return 1; @@ -2642,55 +2311,48 @@ function _getInsertDirection(target) { return -1; } } + /** * Generate id * @param {HTMLElement} el * @returns {String} * @private */ - - function _generateId(el) { var str = el.tagName + el.className + el.src + el.href + el.textContent, - i = str.length, - sum = 0; - + i = str.length, + sum = 0; while (i--) { sum += str.charCodeAt(i); } - return sum.toString(36); } - function _saveInputCheckedState(root) { savedInputChecked.length = 0; var inputs = root.getElementsByTagName('input'); var idx = inputs.length; - while (idx--) { var el = inputs[idx]; el.checked && savedInputChecked.push(el); } } - function _nextTick(fn) { return setTimeout(fn, 0); } - function _cancelNextTick(id) { return clearTimeout(id); -} // Fixed #973: - +} +// Fixed #973: if (documentExists) { on(document, 'touchmove', function (evt) { if ((Sortable.active || awaitingDragStarted) && evt.cancelable) { evt.preventDefault(); } }); -} // Export utils - +} +// Export utils Sortable.utils = { on: on, off: off, @@ -2710,59 +2372,54 @@ Sortable.utils = { detectDirection: _detectDirection, getChild: getChild }; + /** * Get the Sortable instance of an element * @param {HTMLElement} element The element * @return {Sortable|undefined} The instance of Sortable */ - Sortable.get = function (element) { return element[expando]; }; + /** * Mount a plugin to Sortable * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted */ - - Sortable.mount = function () { for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) { plugins[_key] = arguments[_key]; } - if (plugins[0].constructor === Array) plugins = plugins[0]; plugins.forEach(function (plugin) { if (!plugin.prototype || !plugin.prototype.constructor) { throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin)); } - if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils); PluginManager.mount(plugin); }); }; + /** * Create sortable instance * @param {HTMLElement} el * @param {Object} [options] */ - - Sortable.create = function (el, options) { return new Sortable(el, options); -}; // Export - +}; +// Export Sortable.version = version; var autoScrolls = [], - scrollEl, - scrollRootEl, - scrolling = false, - lastAutoScrollX, - lastAutoScrollY, - touchEvt$1, - pointerElemChangedInterval; - + scrollEl, + scrollRootEl, + scrolling = false, + lastAutoScrollX, + lastAutoScrollY, + touchEvt$1, + pointerElemChangedInterval; function AutoScrollPlugin() { function AutoScroll() { this.defaults = { @@ -2771,19 +2428,18 @@ function AutoScrollPlugin() { scrollSensitivity: 30, scrollSpeed: 10, bubbleScroll: true - }; // Bind all private methods + }; + // Bind all private methods for (var fn in this) { if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { this[fn] = this[fn].bind(this); } } } - AutoScroll.prototype = { dragStarted: function dragStarted(_ref) { var originalEvent = _ref.originalEvent; - if (this.sortable.nativeDraggable) { on(document, 'dragover', this._handleAutoScroll); } else { @@ -2798,7 +2454,6 @@ function AutoScrollPlugin() { }, dragOverCompleted: function dragOverCompleted(_ref2) { var originalEvent = _ref2.originalEvent; - // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached) if (!this.options.dragOverBubble && !originalEvent.rootEl) { this._handleAutoScroll(originalEvent); @@ -2812,7 +2467,6 @@ function AutoScrollPlugin() { off(document, 'touchmove', this._handleFallbackAutoScroll); off(document, 'mousemove', this._handleFallbackAutoScroll); } - clearPointerElemChangedInterval(); clearAutoScrolls(); cancelThrottle(); @@ -2826,31 +2480,29 @@ function AutoScrollPlugin() { }, _handleAutoScroll: function _handleAutoScroll(evt, fallback) { var _this = this; - var x = (evt.touches ? evt.touches[0] : evt).clientX, - y = (evt.touches ? evt.touches[0] : evt).clientY, - elem = document.elementFromPoint(x, y); - touchEvt$1 = evt; // IE does not seem to have native autoscroll, + y = (evt.touches ? evt.touches[0] : evt).clientY, + elem = document.elementFromPoint(x, y); + touchEvt$1 = evt; + + // IE does not seem to have native autoscroll, // Edge's autoscroll seems too conditional, // MACOS Safari does not have autoscroll, // Firefox and Chrome are good - if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) { - autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change + autoScroll(evt, this.options, elem, fallback); + // Listener for pointer element change var ogElemScroller = getParentAutoScrollElement(elem, true); - if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) { - pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour - + pointerElemChangedInterval && clearPointerElemChangedInterval(); + // Detect for pointer elem change, emulating native DnD behaviour pointerElemChangedInterval = setInterval(function () { var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true); - if (newElem !== ogElemScroller) { ogElemScroller = newElem; clearAutoScrolls(); } - autoScroll(evt, _this.options, newElem, fallback); }, 10); lastAutoScrollX = x; @@ -2862,7 +2514,6 @@ function AutoScrollPlugin() { clearAutoScrolls(); return; } - autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false); } } @@ -2872,60 +2523,54 @@ function AutoScrollPlugin() { initializeByDefault: true }); } - function clearAutoScrolls() { autoScrolls.forEach(function (autoScroll) { clearInterval(autoScroll.pid); }); autoScrolls = []; } - function clearPointerElemChangedInterval() { clearInterval(pointerElemChangedInterval); } - var autoScroll = throttle(function (evt, options, rootEl, isFallback) { // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521 if (!options.scroll) return; var x = (evt.touches ? evt.touches[0] : evt).clientX, - y = (evt.touches ? evt.touches[0] : evt).clientY, - sens = options.scrollSensitivity, - speed = options.scrollSpeed, - winScroller = getWindowScrollingElement(); + y = (evt.touches ? evt.touches[0] : evt).clientY, + sens = options.scrollSensitivity, + speed = options.scrollSpeed, + winScroller = getWindowScrollingElement(); var scrollThisInstance = false, - scrollCustomFn; // New scroll root, set scrollEl + scrollCustomFn; + // New scroll root, set scrollEl if (scrollRootEl !== rootEl) { scrollRootEl = rootEl; clearAutoScrolls(); scrollEl = options.scroll; scrollCustomFn = options.scrollFn; - if (scrollEl === true) { scrollEl = getParentAutoScrollElement(rootEl, true); } } - var layersOut = 0; var currentParent = scrollEl; - do { var el = currentParent, - rect = getRect(el), - top = rect.top, - bottom = rect.bottom, - left = rect.left, - right = rect.right, - width = rect.width, - height = rect.height, - canScrollX = void 0, - canScrollY = void 0, - scrollWidth = el.scrollWidth, - scrollHeight = el.scrollHeight, - elCSS = css(el), - scrollPosX = el.scrollLeft, - scrollPosY = el.scrollTop; - + rect = getRect(el), + top = rect.top, + bottom = rect.bottom, + left = rect.left, + right = rect.right, + width = rect.width, + height = rect.height, + canScrollX = void 0, + canScrollY = void 0, + scrollWidth = el.scrollWidth, + scrollHeight = el.scrollHeight, + elCSS = css(el), + scrollPosX = el.scrollLeft, + scrollPosY = el.scrollTop; if (el === winScroller) { canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible'); canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible'); @@ -2933,10 +2578,8 @@ var autoScroll = throttle(function (evt, options, rootEl, isFallback) { canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll'); canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll'); } - var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX); var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY); - if (!autoScrolls[layersOut]) { for (var i = 0; i <= layersOut; i++) { if (!autoScrolls[i]) { @@ -2944,61 +2587,51 @@ var autoScroll = throttle(function (evt, options, rootEl, isFallback) { } } } - if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) { autoScrolls[layersOut].el = el; autoScrolls[layersOut].vx = vx; autoScrolls[layersOut].vy = vy; clearInterval(autoScrolls[layersOut].pid); - if (vx != 0 || vy != 0) { scrollThisInstance = true; /* jshint loopfunc:true */ - autoScrolls[layersOut].pid = setInterval(function () { // emulate drag over during autoscroll (fallback), emulating native DnD behaviour if (isFallback && this.layer === 0) { Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely - } - var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0; var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0; - if (typeof scrollCustomFn === 'function') { if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') { return; } } - scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY); }.bind({ layer: layersOut }), 24); } } - layersOut++; } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false))); - scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not }, 30); var drop = function drop(_ref) { var originalEvent = _ref.originalEvent, - putSortable = _ref.putSortable, - dragEl = _ref.dragEl, - activeSortable = _ref.activeSortable, - dispatchSortableEvent = _ref.dispatchSortableEvent, - hideGhostForTarget = _ref.hideGhostForTarget, - unhideGhostForTarget = _ref.unhideGhostForTarget; + putSortable = _ref.putSortable, + dragEl = _ref.dragEl, + activeSortable = _ref.activeSortable, + dispatchSortableEvent = _ref.dispatchSortableEvent, + hideGhostForTarget = _ref.hideGhostForTarget, + unhideGhostForTarget = _ref.unhideGhostForTarget; if (!originalEvent) return; var toSortable = putSortable || activeSortable; hideGhostForTarget(); var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent; var target = document.elementFromPoint(touch.clientX, touch.clientY); unhideGhostForTarget(); - if (toSortable && !toSortable.el.contains(target)) { dispatchSortableEvent('spill'); this.onSpill({ @@ -3007,9 +2640,7 @@ var drop = function drop(_ref) { }); } }; - function Revert() {} - Revert.prototype = { startIndex: null, dragStart: function dragStart(_ref2) { @@ -3018,40 +2649,32 @@ Revert.prototype = { }, onSpill: function onSpill(_ref3) { var dragEl = _ref3.dragEl, - putSortable = _ref3.putSortable; + putSortable = _ref3.putSortable; this.sortable.captureAnimationState(); - if (putSortable) { putSortable.captureAnimationState(); } - var nextSibling = getChild(this.sortable.el, this.startIndex, this.options); - if (nextSibling) { this.sortable.el.insertBefore(dragEl, nextSibling); } else { this.sortable.el.appendChild(dragEl); } - this.sortable.animateAll(); - if (putSortable) { putSortable.animateAll(); } }, drop: drop }; - _extends(Revert, { pluginName: 'revertOnSpill' }); - function Remove() {} - Remove.prototype = { onSpill: function onSpill(_ref4) { var dragEl = _ref4.dragEl, - putSortable = _ref4.putSortable; + putSortable = _ref4.putSortable; var parentSortable = putSortable || this.sortable; parentSortable.captureAnimationState(); dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); @@ -3059,22 +2682,18 @@ Remove.prototype = { }, drop: drop }; - _extends(Remove, { pluginName: 'removeOnSpill' }); - var OnSpill = [Remove, Revert]; var lastSwapEl; - function SwapPlugin() { function Swap() { this.defaults = { swapClass: 'sortable-swap-highlight' }; } - Swap.prototype = { dragStart: function dragStart(_ref) { var dragEl = _ref.dragEl; @@ -3082,42 +2701,37 @@ function SwapPlugin() { }, dragOverValid: function dragOverValid(_ref2) { var completed = _ref2.completed, - target = _ref2.target, - onMove = _ref2.onMove, - activeSortable = _ref2.activeSortable, - changed = _ref2.changed, - cancel = _ref2.cancel; + target = _ref2.target, + onMove = _ref2.onMove, + activeSortable = _ref2.activeSortable, + changed = _ref2.changed, + cancel = _ref2.cancel; if (!activeSortable.options.swap) return; var el = this.sortable.el, - options = this.options; - + options = this.options; if (target && target !== el) { var 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: function drop(_ref3) { var activeSortable = _ref3.activeSortable, - putSortable = _ref3.putSortable, - dragEl = _ref3.dragEl; + putSortable = _ref3.putSortable, + dragEl = _ref3.dragEl; var toSortable = putSortable || this.sortable; var options = this.options; lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false); - if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) { if (dragEl !== lastSwapEl) { toSortable.captureAnimationState(); @@ -3141,38 +2755,34 @@ function SwapPlugin() { } }); } - function swapNodes(n1, n2) { var p1 = n1.parentNode, - p2 = n2.parentNode, - i1, - i2; + 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]); } var multiDragElements = [], - multiDragClones = [], - lastMultiDragSelect, - // for selection with modifier key down (SHIFT) -multiDragSortable, - initialFolding = false, - // Initial multi-drag fold when drag started -folding = false, - // Folding any other time -dragStarted = false, - dragEl$1, - clonesFromRect, - clonesHidden; - + multiDragClones = [], + lastMultiDragSelect, + // for selection with modifier key down (SHIFT) + multiDragSortable, + initialFolding = false, + // Initial multi-drag fold when drag started + folding = false, + // Folding any other time + dragStarted = false, + dragEl$1, + clonesFromRect, + clonesHidden; function MultiDragPlugin() { function MultiDrag(sortable) { // Bind all private methods @@ -3181,7 +2791,6 @@ function MultiDragPlugin() { this[fn] = this[fn].bind(this); } } - if (!sortable.options.avoidImplicitDeselect) { if (sortable.options.supportPointer) { on(document, 'pointerup', this._deselectMultiDrag); @@ -3190,7 +2799,6 @@ function MultiDragPlugin() { on(document, 'touchend', this._deselectMultiDrag); } } - on(document, 'keydown', this._checkKeyDown); on(document, 'keyup', this._checkKeyUp); this.defaults = { @@ -3199,7 +2807,6 @@ function MultiDragPlugin() { avoidImplicitDeselect: false, setData: function setData(dataTransfer, dragEl) { var data = ''; - if (multiDragElements.length && multiDragSortable === sortable) { multiDragElements.forEach(function (multiDragElement, i) { data += (!i ? '' : ', ') + multiDragElement.textContent; @@ -3207,12 +2814,10 @@ function MultiDragPlugin() { } else { data = dragEl.textContent; } - dataTransfer.setData('Text', data); } }; } - MultiDrag.prototype = { multiDragKeyDown: false, isMultiDrag: false, @@ -3225,9 +2830,8 @@ function MultiDragPlugin() { }, setupClone: function setupClone(_ref2) { var sortable = _ref2.sortable, - cancel = _ref2.cancel; + cancel = _ref2.cancel; if (!this.isMultiDrag) return; - for (var i = 0; i < multiDragElements.length; i++) { multiDragClones.push(clone(multiDragElements[i])); multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex; @@ -3236,18 +2840,15 @@ function MultiDragPlugin() { toggleClass(multiDragClones[i], this.options.selectedClass, false); multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false); } - sortable._hideClone(); - cancel(); }, clone: function clone(_ref3) { var sortable = _ref3.sortable, - rootEl = _ref3.rootEl, - dispatchSortableEvent = _ref3.dispatchSortableEvent, - cancel = _ref3.cancel; + rootEl = _ref3.rootEl, + dispatchSortableEvent = _ref3.dispatchSortableEvent, + cancel = _ref3.cancel; if (!this.isMultiDrag) return; - if (!this.options.removeCloneOnHide) { if (multiDragElements.length && multiDragSortable === sortable) { insertMultiDragClones(true, rootEl); @@ -3258,8 +2859,8 @@ function MultiDragPlugin() { }, showClone: function showClone(_ref4) { var cloneNowShown = _ref4.cloneNowShown, - rootEl = _ref4.rootEl, - cancel = _ref4.cancel; + rootEl = _ref4.rootEl, + cancel = _ref4.cancel; if (!this.isMultiDrag) return; insertMultiDragClones(false, rootEl); multiDragClones.forEach(function (clone) { @@ -3271,14 +2872,12 @@ function MultiDragPlugin() { }, hideClone: function hideClone(_ref5) { var _this = this; - var sortable = _ref5.sortable, - cloneNowHidden = _ref5.cloneNowHidden, - cancel = _ref5.cancel; + cloneNowHidden = _ref5.cloneNowHidden, + cancel = _ref5.cancel; if (!this.isMultiDrag) return; multiDragClones.forEach(function (clone) { css(clone, 'display', 'none'); - if (_this.options.removeCloneOnHide && clone.parentNode) { clone.parentNode.removeChild(clone); } @@ -3289,15 +2888,14 @@ function MultiDragPlugin() { }, dragStartGlobal: function dragStartGlobal(_ref6) { var sortable = _ref6.sortable; - if (!this.isMultiDrag && multiDragSortable) { multiDragSortable.multiDrag._deselectMultiDrag(); } - multiDragElements.forEach(function (multiDragElement) { multiDragElement.sortableIndex = index(multiDragElement); - }); // Sort multi-drag elements + }); + // Sort multi-drag elements multiDragElements = multiDragElements.sort(function (a, b) { return a.sortableIndex - b.sortableIndex; }); @@ -3305,10 +2903,8 @@ function MultiDragPlugin() { }, dragStarted: function dragStarted(_ref7) { var _this2 = this; - var sortable = _ref7.sortable; if (!this.isMultiDrag) return; - if (this.options.sort) { // Capture rects, // hide multi drag elements (by positioning them absolute), @@ -3316,8 +2912,8 @@ function MultiDragPlugin() { // show multi drag elements, // animate to rects, // unset rects & remove from DOM - sortable.captureAnimationState(); + sortable.captureAnimationState(); if (this.options.animation) { multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; @@ -3332,18 +2928,16 @@ function MultiDragPlugin() { initialFolding = true; } } - sortable.animateAll(function () { folding = false; initialFolding = false; - if (_this2.options.animation) { multiDragElements.forEach(function (multiDragElement) { unsetRect(multiDragElement); }); - } // Remove all auxiliary multidrag items from el, if sorting enabled - + } + // Remove all auxiliary multidrag items from el, if sorting enabled if (_this2.options.sort) { removeMultiDragElements(); } @@ -3351,9 +2945,8 @@ function MultiDragPlugin() { }, dragOver: function dragOver(_ref8) { var target = _ref8.target, - completed = _ref8.completed, - cancel = _ref8.cancel; - + completed = _ref8.completed, + cancel = _ref8.cancel; if (folding && ~multiDragElements.indexOf(target)) { completed(false); cancel(); @@ -3361,10 +2954,9 @@ function MultiDragPlugin() { }, revert: function revert(_ref9) { var fromSortable = _ref9.fromSortable, - rootEl = _ref9.rootEl, - sortable = _ref9.sortable, - dragRect = _ref9.dragRect; - + rootEl = _ref9.rootEl, + sortable = _ref9.sortable, + dragRect = _ref9.dragRect; if (multiDragElements.length > 1) { // Setup unfold animation multiDragElements.forEach(function (multiDragElement) { @@ -3382,47 +2974,44 @@ function MultiDragPlugin() { }, dragOverCompleted: function dragOverCompleted(_ref10) { var sortable = _ref10.sortable, - isOwner = _ref10.isOwner, - insertion = _ref10.insertion, - activeSortable = _ref10.activeSortable, - parentEl = _ref10.parentEl, - putSortable = _ref10.putSortable; + isOwner = _ref10.isOwner, + insertion = _ref10.insertion, + activeSortable = _ref10.activeSortable, + parentEl = _ref10.parentEl, + putSortable = _ref10.putSortable; var options = this.options; - if (insertion) { // Clones must be hidden before folding animation to capture dragRectAbsolute properly if (isOwner) { activeSortable._hideClone(); } - - initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location - + initialFolding = false; + // If leaving sort:false root, or already folding - Fold to new location if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) { // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible var dragRectAbsolute = getRect(dragEl$1, false, true, true); multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; - setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted - // while folding, and so that we can capture them again because old sortable will no longer be fromSortable + setRect(multiDragElement, dragRectAbsolute); + // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted + // while folding, and so that we can capture them again because old sortable will no longer be fromSortable parentEl.appendChild(multiDragElement); }); folding = true; - } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out - + } + // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out if (!isOwner) { // Only remove if not folding (folding will remove them anyways) if (!folding) { removeMultiDragElements(); } - if (multiDragElements.length > 1) { var clonesHiddenBefore = clonesHidden; + activeSortable._showClone(sortable); - activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden - - + // Unfold animation for clones if showing from hidden if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) { multiDragClones.forEach(function (clone) { activeSortable.addAnimationState({ @@ -3441,12 +3030,11 @@ function MultiDragPlugin() { }, dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) { var dragRect = _ref11.dragRect, - isOwner = _ref11.isOwner, - activeSortable = _ref11.activeSortable; + isOwner = _ref11.isOwner, + activeSortable = _ref11.activeSortable; multiDragElements.forEach(function (multiDragElement) { multiDragElement.thisAnimationDuration = null; }); - if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) { clonesFromRect = _extends({}, dragRect); var dragMatrix = matrix(dragEl$1, true); @@ -3462,24 +3050,23 @@ function MultiDragPlugin() { }, drop: function drop(_ref12) { var evt = _ref12.originalEvent, - rootEl = _ref12.rootEl, - parentEl = _ref12.parentEl, - sortable = _ref12.sortable, - dispatchSortableEvent = _ref12.dispatchSortableEvent, - oldIndex = _ref12.oldIndex, - putSortable = _ref12.putSortable; + rootEl = _ref12.rootEl, + parentEl = _ref12.parentEl, + sortable = _ref12.sortable, + dispatchSortableEvent = _ref12.dispatchSortableEvent, + oldIndex = _ref12.oldIndex, + putSortable = _ref12.putSortable; var toSortable = putSortable || this.sortable; if (!evt) return; var options = this.options, - children = parentEl.children; // Multi-drag selection + children = parentEl.children; + // Multi-drag selection if (!dragStarted) { if (options.multiDragKey && !this.multiDragKeyDown) { this._deselectMultiDrag(); } - toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1)); - if (!~multiDragElements.indexOf(dragEl$1)) { multiDragElements.push(dragEl$1); dispatchEvent({ @@ -3488,17 +3075,16 @@ function MultiDragPlugin() { name: 'select', targetEl: dragEl$1, originalEvent: evt - }); // Modifier activated, select from last to dragEl + }); + // Modifier activated, select from last to dragEl if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) { var lastIndex = index(lastMultiDragSelect), - currentIndex = index(dragEl$1); - + currentIndex = index(dragEl$1); if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) { // Must include lastMultiDragSelect (select it), in case modified selection from no selection // (but previous selection existed) var n, i; - if (currentIndex > lastIndex) { i = lastIndex; n = currentIndex; @@ -3506,7 +3092,6 @@ function MultiDragPlugin() { i = currentIndex; n = lastIndex + 1; } - for (; i < n; i++) { if (~multiDragElements.indexOf(children[i])) continue; toggleClass(children[i], options.selectedClass, true); @@ -3523,7 +3108,6 @@ function MultiDragPlugin() { } else { lastMultiDragSelect = dragEl$1; } - multiDragSortable = toSortable; } else { multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1); @@ -3536,38 +3120,37 @@ function MultiDragPlugin() { originalEvent: evt }); } - } // Multi-drag drop - + } + // Multi-drag drop if (dragStarted && this.isMultiDrag) { - folding = false; // Do not "unfold" after around dragEl if reverted - + folding = false; + // Do not "unfold" after around dragEl if reverted if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) { var dragRect = getRect(dragEl$1), - multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')'); + multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')'); if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null; toSortable.captureAnimationState(); - if (!initialFolding) { if (options.animation) { dragEl$1.fromRect = dragRect; multiDragElements.forEach(function (multiDragElement) { multiDragElement.thisAnimationDuration = null; - if (multiDragElement !== dragEl$1) { var rect = folding ? getRect(multiDragElement) : dragRect; - multiDragElement.fromRect = rect; // Prepare unfold animation + multiDragElement.fromRect = rect; + // Prepare unfold animation toSortable.addAnimationState({ target: multiDragElement, rect: rect }); } }); - } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert - // properly they must all be removed - + } + // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert + // properly they must all be removed removeMultiDragElements(); multiDragElements.forEach(function (multiDragElement) { if (children[multiDragIndex]) { @@ -3575,12 +3158,12 @@ function MultiDragPlugin() { } else { parentEl.appendChild(multiDragElement); } - multiDragIndex++; - }); // If initial folding is done, the elements may have changed position because they are now + }); + + // If initial folding is done, the elements may have changed position because they are now // unfolding around dragEl, even though dragEl may not have his index changed, so update event // must be fired here as Sortable will not. - if (oldIndex === index(dragEl$1)) { var update = false; multiDragElements.forEach(function (multiDragElement) { @@ -3589,24 +3172,23 @@ function MultiDragPlugin() { return; } }); - if (update) { dispatchSortableEvent('update'); + dispatchSortableEvent('sort'); } } - } // Must be done after capturing individual rects (scroll bar) - + } + // Must be done after capturing individual rects (scroll bar) multiDragElements.forEach(function (multiDragElement) { unsetRect(multiDragElement); }); toSortable.animateAll(); } - multiDragSortable = toSortable; - } // Remove clones if necessary - + } + // Remove clones if necessary if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { multiDragClones.forEach(function (clone) { clone.parentNode && clone.parentNode.removeChild(clone); @@ -3619,7 +3201,6 @@ function MultiDragPlugin() { }, destroyGlobal: function destroyGlobal() { this._deselectMultiDrag(); - off(document, 'pointerup', this._deselectMultiDrag); off(document, 'mouseup', this._deselectMultiDrag); off(document, 'touchend', this._deselectMultiDrag); @@ -3627,14 +3208,16 @@ function MultiDragPlugin() { off(document, 'keyup', this._checkKeyUp); }, _deselectMultiDrag: function _deselectMultiDrag(evt) { - if (typeof dragStarted !== "undefined" && dragStarted) return; // Only deselect if selection is in this sortable + if (typeof dragStarted !== "undefined" && dragStarted) return; - if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable + // Only deselect if selection is in this sortable + if (multiDragSortable !== this.sortable) return; - if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click + // Only deselect if target is not item in this sortable + if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; + // Only deselect if left click if (evt && evt.button !== 0) return; - while (multiDragElements.length) { var el = multiDragElements[0]; toggleClass(el, this.options.selectedClass, false); @@ -3670,24 +3253,20 @@ function MultiDragPlugin() { select: function select(el) { var sortable = el.parentNode[expando]; if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return; - if (multiDragSortable && multiDragSortable !== sortable) { multiDragSortable.multiDrag._deselectMultiDrag(); - multiDragSortable = sortable; } - toggleClass(el, sortable.options.selectedClass, true); multiDragElements.push(el); }, - /** * Deselects the provided multi-drag item * @param {HTMLElement} el The element to be deselected */ deselect: function deselect(el) { var sortable = el.parentNode[expando], - index = multiDragElements.indexOf(el); + index = multiDragElements.indexOf(el); if (!sortable || !sortable.options.multiDrag || !~index) return; toggleClass(el, sortable.options.selectedClass, false); multiDragElements.splice(index, 1); @@ -3695,17 +3274,16 @@ function MultiDragPlugin() { }, eventProperties: function eventProperties() { var _this3 = this; - var oldIndicies = [], - newIndicies = []; + newIndicies = []; multiDragElements.forEach(function (multiDragElement) { oldIndicies.push({ multiDragElement: multiDragElement, index: multiDragElement.sortableIndex - }); // multiDragElements will already be sorted if folding + }); + // multiDragElements will already be sorted if folding var newIndex; - if (folding && multiDragElement !== dragEl$1) { newIndex = -1; } else if (folding) { @@ -3713,7 +3291,6 @@ function MultiDragPlugin() { } else { newIndex = index(multiDragElement); } - newIndicies.push({ multiDragElement: multiDragElement, index: newIndex @@ -3729,23 +3306,19 @@ function MultiDragPlugin() { optionListeners: { multiDragKey: function multiDragKey(key) { key = key.toLowerCase(); - if (key === 'ctrl') { key = 'Control'; } else if (key.length > 1) { key = key.charAt(0).toUpperCase() + key.substr(1); } - return key; } } }); } - function insertMultiDragElements(clonesInserted, rootEl) { multiDragElements.forEach(function (multiDragElement, i) { var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)]; - if (target) { rootEl.insertBefore(multiDragElement, target); } else { @@ -3753,17 +3326,15 @@ function insertMultiDragElements(clonesInserted, rootEl) { } }); } + /** * Insert multi-drag clones * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted * @param {HTMLElement} rootEl */ - - function insertMultiDragClones(elementsInserted, rootEl) { multiDragClones.forEach(function (clone, i) { var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)]; - if (target) { rootEl.insertBefore(clone, target); } else { @@ -3771,7 +3342,6 @@ function insertMultiDragClones(elementsInserted, rootEl) { } }); } - function removeMultiDragElements() { multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; diff --git a/modular/sortable.esm.js b/modular/sortable.esm.js index 6ec7ed1bb..eeae29e0a 100644 --- a/modular/sortable.esm.js +++ b/modular/sortable.esm.js @@ -1,31 +1,25 @@ /**! - * Sortable 1.15.0 + * Sortable 1.15.1 * @author RubaXa * @author owenm * @license MIT */ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); - if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); - if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } - keys.push.apply(keys, symbols); } - return keys; } - function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; - if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); @@ -38,10 +32,8 @@ function _objectSpread2(target) { }); } } - return target; } - function _typeof(obj) { "@babel/helpers - typeof"; @@ -54,10 +46,8 @@ function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } - return _typeof(obj); } - function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { @@ -69,53 +59,40 @@ function _defineProperty(obj, key, value) { } else { obj[key] = value; } - return obj; } - function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; - for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } - return target; }; - return _extends.apply(this, arguments); } - function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; - for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } - return target; } - function _objectWithoutProperties(source, excluded) { if (source == null) return {}; - var target = _objectWithoutPropertiesLoose(source, excluded); - var key, i; - if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; @@ -123,22 +100,17 @@ function _objectWithoutProperties(source, excluded) { target[key] = source[key]; } } - return target; } - function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } - function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } - function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } - function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); @@ -147,27 +119,22 @@ function _unsupportedIterableToArray(o, minLen) { if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - return arr2; } - function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } -var version = "1.15.0"; +var version = "1.15.1"; function userAgent(pattern) { if (typeof window !== 'undefined' && window.navigator) { return !! /*@__PURE__*/navigator.userAgent.match(pattern); } } - var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i); var Edge = userAgent(/Edge/i); var FireFox = userAgent(/firefox/i); @@ -179,23 +146,15 @@ var captureMode = { capture: false, passive: false }; - function on(el, event, fn) { el.addEventListener(event, fn, !IE11OrLess && captureMode); } - function off(el, event, fn) { el.removeEventListener(event, fn, !IE11OrLess && captureMode); } - -function matches( -/**HTMLElement*/ -el, -/**String*/ -selector) { +function matches( /**HTMLElement*/el, /**String*/selector) { if (!selector) return; selector[0] === '>' && (selector = selector.substring(1)); - if (el) { try { if (el.matches) { @@ -209,39 +168,25 @@ selector) { return false; } } - return false; } - function getParentOrHost(el) { return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode; } - -function closest( -/**HTMLElement*/ -el, -/**String*/ -selector, -/**HTMLElement*/ -ctx, includeCTX) { +function closest( /**HTMLElement*/el, /**String*/selector, /**HTMLElement*/ctx, includeCTX) { if (el) { ctx = ctx || document; - do { if (selector != null && (selector[0] === '>' ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) { return el; } - if (el === ctx) break; /* jshint boss:true */ } while (el = getParentOrHost(el)); } - return null; } - var R_SPACE = /\s+/g; - function toggleClass(el, name, state) { if (el && name) { if (el.classList) { @@ -252,10 +197,8 @@ function toggleClass(el, name, state) { } } } - function css(el, prop, val) { var style = el && el.style; - if (style) { if (val === void 0) { if (document.defaultView && document.defaultView.getComputedStyle) { @@ -263,68 +206,55 @@ function css(el, prop, val) { } else if (el.currentStyle) { val = el.currentStyle; } - return prop === void 0 ? val : val[prop]; } else { if (!(prop in style) && prop.indexOf('webkit') === -1) { prop = '-webkit-' + prop; } - style[prop] = val + (typeof val === 'string' ? '' : 'px'); } } } - function matrix(el, selfOnly) { var appliedTransforms = ''; - if (typeof el === 'string') { appliedTransforms = el; } else { do { var transform = css(el, 'transform'); - if (transform && transform !== 'none') { appliedTransforms = transform + ' ' + appliedTransforms; } /* jshint boss:true */ - } while (!selfOnly && (el = el.parentNode)); } - var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix; /*jshint -W056 */ - return matrixFn && new matrixFn(appliedTransforms); } - function find(ctx, tagName, iterator) { if (ctx) { var list = ctx.getElementsByTagName(tagName), - i = 0, - n = list.length; - + i = 0, + n = list.length; if (iterator) { for (; i < n; i++) { iterator(list[i], i); } } - return list; } - return []; } - function getWindowScrollingElement() { var scrollingElement = document.scrollingElement; - if (scrollingElement) { return scrollingElement; } else { return document.documentElement; } } + /** * Returns the "bounding client rect" of given element * @param {HTMLElement} el The element whose boundingClientRect is wanted @@ -334,12 +264,9 @@ function getWindowScrollingElement() { * @param {[HTMLElement]} container The parent the element will be placed in * @return {Object} The boundingClientRect of el, with specified adjustments */ - - function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) { if (!el.getBoundingClientRect && el !== window) return; var elRect, top, left, bottom, right, height, width; - if (el !== window && el.parentNode && el !== getWindowScrollingElement()) { elRect = el.getBoundingClientRect(); top = elRect.top; @@ -356,17 +283,18 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS height = window.innerHeight; width = window.innerWidth; } - if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) { // Adjust for translate() - container = container || el.parentNode; // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312) - // Not needed on <= IE11 + container = container || el.parentNode; + // solves #1123 (see: https://stackoverflow.com/a/37953806/6088312) + // Not needed on <= IE11 if (!IE11OrLess) { do { if (container && container.getBoundingClientRect && (css(container, 'transform') !== 'none' || relativeToNonStaticParent && css(container, 'position') !== 'static')) { - var containerRect = container.getBoundingClientRect(); // Set relative to edges of padding box of container + var containerRect = container.getBoundingClientRect(); + // Set relative to edges of padding box of container top -= containerRect.top + parseInt(css(container, 'border-top-width')); left -= containerRect.left + parseInt(css(container, 'border-left-width')); bottom = top + elRect.height; @@ -374,17 +302,14 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS break; } /* jshint boss:true */ - } while (container = container.parentNode); } } - if (undoScale && el !== window) { // Adjust for scale() var elMatrix = matrix(container || el), - scaleX = elMatrix && elMatrix.a, - scaleY = elMatrix && elMatrix.d; - + scaleX = elMatrix && elMatrix.a, + scaleY = elMatrix && elMatrix.d; if (elMatrix) { top /= scaleY; left /= scaleX; @@ -394,7 +319,6 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS right = left + width; } } - return { top: top, left: left, @@ -404,6 +328,27 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS height: height }; } + +/** + * Returns the content rect of the element (bounding rect minus border and padding) + * @param {HTMLElement} el + */ +function getContentRect(el) { + var rect = getRect(el); + var paddingLeft = parseInt(css(el, 'padding-left')), + paddingTop = parseInt(css(el, 'padding-top')), + paddingRight = parseInt(css(el, 'padding-right')), + paddingBottom = parseInt(css(el, 'padding-bottom')); + rect.top += paddingTop + parseInt(css(el, 'border-top-width')); + rect.left += paddingLeft + parseInt(css(el, 'border-left-width')); + // Client Width/Height includes padding only + rect.width = el.clientWidth - paddingLeft - paddingRight; + rect.height = el.clientHeight - paddingTop - paddingBottom; + rect.bottom = rect.top + rect.height; + rect.right = rect.left + rect.width; + return rect; +} + /** * Checks if a side of an element is scrolled past a side of its parents * @param {HTMLElement} el The element who's side being scrolled out of view is in question @@ -411,30 +356,26 @@ function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoS * @param {String} parentSide Side of the parent in question ('top', 'left', 'right', 'bottom') * @return {HTMLElement} The parent scroll element that the el's side is scrolled past, or null if there is no such element */ - - function isScrolledPast(el, elSide, parentSide) { var parent = getParentAutoScrollElement(el, true), - elSideVal = getRect(el)[elSide]; - /* jshint boss:true */ + elSideVal = getRect(el)[elSide]; + /* jshint boss:true */ while (parent) { var parentSideVal = getRect(parent)[parentSide], - visible = void 0; - + visible = void 0; if (parentSide === 'top' || parentSide === 'left') { visible = elSideVal >= parentSideVal; } else { visible = elSideVal <= parentSideVal; } - if (!visible) return parent; if (parent === getWindowScrollingElement()) break; parent = getParentAutoScrollElement(parent, false); } - return false; } + /** * Gets nth child of el, ignoring hidden children, sortable's elements (does not ignore clone if it's visible) * and non-draggable elements @@ -443,44 +384,36 @@ function isScrolledPast(el, elSide, parentSide) { * @param {Object} options Parent Sortable's options * @return {HTMLElement} The child at index childNum, or null if not found */ - - function getChild(el, childNum, options, includeDragEl) { var currentChild = 0, - i = 0, - children = el.children; - + i = 0, + children = el.children; while (i < children.length) { if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) { if (currentChild === childNum) { return children[i]; } - currentChild++; } - i++; } - return null; } + /** * Gets the last child in the el, ignoring ghostEl or invisible elements (clones) * @param {HTMLElement} el Parent element * @param {selector} selector Any other elements that should be ignored * @return {HTMLElement} The last child, ignoring ghostEl */ - - function lastChild(el, selector) { var last = el.lastElementChild; - while (last && (last === Sortable.ghost || css(last, 'display') === 'none' || selector && !matches(last, selector))) { last = last.previousElementSibling; } - return last || null; } + /** * Returns the index of an element within its parent for a selected set of * elements @@ -488,81 +421,67 @@ function lastChild(el, selector) { * @param {selector} selector * @return {number} */ - - function index(el, selector) { var index = 0; - if (!el || !el.parentNode) { return -1; } - /* jshint boss:true */ - + /* jshint boss:true */ while (el = el.previousElementSibling) { if (el.nodeName.toUpperCase() !== 'TEMPLATE' && el !== Sortable.clone && (!selector || matches(el, selector))) { index++; } } - return index; } + /** * Returns the scroll offset of the given element, added with all the scroll offsets of parent elements. * The value is returned in real pixels. * @param {HTMLElement} el * @return {Array} Offsets in the format of [left, top] */ - - function getRelativeScrollOffset(el) { var offsetLeft = 0, - offsetTop = 0, - winScroller = getWindowScrollingElement(); - + offsetTop = 0, + winScroller = getWindowScrollingElement(); if (el) { do { var elMatrix = matrix(el), - scaleX = elMatrix.a, - scaleY = elMatrix.d; + scaleX = elMatrix.a, + scaleY = elMatrix.d; offsetLeft += el.scrollLeft * scaleX; offsetTop += el.scrollTop * scaleY; } while (el !== winScroller && (el = el.parentNode)); } - return [offsetLeft, offsetTop]; } + /** * Returns the index of the object within the given array * @param {Array} arr Array that may or may not hold the object * @param {Object} obj An object that has a key-value pair unique to and identical to a key-value pair in the object you want to find * @return {Number} The index of the object in the array, or -1 */ - - function indexOfObject(arr, obj) { for (var i in arr) { if (!arr.hasOwnProperty(i)) continue; - for (var key in obj) { if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) return Number(i); } } - return -1; } - function getParentAutoScrollElement(el, includeSelf) { // skip to window if (!el || !el.getBoundingClientRect) return getWindowScrollingElement(); var elem = el; var gotSelf = false; - do { // we don't need to get elem css if it isn't even overflowing in the first place (performance) if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) { var elemCSS = css(elem); - if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == 'auto' || elemCSS.overflowX == 'scroll') || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == 'auto' || elemCSS.overflowY == 'scroll')) { if (!elem.getBoundingClientRect || elem === document.body) return getWindowScrollingElement(); if (gotSelf || includeSelf) return elem; @@ -570,12 +489,9 @@ function getParentAutoScrollElement(el, includeSelf) { } } /* jshint boss:true */ - } while (elem = elem.parentNode); - return getWindowScrollingElement(); } - function extend(dst, src) { if (dst && src) { for (var key in src) { @@ -584,49 +500,39 @@ function extend(dst, src) { } } } - return dst; } - function isRectEqual(rect1, rect2) { return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width); } - var _throttleTimeout; - function throttle(callback, ms) { return function () { if (!_throttleTimeout) { var args = arguments, - _this = this; - + _this = this; if (args.length === 1) { callback.call(_this, args[0]); } else { callback.apply(_this, args); } - _throttleTimeout = setTimeout(function () { _throttleTimeout = void 0; }, ms); } }; } - function cancelThrottle() { clearTimeout(_throttleTimeout); _throttleTimeout = void 0; } - function scrollBy(el, x, y) { el.scrollLeft += x; el.scrollTop += y; } - function clone(el) { var Polymer = window.Polymer; var $ = window.jQuery || window.Zepto; - if (Polymer && Polymer.dom) { return Polymer.dom(el).cloneNode(true); } else if ($) { @@ -635,7 +541,6 @@ function clone(el) { return el.cloneNode(true); } } - function setRect(el, rect) { css(el, 'position', 'absolute'); css(el, 'top', rect.top); @@ -643,7 +548,6 @@ function setRect(el, rect) { css(el, 'width', rect.width); css(el, 'height', rect.height); } - function unsetRect(el) { css(el, 'position', ''); css(el, 'top', ''); @@ -651,12 +555,11 @@ function unsetRect(el) { css(el, 'width', ''); css(el, 'height', ''); } - var expando = 'Sortable' + new Date().getTime(); function AnimationStateManager() { var animationStates = [], - animationCallbackId; + animationCallbackId; return { captureAnimationState: function captureAnimationState() { animationStates = []; @@ -668,19 +571,16 @@ function AnimationStateManager() { target: child, rect: getRect(child) }); + var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); - var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation - - + // If animating: compensate for current animation if (child.thisAnimationDuration) { var childMatrix = matrix(child, true); - if (childMatrix) { fromRect.top -= childMatrix.f; fromRect.left -= childMatrix.e; } } - child.fromRect = fromRect; }); }, @@ -694,54 +594,47 @@ function AnimationStateManager() { }, animateAll: function animateAll(callback) { var _this = this; - if (!this.options.animation) { clearTimeout(animationCallbackId); if (typeof callback === 'function') callback(); return; } - var animating = false, - animationTime = 0; + animationTime = 0; animationStates.forEach(function (state) { var time = 0, - target = state.target, - fromRect = target.fromRect, - toRect = getRect(target), - prevFromRect = target.prevFromRect, - prevToRect = target.prevToRect, - animatingRect = state.rect, - targetMatrix = matrix(target, true); - + target = state.target, + fromRect = target.fromRect, + toRect = getRect(target), + prevFromRect = target.prevFromRect, + prevToRect = target.prevToRect, + animatingRect = state.rect, + targetMatrix = matrix(target, true); if (targetMatrix) { // Compensate for current animation toRect.top -= targetMatrix.f; toRect.left -= targetMatrix.e; } - target.toRect = toRect; - if (target.thisAnimationDuration) { // Could also check if animatingRect is between fromRect and toRect - if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && // Make sure animatingRect is on line between toRect & fromRect + if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && + // Make sure animatingRect is on line between toRect & fromRect (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) { // If returning to same place as started from animation and on same axis time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options); } - } // if fromRect != toRect: animate - + } + // if fromRect != toRect: animate if (!isRectEqual(toRect, fromRect)) { target.prevFromRect = fromRect; target.prevToRect = toRect; - if (!time) { time = _this.options.animation; } - _this.animate(target, animatingRect, toRect, time); } - if (time) { animating = true; animationTime = Math.max(animationTime, time); @@ -757,7 +650,6 @@ function AnimationStateManager() { } }); clearTimeout(animationCallbackId); - if (!animating) { if (typeof callback === 'function') callback(); } else { @@ -765,7 +657,6 @@ function AnimationStateManager() { if (typeof callback === 'function') callback(); }, animationTime); } - animationStates = []; }, animate: function animate(target, currentRect, toRect, duration) { @@ -773,10 +664,10 @@ function AnimationStateManager() { css(target, 'transition', ''); css(target, 'transform', ''); var elMatrix = matrix(this.el), - scaleX = elMatrix && elMatrix.a, - scaleY = elMatrix && elMatrix.d, - translateX = (currentRect.left - toRect.left) / (scaleX || 1), - translateY = (currentRect.top - toRect.top) / (scaleY || 1); + scaleX = elMatrix && elMatrix.a, + scaleY = elMatrix && elMatrix.d, + translateX = (currentRect.left - toRect.left) / (scaleX || 1), + translateY = (currentRect.top - toRect.top) / (scaleY || 1); target.animatingX = !!translateX; target.animatingY = !!translateY; css(target, 'transform', 'translate3d(' + translateX + 'px,' + translateY + 'px,0)'); @@ -796,11 +687,9 @@ function AnimationStateManager() { } }; } - function repaint(target) { return target.offsetWidth; } - function calculateRealTime(animatingRect, fromRect, toRect, options) { return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation; } @@ -817,7 +706,6 @@ var PluginManager = { plugin[option] = defaults[option]; } } - plugins.forEach(function (p) { if (p.pluginName === plugin.pluginName) { throw "Sortable: Cannot mount plugin ".concat(plugin.pluginName, " more than once"); @@ -827,25 +715,22 @@ var PluginManager = { }, pluginEvent: function pluginEvent(eventName, sortable, evt) { var _this = this; - this.eventCanceled = false; - evt.cancel = function () { _this.eventCanceled = true; }; - var eventNameGlobal = eventName + 'Global'; plugins.forEach(function (plugin) { - if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable - + if (!sortable[plugin.pluginName]) return; + // Fire global events if it exists in this sortable if (sortable[plugin.pluginName][eventNameGlobal]) { sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({ sortable: sortable }, evt)); - } // Only fire plugin event if plugin is enabled in this sortable, - // and plugin has event defined - + } + // Only fire plugin event if plugin is enabled in this sortable, + // and plugin has event defined if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) { sortable[plugin.pluginName][eventName](_objectSpread2({ sortable: sortable @@ -860,15 +745,14 @@ var PluginManager = { var initialized = new plugin(sortable, el, sortable.options); initialized.sortable = sortable; initialized.options = sortable.options; - sortable[pluginName] = initialized; // Add default options from plugin + sortable[pluginName] = initialized; + // Add default options from plugin _extends(defaults, initialized.defaults); }); - for (var option in sortable.options) { if (!sortable.options.hasOwnProperty(option)) continue; var modified = this.modifyOption(sortable, option, sortable.options[option]); - if (typeof modified !== 'undefined') { sortable.options[option] = modified; } @@ -878,7 +762,6 @@ var PluginManager = { var eventProperties = {}; plugins.forEach(function (plugin) { if (typeof plugin.eventProperties !== 'function') return; - _extends(eventProperties, plugin.eventProperties.call(sortable[plugin.pluginName], name)); }); return eventProperties; @@ -887,8 +770,9 @@ var PluginManager = { var modifiedValue; plugins.forEach(function (plugin) { // Plugin must exist on the Sortable - if (!sortable[plugin.pluginName]) return; // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin + if (!sortable[plugin.pluginName]) return; + // If static option listener exists for this option, call in the context of the Sortable's instance of this plugin if (plugin.optionListeners && typeof plugin.optionListeners[name] === 'function') { modifiedValue = plugin.optionListeners[name].call(sortable[plugin.pluginName], value); } @@ -899,25 +783,25 @@ var PluginManager = { function dispatchEvent(_ref) { var sortable = _ref.sortable, - rootEl = _ref.rootEl, - name = _ref.name, - targetEl = _ref.targetEl, - cloneEl = _ref.cloneEl, - toEl = _ref.toEl, - fromEl = _ref.fromEl, - oldIndex = _ref.oldIndex, - newIndex = _ref.newIndex, - oldDraggableIndex = _ref.oldDraggableIndex, - newDraggableIndex = _ref.newDraggableIndex, - originalEvent = _ref.originalEvent, - putSortable = _ref.putSortable, - extraEventProperties = _ref.extraEventProperties; + rootEl = _ref.rootEl, + name = _ref.name, + targetEl = _ref.targetEl, + cloneEl = _ref.cloneEl, + toEl = _ref.toEl, + fromEl = _ref.fromEl, + oldIndex = _ref.oldIndex, + newIndex = _ref.newIndex, + oldDraggableIndex = _ref.oldDraggableIndex, + newDraggableIndex = _ref.newDraggableIndex, + originalEvent = _ref.originalEvent, + putSortable = _ref.putSortable, + extraEventProperties = _ref.extraEventProperties; sortable = sortable || rootEl && rootEl[expando]; if (!sortable) return; var evt, - options = sortable.options, - onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); // Support for new CustomEvent feature - + options = sortable.options, + onName = 'on' + name.charAt(0).toUpperCase() + name.substr(1); + // Support for new CustomEvent feature if (window.CustomEvent && !IE11OrLess && !Edge) { evt = new CustomEvent(name, { bubbles: true, @@ -927,7 +811,6 @@ function dispatchEvent(_ref) { evt = document.createEvent('Event'); evt.initEvent(name, true, true); } - evt.to = toEl || rootEl; evt.from = fromEl || rootEl; evt.item = targetEl || rootEl; @@ -938,29 +821,23 @@ function dispatchEvent(_ref) { evt.newDraggableIndex = newDraggableIndex; evt.originalEvent = originalEvent; evt.pullMode = putSortable ? putSortable.lastPutMode : undefined; - var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable)); - for (var option in allEventProperties) { evt[option] = allEventProperties[option]; } - if (rootEl) { rootEl.dispatchEvent(evt); } - if (options[onName]) { options[onName].call(sortable, evt); } } var _excluded = ["evt"]; - var pluginEvent = function pluginEvent(eventName, sortable) { var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, - originalEvent = _ref.evt, - data = _objectWithoutProperties(_ref, _excluded); - + originalEvent = _ref.evt, + data = _objectWithoutProperties(_ref, _excluded); PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({ dragEl: dragEl, parentEl: parentEl, @@ -995,7 +872,6 @@ var pluginEvent = function pluginEvent(eventName, sortable) { } }, data)); }; - function _dispatchEvent(info) { dispatchEvent(_objectSpread2({ putSortable: putSortable, @@ -1008,62 +884,61 @@ function _dispatchEvent(info) { newDraggableIndex: newDraggableIndex }, info)); } - var dragEl, - parentEl, - ghostEl, - rootEl, - nextEl, - lastDownEl, - cloneEl, - cloneHidden, - oldIndex, - newIndex, - oldDraggableIndex, - newDraggableIndex, - activeGroup, - putSortable, - awaitingDragStarted = false, - ignoreNextClick = false, - sortables = [], - tapEvt, - touchEvt, - lastDx, - lastDy, - tapDistanceLeft, - tapDistanceTop, - moved, - lastTarget, - lastDirection, - pastFirstInvertThresh = false, - isCircumstantialInvert = false, - targetMoveDistance, - // For positioning ghost absolutely -ghostRelativeParent, - ghostRelativeParentInitialScroll = [], - // (left, top) -_silent = false, - savedInputChecked = []; -/** @const */ + parentEl, + ghostEl, + rootEl, + nextEl, + lastDownEl, + cloneEl, + cloneHidden, + oldIndex, + newIndex, + oldDraggableIndex, + newDraggableIndex, + activeGroup, + putSortable, + awaitingDragStarted = false, + ignoreNextClick = false, + sortables = [], + tapEvt, + touchEvt, + lastDx, + lastDy, + tapDistanceLeft, + tapDistanceTop, + moved, + lastTarget, + lastDirection, + pastFirstInvertThresh = false, + isCircumstantialInvert = false, + targetMoveDistance, + // For positioning ghost absolutely + ghostRelativeParent, + ghostRelativeParentInitialScroll = [], + // (left, top) + + _silent = false, + savedInputChecked = []; +/** @const */ var documentExists = typeof document !== 'undefined', - PositionGhostAbsolutely = IOS, - CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float', - // This will not pass for IE9, because IE9 DnD only works on anchors -supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'), - supportCssPointerEvents = function () { - if (!documentExists) return; // false when <= IE11 - - if (IE11OrLess) { - return false; - } - - var el = document.createElement('x'); - el.style.cssText = 'pointer-events:auto'; - return el.style.pointerEvents === 'auto'; -}(), - _detectDirection = function _detectDirection(el, options) { - var elCSS = css(el), + PositionGhostAbsolutely = IOS, + CSSFloatProperty = Edge || IE11OrLess ? 'cssFloat' : 'float', + // This will not pass for IE9, because IE9 DnD only works on anchors + supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in document.createElement('div'), + supportCssPointerEvents = function () { + if (!documentExists) return; + // false when <= IE11 + if (IE11OrLess) { + return false; + } + var el = document.createElement('x'); + el.style.cssText = 'pointer-events:auto'; + return el.style.pointerEvents === 'auto'; + }(), + _detectDirection = function _detectDirection(el, options) { + var elCSS = css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = getChild(el, 0, options), child2 = getChild(el, 1, options), @@ -1071,102 +946,92 @@ supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in secondChildCSS = child2 && css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width; - - if (elCSS.display === 'flex') { - return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal'; - } - - if (elCSS.display === 'grid') { - return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal'; - } - - if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') { - var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right'; - return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal'; - } - - return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal'; -}, - _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) { - var dragElS1Opp = vertical ? dragRect.left : dragRect.top, + if (elCSS.display === 'flex') { + return elCSS.flexDirection === 'column' || elCSS.flexDirection === 'column-reverse' ? 'vertical' : 'horizontal'; + } + if (elCSS.display === 'grid') { + return elCSS.gridTemplateColumns.split(' ').length <= 1 ? 'vertical' : 'horizontal'; + } + if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== 'none') { + var touchingSideChild2 = firstChildCSS["float"] === 'left' ? 'left' : 'right'; + return child2 && (secondChildCSS.clear === 'both' || secondChildCSS.clear === touchingSideChild2) ? 'vertical' : 'horizontal'; + } + return child1 && (firstChildCSS.display === 'block' || firstChildCSS.display === 'flex' || firstChildCSS.display === 'table' || firstChildCSS.display === 'grid' || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === 'none' || child2 && elCSS[CSSFloatProperty] === 'none' && firstChildWidth + secondChildWidth > elWidth) ? 'vertical' : 'horizontal'; + }, + _dragElInRowColumn = function _dragElInRowColumn(dragRect, targetRect, vertical) { + var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height; - return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; -}, - -/** - * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold. - * @param {Number} x X position - * @param {Number} y Y position - * @return {HTMLElement} Element of the first found nearest Sortable - */ -_detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) { - var ret; - sortables.some(function (sortable) { - var threshold = sortable[expando].options.emptyInsertThreshold; - if (!threshold || lastChild(sortable)) return; - var rect = getRect(sortable), + return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; + }, + /** + * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold. + * @param {Number} x X position + * @param {Number} y Y position + * @return {HTMLElement} Element of the first found nearest Sortable + */ + _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) { + var ret; + sortables.some(function (sortable) { + var threshold = sortable[expando].options.emptyInsertThreshold; + if (!threshold || lastChild(sortable)) return; + var rect = getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold; - - if (insideHorizontally && insideVertically) { - return ret = sortable; - } - }); - return ret; -}, - _prepareGroup = function _prepareGroup(options) { - function toFn(value, pull) { - return function (to, from, dragEl, evt) { - var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; - - if (value == null && (pull || sameGroup)) { - // Default pull value - // Default pull and put value if same group - return true; - } else if (value == null || value === false) { - return false; - } else if (pull && value === 'clone') { - return value; - } else if (typeof value === 'function') { - return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt); - } else { - var otherGroup = (pull ? to : from).options.group.name; - return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; + if (insideHorizontally && insideVertically) { + return ret = sortable; } - }; - } - - var group = {}; - var originalGroup = options.group; - - if (!originalGroup || _typeof(originalGroup) != 'object') { - originalGroup = { - name: originalGroup - }; - } - - group.name = originalGroup.name; - group.checkPull = toFn(originalGroup.pull, true); - group.checkPut = toFn(originalGroup.put); - group.revertClone = originalGroup.revertClone; - options.group = group; -}, - _hideGhostForTarget = function _hideGhostForTarget() { - if (!supportCssPointerEvents && ghostEl) { - css(ghostEl, 'display', 'none'); - } -}, - _unhideGhostForTarget = function _unhideGhostForTarget() { - if (!supportCssPointerEvents && ghostEl) { - css(ghostEl, 'display', ''); - } -}; // #1184 fix - Prevent click event on fallback if dragged but item not changed position - + }); + return ret; + }, + _prepareGroup = function _prepareGroup(options) { + function toFn(value, pull) { + return function (to, from, dragEl, evt) { + var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; + if (value == null && (pull || sameGroup)) { + // Default pull value + // Default pull and put value if same group + return true; + } else if (value == null || value === false) { + return false; + } else if (pull && value === 'clone') { + return value; + } else if (typeof value === 'function') { + return toFn(value(to, from, dragEl, evt), pull)(to, from, dragEl, evt); + } else { + var otherGroup = (pull ? to : from).options.group.name; + return value === true || typeof value === 'string' && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; + } + }; + } + var group = {}; + var originalGroup = options.group; + if (!originalGroup || _typeof(originalGroup) != 'object') { + originalGroup = { + name: originalGroup + }; + } + group.name = originalGroup.name; + group.checkPull = toFn(originalGroup.pull, true); + group.checkPut = toFn(originalGroup.put); + group.revertClone = originalGroup.revertClone; + options.group = group; + }, + _hideGhostForTarget = function _hideGhostForTarget() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, 'display', 'none'); + } + }, + _unhideGhostForTarget = function _unhideGhostForTarget() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, 'display', ''); + } + }; +// #1184 fix - Prevent click event on fallback if dragged but item not changed position if (documentExists && !ChromeForAndroid) { document.addEventListener('click', function (evt) { if (ignoreNextClick) { @@ -1178,53 +1043,44 @@ if (documentExists && !ChromeForAndroid) { } }, true); } - var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent(evt) { if (dragEl) { evt = evt.touches ? evt.touches[0] : evt; - var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY); - if (nearest) { // Create imitation event var event = {}; - for (var i in evt) { if (evt.hasOwnProperty(i)) { event[i] = evt[i]; } } - event.target = event.rootEl = nearest; event.preventDefault = void 0; event.stopPropagation = void 0; - nearest[expando]._onDragOver(event); } } }; - var _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) { if (dragEl) { dragEl.parentNode[expando]._isOutsideThisEl(evt.target); } }; + /** * @class Sortable * @param {HTMLElement} el * @param {Object} [options] */ - - function Sortable(el, options) { if (!(el && el.nodeType && el.nodeType === 1)) { throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(el)); } - this.el = el; // root element + this.options = options = _extends({}, options); - this.options = options = _extends({}, options); // Export instance - + // Export instance el[expando] = this; var defaults = { group: null, @@ -1271,52 +1127,48 @@ function Sortable(el, options) { supportPointer: Sortable.supportPointer !== false && 'PointerEvent' in window && !Safari, emptyInsertThreshold: 5 }; - PluginManager.initializePlugins(this, el, defaults); // Set default options + PluginManager.initializePlugins(this, el, defaults); + // Set default options for (var name in defaults) { !(name in options) && (options[name] = defaults[name]); } + _prepareGroup(options); - _prepareGroup(options); // Bind all private methods - - + // Bind all private methods for (var fn in this) { if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { this[fn] = this[fn].bind(this); } - } // Setup drag mode - + } + // Setup drag mode this.nativeDraggable = options.forceFallback ? false : supportDraggable; - if (this.nativeDraggable) { // Touch start threshold cannot be greater than the native dragstart threshold this.options.touchStartThreshold = 1; - } // Bind events - + } + // Bind events if (options.supportPointer) { on(el, 'pointerdown', this._onTapStart); } else { on(el, 'mousedown', this._onTapStart); on(el, 'touchstart', this._onTapStart); } - if (this.nativeDraggable) { on(el, 'dragover', this); on(el, 'dragenter', this); } + sortables.push(this.el); - sortables.push(this.el); // Restore sorting - - options.store && options.store.get && this.sort(options.store.get(this) || []); // Add animation state manager + // Restore sorting + options.store && options.store.get && this.sort(options.store.get(this) || []); + // Add animation state manager _extends(this, AnimationStateManager()); } - -Sortable.prototype = -/** @lends Sortable.prototype */ -{ +Sortable.prototype = /** @lends Sortable.prototype */{ constructor: Sortable, _isOutsideThisEl: function _isOutsideThisEl(target) { if (!this.el.contains(target) && target !== this.el) { @@ -1326,57 +1178,50 @@ Sortable.prototype = _getDirection: function _getDirection(evt, target) { return typeof this.options.direction === 'function' ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction; }, - _onTapStart: function _onTapStart( - /** Event|TouchEvent */ - evt) { + _onTapStart: function _onTapStart( /** Event|TouchEvent */evt) { if (!evt.cancelable) return; - var _this = this, - el = this.el, - options = this.options, - preventOnFilter = options.preventOnFilter, - type = evt.type, - touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt, - target = (touch || evt).target, - originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, - filter = options.filter; - - _saveInputCheckedState(el); // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group. - - + el = this.el, + options = this.options, + preventOnFilter = options.preventOnFilter, + type = evt.type, + touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === 'touch' && evt, + target = (touch || evt).target, + originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, + filter = options.filter; + _saveInputCheckedState(el); + + // Don't trigger start event when an element is been dragged, otherwise the evt.oldindex always wrong when set option.group. if (dragEl) { return; } - if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) { return; // only left button and enabled - } // cancel dnd if original target is content editable - + } + // cancel dnd if original target is content editable if (originalTarget.isContentEditable) { return; - } // Safari ignores further event handling after mousedown - + } + // Safari ignores further event handling after mousedown if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === 'SELECT') { return; } - target = closest(target, options.draggable, el, false); - if (target && target.animated) { return; } - if (lastDownEl === target) { // Ignoring duplicate `down` return; - } // Get the index of the dragged element within its parent - + } + // Get the index of the dragged element within its parent oldIndex = index(target); - oldDraggableIndex = index(target, options.draggable); // Check filter + oldDraggableIndex = index(target, options.draggable); + // Check filter if (typeof filter === 'function') { if (filter.call(this, evt, target, this)) { _dispatchEvent({ @@ -1387,7 +1232,6 @@ Sortable.prototype = toEl: el, fromEl: el }); - pluginEvent('filter', _this, { evt: evt }); @@ -1397,7 +1241,6 @@ Sortable.prototype = } else if (filter) { filter = filter.split(',').some(function (criteria) { criteria = closest(originalTarget, criteria.trim(), el, false); - if (criteria) { _dispatchEvent({ sortable: _this, @@ -1407,40 +1250,30 @@ Sortable.prototype = fromEl: el, toEl: el }); - pluginEvent('filter', _this, { evt: evt }); return true; } }); - if (filter) { preventOnFilter && evt.cancelable && evt.preventDefault(); return; // cancel dnd } } - if (options.handle && !closest(originalTarget, options.handle, el, false)) { return; - } // Prepare `dragstart` - + } + // Prepare `dragstart` this._prepareDragStart(evt, touch, target); }, - _prepareDragStart: function _prepareDragStart( - /** Event */ - evt, - /** Touch */ - touch, - /** HTMLElement */ - target) { + _prepareDragStart: function _prepareDragStart( /** Event */evt, /** Touch */touch, /** HTMLElement */target) { var _this = this, - el = _this.el, - options = _this.options, - ownerDocument = el.ownerDocument, - dragStartFn; - + el = _this.el, + options = _this.options, + ownerDocument = el.ownerDocument, + dragStartFn; if (target && !dragEl && target.parentNode === el) { var dragRect = getRect(target); rootEl = el; @@ -1460,41 +1293,36 @@ Sortable.prototype = this._lastX = (touch || evt).clientX; this._lastY = (touch || evt).clientY; dragEl.style['will-change'] = 'all'; - dragStartFn = function dragStartFn() { pluginEvent('delayEnded', _this, { evt: evt }); - if (Sortable.eventCanceled) { _this._onDrop(); - return; - } // Delayed drag has been triggered + } + // Delayed drag has been triggered // we can re-enable the events: touchmove/mousemove - - _this._disableDelayedDragEvents(); - if (!FireFox && _this.nativeDraggable) { dragEl.draggable = true; - } // Bind the events: dragstart/dragend - - - _this._triggerDragStart(evt, touch); // Drag start event + } + // Bind the events: dragstart/dragend + _this._triggerDragStart(evt, touch); + // Drag start event _dispatchEvent({ sortable: _this, name: 'choose', originalEvent: evt - }); // Chosen item - + }); + // Chosen item toggleClass(dragEl, options.chosenClass, true); - }; // Disable "draggable" - + }; + // Disable "draggable" options.ignore.split(',').forEach(function (criteria) { find(dragEl, criteria.trim(), _disableDraggable); }); @@ -1503,27 +1331,26 @@ Sortable.prototype = on(ownerDocument, 'touchmove', nearestEmptyInsertDetectEvent); on(ownerDocument, 'mouseup', _this._onDrop); on(ownerDocument, 'touchend', _this._onDrop); - on(ownerDocument, 'touchcancel', _this._onDrop); // Make dragEl draggable (must be before delay for FireFox) + on(ownerDocument, 'touchcancel', _this._onDrop); + // Make dragEl draggable (must be before delay for FireFox) if (FireFox && this.nativeDraggable) { this.options.touchStartThreshold = 4; dragEl.draggable = true; } - pluginEvent('delayStart', this, { evt: evt - }); // Delay is impossible for native DnD in Edge or IE + }); + // Delay is impossible for native DnD in Edge or IE if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) { if (Sortable.eventCanceled) { this._onDrop(); - return; - } // If the user moves the pointer or let go the click or touch + } + // If the user moves the pointer or let go the click or touch // before the delay has been reached: // disable the delayed drag - - on(ownerDocument, 'mouseup', _this._disableDelayedDrag); on(ownerDocument, 'touchend', _this._disableDelayedDrag); on(ownerDocument, 'touchcancel', _this._disableDelayedDrag); @@ -1536,11 +1363,8 @@ Sortable.prototype = } } }, - _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( - /** TouchEvent|PointerEvent **/ - e) { + _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler( /** TouchEvent|PointerEvent **/e) { var touch = e.touches ? e.touches[0] : e; - if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) { this._disableDelayedDrag(); } @@ -1548,7 +1372,6 @@ Sortable.prototype = _disableDelayedDrag: function _disableDelayedDrag() { dragEl && _disableDraggable(dragEl); clearTimeout(this._dragStartTimer); - this._disableDelayedDragEvents(); }, _disableDelayedDragEvents: function _disableDelayedDragEvents() { @@ -1560,13 +1383,8 @@ Sortable.prototype = off(ownerDocument, 'touchmove', this._delayedDragTouchMoveHandler); off(ownerDocument, 'pointermove', this._delayedDragTouchMoveHandler); }, - _triggerDragStart: function _triggerDragStart( - /** Event */ - evt, - /** Touch */ - touch) { + _triggerDragStart: function _triggerDragStart( /** Event */evt, /** Touch */touch) { touch = touch || evt.pointerType == 'touch' && evt; - if (!this.nativeDraggable || touch) { if (this.options.supportPointer) { on(document, 'pointermove', this._onTouchMove); @@ -1579,7 +1397,6 @@ Sortable.prototype = on(dragEl, 'dragend', this); on(rootEl, 'dragstart', this._onDragStart); } - try { if (document.selection) { // Timeout neccessary for IE9 @@ -1592,25 +1409,23 @@ Sortable.prototype = } catch (err) {} }, _dragStarted: function _dragStarted(fallback, evt) { - awaitingDragStarted = false; - if (rootEl && dragEl) { pluginEvent('dragStarted', this, { evt: evt }); - if (this.nativeDraggable) { on(document, 'dragover', _checkOutsideTargetEl); } + var options = this.options; - var options = this.options; // Apply effect - + // Apply effect !fallback && toggleClass(dragEl, options.dragClass, false); toggleClass(dragEl, options.ghostClass, true); Sortable.active = this; - fallback && this._appendGhost(); // Drag start event + fallback && this._appendGhost(); + // Drag start event _dispatchEvent({ sortable: this, name: 'start', @@ -1624,20 +1439,15 @@ Sortable.prototype = if (touchEvt) { this._lastX = touchEvt.clientX; this._lastY = touchEvt.clientY; - _hideGhostForTarget(); - var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY); var parent = target; - while (target && target.shadowRoot) { target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY); if (target === parent) break; parent = target; } - dragEl.parentNode[expando]._isOutsideThisEl(target); - if (parent) { do { if (parent[expando]) { @@ -1648,44 +1458,37 @@ Sortable.prototype = target: target, rootEl: parent }); - if (inserted && !this.options.dragoverBubble) { break; } } - target = parent; // store last element } - /* jshint boss:true */ - while (parent = parent.parentNode); + /* jshint boss:true */ while (parent = parent.parentNode); } - _unhideGhostForTarget(); } }, - _onTouchMove: function _onTouchMove( - /**TouchEvent*/ - evt) { + _onTouchMove: function _onTouchMove( /**TouchEvent*/evt) { if (tapEvt) { var options = this.options, - fallbackTolerance = options.fallbackTolerance, - fallbackOffset = options.fallbackOffset, - touch = evt.touches ? evt.touches[0] : evt, - ghostMatrix = ghostEl && matrix(ghostEl, true), - scaleX = ghostEl && ghostMatrix && ghostMatrix.a, - scaleY = ghostEl && ghostMatrix && ghostMatrix.d, - relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), - dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), - dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); // only set the status to dragging, when we are actually dragging - + fallbackTolerance = options.fallbackTolerance, + fallbackOffset = options.fallbackOffset, + touch = evt.touches ? evt.touches[0] : evt, + ghostMatrix = ghostEl && matrix(ghostEl, true), + scaleX = ghostEl && ghostMatrix && ghostMatrix.a, + scaleY = ghostEl && ghostMatrix && ghostMatrix.d, + relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), + dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), + dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); + + // only set the status to dragging, when we are actually dragging if (!Sortable.active && !awaitingDragStarted) { if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) { return; } - this._onDragStart(evt, true); } - if (ghostEl) { if (ghostMatrix) { ghostMatrix.e += dx - (lastDx || 0); @@ -1700,7 +1503,6 @@ Sortable.prototype = f: dy }; } - var cssMatrix = "matrix(".concat(ghostMatrix.a, ",").concat(ghostMatrix.b, ",").concat(ghostMatrix.c, ",").concat(ghostMatrix.d, ",").concat(ghostMatrix.e, ",").concat(ghostMatrix.f, ")"); css(ghostEl, 'webkitTransform', cssMatrix); css(ghostEl, 'mozTransform', cssMatrix); @@ -1710,7 +1512,6 @@ Sortable.prototype = lastDy = dy; touchEvt = touch; } - evt.cancelable && evt.preventDefault(); } }, @@ -1719,17 +1520,16 @@ Sortable.prototype = // Not being adjusted for if (!ghostEl) { var container = this.options.fallbackOnBody ? document.body : rootEl, - rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), - options = this.options; // Position absolutely + rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), + options = this.options; + // Position absolutely if (PositionGhostAbsolutely) { // Get relatively positioned parent ghostRelativeParent = container; - while (css(ghostRelativeParent, 'position') === 'static' && css(ghostRelativeParent, 'transform') === 'none' && ghostRelativeParent !== document) { ghostRelativeParent = ghostRelativeParent.parentNode; } - if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) { if (ghostRelativeParent === document) ghostRelativeParent = getWindowScrollingElement(); rect.top += ghostRelativeParent.scrollTop; @@ -1737,10 +1537,8 @@ Sortable.prototype = } else { ghostRelativeParent = getWindowScrollingElement(); } - ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent); } - ghostEl = dragEl.cloneNode(true); toggleClass(ghostEl, options.ghostClass, false); toggleClass(ghostEl, options.fallbackClass, true); @@ -1758,62 +1556,50 @@ Sortable.prototype = css(ghostEl, 'zIndex', '100000'); css(ghostEl, 'pointerEvents', 'none'); Sortable.ghost = ghostEl; - container.appendChild(ghostEl); // Set transform-origin + container.appendChild(ghostEl); + // Set transform-origin css(ghostEl, 'transform-origin', tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + '% ' + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + '%'); } }, - _onDragStart: function _onDragStart( - /**Event*/ - evt, - /**boolean*/ - fallback) { + _onDragStart: function _onDragStart( /**Event*/evt, /**boolean*/fallback) { var _this = this; - var dataTransfer = evt.dataTransfer; var options = _this.options; pluginEvent('dragStart', this, { evt: evt }); - if (Sortable.eventCanceled) { this._onDrop(); - return; } - pluginEvent('setupClone', this); - if (!Sortable.eventCanceled) { cloneEl = clone(dragEl); cloneEl.removeAttribute("id"); cloneEl.draggable = false; cloneEl.style['will-change'] = ''; - this._hideClone(); - toggleClass(cloneEl, this.options.chosenClass, false); Sortable.clone = cloneEl; - } // #1143: IFrame support workaround - + } + // #1143: IFrame support workaround _this.cloneId = _nextTick(function () { pluginEvent('clone', _this); if (Sortable.eventCanceled) return; - if (!_this.options.removeCloneOnHide) { rootEl.insertBefore(cloneEl, dragEl); } - _this._hideClone(); - _dispatchEvent({ sortable: _this, name: 'clone' }); }); - !fallback && toggleClass(dragEl, options.dragClass, true); // Set proper drop events + !fallback && toggleClass(dragEl, options.dragClass, true); + // Set proper drop events if (fallback) { ignoreNextClick = true; _this._loopId = setInterval(_this._emulateDragOver, 50); @@ -1822,47 +1608,40 @@ Sortable.prototype = off(document, 'mouseup', _this._onDrop); off(document, 'touchend', _this._onDrop); off(document, 'touchcancel', _this._onDrop); - if (dataTransfer) { dataTransfer.effectAllowed = 'move'; options.setData && options.setData.call(_this, dataTransfer, dragEl); } + on(document, 'drop', _this); - on(document, 'drop', _this); // #1276 fix: - + // #1276 fix: css(dragEl, 'transform', 'translateZ(0)'); } - awaitingDragStarted = true; _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt)); on(document, 'selectstart', _this); moved = true; - if (Safari) { css(document.body, 'user-select', 'none'); } }, // Returns true - if no further action is needed (either inserted or another condition) - _onDragOver: function _onDragOver( - /**Event*/ - evt) { + _onDragOver: function _onDragOver( /**Event*/evt) { var el = this.el, - target = evt.target, - dragRect, - targetRect, - revert, - options = this.options, - group = options.group, - activeSortable = Sortable.active, - isOwner = activeGroup === group, - canSort = options.sort, - fromSortable = putSortable || activeSortable, - vertical, - _this = this, - completedFired = false; - + target = evt.target, + dragRect, + targetRect, + revert, + options = this.options, + group = options.group, + activeSortable = Sortable.active, + isOwner = activeGroup === group, + canSort = options.sort, + fromSortable = putSortable || activeSortable, + vertical, + _this = this, + completedFired = false; if (_silent) return; - function dragOverEvent(name, extra) { pluginEvent(name, _this, _objectSpread2({ evt: evt, @@ -1880,25 +1659,22 @@ Sortable.prototype = }, changed: changed }, extra)); - } // Capture animation state - + } + // Capture animation state function capture() { dragOverEvent('dragOverAnimationCapture'); - _this.captureAnimationState(); - if (_this !== fromSortable) { fromSortable.captureAnimationState(); } - } // Return invocation when dragEl is inserted (or completed) - + } + // Return invocation when dragEl is inserted (or completed) function completed(insertion) { dragOverEvent('dragOverCompleted', { insertion: insertion }); - if (insertion) { // Clones must be hidden before folding animation to capture dragRectAbsolute properly if (isOwner) { @@ -1906,57 +1682,51 @@ Sortable.prototype = } else { activeSortable._showClone(_this); } - if (_this !== fromSortable) { // Set ghost class to new sortable's ghost class toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false); toggleClass(dragEl, options.ghostClass, true); } - if (putSortable !== _this && _this !== Sortable.active) { putSortable = _this; } else if (_this === Sortable.active && putSortable) { putSortable = null; - } // Animation - + } + // Animation if (fromSortable === _this) { _this._ignoreWhileAnimating = target; } - _this.animateAll(function () { dragOverEvent('dragOverAnimationComplete'); _this._ignoreWhileAnimating = null; }); - if (_this !== fromSortable) { fromSortable.animateAll(); fromSortable._ignoreWhileAnimating = null; } - } // Null lastTarget if it is not inside a previously swapped element - + } + // Null lastTarget if it is not inside a previously swapped element if (target === dragEl && !dragEl.animated || target === el && !target.animated) { lastTarget = null; - } // no bubbling and not fallback - + } + // no bubbling and not fallback if (!options.dragoverBubble && !evt.rootEl && target !== document) { - dragEl.parentNode[expando]._isOutsideThisEl(evt.target); // Do not detect for empty insert if already inserted - + dragEl.parentNode[expando]._isOutsideThisEl(evt.target); + // Do not detect for empty insert if already inserted !insertion && nearestEmptyInsertDetectEvent(evt); } - !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation(); return completedFired = true; - } // Call when dragEl has been inserted - + } + // Call when dragEl has been inserted function changed() { newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); - _dispatchEvent({ sortable: _this, name: 'change', @@ -1966,37 +1736,27 @@ Sortable.prototype = originalEvent: evt }); } - if (evt.preventDefault !== void 0) { evt.cancelable && evt.preventDefault(); } - target = closest(target, options.draggable, el, true); dragOverEvent('dragOver'); if (Sortable.eventCanceled) return completedFired; - if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) { return completed(false); } - ignoreNextClick = false; - if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) { vertical = this._getDirection(evt, target) === 'vertical'; dragRect = getRect(dragEl); dragOverEvent('dragOverValid'); if (Sortable.eventCanceled) return completedFired; - if (revert) { parentEl = rootEl; // actualization - capture(); - this._hideClone(); - dragOverEvent('revert'); - if (!Sortable.eventCanceled) { if (nextEl) { rootEl.insertBefore(dragEl, nextEl); @@ -2004,38 +1764,32 @@ Sortable.prototype = rootEl.appendChild(dragEl); } } - return completed(true); } - var elLastChild = lastChild(el, options.draggable); - if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) { // Insert to end of list + // If already at end of list: Do not insert if (elLastChild === dragEl) { return completed(false); - } // if there is a last element, it is the target - + } + // if there is a last element, it is the target if (elLastChild && el === evt.target) { target = elLastChild; } - if (target) { targetRect = getRect(target); } - if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) { capture(); - if (elLastChild && elLastChild.nextSibling) { // the last draggable element is not the last node el.insertBefore(dragEl, elLastChild.nextSibling); } else { el.appendChild(dragEl); } - parentEl = el; // actualization changed(); @@ -2044,14 +1798,11 @@ Sortable.prototype = } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) { // Insert to start of list var firstChild = getChild(el, 0, options, true); - if (firstChild === dragEl) { return completed(false); } - target = firstChild; targetRect = getRect(target); - if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) { capture(); el.insertBefore(dragEl, firstChild); @@ -2063,82 +1814,68 @@ Sortable.prototype = } else if (target.parentNode === el) { targetRect = getRect(target); var direction = 0, - targetBeforeFirstSwap, - differentLevel = dragEl.parentNode !== el, - differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), - side1 = vertical ? 'top' : 'left', - scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'), - scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; - + targetBeforeFirstSwap, + differentLevel = dragEl.parentNode !== el, + differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), + side1 = vertical ? 'top' : 'left', + scrolledPastTop = isScrolledPast(target, 'top', 'top') || isScrolledPast(dragEl, 'top', 'top'), + scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; if (lastTarget !== target) { targetBeforeFirstSwap = targetRect[side1]; pastFirstInvertThresh = false; isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel; } - direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target); var sibling; - if (direction !== 0) { // Check if target is beside dragEl in respective direction (ignoring hidden elements) var dragIndex = index(dragEl); - do { dragIndex -= direction; sibling = parentEl.children[dragIndex]; } while (sibling && (css(sibling, 'display') === 'none' || sibling === ghostEl)); - } // If dragEl is already beside target: Do not insert - - + } + // If dragEl is already beside target: Do not insert if (direction === 0 || sibling === target) { return completed(false); } - lastTarget = target; lastDirection = direction; var nextSibling = target.nextElementSibling, - after = false; + after = false; after = direction === 1; - var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after); - if (moveVector !== false) { if (moveVector === 1 || moveVector === -1) { after = moveVector === 1; } - _silent = true; setTimeout(_unsilent, 30); capture(); - if (after && !nextSibling) { el.appendChild(dragEl); } else { target.parentNode.insertBefore(dragEl, after ? nextSibling : target); - } // Undo chrome's scroll adjustment (has no effect on other browsers) - + } + // Undo chrome's scroll adjustment (has no effect on other browsers) if (scrolledPastTop) { scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop); } - parentEl = dragEl.parentNode; // actualization - // must be done before animation + // must be done before animation if (targetBeforeFirstSwap !== undefined && !isCircumstantialInvert) { targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]); } - changed(); return completed(true); } } - if (el.contains(dragEl)) { return completed(false); } } - return false; }, _ignoreWhileAnimating: null, @@ -2158,83 +1895,69 @@ Sortable.prototype = off(ownerDocument, 'touchcancel', this._onDrop); off(document, 'selectstart', this); }, - _onDrop: function _onDrop( - /**Event*/ - evt) { + _onDrop: function _onDrop( /**Event*/evt) { var el = this.el, - options = this.options; // Get the index of the dragged element within its parent + options = this.options; + // Get the index of the dragged element within its parent newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); pluginEvent('drop', this, { evt: evt }); - parentEl = dragEl && dragEl.parentNode; // Get again after plugin event + parentEl = dragEl && dragEl.parentNode; + // Get again after plugin event newIndex = index(dragEl); newDraggableIndex = index(dragEl, options.draggable); - if (Sortable.eventCanceled) { this._nulling(); - return; } - awaitingDragStarted = false; isCircumstantialInvert = false; pastFirstInvertThresh = false; clearInterval(this._loopId); clearTimeout(this._dragStartTimer); - _cancelNextTick(this.cloneId); + _cancelNextTick(this._dragStartId); - _cancelNextTick(this._dragStartId); // Unbind events - - + // Unbind events if (this.nativeDraggable) { off(document, 'drop', this); off(el, 'dragstart', this._onDragStart); } - this._offMoveEvents(); - this._offUpEvents(); - if (Safari) { css(document.body, 'user-select', ''); } - css(dragEl, 'transform', ''); - if (evt) { if (moved) { evt.cancelable && evt.preventDefault(); !options.dropBubble && evt.stopPropagation(); } - ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl); - if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { // Remove clone(s) cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl); } - if (dragEl) { if (this.nativeDraggable) { off(dragEl, 'dragend', this); } - _disableDraggable(dragEl); + dragEl.style['will-change'] = ''; - dragEl.style['will-change'] = ''; // Remove classes + // Remove classes // ghostClass is added in dragStarted - if (moved && !awaitingDragStarted) { toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false); } + toggleClass(dragEl, this.options.chosenClass, false); - toggleClass(dragEl, this.options.chosenClass, false); // Drag stop event - + // Drag stop event _dispatchEvent({ sortable: this, name: 'unchoose', @@ -2243,7 +1966,6 @@ Sortable.prototype = newDraggableIndex: null, originalEvent: evt }); - if (rootEl !== parentEl) { if (newIndex >= 0) { // Add event @@ -2253,17 +1975,17 @@ Sortable.prototype = toEl: parentEl, fromEl: rootEl, originalEvent: evt - }); // Remove event - + }); + // Remove event _dispatchEvent({ sortable: this, name: 'remove', toEl: parentEl, originalEvent: evt - }); // drag from one list and drop into another - + }); + // drag from one list and drop into another _dispatchEvent({ rootEl: parentEl, name: 'sort', @@ -2271,7 +1993,6 @@ Sortable.prototype = fromEl: rootEl, originalEvent: evt }); - _dispatchEvent({ sortable: this, name: 'sort', @@ -2279,7 +2000,6 @@ Sortable.prototype = originalEvent: evt }); } - putSortable && putSortable.save(); } else { if (newIndex !== oldIndex) { @@ -2291,7 +2011,6 @@ Sortable.prototype = toEl: parentEl, originalEvent: evt }); - _dispatchEvent({ sortable: this, name: 'sort', @@ -2301,27 +2020,24 @@ Sortable.prototype = } } } - if (Sortable.active) { /* jshint eqnull:true */ if (newIndex == null || newIndex === -1) { newIndex = oldIndex; newDraggableIndex = oldDraggableIndex; } - _dispatchEvent({ sortable: this, name: 'end', toEl: parentEl, originalEvent: evt - }); // Save sorting - + }); + // Save sorting this.save(); } } } - this._nulling(); }, _nulling: function _nulling() { @@ -2332,65 +2048,52 @@ Sortable.prototype = }); savedInputChecked.length = lastDx = lastDy = 0; }, - handleEvent: function handleEvent( - /**Event*/ - evt) { + handleEvent: function handleEvent( /**Event*/evt) { switch (evt.type) { case 'drop': case 'dragend': this._onDrop(evt); - break; - case 'dragenter': case 'dragover': if (dragEl) { this._onDragOver(evt); - _globalDragOver(evt); } - break; - case 'selectstart': evt.preventDefault(); break; } }, - /** * Serializes the item into an array of string. * @returns {String[]} */ toArray: function toArray() { var order = [], - el, - children = this.el.children, - i = 0, - n = children.length, - options = this.options; - + el, + children = this.el.children, + i = 0, + n = children.length, + options = this.options; for (; i < n; i++) { el = children[i]; - if (closest(el, options.draggable, this.el, false)) { order.push(el.getAttribute(options.dataIdAttr) || _generateId(el)); } } - return order; }, - /** * Sorts the elements according to the array. * @param {String[]} order order of the items */ sort: function sort(order, useAnimation) { var items = {}, - rootEl = this.el; + rootEl = this.el; this.toArray().forEach(function (id, i) { var el = rootEl.children[i]; - if (closest(el, this.options.draggable, rootEl, false)) { items[id] = el; } @@ -2404,7 +2107,6 @@ Sortable.prototype = }); useAnimation && this.animateAll(); }, - /** * Save the current sorting */ @@ -2412,7 +2114,6 @@ Sortable.prototype = var store = this.options.store; store && store.set && store.set(this); }, - /** * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree. * @param {HTMLElement} el @@ -2422,7 +2123,6 @@ Sortable.prototype = closest: function closest$1(el, selector) { return closest(el, selector || this.options.draggable, this.el, false); }, - /** * Set/get option * @param {string} name @@ -2431,24 +2131,20 @@ Sortable.prototype = */ option: function option(name, value) { var options = this.options; - if (value === void 0) { return options[name]; } else { var modifiedValue = PluginManager.modifyOption(this, name, value); - if (typeof modifiedValue !== 'undefined') { options[name] = modifiedValue; } else { options[name] = value; } - if (name === 'group') { _prepareGroup(options); } } }, - /** * Destroy */ @@ -2459,21 +2155,16 @@ Sortable.prototype = off(el, 'mousedown', this._onTapStart); off(el, 'touchstart', this._onTapStart); off(el, 'pointerdown', this._onTapStart); - if (this.nativeDraggable) { off(el, 'dragover', this); off(el, 'dragenter', this); - } // Remove draggable attributes - - + } + // Remove draggable attributes Array.prototype.forEach.call(el.querySelectorAll('[draggable]'), function (el) { el.removeAttribute('draggable'); }); - this._onDrop(); - this._disableDelayedDragEvents(); - sortables.splice(sortables.indexOf(this.el), 1); this.el = el = null; }, @@ -2482,25 +2173,22 @@ Sortable.prototype = pluginEvent('hideClone', this); if (Sortable.eventCanceled) return; css(cloneEl, 'display', 'none'); - if (this.options.removeCloneOnHide && cloneEl.parentNode) { cloneEl.parentNode.removeChild(cloneEl); } - cloneHidden = true; } }, _showClone: function _showClone(putSortable) { if (putSortable.lastPutMode !== 'clone') { this._hideClone(); - return; } - if (cloneHidden) { pluginEvent('showClone', this); - if (Sortable.eventCanceled) return; // show clone at dragEl or original position + if (Sortable.eventCanceled) return; + // show clone at dragEl or original position if (dragEl.parentNode == rootEl && !this.options.group.revertClone) { rootEl.insertBefore(cloneEl, dragEl); } else if (nextEl) { @@ -2508,33 +2196,26 @@ Sortable.prototype = } else { rootEl.appendChild(cloneEl); } - if (this.options.group.revertClone) { this.animate(dragEl, cloneEl); } - css(cloneEl, 'display', ''); cloneHidden = false; } } }; - -function _globalDragOver( -/**Event*/ -evt) { +function _globalDragOver( /**Event*/evt) { if (evt.dataTransfer) { evt.dataTransfer.dropEffect = 'move'; } - evt.cancelable && evt.preventDefault(); } - function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) { var evt, - sortable = fromEl[expando], - onMoveFn = sortable.options.onMove, - retVal; // Support for new CustomEvent feature - + sortable = fromEl[expando], + onMoveFn = sortable.options.onMove, + retVal; + // Support for new CustomEvent feature if (window.CustomEvent && !IE11OrLess && !Edge) { evt = new CustomEvent('move', { bubbles: true, @@ -2544,7 +2225,6 @@ function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalE evt = document.createEvent('Event'); evt.initEvent('move', true, true); } - evt.to = toEl; evt.from = fromEl; evt.dragged = dragEl; @@ -2554,41 +2234,35 @@ function _onMove(fromEl, toEl, dragEl, dragRect, targetEl, targetRect, originalE evt.willInsertAfter = willInsertAfter; evt.originalEvent = originalEvent; fromEl.dispatchEvent(evt); - if (onMoveFn) { retVal = onMoveFn.call(sortable, evt, originalEvent); } - return retVal; } - function _disableDraggable(el) { el.draggable = false; } - function _unsilent() { _silent = false; } - function _ghostIsFirst(evt, vertical, sortable) { - var rect = getRect(getChild(sortable.el, 0, sortable.options, true)); + var firstElRect = getRect(getChild(sortable.el, 0, sortable.options, true)); + var sortableContentRect = getContentRect(sortable.el); var spacer = 10; - return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left; + return vertical ? evt.clientX < sortableContentRect.left - spacer || evt.clientY < firstElRect.top && evt.clientX < firstElRect.right : evt.clientY < sortableContentRect.top - spacer || evt.clientY < firstElRect.bottom && evt.clientX < firstElRect.left; } - function _ghostIsLast(evt, vertical, sortable) { - var rect = getRect(lastChild(sortable.el, sortable.options.draggable)); + var lastElRect = getRect(lastChild(sortable.el, sortable.options.draggable)); + var sortableContentRect = getContentRect(sortable.el); var spacer = 10; - return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer; + return vertical ? evt.clientX > sortableContentRect.right + spacer || evt.clientY > lastElRect.bottom && evt.clientX > lastElRect.left : evt.clientY > sortableContentRect.bottom + spacer || evt.clientX > lastElRect.right && evt.clientY > lastElRect.top; } - function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) { var mouseOnAxis = vertical ? evt.clientY : evt.clientX, - targetLength = vertical ? targetRect.height : targetRect.width, - targetS1 = vertical ? targetRect.top : targetRect.left, - targetS2 = vertical ? targetRect.bottom : targetRect.right, - invert = false; - + targetLength = vertical ? targetRect.height : targetRect.width, + targetS1 = vertical ? targetRect.top : targetRect.left, + targetS2 = vertical ? targetRect.bottom : targetRect.right, + invert = false; if (!invertSwap) { // Never invert or create dragEl shadow when target movemenet causes mouse to move past the end of regular swapThreshold if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) { @@ -2598,7 +2272,6 @@ function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, inv // past first invert threshold, do not restrict inverted threshold to dragEl shadow pastFirstInvertThresh = true; } - if (!pastFirstInvertThresh) { // dragEl shadow (target move distance shadow) if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance // over dragEl shadow @@ -2615,26 +2288,22 @@ function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, inv } } } - invert = invert || invertSwap; - if (invert) { // Invert of regular if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) { return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1; } } - return 0; } + /** * Gets the direction dragEl must be swapped relative to target in order to make it * seem that dragEl has been "inserted" into that element's position * @param {HTMLElement} target The target whose position dragEl is being inserted at * @return {Number} Direction dragEl must be swapped */ - - function _getInsertDirection(target) { if (index(dragEl) < index(target)) { return 1; @@ -2642,55 +2311,48 @@ function _getInsertDirection(target) { return -1; } } + /** * Generate id * @param {HTMLElement} el * @returns {String} * @private */ - - function _generateId(el) { var str = el.tagName + el.className + el.src + el.href + el.textContent, - i = str.length, - sum = 0; - + i = str.length, + sum = 0; while (i--) { sum += str.charCodeAt(i); } - return sum.toString(36); } - function _saveInputCheckedState(root) { savedInputChecked.length = 0; var inputs = root.getElementsByTagName('input'); var idx = inputs.length; - while (idx--) { var el = inputs[idx]; el.checked && savedInputChecked.push(el); } } - function _nextTick(fn) { return setTimeout(fn, 0); } - function _cancelNextTick(id) { return clearTimeout(id); -} // Fixed #973: - +} +// Fixed #973: if (documentExists) { on(document, 'touchmove', function (evt) { if ((Sortable.active || awaitingDragStarted) && evt.cancelable) { evt.preventDefault(); } }); -} // Export utils - +} +// Export utils Sortable.utils = { on: on, off: off, @@ -2710,59 +2372,54 @@ Sortable.utils = { detectDirection: _detectDirection, getChild: getChild }; + /** * Get the Sortable instance of an element * @param {HTMLElement} element The element * @return {Sortable|undefined} The instance of Sortable */ - Sortable.get = function (element) { return element[expando]; }; + /** * Mount a plugin to Sortable * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted */ - - Sortable.mount = function () { for (var _len = arguments.length, plugins = new Array(_len), _key = 0; _key < _len; _key++) { plugins[_key] = arguments[_key]; } - if (plugins[0].constructor === Array) plugins = plugins[0]; plugins.forEach(function (plugin) { if (!plugin.prototype || !plugin.prototype.constructor) { throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin)); } - if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils); PluginManager.mount(plugin); }); }; + /** * Create sortable instance * @param {HTMLElement} el * @param {Object} [options] */ - - Sortable.create = function (el, options) { return new Sortable(el, options); -}; // Export - +}; +// Export Sortable.version = version; var autoScrolls = [], - scrollEl, - scrollRootEl, - scrolling = false, - lastAutoScrollX, - lastAutoScrollY, - touchEvt$1, - pointerElemChangedInterval; - + scrollEl, + scrollRootEl, + scrolling = false, + lastAutoScrollX, + lastAutoScrollY, + touchEvt$1, + pointerElemChangedInterval; function AutoScrollPlugin() { function AutoScroll() { this.defaults = { @@ -2771,19 +2428,18 @@ function AutoScrollPlugin() { scrollSensitivity: 30, scrollSpeed: 10, bubbleScroll: true - }; // Bind all private methods + }; + // Bind all private methods for (var fn in this) { if (fn.charAt(0) === '_' && typeof this[fn] === 'function') { this[fn] = this[fn].bind(this); } } } - AutoScroll.prototype = { dragStarted: function dragStarted(_ref) { var originalEvent = _ref.originalEvent; - if (this.sortable.nativeDraggable) { on(document, 'dragover', this._handleAutoScroll); } else { @@ -2798,7 +2454,6 @@ function AutoScrollPlugin() { }, dragOverCompleted: function dragOverCompleted(_ref2) { var originalEvent = _ref2.originalEvent; - // For when bubbling is canceled and using fallback (fallback 'touchmove' always reached) if (!this.options.dragOverBubble && !originalEvent.rootEl) { this._handleAutoScroll(originalEvent); @@ -2812,7 +2467,6 @@ function AutoScrollPlugin() { off(document, 'touchmove', this._handleFallbackAutoScroll); off(document, 'mousemove', this._handleFallbackAutoScroll); } - clearPointerElemChangedInterval(); clearAutoScrolls(); cancelThrottle(); @@ -2826,31 +2480,29 @@ function AutoScrollPlugin() { }, _handleAutoScroll: function _handleAutoScroll(evt, fallback) { var _this = this; - var x = (evt.touches ? evt.touches[0] : evt).clientX, - y = (evt.touches ? evt.touches[0] : evt).clientY, - elem = document.elementFromPoint(x, y); - touchEvt$1 = evt; // IE does not seem to have native autoscroll, + y = (evt.touches ? evt.touches[0] : evt).clientY, + elem = document.elementFromPoint(x, y); + touchEvt$1 = evt; + + // IE does not seem to have native autoscroll, // Edge's autoscroll seems too conditional, // MACOS Safari does not have autoscroll, // Firefox and Chrome are good - if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) { - autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change + autoScroll(evt, this.options, elem, fallback); + // Listener for pointer element change var ogElemScroller = getParentAutoScrollElement(elem, true); - if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) { - pointerElemChangedInterval && clearPointerElemChangedInterval(); // Detect for pointer elem change, emulating native DnD behaviour - + pointerElemChangedInterval && clearPointerElemChangedInterval(); + // Detect for pointer elem change, emulating native DnD behaviour pointerElemChangedInterval = setInterval(function () { var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true); - if (newElem !== ogElemScroller) { ogElemScroller = newElem; clearAutoScrolls(); } - autoScroll(evt, _this.options, newElem, fallback); }, 10); lastAutoScrollX = x; @@ -2862,7 +2514,6 @@ function AutoScrollPlugin() { clearAutoScrolls(); return; } - autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false); } } @@ -2872,60 +2523,54 @@ function AutoScrollPlugin() { initializeByDefault: true }); } - function clearAutoScrolls() { autoScrolls.forEach(function (autoScroll) { clearInterval(autoScroll.pid); }); autoScrolls = []; } - function clearPointerElemChangedInterval() { clearInterval(pointerElemChangedInterval); } - var autoScroll = throttle(function (evt, options, rootEl, isFallback) { // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521 if (!options.scroll) return; var x = (evt.touches ? evt.touches[0] : evt).clientX, - y = (evt.touches ? evt.touches[0] : evt).clientY, - sens = options.scrollSensitivity, - speed = options.scrollSpeed, - winScroller = getWindowScrollingElement(); + y = (evt.touches ? evt.touches[0] : evt).clientY, + sens = options.scrollSensitivity, + speed = options.scrollSpeed, + winScroller = getWindowScrollingElement(); var scrollThisInstance = false, - scrollCustomFn; // New scroll root, set scrollEl + scrollCustomFn; + // New scroll root, set scrollEl if (scrollRootEl !== rootEl) { scrollRootEl = rootEl; clearAutoScrolls(); scrollEl = options.scroll; scrollCustomFn = options.scrollFn; - if (scrollEl === true) { scrollEl = getParentAutoScrollElement(rootEl, true); } } - var layersOut = 0; var currentParent = scrollEl; - do { var el = currentParent, - rect = getRect(el), - top = rect.top, - bottom = rect.bottom, - left = rect.left, - right = rect.right, - width = rect.width, - height = rect.height, - canScrollX = void 0, - canScrollY = void 0, - scrollWidth = el.scrollWidth, - scrollHeight = el.scrollHeight, - elCSS = css(el), - scrollPosX = el.scrollLeft, - scrollPosY = el.scrollTop; - + rect = getRect(el), + top = rect.top, + bottom = rect.bottom, + left = rect.left, + right = rect.right, + width = rect.width, + height = rect.height, + canScrollX = void 0, + canScrollY = void 0, + scrollWidth = el.scrollWidth, + scrollHeight = el.scrollHeight, + elCSS = css(el), + scrollPosX = el.scrollLeft, + scrollPosY = el.scrollTop; if (el === winScroller) { canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll' || elCSS.overflowX === 'visible'); canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll' || elCSS.overflowY === 'visible'); @@ -2933,10 +2578,8 @@ var autoScroll = throttle(function (evt, options, rootEl, isFallback) { canScrollX = width < scrollWidth && (elCSS.overflowX === 'auto' || elCSS.overflowX === 'scroll'); canScrollY = height < scrollHeight && (elCSS.overflowY === 'auto' || elCSS.overflowY === 'scroll'); } - var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX); var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY); - if (!autoScrolls[layersOut]) { for (var i = 0; i <= layersOut; i++) { if (!autoScrolls[i]) { @@ -2944,61 +2587,51 @@ var autoScroll = throttle(function (evt, options, rootEl, isFallback) { } } } - if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) { autoScrolls[layersOut].el = el; autoScrolls[layersOut].vx = vx; autoScrolls[layersOut].vy = vy; clearInterval(autoScrolls[layersOut].pid); - if (vx != 0 || vy != 0) { scrollThisInstance = true; /* jshint loopfunc:true */ - autoScrolls[layersOut].pid = setInterval(function () { // emulate drag over during autoscroll (fallback), emulating native DnD behaviour if (isFallback && this.layer === 0) { Sortable.active._onTouchMove(touchEvt$1); // To move ghost if it is positioned absolutely - } - var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0; var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0; - if (typeof scrollCustomFn === 'function') { if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== 'continue') { return; } } - scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY); }.bind({ layer: layersOut }), 24); } } - layersOut++; } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false))); - scrolling = scrollThisInstance; // in case another function catches scrolling as false in between when it is not }, 30); var drop = function drop(_ref) { var originalEvent = _ref.originalEvent, - putSortable = _ref.putSortable, - dragEl = _ref.dragEl, - activeSortable = _ref.activeSortable, - dispatchSortableEvent = _ref.dispatchSortableEvent, - hideGhostForTarget = _ref.hideGhostForTarget, - unhideGhostForTarget = _ref.unhideGhostForTarget; + putSortable = _ref.putSortable, + dragEl = _ref.dragEl, + activeSortable = _ref.activeSortable, + dispatchSortableEvent = _ref.dispatchSortableEvent, + hideGhostForTarget = _ref.hideGhostForTarget, + unhideGhostForTarget = _ref.unhideGhostForTarget; if (!originalEvent) return; var toSortable = putSortable || activeSortable; hideGhostForTarget(); var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent; var target = document.elementFromPoint(touch.clientX, touch.clientY); unhideGhostForTarget(); - if (toSortable && !toSortable.el.contains(target)) { dispatchSortableEvent('spill'); this.onSpill({ @@ -3007,9 +2640,7 @@ var drop = function drop(_ref) { }); } }; - function Revert() {} - Revert.prototype = { startIndex: null, dragStart: function dragStart(_ref2) { @@ -3018,40 +2649,32 @@ Revert.prototype = { }, onSpill: function onSpill(_ref3) { var dragEl = _ref3.dragEl, - putSortable = _ref3.putSortable; + putSortable = _ref3.putSortable; this.sortable.captureAnimationState(); - if (putSortable) { putSortable.captureAnimationState(); } - var nextSibling = getChild(this.sortable.el, this.startIndex, this.options); - if (nextSibling) { this.sortable.el.insertBefore(dragEl, nextSibling); } else { this.sortable.el.appendChild(dragEl); } - this.sortable.animateAll(); - if (putSortable) { putSortable.animateAll(); } }, drop: drop }; - _extends(Revert, { pluginName: 'revertOnSpill' }); - function Remove() {} - Remove.prototype = { onSpill: function onSpill(_ref4) { var dragEl = _ref4.dragEl, - putSortable = _ref4.putSortable; + putSortable = _ref4.putSortable; var parentSortable = putSortable || this.sortable; parentSortable.captureAnimationState(); dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); @@ -3059,20 +2682,17 @@ Remove.prototype = { }, drop: drop }; - _extends(Remove, { pluginName: 'removeOnSpill' }); var lastSwapEl; - function SwapPlugin() { function Swap() { this.defaults = { swapClass: 'sortable-swap-highlight' }; } - Swap.prototype = { dragStart: function dragStart(_ref) { var dragEl = _ref.dragEl; @@ -3080,42 +2700,37 @@ function SwapPlugin() { }, dragOverValid: function dragOverValid(_ref2) { var completed = _ref2.completed, - target = _ref2.target, - onMove = _ref2.onMove, - activeSortable = _ref2.activeSortable, - changed = _ref2.changed, - cancel = _ref2.cancel; + target = _ref2.target, + onMove = _ref2.onMove, + activeSortable = _ref2.activeSortable, + changed = _ref2.changed, + cancel = _ref2.cancel; if (!activeSortable.options.swap) return; var el = this.sortable.el, - options = this.options; - + options = this.options; if (target && target !== el) { var 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: function drop(_ref3) { var activeSortable = _ref3.activeSortable, - putSortable = _ref3.putSortable, - dragEl = _ref3.dragEl; + putSortable = _ref3.putSortable, + dragEl = _ref3.dragEl; var toSortable = putSortable || this.sortable; var options = this.options; lastSwapEl && toggleClass(lastSwapEl, options.swapClass, false); - if (lastSwapEl && (options.swap || putSortable && putSortable.options.swap)) { if (dragEl !== lastSwapEl) { toSortable.captureAnimationState(); @@ -3139,38 +2754,34 @@ function SwapPlugin() { } }); } - function swapNodes(n1, n2) { var p1 = n1.parentNode, - p2 = n2.parentNode, - i1, - i2; + 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]); } var multiDragElements = [], - multiDragClones = [], - lastMultiDragSelect, - // for selection with modifier key down (SHIFT) -multiDragSortable, - initialFolding = false, - // Initial multi-drag fold when drag started -folding = false, - // Folding any other time -dragStarted = false, - dragEl$1, - clonesFromRect, - clonesHidden; - + multiDragClones = [], + lastMultiDragSelect, + // for selection with modifier key down (SHIFT) + multiDragSortable, + initialFolding = false, + // Initial multi-drag fold when drag started + folding = false, + // Folding any other time + dragStarted = false, + dragEl$1, + clonesFromRect, + clonesHidden; function MultiDragPlugin() { function MultiDrag(sortable) { // Bind all private methods @@ -3179,7 +2790,6 @@ function MultiDragPlugin() { this[fn] = this[fn].bind(this); } } - if (!sortable.options.avoidImplicitDeselect) { if (sortable.options.supportPointer) { on(document, 'pointerup', this._deselectMultiDrag); @@ -3188,7 +2798,6 @@ function MultiDragPlugin() { on(document, 'touchend', this._deselectMultiDrag); } } - on(document, 'keydown', this._checkKeyDown); on(document, 'keyup', this._checkKeyUp); this.defaults = { @@ -3197,7 +2806,6 @@ function MultiDragPlugin() { avoidImplicitDeselect: false, setData: function setData(dataTransfer, dragEl) { var data = ''; - if (multiDragElements.length && multiDragSortable === sortable) { multiDragElements.forEach(function (multiDragElement, i) { data += (!i ? '' : ', ') + multiDragElement.textContent; @@ -3205,12 +2813,10 @@ function MultiDragPlugin() { } else { data = dragEl.textContent; } - dataTransfer.setData('Text', data); } }; } - MultiDrag.prototype = { multiDragKeyDown: false, isMultiDrag: false, @@ -3223,9 +2829,8 @@ function MultiDragPlugin() { }, setupClone: function setupClone(_ref2) { var sortable = _ref2.sortable, - cancel = _ref2.cancel; + cancel = _ref2.cancel; if (!this.isMultiDrag) return; - for (var i = 0; i < multiDragElements.length; i++) { multiDragClones.push(clone(multiDragElements[i])); multiDragClones[i].sortableIndex = multiDragElements[i].sortableIndex; @@ -3234,18 +2839,15 @@ function MultiDragPlugin() { toggleClass(multiDragClones[i], this.options.selectedClass, false); multiDragElements[i] === dragEl$1 && toggleClass(multiDragClones[i], this.options.chosenClass, false); } - sortable._hideClone(); - cancel(); }, clone: function clone(_ref3) { var sortable = _ref3.sortable, - rootEl = _ref3.rootEl, - dispatchSortableEvent = _ref3.dispatchSortableEvent, - cancel = _ref3.cancel; + rootEl = _ref3.rootEl, + dispatchSortableEvent = _ref3.dispatchSortableEvent, + cancel = _ref3.cancel; if (!this.isMultiDrag) return; - if (!this.options.removeCloneOnHide) { if (multiDragElements.length && multiDragSortable === sortable) { insertMultiDragClones(true, rootEl); @@ -3256,8 +2858,8 @@ function MultiDragPlugin() { }, showClone: function showClone(_ref4) { var cloneNowShown = _ref4.cloneNowShown, - rootEl = _ref4.rootEl, - cancel = _ref4.cancel; + rootEl = _ref4.rootEl, + cancel = _ref4.cancel; if (!this.isMultiDrag) return; insertMultiDragClones(false, rootEl); multiDragClones.forEach(function (clone) { @@ -3269,14 +2871,12 @@ function MultiDragPlugin() { }, hideClone: function hideClone(_ref5) { var _this = this; - var sortable = _ref5.sortable, - cloneNowHidden = _ref5.cloneNowHidden, - cancel = _ref5.cancel; + cloneNowHidden = _ref5.cloneNowHidden, + cancel = _ref5.cancel; if (!this.isMultiDrag) return; multiDragClones.forEach(function (clone) { css(clone, 'display', 'none'); - if (_this.options.removeCloneOnHide && clone.parentNode) { clone.parentNode.removeChild(clone); } @@ -3287,15 +2887,14 @@ function MultiDragPlugin() { }, dragStartGlobal: function dragStartGlobal(_ref6) { var sortable = _ref6.sortable; - if (!this.isMultiDrag && multiDragSortable) { multiDragSortable.multiDrag._deselectMultiDrag(); } - multiDragElements.forEach(function (multiDragElement) { multiDragElement.sortableIndex = index(multiDragElement); - }); // Sort multi-drag elements + }); + // Sort multi-drag elements multiDragElements = multiDragElements.sort(function (a, b) { return a.sortableIndex - b.sortableIndex; }); @@ -3303,10 +2902,8 @@ function MultiDragPlugin() { }, dragStarted: function dragStarted(_ref7) { var _this2 = this; - var sortable = _ref7.sortable; if (!this.isMultiDrag) return; - if (this.options.sort) { // Capture rects, // hide multi drag elements (by positioning them absolute), @@ -3314,8 +2911,8 @@ function MultiDragPlugin() { // show multi drag elements, // animate to rects, // unset rects & remove from DOM - sortable.captureAnimationState(); + sortable.captureAnimationState(); if (this.options.animation) { multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; @@ -3330,18 +2927,16 @@ function MultiDragPlugin() { initialFolding = true; } } - sortable.animateAll(function () { folding = false; initialFolding = false; - if (_this2.options.animation) { multiDragElements.forEach(function (multiDragElement) { unsetRect(multiDragElement); }); - } // Remove all auxiliary multidrag items from el, if sorting enabled - + } + // Remove all auxiliary multidrag items from el, if sorting enabled if (_this2.options.sort) { removeMultiDragElements(); } @@ -3349,9 +2944,8 @@ function MultiDragPlugin() { }, dragOver: function dragOver(_ref8) { var target = _ref8.target, - completed = _ref8.completed, - cancel = _ref8.cancel; - + completed = _ref8.completed, + cancel = _ref8.cancel; if (folding && ~multiDragElements.indexOf(target)) { completed(false); cancel(); @@ -3359,10 +2953,9 @@ function MultiDragPlugin() { }, revert: function revert(_ref9) { var fromSortable = _ref9.fromSortable, - rootEl = _ref9.rootEl, - sortable = _ref9.sortable, - dragRect = _ref9.dragRect; - + rootEl = _ref9.rootEl, + sortable = _ref9.sortable, + dragRect = _ref9.dragRect; if (multiDragElements.length > 1) { // Setup unfold animation multiDragElements.forEach(function (multiDragElement) { @@ -3380,47 +2973,44 @@ function MultiDragPlugin() { }, dragOverCompleted: function dragOverCompleted(_ref10) { var sortable = _ref10.sortable, - isOwner = _ref10.isOwner, - insertion = _ref10.insertion, - activeSortable = _ref10.activeSortable, - parentEl = _ref10.parentEl, - putSortable = _ref10.putSortable; + isOwner = _ref10.isOwner, + insertion = _ref10.insertion, + activeSortable = _ref10.activeSortable, + parentEl = _ref10.parentEl, + putSortable = _ref10.putSortable; var options = this.options; - if (insertion) { // Clones must be hidden before folding animation to capture dragRectAbsolute properly if (isOwner) { activeSortable._hideClone(); } - - initialFolding = false; // If leaving sort:false root, or already folding - Fold to new location - + initialFolding = false; + // If leaving sort:false root, or already folding - Fold to new location if (options.animation && multiDragElements.length > 1 && (folding || !isOwner && !activeSortable.options.sort && !putSortable)) { // Fold: Set all multi drag elements's rects to dragEl's rect when multi-drag elements are invisible var dragRectAbsolute = getRect(dragEl$1, false, true, true); multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; - setRect(multiDragElement, dragRectAbsolute); // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted - // while folding, and so that we can capture them again because old sortable will no longer be fromSortable + setRect(multiDragElement, dragRectAbsolute); + // Move element(s) to end of parentEl so that it does not interfere with multi-drag clones insertion if they are inserted + // while folding, and so that we can capture them again because old sortable will no longer be fromSortable parentEl.appendChild(multiDragElement); }); folding = true; - } // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out - + } + // Clones must be shown (and check to remove multi drags) after folding when interfering multiDragElements are moved out if (!isOwner) { // Only remove if not folding (folding will remove them anyways) if (!folding) { removeMultiDragElements(); } - if (multiDragElements.length > 1) { var clonesHiddenBefore = clonesHidden; + activeSortable._showClone(sortable); - activeSortable._showClone(sortable); // Unfold animation for clones if showing from hidden - - + // Unfold animation for clones if showing from hidden if (activeSortable.options.animation && !clonesHidden && clonesHiddenBefore) { multiDragClones.forEach(function (clone) { activeSortable.addAnimationState({ @@ -3439,12 +3029,11 @@ function MultiDragPlugin() { }, dragOverAnimationCapture: function dragOverAnimationCapture(_ref11) { var dragRect = _ref11.dragRect, - isOwner = _ref11.isOwner, - activeSortable = _ref11.activeSortable; + isOwner = _ref11.isOwner, + activeSortable = _ref11.activeSortable; multiDragElements.forEach(function (multiDragElement) { multiDragElement.thisAnimationDuration = null; }); - if (activeSortable.options.animation && !isOwner && activeSortable.multiDrag.isMultiDrag) { clonesFromRect = _extends({}, dragRect); var dragMatrix = matrix(dragEl$1, true); @@ -3460,24 +3049,23 @@ function MultiDragPlugin() { }, drop: function drop(_ref12) { var evt = _ref12.originalEvent, - rootEl = _ref12.rootEl, - parentEl = _ref12.parentEl, - sortable = _ref12.sortable, - dispatchSortableEvent = _ref12.dispatchSortableEvent, - oldIndex = _ref12.oldIndex, - putSortable = _ref12.putSortable; + rootEl = _ref12.rootEl, + parentEl = _ref12.parentEl, + sortable = _ref12.sortable, + dispatchSortableEvent = _ref12.dispatchSortableEvent, + oldIndex = _ref12.oldIndex, + putSortable = _ref12.putSortable; var toSortable = putSortable || this.sortable; if (!evt) return; var options = this.options, - children = parentEl.children; // Multi-drag selection + children = parentEl.children; + // Multi-drag selection if (!dragStarted) { if (options.multiDragKey && !this.multiDragKeyDown) { this._deselectMultiDrag(); } - toggleClass(dragEl$1, options.selectedClass, !~multiDragElements.indexOf(dragEl$1)); - if (!~multiDragElements.indexOf(dragEl$1)) { multiDragElements.push(dragEl$1); dispatchEvent({ @@ -3486,17 +3074,16 @@ function MultiDragPlugin() { name: 'select', targetEl: dragEl$1, originalEvent: evt - }); // Modifier activated, select from last to dragEl + }); + // Modifier activated, select from last to dragEl if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) { var lastIndex = index(lastMultiDragSelect), - currentIndex = index(dragEl$1); - + currentIndex = index(dragEl$1); if (~lastIndex && ~currentIndex && lastIndex !== currentIndex) { // Must include lastMultiDragSelect (select it), in case modified selection from no selection // (but previous selection existed) var n, i; - if (currentIndex > lastIndex) { i = lastIndex; n = currentIndex; @@ -3504,7 +3091,6 @@ function MultiDragPlugin() { i = currentIndex; n = lastIndex + 1; } - for (; i < n; i++) { if (~multiDragElements.indexOf(children[i])) continue; toggleClass(children[i], options.selectedClass, true); @@ -3521,7 +3107,6 @@ function MultiDragPlugin() { } else { lastMultiDragSelect = dragEl$1; } - multiDragSortable = toSortable; } else { multiDragElements.splice(multiDragElements.indexOf(dragEl$1), 1); @@ -3534,38 +3119,37 @@ function MultiDragPlugin() { originalEvent: evt }); } - } // Multi-drag drop - + } + // Multi-drag drop if (dragStarted && this.isMultiDrag) { - folding = false; // Do not "unfold" after around dragEl if reverted - + folding = false; + // Do not "unfold" after around dragEl if reverted if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) { var dragRect = getRect(dragEl$1), - multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')'); + multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')'); if (!initialFolding && options.animation) dragEl$1.thisAnimationDuration = null; toSortable.captureAnimationState(); - if (!initialFolding) { if (options.animation) { dragEl$1.fromRect = dragRect; multiDragElements.forEach(function (multiDragElement) { multiDragElement.thisAnimationDuration = null; - if (multiDragElement !== dragEl$1) { var rect = folding ? getRect(multiDragElement) : dragRect; - multiDragElement.fromRect = rect; // Prepare unfold animation + multiDragElement.fromRect = rect; + // Prepare unfold animation toSortable.addAnimationState({ target: multiDragElement, rect: rect }); } }); - } // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert - // properly they must all be removed - + } + // Multi drag elements are not necessarily removed from the DOM on drop, so to reinsert + // properly they must all be removed removeMultiDragElements(); multiDragElements.forEach(function (multiDragElement) { if (children[multiDragIndex]) { @@ -3573,12 +3157,12 @@ function MultiDragPlugin() { } else { parentEl.appendChild(multiDragElement); } - multiDragIndex++; - }); // If initial folding is done, the elements may have changed position because they are now + }); + + // If initial folding is done, the elements may have changed position because they are now // unfolding around dragEl, even though dragEl may not have his index changed, so update event // must be fired here as Sortable will not. - if (oldIndex === index(dragEl$1)) { var update = false; multiDragElements.forEach(function (multiDragElement) { @@ -3587,24 +3171,23 @@ function MultiDragPlugin() { return; } }); - if (update) { dispatchSortableEvent('update'); + dispatchSortableEvent('sort'); } } - } // Must be done after capturing individual rects (scroll bar) - + } + // Must be done after capturing individual rects (scroll bar) multiDragElements.forEach(function (multiDragElement) { unsetRect(multiDragElement); }); toSortable.animateAll(); } - multiDragSortable = toSortable; - } // Remove clones if necessary - + } + // Remove clones if necessary if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== 'clone') { multiDragClones.forEach(function (clone) { clone.parentNode && clone.parentNode.removeChild(clone); @@ -3617,7 +3200,6 @@ function MultiDragPlugin() { }, destroyGlobal: function destroyGlobal() { this._deselectMultiDrag(); - off(document, 'pointerup', this._deselectMultiDrag); off(document, 'mouseup', this._deselectMultiDrag); off(document, 'touchend', this._deselectMultiDrag); @@ -3625,14 +3207,16 @@ function MultiDragPlugin() { off(document, 'keyup', this._checkKeyUp); }, _deselectMultiDrag: function _deselectMultiDrag(evt) { - if (typeof dragStarted !== "undefined" && dragStarted) return; // Only deselect if selection is in this sortable + if (typeof dragStarted !== "undefined" && dragStarted) return; - if (multiDragSortable !== this.sortable) return; // Only deselect if target is not item in this sortable + // Only deselect if selection is in this sortable + if (multiDragSortable !== this.sortable) return; - if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; // Only deselect if left click + // Only deselect if target is not item in this sortable + if (evt && closest(evt.target, this.options.draggable, this.sortable.el, false)) return; + // Only deselect if left click if (evt && evt.button !== 0) return; - while (multiDragElements.length) { var el = multiDragElements[0]; toggleClass(el, this.options.selectedClass, false); @@ -3668,24 +3252,20 @@ function MultiDragPlugin() { select: function select(el) { var sortable = el.parentNode[expando]; if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return; - if (multiDragSortable && multiDragSortable !== sortable) { multiDragSortable.multiDrag._deselectMultiDrag(); - multiDragSortable = sortable; } - toggleClass(el, sortable.options.selectedClass, true); multiDragElements.push(el); }, - /** * Deselects the provided multi-drag item * @param {HTMLElement} el The element to be deselected */ deselect: function deselect(el) { var sortable = el.parentNode[expando], - index = multiDragElements.indexOf(el); + index = multiDragElements.indexOf(el); if (!sortable || !sortable.options.multiDrag || !~index) return; toggleClass(el, sortable.options.selectedClass, false); multiDragElements.splice(index, 1); @@ -3693,17 +3273,16 @@ function MultiDragPlugin() { }, eventProperties: function eventProperties() { var _this3 = this; - var oldIndicies = [], - newIndicies = []; + newIndicies = []; multiDragElements.forEach(function (multiDragElement) { oldIndicies.push({ multiDragElement: multiDragElement, index: multiDragElement.sortableIndex - }); // multiDragElements will already be sorted if folding + }); + // multiDragElements will already be sorted if folding var newIndex; - if (folding && multiDragElement !== dragEl$1) { newIndex = -1; } else if (folding) { @@ -3711,7 +3290,6 @@ function MultiDragPlugin() { } else { newIndex = index(multiDragElement); } - newIndicies.push({ multiDragElement: multiDragElement, index: newIndex @@ -3727,23 +3305,19 @@ function MultiDragPlugin() { optionListeners: { multiDragKey: function multiDragKey(key) { key = key.toLowerCase(); - if (key === 'ctrl') { key = 'Control'; } else if (key.length > 1) { key = key.charAt(0).toUpperCase() + key.substr(1); } - return key; } } }); } - function insertMultiDragElements(clonesInserted, rootEl) { multiDragElements.forEach(function (multiDragElement, i) { var target = rootEl.children[multiDragElement.sortableIndex + (clonesInserted ? Number(i) : 0)]; - if (target) { rootEl.insertBefore(multiDragElement, target); } else { @@ -3751,17 +3325,15 @@ function insertMultiDragElements(clonesInserted, rootEl) { } }); } + /** * Insert multi-drag clones * @param {[Boolean]} elementsInserted Whether the multi-drag elements are inserted * @param {HTMLElement} rootEl */ - - function insertMultiDragClones(elementsInserted, rootEl) { multiDragClones.forEach(function (clone, i) { var target = rootEl.children[clone.sortableIndex + (elementsInserted ? Number(i) : 0)]; - if (target) { rootEl.insertBefore(clone, target); } else { @@ -3769,7 +3341,6 @@ function insertMultiDragClones(elementsInserted, rootEl) { } }); } - function removeMultiDragElements() { multiDragElements.forEach(function (multiDragElement) { if (multiDragElement === dragEl$1) return; diff --git a/package-lock.json b/package-lock.json index c0517d3f9..0deaf3742 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sortablejs", - "version": "1.15.0", + "version": "1.15.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sortablejs", - "version": "1.15.0", + "version": "1.15.1", "license": "MIT", "devDependencies": { "@babel/core": "^7.4.4", diff --git a/package.json b/package.json index 99ed7b6dc..e964b44c3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "sortablejs", "exportName": "Sortable", - "version": "1.15.0", + "version": "1.15.1", "devDependencies": { "@babel/core": "^7.4.4", "@babel/plugin-transform-object-assign": "^7.2.0",