BulkEditDrawer

Side-panel form for editing multiple selected records in batch. Opens a right-side shadcn <Sheet> containing the supplied form children. On submit, applies the touched-fields diff to every record in useListContext().selectedIds.

Installation

pnpm dlx shadcn@latest add @shadmin/bulk-edit-drawer

Usage

import {
  BulkEditDrawer,
  DataTable,
  List,
  NumberInput,
  SelectInput,
} from "@/components/admin";
 
const BulkEditCategories = () => (
  <BulkEditDrawer label="Bulk edit">
    <SelectInput source="category" choices={CATEGORY_CHOICES} />
    <NumberInput source="price" />
  </BulkEditDrawer>
);
 
export const ProductList = () => (
  <List>
    <DataTable bulkActionsButtons={<BulkEditCategories />}>
      {/* ... */}
    </DataTable>
  </List>
);

Props

PropRequiredTypeDefaultDescription
childrenRequiredReactNode-Form inputs rendered inside the sheet
labelOptionalReactNode"Edit selected"Trigger button label
titleOptionalReactNodelabelSheet header title
disabledOptionalbooleanfalseDisable trigger
sideOptional"right" | "bottom" | "left" | "top""right"Sheet side
onSuccessOptional(diff, ids) => void-Callback after useUpdateMany resolves

Touched-field semantics

BulkEditDrawer reads form.formState.dirtyFields and only writes those keys to useUpdateMany. Fields the user left untouched are preserved on each record. Empty submissions short-circuit without a server round-trip.