leek/filament-header-filters
Add inline filters to Filament table column headers. Attach any BaseFilter (selects, date pickers, min/max ranges, custom schemas) as a richer alternative to individual searchable fields. Works with Filament v4/v5, PHP 8.2+.
Header-filter registration was gated by a once-per-request boolean flag, and the filters were pushed onto the table imperatively. When a consumer calls resetTable() — e.g. a page that re-renders the table after an external page filter or action changes — bootedInteractsWithTable() rebuilds the table from scratch and drops those pushed filters. The flag stayed true, so they never re-registered.
The result was a confusing bug: a header filter showed as selected but stopped actually filtering the table.
Registration is now tracked per Table instance via a WeakMap in HeaderFilterRegistry, rather than a component-level boolean. A rebuilt table is a new instance, so registration runs again and the filters are re-applied — while staying idempotent within a single render.
If you added a resetTable() workaround in your own page to force re-registration, you can drop it after upgrading.
Previously, selecting 2+ options in a multi-select header filter stacked a full-width badge per selection, wrapping each long label character-by-character and blowing up the row height.
The filter now collapses to a single line:
min-width: 16rem) when a multi-select carries a selection,+N overflow count.CSS-only — no API or behavior changes. Pull options still toggle individual selections from the dropdown.
hasHeaderFilters() is only called when the method or macro is actually registered, preventing errors on tables that don't use header filters (thanks @luca-alsina, #3).max-content.vendor/leek/filament-header-filters/resources/css/filament-header-filters.css.resources/dist stylesheet and package-local Vite build files.Add the package stylesheet to your Filament panel theme after the Filament theme import, then rebuild your app assets with npm run build.
Vite-built CSS sources (package.json, vite.config.js, resources/css, resources/js), refreshed dist CSS, art update, .gitignore for /.claude, minor pint cleanup of the trait. No API changes.
First stable release.
->headerFilter(BaseFilter $filter) on any table column. Accepts SelectFilter, Filter, and any BaseFilter subclass.tableFilters). Indicators, reset, and session persistence work.deferFilters().composer require leek/filament-header-filters
Add the HasHeaderFilters trait to any Livewire component using InteractsWithTable:
use Leek\FilamentHeaderFilters\Concerns\HasHeaderFilters;
class ListOrders extends ListRecords
{
use HasHeaderFilters;
}
See README for dropdown, min/max, and date range examples.
Free port of filamentphp/filament#19432.
How can I help you explore Laravel packages today?