Skip to content

Legacy string bulkActions have nothing to resolve against — the spec has no bulk action location #3002

Description

@os-zhuang

Follow-up to #2960 (fixed in #2996). Same {type: <name>} dead-end, different surface — and this one cannot be fixed the same way.

现状

ObjectGrid.dispatchBulkAction 派发字符串批量 action 的方式和修复前的行 action 完全一样:

// packages/plugin-grid/src/ObjectGrid.tsx (dispatchBulkAction)
const res = await executeAction({ type: action, params: { records: expanded } });

action 的名字落进 runner 的 type 槽位。#2996 之后这条路径不再弹绿 toast 了(executeActionSchema 现在会响亮失败),但 bulkActions: ['下推'] 依然不工作 —— 只是从"假装成功"变成了"诚实报错"。

为什么不能照搬 #2960 的修法

行 action 那边能修,是因为有东西可以解析:objectDef.actions 里 locations.includes('list_item') 的项就是行上下文的 def。批量这边没有对应物:

  1. spec 的 locations 枚举里没有 bulk 这一档 —— 只有 list_toolbar | list_item | record_header | record_more | record_related | record_section | global_nav。对象 action 无法声明"我是一个批量操作"。
  2. bulkActionDefs 从来不由 objectDef.actions 推导 —— app-shell ObjectView 只是把它从 view/list JSON 原样透传((viewDef).bulkActionDefs ?? (listSchema).bulkActionDefs)。对比之下 rowActionDefs 是按 list_item 过滤 objectDef.actions 推导出来的。

也就是说:今天想要一个能用的富批量 action,唯一途径是在 view JSON 里内联写 bulkActionDefs;对象级别声明一个批量 action 是表达不出来的。

需要先定的设计问题

这是跨仓库的(spec 在 framework),动手前得先有结论:

  • 是否给 spec 的 action locations 加一档(list_bulk?mass_action?),让对象 action 能声明自己作用于选中记录集?
  • 如果加了,bulkActionDefs 是否应像 rowActionDefs 一样从 objectDef.actions 按该 location 推导?
  • 单条 action 作用于 N 条记录的语义谁定 —— 服务端一次收全量 id,还是客户端 fan-out?现有的 BulkActionDialog(params → confirm → progress → result)已经有一套执行模型,新推导出来的 def 要接进去。
  • 老的 bulkActions: string[] 保留为按名字派发的兼容层(消费方可能用该名字注册过 runner handler),还是标记废弃?

可选的临时缓解

不动 spec 的前提下,可以让 bulkActions 里的名字去匹配 bulkActionDefs,至少把"同名重复项"这半个问题解掉——但这解决不了"对象级批量 action 无法声明"这个根本问题,可能不值得单独做。

现状不是回归

#2996 之前这条路径弹绿色成功 toast,之后弹红色错误。用名字注册过 runner handler 的消费方两边都正常(runner 的 handler 查找在前)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions