Tabulka
Filtry
Wire Table poskytuje 5 vestavěných typů filtrů plus možnost postavit vlastní filtry. Filtry žijí v liště filtrů nad tabulkou a přetrvávají ve stavu Livewire přes $tableFilters. Tato stránka pokrývá tok a sdílené API; každý typ má svou vlastní stránku.
Na této stránce
Wire Table poskytuje 5 vestavěných typů filtrů plus možnost postavit vlastní
filtry. Filtry žijí v liště filtrů nad tabulkou a přetrvávají ve stavu Livewire
přes $tableFilters. Tato stránka pokrývá tok a sdílené API; každý typ má svou
vlastní stránku.
Typy filtrů
| Filtr | Použití pro |
|---|---|
| TextFilter | Textová shoda s operátorem (like, starts_with, …) |
| SelectFilter | Jednoduchý/vícenásobný výběr z options, relací nebo enumů |
| DateFilter | Jedno datum, rozsah dat nebo měsíc + rok |
| NumberRangeFilter | Min/max číselný rozsah |
| TernaryFilter | Trojstavový boolean (vše / true / false) |
Více
- Filtry relací a podřádků — filtrovat podle souvisejících modelů a hodnot podřádků
- Filtry na úrovni sloupce — inline inputy filtru v hlavičce sloupce
- Vlastní třída filtru — postavit vlastní komponentu filtru
- Vzory a recepty — kompletní příkladové lišty filtrů
Tok filtru
Table::filters([...])│├── Render: Komponenty filtrů v sidebar/header liště│ └── Každý filtr vykreslí svůj vlastní Blade pohled│├── Stav: pole $tableFilters ['name' => 'value', ...]│ └── Perzistováno ve stavu Livewire komponenty│└── Apply: Když se stav změní ├── Zavolá se callback apply() nebo query() každého filtru ├── Podmínky přidány do Eloquent Builderu └── Tabulka se znovu dotáže s aplikovanými filtry
Aplikace filtrů teče přes Core pipe ApplyFilters v pipeline QueryExecutoru.
Sdílené API filtru
Každý filtr dědí ze základní třídy Filter.
Factory a identita
Filter::make(string $name) // statická factory->label(?string $label) // zobrazovací popisek (auto-generovaný z názvu)->getName(): string->getLabel(): string
Vazba na sloupec
->column(string $column) // DB sloupec, na kterém filtrovat (výchozí $name)->getColumn(): string
Když column() není zavoláno, filtr použije svůj $name jako databázový sloupec.
Vlastní logika dotazu
->query(Closure $fn) // vlastní callback dotazu
Signatura callbacku je function (Builder $query, mixed $value): Builder — musí vrátit query builder (runtime přiřadí $query návratové hodnotě callbacku).
SelectFilter::make('activity_level') ->options([...]) ->query(fn (Builder $query, string $value) => match ($value) { 'active' => $query->where('last_active_at', '>=', now()->subDays(7)), 'inactive' => $query->where('last_active_at', '<', now()->subDays(30)), 'new' => $query->where('created_at', '>=', now()->subDays(7)), default => $query, })
Co obsahuje $value
Tvar závisí na typu filtru — rozsahový filtr předá pole, ternary předá skutečný boolean:
| Filtr | $value |
Příklad |
|---|---|---|
TextFilter |
string — co uživatel napsal |
'faktura' |
SelectFilter |
klíč option string|int |
'active' |
SelectFilter + ->multiple() |
array klíčů options |
['active', 'pending'] |
TernaryFilter |
bool — true pro Ano, false pro Ne |
false |
NumberRangeFilter |
array{min, max} — kterákoli strana může být '' |
['min' => '10', 'max' => ''] |
DateFilter |
datum jako string |
'2026-07-23' |
DateFilter + ->range() |
array{from, to} |
['from' => '2026-01-01', 'to' => ''] |
DateFilter + ->month() |
string 'YYYY-MM' |
'2026-07' |
Callback se volá jen když je filtr aktivní — prázdný stav (null, '',
[] nebo „Vše" u ternary) filtr vypne a do closure se vůbec nedostane, takže se
proti němu nemusíte bránit. Výjimkou jsou v jednom směru vícepolní filtry:
rozsah zůstává aktivní, dokud je vyplněná kterákoli strana, takže si každou
mez ověřte zvlášť.
Třetí argument nese syrový odeslaný stav před normalizací — pro vzácné případy, kdy callback potřebuje transportní podobu:
->query(function (Builder $query, mixed $value, mixed $raw) { … })
Viditelnost a oprávnění
->hidden(bool|Closure $hidden = true)->visible(bool|Closure $visible = true)->isHidden(): bool->permission(string $permission) // viditelné jen když má uživatel oprávnění
DateFilter::make('deleted_at') ->range() ->permission('view-deleted-records') SelectFilter::make('internal_status') ->options([...]) ->visible(fn () => auth()->user()->is_admin)
Výchozí hodnota
->default(mixed $value) // předvybráno při prvním načtení->getDefault(): mixed
SelectFilter::make('status') ->options([...]) ->default('active') // "active" předvybráno
Vícenásobný výběr
->multiple(bool $multiple = true)
Když je zapnuto, filtr přijímá pole hodnot a aplikuje whereIn().
Přizpůsobení pohledu
Neexistuje fluent setter ->view(). UI filtru přizpůsobte jedním ze dvou způsobů:
- Per typ filtru — přepište
render()ve vlastní podtříděFiltera nasměrujte ji na svůj Blade pohled (viz Vlastní třída filtru). - Pro celý projekt — publikujte pohledy balíčku a upravte partialy pod
resources/views/vendor/wire-table/tables/filters/(select,date,number-range,ternary,form-field).
php artisan vendor:publish --tag=wire-table::views
Indikátory filtrů
Aktivní filtry se vykreslí jako odstranitelné chipy pod toolbarem tabulky — každý chip ukazuje čitelný popisek a tlačítko ×, které vyčistí jen daný filtr. S více než jedním aktivním filtrem se vedle chipů objeví odkaz „Reset filters".
Výchozí popisky se generují per typ filtru:
| Filtr | Příklad chipu |
|---|---|
SelectFilter |
Status: Active (popisek option, ne surová hodnota) |
SelectFilter + multiple() |
Status: Active, Trial |
TernaryFilter |
Verified: Yes (labely true/false) |
NumberRangeFilter |
Price: 10 – 100, Price: ≥ 10, Price: ≤ 100 |
DateFilter |
Created: 2026-06-11 |
DateFilter + range() |
Created: 2026-06-01 – 2026-06-30 |
DateFilter + month() |
Billed: May 2026 (přeložený název měsíce) |
základní Filter |
Label: value |
Přizpůsobení chipu
SelectFilter::make('status') ->options([...]) ->indicator('Only active customers') // pevný popisek DateFilter::make('created_at') ->indicator(fn ($value) => 'Since '.$value) // closura: fn ($value, Filter $filter)
Vrácení null nebo prázdného řetězce z closury chip skryje, zatímco filtr zůstane
aplikovaný. Skryté/neautorizované filtry nikdy nevytvoří chipy.
API komponenty
$component->getActiveFilterIndicators(); // ['status' => 'Status: Active', ...]$component->removeTableFilter('status'); // vyčistit jeden filtr (× tlačítko chipu)$component->resetTableFilters(); // vyčistit všechny filtry + hledání
Filtry hlavičky sloupce tvoří stejné chipy vedle panelových
filtrů (jsou to také kanonické objekty Filter), s vlastními handlery:
$component->getActiveColumnFilterIndicators(); // ['name' => 'Name: Widget', ...]$component->removeColumnFilter('name'); // vyčistit jeden filtr sloupce
Mobil
Lišta filtrů a menu přepínání sloupců se na telefonu otevřou jako bottom sheet.
Konfigurujte globálně přes blok wire-core.mobile, nebo per komponenta pomocí
->sheetOnMobile() / ->mobileBreakpoint() — viz
mobilní prezentace.