feat(charts): combo 图从 mark 下钻,axis/surface 保持静默 (#4692) - #4870
Conversation
`AdvancedChartImpl`'s combo branch returned from its own `ComposedChart`
before `cartesianClickProps` was applied to anything, so a combo chart
fired `onChartClick` never — not on a mark, not on the axis — even though
its marks are the same `Bar`/`Line`/`Area` components the drillable
cartesian branch renders.
The family is derived, not only authored: `effectiveChartFamily` resolves
a chart to `combo` whenever its series declare different families, so
adding `type: 'line'` to one series of a drillable bar chart silently
turned that chart's drill off, with nothing in the authored spec saying
drill was touched.
Combo's marks now emit `{ category, categoryId, series, value }` with the
same semantics the plain cartesian branch gives, reusing the item-level
series-identity machinery from #4672/#4682 — the mark records its series,
the chart-level handler composes the one event.
Only the marks drill: a click on a combo's surface or axis stays silent,
because a plot carrying several measures has no single series to report
there. Shared with the plain branch through one composer that differs on
that rule alone.
Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
|
【PM 验收 · ACCEPT】objectui 分片 PM(session_01GTRjn8xBqp75dk7kFupVRt)对 #4692 裁定(方案 B,评论 5306033961)实施半的验收: 实物核验:4 文件对账相符(AdvancedChartImpl +84、钉子文件 git rename 翻转 3→9 例、changeset patch);零越包、模型标识 0、releases 0。三条 scope guards 逐条兑现:①axis/surface 静默 —— 反向验证(双臂,方法论示范级):A 臂摘接线证 5 发射钉活(且诚实记录负钉在此臂是空绿);B 臂用 guard 1 明令禁止的「顺手改进」当变异(cartesianClickProps 直换),2 负钉红且红文是真事件 —— 单跑任何一臂都覆盖不了裁定的两个方向,B 臂正是负钉不空绿的证明。CI 亲读:19 项全 completed(17 success + 2 skipped),零失败。测试 rename(Noop→MarkClick)名实相符、仓内零引用,核准;mark 级 pointer 光标(不上全图)与 guard 1 自洽,取舍已记录。零 finding。 处置:undraft + auto-merge(SQUASH)。本卡两半(PR4705 doc-truth + 本 PR 实施)至此全部落地。 Generated by Claude Code |
Fixes #4692
按 2026-08-16 维护者裁定(评论 5306033961,方案 B)实施本卡余下的实施半 —— doc-truth 半已由 PR #4705 落地。
机制
AdvancedChartImpl只把cartesianClickProps施加在最后一个 cartesianChartComponent上;combo 分支从它自己的ComposedChart提前 return,渲染时只带data,不带任何点击 props。于是 combo 图的onChartClick永不触发 —— mark 不触发,axis 也不触发,尽管它画的正是可下钻分支同样的Bar/Line/Area。值得修而不是只记录的原因是图族是派生的:
effectiveChartFamily在各 series 声明的族不一致时把图解析成combo(#2945)。给一张可下钻柱图的某个 series 加上type: 'line',整张图的下钻就静默失效 —— 作者写的 spec 里没有一个字提到下钻被动过,也没有任何报错。改动
combo 的
Bar/Line/Areamark 现在发{ category, categoryId, series, value },语义与平面 cartesian 分支完全一致,复用 #4672 / #4682 的 item 级 series-identity 机制:mark handler 记录自己被渲染时的 series,chart 级 handler 组装并发出唯一一个事件,所以一次手势仍然只产生一次onChartClick。两个分支共用同一个组装器
emitCartesianClick,只在一条规则上分岔 ——requireMark:⛔ axis / surface 点击保持静默(裁定 guard 1):一张 combo 同时画多个 measure,surface 点击没有单一 series 可报,回退答案只能靠猜 —— 与 pivoted 案裁定同理。combo 也因此不带全图 pointer 光标,affordance 落在真正会应答的 mark 上。
⛔ 未做 Option C 的 designer hint(裁定 guard 2,另卡另裁)。
钉的翻转
AdvancedChartImpl.comboClickNoop.test.tsx是 PR #4705 钉住 combo 静默的文件,本改动按裁定 guard 3 就地翻转它,并随内容改名为AdvancedChartImpl.comboMarkClick.test.tsx(文件名里的 "Noop" 已与断言相反;git 记录为 rename,仓内无任何引用)。9 个用例:findChartSeriesRow落到具体行)与其 line series;反向验证(双臂,方向先判后跑)
A 臂 —— 摘掉 combo 的点击接线:预判 5 个发射钉变红且指名,2 个负钉保持绿(空绿:未接线的 combo 本来就处处静默,这两个钉对「接没接线」并不敏感),控制保持绿。实测完全一致:
B 臂 —— 把 combo 的 surface 过度接线(
comboClickProps换成cartesianClickProps,即 guard 1 禁止的那种「顺手改进」):预判反过来 —— 2 个负钉变红,发射钉全绿。实测一致,且红的内容是真事件而非空数组,证明负钉不是空绿:A 臂单独看不足以证明 guard 1 被守住(负钉在那一臂里是空绿),B 臂才是守 guard 1 的那一臂 —— 两臂合起来才覆盖裁定的两个方向。
验证
pnpm exec vitest run packages/plugin-charts --maxWorkers=2→ 31 files / 231 tests 全绿(PR docs(charts): correct onChartClick wiring doc, pin combo's no-click state #4705 基线 225,本卡净增 6)pnpm exec turbo run type-check --concurrency=2→ 81 / 81 successfulnode scripts/check-control-bytes.mjs→ OK(扫描 4355 个 tracked text file)pnpm exec eslint两个改动文件 → 0 errors(53 个no-explicit-anywarning,与文件既有约定一致).changeset/combo-mark-drill.md(@object-ui/plugin-charts: patch,与同族的 AdvancedChartImpl's cartesian click readsactivePayload, which recharts 3 does not send — every cartesian drill loses its series and value, killing the pivoted drill outright #4672silly-jars-drill.md取同一档);check-changeset-presence/check-changeset-no-major均通过同步更新的 doc comment
PR #4705 把
onChartClick的注释改成「combo 是 no-op」,本改动使其失真,已按裁定 guard 3 一并更新:现在写明 combo 已接线、唯一的刻意例外是 axis / surface 静默、以及「派生不再吃掉一个交互」这层因果;radar 是 L1 里剩下的唯一 no-op。Generated by Claude Code