@@ -35,7 +35,7 @@ function removeData(element) {
35
35
}
36
36
}
37
37
38
- function filter ( nodes , selector ) {
38
+ function _filter ( nodes , selector ) {
39
39
if ( ! ( nodes instanceof NodeList || nodes instanceof HTMLCollection || nodes instanceof Array ) ) {
40
40
throw new Error ( 'You must provide a nodeList/HTMLCollection/Array of elements to be filtered.' ) ;
41
41
}
@@ -332,7 +332,7 @@ function _serialize (sortableContainer, customItemSerializer, customContainerSer
332
332
var options = addData ( sortableContainer , 'opts' ) ;
333
333
var item = options . items ;
334
334
// serialize container
335
- var items = filter ( sortableContainer . children , item ) ;
335
+ var items = _filter ( sortableContainer . children , item ) ;
336
336
var serializedItems = items . map ( function ( item ) {
337
337
return {
338
338
parent : sortableContainer ,
@@ -498,12 +498,78 @@ var defaultConfiguration = {
498
498
draggingClass : 'sortable-dragging' ,
499
499
hoverClass : false ,
500
500
debounce : 0 ,
501
+ throttleTime : 100 ,
501
502
maxItems : 0 ,
502
503
itemSerializer : undefined ,
503
504
containerSerializer : undefined ,
504
505
customDragImage : null
505
506
} ;
506
507
508
+ /**
509
+ * make sure a function is only called once within the given amount of time
510
+ * @param {Function } fn the function to throttle
511
+ * @param {number } threshold time limit for throttling
512
+ */
513
+ // must use function to keep this context
514
+ function _throttle ( fn , threshold ) {
515
+ var _this = this ;
516
+ if ( threshold === void 0 ) { threshold = 250 ; }
517
+ // check function
518
+ if ( typeof fn !== 'function' ) {
519
+ throw new Error ( 'You must provide a function as the first argument for throttle.' ) ;
520
+ }
521
+ // check threshold
522
+ if ( typeof threshold !== 'number' ) {
523
+ throw new Error ( 'You must provide a number as the second argument for throttle.' ) ;
524
+ }
525
+ var lastEventTimestamp = null ;
526
+ return function ( ) {
527
+ var args = [ ] ;
528
+ for ( var _i = 0 ; _i < arguments . length ; _i ++ ) {
529
+ args [ _i - 0 ] = arguments [ _i ] ;
530
+ }
531
+ var now = Date . now ( ) ;
532
+ if ( lastEventTimestamp === null || now - lastEventTimestamp >= threshold ) {
533
+ lastEventTimestamp = now ;
534
+ fn . apply ( _this , args ) ;
535
+ }
536
+ } ;
537
+ }
538
+
539
+ function enableHoverClass ( sortableContainer , enable ) {
540
+ if ( typeof store ( sortableContainer ) . getConfig ( 'hoverClass' ) === 'string' ) {
541
+ var hoverClasses_1 = store ( sortableContainer ) . getConfig ( 'hoverClass' ) . split ( ' ' ) ;
542
+ // add class on hover
543
+ if ( enable === true ) {
544
+ addEventListener ( sortableContainer , 'mousemove' , _throttle ( function ( event ) {
545
+ // check of no mouse button was pressed when mousemove started == no drag
546
+ if ( event . buttons === 0 ) {
547
+ _filter ( sortableContainer . children , store ( sortableContainer ) . getConfig ( 'items' ) ) . forEach ( function ( item ) {
548
+ if ( item !== event . target ) {
549
+ ( _a = item . classList ) . remove . apply ( _a , hoverClasses_1 ) ;
550
+ }
551
+ else {
552
+ ( _b = item . classList ) . add . apply ( _b , hoverClasses_1 ) ;
553
+ }
554
+ var _a , _b ;
555
+ } ) ;
556
+ }
557
+ } , store ( sortableContainer ) . getConfig ( 'throttleTime' ) ) ) ;
558
+ // remove class on leave
559
+ addEventListener ( sortableContainer , 'mouseleave' , function ( ) {
560
+ _filter ( sortableContainer . children , store ( sortableContainer ) . getConfig ( 'items' ) ) . forEach ( function ( item ) {
561
+ ( _a = item . classList ) . remove . apply ( _a , hoverClasses_1 ) ;
562
+ var _a ;
563
+ } ) ;
564
+ } ) ;
565
+ }
566
+ else {
567
+ removeEventListener ( sortableContainer , 'mousemove' ) ;
568
+ removeEventListener ( sortableContainer , 'mouseleave' ) ;
569
+ }
570
+ }
571
+ }
572
+
507
573
/* eslint-env browser */
508
574
/*
509
575
* variables global to the plugin
@@ -588,7 +654,7 @@ function findSortable(element) {
588
654
*/
589
655
function findDragElement ( sortableElement , element ) {
590
656
var options = addData ( sortableElement , 'opts' ) ;
591
- var items = filter ( sortableElement . children , options . items ) ;
657
+ var items = _filter ( sortableElement . children , options . items ) ;
592
658
var itemlist = items . filter ( function ( ele ) {
593
659
return ele . contains ( element ) ;
594
660
} ) ;
@@ -600,7 +666,7 @@ function findDragElement(sortableElement, element) {
600
666
*/
601
667
var _destroySortable = function ( sortableElement ) {
602
668
var opts = addData ( sortableElement , 'opts' ) || { } ;
603
- var items = filter ( sortableElement . children , opts . items ) ;
669
+ var items = _filter ( sortableElement . children , opts . items ) ;
604
670
var handles = _getHandles ( items , opts . handle ) ;
605
671
// remove event handlers & data from sortable
606
672
removeEventListener ( sortableElement , 'dragover' ) ;
@@ -619,7 +685,7 @@ var _destroySortable = function (sortableElement) {
619
685
*/
620
686
var _enableSortable = function ( sortableElement ) {
621
687
var opts = addData ( sortableElement , 'opts' ) ;
622
- var items = filter ( sortableElement . children , opts . items ) ;
688
+ var items = _filter ( sortableElement . children , opts . items ) ;
623
689
var handles = _getHandles ( items , opts . handle ) ;
624
690
addAttribute ( sortableElement , 'aria-dropeffect' , 'move' ) ;
625
691
addData ( sortableElement , '_disabled' , 'false' ) ;
@@ -652,7 +718,7 @@ var _enableSortable = function (sortableElement) {
652
718
*/
653
719
var _disableSortable = function ( sortableElement ) {
654
720
var opts = addData ( sortableElement , 'opts' ) ;
655
- var items = filter ( sortableElement . children , opts . items ) ;
721
+ var items = _filter ( sortableElement . children , opts . items ) ;
656
722
var handles = _getHandles ( items , opts . handle ) ;
657
723
addAttribute ( sortableElement , 'aria-dropeffect' , 'none' ) ;
658
724
addData ( sortableElement , '_disabled' , 'true' ) ;
@@ -666,7 +732,7 @@ var _disableSortable = function (sortableElement) {
666
732
*/
667
733
var _reloadSortable = function ( sortableElement ) {
668
734
var opts = addData ( sortableElement , 'opts' ) ;
669
- var items = filter ( sortableElement . children , opts . items ) ;
735
+ var items = _filter ( sortableElement . children , opts . items ) ;
670
736
var handles = _getHandles ( items , opts . handle ) ;
671
737
addData ( sortableElement , '_disabled' , 'false' ) ;
672
738
// remove event handlers from items
@@ -739,7 +805,7 @@ function sortable(sortableElements, options) {
739
805
// reset sortable
740
806
_reloadSortable ( sortableElement ) ;
741
807
// initialize
742
- var listItems = filter ( sortableElement . children , options . items ) ;
808
+ var listItems = _filter ( sortableElement . children , options . items ) ;
743
809
// create element if user defined a placeholder element as a string
744
810
var customPlaceholder ;
745
811
if ( options . placeholder !== null && options . placeholder !== undefined ) {
@@ -759,23 +825,8 @@ function sortable(sortableElements, options) {
759
825
_enableSortable ( sortableElement ) ;
760
826
addAttribute ( listItems , 'role' , 'option' ) ;
761
827
addAttribute ( listItems , 'aria-grabbed' , 'false' ) ;
762
- // Mouse over class
763
- // TODO - only assign hoverClass if not dragging
764
- if ( typeof options . hoverClass === 'string' ) {
765
- var hoverClasses_1 = options . hoverClass . split ( ' ' ) ;
766
- // add class on hover
767
- addEventListener ( listItems , 'mouseenter' , function ( e ) {
768
- if ( ! dragging ) {
769
- ( _a = e . target . classList ) . add . apply ( _a , hoverClasses_1 ) ;
770
- }
771
- var _a ;
772
- } ) ;
773
- // remove class on leave
774
- addEventListener ( listItems , 'mouseleave' , function ( e ) {
775
- ( _a = e . target . classList ) . remove . apply ( _a , hoverClasses_1 ) ;
776
- var _a ;
777
- } ) ;
778
- }
828
+ // enable hover class
829
+ enableHoverClass ( sortableElement , true ) ;
779
830
/*
780
831
Handle drag events on draggable items
781
832
Handle is set at the sortableElement level as it will bubble up
@@ -793,7 +844,7 @@ function sortable(sortableElements, options) {
793
844
var sortableContainer = findSortable ( e . target ) ;
794
845
var dragItem = findDragElement ( sortableContainer , e . target ) ;
795
846
// grab values
796
- originItemsBeforeUpdate = filter ( sortableContainer . children , options . items ) ;
847
+ originItemsBeforeUpdate = _filter ( sortableContainer . children , options . items ) ;
797
848
originIndex = originItemsBeforeUpdate . indexOf ( dragItem ) ;
798
849
originElementIndex = index ( dragItem , sortableContainer . children ) ;
799
850
originContainer = sortableContainer ;
@@ -824,7 +875,7 @@ function sortable(sortableElements, options) {
824
875
return ;
825
876
}
826
877
var sortableContainer = findSortable ( e . target ) ;
827
- destinationItemsBeforeUpdate = filter ( sortableContainer . children , addData ( sortableContainer , 'items' ) )
878
+ destinationItemsBeforeUpdate = _filter ( sortableContainer . children , addData ( sortableContainer , 'items' ) )
828
879
. filter ( function ( item ) { return item !== store ( sortableElement ) . placeholder ; } ) ;
829
880
} ) ;
830
881
/*
@@ -898,10 +949,10 @@ function sortable(sortableElements, options) {
898
949
}
899
950
} ) ) ;
900
951
var placeholder = store ( sortableElement ) . placeholder ;
901
- var originItems = filter ( originContainer . children , options . items )
952
+ var originItems = _filter ( originContainer . children , options . items )
902
953
. filter ( function ( item ) { return item !== placeholder ; } ) ;
903
954
var destinationContainer = this . isSortable === true ? this : this . parentElement ;
904
- var destinationItems = filter ( destinationContainer . children , addData ( destinationContainer , 'items' ) )
955
+ var destinationItems = _filter ( destinationContainer . children , addData ( destinationContainer , 'items' ) )
905
956
. filter ( function ( item ) { return item !== placeholder ; } ) ;
906
957
var destinationElementIndex = index ( dragging , Array . from ( dragging . parentElement . children )
907
958
. filter ( function ( item ) { return item !== placeholder ; } ) ) ;
@@ -988,7 +1039,7 @@ function sortable(sortableElements, options) {
988
1039
return data . placeholder ;
989
1040
} ) ;
990
1041
// check if element is not in placeholders
991
- if ( placeholders . indexOf ( element ) === - 1 && sortableElement === element && ! filter ( element . children , options . items ) . length ) {
1042
+ if ( placeholders . indexOf ( element ) === - 1 && sortableElement === element && ! _filter ( element . children , options . items ) . length ) {
992
1043
placeholders . forEach ( function ( element ) { return element . remove ( ) ; } ) ;
993
1044
element . appendChild ( store ( sortableElement ) . placeholder ) ;
994
1045
}
@@ -1003,7 +1054,7 @@ function sortable(sortableElements, options) {
1003
1054
return ;
1004
1055
}
1005
1056
var options = addData ( sortableElement , 'opts' ) ;
1006
- if ( parseInt ( options . maxItems ) && filter ( sortableElement . children , addData ( sortableElement , 'items' ) ) . length >= parseInt ( options . maxItems ) && dragging . parentElement !== sortableElement ) {
1057
+ if ( parseInt ( options . maxItems ) && _filter ( sortableElement . children , addData ( sortableElement , 'items' ) ) . length >= parseInt ( options . maxItems ) && dragging . parentElement !== sortableElement ) {
1007
1058
return ;
1008
1059
}
1009
1060
e . preventDefault ( ) ;
0 commit comments