v1.3.0 - bugfix

This commit is contained in:
LINING-PC\lining
2025-09-12 17:00:32 +08:00
parent 5c8057390a
commit 23be4e69f9
+55 -57
View File
@@ -347,39 +347,37 @@ const optimizedTimelineData = computed(() => {
const { startHour, endHour } = visibleHourRange.value const { startHour, endHour } = visibleHourRange.value
return (cachedData as any[]) return (cachedData as any[])
.map( .map((day: any) => {
(day: any) => { // 计算当前天相对于时间线开始的小时偏移
// 计算当前天相对于时间线开始的小时偏移 const dayStart = new Date(timelineConfig.value.startDate)
const dayStart = new Date(timelineConfig.value.startDate) dayStart.setHours(0, 0, 0, 0)
dayStart.setHours(0, 0, 0, 0) const currentDay = new Date(day.year, day.month - 1, day.day)
const currentDay = new Date(day.year, day.month - 1, day.day) currentDay.setHours(0, 0, 0, 0)
currentDay.setHours(0, 0, 0, 0) const daysDiff = Math.floor(
const daysDiff = Math.floor( (currentDay.getTime() - dayStart.getTime()) / (1000 * 60 * 60 * 24)
(currentDay.getTime() - dayStart.getTime()) / (1000 * 60 * 60 * 24), )
) const totalHourOffset = daysDiff * 24
const totalHourOffset = daysDiff * 24
// 计算当前天应该显示的小时范围 // 计算当前天应该显示的小时范围
const dayStartHour = Math.max(0, startHour - totalHourOffset) const dayStartHour = Math.max(0, startHour - totalHourOffset)
const dayEndHour = Math.min(day.hours.length, endHour - totalHourOffset) const dayEndHour = Math.min(day.hours.length, endHour - totalHourOffset)
return { return {
...day, ...day,
hours: dayStartHour < dayEndHour ? day.hours.slice(dayStartHour, dayEndHour) : [], hours: dayStartHour < dayEndHour ? day.hours.slice(dayStartHour, dayEndHour) : [],
// 全局小时偏移(相对于时间线开始的绝对位置) // 全局小时偏移(相对于时间线开始的绝对位置)
hourOffset: totalHourOffset + dayStartHour, hourOffset: totalHourOffset + dayStartHour,
// 当前天内的小时偏移 // 当前天内的小时偏移
visibleHourStart: dayStartHour, visibleHourStart: dayStartHour,
// 调试信息 // 调试信息
_debug: { _debug: {
totalHourOffset, totalHourOffset,
dayStartHour, dayStartHour,
dayEndHour, dayEndHour,
visibleRange: { startHour, endHour }, visibleRange: { startHour, endHour },
}, },
} }
}, })
)
.filter((day: any) => day.hours.length > 0) .filter((day: any) => day.hours.length > 0)
} }
@@ -457,7 +455,7 @@ const computeAllMilestonesPositions = () => {
if (!isNaN(milestoneDate.getTime())) { if (!isNaN(milestoneDate.getTime())) {
const startDiff = Math.floor( const startDiff = Math.floor(
(milestoneDate.getTime() - timelineConfig.value.startDate.getTime()) / (milestoneDate.getTime() - timelineConfig.value.startDate.getTime()) /
(1000 * 60 * 60 * 24), (1000 * 60 * 60 * 24)
) )
const left = startDiff * 30 + 30 / 2 - 12 // 30是dayWidth12是图标半径 const left = startDiff * 30 + 30 / 2 - 12 // 30是dayWidth12是图标半径
@@ -491,7 +489,7 @@ const computeAllMilestonesPositions = () => {
if (!isNaN(milestoneDate.getTime())) { if (!isNaN(milestoneDate.getTime())) {
const startDiff = Math.floor( const startDiff = Math.floor(
(milestoneDate.getTime() - timelineConfig.value.startDate.getTime()) / (milestoneDate.getTime() - timelineConfig.value.startDate.getTime()) /
(1000 * 60 * 60 * 24), (1000 * 60 * 60 * 24)
) )
const left = startDiff * 30 + 30 / 2 - 12 const left = startDiff * 30 + 30 / 2 - 12
@@ -594,7 +592,7 @@ const handleTaskRowHover = (taskId: number | null) => {
window.dispatchEvent( window.dispatchEvent(
new CustomEvent('timeline-task-hover', { new CustomEvent('timeline-task-hover', {
detail: taskId, detail: taskId,
}), })
) )
} }
@@ -646,7 +644,7 @@ const handleMilestoneIconChange = (milestoneId: number, icon: string) => {
window.dispatchEvent( window.dispatchEvent(
new CustomEvent('milestone-icon-changed', { new CustomEvent('milestone-icon-changed', {
detail: { milestoneId, icon }, detail: { milestoneId, icon },
}), })
) )
} }
@@ -664,7 +662,7 @@ const handleMilestoneSave = (updatedMilestone: Milestone) => {
window.dispatchEvent( window.dispatchEvent(
new CustomEvent('milestone-data-updated', { new CustomEvent('milestone-data-updated', {
detail: { milestone: updatedMilestone }, detail: { milestone: updatedMilestone },
}), })
) )
} }
@@ -677,14 +675,14 @@ const handleMilestoneDelete = (milestoneId: number) => {
window.dispatchEvent( window.dispatchEvent(
new CustomEvent('milestone-deleted', { new CustomEvent('milestone-deleted', {
detail: { milestoneId }, detail: { milestoneId },
}), })
) )
// 广播里程碑数据变化事件,确保Timeline重新渲染 // 广播里程碑数据变化事件,确保Timeline重新渲染
window.dispatchEvent( window.dispatchEvent(
new CustomEvent('milestone-data-changed', { new CustomEvent('milestone-data-changed', {
detail: { milestoneId }, detail: { milestoneId },
}), })
) )
} }
@@ -699,7 +697,7 @@ const handleMilestoneUpdate = (updatedMilestone: Milestone) => {
window.dispatchEvent( window.dispatchEvent(
new CustomEvent('milestone-data-updated', { new CustomEvent('milestone-data-updated', {
detail: { milestone: updatedMilestone }, detail: { milestone: updatedMilestone },
}), })
) )
} }
@@ -999,7 +997,7 @@ watch(
clearTimelineCache() clearTimelineCache()
timelineData.value = generateTimelineData() timelineData.value = generateTimelineData()
} }
}, }
) )
// 保证每次时间轴数据变化后都自动居中今日(仅初始化和外部props变更时触发,不因任务/里程碑变更触发) // 保证每次时间轴数据变化后都自动居中今日(仅初始化和外部props变更时触发,不因任务/里程碑变更触发)
@@ -1014,7 +1012,7 @@ watch(
}) })
} }
}, },
{ deep: true }, { deep: true }
) )
// 将今日定位到时间线中间位置 // 将今日定位到时间线中间位置
@@ -1036,7 +1034,7 @@ const scrollToTodayCenter = (retry = 0) => {
startNormalized = new Date( startNormalized = new Date(
yearRange.startDate.getFullYear(), yearRange.startDate.getFullYear(),
yearRange.startDate.getMonth(), yearRange.startDate.getMonth(),
yearRange.startDate.getDate(), yearRange.startDate.getDate()
) )
} else if (currentTimeScale.value === TimelineScale.QUARTER) { } else if (currentTimeScale.value === TimelineScale.QUARTER) {
// 季度视图使用与年度视图相同的基准日期,确保坐标系统一致 // 季度视图使用与年度视图相同的基准日期,确保坐标系统一致
@@ -1044,13 +1042,13 @@ const scrollToTodayCenter = (retry = 0) => {
startNormalized = new Date( startNormalized = new Date(
yearRange.startDate.getFullYear(), yearRange.startDate.getFullYear(),
yearRange.startDate.getMonth(), yearRange.startDate.getMonth(),
yearRange.startDate.getDate(), yearRange.startDate.getDate()
) )
} else { } else {
startNormalized = new Date( startNormalized = new Date(
timelineStart.getFullYear(), timelineStart.getFullYear(),
timelineStart.getMonth(), timelineStart.getMonth(),
timelineStart.getDate(), timelineStart.getDate()
) )
} }
@@ -1123,7 +1121,7 @@ const scrollToTodayCenter = (retry = 0) => {
} }
const dayOffset = Math.floor( const dayOffset = Math.floor(
(todayNormalized.getTime() - startOfQuarter.getTime()) / (1000 * 60 * 60 * 24), (todayNormalized.getTime() - startOfQuarter.getTime()) / (1000 * 60 * 60 * 24)
) )
const daysInQuarter = const daysInQuarter =
Math.floor((endOfQuarter.getTime() - startOfQuarter.getTime()) / (1000 * 60 * 60 * 24)) + 1 Math.floor((endOfQuarter.getTime() - startOfQuarter.getTime()) / (1000 * 60 * 60 * 24)) + 1
@@ -1180,7 +1178,7 @@ const getTodayLinePositionInYearView = computed(() => {
const startNormalized = new Date( const startNormalized = new Date(
yearRange.startDate.getFullYear(), yearRange.startDate.getFullYear(),
yearRange.startDate.getMonth(), yearRange.startDate.getMonth(),
yearRange.startDate.getDate(), yearRange.startDate.getDate()
) )
const startYear = startNormalized.getFullYear() const startYear = startNormalized.getFullYear()
@@ -1274,7 +1272,7 @@ const scrollToToday = () => {
const startNormalized = new Date( const startNormalized = new Date(
timelineStart.getFullYear(), timelineStart.getFullYear(),
timelineStart.getMonth(), timelineStart.getMonth(),
timelineStart.getDate(), timelineStart.getDate()
) )
// 计算今天距离时间线开始日期的天数 // 计算今天距离时间线开始日期的天数
@@ -1325,7 +1323,7 @@ const updateTask = (updatedTask: Task) => {
window.dispatchEvent( window.dispatchEvent(
new CustomEvent('task-updated', { new CustomEvent('task-updated', {
detail: updatedTask, detail: updatedTask,
}), })
) )
} }
@@ -1385,7 +1383,7 @@ const handleTaskBarContextMenu = (event: { task: Task; position: { x: number; y:
window.dispatchEvent( window.dispatchEvent(
new CustomEvent('context-menu', { new CustomEvent('context-menu', {
detail: event, detail: event,
}), })
) )
} }
@@ -1468,7 +1466,7 @@ onMounted(() => {
// 监听TaskList的垂直滚动事件 // 监听TaskList的垂直滚动事件
window.addEventListener( window.addEventListener(
'task-list-vertical-scroll', 'task-list-vertical-scroll',
handleTaskListVerticalScroll as EventListener, handleTaskListVerticalScroll as EventListener
) )
// 监听语言变化 // 监听语言变化
window.addEventListener('locale-changed', handleLocaleChange as EventListener) window.addEventListener('locale-changed', handleLocaleChange as EventListener)
@@ -1478,7 +1476,7 @@ onMounted(() => {
// 监听Timeline容器resize事件(TaskList切换等) // 监听Timeline容器resize事件(TaskList切换等)
window.addEventListener( window.addEventListener(
'timeline-container-resized', 'timeline-container-resized',
handleTimelineContainerResized as EventListener, handleTimelineContainerResized as EventListener
) )
// 监听里程碑点击定位事件 // 监听里程碑点击定位事件
@@ -1568,7 +1566,7 @@ const handleTimelineBodyScroll = (event: Event) => {
window.dispatchEvent( window.dispatchEvent(
new CustomEvent('timeline-vertical-scroll', { new CustomEvent('timeline-vertical-scroll', {
detail: { scrollTop }, detail: { scrollTop },
}), })
) )
} }
} }
@@ -1581,7 +1579,7 @@ watch(
updateSvgSize() updateSvgSize()
}) })
}, },
{ immediate: true }, { immediate: true }
) )
// 拖拽滑动相关状态 // 拖拽滑动相关状态
@@ -1765,7 +1763,7 @@ const startAutoScroll = (direction: 'left' | 'right') => {
window.dispatchEvent( window.dispatchEvent(
new CustomEvent('timeline-auto-scroll', { new CustomEvent('timeline-auto-scroll', {
detail: { scrollDelta: newScrollLeft - currentScrollLeft }, detail: { scrollDelta: newScrollLeft - currentScrollLeft },
}), })
) )
autoScrollTimer = window.setTimeout(scroll, 16) // 约60fps autoScrollTimer = window.setTimeout(scroll, 16) // 约60fps
@@ -1819,14 +1817,14 @@ onUnmounted(() => {
window.removeEventListener('task-list-hover', handleTaskListHover as EventListener) window.removeEventListener('task-list-hover', handleTaskListHover as EventListener)
window.removeEventListener( window.removeEventListener(
'task-list-vertical-scroll', 'task-list-vertical-scroll',
handleTaskListVerticalScroll as EventListener, handleTaskListVerticalScroll as EventListener
) )
window.removeEventListener('locale-changed', handleLocaleChange as EventListener) window.removeEventListener('locale-changed', handleLocaleChange as EventListener)
window.removeEventListener('splitter-drag-start', handleSplitterDragStart as EventListener) window.removeEventListener('splitter-drag-start', handleSplitterDragStart as EventListener)
window.removeEventListener('splitter-drag-end', handleSplitterDragEnd as EventListener) window.removeEventListener('splitter-drag-end', handleSplitterDragEnd as EventListener)
window.removeEventListener( window.removeEventListener(
'timeline-container-resized', 'timeline-container-resized',
handleTimelineContainerResized as EventListener, handleTimelineContainerResized as EventListener
) )
window.removeEventListener('milestone-click-locate', handleMilestoneClickLocate as EventListener) window.removeEventListener('milestone-click-locate', handleMilestoneClickLocate as EventListener)
window.removeEventListener('drag-boundary-check', handleDragBoundaryCheck as EventListener) window.removeEventListener('drag-boundary-check', handleDragBoundaryCheck as EventListener)
@@ -1937,7 +1935,7 @@ watch(
} }
}) })
}, },
{ deep: true }, { deep: true }
) )
// 处理里程碑点击定位事件 // 处理里程碑点击定位事件