Dashboard Kelurahan

Ringkasan data kelayakan penerima BLT-DD seluruh dusun

{{-- ── BELL NOTIFIKASI ── --}}
{{-- Clock --}}
{{-- GREETING + NOTIFIKASI (asli tidak diubah, hanya ganti class ke inline style) --}}
{{ strtoupper(substr(Auth::user()->name ?? 'A', 0, 1)) }}

Selamat datang, {{ Auth::user()->name ?? 'Admin' }} 👋

Panel admin — kelola dan pantau seluruh data warga.

{{ $totalPending ?? 0 }} data menunggu verifikasi

Proses sekarang →
{{-- STAT CARDS (asli tidak diubah, ganti ke inline style) --}}

Total Warga Masuk

{{ $totalWarga ?? 0 }}

Dari semua dusun

Pending Verifikasi

{{ $totalPending ?? 0 }}

Belum diproses

Diterima / Ditetapkan

{{ $totalPenerima ?? 0 }}

Sudah ditetapkan

Ditolak

{{ $totalDitolak ?? 0 }}

Tidak memenuhi syarat

{{-- GRAFIK + DATA PER DUSUN (logika PHP asli 100% tidak diubah) --}}

Jumlah Warga per Dusun

{{ $wargaPerDusun->sum('total') }} total warga
@php $dusuns = $wargaPerDusun->values(); $n = max($dusuns->count(), 1); $maxV = max((int)$dusuns->max('total'), 1); $W = 560; $H = 210; $pL = 40; $pR = 20; $pT = 30; $pB = 45; $cW = $W - $pL - $pR; $cH = $H - $pT - $pB; $step = max(1, (int)ceil($maxV / 4)); $yTicks = range(0, $maxV + $step, $step); $pts = []; foreach ($dusuns as $i => $d) { $x = $pL + ($n === 1 ? $cW / 2 : ($i / ($n - 1)) * $cW); $y = $pT + $cH - ($d->total / $maxV) * $cH; $pts[] = ['x' => round($x, 1), 'y' => round($y, 1), 'val' => $d->total, 'name' => $d->dusun]; } $poly = implode(' ', array_map(fn($p) => "{$p['x']},{$p['y']}", $pts)); $firstPt = $pts[0]; $lastPt = $pts[count($pts)-1]; $botY = $pT + $cH; $areaPath = "M {$firstPt['x']},{$firstPt['y']} " . implode(' ', array_map(fn($p) => "L {$p['x']},{$p['y']}", array_slice($pts, 1))) . " L {$lastPt['x']},{$botY} L {$firstPt['x']},{$botY} Z"; @endphp @foreach($yTicks as $t) @if($t <= $maxV + $step) @php $gy = $pT + $cH - min($t, $maxV) / $maxV * $cH; @endphp {{ $t }} @endif @endforeach Jumlah Warga @foreach($pts as $p) {{ $p['val'] }} {{ Str::limit($p['name'], 9) }} @endforeach Dusun

Data Per Dusun

@php $maxDusun = $wargaPerDusun->max('total') ?: 1; @endphp @foreach($wargaPerDusun as $data)
{{ $data->dusun }}
{{ $data->total }}
@endforeach
{{-- TOP 10 — full width, tambah kolom Dusun & RT, logika asli 100% tidak diubah --}}

Top 10 Probabilitas Tertinggi

Seluruh dusun — diurutkan dari probabilitas terbesar

≥70% 40–70% <40%
Lihat Semua
@forelse($topWarga as $index => $warga) {{-- Rank (asli) --}} {{-- Nama (asli) --}} {{-- NIK (asli) --}} {{-- Dusun (ditambahkan — pakai $warga->dusun yang sudah ada di data asli) --}} {{-- RT (ditambahkan — pakai $warga->rt jika ada) --}} {{-- Penghasilan (asli) --}} {{-- Probabilitas (asli) --}} {{-- Status (asli) --}} @empty @endforelse
Rank Nama NIK Dusun RT Penghasilan Probabilitas Status
@if($index == 0)
1
@elseif($index == 1)
2
@elseif($index == 2)
3
@else
{{ $index + 1 }}
@endif
{{ strtoupper(substr($warga->nama, 0, 1)) }}
{{ $warga->nama }}
{{ $warga->pekerjaan }}
{{ $warga->nik }} {{ $warga->dusun }} RT {{ str_pad($warga->rt ?? '0', 3, '0', STR_PAD_LEFT) }} Rp {{ number_format($warga->penghasilan, 0, ',', '.') }} @php $sc = $warga->probabilitas >= 70 ? '#10b981' : ($warga->probabilitas >= 40 ? '#f59e0b' : '#f43f5e'); $scB = $warga->probabilitas >= 70 ? '#f0fdf4' : ($warga->probabilitas >= 40 ? '#fffbeb' : '#fff1f2'); @endphp
{{ number_format($warga->probabilitas, 1) }}%
@if($warga->status == 'pending') Pending @elseif($warga->status == 'diterima') Diterima @elseif($warga->status == 'ditolak') Ditolak @else {{ ucfirst($warga->status) }} @endif

Belum ada data warga