Core
Tabs
Lišta záložek nad sadou panelů, přepínaná v prohlížeči — každý panel zůstává v DOM, takže je validace vidí všechny.
Na této stránce
Lišta záložek nad sadou panelů. Sáhni po Tabs, když jsou skupiny dlouhého
formuláře alternativy — Profil / Předvolby / Zabezpečení — a ne posloupnost,
kterou od někoho čekáte projít po pořádku. Když je to posloupnost, použijte
Wizard.
use NyonCode\WireCore\Foundation\Schema\Tab;use NyonCode\WireCore\Foundation\Schema\Tabs;
Jak to funguje
Tabs je lišta, každý Tab je jeden panel. Obojí jsou layoutové komponenty —
žádná hodnota, žádná state path — takže se záložky dají přidávat, odebírat
i přeskládávat bez dotyku na data.
Přepínání je Alpine, ne Livewire. Aktivní index žije v x-data na obalu
a každý panel se přepíná přes x-show, takže změna záložky je okamžitá a nestojí
žádný round trip. Server se nikdy nedozví, která záložka je otevřená.
Každý panel zůstává v DOM. Tohle je ten důležitý důsledek a důvod, proč je tenhle layout ve formuláři bezpečný: vnořená pole se odesílají a validují dohromady bez ohledu na to, která záložka je vidět. Povinné pole na třetí záložce pořád blokuje odeslání a jeho chybová hláška se vykreslí v panelu, kam patří. Nic se nemusí nejdřív „aktivovat“.
Vykreslují se jen děti typu Tab. getTabs() profiltruje schéma na viditelné
instance Tab — cokoli jiného, co dáte přímo do Tabs::make()->schema([...]),
třeba holý TextInput, se tiše zahodí. Pole patří dovnitř záložky, nikdy
vedle ní.
Skryté záložky se odeberou a zbytek přeindexuje, takže activeTab(1) vždycky
znamená „druhá záložka, která se opravdu vykresluje“. Záložka skrytá podmínkou
nikdy nenechá v liště díru ani neposune aktivní panel na špatný obsah.
Popisek záložky spadne na Str::headline() jejího jména, takže Tab::make('Profile')
žádné ->label() nepotřebuje. Na úzkých obrazovkách se lišta scrolluje vodorovně
místo aby se zalamovala — zalomené záložky přirozené šířky vypadají jako dvě
roztřepené řady.
Tab rozkládá vlastní děti do gridu, jehož int varianta rozumí 1 až 4
sloupcům; na cokoli dalšího předejte mapu breakpointů (['default' => 1, 'lg' => 6]).
Základní použití
Tabs::make()->schema([ Tab::make('Profile')->schema([ TextInput::make('name')->required(), TextInput::make('email')->email()->required(), ]), Tab::make('Preferences')->schema([ Toggle::make('newsletter'), ]),])
Ikony, sloupce a výchozí záložka
Tabs::make() ->activeTab(1) // první otevřená je druhá — ->schema([ Tab::make('Profile') ->icon('outline:user') ->columns(2) ->schema([ TextInput::make('first_name'), TextInput::make('last_name'), ]), Tab::make('Security') ->icon('outline:lock-closed') ->schema([ TextInput::make('password')->password(), ]), ])
activeTab() je od nuly a počítá jen viditelné záložky.
Skrytí záložky
Záložka bere sdílené podmínky visible() / hidden(), takže celý panel může
patřit jedné roli a jiné ne — jedna podmínka místo téže podmínky na každém poli
uvnitř:
Tab::make('Billing') ->visible(fn (): bool => auth()->user()->can('manageBilling')) ->schema([...])
Rozšířený příklad
Obrazovka účtu ve skutečném Livewire hostu. Tři panely, jeden z nich podmíněný, všechny se při odeslání validují dohromady:
use Livewire\Component;use NyonCode\WireCore\Foundation\Schema\Tab;use NyonCode\WireCore\Foundation\Schema\Tabs;use NyonCode\WireForms\Components\TextInput;use NyonCode\WireForms\Components\Toggle;use NyonCode\WireForms\Forms\Form;use NyonCode\WireForms\Forms\WithForms; class EditAccount extends Component{ use WithForms; public ?array $data = []; public function form(Form $form): Form { return $form ->statePath('data') ->model(User::class) ->schema([ Tabs::make()->schema([ Tab::make('Profile') ->icon('outline:user') ->columns(2) ->schema([ TextInput::make('first_name')->required(), TextInput::make('last_name')->required(), TextInput::make('email')->email()->required()->columnSpanFull(), ]), Tab::make('Preferences') ->icon('outline:adjustments-horizontal') ->schema([ Toggle::make('newsletter'), Toggle::make('product_updates'), ]), Tab::make('Billing') ->icon('outline:credit-card') ->visible(fn (): bool => auth()->user()->can('manageBilling')) ->schema([ TextInput::make('vat_number'), ]), ]), ]) ->successMessage('Účet upraven'); } public function save(): void { $this->form->save(); }}
Uživatel bez oprávnění na fakturaci vidí dvě záložky a pole té třetí se ani nevykreslí, ani nevaliduje.
Tabs API
->activeTab(int $index) // od nuly, počítá jen viditelné záložky — výchozí 0->getActiveTab(): int->getTabs(): array // viditelné děti typu Tab, přeindexované
Tab API
->icon(string|Icon|null $icon) // vykreslí se v liště před labelem->columns(int|array $columns) // 1 (výchozí); int rozumí 1–4, nebo mapa breakpointů->getIcon(): ?string->getColumns(): int|array
Obojí nese společný layoutový povrch — label(), schema(), visible(),
hidden(), disabled(). Viz
Společné API layoutů.