修复流式日历多天日程拖拽:记录抓取偏移,被抓住的日期对齐落点而非首日
This commit is contained in:
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>
|
||||||
|
|||||||
Reference in New Issue
Block a user