Skip to content

Commit d27c129

Browse files
authored
🐛 - Move onEnd event to the end of event queue (#65)
see: SortableJS/Sortable#1184
1 parent 15f2965 commit d27c129

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

src/components/HelloWorld.vue

+9-1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ const elements = computed(() => {
109109
];
110110
});
111111
112+
const sortable = ref<InstanceType<typeof Sortable> | null>(null);
113+
112114
const logEvent = (evt: Event, evt2?: Event) => {
113115
if (evt2) {
114116
console.log(evt, evt2);
@@ -117,6 +119,11 @@ const logEvent = (evt: Event, evt2?: Event) => {
117119
}
118120
};
119121
122+
const logClick = (evt: Event) => {
123+
if (sortable.value?.isDragging) return;
124+
logEvent(evt);
125+
};
126+
120127
const animating = ref(true);
121128
const scrollSensitivity = ref(50);
122129
const scrollSpeed = ref(10);
@@ -221,9 +228,10 @@ main {
221228
@filter="logEvent"
222229
@move="logEvent"
223230
@clone="logEvent"
231+
ref="sortable"
224232
>
225233
<template #item="{ element, index }">
226-
<div class="draggable" :key="element.id">
234+
<div class="draggable" :key="element.id" @click="logClick">
227235
{{ element.text }}
228236
<Sortable
229237
v-if="element.children"

src/components/Sortable.vue

+18-4
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ const emit = defineEmits<{
6565
6666
const attrs = useAttrs();
6767
68+
const isDragging = ref(false);
6869
const containerRef = ref<HTMLElement | null>(null);
6970
const sortable = ref<Sortable | null>(null);
7071
const getKey = computed(() => {
@@ -73,16 +74,30 @@ const getKey = computed(() => {
7374
return props.itemKey;
7475
});
7576
76-
defineExpose({ containerRef, sortable: <Ref<Sortable | null>>sortable });
77+
defineExpose({
78+
containerRef,
79+
sortable: <Ref<Sortable | null>>sortable,
80+
isDragging,
81+
});
7782
7883
watch(containerRef, (newDraggable) => {
7984
if (newDraggable) {
8085
sortable.value = new Sortable(newDraggable, {
8186
...props.options,
8287
onChoose: (event) => emit("choose", event),
8388
onUnchoose: (event) => emit("unchoose", event),
84-
onStart: (event) => emit("start", event),
85-
onEnd: (event) => emit("end", event),
89+
onStart: (event) => {
90+
isDragging.value = true;
91+
emit("start", event);
92+
},
93+
onEnd: (event) => {
94+
// This is a hack to move the event to the end of the event queue.
95+
// cf this issue: https://github.com/SortableJS/Sortable/issues/1184
96+
setTimeout(() => {
97+
isDragging.value = false;
98+
emit("end", event);
99+
});
100+
},
86101
onAdd: (event) => emit("add", event),
87102
onUpdate: (event) => emit("update", event),
88103
onSort: (event) => emit("sort", event),
@@ -117,7 +132,6 @@ onUnmounted(() => {
117132
sortable.value = null;
118133
}
119134
});
120-
121135
</script>
122136

123137
<template>

0 commit comments

Comments
 (0)