Skip to content

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étodoDescripció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.