Date Time Slots
CommunityA flexible date and time slot picker for Filament forms with configurable working hours, available and blocked slots, booking constraints, timezone support, and 12/24-hour display modes.
Author:
WooServ
Package health
BetaAutomated checks of this plugin's Composer package
15 checks
- Failed: GitHub Actions pinned to SHA — View details on Plumb
- Skipped: GitLab CI includes pinned to SHA
- Passed: Open security advisories
- Passed: Dependabot PR responsiveness — No open Dependabot PRs.
- Skipped: Renovate MR responsiveness
- Passed: Dependabot or Renovate configured
-
Failed:
Dependency update cooldown configured
—
No cooldown configured in
.github/dependabot.yml. View details on Plumb - Passed: Provides a security policy
- Passed: Abandoned or archived — No consulted source marks the package abandoned (packagist, github).
- Passed: Commit and release recency — Active: last commit 0 days ago; last release 0 days ago.
-
Passed:
composer.lock not committed by library
—
composer.lockis absent from the released dist archive. - Passed: Dist archive is lean
-
Passed:
Current Laravel version supported
—
Package dependencies resolve together with current Laravel
13.0. -
Passed:
Current PHP version supported
—
Constraint
^8.2supports current PHP8.5. - Skipped: Current Symfony version supported
filament/
namespace. Review the source and install at your own risk. Found
malware or an unresolved security issue the author won't
address?
Report it
.
Documentation
- Live Demo
- Why use it?
- Requirements
- Installation
- Basic usage
- Exact availability
- Configuration
- Responsive layouts
- Using outside a Filament panel
- Testing
- Building assets
- Changelog
- Contributing
- Security
- Credits
- License
A polished date and time slot picker for Filament forms. Build booking, appointment, reservation, task, and scheduling workflows with configurable calendars, working hours, availability rules, blocked slots, timezones, and responsive layouts.
#Live Demo
Try the component in a real booking experience:
The demo application also includes a complete example of using the picker outside a Filament admin panel with a standalone Livewire component.
#Why use it?
- Calendar-based date selection with configurable minimum and maximum dates.
- Generate slots from weekly working hours or provide exact slots for each date.
- Mark booked slots as unavailable, with an option to show them in the picker.
- Configure slot intervals and minimum lead time for advance booking rules.
- Disable past dates and past slots automatically.
- Support 12-hour and 24-hour display formats without changing the stored value.
- Work with Filament timezones, custom locales, RTL, and dark mode.
- Responsive horizontal layout with an automatic vertical fallback on narrow containers.
- Independently scrollable time slots for long schedules.
- Store one predictable datetime value without requiring a separate appointment table.
#Requirements
- PHP 8.2 or higher
- Laravel 11, 12, or 13
- Filament 3.2, 4, or 5
Supported framework combinations are tested continuously in CI.
#Installation
Install the package with Composer:
composer require wooserv/filament-date-time-slots
Laravel package discovery registers the service provider automatically. Compiled JavaScript and CSS are included in the package, so Node.js is not required for normal usage.
Views can be published when you need to customize the package view:
php artisan vendor:publish --tag="date-time-slots-views"
#Basic usage
Add the picker to any Filament form schema:
use WooServ\FilamentDateTimeSlots\Forms\Components\DateTimeSlotPicker;
DateTimeSlotPicker::make('due_at')
->label('Due at')
->format('Y-m-d H:i')
->minDate(now())
->minimumLeadTime(30)
->slotInterval(30)
->workingHours([
'sunday' => ['09:00', '17:00'],
'monday' => ['09:00', '17:00'],
])
->blockedSlots([
'2026-09-07' => ['10:30', '12:00'],
])
->required();
The selected value is stored using the format passed to format(). The 12-hour/24-hour display switch only changes presentation; it does not change the stored value.
#Exact availability
When your application already knows which slots are available for each date, use availableSlots() instead of generating slots from working hours:
DateTimeSlotPicker::make('due_at')
->availableSlots([
'2026-09-07' => ['09:00', '09:30', '11:00'],
]);
availableSlots() takes priority over generated working-hour slots for matching dates. Use blockedSlots() to mark booked times as unavailable. By default, blocked slots are hidden; call showBlockedSlots() to display them in the picker.
#Configuration
DateTimeSlotPicker::make('due_at')
->format('Y-m-d H:i')
->firstDayOfWeek(1)
->weekStartsOnMonday()
->minDate(now())
->maxDate(now()->addMonths(3))
->disabledDates(['2026-09-18'])
->timezone('Africa/Cairo')
->locale('en')
->slotInterval(30)
->minimumLeadTime(60)
->showBlockedSlots();
#Available methods
| Method | Purpose |
|---|---|
format() |
Set the stored datetime format. Defaults to Y-m-d H:i. |
workingHours() |
Generate slots from weekday start/end times. |
availableSlots() |
Provide exact available times keyed by date. |
blockedSlots() |
Mark specific date/time slots as booked or unavailable. |
showBlockedSlots() |
Display blocked slots instead of hiding them. |
slotInterval() |
Set the generated slot interval in minutes. |
minimumLeadTime() |
Require selections to be a number of minutes in the future. |
minDate() / maxDate() |
Set selectable calendar boundaries. |
disabledDates() |
Disable specific dates. |
timezone() / locale() |
Override the active timezone or locale. |
weekStartsOnMonday() / weekStartsOnSunday() |
Set the first day of the week. |
vertical() |
Force the vertical layout at every width. |
Closures are supported by configuration methods where dynamic values are useful.
#Responsive layouts
The picker uses a horizontal layout by default when its own container is at least 48rem wide. On smaller containers, including mobile layouts, it automatically switches to a vertical layout. This container-aware behavior also keeps narrow Filament grid columns usable on large screens.
Force the vertical layout when needed:
DateTimeSlotPicker::make('due_at')
->vertical();
Time slots have an independent scroll area in both layouts, so a large number of slots does not expand the entire form.
#Using outside a Filament panel
DateTimeSlotPicker can also be used in standalone Livewire components that use Filament Forms. This makes it suitable for public-facing booking flows as well as Filament admin forms.
<?php
namespace App\Livewire;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Forms\Form;
use Livewire\Component;
use WooServ\FilamentDateTimeSlots\Forms\Components\DateTimeSlotPicker;
class BookingForm extends Component implements HasForms
{
use InteractsWithForms;
public ?array $data = [];
public function form(Form $form): Form
{
return $form
->schema([
DateTimeSlotPicker::make('starts_at')
->label('Choose a time')
->workingHours([
'sunday' => ['09:00', '17:00'],
'monday' => ['09:00', '17:00'],
])
->minimumLeadTime(30)
->required(),
])
->statePath('data');
}
public function save(): void
{
$data = $this->form->getState();
// Create the booking using $data['starts_at'].
}
}
See the demo application for a complete public-facing implementation, or try it in the live demo.
#Testing
composer install
composer test
Format the PHP source with the package coding rules:
composer format
The test suite uses PHPUnit and Orchestra Testbench. CI tests the supported Filament and Laravel combinations rather than relying on one locally installed framework version.
#Building assets
Distributable assets are committed to resources/dist. Rebuild them only when changing the frontend source:
npm install
npm run build
#Changelog
Please see CHANGELOG for a complete history of changes.
#Contributing
Please see CONTRIBUTING for contribution guidelines.
#Security
Please review our security policy to report security vulnerabilities.
#Credits
Maintained by WooServ, LLC:
#License
The MIT License (MIT). See the License File for more information.
Featured Plugins
A selection of plugins curated by the Filament team
Blueprint
Filament Blueprint is a premium Laravel Boost extension that helps AI agents produce accurate, detailed implementation plans and security reports for Filament apps.
Filament
Spotlight Pro
Browse your Filament Panel with ease. Filament Spotlight Pro adds a Spotlight like Command Palette to your Filament Panel.
Dennis Koch
Custom Fields
Eliminate custom field migrations forever. Let your users create and manage form fields directly in Filament admin panels with 20+ built-in field types, validation, and zero database changes.
Relaticle