@props(['title' => 'KOPEKOMA']) {{ $title }} @vite(['resources/css/app.css', 'resources/js/app.js']) @livewireStyles
{{-- Data nav + breadcrumb dihitung sekali di sini. $groups jadi satu sumber kebenaran untuk sidebar & breadcrumb. --}} @php $navUser = auth()->user(); // Menu Sistem mengikuti IZIN, bukan peran. Menu yang digantung pada // peran akan tetap tersembunyi dari orang yang izinnya sudah // diberikan — menu dan rute berbeda pendapat, dan yang kalah selalu // penggunanya. $canUsers = $navUser?->can('access_system_users') ?? false; $canRoles = $navUser?->can('access_system_roles') ?? false; $canAudit = $navUser?->can('access_activity_log') ?? false; $canHoliday = $navUser?->can('view_any_member::holiday::saving') ?? false; $canShopping = $navUser?->can('view_any_shopping::transaction') ?? false; $canBalance = $navUser?->can('view_any_member::savings::balance') ?? false; $canDeposit = $navUser?->can('view_any_savings::deposit') ?? false; $canWithdrawal = $navUser?->can('view_any_savings::withdrawal') ?? false; $canLoan = $navUser?->can('view_any_loan') ?? false; $canInstallment = $navUser?->can('view_any_installment') ?? false; $canBlacklist = $navUser?->can('view_any_loan::blacklist') ?? false; $canLaporanSetoran = $navUser?->can('access_laporan_setoran') ?? false; $canLaporanAngsuran = $navUser?->can('access_laporan_angsuran') ?? false; $canLaporanTitipan = $navUser?->can('access_laporan_titipan') ?? false; $groups = [ 'Utama' => [['Dashboard', 'home', 'dashboard'], ['Setor Simpanan', 'banknotes', 'savings.deposits', $canDeposit], ['Pinjaman', 'receipt-percent', 'loans.index', $canLoan], ['Saldo Anggota', 'wallet-stack', 'savings.balances', $canBalance]], 'Laporan' => [['Laporan Simpanan', 'chart', 'reports.setoran', $canLaporanSetoran], ['Laporan Angsuran', 'receipt', 'reports.angsuran', $canLaporanAngsuran], ['Laporan Titipan Pokok', 'wallet-stack', 'reports.titipan', $canLaporanTitipan], ['Rekonsiliasi Pinjaman', 'shield', 'reports.rekonsiliasi', $canLaporanTitipan]], 'Simpanan' => [['Pencairan Simpanan', 'arrow-up-tray', 'savings.withdrawals', $canWithdrawal], ['Pendaftaran Hari Raya', 'gift', 'savings.holiday', $canHoliday], ['Belanja Toko', 'shopping-cart', 'savings.shopping', $canShopping]], 'Pinjaman' => [['Angsuran', 'credit-card', 'installments.index', $canInstallment], ['Blacklist Pinjaman', 'no-symbol', 'loans.blacklist', $canBlacklist]], 'Master' => [['Nasabah Koperasi', 'users', 'master.members'], ['Golongan', 'academic-cap', 'master.grades'], ['OPD / Instansi', 'building-office', 'master.agencies']], 'Sistem' => [['Log Aktivitas', 'bolt', 'system.activity-logs', $canAudit], ['Pengguna', 'users', 'system.users', $canUsers], ['Peran & Izin', 'shield', 'system.roles', $canRoles], ['Pengaturan', 'cog', 'settings', $navUser?->can('manage_settings') ?? false]], ]; // Breadcrumb diturunkan dari $groups (route → grup + label), tanpa deklarasi per-halaman. $bcRouteMap = []; foreach ($groups as $bcGroup => $bcItems) { foreach ($bcItems as $bcItem) { if (! empty($bcItem[2])) { $bcRouteMap[$bcItem[2]] = ['group' => $bcGroup, 'label' => $bcItem[0]]; } } } $bcMatched = null; foreach ($bcRouteMap as $bcRn => $bcMeta) { if (request()->routeIs($bcRn) || request()->routeIs($bcRn . '.*')) { $bcMatched = ['route' => $bcRn] + $bcMeta; break; } } $crumbs = []; if ($bcMatched) { $bcOnBase = request()->routeIs($bcMatched['route']); if ($bcMatched['route'] !== 'dashboard') { $crumbs[] = ['label' => $bcMatched['group'], 'url' => null]; } $crumbs[] = ['label' => $bcMatched['label'], 'url' => $bcOnBase ? null : route($bcMatched['route'])]; if (! $bcOnBase) { $crumbs[] = ['label' => $title, 'url' => null]; } } else { $crumbs[] = ['label' => $title, 'url' => null]; } @endphp {{-- Overlay (mobile only) saat drawer terbuka --}} {{-- Sidebar: drawer off-canvas di mobile, statis di desktop. Item aktif = pill + accent kiri (bukan blok penuh). --}}
{{-- Topbar --}}
{{-- Bell notifikasi --}} @auth @livewire('notification-bell') @endauth {{-- Theme toggle --}}
{{-- Tekstur grid halus (signature) --}}
{{ $slot }}
@livewireScripts