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:
@@ -249,7 +249,7 @@ const toggleTaskList = () => {
|
|||||||
window.dispatchEvent(
|
window.dispatchEvent(
|
||||||
new CustomEvent('timeline-container-resized', {
|
new CustomEvent('timeline-container-resized', {
|
||||||
detail: { source: 'manual-task-list-toggle' },
|
detail: { source: 'manual-task-list-toggle' },
|
||||||
}),
|
})
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}, 400)
|
}, 400)
|
||||||
@@ -265,7 +265,7 @@ const handleToggleTaskList = (event: CustomEvent) => {
|
|||||||
window.dispatchEvent(
|
window.dispatchEvent(
|
||||||
new CustomEvent('timeline-container-resized', {
|
new CustomEvent('timeline-container-resized', {
|
||||||
detail: { source: 'task-list-toggle' },
|
detail: { source: 'task-list-toggle' },
|
||||||
}),
|
})
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -298,7 +298,7 @@ const handleTaskCollapseChange = (task: Task) => {
|
|||||||
const updateTaskCollapsedState = (
|
const updateTaskCollapsedState = (
|
||||||
tasks: Task[],
|
tasks: Task[],
|
||||||
targetId: number,
|
targetId: number,
|
||||||
collapsed: boolean,
|
collapsed: boolean
|
||||||
): boolean => {
|
): boolean => {
|
||||||
for (const t of tasks) {
|
for (const t of tasks) {
|
||||||
if (t.id === targetId) {
|
if (t.id === targetId) {
|
||||||
@@ -369,7 +369,7 @@ watch(
|
|||||||
notifyTaskListUpdated()
|
notifyTaskListUpdated()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
{ deep: true, immediate: true },
|
{ deep: true, immediate: true }
|
||||||
)
|
)
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
@@ -407,7 +407,7 @@ onUnmounted(() => {
|
|||||||
window.removeEventListener('task-added', handleTaskAdd as EventListener)
|
window.removeEventListener('task-added', handleTaskAdd as EventListener)
|
||||||
window.removeEventListener(
|
window.removeEventListener(
|
||||||
'milestone-icon-changed',
|
'milestone-icon-changed',
|
||||||
handleMilestoneIconChangeEvent as EventListener,
|
handleMilestoneIconChangeEvent as EventListener
|
||||||
)
|
)
|
||||||
window.removeEventListener('milestone-deleted', handleMilestoneDeleted as EventListener)
|
window.removeEventListener('milestone-deleted', handleMilestoneDeleted as EventListener)
|
||||||
window.removeEventListener('milestone-data-changed', handleMilestoneDataChanged as EventListener)
|
window.removeEventListener('milestone-data-changed', handleMilestoneDataChanged as EventListener)
|
||||||
@@ -1183,7 +1183,7 @@ watch(
|
|||||||
val => {
|
val => {
|
||||||
if (val) setCustomMessages(locale.value, val)
|
if (val) setCustomMessages(locale.value, val)
|
||||||
},
|
},
|
||||||
{ deep: true },
|
{ deep: true }
|
||||||
)
|
)
|
||||||
|
|
||||||
// 右键菜单状态管理
|
// 右键菜单状态管理
|
||||||
@@ -1329,6 +1329,10 @@ function handleAddPredecessor(targetTask: Task) {
|
|||||||
description: '',
|
description: '',
|
||||||
parentId: targetTask.parentId,
|
parentId: targetTask.parentId,
|
||||||
children: [],
|
children: [],
|
||||||
|
isTimerRunning: false,
|
||||||
|
timerStartTime: undefined,
|
||||||
|
timerEndTime: undefined,
|
||||||
|
timerElapsedTime: 0,
|
||||||
}
|
}
|
||||||
taskDrawerTask.value = newTask
|
taskDrawerTask.value = newTask
|
||||||
taskDrawerEditMode.value = false
|
taskDrawerEditMode.value = false
|
||||||
@@ -1355,6 +1359,10 @@ function handleAddSuccessor(targetTask: Task) {
|
|||||||
description: '',
|
description: '',
|
||||||
parentId: targetTask.parentId,
|
parentId: targetTask.parentId,
|
||||||
children: [],
|
children: [],
|
||||||
|
isTimerRunning: false,
|
||||||
|
timerStartTime: undefined,
|
||||||
|
timerEndTime: undefined,
|
||||||
|
timerElapsedTime: 0,
|
||||||
}
|
}
|
||||||
taskDrawerTask.value = newTask
|
taskDrawerTask.value = newTask
|
||||||
taskDrawerEditMode.value = false
|
taskDrawerEditMode.value = false
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ watch(
|
|||||||
() => [props.task?.isTimerRunning, props.task?.timerStartTime, props.task?.timerElapsedTime],
|
() => [props.task?.isTimerRunning, props.task?.timerStartTime, props.task?.timerElapsedTime],
|
||||||
() => {
|
() => {
|
||||||
updateTimer()
|
updateTimer()
|
||||||
},
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// 计时器本地状态,保证点击后UI立即切换
|
// 计时器本地状态,保证点击后UI立即切换
|
||||||
@@ -84,7 +84,7 @@ watch(
|
|||||||
timerInterval.value = null
|
timerInterval.value = null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ immediate: true },
|
{ immediate: true }
|
||||||
)
|
)
|
||||||
|
|
||||||
// 修正计时器每秒递增逻辑,保证计时器正常跳动
|
// 修正计时器每秒递增逻辑,保证计时器正常跳动
|
||||||
@@ -102,7 +102,7 @@ watch(
|
|||||||
updateTimer()
|
updateTimer()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ immediate: true },
|
{ immediate: true }
|
||||||
)
|
)
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
@@ -138,6 +138,10 @@ const formData = reactive<Task>({
|
|||||||
progress: 0,
|
progress: 0,
|
||||||
description: '',
|
description: '',
|
||||||
parentId: undefined, // 上级任务ID
|
parentId: undefined, // 上级任务ID
|
||||||
|
isTimerRunning: false, // 是否正在计时
|
||||||
|
timerStartTime: undefined, // 计时器开始时间
|
||||||
|
timerEndTime: undefined, // 计时器结束时间
|
||||||
|
timerElapsedTime: 0, // 计时器已用时间
|
||||||
})
|
})
|
||||||
|
|
||||||
// 任务列表数据
|
// 任务列表数据
|
||||||
@@ -149,7 +153,7 @@ const availableParentTasks = computed(() => {
|
|||||||
.filter(
|
.filter(
|
||||||
task =>
|
task =>
|
||||||
task.id !== props.task?.id && // 排除当前任务自己
|
task.id !== props.task?.id && // 排除当前任务自己
|
||||||
(task.type === 'story' || task.type === 'task'), // 只显示story和task类型
|
(task.type === 'story' || task.type === 'task') // 只显示story和task类型
|
||||||
)
|
)
|
||||||
.map(task => ({
|
.map(task => ({
|
||||||
...task,
|
...task,
|
||||||
@@ -279,7 +283,7 @@ watch(
|
|||||||
// 抽屉显示时重新请求任务数据,确保前置任务列表是最新的
|
// 抽屉显示时重新请求任务数据,确保前置任务列表是最新的
|
||||||
window.dispatchEvent(new CustomEvent('request-task-list'))
|
window.dispatchEvent(new CustomEvent('request-task-list'))
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// 监听 isVisible 变化,同步到父组件
|
// 监听 isVisible 变化,同步到父组件
|
||||||
@@ -296,7 +300,7 @@ watch(
|
|||||||
formData.parentId = newTask.parentId ?? undefined
|
formData.parentId = newTask.parentId ?? undefined
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ immediate: true },
|
{ immediate: true }
|
||||||
)
|
)
|
||||||
|
|
||||||
// 重置表单
|
// 重置表单
|
||||||
@@ -313,6 +317,10 @@ const resetForm = () => {
|
|||||||
progress: 0,
|
progress: 0,
|
||||||
description: '',
|
description: '',
|
||||||
parentId: undefined,
|
parentId: undefined,
|
||||||
|
isTimerRunning: false,
|
||||||
|
timerStartTime: undefined,
|
||||||
|
timerEndTime: undefined,
|
||||||
|
timerElapsedTime: 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
// 清除错误信息
|
// 清除错误信息
|
||||||
@@ -477,41 +485,7 @@ watch(
|
|||||||
newValue => {
|
newValue => {
|
||||||
progressDisplayValue.value = (newValue || 0).toString()
|
progressDisplayValue.value = (newValue || 0).toString()
|
||||||
},
|
},
|
||||||
{ immediate: true },
|
{ 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 },
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 修正计时器首次启动不跳动问题:每次打开抽屉时重置 timerElapsed,且 timerStartTime 为空时立即赋值
|
// 修正计时器首次启动不跳动问题:每次打开抽屉时重置 timerElapsed,且 timerStartTime 为空时立即赋值
|
||||||
@@ -529,7 +503,7 @@ watch(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ immediate: true },
|
{ immediate: true }
|
||||||
)
|
)
|
||||||
|
|
||||||
const handleStartTimer = (desc?: string) => {
|
const handleStartTimer = (desc?: string) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user