From 7637f297c95d6d077fc2d384a7a1f06686081e29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Mon, 15 Jun 2026 08:21:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20CR-26=20AR-11=20listener?= =?UTF-8?q?=20=E6=8C=89=20B-29=20=E7=AD=9B=E9=80=89=E5=A5=91=E7=BA=A6+Task?= =?UTF-8?q?s=20=E7=A9=BA=E6=80=81=E5=85=9C=E5=BA=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit project.ts listener task 分支改读 _activeTaskProject 闭包 var(undefined 跳过保筛选/all 全量/具体 id 按项目),加 setActiveTaskProject 暴露由 Tasks 注册,保 B-29 store.tasks 反映当前筛选契约(原无参 loadTasks 冲成全量破坏筛选);Tasks.vue 加 v-if loading/error/empty 兜底+setActiveTaskProject onMounted/watch 更新。批8,vue-tsc 0 --- src/stores/project.ts | 20 +++++++++- src/views/Tasks.vue | 93 ++++++++++++++++++++++++++++--------------- 2 files changed, 80 insertions(+), 33 deletions(-) diff --git a/src/stores/project.ts b/src/stores/project.ts index 63f9d41..7c8923a 100644 --- a/src/stores/project.ts +++ b/src/stores/project.ts @@ -26,6 +26,19 @@ function createStore() { // 后端 AI 工具(create/update/delete/restore/purge/bind_directory)执行成功后 emit // "df-data-changed" { entity, action },前端按 entity 调对应 load 刷新列表, // 取代工具执行后需手动刷新。 + // + // CR-260615-26(R-1): task 分支不再无参 loadTasks(会把 store.tasks 冲成全量,破坏 + // B-260615-29「store.tasks 反映当前筛选」契约)。改为读 _activeTaskProject: + // - undefined: Tasks 视图未挂载/从未设过筛选 → 不触发 task load(避免破坏筛选, + // 让 B-29 watch/handle 主导;此时改动由用户下次进 Tasks 自然刷新) + // - 'all' : 全量拉取 + // - 具体 id : 按项目拉取 + // 由 Tasks.vue 经 setActiveTaskProject 在 onMounted/watch 更新本变量。 + let _activeTaskProject: string | undefined = undefined + function setActiveTaskProject(projectKey: string | undefined) { + _activeTaskProject = projectKey + } + let _dataChangedUnlisten: (() => void) | null = null async function startDataChangedListener() { @@ -36,7 +49,10 @@ function createStore() { if (entity === 'project') { void projectsStore.loadProjects() } else if (entity === 'task') { - void tasksStore.loadTasks() + // 无筛选状态(undefined)时不触发,保 B-29 筛选契约;有筛选则按当前 activeProject 拉 + if (_activeTaskProject !== undefined) { + void tasksStore.loadTasks(_activeTaskProject === 'all' ? undefined : _activeTaskProject) + } } else if (entity === 'idea') { void ideasStore.loadIdeas() } @@ -108,6 +124,8 @@ function createStore() { // AR-11(方案A):数据变更联动刷新监听(后端工具执行后 emit df-data-changed) startDataChangedListener, stopDataChangedListener, + // CR-260615-26(R-1): Tasks 视图登记当前 activeProject 筛选,供 listener 按筛选拉取 + setActiveTaskProject, pendingApproval: computed(() => state.pendingApproval), // computed stats, diff --git a/src/views/Tasks.vue b/src/views/Tasks.vue index 7efb6c5..b0ca1b8 100644 --- a/src/views/Tasks.vue +++ b/src/views/Tasks.vue @@ -38,36 +38,42 @@