omar-haris/filament-timezone-field
Installation
composer require omar-haris/filament-timezone-field
Publish the config (if needed):
php artisan vendor:publish --provider="OmarHaris\FilamentTimezoneField\FilamentTimezoneFieldServiceProvider"
First Use Case Add the field to a Filament form/resource:
use OmarHaris\FilamentTimezoneField\Fields\Timezone;
Timezone::make('timezone')
->label('User Timezone')
->required(),
Where to Look First
Basic Integration Use in Filament forms/resources:
Timezone::make('timezone')
->default('America/New_York')
->rules(['required', 'timezone'])
->columnSpanFull(),
Localized Timezones Support multiple languages via config:
// config/filament-timezone-field.php
'languages' => [
'en' => 'English',
'es' => 'Español',
],
Dynamic Defaults Set defaults based on user location:
Timezone::make('timezone')
->default(fn () => $this->getUserTimezone()),
Validation & Rules Combine with Laravel validation:
Timezone::make('timezone')
->rules(['timezone', 'different:UTC'])
->helperText('Must be a valid timezone.'),
Custom Grouping Override region grouping (e.g., by continent):
Timezone::make('timezone')
->groupBy('continent')
->groupLabels([
'NA' => 'North America',
'EU' => 'Europe',
]),
Livewire Integration Use in Livewire components:
use OmarHaris\FilamentTimezoneField\Fields\Timezone;
public function form(Form $form): void
{
$form->components([
Timezone::make('timezone')->required(),
]);
}
Timezone::make('timezone')->cacheTimezones(true);
Timezone::make('timezone')
->classes(['custom-class'])
->extraAttributes(['data-testid' => 'timezone-field']),
Timezone Database Sync
sudo apt-get install tzdata # Linux
composer dump-autoload
Language Fallback
Timezone::make('timezone')->language('en');
Filament Version Compatibility
Class 'Filament\Forms\Components\Select' not found → Ensure Filament is installed.Database Storage
America/New_York). Validate on retrieval:
$timezone = Timezone::make('timezone')->getState();
if (!in_array($timezone, Timezone::getAllTimezones())) {
throw new \InvalidArgumentException("Invalid timezone: {$timezone}");
}
Nested Forms
Timezone::make('timezone')
->bindTo('user.timezone') // For nested models
->unboundValue(null),
Log Timezone Data:
\Log::info('Available timezones:', Timezone::getAllTimezones());
Check Config:
php artisan config:clear
Then verify config/filament-timezone-field.php.
Override Defaults: If the default timezone list is missing entries, extend the provider:
// app/Providers/AppServiceProvider.php
use OmarHaris\FilamentTimezoneField\TimezoneServiceProvider;
public function boot()
{
TimezoneServiceProvider::macro('extendTimezones', function (array $customTimezones) {
$this->timezones = array_merge($this->timezones, $customTimezones);
});
}
Custom Timezone Sources Replace the default timezone data source by binding a custom provider:
// config/filament-timezone-field.php
'timezone_provider' => \App\Services\CustomTimezoneProvider::class,
Event Listeners Listen for timezone changes in Filament:
use OmarHaris\FilamentTimezoneField\Events\TimezoneChanged;
TimezoneChanged::listen(function ($model, $timezone) {
\Log::info("Timezone updated to {$timezone} for {$model->id}");
});
API Responses Normalize timezones in API responses:
// app/Http/Resources/UserResource.php
public function toArray($request)
{
return [
'timezone' => Timezone::normalize($this->timezone),
];
}
Testing Mock timezone fields in tests:
$this->filament->actingAs($user)
->modifyFormDataUsing(function (array $data) {
$data['timezone'] = 'Europe/London';
return $data;
});
How can I help you explore Laravel packages today?