Features

Features overview

Everything asmit/resized-column adds to Filament tables — resizing, reordering, pinning, persistence, and customization.

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

FeatureHow to enablePersists
Drag to resizeHasResizableColumn trait (on by default)Session and/or database
Drag to reorder->dragReorderableColumns() on the tableSession and/or database
Dev-declared sticky columns->sticky() on a columnN/A (default pin set)
User-controlled pinning->stickableColumns() on the tableSession and/or database
Custom pin-manager trigger->stickyManagerTriggerAction() on the tableN/A (UI only)
Session storageDefault; disable per table with ->preserveColumnWidthsInSession(false)Browser session
Database storageResizedColumnPlugin::make()->preserveOnDB() or ->preserveColumnWidthsInDatabase()table_settings row per user
Standalone LivewireSame HasResizableColumn trait outside a panelSame 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.

Sticky columns cannot be dragged, and you cannot drop a column before a sticky one. Flat column tables only (no column groups yet).

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_settings migration; 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:

MethodPurpose
persistColumnWidthsToDatabase()Custom DB save
persistColumnWidthsToSession()Custom session save
loadColumnWidthsFromDatabase()Custom DB load
loadColumnWidthsFromSession()Custom session load
getUserId()Custom user key for storage

See Customization & troubleshooting.