From e1d7b3a0d5bc3eb41b1d40c25bbaee4016cc0db0 Mon Sep 17 00:00:00 2001 From: Paula Araujo Date: Thu, 18 Sep 2025 16:42:08 -0300 Subject: [PATCH] feat(admin): widgets per source --- .../Pages/ListInboundWebhooks.php | 9 ++++++ .../Widgets/InboundWebhookStatsBySource.php | 32 +++++++++++++++++++ src/FilamentWebhookPlugin.php | 5 +++ src/Models/InboundWebhook.php | 7 ++++ 4 files changed, 53 insertions(+) create mode 100644 src/Filament/Admin/Widgets/InboundWebhookStatsBySource.php diff --git a/src/Filament/Admin/Resources/InboundWebhook/Pages/ListInboundWebhooks.php b/src/Filament/Admin/Resources/InboundWebhook/Pages/ListInboundWebhooks.php index 0a025b1..407b99e 100644 --- a/src/Filament/Admin/Resources/InboundWebhook/Pages/ListInboundWebhooks.php +++ b/src/Filament/Admin/Resources/InboundWebhook/Pages/ListInboundWebhooks.php @@ -5,6 +5,8 @@ namespace Basement\Webhooks\Filament\Admin\Resources\InboundWebhook\Pages; use Basement\Webhooks\Filament\Admin\Resources\InboundWebhook\InboundWebhookResource; +use Basement\Webhooks\Filament\Admin\Widgets\InboundWebhookStatsByProviderPercentage; +use Basement\Webhooks\Filament\Admin\Widgets\InboundWebhookStatsBySource; use Filament\Actions\BulkActionGroup; use Filament\Actions\DeleteAction; use Filament\Actions\DeleteBulkAction; @@ -20,6 +22,13 @@ final class ListInboundWebhooks extends ListRecords { protected static string $resource = InboundWebhookResource::class; + protected function getHeaderWidgets(): array + { + return [ + InboundWebhookStatsBySource::make(), + ]; + } + public function table(Table $table): Table { return $table diff --git a/src/Filament/Admin/Widgets/InboundWebhookStatsBySource.php b/src/Filament/Admin/Widgets/InboundWebhookStatsBySource.php new file mode 100644 index 0000000..f833cdb --- /dev/null +++ b/src/Filament/Admin/Widgets/InboundWebhookStatsBySource.php @@ -0,0 +1,32 @@ +getInboundWebhooksStats(); + } + + private function getInboundWebhooksStats(): array + { + $totalWebhooks = InboundWebhook::count(); + $stats = []; + + foreach (InboundWebhookSource::cases() as $source) { + $count = InboundWebhook::where('source', $source->value)->count(); + $percentage = $totalWebhooks > 0 ? round(($count / $totalWebhooks) * 100, 2) : 0; + $stats[] = Stat::make("{$source->name}","{$percentage}%") + ->descriptionIcon($source->getIcon()) + ->description("{$count} de {$totalWebhooks} webhooks") + ->color($source->getColor()); + } + return $stats; + } +} diff --git a/src/FilamentWebhookPlugin.php b/src/FilamentWebhookPlugin.php index e35ca0e..88b1201 100644 --- a/src/FilamentWebhookPlugin.php +++ b/src/FilamentWebhookPlugin.php @@ -5,6 +5,8 @@ namespace Basement\Webhooks; use Basement\Webhooks\Filament\Admin\Resources\InboundWebhook\InboundWebhookResource; +use Basement\Webhooks\Filament\Admin\Widgets\InboundWebhookStatsByProviderPercentage; +use Basement\Webhooks\Filament\Admin\Widgets\InboundWebhookStatsBySource; use Filament\Contracts\Plugin; use Filament\Panel; @@ -25,6 +27,9 @@ public function register(Panel $panel): void $panel->resources([ InboundWebhookResource::class, ]); + $panel->widgets([ + InboundWebhookStatsBySource::make(), + ]); } public function boot(Panel $panel): void {} diff --git a/src/Models/InboundWebhook.php b/src/Models/InboundWebhook.php index 7910315..a90cfb6 100644 --- a/src/Models/InboundWebhook.php +++ b/src/Models/InboundWebhook.php @@ -4,11 +4,13 @@ namespace Basement\Webhooks\Models; +use Basement\Webhooks\Database\Factories\InboundWebhookFactory; use Illuminate\Database\Eloquent\Concerns\HasUuids; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; + final class InboundWebhook extends Model { use HasFactory; @@ -30,4 +32,9 @@ protected function casts(): array 'source' => config('filament-webhooks.providers_enum'), ]; } + + protected static function newFactory(): InboundWebhookFactory + { + return InboundWebhookFactory::new(); + } }