Skip to content

plugin-grid: 被 visible 压掉的 primary 行动作白占一个 inline 槽位,把本该 inline 的下一个 primary 挤进溢出菜单 #3762

Description

@yinlianghui

顺带发现,非任何在飞 PR 的范围内(发现于 objectui#3562 / PR #3761 的实现过程中,那一单的裁定明确只管「触发器是否渲染」,不管「某一项渲染在哪里」,故未在该 PR 修)。

现象

packages/plugin-grid/src/components/RowActionMenu.tsx:inline 槽位的分配跑在声明序上,在任何 visible 谓词求值之前

const primaryDefs = gatedActionDefs.filter(d => d.variant === 'primary');
const inlineDefs = primaryDefs.slice(0, Math.max(0, maxInlineActions));
const menuDefs = [
  ...primaryDefs.slice(Math.max(0, maxInlineActions)),
  ...gatedActionDefs.filter(d => d.variant !== 'primary'),
];

于是当一行有 2 个以上 variant: 'primary' 动作、且排在前面的那个visible 对这一行不成立时:

  • 被压掉的 primary 仍然占住那个 inline 槽(RowActionInlineButton 对它 return null,槽位空转);
  • 后面那个通过了谓词的 primary 因为已经被 slice 到 menuDefs 里,只能渲染进「⋮」溢出菜单。

结果:这一行明明只有一个可见的 primarymaxInlineActions 也允许 1 个 inline,但用户看到的是「没有 inline 按钮 + 一个要点开才看得到主操作的 ⋮」。行的主 CTA 被藏进了溢出菜单。

期望

槽位应当分配给存活的 primaries:inlineDefs 取存活 primaries 的前 maxInlineActions 个,其余(含存活的溢出部分)落进菜单。

可达性(诚实说明,未在真实元数据上复现)

代码层面的不对称是确定的(上面的 slice 顺序)。触发它需要一条元数据:同一 list_item 位置上 2 个以上 variant: 'primary' 动作,且靠前那个带 visible

  • 「2 个 primary」这个形态确实存在且是既有测试的原始动因:RowActionMenu.test.tsx 的文件注释记录 cloud sys_environment 列表声明了两个 primary(Open + Upgrade Plan),maxInlineActions 默认 1 的行为就是为它加的。
  • 但我没有核实 Open 是否带 visible 谓词,所以「今天是否有用户真的撞到」未经证实。严重度请分诊裁定;只是按「发现即如实立单」处理,不自行判小。

与相邻单的关系

建议范围

packages/plugin-grid/src/components/RowActionMenu.tsx + 该包测试。若采纳,planRowActionMenu 已经在算存活 primaries(plan.inline),槽位改按存活分配是这个函数内部的一处调整,无新增求值成本。


Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions