cooper/filament-dcat-filters

Bring Dcat Admin's powerful filter features to Filament - including Scope filters, Range filters, SelectTable, and more quick filters

Maintainers

Package info

github.com/myxiaoao/filament-dcat-filters

pkg:composer/cooper/filament-dcat-filters

Fund package maintenance!

myxiaoao

Statistics

Installs: 23

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 1

v1.3.0 2026-03-17 06:47 UTC

README

Filament Dcat Filters

Bring Dcat Admin's powerful filter features to Filament

Built with PHP 8.3+ for Laravel 12 and Filament v4/v5

Latest Version on Packagist Total Downloads run-tests License PHP Laravel Filament

Filament Dcat Filters Screenshot

A modern collection of enhanced filters inspired by Dcat Admin, combining intuitive UI components with powerful filtering capabilities for Filament admin panels.

English Documentation | δΈ­ζ–‡ζ–‡ζ‘£

Features

Core Filters

  • 🎯 Scope Filter - Tab-style quick filters for common queries
  • πŸ“Š Range Filter - Simplified date/number range filtering (3 lines of code!)
  • πŸ“… Date Component Filter - Filter by year, month, or day separately
  • πŸ” SelectTable Filter - Modal table selector with search and pagination
  • 🎭 Modal Select Filter - Dcat Admin style modal with full table display
  • πŸ”’ Between Filter - Numeric range filtering shortcut
  • πŸ™ˆ Hidden Filter - URL parameter-based filtering without UI

Quick Filters

  • ⚑ LIKE Filter - Text search with wildcard control (supports NOT LIKE)
  • πŸ“‹ IN Filter - Multiple value selection (supports NOT IN)
  • πŸ”’ Comparison Filter - Comparison operators (>, <, >=, <=, =, !=)
  • βœ… Boolean Filter - True/false/all toggle for boolean fields
  • πŸ”˜ Null Filter - NULL/NOT NULL value filtering
  • πŸ“ Enum Filter - Auto-generate options from PHP 8.1+ Enum classes
  • πŸ” FullText Filter - Search across multiple fields simultaneously
  • πŸ“† Relative Date Filter - Pre-defined date range shortcuts

Specialized Filters

  • πŸ—„οΈ JSON Filter - Query JSON/JSONB columns with path access
  • 🏷️ FindInSet Filter - Query comma-separated values using FIND_IN_SET
  • πŸ”€ Regex Filter - Pattern matching with regular expressions
  • πŸ“± InputMask Filter - Formatted input with masks (phone, credit card, etc.)
  • πŸ“ GeoLocation Filter - Geographic proximity filtering with Haversine formula
  • πŸ”— Filter Group - Combine filters with AND/OR logic

Advanced Features

  • πŸ”„ Reset All Filters - One-click reset button for all active filters
  • πŸ’Ύ Filter State Persistence - Remember filter states across sessions
  • πŸ”— URL Query Parameter Sync - Shareable filter URLs without page reload
  • πŸ”— Cascading Select Filter - Dynamic dependent dropdowns
  • β™Ώ Accessibility Support - ARIA labels and keyboard navigation
  • πŸ“‹ Filter Presets - Save and load filter combinations
  • πŸ”’ Scope Badge Counts - Display record counts on scope tabs
  • πŸ“€ Filter Export/Import - Share filter configurations via URL or JSON

Additional Features

  • 🎨 Highly Customizable - Extensive customization options for each filter
  • πŸ“± Mobile Friendly - Responsive design for all screen sizes
  • 🌐 Bilingual Docs - Complete English and Chinese documentation
  • βœ… Fully Tested - Comprehensive test coverage with 786 tests

Version Compatibility

Filament Filament Dcat Filters PHP Laravel
5.x 1.x ^8.3 ^12.0
4.x 1.x ^8.3 ^12.0

Installation

You can install the package via composer:

composer require cooper/filament-dcat-filters

Optionally, you can publish the config file:

php artisan vendor:publish --tag="filament-dcat-filters-config"

Optionally, you can publish the views:

php artisan vendor:publish --tag="filament-dcat-filters-views"

Quick Start

Scope Filter

Perfect for quick filtering with tab-style buttons:

use Cooper\FilamentDcatFilters\Filters\ScopeFilter;

ScopeFilter::make('status')
    ->scopes([
        'all' => 'All',
        'active' => 'Active',
        'inactive' => 'Inactive',
    ])

View detailed documentation β†’

Range Filter

Simplified date/number range filtering:

use Cooper\FilamentDcatFilters\Filters\RangeFilter;

RangeFilter::make('created_at')->datetime()

View detailed documentation β†’

SelectTable Filter

Modal table selector with search and pagination:

use Cooper\FilamentDcatFilters\Filters\SelectTableFilter;

SelectTableFilter::make('user_id')
    ->relationship('user', 'name')
    ->multiple()

View detailed documentation β†’

Date Component Filter

Filter by year, month, or day components:

use Cooper\FilamentDcatFilters\Filters\DateComponentFilter;

DateComponentFilter::make('created_at')->year()
DateComponentFilter::make('birth_date')->month()
DateComponentFilter::make('published_at')->day()

View detailed documentation β†’

Modal Select Filter

Dcat Admin style modal with full table display:

use Cooper\FilamentDcatFilters\Filters\ModalSelectFilter;

ModalSelectFilter::make('user_id')
    ->model(User::class, 'name', 'id')
    ->dialogTitle('Select User')
    ->displayColumns(['id' => 'ID', 'name' => 'Name', 'email' => 'Email'])
    ->searchable(['name', 'email'])
    ->multiple()

View detailed documentation β†’

Quick Filters

Built-in filters for common operations:

use Cooper\FilamentDcatFilters\Filters\{LikeFilter, InFilter, ComparisonFilter, BetweenFilter};

// LIKE search (with NOT LIKE support)
LikeFilter::make('title'),
LikeFilter::make('spam_keywords')->notLike(), // Exclude matches

// IN array (with NOT IN support)
InFilter::make('category_id')
    ->options(Category::pluck('name', 'id')->toArray()),
InFilter::make('blocked_users')->notIn(), // Exclude selected

// Comparison (>, <, =, >=, <=, !=)
ComparisonFilter::make('views')->gte()->label('Minimum Views'),

// Between (numeric range)
BetweenFilter::make('price')->label('Price Range'),

View detailed documentation β†’

Boolean Filter

Dedicated true/false/all toggle for boolean fields:

use Cooper\FilamentDcatFilters\Filters\BooleanFilter;

BooleanFilter::make('is_active')
    ->label('Status')
    ->trueLabel('Active')
    ->falseLabel('Inactive')

// Quick presets
BooleanFilter::active()      // is_active field
BooleanFilter::published()   // is_published field
BooleanFilter::enabled()     // is_enabled field

Null Filter

Filter for NULL or NOT NULL values:

use Cooper\FilamentDcatFilters\Filters\NullFilter;

NullFilter::make('deleted_at')
    ->nullLabel('Not Deleted')
    ->notNullLabel('Deleted')

// Quick presets
NullFilter::deleted()    // deleted_at field
NullFilter::assigned()   // Check if field is assigned
NullFilter::empty()      // Check if field is empty/filled

Enum Filter

Auto-generate options from PHP 8.1+ Enum classes:

use Cooper\FilamentDcatFilters\Filters\EnumFilter;

EnumFilter::make('status')
    ->enum(OrderStatus::class)
    ->multiple()
    ->exclude([OrderStatus::Cancelled])

FullText Filter

Search across multiple fields simultaneously:

use Cooper\FilamentDcatFilters\Filters\FullTextFilter;

FullTextFilter::make('search')
    ->searchIn(['name', 'email', 'phone'])
    ->placeholder('Search users...')
    ->minLength(2)
    ->debounce(300)

Relative Date Filter

Pre-defined date range shortcuts:

use Cooper\FilamentDcatFilters\Filters\RelativeDateFilter;

RelativeDateFilter::make('created_at')
    ->only(['today', 'yesterday', 'last_7_days', 'last_30_days', 'this_month'])

// Quick presets
RelativeDateFilter::common()     // Common date ranges
RelativeDateFilter::weekly()     // Week/month focused
RelativeDateFilter::reporting()  // Quarter/year focused

Hidden Filter

URL parameter-based filtering (no UI):

use Cooper\FilamentDcatFilters\Filters\HiddenFilter;

// Pre-filter by tenant
HiddenFilter::make('tenant_id')
    ->default(auth()->user()->tenant_id)
    ->eq()

View detailed documentation β†’

Reset All Filters

Add a one-click reset button:

use Cooper\FilamentDcatFilters\Concerns\HasResetFilters;

class ListUsers extends ListRecords
{
    use HasResetFilters;

    protected function getHeaderActions(): array
    {
        return [
            $this->getResetFiltersAction(),
        ];
    }
}

View detailed documentation β†’

Filter State Persistence

Remember filter states across sessions:

use Cooper\FilamentDcatFilters\Concerns\HasFilterPersistence;

class ListUsers extends ListRecords
{
    use HasFilterPersistence;

    protected string $filterPersistenceKey = 'users-list-filters';
}

View detailed documentation β†’

URL Query Parameter Sync

Shareable filter URLs:

use Cooper\FilamentDcatFilters\Concerns\SyncsFiltersToUrlWithoutHistory;

class ListUsers extends ListRecords
{
    use SyncsFiltersToUrlWithoutHistory;
}

View detailed documentation β†’

Cascading Select Filter

Dynamic dependent dropdowns:

use Cooper\FilamentDcatFilters\Filters\CascadingSelectFilter;

CascadingSelectFilter::make('location')
    ->levels([
        'country' => [
            'label' => 'Country',
            'options' => fn () => Country::pluck('name', 'id'),
        ],
        'state' => [
            'label' => 'State',
            'options' => fn ($country) => State::where('country_id', $country)->pluck('name', 'id'),
            'dependsOn' => 'country',
        ],
        'city' => [
            'label' => 'City',
            'options' => fn ($state) => City::where('state_id', $state)->pluck('name', 'id'),
            'dependsOn' => 'state',
        ],
    ])

View detailed documentation β†’

Documentation

Core Filters

Specialized Filters

Advanced Features

Guides & References

Facade Usage

You can also use the Facade for quick access:

use Cooper\FilamentDcatFilters\Facades\FilamentDcatFilters;

FilamentDcatFilters::scopeFilter('status')->scopes([...]);
FilamentDcatFilters::rangeFilter('created_at')->datetime();

// All available filter shortcuts
FilamentDcatFilters::booleanFilter('is_active');
FilamentDcatFilters::nullFilter('deleted_at');
FilamentDcatFilters::enumFilter('status');
FilamentDcatFilters::fullTextFilter('search');
FilamentDcatFilters::hiddenFilter('tenant_id');
FilamentDcatFilters::filterGroup('combined');

Artisan Command

Generate a custom filter class using the Artisan command:

php artisan make:dcat-filter MyCustom

This creates app/Filament/Filters/MyCustomFilter.php.

Options

Option Description Default
--type Filter type to extend basic
--force Overwrite existing file false

Available Types

Type Base Class
basic Filament\Tables\Filters\Filter
like LikeFilter
in InFilter
comparison ComparisonFilter
boolean BooleanFilter
null NullFilter
enum EnumFilter
range RangeFilter
between BetweenFilter
scope ScopeFilter
regex RegexFilter
fulltext FullTextFilter
json JsonFilter
date-component DateComponentFilter
select-table SelectTableFilter
modal-select ModalSelectFilter
hidden HiddenFilter
relative-date RelativeDateFilter
cascading-select CascadingSelectFilter
find-in-set FindInSetFilter
input-mask InputMaskFilter
geo-location GeoLocationFilter
filter-group FilterGroup

Examples

# Create a basic filter
php artisan make:dcat-filter ProductStatus

# Create a filter extending LikeFilter
php artisan make:dcat-filter ProductSearch --type=like

# Create a filter extending ComparisonFilter
php artisan make:dcat-filter MinPrice --type=comparison

# Overwrite existing
php artisan make:dcat-filter ProductStatus --force

Testing

composer test

Code Quality

# Format code
composer format

# Static analysis
composer analyse

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

If you discover any security-related issues, please email myxiaoao@gmail.com.

Credits

License

The MIT License (MIT). Please see License File for more information.