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 @@