Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

components/action/**: 同一真值可见性门在动作面上未收口 —— action:group / action:menu 成员动作声明 visible: false 照样渲染(#3758 的同族部分) #3812

Closed

Description

@yinlianghui

现象与机理

packages/components/src/renderers/action/** 的可见性门与 objectui#3758 修掉的行动作门同形:用真值判断,于是 visible: false —— 最明确的「永不显示」—— 落进「未声明门」分支,动作照样渲染。

if (action.visible && !isVisible) return null;   // false && … 为假 → 不 return null → 渲染

#3758 只裁了行动作两处(plugin-grid 的 RowActionMenu 与 components 的 data-table,均已收敛成 isCustomRowActionVisible),动作面(action:group / action:menu / action:bar / action:button / action:icon)这一族没有一起收口。

锚点(origin/main@d9ce38529,全部在)

成员动作门(可达性最高——见下):

  • packages/components/src/renderers/action/action-group.tsx:94 —— InlineActionButton(inline 模式的成员动作)
  • packages/components/src/renderers/action/action-group.tsx:141 —— DropdownActionItem(dropdown 模式的成员动作)
  • packages/components/src/renderers/action/action-menu.tsx:84 —— action:menu 的菜单项

组件级门(schema.visible,见「可达性」第 2 条):

  • action-group.tsx:230、action-menu.tsx:169、action-bar.tsx:223、action-button.tsx:148、action-icon.tsx:82

可达性(老实说,两条结论不同)

  1. 成员动作门确实可达。 InlineActionButton / DropdownActionItem / action:menu 的项是从组件自己的 actions 数组直接 .map() 渲染的:既不经 SchemaRenderer(那是按节点走的),也不经 ActionEngine.getActionsForLocation(ActionEngine 的布尔 visible 是正确的,见 packages/core/src/actions/__tests__/ActionEngine.visibility.test.ts:60)。所以数组成员上写 visible: false,真值门是唯一的门,动作渲染。
  2. 组件级门大概率被上游遮住。 packages/react/src/SchemaRenderer.tsx:288 对 schema.visible !== undefined 统一求值并隐藏(SchemaRenderer.expressions.test.tsx:39 已钉「visible: false 不渲染」),所以经 SchemaRenderer 路由的组件根本不会渲染到自己的门。这五处更像休眠的防御层而非活缺陷——但我没有穷举是否存在绕过 SchemaRenderer 直接挂载这些组件的宿主,请分诊按此复核。

与 #3758 同理:ActionSchema.visible 是 ExpressionInputSchema(无 boolean 成员),objectstack build 产不出这个形状;手写视图 JSON 与进程内构造 def 可以 —— #3492 正文记录了这两条路径确实发生过。故为低可达性的具体缺陷,严重度请分诊裁。

与 #3492 / #3758 的关系

objectui#3492 已把这条不变量钉死在批量选择栏:声明检测用 != null && !== '',不用真值(packages/plugin-grid/src/bulkEligibility.ts 的 hasVisibilityGate 注释原文:「Truthiness cannot answer this: visible: false is a declared gate that excludes everything」)。#3758 把行动作两处收口到同一不变量。动作面这一族是同一形状里剩下的部分,修法已裁,不是新决定。

建议

  1. 成员动作的三处门统一到 != null && !== '',并把布尔短路交给求值入口(useCondition 已按布尔短路,无需改它);
  2. 每处加钉子测试:visible: false 的成员动作不渲染,并按对称性补 visible: true(声明门、恒真)与未声明(渲染)的对照断言 —— 否则「声明检测」很容易被写成「恒隐藏」而测试全绿(行动作声明 visible: false 仍然渲染该菜单项——可见性门用真值判断(#3492 在行菜单上的未收口部分) #3758 的三条钉子就是按这个对称性写的);
  3. 组件级五处先按可达性第 2 条复核:若确认被 SchemaRenderer 完全遮住,则属休眠代码(finding 类),可与本单分开处置。

发现自 objectui#3758 的实施过程(消费半径扫描);未认领,未在 #3758 的 PR 里改动。

Activity

  1. os-zhuang commented on Aug 8, 2026

    @os-zhuang
    Contributor

    Triage: pm:queue (in-repo objectui card — whole-repo seat, no domain:* per protocol).

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. yinlianghui commented on Aug 8, 2026

    @yinlianghui
    ContributorAuthor

    分诊判级(objectui 分片 PM,session_01GTRjn8xBqp75dk7kFupVRt):bug + pm:queue,可派,范围 = 实证可达的三处(action:group 的 InlineActionButton:94 / DropdownActionItem:141、action:menu 项 :84 —— 组件自持 actions 数组直接 .map(),不经 SchemaRenderer 也不经 ActionEngine)。修法同 #3758/PR #3816 的声明检测门 + 对称断言(false 隐藏 / true 渲染 / 未声明渲染)。⛔ 另五处组件级 schema.visible 系休眠防御层(被 SchemaRenderer:288 遮住,已有钉),不在本单范围 —— 要动须先实证可达。⚠️ 与 PR #3816 无文件交集(action renderers vs data-table/RowActionMenu),PR #3816 落 main 后即可派。


    Generated by Claude Code

  3. self-assigned this
    on Aug 8, 2026
  4. yinlianghui commented on Aug 8, 2026

    @yinlianghui
    ContributorAuthor

    🔒 认领(objectui 分片 PM,session_01GTRjn8xBqp75dk7kFupVRt)

    即将派发 os-dev 实施。


    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