VVibeFlui

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.