If you want to pick the date and see the available un-booked time slots with Radio options, this example is for you.
Notice: This free snippet comes from our more complex Premium example Appointment System with Public Form.
First, in the Filament Resource, we create a DatePicker
with live()
behavior and a Radio
with options set dynamically.
app/Filament/Resources/ReservationResource.php:
// ... use App\Services\ReservationService; // ... public static function form(Form $form): Form{ $dateFormat = 'Y-m-d'; return $form ->schema([ DatePicker::make('date') ->minDate(now()->format($dateFormat)) ->maxDate(now()->addWeeks(2)->format($dateFormat)) ->required() ->live(), Radio::make('start_time') ->options(fn (Get $get) => (new ReservationService())->getAvailableTimesForDate($get('date'))) ->hidden(fn (Get $get) => ! $get('date')) ->required() ->columnSpan(2), ]);}
To pick the available time slots, we have a separate method in a Service class:
app/Services/ReservationService.php:
use App\Models\Reservation;use Carbon\Carbon;use Carbon\CarbonPeriod; class ReservationService{ public function getAvailableTimesForDate(string $date): array { $date = Carbon::parse($date); $startPeriod = $date->copy()->hour(9); $endPeriod = $date->copy()->hour(17); $times = CarbonPeriod::create($startPeriod, '1 hour', $endPeriod); $availableReservations = []; $reservations = Reservation::whereDate('start_time', $date) ->pluck('start_time') ->toArray(); $availableTimes = $times->filter(function ($time) use ($reservations) { return ! in_array($time, $reservations); })->toArray(); foreach ($availableTimes as $time) { $key = $time->format('H'); $availableReservations[$key] = $time->format('H:i'); } return $availableReservations; }}
You can flexibly change some parts here: for example, the limitation of 9 to 17 hours.
Finally, we need to save the data correctly, so we mutate it before saving:
app/Filament/Resources/ReservationResource/Pages/CreateReservation.php:
use Carbon\Carbon; // ... class CreateReservation extends CreateRecord{ // ... protected function mutateFormDataBeforeCreate(array $data): array { $date = Carbon::parse($data['date']); $startTime = $date->hour($data['start_time']); $endTime = $startTime->copy()->addHour(); $dateTimeFormat = 'Y-m-d H:i:s'; return [ 'user_id' => auth()->id(), 'start_time' => $startTime->format($dateTimeFormat), 'end_time' => $endTime->format($dateTimeFormat), ]; }}
Saving of the data is based on this DB Migration:
Schema::create('reservations', function (Blueprint $table) { $table->id(); $table->foreignIdFor(User::class)->constrained()->cascadeOnDelete(); $table->datetime('start_time'); $table->datetime('end_time'); $table->timestamps();});
A few of our Premium Examples: