Resized Column
This plugin allows you to resize columns in Filament tables, enhancing the user experience by providing a more flexible and customizable interface.
Author:
Asmit Nepali
Documentation
- Features
- Installation
- Registering the Plugin
- Publishing filament assets
- Publishing Migrations
- Usage
- Storage Configuration
- Configuration Options
- Example: Custom Database Storage
- Using Outside the Filament Panel
- Troubleshooting
- Credits
- Contributing
The Resizable Columns plugin allows you to resize table columns in Filament with persistent width settings. This package provides a seamless way to customize table layouts by letting users adjust column widths according to their preferences.

#Features
- Drag-to-resize column functionality
- Persistent column width settings
- Per-user width preferences
- Session and database storage options
- Works inside Filament panels and in standalone Livewire components
- Easy integration with existing Filament tables
- Customizable storage mechanisms
#Installation
You can install the package via composer:
composer require asmit/resized-column
#Registering the Plugin
Add the plugin to your Filament panel configuration in app/Providers/Filament/AdminPanelProvider.php:
use Asmit\ResizedColumn\ResizedColumnPlugin;
public function panel(Panel $panel): Panel
{
return $panel
// ... other configuration
->plugins([
// ... other plugins
ResizedColumnPlugin::make()
->preserveOnDB() // Enable database storage (optional)
]);
}
#Publishing filament assets
php artisan filament:assets
#Publishing Migrations
# Publish migrations
php artisan vendor:publish --provider="Asmit\ResizedColumn\ResizedColumnServiceProvider" --tag=resized-column-migrations
# Run migrations
php artisan migrate
#Usage
To use the Resized Column functionality, simply include the HasResizableColumn trait in your Filament List Page or your custom page class. This will automatically enable the resizable column feature for all tables in that resource.
use Asmit\ResizedColumn\HasResizableColumn;
class ListUsers extends ListRecords
{
use HasResizableColumn;
protected static string $resource = UserResource::class;
// Your existing table definition...
}
#Storage Configuration
The package provides two storage mechanisms:
-
Session Storage (Enabled by default)
- Stores column widths in the user's session
- No database required
- Storage is browser/device specific
-
Database Storage (Optional)
- Stores column widths in the database
- Requires migration to create the
table_settingstable - Works across browsers/devices for the same user
You can enable or disable database storage in your panel configuration:
ResizedColumnPlugin::make()
->preserveOnDB(true) // Enable database storage
#Configuration Options
You can override any of the following methods in your class to customize behavior:
| Method | Description |
|---|---|
persistColumnWidthsToDatabase() |
Customize how column widths are saved to database |
persistColumnWidthsToSession() |
Customize how column widths are saved to session |
loadColumnWidthsFromDatabase() |
Customize how column widths are loaded from database |
loadColumnWidthsFromSession() |
Customize how column widths are loaded from session |
getUserId() |
Customize how user identification is handled |
#Example: Custom Database Storage
use Asmit\ResizedColumn\HasResizableColumn;
class ListUsers extends ListRecords
{
use HasResizableColumn;
protected function persistColumnWidthsToDatabase(): void
{
// Your custom database save logic here
YourCustomModel::updateOrCreate(
[
'user_id' => $this->getUserId(),
'resource' => $this->getResourceModelFullPath(), // e.g., 'App\Models\User'
],
['settings' => $this->columnWidths]
);
}
}
#Using Outside the Filament Panel
Filament tables can be used in any Livewire component without a panel. This package fully supports that use case. Add the HasResizableColumn trait to your Livewire component just as you would inside a panel.
use Asmit\ResizedColumn\HasResizableColumn;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Tables\Concerns\InteractsWithTable;
use Filament\Tables\Contracts\HasTable;
use Filament\Tables\Table;
use Livewire\Component;
class UsersTable extends Component implements HasForms, HasTable
{
use InteractsWithForms;
use InteractsWithTable;
use HasResizableColumn;
public function table(Table $table): Table
{
return $table
->query(User::query())
->columns([
TextColumn::make('name'),
TextColumn::make('email'),
]);
}
public function render(): View
{
return view('livewire.users-table');
}
}
#Enabling Database Storage Outside the Panel
Since there is no AdminPanelProvider to register the plugin, the package provides two alternative ways to enable database storage.
#Option A — App-wide via AppServiceProvider (recommended for global config)
Call ResizedColumnPlugin::standalone() once in AppServiceProvider::boot(). This stores a shared config instance for the entire request that all HasResizableColumn components will pick up automatically.
// app/Providers/AppServiceProvider.php
use Asmit\ResizedColumn\ResizedColumnPlugin;
public function boot(): void
{
ResizedColumnPlugin::standalone()
->preserveOnDB();
// Optionally disable session storage app-wide:
// ResizedColumnPlugin::standalone()->preserveOnDB()->preserveOnSession(false);
}
#Option B — Per table via Table macro (recommended for granular control)
Chain ->preserveColumnWidthsInDatabase() at the end of your table() method. This only affects that specific table and overrides any global config.
⚠️ Always call this as the last method in the chain, after
->columns(),->filters(),->actions(), and all other table configuration. This ensures the Livewire component reference is fully resolved when the macro runs.
public function table(Table $table): Table
{
return $table
->query(User::query())
->columns([
TextColumn::make('name'),
TextColumn::make('email'),
])
->filters([...])
->actions([...])
->preserveColumnWidthsInDatabase(); // ← always last
}
You can combine both macros to fully control storage per table:
->preserveColumnWidthsInDatabase() // save to DB
->preserveColumnWidthsInSession(false) // disable session for this table
#Configuration Priority
When the package decides whether to save column widths to the database, it checks configuration in the following order. The first match wins.
| Priority | Method | Scope |
|---|---|---|
| 1 — Highest | ->preserveColumnWidthsInDatabase() table macro |
Single table only |
| 2 | ResizedColumnPlugin::standalone() in AppServiceProvider |
All components, no panel required |
| 3 — Lowest | ResizedColumnPlugin::make() in panel provider |
Inside a Filament panel |
This means a table macro will always win over the global standalone config, which will always win over the panel plugin config.
#Troubleshooting
#CSS Styles Not Loading
If the resize handles are not displaying correctly:
-
Make sure you have published the Filament assets:
php artisan filament:assets -
Clear your browser cache or try a hard refresh (Ctrl+F5)
#Credits
#Security
If you discover a security vulnerability within this package, please send an e-mail to asmitnepali99@gmail.com. All security vulnerabilities will be promptly addressed.
#Contributing
Please see CONTRIBUTING for details.
#📄 License
The MIT License (MIT). Please see License File for more information.
The author
From the same author
Advanced Kanban
A premium Filament plugin providing production-ready, highly customizable Kanban boards with drag & drop functionality, workflow transitions, advanced filtering, and real-time search capabilities.
Author:
Asmit Nepali
Upload
The Advanced PDF Upload plugin allows you to upload PDF files with preview functionality along with Filament's default file upload features. This package provides a seamless way to handle PDF uploads with customizable preview options.
Author:
Asmit Nepali
Mention
The Mention plugin lets you mention users inside RichText editor, supporting both static and dynamic searches. It can extract user details like username and ID for a seamless mention experience.
Author:
Asmit Nepali
Featured Plugins
A selection of plugins curated by the Filament team
Custom Dashboards
Let your users build and share their own dashboards with a drag-and-drop interface. Define your data sources in PHP and let them do the rest.
Filament
Data Lens
Advanced Data Visualization for Laravel Filament - a premium reporting solution enabling custom column creation, sophisticated filtering, and enterprise-grade data insights within admin panels.
Padmission
Advanced Tables (formerly Filter Sets)
Supercharge your tables with powerful features like user-customizable views, quick filters, multi-column sorting, advanced table searching, convenient view management, and more. Compatible with Resource Panel Tables, Relation Managers, Table Widgets, and Table Builder!
Kenneth Sese