diff --git a/docs/tasks/README.md b/docs/tasks/README.md index fd6d1e83..64d326eb 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -518,3 +518,4 @@ | `TASK-chart-dasha-yogini-20261021.md` | — | #88 星盘页大运右栏切换 Chara / Yogini,Yogini 补小运(按比例,内部核对,页面注明未经外部软件核对);Ashtottari 另立单(起运表与 PyJHora 8/12 宿不一致) | 待领取(等 #86、#87 合入) | `codex/chart-dasha-yogini-20261021` | | `TASK-full-data-parity-1-20261021.md` | — | #91 完整数据版补齐(一):A 段渲染(中文附录改中文源、71 小节归 6 章、导出星座名)→ B 段引擎(Yogi 点、标准大运子运、Kalachakra 简化子运、年运三年全展开、36 个月星历、解释补长);不设大小上限 | 待领取(等 #89 合入;T3 与 #90 串行) | `codex/full-data-parity-1-20261021` | | `TASK-goel-jaimini-strength-20261022.md` | — | #94 搬上游公开的 Goel Jaimini 强度与 Brahma / Maheshwara / Rudra(4 个上游原样文件,按 #81 决策 A 先例根目录预算 448→452;来源串改书目引用);只做计算、不改报告;冻结身份不变 | 待领取(可与 #89 并行;须在 #91 印章前合入) | `codex/goel-jaimini-strength-20261022` | +| `TASK-chart-subject-table-fix-20261022.md` | `PROGRESS-chart-subject-table-20261021.md` | **#86 第 1 次打回**:报告所有表被强制单行(打印跑出纸面);保存他人复制了档案页代码且已分叉;点编辑框内边距会丢修改 | 待领取 | `codex/chart-subject-table-20261021` | diff --git a/docs/tasks/TASK-chart-subject-table-fix-20261022.md b/docs/tasks/TASK-chart-subject-table-fix-20261022.md new file mode 100644 index 00000000..6ff8621b --- /dev/null +++ b/docs/tasks/TASK-chart-subject-table-fix-20261022.md @@ -0,0 +1,60 @@ +# 修复单:星盘页就地编辑 / 人名切换 / 报告行星表(issue #86,第 1 次打回,2026-10-22) + +- 被验提交:`885bd5665`(分支 `codex/chart-subject-table-20261021`) +- 需求:issue #86 正文(无单独任务书) +- 执行方:Grok(Windows + Docker)。在**同一分支**上继续,只推这个分支;开工前 `git merge origin/staging`(不 rebase)。 +- BUG 编号:本分支的 BUG-1404 已被 #85 占用(#85 用 1404~1408,#90 将顺延),合入前 Claude 会统一重编;新增记录从开工时 `grep -oE "^## BUG-[0-9]+" docs/BUG_HISTORY.md | sort -u | sort -t- -k2 -n | tail -1` 的最大号 +1 起(该文件自 `400af57e8` 起整段重复,必须 `sort -u`)。 + +## 验收结论(Claude,Linux / Node 22) + +| 项 | 结论 | +| --- | --- | +| tsc / lint | 0 错;0 error(122 warning,同基线) | +| 前端全量 `npm test` | 5103 条,失败 25,名单与 staging `9812f3173` 基线逐名一致;新增 7 条 | +| build | `/` 仍 `○ Static`;首屏 gzip 644,589(基线 643,357,+0.19%) | +| 全量 pytest | 与基线一致(多出的一条 `test_active_rectification_api` 是子进程 20 秒超时,负载抖动,与本单无关) | +| 范围 | 没碰数据库、触发器、`page.tsx`、侧栏;没有删测试或弱化断言 | +| 「+ 添加一个人」满 20 人才隐藏(issue 写 5) | 判断正确:线上上限是 20(含本人)。已请产品负责人在 issue 里确认 | + +**未通过 3 项,见下。** + +## F1 · 所有报告表格都被强制单行(必修,打印退化) + +位置:`frontend/src/app/globals.css` 的 `.personal-report-table-wrap th, .personal-report-table-wrap td`(`white-space: nowrap; word-break: keep-all`)与 `table { width: max-content }`,以及 `@media print` 里同一组规则(`width: max-content !important`、`white-space: nowrap !important`,外层 `overflow: visible`)。 + +这些规则作用于**报告里的每一张 Markdown 表**,不只是行星表。瑜伽「作用说明」、主题「建议 / 说明」这类整句的表,屏幕上每格变成一条很长的横滑单行;打印时表格按内容撑宽、外层不裁切,宽表直接跑出 A4 纸。issue 要求「打印 / 导出的样式不能退化」,这里退化了(同类教训:BUG-153 打印测试须覆盖无滚动容器的宽表)。 + +修法: + +1. 只让**短数值 / 名称列**不断行。推荐:`report-table-reading.ts` 识别出行星位置这类数值表(按表头,如含「速度 / Speed / 度数」等),给该表加一个类(例如 `personal-report-table-numeric`),`nowrap` 与 `max-content` 只挂在这个类上;其他表恢复原来的自动换行。 +2. 打印:所有表 `width: 100%`、单元格可换行;数值表在打印里也允许换行(纸上没有横滑)。 +3. 测试:渲染一份含「行星原始位置」表和一张整句说明表的报告,断言数值表带新类、说明表不带;CSS 合同测试断言 `nowrap` 只出现在新类的选择器下,打印块里没有 `max-content` 与 `nowrap`。 + +## F2 · 「他人」保存逻辑是复制的,已经和档案页分叉(必修) + +位置:`frontend/src/components/chart-page/chart-birth-editor.tsx` 的保存函数,对他人直接 `fetch PUT /api/chart-profiles/:id`,与 `frontend/src/components/people/people-page.tsx` 的 `saveOther` 是两份代码。已经分叉:编辑器保存他人后清了星盘 / 星历缓存,档案页的 `saveOther` 没清——档案页改完别人,再去星盘页仍是旧盘。(本人一路已经共用 `lib/self-profile-save.ts`,是对的。) + +修法:把「保存他人」抽成 `frontend/src/lib/` 下的一个函数(请求、409 `reported_birth_time_is_immutable` 等错误映射、保存成功后的缓存清理都在里面),编辑器与档案页**都调它**。档案页因此也补上缓存清理,在 BUG 记录里写明这是顺带修复的旧缺陷。 + +测试:两处调用同一个函数(源码断言或注入替身);档案页保存他人后 `invalidateChartPage` / `invalidateEphemerisPage` 被调用。 + +## F3 · 点编辑框内边距会关掉编辑框、丢失未保存的修改(必修) + +位置:同文件 `` 里的 `if (event.target === event.currentTarget) onClose();`。`.chart-birth-dialog` 有 `padding: var(--space-5)`,点在内边距上、或在输入框里拖选文字松手落在内边距上,事件目标都是 dialog 本身,于是关闭并丢掉已填内容。 + +修法(二选一):内容包一层内部容器、内边距挪到容器上,dialog 自身不留可点的内边距;或按点击坐标判断是否落在 dialog 矩形之外才关闭。Esc 关闭保持现状(已正确)。 + +测试:模拟点击 dialog 内边距(目标是 dialog、坐标在矩形内)不关闭;点击遮罩(坐标在矩形外)关闭。 + +## 顺手改(小) + +- 测试文件 `frontend/tests/issue-86-chart-subject-table.test.tsx` 改名为按内容命名(例如 `chart-birth-editor-and-report-table.test.tsx`),仓库里没有按 issue 号命名的测试文件。 +- 他人锁定出生时间时,「填报的出生时间保存后不能再改」在表单说明里与锁定提示各出现一次,留一处即可。 + +## 交回前必跑 + +`tsc --noEmit`、`npm run lint`、改到的前端测试文件(含 `chart-page-view.test.tsx`、改名后的本单测试、档案页相关测试、CSS 合同测试)、`pytest tests/test_report_chart_blank_columns.py`。全量 `npm test`、build、gzip 由 Claude 验收时跑。 + +## 让步顺序 + +F1、F2、F3 都不可让步。F1 若「按表头识别数值表」不稳,可以退一步:`nowrap` 只给数字单元格(内容全是数字 / 度数 / 符号的格),整句单元格一律可换行;但打印那一条(`width:100%`、可换行)不让。