@@ -366,6 +366,10 @@ export default class SortableItemModifier extends Modifier {
366
366
* @private
367
367
*/
368
368
_prepareDrag ( startEvent , event ) {
369
+ // Block drag start while any item has busy state
370
+ if ( this . sortableGroup . sortedItems . some ( ( x ) => x . isBusy ) ) {
371
+ return ;
372
+ }
369
373
let distance = this . distance ;
370
374
let dx = Math . abs ( getX ( startEvent ) - getX ( event ) ) ;
371
375
let dy = Math . abs ( getY ( startEvent ) - getY ( event ) ) ;
@@ -618,7 +622,10 @@ export default class SortableItemModifier extends Modifier {
618
622
set ( this , 'isDropping' , true ) ;
619
623
620
624
this . sortableGroup . update ( ) ;
621
- transitionPromise . then ( ( ) => this . _complete ( ) ) ;
625
+
626
+ let allTransitionPromise = this . _waitForAllTransitions ( ) ;
627
+
628
+ Promise . all ( [ transitionPromise , allTransitionPromise ] ) . then ( ( ) => this . _complete ( ) ) ;
622
629
}
623
630
624
631
/**
@@ -678,6 +685,42 @@ export default class SortableItemModifier extends Modifier {
678
685
return transitionPromise ;
679
686
}
680
687
688
+ /**
689
+ @method _waitForTransitions
690
+ @private
691
+ @return Promise
692
+ */
693
+ _waitForAllTransitions ( ) {
694
+ let waiterToken ;
695
+
696
+ if ( DEBUG ) {
697
+ waiterToken = sortableItemWaiter . beginAsync ( ) ;
698
+ }
699
+
700
+ let transitionPromise ;
701
+
702
+ if ( this . isAnimated ) {
703
+ const animations = this . sortableGroup . sortedItems . map ( ( x ) => x . element . getAnimations ( ) ) ;
704
+
705
+ const animationPromises = animations . map ( ( animation ) => {
706
+ return animation . finished ;
707
+ } ) ;
708
+
709
+ transitionPromise = Promise . all ( animationPromises ) ;
710
+ } else {
711
+ const duration = this . isAnimated ? this . transitionDuration : 200 ;
712
+ transitionPromise = new Promise ( ( resolve ) => later ( resolve , duration ) ) ;
713
+ }
714
+
715
+ if ( DEBUG ) {
716
+ transitionPromise = transitionPromise . finally ( ( ) => {
717
+ sortableItemWaiter . endAsync ( waiterToken ) ;
718
+ } ) ;
719
+ }
720
+
721
+ return transitionPromise ;
722
+ }
723
+
681
724
/**
682
725
@method _complete
683
726
@private
@@ -706,7 +749,8 @@ export default class SortableItemModifier extends Modifier {
706
749
@type Number
707
750
*/
708
751
get transitionDuration ( ) {
709
- let el = this . element ;
752
+ const items = this . sortableGroup . sortedItems . filter ( ( x ) => ! x . isDragging && ! x . isDropping ) ;
753
+ let el = items [ 0 ] . element ?? this . element ; // Fallback when only one element is present in list
710
754
let rule = getComputedStyle ( el ) . transitionDuration ;
711
755
let match = rule . match ( / ( [ \d . ] + ) ( [ m s ] * ) / ) ;
712
756
0 commit comments