Filters and sorts for Laravel index pages. Define each filter once: how it renders (with javaabu/stencil fields) and how it applies to the query. The filter state lives in the URL, and the filter bar, applied-filter chips and sort controls render in Blade (javaabu/forms) or Inertia React (@javaabu/forms).
class ArticleFilters extends Filters
{
protected ?string $model = Article::class;
protected ?string $default_sort = 'published_at';
protected string $default_direction = 'desc';
protected function filters(): array
{
return [
TextFilter::make('search')->columns(['title', 'author.name'])->thaana(),
SelectFilter::make('status')->options(ArticleStatuses::class)->multiple(),
SelectFilter::make('category_id')->relationship('category', 'name'),
DateRangeFilter::make('published_at'),
TrashedFilter::make(),
];
}
protected function sorts(): array
{
return [Sort::make('title'), Sort::make('published_at')->defaultDirection('desc')];
}
}$filters = ArticleFilters::make(); // reads the query string
$articles = $filters->apply(Article::query())->paginate()->withQueryString();{{ $filters }} {{-- the filter bar and chips --}}
<x-filters::heading :filters="$filters" sort="title" /> {{-- a sortable column --}}<FilterBar filters={filters} /> // Inertia::render('Articles/Index', ['filters' => $filters])
<SortableHeading filters={filters} sort="title" />The URL holds the state in the flat parameters javaabu/forms already uses (?search=ރާއްޖެ&status[]=draft&orderby=title&order=DESC), and values that aren't allowed are ignored.
You'll find the documentation on https://docs.javaabu.com/filters, and in the docs folder.
AI coding assistants can start from llms.txt. The package ships a Laravel Boost skill and guideline, which Boost finds by itself. See AI assistants.
composer test
pnpm testPlease see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING for details.
If you discover any security related issues, please email info@javaabu.com instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.