v1.2.1 - bugfix: 在计时过的任务,停止计时后,添加前置或后置任务,新任务自动开启计时器问题。In tasks where timing is involved, after stopping the timer, adding predecessor or successor tasks leads to the new task automatically starting the timer.

This commit is contained in:
LINING-PC\lining
2025-07-22 11:44:15 +08:00
parent 064eba945d
commit b964c52796
2 changed files with 30 additions and 48 deletions
+14 -6
View File
@@ -249,7 +249,7 @@ const toggleTaskList = () => {
window.dispatchEvent(
new CustomEvent('timeline-container-resized', {
detail: { source: 'manual-task-list-toggle' },
}),
})
)
})
}, 400)
@@ -265,7 +265,7 @@ const handleToggleTaskList = (event: CustomEvent) => {
window.dispatchEvent(
new CustomEvent('timeline-container-resized', {
detail: { source: 'task-list-toggle' },
}),
})
)
})
}
@@ -298,7 +298,7 @@ const handleTaskCollapseChange = (task: Task) => {
const updateTaskCollapsedState = (
tasks: Task[],
targetId: number,
collapsed: boolean,
collapsed: boolean
): boolean => {
for (const t of tasks) {
if (t.id === targetId) {
@@ -369,7 +369,7 @@ watch(
notifyTaskListUpdated()
})
},
{ deep: true, immediate: true },
{ deep: true, immediate: true }
)
onMounted(() => {
@@ -407,7 +407,7 @@ onUnmounted(() => {
window.removeEventListener('task-added', handleTaskAdd as EventListener)
window.removeEventListener(
'milestone-icon-changed',
handleMilestoneIconChangeEvent as EventListener,
handleMilestoneIconChangeEvent as EventListener
)
window.removeEventListener('milestone-deleted', handleMilestoneDeleted as EventListener)
window.removeEventListener('milestone-data-changed', handleMilestoneDataChanged as EventListener)
@@ -1183,7 +1183,7 @@ watch(
val => {
if (val) setCustomMessages(locale.value, val)
},
{ deep: true },
{ deep: true }
)
// 右键菜单状态管理
@@ -1329,6 +1329,10 @@ function handleAddPredecessor(targetTask: Task) {
description: '',
parentId: targetTask.parentId,
children: [],
isTimerRunning: false,
timerStartTime: undefined,
timerEndTime: undefined,
timerElapsedTime: 0,
}
taskDrawerTask.value = newTask
taskDrawerEditMode.value = false
@@ -1355,6 +1359,10 @@ function handleAddSuccessor(targetTask: Task) {
description: '',
parentId: targetTask.parentId,
children: [],
isTimerRunning: false,
timerStartTime: undefined,
timerEndTime: undefined,
timerElapsedTime: 0,
}
taskDrawerTask.value = newTask
taskDrawerEditMode.value = false
+16 -42
View File
@@ -68,7 +68,7 @@ watch(
() => [props.task?.isTimerRunning, props.task?.timerStartTime, props.task?.timerElapsedTime],
() => {
updateTimer()
},
}
)
// 计时器本地状态,保证点击后UI立即切换
@@ -84,7 +84,7 @@ watch(
timerInterval.value = null
}
},
{ immediate: true },
{ immediate: true }
)
// 修正计时器每秒递增逻辑,保证计时器正常跳动
@@ -102,7 +102,7 @@ watch(
updateTimer()
}
},
{ immediate: true },
{ immediate: true }
)
onUnmounted(() => {
@@ -138,6 +138,10 @@ const formData = reactive<Task>({
progress: 0,
description: '',
parentId: undefined, // 上级任务ID
isTimerRunning: false, // 是否正在计时
timerStartTime: undefined, // 计时器开始时间
timerEndTime: undefined, // 计时器结束时间
timerElapsedTime: 0, // 计时器已用时间
})
// 任务列表数据
@@ -149,7 +153,7 @@ const availableParentTasks = computed(() => {
.filter(
task =>
task.id !== props.task?.id && // 排除当前任务自己
(task.type === 'story' || task.type === 'task'), // 只显示story和task类型
(task.type === 'story' || task.type === 'task') // 只显示story和task类型
)
.map(task => ({
...task,
@@ -279,7 +283,7 @@ watch(
// 抽屉显示时重新请求任务数据,确保前置任务列表是最新的
window.dispatchEvent(new CustomEvent('request-task-list'))
}
},
}
)
// 监听 isVisible 变化,同步到父组件
@@ -296,7 +300,7 @@ watch(
formData.parentId = newTask.parentId ?? undefined
}
},
{ immediate: true },
{ immediate: true }
)
// 重置表单
@@ -313,6 +317,10 @@ const resetForm = () => {
progress: 0,
description: '',
parentId: undefined,
isTimerRunning: false,
timerStartTime: undefined,
timerEndTime: undefined,
timerElapsedTime: 0,
})
// 清除错误信息
@@ -477,41 +485,7 @@ watch(
newValue => {
progressDisplayValue.value = (newValue || 0).toString()
},
{ immediate: true },
)
// 计时器本地状态,保证点击后UI立即切换
// !!! 只保留一处 localTimerRunning 定义,彻底移除重复声明 !!!
// 只要 props.task 变化或全局事件变化,立即同步本地状态
watch(
() => props.task?.isTimerRunning,
val => {
localTimerRunning.value = !!val
if (!val && timerInterval.value) {
clearInterval(timerInterval.value)
timerInterval.value = null
}
},
{ immediate: true },
)
// 修正计时器每秒递增逻辑,保证计时器正常跳动
watch(
[localTimerRunning, timerStartTime, timerElapsedTime],
() => {
if (timerInterval.value) {
clearInterval(timerInterval.value)
timerInterval.value = null
}
if (localTimerRunning.value && timerStartTime.value) {
updateTimer()
timerInterval.value = window.setInterval(updateTimer, 1000)
} else {
updateTimer()
}
},
{ immediate: true },
{ immediate: true }
)
// 修正计时器首次启动不跳动问题:每次打开抽屉时重置 timerElapsed,且 timerStartTime 为空时立即赋值
@@ -529,7 +503,7 @@ watch(
}
}
},
{ immediate: true },
{ immediate: true }
)
const handleStartTimer = (desc?: string) => {