tapp/filament-timezone-field
A Filament form select field for picking timezones, with options to filter by country or region, switch display language, and use GMT instead of UTC. Install via Composer and add TimezoneSelect::make('timezone') to your resource schema. Compatible with Filament 3.x, 4.x and 5.x.
composer require, freeing the sprint for the parts of the feature that are actually differentiating.->byCountry(['US','AU']) and ->byRegion(Region::Australia) let us scope the list to markets we actually serve. That's a product decision (fewer wrong selections, less support load) we can express in one line of schema rather than a custom cascading widget.->language('es') via Symfony Intl means an i18n requirement doesn't force a bespoke component. This directly de-risks any "we're launching in LATAM/EU next quarter" commitment.TimezoneColumn formatting options and TimezoneSelectFilter improve support workflows — e.g. filtering users by region to debug "my digest arrives at midnight" tickets.Adopt when:
^3.0 pinned and a smoke test, versus a 3–5 day custom widget with tests.getTimezoneFromBrowser() gives that behavior without custom JS.Select, so lock-in is near zero.Look elsewhere / handle in-house when:
Adoption checklist before merge: pin ^3.0; confirm the symfony/intl constraint resolves against our locked Laravel/Filament versions; add a feature test asserting the stored value is a valid IANA identifier; verify getTimezoneFromBrowser() on our auth/SPA pages specifically (changelog v3.0.13 fixed a "Component not found" regression there — it's the known-sharp edge); decide and document the storage convention (store IANA name, render and convert at the edges) and a server-side validation rule.
To executives: This is a small, cheap, low-risk dependency that removes a recurring build task — a properly localized timezone picker with country/region filtering, list-column rendering, and browser-based defaults — from our backlog. It's a single form component for our Filament admin/panel stack, not infrastructure, so it carries no meaningful lock-in and can be replaced in hours if needed. It also keeps our Filament upgrade path open (3.x/4.x/5.x supported on one line). The honest caveats: it's a young, low-adoption package (small maintainer base, few public users), and it captures the user's timezone — it does not do scheduling or timezone conversion, which is a separate and larger decision.
To engineering: One composer require, one TimezoneSelect::make('timezone') in the schema, plus TimezoneColumn and TimezoneSelectFilter where useful. It extends Filament's Select, so searchable(), required(), reactive behavior and the rest of the standard API still apply. Options we care about: language(), timezoneType('GMT'), byCountry(), byRegion(), hideNames()/hideOffset(), getTimezoneFromBrowser(). Integration is roughly half a day including tests. What we own: server-side validation to a valid IANA identifier, the store-in-UTC/render-locally convention, and any DST-sensitive logic downstream. Watch the browser-prefill path on non-standard pages, and pin the version so a minor bump can't drift our Filament/symfony-intl constraints. If the dependency ever becomes a problem, the fallback is ~40 lines around DateTimeZone::listIdentifiers() — that's the entire risk envelope.
How can I help you explore Laravel packages today?