归档审批动作面板收敛任务 [approval-action-panel-kiss-layering]
这个提交包含在:
@@ -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,49 @@
|
||||
# Design:审批动作面板 KISS 收敛与层叠遗留清理
|
||||
|
||||
## 1. Scope Boundary
|
||||
|
||||
保持页面壳、workflow API、allowedActions、权限、mutation、确认弹窗、转审入口和移动端行为不变。产品代码只允许修改报销审批 adapter、共享动作面板的最小展示插槽和旧 CSS;通用审批页不得产生产品代码 diff。
|
||||
|
||||
## 2. Action-Adjacent Blocking Notice
|
||||
|
||||
`BusinessDetailActionPanel` 增加可选的动作前展示插槽,例如 `beforeActions?: ReactNode`,渲染顺序为:
|
||||
|
||||
```text
|
||||
title/status
|
||||
beforeActions(异常锚点 + 阻断原因;空则不渲染)
|
||||
primary / secondary / more actions
|
||||
children(点击后展开的理由或转审输入)
|
||||
summary(其他业务页现有摘要)
|
||||
```
|
||||
|
||||
插槽只负责布局,不读取 mode、角色、权限或 readiness。它使用既有 `hasVisibleNode` 逻辑,未传插槽的消费者 DOM 顺序不变。
|
||||
|
||||
报销 PC adapter 删除 `statusSummary`,使用:
|
||||
|
||||
```tsx
|
||||
beforeActions = issueAnchors + decisionBlockNotice
|
||||
summary = null
|
||||
children = actionError + active action editor
|
||||
```
|
||||
|
||||
正常 ready 时 `decisionBlockNotice=null`。模型尚未形成的早退失败卡继续维持“原因 → 禁用动作”顺序。
|
||||
|
||||
## 3. Single Blocking-Reason Projection
|
||||
|
||||
在报销 adapter 内从既有 readiness 事实投影唯一主因:离线、金额完整性异常、快照解析失败、详情查询失败/加载中。金额继续复用 `reimbursementAmountIntegrityMessage`;详情查询失败使用新批准文案。
|
||||
|
||||
展示和 `requestAction`/mutation 二次拦截复用同一原因函数或值,不改变 `decisionReady` 条件,避免按钮说明与实际拦截漂移。
|
||||
|
||||
## 4. Budget Snapshot Compatibility
|
||||
|
||||
预算快照提示仍只由 `snapshot?.budgetCheckStatus === "missing"` 控制,不并入新的 readiness 文案投影。测试固定 `missing` 正例与 `available/not_applicable` 负例;不修改费用政策、预算或快照数据流。
|
||||
|
||||
## 5. Dead Layering Cleanup
|
||||
|
||||
删除 `.workflow-action-panel` 和完整 `.workflow-action-more` CSS。两者没有产品消费者,删除不会改变当前 DOM。付款进度单测和 wave3 结构测试移除旧 class 正向断言,保留对共享动作面板 `lg:sticky lg:top-24` 的有效合同。
|
||||
|
||||
不创建 Radix 菜单,不进行菜单展开测试。四类通用审批用现有合成 fixture 验证页面/动作可见和无横向溢出即可。
|
||||
|
||||
## 6. Rollout and Rollback
|
||||
|
||||
报销减法、邻近阻断提示、死 CSS 和测试更新作为一个候选。部署前 UI strict;部署后用公网真实 bundle + 合成 API 复核正常/失败报销和四类通用审批。失败时整体回滚到 `d63ccdf`,不操作数据、migration 或 flag。
|
||||
@@ -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,34 @@
|
||||
# Implementation Plan:审批动作面板 KISS 收敛与层叠遗留清理
|
||||
|
||||
## Entry Gate
|
||||
|
||||
- [x] 用户审阅并批准收缩后的 `prd.md`、`design.md` 与本实施计划。
|
||||
- [x] 批准后运行 `task.py start`;实施前加载 `trellis-before-dev` 的 frontend、workflow、reimbursement 和 UI QA 规约。
|
||||
|
||||
## Implementation Order
|
||||
|
||||
1. [x] 为 `BusinessDetailActionPanel` 增加无业务判断的动作前插槽,空节点不产生容器;确认其他消费者 DOM 顺序不变。
|
||||
2. [x] 报销 adapter 建立单一阻断原因投影,让显示提示与 handler 二次拦截复用;不改变 `decisionReady` 条件。
|
||||
3. [x] 把异常锚点/阻断原因放到动作前插槽,删除 `statusSummary`,显式传 `summary={null}`;保持理由输入按点击渐进展开。
|
||||
4. [x] 保持预算 `missing` 判断原样,补 `available/not_applicable` 负向测试。
|
||||
5. [x] 删除 `.workflow-action-panel` 与 `.workflow-action-more` 整组 CSS,更新付款进度和 wave3 漂移断言。
|
||||
6. [x] 补正常/五类失败报销回归,以及请假、补卡、采购、差旅 1280px 静态无变化回归;不修改通用审批页产品代码。
|
||||
|
||||
## Verification
|
||||
|
||||
- [x] `cd client && npm run typecheck && npm run build`。
|
||||
- [x] 报销动作确认、内容一致性、R102、R111、移动离线和四类通用审批相关 Playwright。(移动离线 3 项沿用既有缺少 WebKit 的环境边界;本轮未改变离线合同,生产风险面已独立复核。)
|
||||
- [x] 付款进度聚焦测试通过,旧“既有失败”消失。
|
||||
- [x] UI strict/self-test、task validate、process contract、Trellis governance、敏感内容检查和 `git diff --check`。
|
||||
- [x] diff 证明无 server 产品代码、通用审批页产品代码、schema、migration、flag、seed 或生产数据改动。
|
||||
|
||||
## Delivery Gates
|
||||
|
||||
- [x] diff 复核后 commit;commit 复核后 push;provenance 复核后部署。
|
||||
- [x] 只形成一个候选、一次部署;切换前运行 `check-ui-design-rules --strict`。
|
||||
- [x] 部署后核 build marker、公网文案、正常/失败报销动作面板、四类通用审批,以及 B2/三张 rejected 单据只读状态。
|
||||
|
||||
## Rollback
|
||||
|
||||
- 动作布局、fail-closed 解释或通用审批回归失败:停止候选或回滚应用到 `d63ccdf`。
|
||||
- 不回滚数据、migration 或 flag,因为本任务不产生这些变更。
|
||||
@@ -0,0 +1,103 @@
|
||||
# 审批动作面板 KISS 收敛与层叠遗留清理
|
||||
|
||||
## Goal
|
||||
|
||||
收敛 PC 报销审批右栏:正常状态只保留决策动作和按需展开的理由输入,异常状态在禁用动作紧邻上方解释阻断原因;同时删除已无产品消费者的旧“更多”层叠 CSS 与漂移断言。保持预算快照三态、转审入口、通用审批页面和所有业务行为不变,以最小改动形成一个候选、一次部署。
|
||||
|
||||
## Background and Confirmed Facts
|
||||
|
||||
- 生产 `d63ccdf77c60` 的报销审批右栏仍显示“节点 / 状态 / 审批角色 / 完整内容已就绪”。处理历史已位于右栏动作之后,状态已由报销页头 `StatusBadge` 表达,审批角色属于权限实现细节;正常 readiness 不需要解释。
|
||||
- `ReimbursementApprovalAdapter.tsx:283` 构造固定 `statusSummary`,在 `:428` 传给 `BusinessDetailActionPanel.summary`。`BusinessDetailActionPanel` 已能识别空节点,但调用方仍应以 `null`/省略明确表达无摘要,避免休眠 UI 路径。
|
||||
- 预算快照提示已经只在 `snapshot?.budgetCheckStatus === "missing"` 时出现;`available` 与 `not_applicable` 不提示。本任务只补负向保护,不修改判断。
|
||||
- 内容未加载、快照解析失败、离线、金额 mismatch 或金额 unavailable 时,报销审批已有 fail-closed;当前成功/失败 readiness 位于动作后的 summary,失败原因需要移到禁用动作紧邻上方。
|
||||
- 历史提交 `94f1bad` 为原生 `<details class="workflow-action-more">` 的“更多”浮层增加 `.workflow-action-panel { relative z-30 }`,并以 `.workflow-action-more` 的绝对定位和 z-index 防遮挡。
|
||||
- B-2b 提交 `abdd250` 已删除两个审批页的 `<details>`/“更多”菜单。当前 `BusinessDetailActionPanel.moreActions` 只平铺调用方传入的“转审”按钮;产品代码没有 `.workflow-action-panel` 或 `.workflow-action-more` 消费者。
|
||||
- 因当前不存在菜单或浮层,本任务不需要菜单展开/层叠测试。`.workflow-action-panel` 和整组 `.workflow-action-more` CSS 已成为死代码;`paymentProcessingProgress.test.js:137` 与 wave3 对旧 class/CSS 的正向断言属于测试漂移。
|
||||
- 既有 spec 写有“转审默认进入更多”,而当前实现为常驻按钮。转审是否被真实使用、应保持常驻、进入更多或按条件隐藏,是独立产品判断;本任务只登记,不改变当前入口。
|
||||
|
||||
## Scope
|
||||
|
||||
- 删除 PC 报销审批动作面板的三行重复元数据和正常 readiness 文案。
|
||||
- 将各类 fail-closed 原因移到禁用动作紧邻上方,保持原因准确且与二次拦截一致。
|
||||
- 保持预算快照 `missing` 逻辑不动,补 `available/not_applicable` 负向断言。
|
||||
- 删除 `.workflow-action-panel`、`.workflow-action-more` 整组死 CSS 及对应漂移断言。
|
||||
- 静态/合成复核请假、补卡、采购、差旅通用审批页在删除死 CSS 后视觉和动作可达性无变化。
|
||||
|
||||
## Requirements
|
||||
|
||||
### R1 正常报销审批右栏只保留决策内容
|
||||
|
||||
- PC 报销审批动作面板不得显示“节点:…”“状态:…”“审批角色:…”或“完整内容已就绪”。
|
||||
- 无异常、无展开编辑器且决策已就绪时,只显示现有动作,不增加“0 项”“一切正常”或系统说明。
|
||||
- 报销 adapter 不再构造 `statusSummary`,并对 `BusinessDetailActionPanel.summary` 显式传 `null` 或省略;动作区不得留下空 summary 容器、分隔线或 padding。
|
||||
- 报销页头状态和右栏处理历史保持原位置,不为删除的三行另找位置重复展示。
|
||||
- “退回 / 驳回 / 转审”继续按现有点击行为渐进展开理由/目标输入;不得新增常驻审批意见框。
|
||||
|
||||
### R2 fail-closed 原因紧邻禁用动作
|
||||
|
||||
- 内容未加载完整、提交快照无法解析、离线、权威总额不一致、明细金额无法解析五类情况继续使通过、退回、驳回、转审 fail-closed,并保留 handler 二次拦截。
|
||||
- 阻断提示必须位于对应禁用动作组的紧邻上方,在同一动作卡或同一失败卡中,无需到主列或右栏其他区块寻找原因。
|
||||
- 内容查询失败使用“报销内容未加载完整,暂不能审批,请刷新后重试”;快照、离线、mismatch、unavailable 继续使用各自准确原因,不得统一成模糊的“内容未就绪”。
|
||||
- 展示提示与 handler 二次拦截应由同一阻断原因投影产生,避免两个位置口径漂移;不增加或删除 `decisionReady` 条件。
|
||||
- 正常 ready 不显示阻断或成功提示,四类动作按原 allowedActions 与权限可用。
|
||||
|
||||
### R3 预算快照三态保持原合同
|
||||
|
||||
- `budgetCheckStatus === "missing"` 时继续显示一次“该次提交未留存预算快照”。
|
||||
- `available` 与 `not_applicable` 必须保持零预算缺失提示,不得因本轮条件收敛被误判。
|
||||
- 预算提示位置、快照解析和费用/预算业务口径均不修改。
|
||||
|
||||
### R4 删除无消费者的旧层叠实现
|
||||
|
||||
- 删除 `.workflow-action-panel` 规则和 `.workflow-action-more` 及其 `summary/open/button` 子规则,不保留“以防万一”的休眠样式。
|
||||
- 更新 `server/tests/unit/services/paymentProcessingProgress.test.js:137` 和 `client/tests/e2e/pc-detail-mobile-visual-wave3.spec.ts:1252`,删除对旧 class/CSS 的正向要求;继续验证 `BusinessDetailActionPanel` 的既有 sticky 合同。
|
||||
- 产品代码、CSS 和结构测试中 `.workflow-action-panel`、`.workflow-action-more` 的定义/消费应为 0。
|
||||
- 不补回 class,不新增 DropdownMenu,不恢复“更多”菜单,也不改变当前常驻“转审”按钮。
|
||||
|
||||
### R5 通用审批页只做无变化回归
|
||||
|
||||
- 请假、补卡、采购、差旅仍由通用审批页渲染,1280px 下详情、处理历史和动作面板正常可见,无横向溢出或遮挡。
|
||||
- 因四类页面当前都不消费被删 CSS,只需静态零消费者证明和代表性合成页面回归;不要求不存在的菜单展开态或顶部/滚动中段十态测试。
|
||||
- 不修改通用审批页 JSX、动作排列、摘要、权限或 mutation。
|
||||
|
||||
### R6 交付与业务边界
|
||||
|
||||
- 以上改动形成一个候选、一次部署;提交后 diff 复核、push/provenance 和部署后复核按既有门禁连续推进,但不得省略任何门禁。
|
||||
- 切换前运行 `check-ui-design-rules --strict`;部署后核公网 build marker、文案、正常/失败报销动作面板及四类通用审批。
|
||||
- 不修改 API、workflow、权限、状态机、schema、migration、feature flag、seed 或生产数据。
|
||||
- 本任务不替代 `0016/0017/0018` 员工重提与财务复审;父任务 AC11 继续开放。
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [x] AC1:PC 正常报销审批右栏不包含“节点 / 状态 / 审批角色 / 完整内容已就绪”,动作区无空 summary 容器或分隔线;adapter 静态证明 `statusSummary` 已删除且 summary 为 `null`/省略。
|
||||
- [x] AC2:正常报销无 readiness 解释且四动作按权限可用;五类 fail-closed fixture 均显示准确原因,原因位于禁用动作紧邻上方,按钮禁用和 handler 二次拦截同时成立。
|
||||
- [x] AC3:预算 `available/not_applicable` 零缺失提示,只有 `missing` 显示一次既有文案;实现中的三态判断未改。
|
||||
- [x] AC4:产品代码、CSS 和结构测试中 `.workflow-action-panel`、`.workflow-action-more` 定义/消费均为 0;付款进度既有失败消失,sticky 动作面板合同仍有有效断言。
|
||||
- [x] AC5:请假、补卡、采购、差旅在 1280px 合成详情中摘要、历史和动作面板正常,无横向溢出/遮挡;其页面产品代码 diff 为 0。
|
||||
- [x] AC6:报销处理历史位置、正文、退回引用、B2 未归属恢复、移动审批、离线 fail-closed 和当前转审入口均无回归。
|
||||
- [x] AC7:通过 typecheck/build、相关 Playwright、`paymentProcessingProgress.test.js`、UI strict/self-test、Trellis task validate/governance 和 `git diff --check`;无 schema、migration、flag、seed 或生产数据改动。
|
||||
|
||||
实施证据:聚焦动作/一致性 Playwright 20/20,wave3 结构与已完成态 2/2,R102 6/6,R111 8/8;`paymentProcessingProgress` 14/14;typecheck/build、UI strict/self-test、task validate、process contract、governance、敏感内容与 `git diff --check` 均通过。移动离线专项 3 项因本机缺少 Playwright WebKit 可执行文件未进入产品流程,沿用既有环境边界;本轮未改变离线状态机或缓存合同。生产 `46104a7` 发布后,公网真实 bundle 的正常/失败报销与四类通用审批 7/7 通过,独立复核确认失败原因邻近禁用按钮、四类页面无视觉回归;B2 仍为 `force_on + global`,三张目标单据仍为 rejected,完成本任务风险面的部署收口。
|
||||
|
||||
## Test Plan
|
||||
|
||||
- 结构:报销 adapter 无四类正常态解释和 `statusSummary`;summary 无空 DOM;旧 class/CSS/断言零残留;通用审批页源文件无改动。
|
||||
- 报销:正常 ready 负向断言;五类失败的原因顺序、四动作禁用与 handler 二次拦截;退回引用和转审现状回归。
|
||||
- 预算:`missing` 正例,`available/not_applicable` 负向断言。
|
||||
- 通用审批:请假、补卡、采购、差旅 1280px 合成页面可见性、动作可达和无横向溢出;不执行不存在的菜单展开测试。
|
||||
- 工程:前端 typecheck/build、相关 Playwright、付款进度聚焦测试、UI strict/self-test、task validate、process contract、Trellis governance 和 `git diff --check`。
|
||||
- 部署后:`/ready`、bundle marker、0 公网文案 findings;正常报销零解释/动作可用、失败原因邻近动作;四类通用审批正常;B2 与三张 rejected 单据只读状态不变。
|
||||
|
||||
## Risks and Deferred Items
|
||||
|
||||
- `BusinessDetailActionPanel` 是共享组件;若为阻断原因增加动作前插槽,必须保持未注入该插槽的现有消费者 DOM 顺序不变。
|
||||
- 转审入口与现行 spec 存在漂移,但没有真实使用证据支持“恢复更多”或“隐藏”。另行确认转审使用记录后,再在独立产品任务中决定:保持常驻、进入更多或按条件隐藏。
|
||||
- 通用审批页为密集 JSX;本任务不借静态回归顺手格式化或重构。
|
||||
|
||||
## Out of Scope
|
||||
|
||||
- 新增或恢复“更多”菜单、Radix DropdownMenu 或任何浮层。
|
||||
- 改变转审可见性、权限、理由规则、确认流程或 mutation。
|
||||
- 修改通用审批页布局/摘要/动作,或重做移动端动作区。
|
||||
- 重做处理历史、报销正文、预算判断、金额完整性或 B2 门禁。
|
||||
- 处理 `--no-deps`、`.gitignore`、错误色 token 或其他技术债。
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"id": "approval-action-panel-kiss-layering",
|
||||
"name": "approval-action-panel-kiss-layering",
|
||||
"title": "审批动作面板 KISS 收敛与层叠遗留清理",
|
||||
"description": "收敛报销审批动作面板正常态解释和阻断提示位置,并删除已无消费者的旧更多菜单层叠样式与漂移断言。",
|
||||
"status": "completed",
|
||||
"dev_type": null,
|
||||
"scope": "trellis,client,tests",
|
||||
"package": null,
|
||||
"priority": "P2",
|
||||
"creator": "shunli",
|
||||
"assignee": "shunli",
|
||||
"createdAt": "2026-09-03",
|
||||
"completedAt": "2026-09-03",
|
||||
"branch": null,
|
||||
"base_branch": "main",
|
||||
"worktree_path": null,
|
||||
"commit": "c4b4427",
|
||||
"pr_url": null,
|
||||
"subtasks": [],
|
||||
"children": [],
|
||||
"parent": null,
|
||||
"relatedFiles": [],
|
||||
"notes": "实施、diff、发布及独立生产复核通过,生产候选 46104a7,业务提交 c4b4427;不恢复更多菜单、不改变转审入口。移动离线专项沿用本机缺少 Playwright WebKit 的既有边界,本轮未改变离线合同;本任务不替代父任务 AC11。",
|
||||
"meta": {}
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户