Sticky (Pinned) Columns
Sticky columns stay frozen on the left while the rest of the table scrolls horizontally.
Dev-declared default
Mark a column sticky with ->sticky():
TextColumn::make('name')->sticky();
This column is pinned for everyone out of the box.
User-controlled pinning
Enable ->stickableColumns() on the table. A Pin columns dropdown appears in the toolbar (before the column-manager trigger).
- Checkboxes draft which columns are pinned.
- Select all / Deselect all shortcuts are included.
- Changes apply only when the user clicks Apply (the button is disabled when nothing changed).
- Closing the panel without Apply keeps the draft in memory for that page session.
public function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')->sticky(), // seeds initial selection
TextColumn::make('email'),
TextColumn::make('created_at'),
])
->dragReorderableColumns()
->stickableColumns();
}
Any ->sticky() calls seed the initial selection. Once a user applies their own choice, that selection is remembered.
Customize the trigger
Customize the toolbar button with ->stickyManagerTriggerAction(), mirroring Filament's columnManagerTriggerAction():
use Filament\Actions\Action;
public function table(Table $table): Table
{
return $table
->columns([...])
->stickableColumns()
->stickyManagerTriggerAction(fn (Action $action) => $action
->label('Pinned columns')
->icon('heroicon-o-map-pin')
->tooltip('Choose which columns stay visible'));
}
The default trigger is a small gray Filament button labeled Pin columns (translatable via resources/lang).
Behaviour notes
- Pinned columns are left-pin only in the current version.
- Pinned headers show a small pin indicator; resize handles are hidden on sticky columns.
- Sticky columns are excluded from drag-to-reorder; columns cannot be dropped before a sticky column.
- Header and body cells use opaque backgrounds so horizontally scrolled content does not show through.
Persistence
The user's pinned selection is persisted per user (session + database) alongside widths and order — no extra migration beyond the table_settings table.