Files
cabutan-bertuah-koipb/resources/views/layouts/app.blade.php
2026-06-26 19:10:31 +08:00

126 lines
6.6 KiB
PHP

<!DOCTYPE html>
<html lang="ms">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>@yield('title', 'Sistem MAT') · KOIPB</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" rel="stylesheet">
<link href="{{ asset('css/koipb.css') }}?v=1" rel="stylesheet">
@stack('head')
</head>
<body>
@php
$u = auth()->user();
$isAdmin = $u?->hasRole(\App\Models\User::ROLE_ADMIN);
$canKaunter = $u?->hasAnyRole([\App\Models\User::ROLE_ADMIN, \App\Models\User::ROLE_KAUNTER]);
$canCabutan = $u?->hasAnyRole([\App\Models\User::ROLE_ADMIN, \App\Models\User::ROLE_CABUTAN]);
@endphp
<div class="koipb-shell">
<aside class="koipb-sidebar" id="koipbSidebar">
<div class="brand">
<img src="{{ asset('images/logo-koipb.jpg') }}" alt="KOIPB" onerror="this.style.visibility='hidden'">
<div>
<div class="t1">KOIPB</div>
<div class="t2">Sistem MAT</div>
</div>
</div>
<nav class="koipb-nav">
<a href="{{ route('dashboard') }}" class="{{ request()->routeIs('dashboard') ? 'active' : '' }}">
<span class="ico"><i class="bi bi-speedometer2"></i></span> Dashboard
</a>
@if($canKaunter)
<div class="nav-section">Kehadiran</div>
<a href="{{ route('counter.index') }}" class="{{ request()->routeIs('counter.*') ? 'active' : '' }}">
<span class="ico"><i class="bi bi-person-check"></i></span> Kaunter Kehadiran
</a>
<a href="{{ route('attendance.index') }}" class="{{ request()->routeIs('attendance.*') ? 'active' : '' }}">
<span class="ico"><i class="bi bi-list-check"></i></span> Senarai Kehadiran
</a>
@endif
@if($canCabutan)
<div class="nav-section">Cabutan Bertuah</div>
<a href="{{ route('draw.index') }}" class="{{ request()->routeIs('draw.*') ? 'active' : '' }}">
<span class="ico"><i class="bi bi-trophy"></i></span> Skrin Cabutan
</a>
<a href="{{ route('reports.index') }}" class="{{ request()->routeIs('reports.*') ? 'active' : '' }}">
<span class="ico"><i class="bi bi-file-earmark-bar-graph"></i></span> Laporan
</a>
@endif
@if($isAdmin)
<div class="nav-section">Pentadbiran</div>
<a href="{{ route('admin.members.index') }}" class="{{ request()->routeIs('admin.members.*') ? 'active' : '' }}">
<span class="ico"><i class="bi bi-people"></i></span> Anggota
</a>
<a href="{{ route('admin.prizes.index') }}" class="{{ request()->routeIs('admin.prizes.*') ? 'active' : '' }}">
<span class="ico"><i class="bi bi-gift"></i></span> Hadiah
</a>
<a href="{{ route('admin.users.index') }}" class="{{ request()->routeIs('admin.users.*') ? 'active' : '' }}">
<span class="ico"><i class="bi bi-person-gear"></i></span> Pengguna
</a>
<a href="{{ route('admin.audit.index') }}" class="{{ request()->routeIs('admin.audit.*') ? 'active' : '' }}">
<span class="ico"><i class="bi bi-shield-check"></i></span> Audit Trail
</a>
<a href="{{ route('admin.settings.index') }}" class="{{ request()->routeIs('admin.settings.*') ? 'active' : '' }}">
<span class="ico"><i class="bi bi-gear"></i></span> Tetapan & Reset
</a>
@endif
</nav>
<div class="sb-foot">
<a href="{{ route('profile.edit') }}" class="text-decoration-none d-block mb-2">
<div class="text-white small"><i class="bi bi-person-circle"></i> {{ $u?->name }}</div>
<div class="small" style="color:var(--koipb-teal-light)">{{ $u?->roleLabel() }}</div>
</a>
<form method="POST" action="{{ route('logout') }}">
@csrf
<button class="btn btn-sm btn-outline-light w-100"><i class="bi bi-box-arrow-right"></i> Log Keluar</button>
</form>
</div>
</aside>
<div class="koipb-backdrop d-none" id="koipbBackdrop"></div>
<div class="koipb-main">
<header class="koipb-topbar">
<div class="d-flex align-items-center gap-2">
<button class="btn btn-light koipb-burger" id="koipbBurger"><i class="bi bi-list"></i></button>
<h1>@yield('title', 'Dashboard')</h1>
</div>
<div class="d-flex align-items-center gap-2">
<span class="badge bg-light text-dark border d-none d-md-inline">
<i class="bi bi-calendar-event text-teal"></i> {{ now()->format('d/m/Y') }}
</span>
</div>
</header>
<main class="koipb-content">
@if(session('success'))
<div class="alert alert-success alert-dismissible fade show"><i class="bi bi-check-circle"></i> {{ session('success') }}<button class="btn-close" data-bs-dismiss="alert"></button></div>
@endif
@if(session('error'))
<div class="alert alert-danger alert-dismissible fade show"><i class="bi bi-exclamation-triangle"></i> {{ session('error') }}<button class="btn-close" data-bs-dismiss="alert"></button></div>
@endif
@yield('content')
</main>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script src="https://cdn.jsdelivr.net/npm/canvas-confetti@1.9.3/dist/confetti.browser.min.js"></script>
<script>
window.csrfToken = document.querySelector('meta[name="csrf-token"]').content;
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': window.csrfToken } });
(function(){
const sb = document.getElementById('koipbSidebar'), bd = document.getElementById('koipbBackdrop');
document.getElementById('koipbBurger')?.addEventListener('click', () => { sb.classList.add('show'); bd.classList.remove('d-none'); });
bd?.addEventListener('click', () => { sb.classList.remove('show'); bd.classList.add('d-none'); });
})();
</script>
@stack('scripts')
</body>
</html>