DocsGuides

Guides

Column Ordering/DnD Guide

How to use and customize the column ordering and drag and drop features of Shadcn Table

Whether you just want to change the default column order in your table or let columns be reordered by dragging and dropping, Shadcn Table has a simple API for this.

Relevant Table Options

#
Prop Name
Type
Default Value
More Info Links
1booleanfalseST Column Ordering DnD Docs
2booleanST Column Ordering DnD Docs
3OnChangeFn<ColumnOrderState>TanStack Table Column Ordering Docs
4OnChangeFn<ST_Column<TData> | null>
5OnChangeFn<ST_Column<TData> | null>

Relevant Column Options

#
Column Option
Type
Default Value
More Info Links
1boolean
2boolean

Relevant State

#
State Option
Type
Default Value
More Info Links
1Array<string>[]TanStack Table Column Ordering Docs
2ST_Column | null
3ST_Column | null

Change the Default Column Order

By Default, Shadcn Table will order the columns in the order they are defined in the columns table option. And Display Columns such as Actions, Selection, Expansion, etc., get added to either the beginning or the end of the table. You can customize all of this by defining your own columnOrder state and passing it either to the initialState or state table options.

The columnOrder state is an array of string column ids, that come from the ids or accessorKeys that you defined in your column definitions.

If you are enabling features that generate built-in ST display columns such as enableRowSelection, enableRowNumbers, enableRowActions, etc., you should include those column ids in your columnOrder state at the index you want them to appear in the table. If you do not include them, ST should automatically insert them at either the beginning or the end of the table just fine, but it might not be in the order you want.

See the Display Columns Guide for more information on what "st-row-\*" column ids are available.

const table = useShadcnTable({
  data,
  columns,
  enableRowSelection: true,
  initialState: {
    columnOrder: [
      'name',
      'email',
      'phone',
      'city',
      'country',
      'st-row-select', //move the built-in selection column to the end of the table
    ],
  },
});

return <ShadcnTable table={table} />;

Note: If the number of columns and the length of the columnOrder state do not match, ST will automatically re-generate the columnOrder state internally.

Manage Column Order State

If you need easier access to the columnOrder state, you can store the column order in your own state management, and then pass it back into the ST state table option and sync back up internal mutations with the onColumnOrderChange callback.

You should also should initialize the columnOrder state yourself for the best results. Though, if you do not initialize the columnOrder state, as Shadcn Table will generate a default column order for you based on the order of the columns passed in the columns option, so you only need to properly initialize the column order state if there is a problem with the default order.

const columns = [
  //...
];

//easy shortcut to initialize the columnOrder state as array of column ids
const [columnOrder, setColumnOrder] = useState(
  ['st-row-select', ...columns.map((c) => c.accessorKey)], //array of column ids (Initializing is optional)
);

const table = useShadcnTable({
  data,
  columns,
  enableRowSelection: true,
  state: {
    columnOrder,
  },
  onColumnOrderChange: setColumnOrder,
});

return <ShadcnTable table={table} />;

Enable Column Ordering with Drag and Drop

Shadcn Table has a built-in drag and drop feature to reorder columns. This feature is enabled by passing the enableColumnOrdering table option.

The ability for a column to have a drag and drop handle can be specified by setting the enableColumnOrdering option on the column.

Loading example

View Extra Storybook Examples

On this page