Widgets
Un Widget es una tarjeta de estadística en el dashboard del panel: un valor, calculado en vivo en cada petición, con color, icono y descripción opcionales. Se registran en el Panel, no en un Resource:
php
$panels->register(
Panel::make('admin')
->widgets([
Widget::make('total_posts')
->label('Total Posts')
->value(fn (): int => Post::count())
->description('All time')
->icon('document-text'),
Widget::make('published_posts')
->label('Published Posts')
->value(fn (): int => Post::where('is_published', true)->count())
->color('success'),
])
);API
| Método | Descripción |
|---|---|
make(string $name) | Identificador interno del widget. |
label(string|Closure $label) | Título de la tarjeta. Por defecto, Str::headline($name). Una closure permite traducirlo. |
value(Closure $callback) | Calcula el valor mostrado. Se ejecuta en cada petición del dashboard, y no hay caché por defecto. |
color(string|Closure $color) | Color de la tarjeta. Como closure, recibe el valor ya calculado (fn (mixed $value) => ...). |
description(string|Closure $description) | Texto secundario bajo el valor. Misma regla que color() cuando es una closure. |
icon(string $icon) | Véase la lista de iconos disponibles en Acciones. |
visible(Closure $callback) | Si devuelve falso, el widget no se muestra. Se evalúa en cada petición. |
color() y description() aceptan un valor fijo o una closure que depende del propio valor del widget, útil para cambiar el color según si la cifra es buena o mala sin duplicar la lógica de value().
Los widgets de un Panel aparecen todos juntos en el dashboard. Los que tienen visible() se filtran por usuario, y como la closure se evalúa en cada petición, puede depender del usuario autenticado:
php
Widget::make('my_pending')
->label('My pending tasks')
->value(fn (): int => auth()->user()->tasks()->pending()->count())
->visible(fn (): bool => auth()->user()->can('tasks.view'))Un widget con visible() falso tampoco se incluye en la respuesta de la API del dashboard.