Skip to content

Commit f235b69

Browse files
committed
fix: programmatic selection yields unexpected results, multiDragKey not working as expected
1 parent a46c849 commit f235b69

File tree

1 file changed

+40
-27
lines changed

1 file changed

+40
-27
lines changed

plugins/MultiDrag/MultiDrag.js

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,11 @@ function MultiDragPlugin() {
4747
}
4848

4949
if (sortable.options.group) {
50-
if (multiDragGroupMembers[sortable.options.group.name] === undefined) {
51-
multiDragGroupMembers[sortable.options.group.name] = [];
50+
const group = typeof sortable.options.group === 'string' ? { name: sortable.options.group } : sortable.options.group;
51+
if (multiDragGroupMembers[group.name] === undefined) {
52+
multiDragGroupMembers[group.name] = [];
5253
}
53-
multiDragGroupMembers[sortable.options.group.name].push(sortable);
54+
multiDragGroupMembers[group.name].push(sortable);
5455
}
5556

5657
on(document, 'keydown', this._checkKeyDown);
@@ -145,7 +146,7 @@ function MultiDragPlugin() {
145146

146147
dragStartGlobal({ sortable }) {
147148
if (!this.isMultiDrag && multiDragSortable) {
148-
multiDragSortable.multiDrag._deselectMultiDrag();
149+
MultiDrag.utils.clear();
149150
}
150151

151152
multiDragElements.forEach(multiDragElement => {
@@ -356,7 +357,7 @@ function MultiDragPlugin() {
356357
// Multi-drag selection
357358
if (!dragStarted) {
358359
if (options.multiDragKey && !this.multiDragKeyDown) {
359-
this._deselectMultiDrag();
360+
MultiDrag.utils.clear();
360361
}
361362
toggleClass(dragEl, options.selectedClass, !~multiDragElements.indexOf(dragEl));
362363

@@ -506,7 +507,8 @@ function MultiDragPlugin() {
506507
},
507508

508509
destroyGlobal() {
509-
this._deselectMultiDrag();
510+
MultiDrag.utils.clear();
511+
510512
off(document, 'pointerup', this._deselectMultiDrag);
511513
off(document, 'mouseup', this._deselectMultiDrag);
512514
off(document, 'touchend', this._deselectMultiDrag);
@@ -525,31 +527,18 @@ function MultiDragPlugin() {
525527
},
526528

527529
_deselectMultiDrag(evt) {
528-
if (typeof dragStarted !== "undefined" && dragStarted) return;
529-
530530
// Only deselect if selection is in this sortable
531531
if (multiDragSortable !== this.sortable) return;
532532

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;
537-
538-
// Only deselect if left click
539-
if (evt && evt.button !== 0) return;
533+
if (evt) {
534+
// Only deselect if left click
535+
if (evt.button !== 0) return;
540536

541-
while (multiDragElements.length) {
542-
let el = multiDragElements[0];
543-
toggleClass(el, this.options.selectedClass, false);
544-
multiDragElements.shift();
545-
dispatchEvent({
546-
sortable: this.sortable,
547-
rootEl: this.sortable.el,
548-
name: 'deselect',
549-
targetEl: el,
550-
originalEvent: evt
551-
});
537+
// Only deselect if target is not item in any sortable in group (including this)
538+
if (itemElIsInSortableGroup(evt.target, this.sortable)) return;
552539
}
540+
541+
MultiDrag.utils.clear(evt);
553542
},
554543

555544
_checkKeyDown(evt) {
@@ -577,7 +566,9 @@ function MultiDragPlugin() {
577566
let sortable = el.parentNode[expando];
578567
if (!sortable || !sortable.options.multiDrag || ~multiDragElements.indexOf(el)) return;
579568
if (multiDragSortable && multiDragSortable !== sortable) {
580-
multiDragSortable.multiDrag._deselectMultiDrag();
569+
if (!itemElIsInSortableGroup(el, multiDragSortable)) {
570+
MultiDrag.utils.clear();
571+
}
581572
multiDragSortable = sortable;
582573
}
583574
toggleClass(el, sortable.options.selectedClass, true);
@@ -593,6 +584,24 @@ function MultiDragPlugin() {
593584
if (!sortable || !sortable.options.multiDrag || !~index) return;
594585
toggleClass(el, sortable.options.selectedClass, false);
595586
multiDragElements.splice(index, 1);
587+
},
588+
clear(evt) {
589+
if (typeof dragStarted !== "undefined" && dragStarted) return;
590+
591+
while (multiDragElements.length) {
592+
const el = multiDragElements[0];
593+
const sortableEl = getParentOrHost(el);
594+
const sortable = sortableEl[expando];
595+
toggleClass(el, sortable.options.selectedClass, false);
596+
multiDragElements.shift();
597+
dispatchEvent({
598+
sortable: sortable,
599+
rootEl: sortableEl,
600+
name: 'deselect',
601+
targetEl: el,
602+
originalEvent: evt
603+
});
604+
}
596605
}
597606
},
598607
eventProperties() {
@@ -684,4 +693,8 @@ function findAllMembersInSortableGroup(sortable) {
684693
return multiDragGroupMembers[sortable.options.group.name] || [];
685694
}
686695

696+
function itemElIsInSortableGroup(itemEl, sortable) {
697+
return ~(findAllMembersInSortableGroup(sortable) || [sortable]).findIndex((sortable) => closest(itemEl, sortable.options.draggable, sortable.el, false));
698+
}
699+
687700
export default MultiDragPlugin;

0 commit comments

Comments
 (0)