From 5e4ad8b2f524e62792b3a2eae0665d5b3c049410 Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Mon, 25 Aug 2025 20:28:43 -0600 Subject: [PATCH] Multi day event dragging restored such that it remembers the grabbing position and behaves correctly. --- src/components/EventOverlay.vue | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/components/EventOverlay.vue b/src/components/EventOverlay.vue index acc60b6..6a60ecd 100644 --- a/src/components/EventOverlay.vue +++ b/src/components/EventOverlay.vue @@ -101,6 +101,24 @@ function handleEventPointerDown(span, event) { const hasVirtualMarker = typeof idStr === 'string' && idStr.includes('_v_') const baseId = hasVirtualMarker ? idStr.slice(0, idStr.lastIndexOf('_v_')) : idStr const isVirtual = hasVirtualMarker + // Determine which day within the span was grabbed so we maintain relative position + let anchorDate = span.startDate + try { + const spanDays = daysInclusive(span.startDate, span.endDate) + const targetEl = event.currentTarget + if (targetEl && spanDays > 0) { + const rect = targetEl.getBoundingClientRect() + const relX = event.clientX - rect.left + const dayWidth = rect.width / spanDays + let dayIndex = Math.floor(relX / dayWidth) + if (!isFinite(dayIndex)) dayIndex = 0 + if (dayIndex < 0) dayIndex = 0 + if (dayIndex >= spanDays) dayIndex = spanDays - 1 + anchorDate = addDaysStr(span.startDate, dayIndex) + } + } catch (e) { + // Fallback to startDate if any calculation fails + } startLocalDrag( { id: baseId, @@ -109,7 +127,7 @@ function handleEventPointerDown(span, event) { mode: 'move', pointerStartX: event.clientX, pointerStartY: event.clientY, - anchorDate: span.startDate, + anchorDate, startDate: span.startDate, endDate: span.endDate, },