sidebar + middleware

This commit is contained in:
ell 2026-04-27 20:33:58 +07:00
parent e28efe700b
commit 03fa985785
3 changed files with 126 additions and 117 deletions

View File

@ -64,5 +64,6 @@ class Kernel extends HttpKernel
'signed' => \App\Http\Middleware\ValidateSignature::class, 'signed' => \App\Http\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'checkrole' => \App\Http\Middleware\CheckRole::class,
]; ];
} }

View File

@ -0,0 +1,34 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;
class CheckRole
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next, ...$roles): Response
{
if (!Auth::check()) {
return redirect('login');
}
// 2. Ambil nama role user yang sedang login (lewat relasi yang kita buat kemarin)
$userRole = Auth::user()->role->nama_role;
// 3. Cek apakah role user ada di dalam daftar role yang diperbolehkan?
if (in_array($userRole, $roles)) {
return $next($request);
}
// 4. Kalau nggak cocok, lempar ke halaman 403 (Forbidden)
abort(403, 'Akses Ditolak. Anda tidak memiliki wewenang untuk mengakses halaman ini.');
}
}

View File

@ -1,130 +1,104 @@
<aside id="sidebar" class="sidebar"> <aside id="sidebar" class="sidebar">
<ul class="sidebar-nav" id="sidebar-nav"> <ul class="sidebar-nav" id="sidebar-nav">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link " href="index.html"> <a class="nav-link {{ request()->routeIs('dashboard') ? '' : 'collapsed' }}" href="{{ route('dashboard') }}">
<i class="bi bi-grid"></i> <i class="bi bi-grid"></i>
<span>Dashboard</span> <span>Dashboard</span>
</a>
</li><!-- End Dashboard Nav -->
<li class="nav-item">
<a class="nav-link collapsed" data-bs-target="#anggota-nav" data-bs-toggle="collapse" href="#">
<i class="bi bi-gem"></i><span>Manajemen Anggota</span><i class="bi bi-chevron-down ms-auto"></i>
</a>
<ul id="anggota-nav" class="nav-content collapse " data-bs-parent="#sidebar-nav">
<li>
<a href="icons-bootstrap.html">
<i class="bi bi-circle"></i><span>Data Pelatih</span>
</a> </a>
</li> </li>
<li>
<a href="icons-remix.html">
<i class="bi bi-circle"></i><span>Data Anggota</span>
</a>
</li>
<li>
<a href="icons-remix.html">
<i class="bi bi-circle"></i><span>Data Kolat</span>
</a>
</li>
</ul>
</li> {{-- End Manajemen Anggota --}}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link collapsed" data-bs-target="#latihan-nav" data-bs-toggle="collapse" href="#"> <a class="nav-link {{ request()->routeIs(['pelatih.*', 'anggota.*', 'kolat.*']) ? '' : 'collapsed' }}"
<i class="bi bi-gem"></i><span>Manajemen Latihan</span><i class="bi bi-chevron-down ms-auto"></i> data-bs-target="#anggota-nav" data-bs-toggle="collapse" href="#" aria-expanded="{{ request()->routeIs(['pelatih.*', 'anggota.*', 'kolat.*']) ? 'true' : 'false' }}">
</a> <i class="bi bi-people"></i><span>Manajemen Anggota</span><i class="bi bi-chevron-down ms-auto"></i>
<ul id="latihan-nav" class="nav-content collapse " data-bs-parent="#sidebar-nav">
<li>
<a href="icons-bootstrap.html">
<i class="bi bi-circle"></i><span>Presensi</span>
</a> </a>
</li> <ul id="anggota-nav" class="nav-content collapse {{ request()->routeIs(['pelatih.*', 'anggota.*', 'kolat.*']) ? 'show' : '' }}" data-bs-parent="#sidebar-nav">
<li> <li>
<a href="icons-remix.html"> <a href="{{ route('pelatih.index') }}" class="{{ request()->routeIs('pelatih.*') ? 'active' : '' }}">
<i class="bi bi-circle"></i><span>Jadwal & Pengumuman</span> <i class="bi bi-circle"></i><span>Data Pelatih</span>
</a>
</li>
<li>
<a href="{{ route('anggota.anggota') }}" class="{{ request()->routeIs('anggota.*') ? 'active' : '' }}">
<i class="bi bi-circle"></i><span>Data Anggota</span>
</a>
</li>
<li>
<a href="{{ route('kolat.index') }}" class="{{ request()->routeIs('kolat.*') ? 'active' : '' }}">
<i class="bi bi-circle"></i><span>Data Kolat</span>
</a>
</li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link {{ request()->routeIs(['presensi.*', 'jadwal.*']) ? '' : 'collapsed' }}"
data-bs-target="#latihan-nav" data-bs-toggle="collapse" href="#" aria-expanded="{{ request()->routeIs(['presensi.*', 'jadwal.*']) ? 'true' : 'false' }}">
<i class="bi bi-journal-check"></i><span>Manajemen Latihan</span><i class="bi bi-chevron-down ms-auto"></i>
</a> </a>
</li> <ul id="latihan-nav" class="nav-content collapse {{ request()->routeIs(['presensi.*', 'jadwal.*']) ? 'show' : '' }}" data-bs-parent="#sidebar-nav">
<li> <li>
<a href="icons-remix.html"> <a href="{{ route('presensi.index') }}" class="{{ request()->routeIs('presensi.*') ? 'active' : '' }}">
<i class="bi bi-circle"></i><span>Penilaian Pelatih</span> <i class="bi bi-circle"></i><span>Presensi</span>
</a>
</li>
<li>
<a href="{{ route('jadwal.index') }}" class="{{ request()->routeIs('jadwal.*') ? 'active' : '' }}">
<i class="bi bi-circle"></i><span>Jadwal & Pengumuman</span>
</a>
</li>
<li><a href="#"><i class="bi bi-circle"></i><span>Penilaian Pelatih</span></a></li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link collapsed" data-bs-target="#transaksi-nav" data-bs-toggle="collapse" href="#">
<i class="bi bi-wallet2"></i><span>Transaksi</span><i class="bi bi-chevron-down ms-auto"></i>
</a> </a>
</li> <ul id="transaksi-nav" class="nav-content collapse" data-bs-parent="#sidebar-nav">
</ul> <li><a href="#"><i class="bi bi-circle"></i><span>Kas Cabang</span></a></li>
</li> {{-- End Manajemen Latihan --}} <li><a href="#"><i class="bi bi-circle"></i><span>SPP Anggota</span></a></li>
</ul>
</li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link collapsed" data-bs-target="#transaksi-nav" data-bs-toggle="collapse" href="#"> <a class="nav-link collapsed" data-bs-target="#laporan-nav" data-bs-toggle="collapse" href="#">
<i class="bi bi-gem"></i><span>Transaksi</span><i class="bi bi-chevron-down ms-auto"></i> <i class="bi bi-file-earmark-bar-graph"></i><span>Laporan</span><i class="bi bi-chevron-down ms-auto"></i>
</a>
<ul id="transaksi-nav" class="nav-content collapse " data-bs-parent="#sidebar-nav">
<li>
<a href="icons-bootstrap.html">
<i class="bi bi-circle"></i><span>Kas Cabang</span>
</a> </a>
</li> <ul id="laporan-nav" class="nav-content collapse" data-bs-parent="#sidebar-nav">
<li> <li><a href="#"><i class="bi bi-circle"></i><span>Laporan Anggota</span></a></li>
<a href="icons-remix.html"> <li><a href="#"><i class="bi bi-circle"></i><span>Laporan Keuangan</span></a></li>
<i class="bi bi-circle"></i><span>SPP Anggota</span> <li><a href="#"><i class="bi bi-circle"></i><span>Laporan Presensi</span></a></li>
<li><a href="#"><i class="bi bi-circle"></i><span>Laporan Penilaian</span></a></li>
</ul>
</li>
<li class="nav-heading">Akun</li>
<li class="nav-item">
<a class="nav-link collapsed" href="#"><i class="bi bi-person"></i><span>Profile</span></a>
</li>
<li class="nav-item">
<form id="logout-form" action="{{ route('logout') }}" method="POST" style="display: none;">@csrf</form>
<a class="nav-link collapsed" href="#" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">
<i class="bi bi-box-arrow-right"></i><span>Logout</span>
</a> </a>
</li> </li>
</ul>
</li> {{-- End transaksi --}}
<li class="nav-item">
<a class="nav-link collapsed" data-bs-target="#laporan-nav" data-bs-toggle="collapse" href="#">
<i class="bi bi-gem"></i><span>Laporan</span><i class="bi bi-chevron-down ms-auto"></i>
</a>
<ul id="laporan-nav" class="nav-content collapse " data-bs-parent="#sidebar-nav">
<li>
<a href="icons-bootstrap.html">
<i class="bi bi-circle"></i><span>Laporan Anggota</span>
</a>
</li>
<li>
<a href="icons-remix.html">
<i class="bi bi-circle"></i><span>Laporan Keuangan</span>
</a>
</li>
<a href="icons-remix.html">
<i class="bi bi-circle"></i><span>Laporan Presensi</span>
</a>
</li>
<a href="icons-remix.html">
<i class="bi bi-circle"></i><span>Laporan Penialaian</span>
</a>
</li>
</ul>
</li>
<li class="nav-heading">Pages</li>
<li class="nav-item">
<a class="nav-link collapsed" href="users-profile.html">
<i class="bi bi-person"></i>
<span>Profile</span>
</a>
</li><!-- End Profile Page Nav -->
<li class="nav-item">
<a class="nav-link collapsed" href="pages-login.html">
<i class="bi bi-box-arrow-in-right"></i>
<span>Login</span>
</a>
</li><!-- End Login Page Nav -->
<li class="nav-item">
<a class="nav-link collapsed" href="pages-error-404.html">
<i class="bi bi-dash-circle"></i>
<span>Error 404</span>
</a>
</li><!-- End Error 404 Page Nav -->
</ul> </ul>
</aside>
</aside> {{-- SCRIPT PENTING: Supaya menu yang otomatis terbuka BISA DITUTUP KEMBALI --}}
<script>
document.addEventListener("DOMContentLoaded", function() {
// Cari semua dropdown yang punya class 'show' (dibuka otomatis oleh Laravel)
var bootstrapCollapseMenus = document.querySelectorAll('.nav-content.collapse.show');
bootstrapCollapseMenus.forEach(function (menuElement) {
// Kita kasih tahu Bootstrap secara manual: "Woi, ini menu udah kebuka!"
// Dengan inisialisasi ini, klik berikutnya akan menjalankan fungsi 'hide'
new bootstrap.Collapse(menuElement, {
toggle: false
});
});
});
</script>