feat: two-role system — super_admin & admin program (Fasa 12)

- Replace is_admin boolean with role enum('super_admin','admin') via migration
- ProgramPolicy: admin program can only view/edit/delete own programs
- EnsureIsAdmin: accepts both roles; EnsureSuperAdmin: super_admin only
- UserController + views: super_admin can manage admin accounts
- Sidebar: user management link & role badge gated on isSuperAdmin()
- Fix Controller base class: add AuthorizesRequests trait
- Fix tests: replace nonAdmin() (invalid enum) with adminProgram() against super_admin-only route

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Saufi
2026-05-18 08:47:58 +08:00
parent 700fbd1bcc
commit c9b50ccc5e
18 changed files with 503 additions and 12 deletions

View File

@@ -46,11 +46,26 @@
<i class="bi bi-clipboard2-check-fill"></i> Set Soalselidik
</a>
</li>
@if(auth()->user()->isSuperAdmin())
<li class="nav-item mt-2">
<small class="text-white-50 px-3" style="font-size:.7rem; text-transform:uppercase; letter-spacing:.8px;">Sistem</small>
</li>
<li class="nav-item">
<a href="{{ route('admin.users.index') }}"
class="nav-link {{ request()->routeIs('admin.users.*') ? 'active' : '' }}">
<i class="bi bi-people-fill"></i> Pengurusan Pengguna
</a>
</li>
@endif
</ul>
<div class="px-3 pb-3 mt-auto">
<div class="border-top border-white border-opacity-25 pt-3">
<small class="text-white-50 d-block mb-1">{{ auth()->user()->name }}</small>
<span class="badge {{ auth()->user()->isSuperAdmin() ? 'bg-danger' : 'bg-primary' }} mb-2 d-inline-block">
{{ auth()->user()->isSuperAdmin() ? 'Super Admin' : 'Admin Program' }}
</span>
<form method="POST" action="{{ route('logout') }}">
@csrf
<button type="submit" class="btn btn-sm btn-outline-light w-100">
@@ -145,6 +160,13 @@
<i class="bi bi-clipboard2-check-fill me-2"></i>Set Soalselidik
</a>
</li>
@if(auth()->user()->isSuperAdmin())
<li class="nav-item">
<a href="{{ route('admin.users.index') }}" class="nav-link {{ request()->routeIs('admin.users.*') ? 'active' : '' }}" style="color:rgba(255,255,255,.85);">
<i class="bi bi-people-fill me-2"></i>Pengurusan Pengguna
</a>
</li>
@endif
</ul>
</div>
</div>