修复: CR-26 AR-11 listener 按 B-29 筛选契约+Tasks 空态兜底

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
This commit is contained in:
2026-06-15 08:21:11 +08:00
parent ef2d033ad6
commit 7637f297c9
2 changed files with 80 additions and 33 deletions

View File

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