Skip to content

Widgets ​

Un Widget est une carte de statistique sur le dashboard du panneau : une valeur, calculée en direct à chaque requête, avec couleur, icône et description facultatives. Les widgets s'enregistrent sur le Panel, pas sur 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éthodeDescription
make(string $name)Identifiant interne du widget.
label(string|Closure $label)Titre de la carte. Par défaut, Str::headline($name). Une closure permet de le traduire.
value(Closure $callback)Calcule la valeur affichée. S'exécute à chaque requête du dashboard, et il n'y a pas de cache par défaut.
color(string|Closure $color)Couleur de la carte. En closure, reçoit la valeur déjà calculée (fn (mixed $value) => ...).
description(string|Closure $description)Texte secondaire sous la valeur. Même règle que color() quand c'est une closure.
icon(string $icon)Voir la liste des icônes disponibles dans Actions.
visible(Closure $callback)S'il retourne faux, le widget n'est pas affiché. Évalué à chaque requête.

color() et description() acceptent une valeur fixe ou une closure qui dépend de la valeur propre du widget, utile pour changer la couleur selon que le chiffre est bon ou mauvais sans dupliquer la logique de value().

Les widgets d'un Panel apparaissent tous ensemble sur le dashboard. Ceux qui ont visible() sont filtrés par utilisateur, et comme la closure est évaluée à chaque requête, elle peut dépendre de l'utilisateur authentifié :

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 dont visible() est faux n'est pas non plus inclus dans la réponse de l'API du dashboard.