lowerrocklabs/laravel-livewire-tables-advanced-filters
Installation
composer require lowerrocklabs/laravel-livewire-tables-advanced-filters
Publish the config (if needed):
php artisan vendor:publish --provider="LowerRockLabs\LaravelLivewireTablesAdvancedFilters\ServiceProvider"
Basic Usage
Extend your existing LivewireTable class to include advanced filters:
use LowerRockLabs\LaravelLivewireTablesAdvancedFilters\Traits\HasAdvancedFilters;
class UserTable extends LivewireTable
{
use HasAdvancedFilters;
// ...
}
First Use Case Add a numeric range filter to a column:
$this->addColumn('price', 'Price', 'text')->addFilter(
new \LowerRockLabs\LaravelLivewireTablesAdvancedFilters\Filters\NumericRangeFilter('price')
);
Filter Integration
price, quantity, or age.
$this->addColumn('salary', 'Salary')->addFilter(
new \LowerRockLabs\LaravelLivewireTablesAdvancedFilters\Filters\NumericRangeFilter('salary')
);
created_at, updated_at, or custom date fields.
$this->addColumn('created_at', 'Created At')->addFilter(
new \LowerRockLabs\LaravelLivewireTablesAdvancedFilters\Filters\DateRangeFilter('created_at')
);
Smart Select (Select2-like)
getStatusOptions()) and bind to a column:
$this->addColumn('status', 'Status')->addFilter(
new \LowerRockLabs\LaravelLivewireTablesAdvancedFilters\Filters\SmartSelectFilter('status', $this->getStatusOptions())
);
public function getStatusOptions()
{
return ['active' => 'Active', 'inactive' => 'Inactive'];
}
Customizing Filters
public function configureNumericRangeFilter($filter)
{
$filter->min = 0;
$filter->max = 1000;
$filter->step = 10;
}
Blade Integration
@livewireTablesAdvancedFilters.scripts
@livewireTablesAdvancedFilters.styles
@livewireTablesAdvancedFilters.numericRange('price')
@livewireTablesAdvancedFilters.dateRange('created_at')
@livewireTablesAdvancedFilters.smartSelect('status', $options)
Query Builder Compatibility
Ensure your buildQuery method handles the filter inputs:
public function buildQuery()
{
if ($this->filters['price_min'] || $this->filters['price_max']) {
$query->whereBetween('price', [
$this->filters['price_min'] ?? null,
$this->filters['price_max'] ?? null
]);
}
}
Tailwind/Bootstrap Support Configure the package to match your frontend framework:
// config/livewire-tables-advanced-filters.php
'view' => [
'tailwind' => true, // or 'bootstrap'
],
Localization
Override default labels in your language files (e.g., resources/lang/en/livewire-tables.php):
'numeric_range' => [
'min' => 'Minimum',
'max' => 'Maximum',
],
Filter Persistence
protected $persistentFilters = ['price_min', 'price_max'];
public function mount()
{
$this->loadPersistentFilters();
}
Date Format Mismatch
Y-m-d for DateRangeFilter):
$filter = new \LowerRockLabs\LaravelLivewireTablesAdvancedFilters\Filters\DateRangeFilter('created_at');
$filter->format = 'Y-m-d';
Select2 Dependencies
SmartSelectFilter requires Select2. Include its assets in your layout:
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
Query Performance
$query->whereBetween('price', [...])->latest();
Filter Inputs Dump filter inputs to debug:
dd($this->filters);
Component Rendering Check if the filter component is rendering by inspecting the Blade view. Ensure:
@livewireTablesAdvancedFilters directives are correctly placed.wire:model bindings match the filter properties (e.g., price_min, price_max).JavaScript Errors
$ or jQuery bindings).Custom Filters Extend the base filter class to create reusable filters:
class CustomRangeFilter extends \LowerRockLabs\LaravelLivewireTablesAdvancedFilters\Filters\BaseFilter
{
public $min;
public $max;
public function apply($query)
{
$query->whereBetween('custom_field', [$this->min, $this->max]);
}
}
Override Default Views Publish and modify the package views:
php artisan vendor:publish --tag=livewire-tables-advanced-filters-views
Edit files in resources/views/vendor/livewire-tables-advanced-filters/.
Dynamic Filter Options
Fetch options asynchronously for SmartSelectFilter:
$this->addColumn('country', 'Country')->addFilter(
new \LowerRockLabs\LaravelLivewireTablesAdvancedFilters\Filters\SmartSelectFilter(
'country',
$this->getCountries()
)
);
public function getCountries()
{
return Country::pluck('name', 'code')->toArray();
}
Conditional Filters Show/hide filters based on user roles or column visibility:
if (auth()->user()->can('manage_prices')) {
$this->addColumn('price')->addFilter(new \LowerRockLabs\LaravelLivewireTablesAdvancedFilters\Filters\NumericRangeFilter('price'));
}
How can I help you explore Laravel packages today?