@@ -10,7 +10,8 @@ import {
10
10
setRect ,
11
11
unsetRect ,
12
12
matrix ,
13
- expando
13
+ expando ,
14
+ getParentOrHost ,
14
15
} from '../../src/utils.js' ;
15
16
16
17
import dispatchEvent from '../../src/EventDispatcher.js' ;
@@ -19,6 +20,7 @@ let multiDragElements = [],
19
20
multiDragClones = [ ] ,
20
21
lastMultiDragSelect , // for selection with modifier key down (SHIFT)
21
22
multiDragSortable ,
23
+ multiDragGroupMembers = { } ,
22
24
initialFolding = false , // Initial multi-drag fold when drag started
23
25
folding = false , // Folding any other time
24
26
dragStarted = false ,
@@ -44,6 +46,13 @@ function MultiDragPlugin() {
44
46
}
45
47
}
46
48
49
+ if ( sortable . options . group ) {
50
+ if ( multiDragGroupMembers [ sortable . options . group . name ] === undefined ) {
51
+ multiDragGroupMembers [ sortable . options . group . name ] = [ ] ;
52
+ }
53
+ multiDragGroupMembers [ sortable . options . group . name ] . push ( sortable ) ;
54
+ }
55
+
47
56
on ( document , 'keydown' , this . _checkKeyDown ) ;
48
57
on ( document , 'keyup' , this . _checkKeyUp ) ;
49
58
@@ -69,7 +78,6 @@ function MultiDragPlugin() {
69
78
multiDragKeyDown : false ,
70
79
isMultiDrag : false ,
71
80
72
-
73
81
delayStartGlobal ( { dragEl : dragged } ) {
74
82
dragEl = dragged ;
75
83
} ,
@@ -84,6 +92,7 @@ function MultiDragPlugin() {
84
92
multiDragClones . push ( clone ( multiDragElements [ i ] ) ) ;
85
93
86
94
multiDragClones [ i ] . sortableIndex = multiDragElements [ i ] . sortableIndex ;
95
+ multiDragClones [ i ] . sortableParentEl = multiDragElements [ i ] . sortableParentEl ;
87
96
88
97
multiDragClones [ i ] . draggable = false ;
89
98
multiDragClones [ i ] . style [ 'will-change' ] = '' ;
@@ -141,6 +150,7 @@ function MultiDragPlugin() {
141
150
142
151
multiDragElements . forEach ( multiDragElement => {
143
152
multiDragElement . sortableIndex = index ( multiDragElement ) ;
153
+ multiDragElement . sortableParentEl = getParentOrHost ( multiDragElement ) ;
144
154
} ) ;
145
155
146
156
// Sort multi-drag elements
@@ -197,11 +207,46 @@ function MultiDragPlugin() {
197
207
} ) ;
198
208
} ,
199
209
200
- dragOver ( { target, completed, cancel } ) {
210
+ dragOver ( { target, completed, cancel, originalEvent } ) {
201
211
if ( folding && ~ multiDragElements . indexOf ( target ) ) {
202
212
completed ( false ) ;
203
213
cancel ( ) ;
204
214
}
215
+
216
+ const toSortable = target . parentNode [ expando ] ;
217
+
218
+ if ( ! toSortable || multiDragElements . length === 0 ) {
219
+ return ;
220
+ }
221
+
222
+ let checkPut ;
223
+
224
+ if ( toSortable . options . group ) {
225
+ checkPut = toSortable . options . group . checkPut ;
226
+ }
227
+
228
+ const forbiddenMove = ~ multiDragElements . findIndex ( ( el ) => {
229
+ if ( ! el . sortableParentEl ) {
230
+ return false ;
231
+ }
232
+
233
+ const fromSortable = el . sortableParentEl [ expando ] ;
234
+
235
+ if ( fromSortable && fromSortable . options . group && ! fromSortable . options . group . checkPull ( toSortable , fromSortable , el , originalEvent ) ) {
236
+ return true ;
237
+ }
238
+
239
+ if ( checkPut && ! checkPut ( toSortable , fromSortable , el , originalEvent ) ) {
240
+ return true ;
241
+ }
242
+
243
+ return false ;
244
+ } ) ;
245
+
246
+ if ( forbiddenMove ) {
247
+ completed ( false ) ;
248
+ cancel ( ) ;
249
+ }
205
250
} ,
206
251
207
252
revert ( { fromSortable, rootEl, sortable, dragRect } ) {
@@ -468,6 +513,15 @@ function MultiDragPlugin() {
468
513
469
514
off ( document , 'keydown' , this . _checkKeyDown ) ;
470
515
off ( document , 'keyup' , this . _checkKeyUp ) ;
516
+
517
+ const groupMembers = multiDragGroupMembers [ this . sortable . options . group ] ;
518
+
519
+ if ( groupMembers ) {
520
+ let membersIndex ;
521
+ if ( ~ ( membersIndex = groupMembers . indexOf ( this . sortable ) ) ) {
522
+ multiDragGroupMembers . splice ( membersIndex , 1 ) ;
523
+ }
524
+ }
471
525
} ,
472
526
473
527
_deselectMultiDrag ( evt ) {
@@ -476,8 +530,10 @@ function MultiDragPlugin() {
476
530
// Only deselect if selection is in this sortable
477
531
if ( multiDragSortable !== this . sortable ) return ;
478
532
479
- // Only deselect if target is not item in this sortable
480
- if ( evt && closest ( evt . target , this . options . draggable , this . sortable . el , false ) ) return ;
533
+ const groupSortables = findAllMembersInSortableGroup ( this . sortable ) || [ this . sortable ] ;
534
+
535
+ // Only deselect if target is not item in any sortable in group (including this)
536
+ if ( evt && ~ groupSortables . findIndex ( ( sortable ) => closest ( evt . target , this . options . draggable , sortable . el , false ) ) ) return ;
481
537
482
538
// Only deselect if left click
483
539
if ( evt && evt . button !== 0 ) return ;
@@ -546,6 +602,7 @@ function MultiDragPlugin() {
546
602
multiDragElements . forEach ( multiDragElement => {
547
603
oldIndicies . push ( {
548
604
multiDragElement,
605
+ parentElement : multiDragElement . sortableParentEl ,
549
606
index : multiDragElement . sortableIndex
550
607
} ) ;
551
608
@@ -560,9 +617,11 @@ function MultiDragPlugin() {
560
617
}
561
618
newIndicies . push ( {
562
619
multiDragElement,
620
+ parentElement : multiDragElement . sortableParentEl ,
563
621
index : newIndex
564
622
} ) ;
565
623
} ) ;
624
+
566
625
return {
567
626
items : [ ...multiDragElements ] ,
568
627
clones : [ ...multiDragClones ] ,
@@ -618,4 +677,11 @@ function removeMultiDragElements() {
618
677
} ) ;
619
678
}
620
679
680
+ function findAllMembersInSortableGroup ( sortable ) {
681
+ if ( ! sortable . options . group ) {
682
+ return null ;
683
+ }
684
+ return multiDragGroupMembers [ sortable . options . group . name ] || [ ] ;
685
+ }
686
+
621
687
export default MultiDragPlugin ;
0 commit comments