Bulk Actions
Bulk actions run against selected rows.
Use bulk actions for operations such as deleting selected rows, exporting selected rows, assigning selected users to a role, or changing selected statuses.
Schema example
TS
export const usersSchema = {
resource: "users",
table: {
rowSelection: {
enabled: true,
mode: "multiple"
},
columns: ["name", "email", "status"]
},
actions: {
bulk: [
{
key: "bulk-archive",
label: "Archive selected",
variant: "secondary",
handler: "users.bulkArchive",
refreshOnSuccess: true
},
{
key: "bulk-delete",
label: "Delete selected",
variant: "danger",
handler: "users.bulkDelete",
refreshOnSuccess: true
}
]
},
registry: {
actionHandlers: ["users.bulkArchive", "users.bulkDelete"]
}
} as const;Runtime registry
TS
import { createRegistry } from "@vibeflui/core";
export const registry = createRegistry({
actionHandlers: {
"users.bulkArchive": async ({ values }) => {
const ids = Array.isArray(values?.selectedIds) ? values.selectedIds : [];
return {
status: true,
code: 200,
message: `${ids.length} users archived`
};
},
"users.bulkDelete": async ({ values }) => {
const ids = Array.isArray(values?.selectedIds) ? values.selectedIds : [];
return {
status: true,
code: 200,
message: `${ids.length} users deleted`
};
}
}
});Selection requirement
Bulk actions should normally be paired with table.rowSelection.
TS
table: {
rowSelection: true
}or:
TS
table: {
rowSelection: {
enabled: true,
mode: "multiple"
}
}Backend responsibility
The backend must verify that the current user can mutate every selected item. Never trust selected IDs from the frontend.
For destructive bulk operations, keep the label explicit and return a clear warning or error response when the backend blocks the operation.