新增: 依赖图环形检测 + PNG 导出 + 任务列表真实总数

- 后端 detect_module_cycles IPC(DFS 三色标记法检测环形依赖)
- 前端环检测按钮:高亮参与环的节点(红色边框)
- 图导出 PNG(X6 toPNG 回调模式)
- 后端 count_tasks IPC + 前端 taskApi.count()
- 任务列表所有筛选/搜索/排序/翻页均拉真实 total
This commit is contained in:
2026-07-01 11:30:19 +08:00
parent 89912155a6
commit 36ea090d9b
7 changed files with 151 additions and 5 deletions

View File

@@ -252,7 +252,10 @@ watch(searchKeyword, () => {
_searchTimer = setTimeout(() => {
page.value = 1
loading.value = true
store.loadTasks(buildTaskQuery()).finally(() => { loading.value = false })
Promise.all([
store.loadTasks(buildTaskQuery()),
taskApi.count(buildTaskQuery()).then(n => totalTasks.value = n),
]).finally(() => { loading.value = false })
}, 300)
})
@@ -383,20 +386,29 @@ watch(activeProject, () => {
store.setActiveTaskProject(activeProject.value)
page.value = 1
loading.value = true
store.loadTasks(buildTaskQuery()).finally(() => { loading.value = false })
Promise.all([
store.loadTasks(buildTaskQuery()),
taskApi.count(buildTaskQuery()).then(n => totalTasks.value = n),
]).finally(() => { loading.value = false })
})
watch(activeStatus, () => {
store.setActiveTaskStatus(activeStatus.value)
page.value = 1
loading.value = true
store.loadTasks(buildTaskQuery()).finally(() => { loading.value = false })
Promise.all([
store.loadTasks(buildTaskQuery()),
taskApi.count(buildTaskQuery()).then(n => totalTasks.value = n),
]).finally(() => { loading.value = false })
})
watch(sortBy, () => {
page.value = 1
loading.value = true
store.loadTasks(buildTaskQuery()).finally(() => { loading.value = false })
Promise.all([
store.loadTasks(buildTaskQuery()),
taskApi.count(buildTaskQuery()).then(n => totalTasks.value = n),
]).finally(() => { loading.value = false })
})
// Ctrl+N 新建 / Ctrl+F 搜索(桌面快捷键)
@@ -415,7 +427,11 @@ onMounted(async () => {
store.setActiveTaskStatus(activeStatus.value)
loading.value = true
try {
await Promise.all([store.loadProjects(), store.loadTasks()])
await Promise.all([
store.loadProjects(),
store.loadTasks(),
taskApi.count().then(n => totalTasks.value = n),
])
} finally {
loading.value = false
}