fix(plugin-grid,components): 行动作的 visible 门按「已声明」判定,visible: false 不再渲染 (#3758) - #3816
Conversation
…渲染 (#3758) 自定义行动作的可见性**门**用真值判断,于是 `visible: false` —— 作者能写出的 最明确的「永不显示」—— 落进「未声明门」分支,动作对所有行渲染。两处门(收敛后 各一处 `isCustomRowActionVisible`)现按 `!= null && !== ''` 检测「是否声明了门」, 声明本身随后决定verdict:布尔在求值入口短路成自己的verdict,不交给 CEL 引擎。 这不是新决定。objectui#3492 已把同一条不变量钉在批量选择栏上, `bulkEligibility.ts` 的 `hasVisibilityGate` 注释写明真值判断答不了这个问题 (「`visible: false` is a declared gate that excludes everything」);内建 `visibleWhen` 的门一直是 `!= null`。本次只是把行动作这一族收口到同一处不变量。 两处门位: - `packages/plugin-grid/src/components/RowActionMenu.tsx` 的 `isCustomRowActionVisible` —— 同时管 overflow 菜单项、inline primary 按钮和 `planRowActionMenu` 的计数(即「⋮」触发器是否渲染,#3562 的守卫); - `packages/components/src/renderers/complex/data-table.tsx` 的同名函数 —— 同时管 data-table 的行菜单项与 `planDataTableRowMenu` 的计数。 派发单按 #3758 正文/分诊(锚 `b1204af`)描述为**三个**门位;PR #3761 (`1a33b1aba`)此后已把 plugin-grid 的 `:130`/`:219` 两处收敛成一处共享函数, 与 #3756 对 data-table 做的相同。缺陷与修法不变,门位数由 3 变 2。 行为变化面刻意窄:只有 `visible` 为字面布尔 `false`(或其它非空 falsy 值)的动作 变化 —— 从渲染变隐藏,即声明所要求的。`visible: true` 照旧渲染,`''` 与未声明 照旧不算门,表达式取值的 `visible` verdict 一律不变。`ActionSchema.visible` 是 `ExpressionInputSchema`(无 boolean 成员),`objectstack build` 产不出这个形状; 手写视图 JSON 与进程内构造 def 可以。 测试:三个观测面各一条 `visible: false` 钉子(plugin-grid overflow 项、inline 按钮、data-table 菜单项),外加守卫/plan 层三条与「⋮」DOM 两条;每条都配 `visible: true`(声明门、恒真)与 `''`/未声明(不算门)的对照断言 —— 否则 「声明检测」被写成「恒隐藏」时钉子仍会全绿。`predicate-surface-parity` 新增四条 非表达式形状的三面一致用例(此前其文件头注释把这条差异记为「still-open」)。 `RowActionMenu.emptyGuard.test.tsx` 里钉住旧真值行为的那条 fixture 整条替换: 它的期望值(`['ghost']` / `1`)现在是错的verdict,不是拼写问题。 Co-authored-by: Claude <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
|
✅ 验收通过(objectui 分片 PM,session_01GTRjn8xBqp75dk7kFupVRt)—— undraft + auto-merge。 门位地理更正采纳:派发锚( 门语义:声明检测( 残留不对称( Generated by Claude Code |
Fixes #3758
修了什么
自定义行动作的可见性门用真值判断,于是
visible: false—— 作者能写出的最明确的「永不显示」—— 落进「未声明门」分支,动作对所有行渲染。门判定改为按「是否声明了门」检测(!= null && !== ''),声明本身随后决定 verdict:布尔在求值入口短路成自己的 verdict,不交给 CEL 引擎。门位:三个变两个(核验读数与派发单不一致,已核实)
派发单与 #3758 正文/分诊(锚
b1204af)列了三个门位。按 rule 6 在origin/main@d9ce38529上核验时发现:PR #3761(1a33b1aba,「gate the row '...' trigger on renderable items」)此后已把 plugin-grid 的RowActionMenu.tsx:130(overflow 项)与:219(inline 按钮)收敛成一处共享函数isCustomRowActionVisible—— 与 #3756 对 data-table 做的相同。缺陷与修法不变,门位数由 3 变 2;
:130/:219两个渲染面现在读同一处门,所以改一处即同时覆盖两个面,并且天然不可能只修一半。packages/plugin-grid/src/components/RowActionMenu.tsxisCustomRowActionVisibleif (!def?.visible) return true;const pred = def?.visible;然后if (pred == null || pred === '') return true;planRowActionMenu的计数(即「⋮」触发器是否渲染,#3562 的守卫)packages/components/src/renderers/complex/data-table.tsxisCustomRowActionVisibleif (!action?.visible) return true;const pred = action?.visible;然后if (pred == null || pred === '') return true;planDataTableRowMenu的计数evalRowActionVisibility未改(布尔短路早已在里面)。其中pred === ''一支改后仍不是死代码:isBuiltinRowActionVisible的门只有!= null,''仍从那条路到达 —— 已加注释写明,免得后来的读者当死支删掉。不变量依据(#3492,已裁不重开)
packages/plugin-grid/src/bulkEligibility.ts的hasVisibilityGate注释原文,objectui#3492 落地时写的:行动作这两处是同一形状里没有一起收口的部分;内建
visibleWhen的门一直是!= null。本 PR 只是把行动作收口到同一处不变量,不是新决定。行为变化面(刻意窄)
只有
visible为字面布尔false(或其它非空 falsy 值)的行动作变化 —— 从渲染变隐藏,即声明所要求的。visible: true照旧渲染,''与未声明照旧不算门,表达式取值的visibleverdict 一律不变。ActionSchema.visible是ExpressionInputSchema(无 boolean 成员),objectstack build产不出这个形状;手写视图 JSON 与进程内构造 def 可以 —— #3492 正文记录这两条路径确实发生过。故可达性低。反向验证(方向先判后跑)
预判:6 条
visible: false断言在未改的门上必须红;所有visible: true/''/ 未声明的对称断言必须绿(它们不是方向钉,而是防止把「声明检测」写成「恒隐藏」的护栏 —— 那样重写能让每一条visible: false断言独自通过)。先在
origin/main的门上跑新钉子(即「还原门」),实测与预判逐条一致:改后同一批:
Test Files 10 passed (10) / Tests 125 passed (125)。另有一条测得的前置读数(临时探针,已删):
visible: false在改前三面分别是 行菜单true(渲染,缺陷)、选择栏false、记录页头false—— 即行菜单是唯一读错的那一面,改后三面一致。测试
visible: false钉子:plugin-grid overflow 项、inline primary 按钮、data-table 菜单项;planRowActionMenu/planDataTableRowMenu计数归零)+「⋮」DOM 两条;visible: true(声明门、恒真)与''/ 未声明(不算门)的对照断言;predicate-surface-parity.test.tsx:新增四条非表达式形状的三面一致用例。该文件头注释此前把这条差异记为「still-open divergence —— the kebab renders avisible: falsedef」,现已成立并改写。Fixture 处置:
RowActionMenu.emptyGuard.test.tsx里钉住旧真值行为的那条 fixture(preserves the visible: false truthy gate verbatim)整条替换,不是重拼 —— 它的期望值(['ghost']/1)现在是错的 verdict。原注释说明当时为何刻意保留,替换处留注写明 #3758 把它另裁了。命令与输出
消费半径按规则的调用方枚举,不按被改包:两处门的调用方(两处 plan 函数、四个 item/按钮组件、
predicate-surface-parity)全部定向跑过;plugin-detail的RelatedList把子对象list_item动作喂给 data-table,故一并跑。全仓扫过 row-action 的布尔visiblefixture,除已处置的两处外无他。Changeset
.changeset/row-action-declared-visible-gate-3758.md——@object-ui/plugin-grid+@object-ui/components均patch(行为修复;按仓规不声明major)。范围外发现(未在本 PR 改动)
action:group/action:menu成员动作声明visible: false照样渲染(#3758 的同族部分) #3812 ——packages/components/src/renderers/action/**有 8 处同形真值门。其中action:group的 inline/dropdown 成员动作与action:menu的项确实可达(直接从组件自己的actions数组.map()渲染,既不经SchemaRenderer也不经ActionEngine);另五处组件级schema.visible大概率被SchemaRenderer.tsx:288的统一处理遮住。已带锚点与可达性分析单独立单交分诊定级。Generated by Claude Code