Skip to content

feat(frontend): 预约记录与工单表套用设备表样式 - #33

Merged
Emryswu merged 2 commits into
mainfrom
feat/table-restyle
Oct 19, 2026
Merged

Emryswu merged 2 commits into
mainfrom
feat/table-restyle

Conversation

@Emryswu

@Emryswu Emryswu commented Oct 19, 2026 •

Copy link
Copy Markdown
Owner

#31 只改了设备表,预约记录和工单两张表还是旧样式(操作按钮平铺、灰色状态胶囊、只显示设备 ID 或名称)。这次把三张表统一,共用的部分抽成组件,避免以后各写各的。

改了什么

  • 新增 components/table.tsx,三张表共用:
  • 工单表:设备列显示图标、名称和编号;优先级标签跟在标题后面;每行只留一个前进动作(接单 / 开始处理 / 标记解决 / 关闭),取消工单、重新打开收进 ⋮;管理员的派单下拉保留在行内
  • 预约记录表:设备列前置;批准 / 拒绝、完成保留在行内;取消自己的预约收进 ⋮
  • 工单页单独加载完整设备名录,不复用设备页的列表——那份是筛选过的,复用会让设备名随筛选消失(正是 AGENTS.md 里「筛选项不从已筛选列表推导」那一类问题)
  • 维修员看自己的工单显示本人姓名:维修员名单只给管理员加载,之前维修员视图里自己的单显示成「维修员 fix: reservation @Version plus live ABBA concurrency tests #3」
  • 工具栏的「+」字符换成 Icon;删掉不再使用的 .entity 样式

操作的权限判断没有改,只是换了摆放位置:每个按钮出现的条件和原来一一对应。

review 修复(第二轮)

  • P2 名录失败连带页面数据丢失:工单页把工单和设备名录放进同一个 Promise.all,名录失败时已经拿到的工单也不显示。同类写法在首页和预约页本来就有,一起改了:新增 settle,名录单独等待,页面数据先显示,名录失败时设备列回退到「设备 #id」并提示「设备名录加载失败」。三个页面各加一条「主数据成功、名录失败」的回归测试,改回 Promise.all 时三条都会失败(已验证)。AGENTS.md 前端约定补了对应一条。
  • P3 测试重复 createRoot:table-parts 的用例改为复用 mountDom 返回的 root,React 警告消失。
  • 分支已变基到合并 chore(frontend): 修复现存类型错误,CI 加类型检查 #32 之后的 main,CI 会带上类型检查。

防止跑偏的约束

  • 结构:状态配色、设备单元格、行菜单都只有一份实现;菜单条目统一走 menuEntries(cond && {...} 写法,类型安全)
  • 测试 tests/table-parts.test.mjs:
    • statusLabels 里每个状态都必须在 STATE_TONES 有配色,新增状态忘了配色会直接失败
    • 各角色、各状态下的行操作;他人工单对维修员不显示按钮
    • 设备名从名录解析,缺失时回退;维修员看不到名单时仍显示自己的名字
    • 工单行菜单在 .table-scroll 外、点得到
    • 先在设备页筛「维护中」,再进工单页,设备名仍然显示(改成复用设备页列表时这条会失败,已验证)

验证

  • 本地 npm run lint、npm run typecheck、npm test(73 项)全部通过
  • 改动中 tsc 抓到过一次菜单条目的类型问题,已改成 menuEntries

截图

下面是假后端(照抄 DemoDataInitializer / DemoUserInitializer 的种子数据)上的截图,我这边连不上 Maven 中央仓库,起不了真后端。README 写明截图来自真实运行的服务,所以本 PR 没有替换 README 截图,合并后需要在真后端上重拍 04、05、08(03 设备页 #31 之后也该重拍)。

预约记录(教师) 工单(管理员)
预约 工单

维修员工单

- 抽出 components/table.tsx:状态圆点 StateBadge(全部设备/预约/工单状态的
  配色表)、设备单元格 EquipmentCell、portal 行菜单 MoreMenu 与 menuEntries,
  三张表共用,设备页改为从这里引用
- 工单表:设备列显示图标、名称和编号,优先级标签跟在标题后;每行只留一个
  前进动作(接单/开始处理/标记解决/关闭),取消和重新打开收进更多菜单
- 预约记录表:设备列前置,批准/拒绝和完成保留在行内,取消自己的预约收进菜单
- 工单页单独加载完整设备名录(不复用设备页已筛选的列表)
- 维修员看自己的工单时显示本人姓名,而不是「维修员 #id」
- 工具栏的「+」字符换成 Icon;删除不再使用的 .entity 样式
- 测试:状态配色全覆盖、各角色的行操作、名录缺失时回退到设备编号、
  菜单在滚动容器外、设备页筛选后工单仍能显示设备名
- 工单、预约、首页三处都把设备名录从 Promise.all 里拆出来,用 settle 单独等待:
  页面自己的数据先显示,名录失败时设备列回退到「设备 #id」并单独提示
- 回归测试:三个页面各覆盖「主数据成功、名录失败」;改回 Promise.all 时三条均失败
- table-parts 测试复用 mountDom 创建的 root,消除重复 createRoot 的 React 警告
- AGENTS.md 前端约定补充:装饰性数据不与页面数据放进同一个 Promise.all
@Emryswu
Emryswu force-pushed the feat/table-restyle branch from 730169b to 326b80e Compare October 19, 2026 10:29
@Emryswu
Emryswu merged commit 4aa9c0a into main Oct 19, 2026
9 checks passed
@Emryswu
Emryswu deleted the feat/table-restyle branch October 19, 2026 10:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant