K

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

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): Buildermusí 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 booltrue 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ě Filter a 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.