You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(spec,showcase): aggregate bulk dispatch — allow _selectedIds through the param gate (#4461)
objectui 17.1 (objectui#3141) adds an aggregate single-call mode for
bulkActionDefs: an execution: 'aggregate' entry dispatches its named object
action ONCE for the whole selection, with every selected id injected as
params._selectedIds. This is the server-side contract half.
- ACTION_PARAM_BUILTIN_KEYS += '_selectedIds' so the ADR-0104 strict gate does
not 400 an aggregate dispatch against a param-declaring action —
dispatcher-injected, never authorable, pure widening (+ pin test)
- bulkActionDefs describe documents the aggregate contract: read
params._selectedIds (not recordId), all-or-nothing results, batchSize N/A,
maxRecords advised, ${ctx.selection.ids} toolbar interpolation
- content/docs/ui/views.mdx documents bulkActionDefs for authors for the first
time; references regenerated
- liveness view.json evidence now cites the dispatch path
- showcase: showcase_recalc_selection specimen next to the per-record
fixtures; recalc endpoint gains a _selectedIds batch branch; zh-CN
translations for both recalc surfaces
|**bulkActionDefs**|`Record<string, any>[]`| optional | Rich bulk action definitions (schema-driven, executed via BulkActionDialog). A `custom` def dispatches once per selected record by default; set `execution: 'aggregate'` (objectui#3139) to dispatch the named object action ONCE for the whole selection — the renderer injects `params._selectedIds: string[]` (read that on the server, not `recordId`) so a single call can produce one aggregate artifact (zip of QR codes, merged PDF, batch print). Aggregate results are all-or-nothing: a handler that cannot cover the whole selection must reject, and per-row retry is replaced by re-running the action. `batchSize` does not apply in aggregate mode; set `maxRecords` on defs whose server work is expensive. Toolbar url/api actions can also interpolate the current selection via `${ctx.selection.ids}` / `${ctx.selection.count}`.|
403
403
|**virtualScroll**|`boolean`| optional | Enable virtual scrolling for large datasets |
|**bulkActionDefs**|`Record<string, any>[]`| optional | Rich bulk action definitions (schema-driven, executed via BulkActionDialog). A `custom` def dispatches once per selected record by default; set `execution: 'aggregate'` (objectui#3139) to dispatch the named object action ONCE for the whole selection — the renderer injects `params._selectedIds: string[]` (read that on the server, not `recordId`) so a single call can produce one aggregate artifact (zip of QR codes, merged PDF, batch print). Aggregate results are all-or-nothing: a handler that cannot cover the whole selection must reject, and per-row retry is replaced by re-running the action. `batchSize` does not apply in aggregate mode; set `maxRecords` on defs whose server work is expensive. Toolbar url/api actions can also interpolate the current selection via `${ctx.selection.ids}` / `${ctx.selection.count}`.|
491
491
|**virtualScroll**|`boolean`| optional | Enable virtual scrolling for large datasets |
0 commit comments