malzariey/filament-daterangepicker-filter
Alpine.js-powered date range picker and filter for Filament. Pick day/month/year ranges with presets, optional time selection (12/24h), keyboard input validation, localization, accessibility, and modal/slide-over friendly dropdown teleport. Matches Filament v4 UI.
Installation:
composer require malzariey/filament-daterangepicker-filter
Publish translations if needed:
php artisan vendor:publish --tag="filament-daterangepicker-filter-translations"
First Use Case: Add the field to a Filament form or resource:
use Malzariey\FilamentDaterangepickerFilter\Fields\DateRangePicker;
DateRangePicker::make('created_at')
->label('Date Range')
->required();
As a Filter:
use Malzariey\FilamentDaterangepickerFilter\Filters\DateRangeFilter;
DateRangeFilter::make('created_at')
->label('Filter by Date')
->placeholder('Select a date range');
DateRangePicker::make('event_date')
->label('Event Duration')
->required()
->format('d/m/Y');
DateRangeFilter::make('billing_period')
->monthPicker()
->label('Billing Month')
->format('F Y')
->modifyQueryUsing(fn(Builder $query, ?Carbon $startDate, ?Carbon $endDate) =>
$query->whereBetween('billing_date', [$startDate, $endDate])
);
DateRangePicker::make('fiscal_year')
->yearPicker()
->label('Fiscal Year')
->format('Y')
->minYear(2020)
->maxYear(2030);
DateRangePicker::make('shift_time')
->timePicker()
->timePicker24()
->timePickerIncrement(30)
->format('d/m/Y H:i');
DateRangePicker::make('custom_date')
->allowInput()
->format('d/m/Y')
->placeholder('Type a date (e.g., 15/06/2024)');
Dual State Mode: Store start/end dates separately:
DateRangePicker::make('date_range')
->useDualState('start_date', 'end_date');
In your Livewire component:
public ?string $start_date = null;
public ?string $end_date = null;
Custom Events: Listen for changes via JavaScript:
document.addEventListener('apply.daterangepicker', (e) => {
console.log('Selected:', e.detail.startDate, e.detail.endDate);
// Update Livewire properties or trigger actions
});
whereBetween logic:
DateRangeFilter::make('created_at')
->modifyQueryUsing(fn(Builder $query, ?Carbon $startDate, ?Carbon $endDate) =>
$query->where('created_at', '>=', $startDate)
->where('created_at', '<=', $endDate)
);
DateRangePicker::make('created_at')
->ranges([
'Today' => [now(), now()],
'This Week' => [now()->startOfWeek(), now()->endOfWeek()],
'Last 30 Days' => [now()->subDays(30), now()],
])
->defaultToday();
php artisan vendor:publish --tag="filament-daterangepicker-filter-translations"
Edit resources/lang/vendor/filament-daterangepicker-filter/xx.json.DateRangePicker::make('dates')->teleport(); // Default: true
displayFormat() (e.g., 'DD/MM/YYYY') instead of format() with Carbon tokens.->format('d/m/Y') // Correct (auto-converts to JS)
timePicker24()) may not apply if called after timePicker().->timePicker()
->timePicker24()
->timePickerIncrement(30);
minYear()/maxYear() may not restrict month/year picker inputs as expected.minDate()/maxDate for stricter control:
->monthPicker()
->minDate('2020-01-01')
->maxDate('2030-12-31');
$start_date and $end_date properties in Livewire.public ?string $start_date = null;
public ?string $end_date = null;
06/202 in m/Y format) may overwrite valid selections.allowInput() judiciously and validate server-side:
->allowInput()
->format('m/Y'); // Ensures strict validation
document.addEventListener('apply.daterangepicker', (e) => {
console.log('Applied:', e.detail);
});
document.addEventListener('cancel.daterangepicker', (e) => {
console.log('Cancelled:', e.detail);
});
x-data attributes to verify dynamic state:
<input x-data="..." x-model="...">
format() matches the expected input/output:
->format('Y-m-d H:i:s'); // ISO format for API consistency
->teleport(true); // Force teleport to body (default)
->ranges(array_map(fn($year) => [
"FY $year" => ["$year-01-01", "$year-12-31"]
], range(2020, 2030)));
->visible(fn() => $this->some_condition)
modifyQueryUsing for complex filters:
->modifyQueryUsing(fn(Builder $query, ?Carbon $startDate, ?Carbon $endDate) =>
$query->when($startDate, fn($q) => $q->where('date', '>=', $startDate))
->when($endDate, fn($q) => $q->where('date', '<=', $endDate))
);
// In a service provider
app()->setLocale('fr');
document.addEventListener('alpine:init', () => {
Alpine.data('customDateRangePicker', () => ({
init() {
// Modify Alpine.js behavior
}
}));
});
How can I help you explore Laravel packages today?