diff --git a/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php b/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php index 36c5a80..8296256 100644 --- a/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php +++ b/app/Http/Controllers/Web/Dashboard/IndeksPetaniController.php @@ -466,17 +466,21 @@ class IndeksPetaniController extends Controller ->groupBy('petani.desa_kelurahan_id') ->get(); - $segmenDominan = $mapSegmentasi - ->groupBy('desa_kelurahan_id') + $segmentasiGroups = $mapSegmentasi->groupBy('desa_kelurahan_id'); + $jumlahSegmenByDesa = $segmentasiGroups + ->map(fn ($items) => $items->pluck('total', 'segmen')); + + $segmenDominan = $segmentasiGroups ->map(function ($items) { - return $items->sortByDesc('total')->first(); + return $items->reduce(fn ($largest, $item) => $largest === null || $item->total > $largest->total ? $item : $largest); }); - $mapAvgSkorSegmentasi->each(function ($item) use ($segmenDominan) { + $mapAvgSkorSegmentasi->each(function ($item) use ($segmenDominan, $jumlahSegmenByDesa) { $dominan = $segmenDominan->get($item->desa_kelurahan_id); $item->segmen_dominan = $dominan?->segmen; $item->jumlah_dominan = $dominan?->total; + $item->jumlah_segmen = $jumlahSegmenByDesa->get($item->desa_kelurahan_id, collect()); }); $segmentasiByDesa = $mapAvgSkorSegmentasi->keyBy('desa_kelurahan_id'); @@ -505,7 +509,9 @@ class IndeksPetaniController extends Controller $segmentStyles = collect($this->segments())->keyBy('name'); $mapDesaSegmentasi = $this->villageData($this->filters($request), false); - $rows = $mapDesaSegmentasi->map(function ($desa) use ($segmentStyles) { + $segmentNames = ['Pemula', 'Perintis', 'Pemerhati', 'Penggerak', 'Belum Lengkap']; + $rows = $mapDesaSegmentasi->map(function ($desa) use ($segmentStyles, $segmentNames) { + $total = (int) $desa->segmentasi->jumlah_petani; $style = $segmentStyles[$desa->segmentasi->segmen] ?? ['color' => 'secondary']; $styleDominan = $segmentStyles[$desa->segmentasi->segmen_dominan] ?? ['color' => 'secondary']; @@ -519,6 +525,16 @@ class IndeksPetaniController extends Controller 'jumlah_dominan' => $desa->segmentasi->jumlah_dominan, 'color' => $style['color'], 'color_dominan' => $styleDominan['color'], + 'segments' => collect($segmentNames) + ->mapWithKeys(function ($name) use ($desa, $segmentStyles, $total) { + $count = (int) $desa->segmentasi->jumlah_segmen->get($name, 0); + + return [strtolower(str_replace(' ', '_', $name)) => [ + 'count' => $count, + 'percentage' => $total > 0 ? round($count / $total * 100, 2) : 0, + 'color' => $segmentStyles[$name]['color'] ?? 'secondary', + ]]; + })->all(), ]; }); diff --git a/public/assets/css/demo.css b/public/assets/css/demo.css index 2109ac6..83f3c69 100644 --- a/public/assets/css/demo.css +++ b/public/assets/css/demo.css @@ -103,3 +103,85 @@ text-align: center; margin-top: 1rem; } + +/* Sidebar icon tiles: keep the icon mask on the inner element. */ +#layout-menu .menu-inner > .menu-item > .menu-link > .sidebar-icon { + display: inline-flex; + align-items: center; + justify-content: center; + flex: 0 0 30px; + width: 30px; + height: 30px; + border-radius: 9px; + color: var(--sidebar-icon-color, var(--bs-secondary)); + background: var(--sidebar-icon-bg, rgba(var(--bs-secondary-rgb), 0.1)); + transition: background-color 180ms ease, color 180ms ease, transform 180ms ease; +} + +#layout-menu .sidebar-icon > .ti { + width: 21px; + height: 21px; + font-size: 21px; +} + +#layout-menu .sidebar-icon:has(.tabler-dashboard), +#layout-menu .sidebar-icon:has(.tabler-database) { + --sidebar-icon-color: var(--bs-primary); + --sidebar-icon-bg: rgba(var(--bs-primary-rgb), 0.12); +} + +#layout-menu .sidebar-icon:has(.tabler-user-circle), +#layout-menu .sidebar-icon:has(.tabler-id-badge-2), +#layout-menu .sidebar-icon:has(.tabler-plant) { + --sidebar-icon-color: var(--bs-success); + --sidebar-icon-bg: rgba(var(--bs-success-rgb), 0.12); +} + +#layout-menu .sidebar-icon:has(.tabler-users-group), +#layout-menu .sidebar-icon:has(.tabler-sitemap) { + --sidebar-icon-color: var(--bs-info); + --sidebar-icon-bg: rgba(var(--bs-info-rgb), 0.12); +} + +#layout-menu .sidebar-icon:has(.tabler-building-community), +#layout-menu .sidebar-icon:has(.tabler-heart-handshake) { + --sidebar-icon-color: var(--bs-warning); + --sidebar-icon-bg: rgba(var(--bs-warning-rgb), 0.12); +} + +#layout-menu .sidebar-icon:has(.tabler-map-2), +#layout-menu .sidebar-icon:has(.tabler-user-shield), +#layout-menu .sidebar-icon:has(.tabler-route) { + --sidebar-icon-color: var(--bs-primary); + --sidebar-icon-bg: rgba(var(--bs-primary-rgb), 0.12); +} + +#layout-menu .menu-item > .menu-link:hover > .sidebar-icon, +#layout-menu .menu-item > .menu-link:focus-visible > .sidebar-icon { + transform: translateY(-1px); +} + +#layout-menu .menu-inner > .menu-item.active > .menu-link > .sidebar-icon { + color: inherit; + background: rgba(255, 255, 255, 0.18); +} + +@media (prefers-reduced-motion: reduce) { + #layout-menu .menu-inner > .menu-item > .menu-link > .sidebar-icon { + transition: none; + transform: none; + } +} + +/* Submenu icons replace the template's decorative bullets. */ +#layout-menu .menu-sub > .menu-item > .menu-link::before { display: none; } +#layout-menu .menu-sub .sidebar-icon { + display: inline-flex; + align-items: center; + justify-content: center; + flex: 0 0 22px; + width: 22px; + height: 22px; + color: inherit; +} +#layout-menu .menu-sub .sidebar-icon > .ti { width: 19px; height: 19px; font-size: 19px; } diff --git a/resources/views/dashboard/karakteristik-petani.blade.php b/resources/views/dashboard/karakteristik-petani.blade.php index dd7f6f6..2216fa1 100644 --- a/resources/views/dashboard/karakteristik-petani.blade.php +++ b/resources/views/dashboard/karakteristik-petani.blade.php @@ -3,6 +3,12 @@ @push('style')