星盘档案可以拖动排序,合盘开始前先确认扣点。
Independent Staging Quality Gate / validate (push) Failing after 9m16s
Independent Staging Quality Gate / publish (push) Skipped

人物卡、菜单、编辑和删除换成组件库。chart_profiles 增加可空的 archive_order,本人始终排在第一。合盘选人页两个名字并排,开始按钮居中,点了先说出点数和余额。

自测:tsc 0;lint 0 error(122 警告,与上一张相同);定向测试通过;next build 后 / 仍是 Static;首页 JS gzip-9 639609,相对 640131 少 0.08%。test:db 79 通过、13 失败,失败名单与 windows-known-failures.txt 一致,排序列断言在通过的那一组。没有浏览器登录态。

Co-Authored-By: Grok (agent loop)
This commit is contained in:
jesse-ux
2026-10-25 05:05:00 +08:00
co-authored by Grok (agent loop)
parent b7ec8e78ed
commit eee8564b7f
29 changed files with 1061 additions and 329 deletions
+16
View File
@@ -19462,3 +19462,19 @@
- 复发自:无
- 修复版本:分支 `codex/ui-kit-3-chart-20261023`。
## BUG-1436 | 星盘档案与婚恋合盘换成组件库
- 状态:enhancement
- 首次发现:2026-10-25
- 最近更新:2026-10-25
- 影响面:星盘档案的人物卡、编辑、删除、排序;婚恋合盘的选人页和开始前的确认;合盘报告的返回和语言切换。扣点、删人后合盘和报告怎么处理,不在这次的改动里。
- 用户现象:人物卡可以拖动排序,换设备还在,本人始终在第一张。合盘选人页两个人并排,窄屏上下排,开始按钮在正中。点开始会先说出将用掉多少点、余额还有多少点。不够时改去补点数。
- 触发条件:打开星盘档案后拖动别人的卡片,或在合盘页选好两个人再点开始合盘。排序在松手后写入。确认之后才生成报告。
- 根因:不是缺陷。组件库迁移的档案与合盘这一张(任务书 K4,决策 D4、D6、D7、D8、D9)。
- 修复:人物卡、更多菜单、编辑框和删除确认改用已有的组件库零件。关系与性别改成同一排标签。`chart_profiles` 增加可空的 `archive_order`,只加列,不改已有列表的时间顺序;没排过的仍按最近更新排在后面。只改了顺序时不改档案的更新时间。本人不是档案表里的一行,始终排在可拖的那一组外面。合盘选人改成两个下拉,开始前用确认框读计价表和余额。拖动排序的零件在档案页载入后再出现,不进首页同步包。第一次打开合盘时两个头像靠拢的动效还在。
- 验证:见 `docs/tasks/PROGRESS-ui-kit-4-people-20261023.md`。没有浏览器登录态,不把拖过人物卡或点过合盘写成已经在浏览器里做过。
- 防复发:`frontend/tests/people-archive-order.test.ts` 锁住本人不能被拖走、顺序间隔、只改排序列不改更新时间,以及开始按钮居中。`frontend/tests/database-local-business.test.ts` 锁住新列可空、授权更新,且迁移不复制到旧目录。合盘合同锁住确认句、可访问名称和扣点前的确认。白名单测试锁住名单只减不增。
- 相关记录:issue #108。任务书 `docs/tasks/TASK-ui-kit-migration-20261023.md` 的 K4。会话排序列沿用 #105 的 `sidebar_order`,本张不改它的语义。第一次打开合盘的头像动效沿用 #99。
- 复发自:无
- 修复版本:分支 `codex/ui-kit-4-people-20261023`。
@@ -0,0 +1,67 @@
# PROGRESS · 组件库 K4 星盘档案与婚恋合盘(2026-10-25)
工单 #108。分支 `codex/ui-kit-4-people-20261023`。基线 `origin/staging` `b7ec8e78ed4d280b25f5180cd7302e3ec3ef085c`(#107 星盘页已在这个提交里)。只做任务书 **K4 星盘档案与婚恋合盘**。K5 及之后没做。没有重做星盘页、对话页、侧栏。
## 结论
人物卡可以拖动排序。刷新、换一台登录的设备,顺序还在。本人始终是第一张,拖不动。合盘选人页两个人并排,窄屏上下排,开始按钮在正中。点开始会先说出将用掉多少点、余额还有多少点。不够时改去补点数。
## 做了什么
- 人物卡用 `Card` 和 `CardAction`。更多菜单用 `DropdownMenu`。编辑用 `Dialog`,表单仍是原来的那一份,没有在表单里再套一层对话框。删除用 `AlertDialog`。菜单里写「删除」,确认框里仍是「删除这个人」。
- 拖动排序用 dnd-kit 的网格策略。零件在档案页载入后再出现,不进首页同步包。本人不是 `chart_profiles` 里的一行,放在可拖的那一组外面。`moveArchiveIds` 遇到 `self` 就不动。
- `chart_profiles` 只加可空整数 `archive_order`,默认空,已部署的代码还能读这张表。不删列、不改类型、不收紧非空。会话的 `sidebar_order` 没有再加,语义也没改。只改顺序时不改 `updated_at`。名单仍按最近更新取出,再在程序里排序:有数字的在前,都没有数字时保持原来的先后。新位置是 10、20、30。
- 关系用 `ToggleGroup`,不是页签。性别也是同一排标签,所以能离开白名单。空的关系在名单上仍显示「其他」,再点这一项会写入。性别再点已选中的一项不会改值,「不填」仍存空。标签和读屏名称都留着。
- 合盘选人页去掉页内标题和副标题。两个 `Select` 左右并排,中间是 Lucide 的叉,`aria-hidden`。窄屏上下排,叉仍显示并居中。开始按钮用 `HeartHandshake`,不用 `Sparkles`,上面不写价格。点了才弹确认:「会用掉 N 点,余额 M 点。」按钮是「取消 / 开始」。不够时说「需要 N 点,余额只有 M 点。」,主按钮换成「去补点数」。N、M 从计价表和账户读。计价或余额读不到时不弹空确认,只说「计费配置不可用」,也不再发出生成请求。这比原来的按钮更严:原来计价未知时仍可以点。扣点仍发生在服务端生成报告时。删人后合盘和报告仍走原来的删除接口。
- 合盘报告的返回改成图标加「婚恋合盘」。语言用页签。追问仍是原来的八节。标题里的 × 还在,第一次打开时两个头像靠拢仍按这个标题拆。减少动态效果时仍只淡入。
- `people-home-links.tsx` 没有改。首页仍只从这里拿账户深链和合盘深链。
- 白名单去掉 7 个文件,没有加长,测试里写死的基线名单没有改。
- 没有改 `.gitea/**`,没有改生产部署,没有给 `scripts/jyotish_api_server.py` 加方法,没有改 `page.tsx`。`Home()` 的 useState / useRef 没有增长。
## 断言改动(原值 / 新值 / 原因)
| 位置 | 原值 | 新值 | 原因 |
| --- | --- | --- | --- |
| 人物卡个数 | `class="people-archive-row"` 的个数 | 完整的 `data-slot="card"` 个数,不含 `card-action` | 人物卡改用 Card。CardAction 的槽位名字以 card 开头,不能算成另一张卡 |
| 当前人物 | 按 `<li>` 切开 | 只按完整 `data-slot="card"` 切开 | 同上。本人仍是第一张 |
| 添加按钮 | `+ 添加一个人`,到顶是 `disabled` | 仍写「添加一个人」,到顶是 `aria-disabled`,没有 `disabled` | 加号改用图标。到顶仍可点,用来弹出限额提示 |
| 返回 | 按钮里是 `‹`,类名后 240 字内是「返回」 | 类名 `people-archive-back` 后 800 字内是「返回」 | 箭头改用图标,图标 SVG 比一个字符长 |
| 本人脚注 | 类名后 500 字内是「编辑」 | 1600 字内是「编辑」 | 编辑改用 Button,组件库样式写在同一个 class 里 |
| 关系选项 | 编辑态静态 HTML 里有「孩子」 | 字段渲染关系词表,词表里仍是 `child: "孩子"` | 编辑放进对话框,传送门不进静态 HTML |
| 性别 | `role="radio"` | 按钮的 `aria-pressed`;再点已选项由 `genderChoice` 决定不改 | 性别改成同一排标签 |
| 合盘副标题 | 开关未返回时静态 HTML 有副标题 | 源码和静态 HTML 都没有这句 | 顶栏已经有页名 |
| 合盘可访问名称 | 写死 `aria-label="第一个人"` | `label="第一个人"` / `label="第二个人"`,触发器 `aria-label={props.label}` | 两个选择框共用一个组件,名字仍是这两个词 |
| 开始按钮 | 下面写「生成一份完整合盘报告,用掉 N 点。」,图标是 Sparkles | 按钮上不写价格;确认句是「会用掉 N 点,余额 M 点。」和「需要 N 点,余额只有 M 点。」;图标是 HeartHandshake | 先确认再生成。价格从计价表读 |
| 报告返回 | `‹ 婚恋合盘` | 链接仍是 `/synastry`,文字是「婚恋合盘」,源码有 ChevronLeft | 去掉手写箭头。标题里的 × 还在 |
| 编辑表单接线 | `editing ? (` 紧跟表单 | 中间可以先是 Dialog,400 字内仍是表单 | 编辑改用对话框 |
| 排序列 | 只核对会话的 `sidebar_order` | 同时核对 `chart_profiles.archive_order` 可空、可更新,且不复制到旧迁移目录 | 只加一列,对已部署代码向后兼容 |
| 白名单 | 含这 7 个档案和合盘文件 | 这 7 个移出 | 它们已经改用组件库。名单只许变短 |
移出的 7 个文件:`chart-profile-form.tsx`、`people/people-page.tsx`、`person-relation-field.tsx`、`profile-gender-field.tsx`、`synastry/synastry-add-dialog.tsx`、`synastry/synastry-picker.tsx`、`synastry/synastry-report-view.tsx`。
## 自测
| 检查 | 命令 | 结果 |
| --- | --- | --- |
| 类型 | 仓库根 `frontend\node_modules\.bin\tsc --noEmit -p frontend` | 退出码 0 |
| 检查 | 在 `frontend` 下 `npm run lint` | 退出码 0。122 个警告,0 error。警告数和上一张记下的一样,没有为这一张新加 |
| 定向测试 | 在 `frontend` 下 `node node_modules/tsx/dist/cli.mjs --test` 下面列出的文件 | 先 180 条里 4 条失败,按上面的三栏改完断言后,失败的 4 个文件 43 条全部通过。整批重跑的其余文件在第一次里已通过 |
| 构建 | 在 `frontend` 下 `npm run build` | 退出码 0。编译 10.7s,TypeScript 55s。`/` 仍是 ○ Static。5 条既有 skill-package-registry 警告,没有改 |
| 首屏体积 | 首页 HTML 引用的 `/_next/static/**.js`,gzip-9 相加,不含 CSS | 基线 `b7ec8e78`(上一张记下的数):36 个文件,640131 字节。本张:36 个文件,缺失 0,639609 字节,少 522(-0.08%)。±2% 大约是 627329 到 652933。`dnd-kit`、`dropdown-menu`、`people-page`、`people-archive-sortable` 命中都是 0 |
| 数据库 | 在 `frontend` 下 `npm run test:db` | 92 条,通过 79,失败 13,取消 0。失败的 13 条名字与 `tools/agent-loop/windows-known-failures.txt` 逐条一致,没有多出来的。排序列断言在通过的「local PostgreSQL applies the reviewed business schema」里。退出码是 1,因为这 13 条在 Windows 上本来就会失败,不写成整套通过 |
定向测试文件:`adopted-birth-date.test.ts`、`chart-birth-editor-and-report-table.test.tsx`、`chart-library-other-profile.test.ts`、`chat-session-url.test.ts`、`consultation-entrypoint.test.ts`、`loading-motion-20260930.test.tsx`、`onboarding-checklist-20261022.test.ts`、`people-archive-order.test.ts`、`people-archive-regressions.test.ts`、`people-archive-view.test.tsx`、`profile-gender-20260927.test.ts`、`profile-gender-ui-20260927.test.tsx`、`profile-onboarding-birth-sky-reveal.test.ts`、`self-edit-people-20260928.test.tsx`、`settings-mvp-contract.test.ts`、`synastry-full-report.test.ts`、`synastry-report-surface.test.ts`、`ui-kit-whitelist.test.ts`。
没有跑前端全量 `npm test`,没有跑 Python 快速门。`tests/test_repo_privacy_markers.py` 退出码 0。`page.tsx` 和 `scripts/jyotish_api_server.py` 没有改。
## 偏离
- 决策 D7 说长相尽量不变。K4 写明人物卡、网格排序和合盘选人页的新样子,以 K4 为准。左栏仍是 18–22rem,所以桌面上卡片多半排成一列;手机上的列表最宽 640px,宽一点会排成两列。排序用的是网格策略。
- 决策 D9 说能用页签就用页签。K4 写明关系用 `ToggleGroup`。性别也用同一排标签,这样能离开白名单,而不是再做一套页签。
- 计价或余额读不到时,不再允许直接生成。原来的按钮在价格未知时仍会提交。确认框不能空着说一个编出来的价格。
- `people-home-links.tsx` 没有改界面。首页不从档案页拿拖动排序。
- 编辑对话框在静态渲染里挂不进页面。合同改为源码接线和直接渲染表单字段。删除确认的句子仍在源码里。
## 环境缺口
- 没有登录态。没有在浏览器里拖过人物卡,也没有点过开始合盘。不写成通过。可照做的步骤在 `docs/testing/ui-kit-migration-20261023.md` 的「星盘档案」和「婚恋合盘」两节。
+19
View File
@@ -41,3 +41,22 @@
5. 点顶栏的日期和地点。可以改出生资料。点框里面的空白不会把没保存的修改丢掉。按 Esc 或点外面会关上。
6. 在本命和 D9 之间来回切。星体从原来的宫位移到新的宫位,停稳后和直接打开那张盘一样。换成另一个人时,格子重画,星体不飞。系统开了减少动态效果时,只淡入,没有位移。第一次打开星盘时的那一次画线,不会因为换盘再来一遍。
7. 点开一段收着的大运,下面的小运展开。0 年的那一段不能展开。右栏先是 Chara。点 Yogini 才去取另一套。这一套失败时,再点一次 Yogini 会再要一次。
## 星盘档案
没有登录态,下面各项都还没在浏览器里拖过人物卡。上面「会话」第 3 条说档案顺序不变,那是外壳那一张的记录。这一张之后,档案可以拖动排序。
1. 打开星盘档案。本人始终是第一张。按住别人卡片上的拖动手柄,拖到另一张前面。松手后顺序变了。刷新页面,顺序还在。
2. 换一台登录同一账户的设备,再打开星盘档案。顺序和刚才一样。本人仍是第一张,拖不动。
3. 点一张卡的更多。可以编辑。别人还有删除。点删除会先说出将带走多少对话和报告,再确认。确认后,这个人相关的合盘和报告仍按原来的规则处理:没交付的释放预留点数,已经交付的不退。
4. 编辑别人时,关系是一排标签:伴侣、孩子、父母、朋友、其他。性别是女、男、不填。两项的名字读屏都能听到。
5. 把窗口改成大约 390 像素宽。列表和详情一次只看一栏。详情顶部的返回能回到列表。卡片按宽度换行,窄的时候是一列。
## 婚恋合盘
没有登录态,下面各项都还没在浏览器里点过开始合盘。
1. 打开婚恋合盘。页内不再重复标题和副标题,顶栏已经有页名。两个人的选择框左右并排,中间一个叉。把窗口改成大约 390 像素宽,两个选择框上下排,叉仍在正中。开始合盘在正中,按钮上没有价格。
2. 选好两个人,点开始合盘。先出现「会用掉 N 点,余额 M 点。」,按钮是取消和开始。N 是计价表上的价格,不是写死的数字。点开始之后才生成。这两人已经合过的次数,仍写在按钮下面。
3. 余额不够时,这句话改成「需要 N 点,余额只有 M 点。」,主按钮变成去补点数。点了去补点数的那一页。
4. 第一次打开一份合盘报告,两个人的头像仍会靠拢,再展开报告。系统开了减少动态效果时,只淡入,头像不飞。报告左上角回到婚恋合盘。语言仍是中文和 English。