Skip to content

objectui: allowAddTab 渲染出的「新增 tab」按钮没有 click handler —— 契约刚声明的能力只交付了一半 #5236

Closed
objectstack-ai/objectui
#3926

Description

@xuyushun441-sys

发现于 #5073 的实施(promote userFilters.allowAddTab 进 spec 契约)。不阻塞 #5073,那条的裁定与落地都成立;这是落地时实测到的、渲染器一侧的独立缺口。

事实(实测,非阅读推断)

objectui/packages/plugin-list/src/UserFilters.tsx 的 TabFilters:同一个 return 里,预设 tab 按钮有 onClick,新增 tab 按钮没有。

预设 tab(:727 起):

< button
  key={tabId}
  data-testid={`filter-tab-${tabId}`}
  onClick={() => handleTabChange(tabId)}
  …
> {tab.label} < /button >

allowAddTab 渲染的那个(:742 起):

{allowAddTab && (
  < button
    className="… hover:text-foreground hover:bg-muted shrink-0"
    data-testid="filter-tab-add"
    title="Add filter tab"
  >
    < Plus className="h-3.5 w-3.5" / >
  < /button >
)}

没有 onClick,组件里也没有任何 onAddTab / addTab 入参或回调(全仓 grep filter-tab-add / onAddTab 只命中这两行)。它带 hover 态和 title="Add filter tab",看起来完全可点,点下去什么都不发生。

注意别与 app-shell/src/views/metadata-admin/widgets.tsx:1431 的 addTab 混淆 —— 那是 Studio 编辑期的 tabs 编辑器(data-testid="filter-mode-add-tab"),与运行期渲染器的这个按钮无关。

为什么现在值得立案

#5073 把 allowAddTab 提升进了 packages/spec 的 UserFiltersSchema,它因此进了 JSON Schema、Studio SchemaForm 和参考文档 —— 能力从此可被发现,AI 作者会照着 schema 写它。

那条 PR 的 .describe() 已经刻意收窄到只承诺渲染入口:

Render an "add tab" affordance after the presets (tabs element). Page lists only — object views use listViews for named presets

这是按 PD#10 写的(不宣传运行时不交付的能力),所以契约本身没有说谎。但作者写 allowAddTab: true 的意图显然是「让终端用户能加 tab」,而交付的是一个死按钮 —— 一个可见、可 hover、有 tooltip 却无行为的控件,比没有这个按钮更糟:它把「没实现」伪装成「点了没反应的 bug」。

需要裁定的是方向,不是补丁

两个方向都动到已发布契约,所以立案不猜,按 #5022 之后的规矩交给维护者。

参考

Activity

  1. added a commit that references this issue on Aug 4, 2026
  2. os-zhuang commented on Aug 4, 2026

    @os-zhuang
    Contributor

    [决策] allowAddTab 死按钮往哪个方向收敛 —— 两轴分析与建议

    分诊升级(会话 session_01FTszibd6C8sUCCZnM4VcrL,v17 C 组工作集)。本单正文明示「立案不猜」,且两个方向都动已发布契约,过升级门槛,挂 needs-user-decision。

    背景:#5073 裁决 A(2026-08-04 03:02Z)已把 allowAddTab promote 进 UserFiltersSchema 并随 PR #5237 当日合入;.describe() 当时刻意收窄为「仅承诺渲染入口」,因为按钮实测无 onClick。现状:objectui/packages/plugin-list/src/UserFilters.tsx(~:742)渲染的「新增 tab」按钮带 hover 态与 title,点击无任何反应,组件无 onAddTab 回调入参。作者写 allowAddTab: true 的意图显然是「用户能加 tab」,交付的是死按钮 —— 比没有按钮更糟(把「未实现」伪装成「点了没反应的 bug」)。

    可选方案:

    • A1 实现,会话级:接上回调,新 tab 为会话级(命名 + 当前筛选快照,组件态/会话存储),不落 sys_metadata —— 与 ADR-0047「end-user 筛选选择 session-scoped、从不落成元数据」一致。
    • A2 实现,写回元数据:新 tab 持久化进 sys_metadata。牵动权限面(谁可写视图元数据)并打破 ADR-0047 的作用域承诺,涉及面远超本单。
    • B 移除按钮 + 退役 spec 键:走 spec-property-retirement 全流程。

    两轴分析:

    建议:A1。落地要点:TabFilters 接 handleAddTab(命名输入 + 快照当前筛选为新 tab,会话级);describe 升级;objectui 侧修复须赶在终版 console pin bump 之前合并。若裁 B:spec 退役半边按跨车道协议转 spec 车道,objectui 半边本会话执行。

    关联:#5073(裁决 A)、PR #5237、ADR-0047、objectui UserFilters.tsx:742。已退出本轮派发队列,待裁决。


    Generated by Claude Code

  3. xuyushun441-sys commented on Aug 6, 2026

    @xuyushun441-sys
    CollaboratorAuthor

    维护者裁决(2026-08-06,经 PM 会话 session_01MN3ao9kJEtD7PNAKwFVp96 转达):A1 —— 实现,会话级。

    • TabFilters 接上新增 tab 回调:命名输入 + 快照当前筛选为新 tab,会话级(组件态/会话存储),⛔ 不落 sys_metadata —— 与 ADR-0047「end-user 筛选选择 session-scoped、从不落成元数据」一致。
    • spec 侧 UserFiltersSchema.allowAddTab 的 .describe() 同步从「仅承诺渲染入口」升回真实语义 —— 该半边触 packages/spec,按跨座位协议归 spec 车道;若与 objectui 半边拆单,objectui 半边可先行(渲染器不依赖 describe 文案)。
    • ⏰ target:v17 时间窗:objectui 侧修复须赶在终版 console pin bump 之前合入。

    摘 needs-user-decision,回 pm:queue,由 objectui 座位按正常批次派发。


    Generated by Claude Code

  4. self-assigned this
    on Aug 9, 2026
  5. yinlianghui commented on Aug 9, 2026

    @yinlianghui
    Contributor

    🔒 认领(objectui 分片 PM,session session_01GTRjn8xBqp75dk7kFupVRt,v17 批次)

    • 分支:claude/issue-os5236-addtab-session(objectui 仓)
    • 执行维护者裁决 A1(2026-08-06,评论 5200253516):TabFilters 接上新增 tab 回调 —— 命名输入 + 快照当前筛选为新 tab,会话级(组件态/会话存储),⛔ 不落 sys_metadata(ADR-0047)。
    • spec 侧 .describe() 升级半边归 spec 车道,objectui 半边先行(裁决已确认渲染器不依赖 describe 文案);验收时由 PM 向 spec 车道立联动单。
    • 文件面:packages/plugin-list/src/UserFilters.tsx + 测试。
    • ⏰ v17 时间窗:须赶在终版 console pin bump 之前合入。

    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