Features overview
This package extends Filament tables with per-user column preferences: widths, order, and pinned columns. Add the HasResizableColumn trait once; opt into reordering and pinning per table.
At a glance
| Feature | How to enable | Persists |
|---|---|---|
| Drag to resize | HasResizableColumn trait (on by default) | Session and/or database |
| Drag to reorder | ->dragReorderableColumns() on the table | Session and/or database |
| Dev-declared sticky columns | ->sticky() on a column | N/A (default pin set) |
| User-controlled pinning | ->stickableColumns() on the table | Session and/or database |
| Custom pin-manager trigger | ->stickyManagerTriggerAction() on the table | N/A (UI only) |
| Session storage | Default; disable per table with ->preserveColumnWidthsInSession(false) | Browser session |
| Database storage | ResizedColumnPlugin::make()->preserveOnDB() or ->preserveColumnWidthsInDatabase() | table_settings row per user |
| Standalone Livewire | Same HasResizableColumn trait outside a panel | Same storage options |
Widths, column order, and pinned columns are stored together in one settings payload — no extra migration for pins.
Column resizing
Once HasResizableColumn is on your page, every column gets a drag handle on its right edge. Users drag to set width; values are saved per user and reapplied on the next visit.
See Resizing columns.
Column reordering
Chain ->dragReorderableColumns() on the table. A grip handle appears on each header (except pinned columns). Order is saved per user.
See Reordering columns.
Sticky (pinned) columns
Developer default — pin a column for everyone:
TextColumn::make('name')->sticky();
User-controlled — toolbar Pin columns dropdown (next to the column manager). Users draft changes, then click Apply (with Select all / Deselect all). Closing the panel without Apply keeps the draft for that page session. ->sticky() calls seed the initial selection.
return $table
->columns([...])
->stickableColumns();
Custom trigger — customize the toolbar button like Filament's column manager:
use Filament\Actions\Action;
return $table
->stickableColumns()
->stickyManagerTriggerAction(fn (Action $action) => $action
->label('Pin columns')
->tooltip('Choose pinned columns'));
Pinned columns use opaque backgrounds so scrolled cells do not bleed through, and resize handles are disabled on pinned headers.
See Sticky columns.
Storage
- Session (default) — no database required; per browser/device.
- Database (optional) —
table_settingsmigration; syncs across devices for the same user.
Configure globally via ResizedColumnPlugin, app-wide via ResizedColumnPlugin::standalone(), or per table with ->preserveColumnWidthsInDatabase() / ->preserveColumnWidthsInSession().
See Storage.
Filament panels and standalone Livewire
Works inside Filament panels (ResizedColumnPlugin::make()) and in any Livewire component that uses Filament tables (HasResizableColumn + optional ResizedColumnPlugin::standalone()).
See Standalone Livewire.
Customization hooks
Override persistence or user identification on your List page class:
| Method | Purpose |
|---|---|
persistColumnWidthsToDatabase() | Custom DB save |
persistColumnWidthsToSession() | Custom session save |
loadColumnWidthsFromDatabase() | Custom DB load |
loadColumnWidthsFromSession() | Custom session load |
getUserId() | Custom user key for storage |