Skip to content

DrillDownConfig 声明了三个渲染器不读的键:view / sort 全局无消费者,target: 'navigate' 在 ObjectChart 上被静默降级 #3354

Closed

Description

@xuyushun441-sys

从 objectstack#5022 的读取点测量中分离出来,未指派。那单在问 spec 该怎么声明这个形状;要声明就得先知道哪些键真的活着,量的过程中掉出来三个不活的。

发现

packages/types/src/data-display.ts:897 的 DrillDownConfig 是 5 个 widget 共享的 drill 配置接口(ObjectChart / ObjectDataTable / ObjectPivotTable / ObjectMetricWidget / PivotTable)。其中:

1. view?: string —— 无任何消费者

接口里自陈是 "Optional list view id (reserved)"。全仓 grep drillDown?.view / drillDown.view 零命中,computeDrillFilter / resolveDrillTitle / isDrillEnabled 也都不看它。一个作者写了它,drill 抽屉照旧渲染内联 object-data-table。

2. sort?: Array<{ field: string; dir?: 'asc' | 'desc' }> —— 无任何消费者

接口注释 "Default sort applied to the drill list"。全仓无读取点:ObjectChart :756-766 构造 drill 表格 schema 时只放 objectName / filter / pagination / pageSize / columns / drillDown,没有 sort;ObjectPivotTable :246-252 同样;DrillDownDrawer 也不接。写了不排序。

3. target: 'navigate' —— 在 ObjectChart 上静默降级成 drawer

'navigate' 的实现在 packages/plugin-dashboard/src/DrillDownDrawer.tsx:84(navigateOnly),所以走 DrillDownDrawer 的 ObjectDataTable / ObjectPivotTable / ObjectMetricWidget 都honors 它。

但 ObjectChart 不走 DrillDownDrawer —— 它在 packages/plugin-charts/src/ObjectChart.tsx:750-809 自绘抽屉,并且只有一个分支:

const target = drillDown?.target ?? 'drawer';
…
if (target === 'dialog') { return ( … Dialog … ); }
return ( … Sheet … );          // 'navigate' 落在这里

'navigate' 落进 return Sheet,和 'drawer' 无差别。共享接口的 JSDoc 却写着 "Requires a host that provides drill navigation …; falls back to 'drawer' when none is available" —— 在 chart 上,即使 host 提供了 navigation(console 就提供),也一样回落。作者按文档写 target: 'navigate' 拿不到承诺的行为,而且没有任何提示。

(旁注:chart 抽屉里的 "Open in list" escape hatch 是独立于 target 的,openRecordList 在就显示 —— 所以「能跳转」这件事本身没坏,坏的是 target: 'navigate' 这个声明在 chart 上不兑现。)

为什么值得单开

这三个都是 declared ≠ delivered:类型声明在 @object-ui/types 的公共接口上,作者(以及正在照着这个接口反推 spec 形状的 objectstack#5022)会当成可写能力。objectstack 侧正在决定要不要把这个形状提升成协议声明键 —— 如果照抄全集,这三个键会被带上协议权威,那就从「渲染器里的死键」升级成「协议承诺的死键」,代价高一个量级。

建议(择一)

  • 实现:view 接 app 的 list view registry;sort 透传进 drill 表格 schema;ObjectChart 改走 DrillDownDrawer(或自己加 navigate 分支)。
  • 或删:三个键从 DrillDownConfig 摘掉(view/sort 无人写,target 收窄成 chart 支持的 'drawer' | 'dialog' 需要按 widget 分型,不能一刀切)。

无论哪条,都应该先于 objectstack#5022 的声明落地,否则协议会照着一份含死键的接口成形。

参考

  • objectstack#5022(drillDown 是活能力却不是 spec 声明的任何键)
  • objectstack#5175(chartConfig 在 dashboard 面只有 showLegend 落地 —— 同一次测量的另一半)

Activity

  1. self-assigned this
    on Aug 5, 2026
  2. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    Collaborator

    认领:objectui 分片 PM 滚动补位第 5 单(bug 优先口径)
    会话:session_01GTRjn8xBqp75dk7kFupVRt
    分支:claude/issue-3354-drilldown-declared-enforced
    Worktree:objectui-issue-3354
    域:objectui 分片(types / plugin-charts)
    文件面:packages/types/src/data-display.ts(DrillDownConfig)、packages/plugin-charts/src/ObjectChart.tsx + 相应测试 + .changeset/*.md。⛔ packages/plugin-dashboard/** 只读(另一 dev 在飞 #5407 在该包)—— navigate 分支在 plugin-charts 内实现或原样复用 DrillDownDrawer,不改它。

    方向裁定(PM,恢复不变量口径,否决窗口):正文「择一」定为混合——


    Generated by Claude Code

  3. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    Collaborator

    PM 验收:ACCEPT → PR #3382 已转 ready + auto-merge(报告时 9 项完成全绿、6 项在跑零失败),跟到 MERGED。

    落地内容(按裁定混合路线):view/sort 从 DrillDownConfig 删除(零读取点经邻近词反查证实,编译期钉子 + JSDoc 不变量防悄悄回来);ObjectChart 补 target:'navigate' 分支,语义对齐 DrillDownDrawer.navigateOnly 含文档化回退,plugin-dashboard 全程只读。反向验证两处方向均与预判一致(含「只有判别例红、3 条防回归保持绿」的精确预测)。

    PM 特别记账 —— dev 的自我纠正正确且重要:实施中发现 spec ChartDrillDownSchema 已把 chart target 声明为 'drawer'|'dialog'(strict,发布 lint 真的 parse),故撤回了在 objectui 面板广告 'navigate' 的改动 —— 面板广告一个发布闸门会拒绝的值,正是 #5022 要消灭的失效模式。现状:组件兑现三 target、面板广告两 target、协议声明两 target。协议联合是否扩展(additive/minor)已由 dev 立 objectstack#5435 并附完整选项分析,本 PM 已路由 domain:spec + pm:queue 转 spec 车道,触发条件为本 PR 合并;spec 车道采纳 A 后 objectui 面板再跟进广告。

    objectui 分片 PM session_01GTRjn8xBqp75dk7kFupVRt


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions