问题
批量编辑对话框的参数控件形态与写入 patch 完全不参照目标对象 schema ,单/多值语义只取决于 BulkActionParam.multiple 这个手写标志:
packages/plugin-grid/src/components/BulkActionDialog.tsx:475-497(select)与 :498-525(lookup):param.multiple ? <MultiSelectControl/> : <Select/>——只看 param 声明,不看 grid 已持有的对象 schema 里目标字段是否为多值(multiselect/tags/checkboxes/lookup multiple)。
packages/plugin-grid/src/hooks/useBulkExecutor.ts:136-139:
const buildPatch = ( ) : Record < string , unknown > => ( { ...( def . patch ?? { } ) , ...params } ) ;
参数值原样进 patch,没有任何 schema 对照/归一化。
后果 :视图作者给多值字段定义批量参数时漏写 multiple: true(极易发生,#2185 的 showcase 早期版本就踩过),UI 渲染成单选、patch 写出标量。在 framework objectstack-ai/objectstack#2552 落地之前,标量会被服务端原样落库,静默写坏整列多值数据 (实测 PATCH {"labels":"frontend"} 返回 200 并按标量存储);#2552 之后服务端会兜底包装成单元素数组,但 UI 仍然把多值字段呈现为"只能选一个",语义错误依旧。
建议修复
BulkActionDialog 拿到 grid 的对象 schema 后,对 operation: 'update' 的参数按 param.name 对应的目标字段推导 multiple(param 显式声明优先,未声明时回退 schema:multiselect/checkboxes/tags/select|lookup + multiple → 多值)。
buildPatch 在合并 params 时按 schema 做形状归一化:目标字段为多值而值是标量 → 包装数组(与服务端 fix(spec-bridge/form): stop dropping spec FormViewSchema keys; normalize legacy groups → sections (#2545) #2552 行为一致,双保险)。
问题
批量编辑对话框的参数控件形态与写入 patch 完全不参照目标对象 schema,单/多值语义只取决于
BulkActionParam.multiple这个手写标志:packages/plugin-grid/src/components/BulkActionDialog.tsx:475-497(select)与:498-525(lookup):param.multiple ? <MultiSelectControl/> : <Select/>——只看 param 声明,不看 grid 已持有的对象 schema 里目标字段是否为多值(multiselect/tags/checkboxes/lookup multiple)。packages/plugin-grid/src/hooks/useBulkExecutor.ts:136-139:后果:视图作者给多值字段定义批量参数时漏写
multiple: true(极易发生,#2185 的 showcase 早期版本就踩过),UI 渲染成单选、patch 写出标量。在 framework objectstack-ai/objectstack#2552 落地之前,标量会被服务端原样落库,静默写坏整列多值数据(实测 PATCH{"labels":"frontend"}返回 200 并按标量存储);#2552 之后服务端会兜底包装成单元素数组,但 UI 仍然把多值字段呈现为"只能选一个",语义错误依旧。建议修复
operation: 'update'的参数按param.name对应的目标字段推导multiple(param 显式声明优先,未声明时回退 schema:multiselect/checkboxes/tags/select|lookup + multiple→ 多值)。buildPatch在合并 params 时按 schema 做形状归一化:目标字段为多值而值是标量 → 包装数组(与服务端 fix(spec-bridge/form): stop dropping spec FormViewSchema keys; normalize legacy groups → sections (#2545) #2552 行为一致,双保险)。