Feat : move card and keep position on array reorder

This commit is contained in:
2024-07-08 11:22:29 +02:00
parent 6cdd846d3f
commit 6bef7778e8
2 changed files with 64 additions and 18 deletions
+52 -18
View File
@@ -20,7 +20,14 @@ const props = withDefaults(defineProps<Props>(), {
noEffects: () => false,
});
const emit = defineEmits(["click", "effectClick", "drop", "move"]);
const emit = defineEmits([
"click",
"effectClick",
"drop",
"move",
"startMove",
"stopMove",
]);
const settingsStore = useSettingsStore();
@@ -39,6 +46,9 @@ const dragStatus = ref<{
const initialOffsetX = ref(0);
const initialOffsetY = ref(0);
const mousePageX = ref(0);
const mousePageY = ref(0);
const offsetX = ref(0);
const offsetY = ref(0);
const offsetWidth = ref(0);
@@ -71,8 +81,6 @@ function mouseenter(e: MouseEvent) {
}
function mouseleave(e: MouseEvent) {
isZooming.value = false;
dragStatus.value.dragging = false;
clearTimeout(dragStatus.value.intervalEvent);
}
function rightClickDown(e: MouseEvent) {
@@ -84,6 +92,7 @@ function rightClickUp(e: MouseEvent) {
}
function startDrag(e: MouseEvent) {
emit("startMove");
dragStatus.value.dragging = true;
translateX.value = 0;
translateY.value = 0;
@@ -91,20 +100,31 @@ function startDrag(e: MouseEvent) {
if (!cardElement) {
return;
}
mousePageX.value = e.pageX;
mousePageY.value = e.pageY;
initialOffsetX.value = e.offsetX;
initialOffsetY.value = e.offsetY;
offsetX.value = cardElement.offsetLeft + e.offsetX;
offsetY.value = cardElement.offsetTop + e.offsetY;
translateX.value = e.pageX - offsetX.value;
translateY.value = e.pageY - offsetY.value;
translateX.value = mousePageX.value - offsetX.value;
translateY.value = mousePageY.value - offsetY.value;
}
function leftClickDown(e: MouseEvent) {
dragStatus.value.hasClickedDown = true;
window.addEventListener("mousemove", mouseMove, false);
}
function leftClickUpGlobal(e: MouseEvent) {
dragStatus.value.dragging = false;
mousePageX.value = e.pageX;
mousePageY.value = e.pageY;
if (dragStatus.value.dragging && dragStatus.value.hasClickedDown) {
dragStatus.value.dragging = false;
emit("drop", { x: e.pageX, y: e.pageY, uuid: props.card?._id });
emit("stopMove");
}
dragStatus.value.hasClickedDown = false;
clearTimeout(dragStatus.value.intervalEvent);
window.removeEventListener("mousemove", mouseMove, false);
}
@@ -115,12 +135,6 @@ function leftClickUp(e: MouseEvent) {
cardClick();
return;
}
if (dragStatus.value.dragging && dragStatus.value.hasClickedDown) {
dragStatus.value.dragging = false;
dragStatus.value.hasClickedDown = false;
emit("drop", { x: e.pageX, y: e.pageY, uuid: props.card?._id });
}
}
const sensitivity = 0.5;
@@ -137,14 +151,16 @@ function mouseMove(e: MouseEvent) {
if (!cardElement) {
return;
}
mousePageX.value = e.pageX;
mousePageY.value = e.pageY;
// console.log(cardElement.offsetLeft);
offsetX.value = cardElement.offsetLeft + initialOffsetX.value;
offsetY.value = cardElement.offsetTop + initialOffsetY.value;
translateX.value = e.pageX - offsetX.value;
translateY.value = e.pageY - offsetY.value;
translateX.value = mousePageX.value - offsetX.value;
translateY.value = mousePageY.value - offsetY.value;
emit("move", { x: e.pageX, y: e.pageY, uuid: props.card?._id });
// emit("move", { x: e.pageX, y: e.pageY, uuid: props.card?._id });
}
defineExpose({
@@ -168,14 +184,30 @@ onMounted(() => {
cardElement.offsetWidth;
});
onRenderTriggered(() => {
// onRenderTriggered(() => {
// const cardElement = card.value;
// if (!cardElement) {
// return;
// }
// offsetX.value = cardElement.offsetLeft + initialOffsetX.value;
// offsetY.value = cardElement.offsetTop + initialOffsetY.value;
// translateX.value = mousePageX.value - offsetX.value;
// translateY.value = mousePageY.value - offsetY.value;
// });
onUpdated(() => {
const cardElement = card.value;
if (!cardElement) {
return;
}
offsetX.value = cardElement.offsetLeft;
offsetY.value = cardElement.offsetTop;
offsetX.value = cardElement.offsetLeft + initialOffsetX.value;
offsetY.value = cardElement.offsetTop + initialOffsetY.value;
translateX.value = mousePageX.value - offsetX.value;
translateY.value = mousePageY.value - offsetY.value;
});
onUnmounted(() => {
window.removeEventListener("mouseup", leftClickUpGlobal, false);
// window.addEventListener("mousemove", mouseMove, false);
@@ -199,6 +231,8 @@ onUnmounted(() => {
@mouseup.right="rightClickUp"
@mousedown.left="leftClickDown"
@mouseup.left="leftClickUp"
@mouseenter="mouseenter"
@mouseleave="mouseleave"
>
<div id="overlay"><slot></slot></div>
+12
View File
@@ -87,6 +87,16 @@ function endAnimation() {
onUnmounted(() => {
// containerEvents.delete(props.container._id);
});
const interval = ref<ReturnType<typeof setInterval>>();
function startMove() {
interval.value = setInterval(() => {
props.container.cards.sort((a, b) => Math.random() - 0.5);
}, 1000);
}
function stopMove() {
clearInterval(interval.value);
}
</script>
<template>
@@ -98,6 +108,8 @@ onUnmounted(() => {
<CardPreview
@click="$emit('cardClick', c._id)"
@effectClick="$emit('effectClick', c._id, $event)"
@startMove="startMove"
@stopMove="stopMove"
v-for="c in cards"
:card_id="c.cardId"
:wrapped="wrapped"