Formuláře
DateRangePicker
Dva provázané date pickery nad dvěma sloupci, s obdobími na jedno kliknutí.
Na této stránce
Období: dvě data, která patří k sobě, vybíraná jako jeden prvek a ukládaná do dvou datumových sloupců, které aplikace už má. Sáhněte po něm pro platnost, rezervaci nebo reportovací okno — všude, kde druhé datum dává smysl jen vedle prvního.
use NyonCode\WireForms\Components\DateRangePicker;
Jak to funguje
Dvojice se skládá, nepíše se znovu. Každý konec je běžný DateTimePicker navázaný na vlastní sloupec, takže kalendář, parser psaného vstupu, fallback na nativní input, mobilní sheet i práce s časovými zónami jsou ty, které už to pole vlastní. Druhý kalendář napsaný pro rozsahy by se s ním začal rozcházet hned v týdnu, kdy vznikl.
Je to layout, ne pole, a právě to mu umožňuje ukládat se bez vlastního švu. Formulář dětské komponenty layoutu zplošťuje do seznamu polí, takže oba pickery jsou pro plnění, validaci i ukládání běžná pole — období skončí ve dvou skutečných datumových sloupcích, přesně jako by schéma vypsalo dva pickery. Žádný polový stav, žádný JSON sloupec, žádný vlastní save hook.
Třída vlastní jen to, co ani jeden konec nemůže vědět sám. Provázání: koncový
picker se neotevře před počátečním datem a počáteční nepřejde přes koncové. Mez
je reaktivní, takže sleduje, co se vybralo na druhém konci, a dokud je ten konec
prázdný, spadne zpět na vlastní minDate() / maxDate() rozsahu.
Totéž omezení je i pravidlo. Mez v prohlížeči je zdvořilost — vložená
hodnota, zapomenutá záložka nebo vypnutý picker pořád mohou poslat konec před
začátkem — takže koncový picker nese after_or_equal:<cesta začátku> a období,
které končí dřív, než začíná, spadne na validaci místo aby se uložilo.
Oba konce jsou live. Uzávěry mezí se vyhodnocují na serveru, takže každý výběr stojí jeden roundtrip; právě to nechá kalendář druhého konce překreslit s novým limitem.
Předvolby se počítají na serveru. „Tento měsíc“ se spočítá v PHP a vykreslí jako dvojice hodnot, takže prohlížeč nemusí vědět, co ta fráze znamená, a nikdy se se serverem neneshodne na dnešním datu. Kliknutí zapíše oba konce najednou.
Základní použití
DateRangePicker::make('validity')
Dva date pickery nad validity_from a validity_to.
Pojmenování sloupců
DateRangePicker::make('validity') ->from('valid_from') ->until('valid_to')
Vlastní jméno pole je úchyt pro popisek a id; do záznamu se dostanou jen tato dvě jména.
Meze
DateRangePicker::make('validity') ->minDate('2026-01-01') ->maxDate(now()->addYear())
Každý konec čte mez rozsahu, dokud není vybraný ten druhý — a od té chvíle jeho hodnotu.
Období s časem
DateRangePicker::make('shift') ->from('starts_at') ->until('ends_at') ->withTime() // oba konce vybírají datum i hodinu
Období na jedno kliknutí
DateRangePicker::make('period') ->presets() // dnes, tento týden, tento měsíc, posledních 30 dní, tento rok
DateRangePicker::make('period') ->presets([ 'Q1' => ['2026-01-01', '2026-03-31'], 'Q2' => ['2026-04-01', '2026-06-30'], ])
Vlastní sada nahradí vestavěnou. Každá hodnota je cokoli, co umí naparsovat Carbon.
Přístup k pickerům
DateRangePicker::make('validity') ->configurePickers(fn (DateTimePicker $picker) => $picker ->firstDayOfWeek(1) ->disabledDates(['2026-12-24', '2026-12-25']))
Callback proběhne jednou za každý konec s jeho pickerem — únikový východ pro vše, co tato třída znovu nevystavuje.
Rozšířený příklad
use Livewire\Component;use NyonCode\WireForms\Components\DateRangePicker;use NyonCode\WireForms\Components\TextInput;use NyonCode\WireForms\Forms\Form;use NyonCode\WireForms\Forms\WithForms; class EditContract extends Component{ use WithForms; public array $data = []; public function mount(Contract $contract): void { $this->form->fill($contract->attributesToArray()); } public function form(Form $form): Form { return $form ->model(Contract::class) ->statePath('data') ->schema([ TextInput::make('number')->required(), DateRangePicker::make('validity') ->label('Platnost') ->from('valid_from') ->until('valid_to') ->minDate(today()) ->presets() ->required(), ]); }}
fill() přečte oba sloupce ze záznamu, protože jsou to běžná pole, a save() je
stejnou cestou zapíše zpátky.
API DateRangePicker
Část pro rozsah. Všechno, co umí jeden konec — kalendář, nativní fallback,
formát, zakázané dny — patří DateTimePickeru a dosáhnete
na to přes configurePickers().
->from(string $name) // sloupec začátku — výchozí '{name}_from'->until(string $name) // sloupec konce — výchozí '{name}_to'->fromLabel(?string $label) // výchozí: přeložené „Od"->untilLabel(?string $label) // výchozí: přeložené „Do"->minDate(string|DateTimeInterface|Closure|null $date) // fn ($get) => … pro reaktivní mez->maxDate(string|DateTimeInterface|Closure|null $date)->displayFormat(?string $format) // tokeny PHP date(); uloženou hodnotu neovlivní->withTime(bool $condition = true) // oba konce vybírají datum i čas->required(bool $condition = true) // vyžaduje oba konce->presets(array $presets = []) // ['popisek' => [od, do], …]; prázdné = vestavěná sada->configurePickers(?Closure $callback) // fn (DateTimePicker $picker) => …, jednou za konec
A co rozsah odpoví sám o sobě — včetně obou pickerů, pro volajícího, který potřebuje sáhnout přímo na jeden z nich:
->getFromName(): string->getUntilName(): string->getFromPicker(): DateTimePicker->getUntilPicker(): DateTimePicker->hasPresets(): bool->getPresets(): array // ['popisek' => ['Y-m-d', 'Y-m-d'], …]
Související
- DateTimePicker — pole, kterým jsou oba konce
- Formulářová pole — sdílené API pole
- Validace — kde se pravidlo
after_or_equalpřidává k vašim