webbingbrasil/filament-advancedfilter
Installation
composer require webbingbrasil/filament-advancedfilter "^3.0"
Ensure your project uses Filament 3.x.
Register the Provider
Add the service provider to config/app.php under providers:
Webbingbrasil\FilamentAdvancedFilter\FilamentAdvancedFilterServiceProvider::class,
Publish Translations (Optional)
php artisan vendor:publish --tag="filament-advancedfilter-translations"
First Use Case Add a filter to a Filament resource or page:
use Webbingbrasil\FilamentAdvancedFilter\Filters\BooleanFilter;
public static function getFilters(): array
{
return [
BooleanFilter::make('is_active')
->label('Active Status'),
];
}
BooleanFilter, DateFilter, SelectFilter).Basic Filter Integration
Attach filters to a Filament resource or page via getFilters():
public static function getFilters(): array
{
return [
BooleanFilter::make('is_active')
->label('Active')
->nullsAreUnknown(),
];
}
Conditional Filter Logic
Use modifyQueryUsing to dynamically adjust queries:
BooleanFilter::make('is_active')
->modifyQueryUsing(fn (Builder $query, array $data) => $query->whereNotNull('is_active'))
Grouping Filters Organize filters into collapsible groups:
FiltersGroup::make()
->schema([
BooleanFilter::make('is_active'),
DateFilter::make('created_at'),
])
->collapsible()
Reusable Filter Configurations Create helper methods in a trait or service for consistent filter setups:
trait AdvancedFilters
{
protected static function activeStatusFilter(): BooleanFilter
{
return BooleanFilter::make('is_active')
->label('Active')
->nullsAreUnknown();
}
}
Integration with Filament Tables Combine with Filament’s built-in table filters for a seamless UX:
Table::make()
->columns([...])
->filters([
BooleanFilter::make('is_active'),
SelectFilter::make('status')->options(['draft', 'published']),
])
Iterative Filter Refinement
Start with basic filters (e.g., BooleanFilter) and gradually add complexity (e.g., DateRangeFilter, SelectFilter with dynamic options).
Testing Filters Test filters in isolation using Filament’s test utilities:
$this->getTable()->testFilters([
'is_active' => true,
]);
Performance Optimization
modifyQueryUsing to optimize database queries (e.g., avoid LIKE for large datasets).SelectFilter if the source is expensive to compute.Localization Publish translations and customize labels for non-English projects:
BooleanFilter::make('is_active')
->label(__('Status'))
->options([
true => __('Active'),
false => __('Inactive'),
]);
extends BooleanFilter) to add domain-specific behavior.Null Handling
BooleanFilter hides null values. Explicitly configure nullsAreUnknown(), nullsAreTrue(), or nullsAreFalse() to avoid unexpected behavior.null values are treated as false when they’re hidden.Query Performance
DateFilter or SelectFilter conditions (e.g., LIKE with wildcards) can slow down queries. Use modifyQueryUsing to optimize:
DateFilter::make('created_at')
->modifyQueryUsing(fn ($query, $data) => $query->whereDate('created_at', '>=', $data['start_date']))
Translation Conflicts
php artisan vendor:publish --tag="filament-advancedfilter-translations"
Filter Overrides
Livewire Caching
SelectFilter with database-driven options) may cause Livewire to cache stale data. Use ->options(fn () => ...) to refresh options on each request.Filter Not Applying
modifyQueryUsing callback or the filter’s generated SQL in Laravel’s query log (config/logging.php).UI Rendering Issues
php artisan filament:cache:clear
php artisan view:clear
Null Reference Errors
null values are handled explicitly in filters. Example:
BooleanFilter::make('is_active')
->nullsAreUnknown()
->showUnknowns();
Custom Filter Icons Use Filament’s icon system to improve UX:
BooleanFilter::make('is_active')
->label('Active')
->icon('heroicon-o-check-circle');
Default Filter Values Set defaults for frequently used filters:
BooleanFilter::make('is_active')
->default(true);
Dynamic Filter Options
Fetch options dynamically for SelectFilter:
SelectFilter::make('status')
->options(fn () => Status::query()->pluck('name', 'id'))
->searchable();
Filter Persistence
Use Filament’s persistFilters to save filter states across sessions:
Table::make()
->persistFilters()
->filters([...]);
Extending Filters Create custom filters by extending base classes:
class CustomBooleanFilter extends BooleanFilter
{
protected function setUp(): void
{
$this->label(__('Custom Status'));
$this->nullsAreUnknown();
}
}
Testing Filters Test filter logic with PHPUnit:
public function test_boolean_filter()
{
$this->getTable()->testFilters([
'is_active' => true,
]);
$this->assertDatabaseHas('models', ['is_active' => true]);
}
Performance Monitoring Use Laravel Debugbar or Query Profiler to monitor filter impact on query performance:
if (app()->environment('local')) {
\Barryvdh\Debugbar\LaravelDebugbar::info(['filters' => $this->getFilters()]);
}
How can I help you explore Laravel packages today?