K

Core

ListWidget

Krátký feed posledních záznamů — widget, který po statistice „kolik“ odpoví na „které“, a položka, ze které je každá řádka složená.

Na této stránce

Panel, po kterém dashboard sáhne po svých číslech. „37 nových objednávek“ je ta statistika; které objednávky je tohle. Deset řádků s názvem, detailem a časem — posledních pár záznamů, posledních pár věcí, co se staly.

use NyonCode\WireCore\Widgets\ListWidget;

Jak to funguje

Proč ne tabulka. TableWidget odpovídá na větší verzi téže otázky a přináší s sebou celý aparát tabulky: sloupce, řazení, stránkování, toolbar, vlastní Livewire komponentu. Deset řádků typu název-a-čas nic z toho nepotřebuje a tabulka zmenšená, dokud se nevejde do karty dashboardu, je pořád tabulka. Po TableWidget sáhněte, když má čtenář s řádky pracovat; po tomhle, když je má vidět.

Čisté značkování. Žádný JavaScript, žádné plátno, žádný round trip na vykreslení. Položka s URL je opravdový <a>, takže feed funguje i s vypnutým JavaScriptem a prostřední tlačítko otevře panel.

Odkaz pokrývá celou položku. URL udělá odkaz ze samotné řádky, ne z něčeho uvnitř ní — odkaz obalený jen kolem názvu dá ukazovacímu zařízení cíl vysoký tři pixely. newTab() s sebou nese rel="noopener noreferrer", což není ozdoba: bez noopener může otevřená stránka sáhnout zpět přes window.opener.

Barva tónuje kolečko, ne text. Barva položky jde na kolečko ikony. Feed se čte jako sloupec vět a obarvit ty věty z něj udělá duhu; obarvit vedle každé z nich kolečko o 32 pixelech nechá „selhalo“ skenovatelné a text textem. Obě třídy pocházejí z kanonické palety, takže se název dodaný volajícím nikdy nedostane do Tailwindu.

Odkud se bere série. items() bere pole nebo closure. Closure dostane aktivní klíč filtru a běží při každém renderu — viz Filtry.

Past. Žádné maxItems() neexistuje. Widget, který by sérii ořezával, by volajícímu dovolil načíst tisíc řádků kvůli vykreslení pěti; místo, které ví, kolik jich je potřeba, je dotaz — tam limit patří.

Základní použití

ListWidget::make()
->heading('Recent orders')
->items([
ListItem::make('#1042')->description('Acme s.r.o.')->meta('2 minutes ago'),
ListItem::make('#1041')->description('Bravo a.s.')->meta('18 minutes ago'),
])

Položky, které někam vedou

ListItem::make('#1042')
->description('Acme s.r.o.')
->url(route('orders.show', $order))
->newTab() // target="_blank" + rel="noopener noreferrer"

Stav jedním pohledem

Ikona na tónovaném kolečku je to, co dělá feed skenovatelný bez čtení:

ListItem::make('Payment failed')
->description('Order #1042 — card declined')
->icon('outline:exclamation-triangle')
->color('danger')

Oddělovače

Vlasové linky mezi položkami jsou zapnuté. Vypněte je pro kartu, která je už tak hustá:

ListWidget::make()->items($items)->dividers(false)

Prázdný stav

ListWidget::make()
->items(fn () => $this->recentOrders())
->emptyState('No orders yet today.')

Předání null vrátí výchozí text (Není co zobrazit., přeložený).

Rozšířený příklad

namespace App\Dashboards;
 
use App\Models\Order;
use NyonCode\WireCore\Widgets\Dashboard;
use NyonCode\WireCore\Widgets\ListItem;
use NyonCode\WireCore\Widgets\ListWidget;
 
class OperationsDashboard extends Dashboard
{
public function widgets(): array
{
return [
ListWidget::make()
->heading('Recent orders')
->description('The last ten, newest first')
->pollingInterval('30s')
->items(fn () => Order::with('customer')
->latest()
->limit(10) // limit patří dotazu
->get()
->map(fn (Order $order) => ListItem::make($order->reference)
->description($order->customer->name)
->meta($order->created_at->diffForHumans())
->icon($order->status->icon())
->color($order->status->color())
->url(route('orders.show', $order)))
->all())
->emptyState('No orders yet today.'),
];
}
}

ListWidget API

->dividers(bool $condition = true) // vlasová linka mezi položkami — výchozí true
->hasDividers(): bool

Vše ostatní, co seznamový widget bere, je sdílené a zdokumentované centrálně: items(), emptyState(), filter(), lazy(), heading(), columnSpan(), pollingInterval() a settery autorizace jsou na základní třídě widgetu.


ListItem

Jedna položka: co se stalo, volitelně kdy a volitelně kam jít se na to podívat.

use NyonCode\WireCore\Widgets\ListItem;

Úplný příklad

ListItem::make('Order #1042')
->description('Acme s.r.o. — 12 400 Kč')
->meta('2 minutes ago')
->icon('outline:shopping-cart')
->color('success')
->url(route('orders.show', $order))
->newTab()
->extraAttributes(['data-testid' => 'order-1042'])

ListItem API

Vytváří se přes ListItem::make(string $title).

->description(?string $description) // druhý řádek pod názvem
->meta(?string $meta) // doprava zarovnaná poznámka — čas, počet, stavové slovo
->icon(string|Icon|null $icon) // ikona na tónovaném kolečku
->color(?string $color) // libovolný klíč palety — tónuje kolečko
->url(?string $url) // udělá z celé položky odkaz
->newTab(bool $condition = true) // otevřít v novém panelu, s rel="noopener noreferrer"
->extraAttributes(array $attrs) // vlastní HTML atributy na položce
->getTitle(): string
->getDescription(): ?string
->getMeta(): ?string
->getIcon(): ?string
->getColor(): ?string
->getUrl(): ?string
->opensInNewTab(): bool

Související

  • Tabulky a vlastní pohledyTableWidget, když se s řádky má pracovat, ne je jen číst
  • Progress — druhý čistě CSS widget, pro čísla mířící k cíli
  • Notifikace — druhý feed v tomhle frameworku, a jiný
  • Widgety — sdílený základ: polling, filtry, odklad, autorizace