Installation:
composer require konnco/filament-timematrix
Publish config (if needed):
php artisan vendor:publish --provider="Konnco\FilamentTimeMatrix\FilamentTimeMatrixServiceProvider"
First Usage: Add to a Filament form:
use Konnco\FilamentTimeMatrix\Forms\TimeMatrix;
TimeMatrix::make('availability')
->label('Weekly Availability')
->required();
This renders a 7-day (Mon-Sun) × 24-hour grid with bulk selection controls.
First Use Case: Create a staff scheduling panel where admins select working hours per day. Example:
TimeMatrix::make('working_hours')
->hours(startTime: 8, endTime: 18) // 8 AM - 6 PM
->helperText('Click to mark open hours for each day');
TimeMatrix::make('field_name')
->label('Custom Label')
->required()
->helperText('Instructions')
->columns(5) // Adjust grid columns (default: 7)
->rows(12); // Limit to 12-hour display (default: 24)
// Form model binding
public function form(Form $form): Form
{
return $form
->schema([
TimeMatrix::make('hours')
->default(fn () => [
Day::Monday => [9, 17], // 9 AM - 5 PM
Day::Friday => [10, 18],
]),
]);
}
// Retrieve data
$selectedHours = $record->hours; // Returns array like:
/*
[
Day::Monday => [9, 17],
Day::Tuesday => [10, 16],
// ...
]
*/
TimeMatrix::make('hours')
->rules([
'required',
'min_hours:10', // At least 10 hours total
'max_hours:40', // No more than 40 hours
'min_days:3', // At least 3 days selected
])
->afterStateUpdated(fn (set, $state) => {
$this->validateRules($state);
});
TimeMatrix::make('hours')
->locale('fr'); // Force French (Carbon-based)
TimeMatrix::make('hours')
->disabled() // Disable all slots
->disabledDays([Day::Saturday, Day::Sunday]) // Disable weekends
->selectedClass('bg-blue-500 text-white') // Custom selected slot style
->disabledClass('opacity-30'); // Custom disabled slot style
use Konnco\FilamentTimeMatrix\Columns\TimeMatrixColumn;
Table::make()
->columns([
TimeMatrixColumn::make('hours')
->label('Schedule')
->hours(startTime: 8, endTime: 18),
]);
public function mount()
{
$this->form->fill([
'hours' => [
Day::Monday => [9, 17],
],
]);
}
use Konnco\FilamentTimeMatrix\Facades\TimeMatrixValidator;
$validator = new TimeMatrixValidator($hoursData);
$validator->validate([
'min_hours' => 10,
'max_hours' => 40,
]);
Data Format Mismatch:
[Day::Enum => [startHour, endHour]] format.
// Correct:
[Day::Monday => [9, 17]]
// Incorrect:
["Monday" => "09:00-17:00"]
Time Zone Confusion:
UTC, but users expect local time, slots may appear misaligned.'timezone' => 'America/New_York',
Validation Overrides:
->ignoreRules() to bypass default validation temporarily.Performance with Large Ranges:
->rows(12) // 12-hour format
->columns(5) // Group days
Dark Mode Inconsistencies:
->selectedClass('dark:bg-blue-600')
Inspect Raw Data:
dd($this->data['hours']); // Check bound data structure
Log Validation Errors:
$this->form->afterStateUpdated(fn (set, $state) => {
if ($set === 'hours') {
$this->dispatch('filament-timematrix::log', [
'data' => $state,
'errors' => $this->getErrors(),
]);
}
});
Test with Minimal Config: Strip down to basics to isolate issues:
TimeMatrix::make('test')
->required()
->hours(); // Default 24-hour range
Custom Day Labels: Override day names via config:
'days' => [
Day::Monday => 'Lundi',
Day::Tuesday => 'Mardi',
// ...
],
Slot Templates:
Extend Blade templates in resources/views/vendor/filament-timematrix.
Example: slot.blade.php for custom hour rendering.
Event Listeners: Hook into selection changes:
TimeMatrix::make('hours')
->afterStateUpdated(fn (set, $state) => {
event(new TimeSlotsUpdated($state));
});
API Integration: Serialize/deserialize for external APIs:
$serialized = json_encode([
'monday' => ['start' => 9, 'end' => 17],
// ...
]);
Localization:
Extend translations via filament-timematrix.php config:
'translations' => [
'en' => [
'select_all' => 'Mark All',
'deselect_all' => 'Clear All',
],
'fr' => [
'select_all' => 'Tout sélectionner',
],
],
How can I help you explore Laravel packages today?