Add superadmin ops health dashboard
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
<x-filament-panels::page>
|
||||
<div class="space-y-6">
|
||||
<x-filament::section>
|
||||
<p class="text-sm text-slate-600 dark:text-slate-300">
|
||||
{{ __('admin.ops_health.help') }}
|
||||
</p>
|
||||
</x-filament::section>
|
||||
</div>
|
||||
</x-filament-panels::page>
|
||||
115
resources/views/filament/widgets/queue-health.blade.php
Normal file
115
resources/views/filament/widgets/queue-health.blade.php
Normal file
@@ -0,0 +1,115 @@
|
||||
<x-filament-widgets::widget>
|
||||
<x-filament::section
|
||||
:heading="__('admin.ops_health.queue.heading')"
|
||||
:description="__('admin.ops_health.queue.description')"
|
||||
>
|
||||
<div class="flex flex-wrap items-center justify-between gap-3 text-xs text-slate-500 dark:text-slate-300">
|
||||
<div class="flex flex-wrap items-center gap-4">
|
||||
<span>
|
||||
{{ __('admin.ops_health.queue.connection') }}:
|
||||
<span class="font-semibold text-slate-700 dark:text-slate-100">{{ $connection }}</span>
|
||||
</span>
|
||||
<span>{{ $snapshotLabel }}</span>
|
||||
</div>
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<span class="rounded-full bg-slate-100 px-2 py-0.5 text-[10px] font-semibold text-slate-700 dark:bg-slate-800 dark:text-slate-200">
|
||||
{{ __('admin.ops_health.queue.alerts_heading') }}: {{ number_format($alertCount) }}
|
||||
</span>
|
||||
@if($stalledAssets > 0)
|
||||
<span class="rounded-full bg-amber-100 px-2 py-0.5 text-[10px] font-semibold text-amber-800 dark:bg-amber-400/20 dark:text-amber-200">
|
||||
{{ __('admin.ops_health.queue.stalled_assets', ['minutes' => $stalledMinutes]) }}:
|
||||
{{ number_format($stalledAssets) }}
|
||||
</span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if($snapshotMissing)
|
||||
<div class="mt-4 rounded-xl border border-dashed border-slate-200 bg-slate-50 p-4 text-sm text-slate-600 dark:border-white/10 dark:bg-slate-900/40 dark:text-slate-300">
|
||||
{{ __('admin.ops_health.queue.no_snapshot') }}
|
||||
</div>
|
||||
@else
|
||||
<div class="mt-4 grid gap-3">
|
||||
@forelse($queues as $queue)
|
||||
<div class="rounded-2xl border border-slate-200/70 bg-white/80 p-4 shadow-sm dark:border-white/10 dark:bg-slate-900/60">
|
||||
<div class="flex flex-wrap items-center justify-between gap-3">
|
||||
<div>
|
||||
<p class="text-sm font-semibold text-slate-700 dark:text-slate-100">{{ $queue['name'] }}</p>
|
||||
<p class="text-xs text-slate-500 dark:text-slate-400">
|
||||
{{ __('admin.ops_health.queue.thresholds') }}:
|
||||
@if($queue['warning'] || $queue['critical'])
|
||||
W {{ number_format($queue['warning']) }} / C {{ number_format($queue['critical']) }}
|
||||
@else
|
||||
-
|
||||
@endif
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex flex-wrap items-center gap-3 text-xs">
|
||||
<span class="text-slate-500 dark:text-slate-400">
|
||||
{{ __('admin.ops_health.queue.size') }}:
|
||||
<span class="font-semibold text-slate-700 dark:text-slate-100">{{ $queue['size_label'] }}</span>
|
||||
</span>
|
||||
<span class="text-slate-500 dark:text-slate-400">
|
||||
{{ __('admin.ops_health.queue.failed') }}:
|
||||
<span class="font-semibold text-slate-700 dark:text-slate-100">{{ $queue['failed_label'] }}</span>
|
||||
</span>
|
||||
<span @class([
|
||||
'rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide',
|
||||
'bg-emerald-100 text-emerald-800 dark:bg-emerald-400/20 dark:text-emerald-200' => $queue['severity'] === 'ok',
|
||||
'bg-amber-100 text-amber-800 dark:bg-amber-400/20 dark:text-amber-200' => $queue['severity'] === 'warning',
|
||||
'bg-rose-100 text-rose-800 dark:bg-rose-400/20 dark:text-rose-200' => $queue['severity'] === 'critical',
|
||||
'bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-200' => ! in_array($queue['severity'], ['ok', 'warning', 'critical'], true),
|
||||
])>
|
||||
{{ __('admin.ops_health.severity.'.$queue['severity']) }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<p class="text-sm text-slate-500 dark:text-slate-300">{{ __('admin.ops_health.queue.no_queues') }}</p>
|
||||
@endforelse
|
||||
</div>
|
||||
|
||||
@if($alertCount > 0)
|
||||
<div class="mt-4 grid gap-2">
|
||||
<p class="text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400">
|
||||
{{ __('admin.ops_health.queue.alerts_heading') }}
|
||||
</p>
|
||||
@foreach($alerts as $alert)
|
||||
<div class="flex flex-wrap items-center justify-between gap-2 rounded-xl border border-slate-200/70 bg-white/70 px-3 py-2 text-xs text-slate-600 dark:border-white/10 dark:bg-slate-900/50 dark:text-slate-200">
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
@if($alert['queue'])
|
||||
<span class="font-semibold text-slate-700 dark:text-slate-100">{{ $alert['queue'] }}</span>
|
||||
@endif
|
||||
<span class="text-slate-500 dark:text-slate-400">
|
||||
@switch($alert['type'])
|
||||
@case('size')
|
||||
{{ __('admin.ops_health.alert_types.size', ['size' => number_format($alert['size'] ?? 0)]) }}
|
||||
@break
|
||||
@case('failed_jobs')
|
||||
{{ __('admin.ops_health.alert_types.failed_jobs', ['failed' => number_format($alert['failed'] ?? 0)]) }}
|
||||
@break
|
||||
@case('pending_assets')
|
||||
{{ __('admin.ops_health.alert_types.pending_assets', ['count' => number_format($alert['count'] ?? 0), 'minutes' => $alert['older_than_minutes'] ?? $stalledMinutes]) }}
|
||||
@break
|
||||
@default
|
||||
{{ __('admin.ops_health.snapshot_missing') }}
|
||||
@endswitch
|
||||
</span>
|
||||
</div>
|
||||
<span @class([
|
||||
'rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide',
|
||||
'bg-emerald-100 text-emerald-800 dark:bg-emerald-400/20 dark:text-emerald-200' => $alert['severity'] === 'ok',
|
||||
'bg-amber-100 text-amber-800 dark:bg-amber-400/20 dark:text-amber-200' => $alert['severity'] === 'warning',
|
||||
'bg-rose-100 text-rose-800 dark:bg-rose-400/20 dark:text-rose-200' => $alert['severity'] === 'critical',
|
||||
'bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-200' => ! in_array($alert['severity'], ['ok', 'warning', 'critical'], true),
|
||||
])>
|
||||
{{ __('admin.ops_health.severity.'.$alert['severity']) }}
|
||||
</span>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
@endif
|
||||
</x-filament::section>
|
||||
</x-filament-widgets::widget>
|
||||
Reference in New Issue
Block a user