rawand201/filament-connection-badge
Drop-in connection status badge for Filament panels. Shows live signal bars in the topbar, ping graph on hover, and optional full-screen offline overlay. Works with Filament v4/v5, matches theme/dark mode, supports RTL and translations.
composer require rawand201/filament-connection-badge
php artisan filament:assets
Default Integration:
panels::user-menu.before hook (same as PanelsRenderHook::USER_MENU_BEFORE).FILAMENT_CONNECTION_BADGE_RENDER_HOOK in .env (e.g., panels::topbar.end).Ping Monitoring:
/_filament-connection-badge/ping endpoint (configurable via ping_url).// app/Http/Controllers/CustomPingController.php
public function __invoke()
{
return response()->json([
'ok' => true,
'ts' => now()->timestamp(),
'custom_data' => ['api' => 'healthy'], // Extend payload
]);
}
'ping_url' => '/custom-ping-endpoint',
Permission-Gated Access:
can() check:
'permission' => 'viewConnectionBadge', // Must match a Gate::define() call
Gate::define('viewConnectionBadge', function ($user) {
return $user->isAdmin(); // Example condition
});
Multi-Panel Support:
protected static ?string $badgeEnabled = null; // Override in Panel class
ping_url per panel via a trait or service provider:
// In a Panel service provider
FilamentConnectionBadge::configureForPanel($panelClass, [
'ping_url' => '/panel-specific-ping',
]);
Localization:
php artisan vendor:publish --tag="filament-connection-badge-translations"
resources/lang/es/es.json) and merge into the published translations.Custom Tooltip Content:
php artisan vendor:publish --tag="filament-connection-badge-views"
resources/views/vendor/filament-connection-badge/tooltip.blade.php to include additional metrics or UI elements.Theming:
.fcb-* classes in your panel’s CSS:
/* Example: Change offline color */
.fcb-offline {
--color: var(--danger-500);
}
php artisan vendor:publish --tag="filament-connection-badge-assets"
Offline Overlay Customization:
'show_overlay' => false,
--tag=filament-connection-badge-views) to add a custom message or actions.Testing:
public function test_ping_endpoint()
{
$response = $this->getJson('/_filament-connection-badge/ping');
$response->assertOk()->assertJsonStructure(['ok', 'ts']);
}
actingAs() and browser testing to verify the badge renders and updates correctly:
$this->actingAs(User::factory()->create())
->get('/filament/admin/resources')
->assertSee('fcb-badge');
Badge Not Appearing:
php artisan filament:assets and clear cache (php artisan optimize:clear).window.Alpine).Ping Endpoint 404:
enabled = false or missing middleware..env:
FILAMENT_CONNECTION_BADGE_ENABLED=true
php artisan route:list | grep filament-connection-badge to confirm the route exists.Permission Denied (403):
permission is set but the user lacks the ability.$user->givePermissionTo('viewConnectionBadge'); // If using Laravel Nova permissions
High Latency or Packet Loss:
/favicon.ico or a dedicated ping route):
'ping_url' => '/favicon.ico',
Overlay Not Dismissing:
online event listener from firing.navigator.onLine is supported (it is in all modern browsers).RTL Issues:
margin-inline-start) or wrap text in <span dir="ltr">.Log Ping Data:
// resources/js/filament-connection-badge.js (published via --tag=assets)
window.addEventListener('alpine:init', () => {
Alpine.data('connectionBadge', () => ({
// ... existing code ...
pingSamples: [],
logSamples() {
console.log('Ping samples:', this.pingSamples);
},
}));
});
Simulate Offline State:
Application > Service Workers > Offline) or JavaScript:
// Simulate offline
window.dispatchEvent(new Event('offline'));
// Simulate online
window.dispatchEvent(new Event('online'));
Inspect Network Requests:
ping endpoint in the Network tab to verify:
Cache-Control: no-store).{ "ok": true, "ts": 12345 }).Throttling:
FILAMENT_CONNECTION_BADGE_THROTTLE to limit ping frequency (e.g., 60,1 = 60 requests per minute).Ping URL Security:
/ping) to prevent abuse. Use middleware like auth or throttle:
'route' => [
'middleware' => ['web', 'auth', 'throttle:60,1'],
],
Dark Mode:
--success-500). Override via CSS if needed:
.fcb-full {
--color: var(--gray-800); /* Force a specific color */
}
Multi-Language Fallback:
{
"connection_badge": {
"offline": "
How can I help you explore Laravel packages today?