Skip to content

Widgets ​

Un Widget és una targeta d'estadística al dashboard del panell: un valor, calculat en viu a cada petició, amb color, icona i descripció opcionals. Es registren al Panel, no a 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ètodeDescripció
make(string $name)Identificador intern del widget.
label(string|Closure $label)Títol de la targeta. Per defecte, Str::headline($name). Una closure permet traduir-lo.
value(Closure $callback)Calcula el valor mostrat. S'executa a cada petició del dashboard, i no hi ha caché per defecte.
color(string|Closure $color)Color de la targeta. Com a closure, rep el valor ja calculat (fn (mixed $value) => ...).
description(string|Closure $description)Text secundari sota el valor. Mateixa regla que color() quan és una closure.
icon(string $icon)Vegeu la llista d'icones disponibles a Accions.
visible(Closure $callback)Si retorna fals, el widget no es mostra. S'avalua a cada petició.

color() i description() accepten un valor fix o una closure que depèn del propi valor del widget, útil per canviar el color segons si la xifra és bona o dolenta sense duplicar la lògica de value().

Els widgets d'un Panel apareixen tots junts al dashboard. Els que tenen visible() es filtren per usuari, i com que el closure s'avalua a cada petició, pot dependre de l'usuari autenticat:

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 amb visible() fals tampoc s'inclou a la resposta de l'API del dashboard.