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(); + } }