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