@ -20,7 +20,7 @@
} ) ( function sortableFactory ( ) {
"use strict" ;
if ( typeof window == "undefined" || ! window . document ) {
if ( typeof window === "undefined" || ! window . document ) {
return function sortableError ( ) {
throw new Error ( "Sortable.js requires a window with a document" ) ;
} ;
@ -55,6 +55,8 @@
moved ,
forRepaintDummy ,
/** @const */
R _SPACE = /\s+/g ,
R _FLOAT = /left|right|inline/ ,
@ -64,16 +66,18 @@
win = window ,
document = win . document ,
parseInt = win . parseInt ,
setTimeout = win . setTimeout ,
$ = win . jQuery || win . Zepto ,
Polymer = win . Polymer ,
captureMode = false ,
passiveMode = false ,
supportDraggable = ! ! ( 'draggable' in document . createElement ( 'div' ) ) ,
supportDraggable = ( 'draggable' in document . createElement ( 'div' ) ) ,
supportCssPointerEvents = ( function ( el ) {
// false when IE11
if ( ! ! navigator . userAgent . match ( /Trident.*rv[ :]?11\./ ) ) {
if ( ! ! navigator . userAgent . match ( /(?: Trident.*rv[ :]?11\.|msie) /i ) ) {
return false ;
}
el = document . createElement ( 'x' ) ;
@ -89,6 +93,8 @@
savedInputChecked = [ ] ,
touchDragOverListeners = [ ] ,
alwaysFalse = function ( ) { return false ; } ,
_autoScroll = _throttle ( function ( /**Event*/ evt , /**Object*/ options , /**HTMLElement*/ rootEl ) {
// Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=505521
if ( rootEl && options . scroll ) {
@ -178,8 +184,11 @@
_prepareGroup = function ( options ) {
function toFn ( value , pull ) {
if ( value === void 0 || value === true ) {
if ( value == null || value === true ) {
value = group . name ;
if ( value == null ) {
return alwaysFalse ;
}
}
if ( typeof value === 'function' ) {
@ -214,6 +223,20 @@
}
;
// Detect support a passive mode
try {
window . addEventListener ( 'test' , null , Object . defineProperty ( { } , 'passive' , {
get : function ( ) {
// `false`, because everything starts to work incorrectly and instead of d'n'd,
// begins the page has scrolled.
passiveMode = false ;
captureMode = {
capture : false ,
passive : passiveMode
} ;
}
} ) ) ;
} catch ( err ) { }
/ * *
* @ class Sortable
@ -234,7 +257,7 @@
// Default options
var defaults = {
group : Math . random ( ) ,
group : null ,
sort : true ,
disabled : false ,
store : null ,
@ -261,7 +284,8 @@
fallbackClass : 'sortable-fallback' ,
fallbackOnBody : false ,
fallbackTolerance : 0 ,
fallbackOffset : { x : 0 , y : 0 }
fallbackOffset : { x : 0 , y : 0 } ,
supportPointer : Sortable . supportPointer !== false
} ;
@ -285,7 +309,7 @@
// Bind events
_on ( el , 'mousedown' , this . _onTapStart ) ;
_on ( el , 'touchstart' , this . _onTapStart ) ;
_on ( el , 'pointerdown' , this . _onTapStart ) ;
options . supportPointer && _on ( el , 'pointerdown' , this . _onTapStart ) ;
if ( this . nativeDraggable ) {
_on ( el , 'dragover' , this ) ;
@ -326,6 +350,10 @@
return ; // only left button or enabled
}
// cancel dnd if original target is content editable
if ( originalTarget . isContentEditable ) {
return ;
}
target = _closest ( target , options . draggable , el ) ;
@ -344,7 +372,7 @@
// Check filter
if ( typeof filter === 'function' ) {
if ( filter . call ( this , evt , target , this ) ) {
_dispatchEvent ( _this , originalTarget , 'filter' , target , el , startIndex ) ;
_dispatchEvent ( _this , originalTarget , 'filter' , target , el , el , startIndex ) ;
preventOnFilter && evt . preventDefault ( ) ;
return ; // cancel dnd
}
@ -354,7 +382,7 @@
criteria = _closest ( originalTarget , criteria . trim ( ) , el ) ;
if ( criteria ) {
_dispatchEvent ( _this , criteria , 'filter' , target , el , startIndex ) ;
_dispatchEvent ( _this , criteria , 'filter' , target , el , el , startIndex ) ;
return true ;
}
} ) ;
@ -394,7 +422,7 @@
this . _lastX = ( touch || evt ) . clientX ;
this . _lastY = ( touch || evt ) . clientY ;
dragEl . style [ 'will-change' ] = 'transform ' ;
dragEl . style [ 'will-change' ] = 'all ' ;
dragStartFn = function ( ) {
// Delayed drag has been triggered
@ -411,7 +439,7 @@
_this . _triggerDragStart ( evt , touch ) ;
// Drag start event
_dispatchEvent ( _this , rootEl , 'choose' , dragEl , rootEl , oldIndex ) ;
_dispatchEvent ( _this , rootEl , 'choose' , dragEl , rootEl , rootEl , oldIndex ) ;
} ;
// Disable "draggable"
@ -422,8 +450,8 @@
_on ( ownerDocument , 'mouseup' , _this . _onDrop ) ;
_on ( ownerDocument , 'touchend' , _this . _onDrop ) ;
_on ( ownerDocument , 'touchcancel' , _this . _onDrop ) ;
_on ( ownerDocument , 'pointercancel' , _this . _onDrop ) ;
_on ( ownerDocument , 'selectstart' , _this ) ;
options . supportPointer && _on ( ownerDocument , 'pointercancel' , _this . _onDrop ) ;
if ( options . delay ) {
// If the user moves the pointer or let go the click or touch
@ -434,7 +462,7 @@
_on ( ownerDocument , 'touchcancel' , _this . _disableDelayedDrag ) ;
_on ( ownerDocument , 'mousemove' , _this . _disableDelayedDrag ) ;
_on ( ownerDocument , 'touchmove' , _this . _disableDelayedDrag ) ;
_on ( ownerDocument , 'pointermove' , _this . _disableDelayedDrag ) ;
options . supportPointer && _on ( ownerDocument , 'pointermove' , _this . _disableDelayedDrag ) ;
_this . _dragStartTimer = setTimeout ( dragStartFn , options . delay ) ;
} else {
@ -481,7 +509,7 @@
try {
if ( document . selection ) {
// Timeout neccessary for IE9
setTimeout ( function ( ) {
_nextTick ( function ( ) {
document . selection . empty ( ) ;
} ) ;
} else {
@ -502,7 +530,7 @@
Sortable . active = this ;
// Drag start event
_dispatchEvent ( this , rootEl , 'start' , dragEl , rootEl , oldIndex ) ;
_dispatchEvent ( this , rootEl , 'start' , dragEl , rootEl , rootEl , oldIndex ) ;
} else {
this . _nulling ( ) ;
}
@ -521,9 +549,14 @@
_css ( ghostEl , 'display' , 'none' ) ;
}
var target = document . elementFromPoint ( touchEvt . clientX , touchEvt . clientY ) ,
parent = target ,
i = touchDragOverListeners . length ;
var target = document . elementFromPoint ( touchEvt . clientX , touchEvt . clientY ) ;
var parent = target ;
var i = touchDragOverListeners . length ;
if ( target && target . shadowRoot ) {
target = target . shadowRoot . elementFromPoint ( touchEvt . clientX , touchEvt . clientY ) ;
parent = target ;
}
if ( parent ) {
do {
@ -621,22 +654,26 @@
} ,
_onDragStart : function ( /**Event*/ evt , /**boolean*/ useFallback ) {
var dataTransfer = evt . dataTransfer ,
options = this . options ;
var _this = this ;
var dataTransfer = evt . dataTransfer ;
var options = _this . options ;
this . _offUpEvents ( ) ;
_ this. _offUpEvents ( ) ;
if ( activeGroup . checkPull ( this , this , dragEl , evt ) ) {
if ( activeGroup . checkPull ( _this , _ this, dragEl , evt ) ) {
cloneEl = _clone ( dragEl ) ;
cloneEl . draggable = false ;
cloneEl . style [ 'will-change' ] = '' ;
_css ( cloneEl , 'display' , 'none' ) ;
_toggleClass ( cloneEl , this . options . chosenClass , false ) ;
_toggleClass ( cloneEl , _ this. options . chosenClass , false ) ;
rootEl . insertBefore ( cloneEl , dragEl ) ;
_dispatchEvent ( this , rootEl , 'clone' , dragEl ) ;
// #1143: IFrame support workaround
_this . _cloneId = _nextTick ( function ( ) {
rootEl . insertBefore ( cloneEl , dragEl ) ;
_dispatchEvent ( _this , rootEl , 'clone' , dragEl ) ;
} ) ;
}
_toggleClass ( dragEl , options . dragClass , true ) ;
@ -644,27 +681,36 @@
if ( useFallback ) {
if ( useFallback === 'touch' ) {
// Bind touch events
_on ( document , 'touchmove' , this . _onTouchMove ) ;
_on ( document , 'touchend' , this . _onDrop ) ;
_on ( document , 'touchcancel' , this . _onDrop ) ;
_on ( document , 'pointermove' , this . _onTouchMove ) ;
_on ( document , 'pointerup' , this . _onDrop ) ;
_on ( document , 'touchmove' , _this . _onTouchMove ) ;
_on ( document , 'touchend' , _this . _onDrop ) ;
_on ( document , 'touchcancel' , _this . _onDrop ) ;
if ( options . supportPointer ) {
_on ( document , 'pointermove' , _this . _onTouchMove ) ;
_on ( document , 'pointerup' , _this . _onDrop ) ;
}
} else {
// Old brwoser
_on ( document , 'mousemove' , this . _onTouchMove ) ;
_on ( document , 'mouseup' , this . _onDrop ) ;
_on ( document , 'mousemove' , _ this. _onTouchMove ) ;
_on ( document , 'mouseup' , _ this. _onDrop ) ;
}
this . _loopId = setInterval ( this . _emulateDragOver , 50 ) ;
_ this. _loopId = setInterval ( _ this. _emulateDragOver , 50 ) ;
}
else {
if ( dataTransfer ) {
dataTransfer . effectAllowed = 'move' ;
options . setData && options . setData . call ( this , dataTransfer , dragEl ) ;
options . setData && options . setData . call ( _ this, dataTransfer , dragEl ) ;
}
_on ( document , 'drop' , this ) ;
setTimeout ( this . _dragStarted , 0 ) ;
_on ( document , 'drop' , _this ) ;
// #1143: Бывает элемент с IFrame внутри блокирует `drop`,
// поэтому если вызвался `mouseover`, значит надо отменять весь d'n'd.
// Breaking Chrome 62+
// _on(document, 'mouseover', _this);
_this . _dragStartId = _nextTick ( _this . _dragStarted ) ;
}
} ,
@ -844,7 +890,7 @@
+ ( prevRect . top - currentRect . top ) + 'px,0)'
) ;
target . offsetWidth ; // repaint
forRepaintDummy = target . offsetWidth ; // repaint
_css ( target , 'transition' , 'all ' + ms + 'ms' ) ;
_css ( target , 'transform' , 'translate3d(0,0,0)' ) ;
@ -879,7 +925,11 @@
clearInterval ( autoScroll . pid ) ;
clearTimeout ( this . _dragStartTimer ) ;
_cancelNextTick ( this . _cloneId ) ;
_cancelNextTick ( this . _dragStartId ) ;
// Unbind events
_off ( document , 'mouseover' , this ) ;
_off ( document , 'mousemove' , this . _onTouchMove ) ;
if ( this . nativeDraggable ) {
@ -915,21 +965,21 @@
_toggleClass ( dragEl , this . options . chosenClass , false ) ;
// Drag stop event
_dispatchEvent ( this , rootEl , 'unchoose' , dragEl , rootEl , oldIndex ) ;
_dispatchEvent ( this , rootEl , 'unchoose' , dragEl , parentEl , rootEl , oldIndex , null , evt ) ;
if ( rootEl !== parentEl ) {
newIndex = _index ( dragEl , options . draggable ) ;
if ( newIndex >= 0 ) {
// Add event
_dispatchEvent ( null , parentEl , 'add' , dragEl , rootEl , oldIndex , newIndex ) ;
_dispatchEvent ( null , parentEl , 'add' , dragEl , parentEl , rootEl , oldIndex , newIndex , evt ) ;
// Remove event
_dispatchEvent ( this , rootEl , 'remove' , dragEl , rootEl , oldIndex , newIndex ) ;
_dispatchEvent ( this , rootEl , 'remove' , dragEl , parentEl , rootEl , oldIndex , newIndex , evt ) ;
// drag from one list and drop into another
_dispatchEvent ( null , parentEl , 'sort' , dragEl , rootEl , oldIndex , newIndex ) ;
_dispatchEvent ( this , rootEl , 'sort' , dragEl , rootEl , oldIndex , newIndex ) ;
_dispatchEvent ( null , parentEl , 'sort' , dragEl , parentEl , rootEl , oldIndex , newIndex , evt ) ;
_dispatchEvent ( this , rootEl , 'sort' , dragEl , parentEl , rootEl , oldIndex , newIndex , evt ) ;
}
}
else {
@ -939,8 +989,8 @@
if ( newIndex >= 0 ) {
// drag & drop within the same list
_dispatchEvent ( this , rootEl , 'update' , dragEl , rootEl , oldIndex , newIndex ) ;
_dispatchEvent ( this , rootEl , 'sort' , dragEl , rootEl , oldIndex , newIndex ) ;
_dispatchEvent ( this , rootEl , 'update' , dragEl , parentEl , rootEl , oldIndex , newIndex , evt ) ;
_dispatchEvent ( this , rootEl , 'sort' , dragEl , parentEl , rootEl , oldIndex , newIndex , evt ) ;
}
}
}
@ -951,7 +1001,7 @@
newIndex = oldIndex ;
}
_dispatchEvent ( this , rootEl , 'end' , dragEl , rootEl , oldIndex , newIndex ) ;
_dispatchEvent ( this , rootEl , 'end' , dragEl , parentEl , rootEl , oldIndex , newIndex , evt ) ;
// Save sorting
this . save ( ) ;
@ -1009,6 +1059,10 @@
}
break ;
case 'mouseover' :
this . _onDrop ( evt ) ;
break ;
case 'selectstart' :
evt . preventDefault ( ) ;
break ;
@ -1256,7 +1310,7 @@
function _dispatchEvent ( sortable , rootEl , name , targetEl , fromEl , startIndex , newIndex ) {
function _dispatchEvent ( sortable , rootEl , name , targetEl , toEl , fromEl , startIndex , newIndex , originalEvt ) {
sortable = ( sortable || rootEl [ expando ] ) ;
var evt = document . createEvent ( 'Event' ) ,
@ -1265,7 +1319,7 @@
evt . initEvent ( name , true , true ) ;
evt . to = rootEl ;
evt . to = toEl || rootEl ;
evt . from = fromEl || rootEl ;
evt . item = targetEl || rootEl ;
evt . clone = cloneEl ;
@ -1273,6 +1327,8 @@
evt . oldIndex = startIndex ;
evt . newIndex = newIndex ;
evt . originalEvent = originalEvt ;
rootEl . dispatchEvent ( evt ) ;
if ( options [ onName ] ) {
@ -1298,6 +1354,8 @@
evt . relatedRect = targetRect || toEl . getBoundingClientRect ( ) ;
evt . willInsertAfter = willInsertAfter ;
evt . originalEvent = originalEvt ;
fromEl . dispatchEvent ( evt ) ;
if ( onMoveFn ) {
@ -1421,15 +1479,20 @@
}
function _clone ( el ) {
return $
? $ ( el ) . clone ( true ) [ 0 ]
: ( Polymer && Polymer . dom
? Polymer . dom ( el ) . cloneNode ( true )
: el . cloneNode ( true )
) ;
if ( Polymer && Polymer . dom ) {
return Polymer . dom ( el ) . cloneNode ( true ) ;
}
else if ( $ ) {
return $ ( el ) . clone ( true ) [ 0 ] ;
}
else {
return el . cloneNode ( true ) ;
}
}
function _saveInputCheckedState ( root ) {
savedInputChecked . length = 0 ;
var inputs = root . getElementsByTagName ( 'input' ) ;
var idx = inputs . length ;
@ -1439,6 +1502,14 @@
}
}
function _nextTick ( fn ) {
return setTimeout ( fn , 0 ) ;
}
function _cancelNextTick ( id ) {
return clearTimeout ( id ) ;
}
// Fixed #973:
_on ( document , 'touchmove' , function ( evt ) {
if ( Sortable . active ) {
@ -1446,17 +1517,6 @@
}
} ) ;
try {
window . addEventListener ( 'test' , null , Object . defineProperty ( { } , 'passive' , {
get : function ( ) {
captureMode = {
capture : false ,
passive : false
} ;
}
} ) ) ;
} catch ( err ) { }
// Export utils
Sortable . utils = {
on : _on ,
@ -1471,7 +1531,9 @@
closest : _closest ,
toggleClass : _toggleClass ,
clone : _clone ,
index : _index
index : _index ,
nextTick : _nextTick ,
cancelNextTick : _cancelNextTick
} ;
@ -1486,6 +1548,6 @@
// Export
Sortable . version = '1.6.1 ' ;
Sortable . version = '1.7.0 ' ;
return Sortable ;
} ) ;