Bulk actions / multi-select
Checkboxes on rows plus a toolbar that appears once you pick some, so one click applies an action to fifty things instead of one.
See it
What it is
The pattern has four parts that always travel together: a checkbox on each row, a select-all checkbox in the header (with the half-filled indeterminate state when only some rows are picked), shift-click to take a range, and a contextual action bar that appears once anything is selected and says how many. Gmail, Linear, and every file manager since the Finder run the same shape.
Reach for it the moment a user would otherwise repeat the same click down a list: archiving, tagging, assigning, moving, deleting. The bar should carry the count ('12 selected'), the two or three actions that make sense for the current mix of rows, and an obvious Clear. Escape clears the selection; the count is the thing people re-read before pulling a trigger.
Biggest trap: select-all almost always means 'all rows on this page', and users read it as 'all 12,430 rows matching my filter'. Gmail's fix is the canonical one: after the header checkbox, offer an explicit 'Select all 12,430 conversations that match this search' link so the wider intent is opt-in. Second trap: bulk operations fail partially, so plan for '41 of 50 moved, 9 failed' with a way to retry just the failures. Third: undo beats a confirm dialog only when you can actually put every affected record back. If the operation is irreversible or the blast radius is large, confirm first and name the scope, because a toast that expires is not a safety net for 400 permanently deleted invoices.
Ask AI for it
Add bulk actions to this data table. Give every row a checkbox, put an indeterminate-capable select-all checkbox in the header that covers only the current page, and support shift-click to select a contiguous range. When one or more rows are selected, slide in a sticky action bar showing 'N selected', the allowed actions for the selection, and a Clear button; Escape also clears. If a filter is active, offer a secondary 'Select all N matching rows' link so the wider scope is explicit. For bulk actions you can genuinely reverse, run them immediately with a 10-second undo toast that restores every affected record. For anything irreversible or high impact, show a confirmation that names the scope and the consequence ('Permanently delete 412 invoices') rather than relying on undo. On partial failure show '41 of 50 updated' with a Retry failed option that retries only the rows that failed. Keep checkboxes keyboard reachable and labelled with the row name.