优化: 界面交互完善与设置体验
- 审批卡尊重滚动意图,等长切换回底,排队超时按钮修活 - 带图编辑提示不静默丢,删除目标回写,切换文案消歧 - 会话键盘可达+搜索态重命名,筛选计数口径对齐 - 子任务提示正名,看板加载态 - 主题跟随系统,表单脏态拦截,密钥显隐留空提示
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
# UX 走查 — 会话管理与任务/项目管理域(2026-10-03)
|
||||
|
||||
> 只读勘察,零代码改动。范围:ConversationSidebar / AppSidebar 集成 / Tasks / TaskDrawer / TaskBatchBar / GitChanges / ProjectCard + 相关 store/composable。
|
||||
> 已规避防重复清单:审批徽标、12 截图样式、UX token、removeGoal 回写、任务列表重复渲染+全选框裁切(shot-3)、标题截断(shot-4)。
|
||||
> 排序:严重度 P1 → P2 → P3。
|
||||
|
||||
---
|
||||
|
||||
## P1(3 条)
|
||||
|
||||
### P1-1 新建任务失败完全静默:错误条被模态遮罩盖住,弹窗不关无任何反馈
|
||||
- 位置:`src/views/Tasks.vue:827-848`(confirmCreate)+ `src/styles/global.css:201-208`
|
||||
- 链路:store.createTask 失败 → runWithCatch 置 state.error(`src/stores/project/tasks.ts:42`)→ `if (!r) return` 弹窗保持打开。错误横幅渲染在页面流内(z-index:auto),而 `.modal-overlay` 是 `position:fixed; inset:0; z-index:100` 全屏遮罩 → 横幅在遮罩之下不可见。
|
||||
- 用户视角:点「确认」→ 按钮短暂 loading → 恢复,无任何提示,像"点了没反应";只有关掉弹窗才能看到错误条。
|
||||
- 修向:失败时在 modal 内联展示错误(或失败 toast),不要只依赖页面级 error-banner。
|
||||
|
||||
### P1-2 会话切换无即时反馈与加载态,快速连点像失灵
|
||||
- 位置:`src/components/ai/ConversationSidebar.vue:42,107`(高亮绑 `activeConversationId`)+ `src/composables/ai/useAiConversations.ts:275-360`
|
||||
- 链路:switchConversation 在 IPC 返回且 parse 成功后才写 `state.activeConversationId`(L360,注释明言防错配)。期间:侧栏点击项不高亮、原高亮不动、消息区无 loading 指示(AiChat 全文只有 isCompressing 一个加载态)。大历史会话 IPC 数百 ms 起,用户连点多个会话时全程无视觉响应,直到最后一个完成瞬间跳变。
|
||||
- 竞态本身已由 `_latestSwitchId` token + 切换窗口缓冲治理(良好),缺的是**进行时反馈**。
|
||||
- 修向:点击即挂 pending 态(半透明/spinner 于目标项),或消息区顶部 loading 条。
|
||||
|
||||
### P1-3 状态多选筛选 + 数据变更联动刷新:查询语义冲突致列表被冲空
|
||||
- 位置:`src/views/Tasks.vue:795-807`(buildTaskQuery 不传 status)+ `src/stores/project.ts:70-80`(buildActiveTaskQuery 把 status 下沉后端)+ `Tasks.vue:858`(setActiveTaskStatus 传逗号拼接多选)
|
||||
- 链路:视图内刷新走 buildTaskQuery(status 纯前端过滤);但 df-data-changed 事件联动刷新走 buildActiveTaskQuery,把 `status="todo,done"` 这样的**多选拼接串**传给后端(注释自证"后端 status 单值")→ 后端按单值精确匹配返回空集 → 用户勾着状态芯片时,任何外部任务变更(AI 工具建任务/他视图推进)都让可见行突然清空,与筛选芯片状态直接矛盾。
|
||||
- 修向:buildActiveTaskQuery 不传 status(对齐视图口径),或后端支持多值。
|
||||
|
||||
## P2(7 条)
|
||||
|
||||
### P2-1 状态芯片点击触发冗余服务端重载 + 整列表闪屏
|
||||
- `Tasks.vue:857-861`:watch(activeStatuses) 调 loadTasks(buildTaskQuery()),但 status 不进 query → 拉回完全相同数据;`loading=true` 时列表区整个替换为一行"加载中"文本(L75,无 spinner)。纯客户端筛选却付出全量重载+闪屏代价。
|
||||
|
||||
### P2-2 筛选计数与可见行数不符
|
||||
- `Tasks.vue:55`:`filter-count` 显示 `store.tasks.length`(未过前端 status 过滤);勾选状态芯片后计数不变,与实际可见行数矛盾(同 P1-3 的双口径根因相邻)。
|
||||
|
||||
### P2-3 TaskDrawer 新建子任务成功提示文案错位
|
||||
- `src/components/task/TaskDrawer.vue:326`:子任务创建成功 toast 复用 `tasks.batch.advanceResult`("已推进 1 个任务"),语义误导——用户刚做的是"新建"不是"推进"。
|
||||
|
||||
### P2-4 看板模式无加载态,展示陈旧筛选数据
|
||||
- `Tasks.vue:270-302`:loading 分支只存在于列表模式(.task-groups 内 L75);看板切项目/搜索期间继续渲染上一筛选的任务卡,无任何"加载中"指示,新旧数据瞬间替换易误读。
|
||||
|
||||
### P2-5 看板拖拽非法流转静默弹回,无原因反馈
|
||||
- `src/composables/task/useTaskKanban.ts:30-34`:onMove 返回 false 卡片弹回;仅父卡有 title tooltip(tasks.kanban.parentNoDrag),非父卡因状态机不允许(如 done→todo 之外的路径)被拒时无 toast/提示,用户不知道"为什么拖不过去"。
|
||||
|
||||
### P2-6 键盘可用性:两域列表项全部不可键盘达
|
||||
- 会话项/时间分组头(ConversationSidebar L88,102)、任务行/分组头(Tasks L88,98)、看板卡、GitChanges 文件行/提交行、ProjectCard 整卡均为 div+@click,无 tabindex/role/keydown;会话项「...」操作菜单 hover 才 display:flex(CSS L730-738),键盘用户永久够不到置顶/归档/删除。批量栏、快捷菜单、会话菜单均无 Esc 关闭(仅外部点击)。
|
||||
|
||||
### P2-7 会话操作失败反馈位置错配
|
||||
- `useAiConversations.ts:550-559`(pushConvOpFail):rename/archive/pin 失败以错误气泡推进**聊天消息流**,而操作发生在侧栏——视线焦点不在聊天区;若消息区被清空/切换后气泡也可能看不到。侧栏内联轻提示更对位。
|
||||
|
||||
## P3(7 条)
|
||||
|
||||
- **P3-1** 搜索态功能降级:搜索结果平铺列表不支持双击重命名(ConversationSidebar L36-82 无 startRename 分支);搜索框无 Esc 清空(Tasks 搜索框有 `@keyup.esc`,不一致)。
|
||||
- **P3-2** 首次进入"暂无会话"误导:`conversations.length===0` 即渲染空态(L214),loadConversations IPC 未返回前无 loading 区分,一闪而过的假空态。
|
||||
- **P3-3** quickDelete 异常路径吞错:`Tasks.vue:536` catch 仅 console.error(正常失败走 deleteTask→banner,但 throw 型异常无用户反馈)。
|
||||
- **P3-4** GitChanges 点击文件双 IPC:组件内 getModuleFileDiff(L457)与 FilePreview 自身加载各拉一次 diff;`diffContent/diffLoading` 为死状态(模板未消费),最终以第二次 emit 覆盖。
|
||||
- **P3-5** 批量推进"无共同目标"提示永不可见:TaskBatchBar L11 按钮 disabled 于 advanceTargets 为空,L15 的 tbb-dropdown-empty 分支永远渲染不出,用户不知按钮为何灰。
|
||||
- **P3-6** ProjectCard 工程数静默 0 起显:moduleCount 异步拉取无 loading/骨架,先显 0 再跳变;descOverflow 不随窗口 resize 重测,展开按钮显隐可能失准(ProjectCard L91-100)。
|
||||
- **P3-7** 看板同列拖动后 DOM 顺序与数据排序短暂不一致:onEnd 对 to===from 直接 return 不刷新(useTaskKanban L47),卡片停留位置与 store 排序脱节直至下次刷新。
|
||||
|
||||
## 核查良好(不登记)
|
||||
|
||||
- 列表竞态:loadTasks seq 守卫(tasks.ts:11)、GitChanges statusReqSeq 双校验、TaskDrawer tid 校验、switchConversation token+切换窗口缓冲——四处竞态防护完整。
|
||||
- 危险操作确认:会话删除(活跃会话独立强文案)/任务删除(含级联子任务数)/批量删除/项目删除均有 ConfirmDialog,无过度确认(新建会话不确认符合真并发决策)。
|
||||
- 批量边界:0 选中隐藏批量栏、全选覆盖可见范围、scope 变化 prune 幽灵选中、busy 统一禁用、选中父+子去重级联、批量结果 toast 分 success/warning/error 三态。
|
||||
- 空态/错误态:GitChanges 骨架屏+主区错误/行内错误分离、看板空列虚线框、Tasks 搜索空态带新建入口,覆盖良好。
|
||||
Reference in New Issue
Block a user