Віджет статистики - кілька карток з числом, описом і міні-графіком.
php artisan make:filament-widget OrdersOverview --stats-overview
use Filament\Support\Icons\Heroicon;
use Filament\Widgets\StatsOverviewWidget;
use Filament\Widgets\StatsOverviewWidget\Stat;
class OrdersOverview extends StatsOverviewWidget
{
protected ?string $pollingInterval = '60s';
protected function getStats(): array
{
$today = Order::whereDate('created_at', today());
return [
Stat::make('Замовлень сьогодні', $today->count())
->description('+12% до вчора')
->descriptionIcon(Heroicon::ArrowTrendingUp)
->color('success')
->chart([7, 3, 4, 5, 6, 3, 9]),
Stat::make('Виручка сьогодні', Number::currency($today->sum('total'), 'UAH', 'uk')),
Stat::make('Нових клієнтів', Customer::whereDate('created_at', today())->count()),
];
}
}
Віджети з каталогу app/Filament/Widgets автоматично з'являються на дашборді панелі.
Корисні налаштування:
protected static ?int $sort = 1;- порядок на дашборді;protected int | string | array $columnSpan = 'full';- ширина;public static function canView(): bool- кому показувати;protected static bool $isLazy = false;- вимкнути ліниве завантаження.
Дві важливі поведінки за замовчуванням:
- опитування кожні 5 секунд. Віджет статистики (і графік) сам оновлюється раз на 5 секунд. Якщо в
getStats()важкі агрегати по великих таблицях, кожен відкритий дашборд створює постійне навантаження на базу. Інтервал варто збільшити ($pollingInterval = '60s') або вимкнути (null); - ліниве завантаження. Віджети завантажуються окремим запитом після сторінки, тож повільний віджет не блокує решту дашборда.
Пастки:
canView()ховає віджет з дашборда, але якщо той самий віджет вбудовано на іншу сторінку, умову треба перевірити й там;- важкі метрики варто кешувати (
Cache::rememberна кілька хвилин) - точність до секунди на дашборді рідко потрібна; - число без форматування (
1234567) погано читається: кращеNumber::format()чиNumber::abbreviate().