Skip to content

Table behavior

Table capabilities are server-described. React only exposes controls that the Table definition permits, and Laravel validates requested state before executing it.

Enable search per Column:

TextColumn::make('name', 'Name')->searchable();
TextColumn::make('email', 'Email')->searchable();

Or make all Columns searchable by default:

UsersTable::make('users')->searchableColumns();

Global search is bounded to searchable Columns. For custom storage, use a Column’s searchUsing() and declare its supported source kinds. Incoming search is normalized and applied after filters but before sorting. Search input may contain at most 500 Unicode code points.

Sorting is enabled for the Table by default, but a Column must be sortable:

TextColumn::make('name', 'Name')->sortable();

Configure Table-level behavior:

UsersTable::make('users')
->sorting()
->multiSort()
->initialSort('name');

For multiple initial rules, pass an array in the canonical order expected by your application. Disable the feature with sorting(false) or multiple sorting with multiSort(false).

Choose one ordering owner for a Table:

  • Source-owned order: keep an intentional query order such as User::query()->latest() and use sorting(false). InertiaX preserves that base order.
  • Table-owned order: return an unordered base query, mark Columns sortable, and use initialSort() when an initial order is required.

Avoid combining a base-query order with interactive Table sorting. InertiaX qualifies the physical columns it orders (including the row-key tie-breaker) for joined queries, but it does not clear, inspect, warn about, or reinterpret application-owned ordering.

Pagination defaults to 10 rows with [10, 25, 50, 100] as available page sizes:

UsersTable::make('users')
->pageSize(25)
->pageSizeOptions([10, 25, 50]);

Use pagination(false) only for a bounded result that should be sent and shown in full. Eloquent pagination happens in the database; Collection pagination slices the processed in-memory result.

Selection is disabled by default:

use InertiaX\Components\Table\Enums\SelectionMode;
UsersTable::make('users')
->selection()
->selectionMode(SelectionMode::Multiple);

The exact backed values are also accepted at this fluent boundary, so selectionMode('single') is equivalent to selectionMode(SelectionMode::Single). Invalid strings fail immediately. Protected class defaults remain enum-typed.

Use SelectionMode::Single when only one row may be selected. Selection is client state exposed through the Table controller and events; it does not execute a domain action by itself.

Stable row identity is required for selection.

Opt individual Columns into user-controlled visibility or copying:

TextColumn::make('email', 'Email')->toggleable()->copyable();

Use visible(false) for a Column that starts hidden but can be revealed when it is also toggleable. Table-wide toggleableColumns(), visibleColumns(), and copyableColumns() set defaults for every Column.

The built-in refresh button is enabled by default. Hide it with:

UsersTable::make('users')->refreshButton(false)

Refresh keeps the current Table state and asks the integration for fresh rows.

Capability Default
Sorting engine enabled
Multi-sort enabled
Individual sortable Columns disabled
Pagination enabled, 10 rows
Selection disabled
Auto filters enabled for filterable Columns
Advanced filter mode disabled
Refresh button enabled
Searchable/copyable/toggleable Columns disabled

Make capabilities explicit on reusable Table classes when the defaults are part of your application’s user experience.