修复流式日历多天日程拖拽:记录抓取偏移,被抓住的日期对齐落点而非首日

This commit is contained in:
2026-08-13 15:51:34 +08:00
parent 6e2283e8e0
commit e9d7d3f903
1 file changed
+15 -4
@@ -750,17 +750,27 @@ function handleKeyDown(e) {
} }
} }
function handleDragStart(event, e) { function handleDragStart(seg, e) {
const event = seg.event
if (!event.canEdit) { if (!event.canEdit) {
e.preventDefault() e.preventDefault()
return return
} }
e.dataTransfer.effectAllowed = 'move' e.dataTransfer.effectAllowed = 'move'
e.dataTransfer.setData('text/plain', String(event.id)) e.dataTransfer.setData('text/plain', String(event.id))
const barRect = e.currentTarget.getBoundingClientRect()
const spanDays = seg.endCol - seg.startCol + 1
const grabDay = Math.max(0, Math.min(spanDays - 1,
Math.floor(((e.clientX - barRect.left) / barRect.width) * spanDays)))
const grabDate = addDays(strToDate(seg.segStart), grabDay)
const grabOffset = Math.round((grabDate - strToDate(event.startDate)) / 86400000)
dragState.value = { dragState.value = {
eventId: event.id, eventId: event.id,
originalStart: event.startDate, originalStart: event.startDate,
originalEnd: event.endDate, originalEnd: event.endDate,
grabOffset,
dragging: true, dragging: true,
} }
} }
@@ -800,9 +810,10 @@ function handleDrop(dateStr) {
const origStart = strToDate(event.startDate) const origStart = strToDate(event.startDate)
const targetDate = strToDate(dateStr) const targetDate = strToDate(dateStr)
const diff = Math.round((targetDate - origStart) / 86400000) const diff = Math.round((targetDate - origStart) / 86400000)
const grabOffset = dragState.value.grabOffset ?? 0
const newStart = dateToStr(targetDate) const newStart = dateToStr(addDays(targetDate, -grabOffset))
const newEnd = dateToStr(addDays(strToDate(event.endDate), diff)) const newEnd = dateToStr(addDays(strToDate(event.endDate), diff - grabOffset))
calendarApi.updateEvent({ calendarApi.updateEvent({
id: event.id, id: event.id,
@@ -1324,7 +1335,7 @@ watch(locale, () => {
draggable="true" draggable="true"
@click.stop="handleEventClick(seg.event)" @click.stop="handleEventClick(seg.event)"
@contextmenu.prevent.stop="handleEventContextMenu($event, seg.event)" @contextmenu.prevent.stop="handleEventContextMenu($event, seg.event)"
@dragstart="handleDragStart(seg.event, $event)" @dragstart="handleDragStart(seg, $event)"
@dragend="handleDragEnd" @dragend="handleDragEnd"
> >
<span v-if="seg.continuesBefore" class="event-continue-left">«</span> <span v-if="seg.continuesBefore" class="event-continue-left">«</span>