Skip to content

page:card.visible 是页面该改、不是 schema 该补:showcase 两处改写为 ADR-0089 组件级 visibleWhen(#5775 拆出) #6274

Description

@qq9340100

#5775 拆出。维护者 2026-08-06 裁决评论明写:「page:card.visible 属页面改写(正统 visibleWhen,ADR-0089),可顺带或拆小单」。#5775 的实施 PR 选择拆单,理由记在下面。

事实(对 origin/main + objectui HEAD 7dfbeb7 实测)

page:card.visible 是把组件级可见性谓词写进了 properties,靠 SchemaRenderer 的 hoist 生效(packages/react/src/SchemaRenderer.tsxschema.visible)。ADR-0089 的正统拼法是组件级 visibleWhen —— visible 连别名表都不在。所以这是页面写错了位置,不是 PageCardProps 少一个键:给它补声明会把一个第三方拼法固化成契约(Prime Directive #12),正是 #5775displayField 上刚拆掉的形状。

站点(2 处,同一文件):

文件 现状
examples/app-showcase/src/ui/pages/my-work.page.ts properties.visible on the "Leadership View" page:card visible: "user.email == 'admin@objectos.ai'"

(#5068 的 warning 清单里 page:card.visible 记为 1 条 component-props-unknown-key。)

为什么 #5775 没有顺带做

不是工作量,是一处语义待确认,做错了会静默改变 showcase 的渲染:

  • 页面现在写的绑定名是 user.email(该行的注释说「the renderer now feeds user into the expression context」);
  • 而 ADR-0089 visibleWhen 声明绑定的是 record / current_user / page.<var>,没有 user

所以机械改写 visiblevisibleWhen 会得到一个恒假谓词 —— 卡片直接消失,且没有任何诊断。正确的改写多半是 visibleWhen: "current_user.email == 'admin@objectos.ai'",但这需要一次浏览器实测(以 admin 与非 admin 两个身份各看一次)来确认绑定名,而不是靠读 ADR 推断。#5775 是 spec 车道的退役单,把一个需要 dogfood 半径的页面语义改写夹带进去会让那个 PR 的验收面失焦。

验收

  1. 确认 visibleWhen 环境里管理员身份的实际绑定名(current_user 还是 user);若 objectui 侧两者都不通,先在 objectui 提对应单。
  2. 改写 my-work.page.ts 的 2 处 page:card(其中 1 处带 visible),properties.visible组件级 visibleWhen(注意是组件节点的兄弟键,不是 properties 里的键)。
  3. pnpm --filter @objectstack/example-showcase typecheck + 该 example 的测试。
  4. .claude/skills/dogfood-verification 以 admin / 非 admin 两个身份各看一次 My Work 页,确认卡片该显示时显示、该隐藏时隐藏。
  5. 复跑 SDUI 组件 props 没有解析闸门:PageComponent.properties 是开放 record,ComponentPropsMap 的 29 个站点从不被 parse(#4001 批 17 的 no gate 判定) #5068 闸门,确认 page:card.visible 这条从 component-props-unknown-key 清单里消失。

关系

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions