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')