filament/widgets
A set of dashboard widgets for Filament admin panels, providing ready-to-use components for stats, charts, tables, and custom widget layouts. Designed to plug into Filament quickly and keep your Laravel dashboards clean and modular.
Installation
composer require filament/widgets
Publish the config (if needed):
php artisan vendor:publish --provider="Filament\Widgets\WidgetServiceProvider"
First Widget
Create a widget class (e.g., app/Filament/Widgets/StatsOverview.php):
namespace App\Filament\Widgets;
use Filament\Widgets\Widget;
class StatsOverview extends Widget
{
protected static string $view = 'filament.widgets.stats-overview';
}
Register it in app/Providers/Filament/WidgetServiceProvider.php:
public function register(): void
{
Widget::register(StatsOverview::class);
}
First Usage
Add the widget to a Livewire component (e.g., app/Filament/Pages/Dashboard.php):
use App\Filament\Widgets\StatsOverview;
public function widgets(): array
{
return [
StatsOverview::class,
];
}
View File
Create a Blade view at resources/views/filament/widgets/stats-overview.blade.php:
<x-filament::widget>
<!-- Your widget content -->
</x-filament::widget>
Grouping Widgets
Use Widget::group() to categorize widgets (e.g., Analytics, System).
Widget::group('Analytics', [
StatsOverview::class,
TrafficSources::class,
]);
Dynamic Widgets Fetch widgets dynamically from a database or API:
public function widgets(): array
{
return Widget::query()
->where('user_id', auth()->id())
->get()
->map(fn ($widget) => $widget->class);
}
Layout Customization
Override default widget layout in resources/views/vendor/filament/widgets/layouts/default.blade.php.
Conditional Rendering
Use shouldRender() to control visibility:
public function shouldRender(): bool
{
return auth()->user()->can('view_dashboard');
}
Real-Time Updates
Extend Widget and use Livewire’s updates property for reactivity:
public ?string $updates = ['data'];
p-4, bg-white).resources/css/filament/widgets.css.use Filament\Widgets\Concerns\InteractsWithData;
class BaseWidget extends Widget
{
use InteractsWithData;
}
Widget Registration Order
Ensure widgets are registered before they’re used (e.g., in boot() of WidgetServiceProvider).
View Path Conflicts
If using custom view paths, explicitly set $view in the widget class to avoid autoloading issues.
Livewire Hooks
Widgets don’t automatically inherit Livewire hooks (e.g., mount, hydrate). Override them explicitly if needed.
Missing Widgets Check:
WidgetServiceProvider.Styling Issues
Use browser dev tools to inspect Filament’s default styles. Override with !important if necessary (sparingly).
shouldRender() to defer loading until needed.getData() if the source is static or rarely changes:
public function getData(): array
{
return Cache::remember('widget-data', now()->addHours(1), function () {
return $this->fetchDataFromDatabase();
});
}
Widget to create specialized widgets (e.g., ChartWidget, FormWidget).event(new WidgetRendered($this));
Http facade or Guzzle to fetch remote data in getData():
public function getData(): array
{
return Http::get('https://api.example.com/stats')->json();
}
filament.widgets.layout in config/filament.php:
'widgets' => [
'layout' => 'filament.widgets.layouts.custom',
],
Icon::make('heroicon-o-chart-bar')) in views.$widget = new StatsOverview();
$widget->setData(['value' => 100]);
$this->assertEquals(100, $widget->data['value']);
$this->livewire(Dashboard::class)
->assertSee('Widget Content');
How can I help you explore Laravel packages today?