docs(08-05-product-interaction-consistency): 固化交互治理任务规划与规范
这个提交包含在:
@@ -0,0 +1 @@
|
||||
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}
|
||||
@@ -0,0 +1,57 @@
|
||||
# 设计说明
|
||||
|
||||
## 1. 目标与约束
|
||||
|
||||
本任务只处理不改变业务 URL、API、数据库、权限模型和状态机的交互一致性。允许修改共享前端工具与组件,但不得引入新的页面体系或全站视觉重做。
|
||||
|
||||
## 2. 错误消息收敛
|
||||
|
||||
- `client/src/lib/resolveErrorMessage.ts` 成为普通用户错误消息的默认入口:API error 只返回 `mapApiErrorMessage(...)` 的自然中文,不拼 code。
|
||||
- 页面内重复的 `isApiError + mapApiErrorMessage` helper 逐步改为共享入口;本任务覆盖当前搜索到的 58 个文件。
|
||||
- 管理、审计、排障页确需 code 时使用显式技术明细函数或独立明细区,不把 code 混进普通 toast/红条文本。
|
||||
- 增加源码合同测试或 QA 搜索,阻止普通消息重新出现 `error.code + ':'` 模式。
|
||||
- 失败反馈位置按可恢复性决定:字段/材料问题就近、区域加载失败驻留在区域并可重试、短暂成功 toast;本轮不全量迁移所有历史 toast。
|
||||
|
||||
## 3. 状态与命名
|
||||
|
||||
- `StatusBadge` 未知状态统一显示“未知状态”;业务域需要更具体文案时显式传 `label` 或使用域映射,不扩充一个无边界的全局状态表。
|
||||
- 员工在职阶段使用独立中文映射,避免 `employmentStatus` 原样透出。
|
||||
- `TodosPage` 状态筛选和徽章使用自然中文。
|
||||
- 审批任务、个人事项、聚合面板分别使用“待我审批 / 我的事项 / 今日待处理”;内部路由和 API 字段保持不变。
|
||||
|
||||
## 4. 首页与首次欢迎
|
||||
|
||||
- PC 页面顺序调整为 `SummaryStrip → TodayActionPanel → QuickEntryPanel → secondary`。
|
||||
- `PortalHomePage` 已拥有权限、角色能力和 quick entries;WelcomeDialog 从调用方接收经过权限过滤的入口,避免在弹窗内复制完整权限模型。
|
||||
- 移动首页移除常驻考勤说明卡;财务第三指标改为真实数据或删除该 tile,不用静态 `OA` 填充。
|
||||
- 无真实数据的区域不渲染,保留必要空态和真实下一步。
|
||||
|
||||
## 5. 审批动作解释
|
||||
|
||||
- 退回说明“返回可修改环节/发起人补充后可继续”,驳回说明“本次流程终止或按规则重新发起”;最终措辞必须对应现有服务端 action 语义,不改变 action。
|
||||
- 转审理由输入区显示“至少 10 个字”和实时未满足原因;禁用按钮不能成为唯一反馈。
|
||||
- 费用控制按超标事实、是否阻止通过和下一步表达,不显示 `controlMode` 字段式文案。
|
||||
|
||||
## 6. 共享移动底部动作
|
||||
|
||||
- 从 `BusinessEditTemplate`、移动报销、移动审批和付款响应式页面提取最小共享容器,统一 fixed surface、安全区、内容底部留白和主次动作布局。
|
||||
- 共享组件只接收动作内容、是否显示和测试 ID,不承载报销/审批/付款状态机。
|
||||
- 先迁移至少移动报销与移动审批;付款页仅在无业务风险且结构相同时迁移,否则保留并记录后续项。
|
||||
|
||||
## 7. 差旅冻结模块缺陷
|
||||
|
||||
- 删除 `TravelRequestsPage` 在无创建权限时自动选择第一条记录的 effect。
|
||||
- 未带 `id` 时保持列表/空详情;显式选择后的既有 `?id=` 详情不变。
|
||||
- 不改变导航、API、创建能力、状态机或恢复差旅主线。
|
||||
|
||||
## 8. 可访问性与兼容
|
||||
|
||||
- 本任务触及的输入具有关联 label、键盘可达和焦点可见性;错误出现在关联字段/区域附近。
|
||||
- 聚焦页面可增加 axe 或等价语义断言,但不把全站历史债务作为本轮阻断。
|
||||
- 错误文案变化不改变 API code 本身;日志、服务端响应和审计数据保持原样。
|
||||
|
||||
## 9. 回滚
|
||||
|
||||
- 错误消息工具、移动动作容器和页面文案分批提交,任一共享改动可连同消费者同批回滚。
|
||||
- 差旅只删除一个 effect,回滚不会修改数据;若回滚则恢复旧自动选择行为。
|
||||
- 无 schema、API 或生产数据回滚步骤。
|
||||
@@ -0,0 +1 @@
|
||||
{"_example": "Fill with {\"file\": \"<path>\", \"reason\": \"<why>\"}. Put spec/research files only — no code paths. Run `python3 .trellis/scripts/get_context.py --mode packages` to list available specs. Delete this line once real entries are added."}
|
||||
@@ -0,0 +1,62 @@
|
||||
# 实施计划
|
||||
|
||||
## 1. 共享错误入口
|
||||
|
||||
- [x] 修改 `resolveErrorMessage` 默认去除 code,并为确需技术 code 的管理/审计场景提供显式分离能力。
|
||||
- [x] 迁移当前 58 个文件中的普通用户消息拼接,保留 API code 作为控制流判断而非展示文本。
|
||||
- [x] 增加源码/组件回归,覆盖 Portal、审批、报销、移动页和管理例外边界。
|
||||
|
||||
## 2. 状态与命名
|
||||
|
||||
- [x] `StatusBadge` 未知值显示“未知状态”;员工在职阶段显式映射中文。
|
||||
- [x] `TodosPage` 状态选项/徽章中文化。
|
||||
- [x] 将用户可见的审批任务、个人事项和聚合面板收敛为“待我审批 / 我的事项 / 今日待处理”,同步 PC/移动导航和测试断言。
|
||||
|
||||
## 3. 首页与 WelcomeDialog
|
||||
|
||||
- [x] 调整 PC 工作台内容顺序,今日待处理先于常用入口。
|
||||
- [x] WelcomeDialog 接收权限过滤后的入口,无审批权限时不显示审批入口。
|
||||
- [x] 删除移动考勤说明卡;财务 tile 只保留真实指标。
|
||||
|
||||
## 4. 审批与反馈
|
||||
|
||||
- [x] 为退回/驳回补后果说明,核对服务端动作语义不变。
|
||||
- [x] 转审理由显示至少 10 字要求和禁用原因。
|
||||
- [x] 费用控制改为业务后果表达。
|
||||
- [x] 本任务触及的字段错误、区域失败和提交失败按设计放置,输入与恢复入口不丢失。
|
||||
|
||||
## 5. 移动动作与差旅缺陷
|
||||
|
||||
- [x] 抽取共享移动底部动作容器并迁移移动报销、移动审批与 `BusinessEditTemplate`;统一安全区、内容留白和 pending/disabled 表达。
|
||||
- [x] 已评估付款响应式页;其动作条仍含付款批次专用响应式结构,本轮按设计保留为已记录例外,不强行迁移。
|
||||
- [x] 删除差旅自动选中第一条的 effect,保留显式 `?id=` 详情。
|
||||
|
||||
## 6. 可访问性与测试
|
||||
|
||||
- [x] 为本任务触及的表单补关联 label、键盘/焦点断言和邻近错误。
|
||||
- [x] 更新 `login-portal-ux.spec.ts`、`workflow-action-confirm-ui.spec.ts` 等既有断言,并新增 `interaction-pattern-unification.spec.ts` 覆盖共享错误、移动动作、状态、WelcomeDialog、工作台恢复和差旅缺陷合同。
|
||||
- [x] 运行 `cd client && npm run typecheck`。
|
||||
- [x] 运行 `cd client && npm run build`。
|
||||
- [x] 运行无浏览器源码合同 Playwright:`interaction-pattern-unification.spec.ts` 共 6 项通过。
|
||||
- [ ] 运行需要 Chromium 的聚焦浏览器回归:当前环境默认浏览器缺失,系统 Chromium 又因沙箱权限 `Operation not permitted` 无法启动,记为 `PAUSED`,不得宣称浏览器用例通过。
|
||||
- [x] 运行普通错误消息 code 前缀扫描,并人工核对 `AuditLogsPage` 为唯一技术明细例外。
|
||||
- [x] 运行 task validate、process contract、docs registry、Trellis governance 和 `git diff --check`;规范/事实源更新后最终复跑通过。
|
||||
|
||||
## 7. 提交与回滚
|
||||
|
||||
- [x] 提交前确认没有业务 URL、后端 API、schema、权限模型或真实数据变化;导航改动仅为已批准的入口文案与现有权限能力过滤。
|
||||
- [x] 使用中文 commit message 并引用 `08-05-interaction-pattern-unification`。
|
||||
- [x] 共享工具回滚时同步回滚消费者;移动审批、移动报销与 `BusinessEditTemplate` 不混用新旧容器,付款页旧实现按已记录例外保留。
|
||||
|
||||
## 8. 当前验证记录
|
||||
|
||||
- `cd client && npm run typecheck`:通过。
|
||||
- `cd client && npm run build`:通过。
|
||||
- `npx playwright test tests/e2e/interaction-pattern-unification.spec.ts --workers=1 --reporter=list`:6 passed。
|
||||
- `npx playwright test --list`:可发现 61 个文件、222 个测试。
|
||||
- `python3 ./.trellis/scripts/task.py validate 08-05-interaction-pattern-unification`:通过。
|
||||
- `node scripts/qa/check-process-contract.mjs --baseline --json`:`PASS`,0 errors / 0 warnings。
|
||||
- `node scripts/qa/check-trellis-governance.mjs`:`PASS`,0 errors / 0 warnings。
|
||||
- `node scripts/qa/audit-docs.mjs --check-registry`:0 errors;保留既有 22 个未登记文档 warning。
|
||||
- `git diff --check`:通过。
|
||||
- 需要真实 Chromium 的聚焦页面回归:`PAUSED`。阻塞来自当前执行环境的浏览器安装/沙箱权限,不作为产品用例失败,也不替代后续可运行环境中的浏览器验证。
|
||||
@@ -0,0 +1,76 @@
|
||||
# 低风险页面操作规范统一
|
||||
|
||||
## Goal
|
||||
|
||||
在不改变业务 URL、API、数据库、权限模型和状态机的前提下,统一高频页面的状态文案、首页信息优先级、权限可见性、审批动作解释、表单反馈和移动主动作,使用户在 PC 与移动端形成稳定预期。
|
||||
|
||||
## Confirmed Facts
|
||||
|
||||
- `StatusBadge` 未命中映射时直接显示原始 `status`,员工档案仍把 `employmentStatus` 直接传入,可能展示 `onboarding/probation/offboarding/inactive`。
|
||||
- PC 工作台仍渲染常用入口和今日待处理,需按首屏任务优先原则复核顺序;移动首页仍无条件展示考勤说明卡,财务第三个指标值仍为静态 `OA`。
|
||||
- `WelcomeDialog` 仍对所有用户硬编码“处理待办”等入口,未按审批权限过滤。
|
||||
- `/todos` 状态筛选仍直接展示 `todo/doing/done/cancelled`,且“待办”与审批“待我处理”的产品命名容易混淆。
|
||||
- 审批详情并列提供“退回/驳回”,但未解释后果差异;转审理由至少 10 字的门槛没有邻近说明。
|
||||
- 费用标准仍向审批人显示“管控模式:阻断/预警”内部配置词。
|
||||
- 页面提交失败既有 toast、页级红条和字段内联等多种方式,缺少按可恢复性划分的统一合同。
|
||||
- 移动报销、移动审批、付款响应式页面分别复制了固定底部动作容器;`BusinessEditTemplate` 已提供可复用实现线索。
|
||||
- 完整差旅已冻结,但 `TravelRequestsPage` 仍会在无创建权限且未选择记录时自动把第一条写入 `?id=`;修复该缺陷不恢复差旅能力。
|
||||
- 当前有 58 个前端文件在普通用户路径拼接 `CODE: 中文消息`;共享 `resolveErrorMessage` 也直接返回带 code 的文本,必须成为本轮统一收敛入口。
|
||||
|
||||
## Scope
|
||||
|
||||
- 仅修改前端共享错误/状态/动作组件、PC/移动高频页面文案与布局、WelcomeDialog 权限过滤、Todo 状态显示和差旅页面自动选中 effect。
|
||||
- 不改业务 URL、API、数据库、权限模型、审批/付款状态机或生产配置。
|
||||
- 差旅只删除自动选择第一条记录的缺陷,不恢复冻结能力;合同、采购/资产路由迁移由其他子任务负责。
|
||||
|
||||
## Requirements
|
||||
|
||||
- R1:状态展示必须使用业务域映射;公共 `StatusBadge` 未知值显示“未知状态”,不得把技术枚举原样呈现给普通用户。
|
||||
- R2:PC 工作台首屏把真实“今日待处理”置于常用入口之前;无待办时仍保持自然空态,不制造说明卡。
|
||||
- R3:移动首页删除无真实数据的常驻考勤说明卡;财务指标只展示真实可比较数据,不能用 `OA` 占据数值位。
|
||||
- R4:首次欢迎入口按当前用户权限与已启用能力生成;不得引导用户进入无权访问的审批页。
|
||||
- R5:命名统一为“待我审批”(审批任务)、“我的事项”(个人 todo)和“今日待处理”(聚合面板);路由可保持兼容,不因文案治理改 URL。
|
||||
- R6:`todo/doing/done/cancelled` 等用户可见状态统一为自然中文。
|
||||
- R7:审批详情明确说明“退回”和“驳回”的业务后果;转审理由在输入区邻近显示至少 10 字要求及未满足原因。
|
||||
- R8:把“阻断/预警”等配置词转为审批人可执行的业务表达,不暴露内部控制字段名。
|
||||
- R9:反馈合同固定为:短暂成功使用 toast;字段/材料问题就近内联;页面或区域加载失败在对应区域内持久显示并提供重试;不可恢复的提交失败不得只依赖会消失的 toast。
|
||||
- R10:抽取或扩展共享移动底部动作容器,统一安全区、内容留白、主次动作层级和 pending/disabled 表达;页面业务动作仍由各自状态矩阵决定。
|
||||
- R11:关键表单控件具有可关联 label、键盘可达性和清晰焦点;为登录、首页、审批详情、报销详情和移动报销详情中的本任务触点增加聚焦可访问性断言。
|
||||
- R12:保留当前中文错误映射并收敛唯一解析入口;普通用户路径只返回自然中文,不显示错误 code、接口名、路由栈、完整路径或原始 payload。管理员、审计和排障页如确需 code,只在明确技术明细区域最小展示,不复用普通消息字符串。
|
||||
- R13:优先复用现有 `ListWorkspace`、`BusinessListTemplate`、详情动作组件、错误映射和移动安全区样式,不新增第四套页面/反馈系统。
|
||||
- R14:删除差旅首屏自动选择第一条记录的 effect;用户未显式选择时保持纯列表/空详情状态,不改差旅路由、功能入口或业务能力。
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [ ] 员工档案和本任务触及页面不显示未映射英文状态;未知状态显示“未知状态”。
|
||||
- [ ] PC 工作台首个业务内容区为“今日待处理”,常用入口后置;移动首页不再显示静态考勤说明卡或值为 `OA` 的指标。
|
||||
- [ ] 无审批权限用户的 WelcomeDialog 不出现“处理待办”入口,其他入口同样按权限/能力过滤。
|
||||
- [ ] PC/移动审批入口使用“待我审批”,个人 todo 使用“我的事项”,聚合区使用“今日待处理”;Todo 状态选项全部为中文。
|
||||
- [ ] 审批人无需猜测即可区分退回/驳回后果;转审理由不足 10 字时在输入区看到明确原因。
|
||||
- [ ] 费用控制提示说明超标事实、影响和下一步,不出现“管控模式”字段式表达。
|
||||
- [ ] 成功、字段错误、区域加载失败和提交失败分别遵循统一反馈合同;聚焦回归证明错误可恢复且输入不丢失。
|
||||
- [ ] 至少两个现有移动详情页复用共享底部动作容器,安全区和页面底部留白没有回退。
|
||||
- [ ] 本任务触及的 A 类页面具有 label/键盘/焦点回归;若引入 axe,仅限聚焦页面,不把全站历史债务变成本任务阻断。
|
||||
- [ ] 当前 58 个文件范围内的普通用户错误提示不再拼接内部 code;范围显式包含唯一收敛入口 `client/src/lib/resolveErrorMessage.ts`。代码搜索和聚焦页面回归证明没有同类前缀残留;`client/src/pages/AuditLogsPage.tsx` 作为 R12 允许的技术明细例外单独列出,不计入“无残留”判定。
|
||||
- [ ] 直接进入 `/travel-requests` 且未带 `id` 时不自动写入第一条记录;用户显式选择后既有 `?id=` 详情仍可用。
|
||||
- [ ] `cd client && npm run typecheck && npm run build`、聚焦 Playwright 与 Trellis 门禁通过。
|
||||
|
||||
## Out of Scope
|
||||
|
||||
- 详情路由、新建页路由、后端 API、数据库或状态机修改。
|
||||
- 全站一次性迁移所有 toast、所有表单和所有页面骨架。
|
||||
- 付款、报销、审批等业务动作权限或服务端规则调整。
|
||||
- 冻结差旅的功能恢复、详情路由化、导航调整或能力扩展。
|
||||
- 模块冻结/下线、导航产品组合调整和暗色模式。
|
||||
|
||||
## Test Plan
|
||||
|
||||
- `cd client && npm run typecheck`
|
||||
- `cd client && npm run build`
|
||||
- 聚焦 Playwright:工作台首屏与 WelcomeDialog 权限、审批动作解释、移动首页/底部动作、Todo 中文状态、差旅未自动选中。
|
||||
- 运行普通用户错误前缀扫描;按当前 58 个文件范围核对残留,显式包含 `client/src/lib/resolveErrorMessage.ts`,并将 `client/src/pages/AuditLogsPage.tsx` 作为允许的技术明细例外单独检查、不计入“无残留”判定。
|
||||
- 运行 `python3 ./.trellis/scripts/task.py validate 08-05-interaction-pattern-unification`、process contract、docs registry、Trellis governance 和 `git diff --check`。
|
||||
|
||||
## Open Questions
|
||||
|
||||
- 无;本子任务可在父任务范围确认后进入设计。
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"id": "interaction-pattern-unification",
|
||||
"name": "interaction-pattern-unification",
|
||||
"title": "低风险页面操作规范统一",
|
||||
"description": "收敛共享错误消息、状态文案、首页优先级、审批反馈、移动动作容器和差旅自动选中缺陷,不改业务 API 或状态机。",
|
||||
"status": "in_progress",
|
||||
"dev_type": null,
|
||||
"scope": "client-shared-interaction-and-feedback",
|
||||
"package": null,
|
||||
"priority": "P2",
|
||||
"creator": "shunli",
|
||||
"assignee": "shunli",
|
||||
"createdAt": "2026-08-05",
|
||||
"completedAt": null,
|
||||
"branch": null,
|
||||
"base_branch": "main",
|
||||
"worktree_path": null,
|
||||
"commit": null,
|
||||
"pr_url": null,
|
||||
"subtasks": [],
|
||||
"children": [],
|
||||
"parent": "08-05-product-interaction-consistency",
|
||||
"relatedFiles": [],
|
||||
"notes": "",
|
||||
"meta": {
|
||||
"description": "收敛共享错误消息、状态文案、首页优先级、审批反馈、移动动作容器和差旅自动选中缺陷,不改业务 API 或状态机。"
|
||||
}
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户