fix: prevent accidental subtask completion
ci / gitleaks (push) Successful in 20s
ci / docker (push) Successful in 3m59s

This commit is contained in:
2026-09-15 11:09:35 +08:00
parent f5a1521a4f
commit 0e93b15797
3 changed files with 24 additions and 4 deletions
+10 -2
View File
@@ -654,14 +654,22 @@ async function loadTodayView() {
await loadAll()
}
function applyTaskUpdate(task: Task, updated: Task, updateSelected = true) {
const updateNestedSubtasks = (items: Task[]) => items.map((item) => ({
...item,
subtasks: item.subtasks?.map((subtask) => subtask.id === task.id ? { ...subtask, ...updated } : subtask),
}))
const index = tasks.value.findIndex((item) => item.id === task.id)
if (index >= 0) tasks.value[index] = { ...tasks.value[index], ...updated }
else tasks.value = updateNestedSubtasks(tasks.value)
const overdueIndex = overdueTasks.value.findIndex((item) => item.id === task.id)
if (overdueIndex >= 0) {
if (updated.completed && !completionExitingTaskIds.value.has(task.id)) overdueTasks.value.splice(overdueIndex, 1)
else overdueTasks.value[overdueIndex] = { ...overdueTasks.value[overdueIndex], ...updated }
}
} else overdueTasks.value = updateNestedSubtasks(overdueTasks.value)
if (updateSelected && selectedTask.value?.id === task.id) selectedTask.value = { ...selectedTask.value, ...updated }
else if (updateSelected && selectedTask.value?.subtasks) {
selectedTask.value.subtasks = selectedTask.value.subtasks.map((subtask) => subtask.id === task.id ? { ...subtask, ...updated } : subtask)
}
}
async function patchTask(task: Task, patch: Partial<Task>, updateSelected = true) {
const updated = await api(`/tasks/${task.id}`, { method: 'PATCH', body: JSON.stringify({ ...patch, version: task.version }) }) as Task
@@ -1528,7 +1536,7 @@ onUnmounted(() => {
</div>
<div v-else class="markdown-preview" :class="{'markdown-preview-empty':!selectedTask.description.trim()}" v-html="selectedTask.description.trim() ? renderMarkdown(selectedTask.description) : '<p>暂无备注,切回编辑开始书写。</p>'"/>
</div>
<div class="subtasks"><div class="field-label"><span>子任务</span><button class="link" @click="addSubtask"><Plus/>添加</button></div><button v-for="subtask in selectedTaskSubtasks" :key="subtask.id" class="subtask-detail" @click="toggle(subtask)"><span class="check"><Check v-if="subtask.completed"/></span><span :class="{strike:subtask.completed}">{{subtask.title}}</span></button><span v-if="!selectedTaskSubtasks.length" class="hint">把这件事拆成更小的步骤</span></div>
<div class="subtasks"><div class="field-label"><span>子任务</span><button class="link" @click="addSubtask"><Plus/>添加</button></div><div v-for="subtask in selectedTaskSubtasks" :key="subtask.id" class="subtask-detail"><button class="check subtask-check" type="button" :aria-label="subtask.completed ? `重新打开${subtask.title}` : `完成${subtask.title}`" :aria-pressed="subtask.completed" @click="toggle(subtask)"><Check v-if="subtask.completed"/></button><span :class="{strike:subtask.completed}">{{subtask.title}}</span></div><span v-if="!selectedTaskSubtasks.length" class="hint">把这件事拆成更小的步骤</span></div>
<details class="more-settings" :open="moreSettingsOpen" @toggle="moreSettingsOpen=($event.target as HTMLDetailsElement).open"><summary>更多设置</summary><div class="more-settings-body">
<label>优先级<select v-model.number="selectedTask.priority"><option :value="0">无</option><option :value="1">低</option><option :value="2">中</option><option :value="3">高</option></select></label>
</div></details>