K

Tabulka

Seskupení řádků

Řádky shromážděné pod hlavičkou podle hodnoty sloupce, s mezisoučty za skupinu nad obvyklou patičkou.

Na této stránce

Seskupte řádky podle hodnoty sloupce: tabulka seřadí záznamy tak, aby skupiny zůstaly souvislé, vykreslí hlavičkový řádek pro každou skupinu a přidá řádky mezisoučtů za skupinu pro každý sloupec se souhrnem — navíc k obvyklé patičce s celkovým součtem.

Rychlý start

use NyonCode\WireTable\Columns\TextColumn;
use NyonCode\WireTable\Table;
 
public function table(Table $table): Table
{
return $table
->model(Invoice::class)
->columns([
TextColumn::make('number')->label('Invoice'),
TextColumn::make('customer')->label('Customer'),
TextColumn::make('total')
->suffix(' Kč')
->summaryDecimals(0)
->summarizeSum('Sum'),
])
->groupBy('customer');
}
┌──────────────────────────────┐
│ Acme │ ← hlavička skupiny
├────────────┬─────────────────┤
│ INV-2 │ 250 Kč │
│ INV-4 │ 25 Kč │
│ Sum: │ 275 Kč │ ← mezisoučet skupiny
├──────────────────────────────┤
│ Beta │
│ INV-1 │ 100 Kč │
│ INV-3 │ 50 Kč │
│ Sum: │ 150 Kč │
├────────────┼─────────────────┤
│ Sum: │ 425 Kč │ ← patička s celkovým součtem
└────────────┴─────────────────┘

Konfigurace

Metoda Efekt
groupBy(string $column) Seskupit řádky podle přímého sloupce na modelu
groupLabel(string|Closure) Přizpůsobit popisek hlavičky skupiny
groupSummaries(bool) Přepnout řádky mezisoučtů za skupinu (výchozí zapnuto)
collapsibleGroups(bool) Nechat uživatele skupinu sbalit (výchozí vypnuto)

Popisky skupin

Hlavička ve výchozím stavu zobrazuje surovou hodnotu skupiny. Řetězcový popisek se stane prefixem; closura dostane hodnotu a první záznam skupiny:

->groupBy('customer')->groupLabel('Customer') // "Customer: Acme"
->groupBy('status')->groupLabel(fn ($value) => match ($value) {
'paid' => '✓ Paid',
'pending' => '⏳ Pending',
default => ucfirst((string) $value),
})

Prázdné a null hodnoty skupiny se vykreslí jako .

Řazení

Seskupení předřadí vzestupné řazení na sloupci skupiny, takže jakékoli jiné řazení — nakonfigurovaný defaultSort() nebo uživatelovo kliknutí na hlavičku — se aplikuje uvnitř každé skupiny. Řazení podle samotného sloupce skupiny převezme kontrolu úplně: uživatelův směr pak řídí pořadí skupin (a skupiny zůstanou souvislé, protože řazení podle sloupce skupiny řadí skupiny z definice).

Mezisoučty

Řádky mezisoučtů skupiny se objeví automaticky pro každý sloupec se souhrnem; platí všechny typy agregací a formátování. Mezisoučty se počítají v paměti z řádků skupiny na aktuální stránce.

TextColumn::make('total')
->summaryDecimals(0)
->summarizeSum('Sum') // → řádek mezisoučtu skupiny + patička celkového součtu
->summarizeAvg('Average'), // každý souhrn dostane svůj vlastní řádek mezisoučtu

Řádky mezisoučtů (při zachování hlaviček a patičky) vypnete pomocí ->groupSummaries(false).

Sbalitelné skupiny

collapsibleGroups() přidá na každou hlavičku skupiny šipku. Kliknutí sbalí řádky té skupiny a nechá na obrazovce hlavičku a mezisoučet skupiny:

->groupBy('customer')
->collapsibleGroups();

Řádky sbalené skupiny se vůbec nevykreslí — nejsou schované přes CSS ani odsunuté mimo obrazovku. To je celý smysl, ne implementační detail: několik chování tabulky čte své řádky přímo z DOM (klávesová navigace, výběr rozsahu, fill handle, živá synchronizace buněk) a přes sbalení fungují dál, protože seznam, po kterém chodí, zůstává v souladu s tím, co je na obrazovce. Je to zároveň důvod, proč tenhle framework nenabízí virtuální scrollování: vykreslovat jen viewport by vyžadovalo paralelní cestu pro každé z těch čtyř chování a tři z nich selhávají tiše — fill, který nic nezapíše, rozsah, který přeskočí řádky.

Viditelné zůstane to, kvůli čemu má smysl sbalenou skupinu číst: její hlavička a řádek mezisoučtu. Dvacet faktur se sbalí a součet za zákazníka je pořád vidět.

Sbalená množina je klíčovaná hodnotou skupiny, ne řádky v ní, takže skupina zůstane sbalená, i když se její obsah změní — filtr, který vymění všechny řádky ve skupině Overdue, ji nechá sbalenou, což je přesně to, o co uživatel žádal. Žije ve stavu tabulky pod rows.collapsedGroups, takže přežije Livewire round trip a je jednou z věcí, které nese uložený pohled.

use Livewire\Component;
use NyonCode\WireTable\Columns\TextColumn;
use NyonCode\WireTable\Concerns\WithTable;
use NyonCode\WireTable\Table;
 
class ListInvoices extends Component
{
use WithTable;
 
public function table(Table $table): Table
{
return $table
->model(Invoice::class)
->perPage(100)
->columns([
TextColumn::make('number')->label('Invoice'),
TextColumn::make('issued_at')->date(),
TextColumn::make('total')
->summaryDecimals(0)
->summarizeSum('Sum'),
])
->groupBy('customer')
->collapsibleGroups();
}
}

Sbalování dává smysl jen na seskupené tabulce: collapsibleGroups() bez groupBy() nevykreslí žádné přepínače, místo aby chybovalo, a hasCollapsibleGroups() vrací false. Řízení z vlastního view jsou dvě metody na komponentě — toggleGroup(string $group) a isGroupCollapsed(string $group) — obě klíčované toutéž hodnotou skupiny, kterou ukazuje hlavička.

Omezení

  • Jen přímé sloupce. groupBy('customer.name') vyhodí chybu — seskupení musí seřadit dotaz podle sloupce skupiny, což cesta relace bez joinu nedokáže. Vystavte související hodnotu na dotazu (join + select alias) a seskupte podle aliasu.
  • Stránkování rozděluje skupiny. Skupina překračující hranici stránky ukáže částečný mezisoučet na každé stránce. Pro striktní účetní reporty vypněte stránkování (->paginated(false)) nebo zvyšte perPage().
  • Layout desktopové tabulky. Hlavičky/mezisoučty skupin se vykreslují ve standardním layoutu tabulky; naskládaný mobilní kartový layout seskupení ignoruje.
  • Exporty obsahují datové řádky a celkové součty, ne řádky mezisoučtů skupin.

Související dokumentace