126 lines
6.6 KiB
PHP
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>
|