93 lines
5.6 KiB
PHP
93 lines
5.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', 'MyBajet MBIP')</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.6/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="https://cdn.datatables.net/2.3.0/css/dataTables.bootstrap5.min.css" rel="stylesheet">
|
|
<style>
|
|
:root { --mbip-blue:#0b4ea2; --mbip-navy:#063b78; --mbip-soft:#f4f7fb; }
|
|
body { background: var(--mbip-soft); color:#1f2937; font-size: .94rem; }
|
|
.app-shell { min-height: 100vh; display:flex; }
|
|
.sidebar { width: 268px; background: linear-gradient(180deg,var(--mbip-navy),#0b4ea2); color:#fff; position: sticky; top:0; height:100vh; }
|
|
.sidebar a { color:#dbeafe; text-decoration:none; border-radius:8px; padding:.68rem .8rem; display:flex; gap:.65rem; align-items:center; }
|
|
.sidebar a:hover,.sidebar a.active { background: rgba(255,255,255,.14); color:#fff; }
|
|
.content { flex:1; min-width:0; }
|
|
.topbar { background:#fff; border-bottom:1px solid #e5e7eb; }
|
|
.card, .table-wrap { border:1px solid #e5e7eb; border-radius:8px; box-shadow:0 8px 24px rgba(15,23,42,.05); }
|
|
.stat-icon { width:42px; height:42px; display:grid; place-items:center; border-radius:8px; background:#e8f1ff; color:var(--mbip-blue); }
|
|
.btn-primary { background:var(--mbip-blue); border-color:var(--mbip-blue); }
|
|
.form-control,.form-select,.btn { border-radius:7px; }
|
|
@media (max-width: 991.98px) { .app-shell{display:block}.sidebar{width:100%;height:auto;position:relative}.sidebar nav{display:grid;grid-template-columns:repeat(2,1fr);gap:.25rem} }
|
|
</style>
|
|
@stack('styles')
|
|
</head>
|
|
<body>
|
|
<div class="app-shell">
|
|
@auth
|
|
<aside class="sidebar p-3">
|
|
<div class="d-flex align-items-center gap-2 mb-4">
|
|
<div class="stat-icon bg-white text-primary"><i class="bi bi-bank2"></i></div>
|
|
<div>
|
|
<div class="fw-bold">MyBajet MBIP</div>
|
|
<small class="text-white-50">Sistem Pengurusan Bajet</small>
|
|
</div>
|
|
</div>
|
|
<nav class="d-grid gap-1">
|
|
<a href="{{ route('dashboard') }}" class="{{ request()->routeIs('dashboard') ? 'active' : '' }}"><i class="bi bi-speedometer2"></i> Dashboard</a>
|
|
@role('Pemohon|Admin')
|
|
<a href="{{ route('permohonan.index') }}" class="{{ request()->routeIs('permohonan.*') ? 'active' : '' }}"><i class="bi bi-file-earmark-plus"></i> Permohonan</a>
|
|
@endrole
|
|
@role('Pelaksana|Admin')
|
|
<a href="{{ route('semakan.index') }}" class="{{ request()->routeIs('semakan.*') ? 'active' : '' }}"><i class="bi bi-clipboard-check"></i> Semakan</a>
|
|
@endrole
|
|
@role('Admin')
|
|
<a href="{{ route('approvals.index') }}"><i class="bi bi-patch-check"></i> Kelulusan</a>
|
|
<a href="{{ route('jabatan.index') }}"><i class="bi bi-diagram-3"></i> Jabatan</a>
|
|
<a href="{{ route('vot.index') }}"><i class="bi bi-journal-code"></i> VOT</a>
|
|
<a href="{{ route('users.index') }}"><i class="bi bi-people"></i> User</a>
|
|
<a href="{{ route('roles.index') }}"><i class="bi bi-shield-lock"></i> Role</a>
|
|
<a href="{{ route('reports.index') }}"><i class="bi bi-bar-chart-line"></i> Laporan</a>
|
|
@endrole
|
|
</nav>
|
|
</aside>
|
|
@endauth
|
|
<main class="content">
|
|
@auth
|
|
<div class="topbar px-4 py-3 d-flex justify-content-between align-items-center">
|
|
<div>
|
|
<div class="fw-semibold">@yield('title', 'Dashboard')</div>
|
|
<small class="text-muted">{{ auth()->user()->jabatan?->nama ?? 'Majlis Bandaraya Iskandar Puteri' }}</small>
|
|
</div>
|
|
<div class="d-flex align-items-center gap-2">
|
|
<a class="btn btn-light btn-sm" href="{{ route('profile.edit') }}"><i class="bi bi-person-circle"></i> {{ auth()->user()->name }}</a>
|
|
<form method="POST" action="{{ route('logout') }}">@csrf <button class="btn btn-outline-danger btn-sm"><i class="bi bi-box-arrow-right"></i></button></form>
|
|
</div>
|
|
</div>
|
|
@endauth
|
|
<div class="@auth p-4 @else container py-5 @endauth">
|
|
@if(session('success')) <div class="alert alert-success">{{ session('success') }}</div> @endif
|
|
@if($errors->any()) <div class="alert alert-danger">{{ $errors->first() }}</div> @endif
|
|
@yield('content')
|
|
</div>
|
|
</main>
|
|
</div>
|
|
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.6/dist/js/bootstrap.bundle.min.js"></script>
|
|
<script src="https://cdn.datatables.net/2.3.0/js/dataTables.min.js"></script>
|
|
<script src="https://cdn.datatables.net/2.3.0/js/dataTables.bootstrap5.min.js"></script>
|
|
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
|
<script>
|
|
document.querySelectorAll('[data-confirm]').forEach(form => form.addEventListener('submit', e => {
|
|
e.preventDefault();
|
|
Swal.fire({title:'Sahkan tindakan?', icon:'question', showCancelButton:true, confirmButtonText:'Ya', cancelButtonText:'Batal'}).then(r => { if (r.isConfirmed) form.submit(); });
|
|
}));
|
|
document.querySelectorAll('table[data-datatable]').forEach(table => new DataTable(table, {paging:false, searching:false, info:false}));
|
|
</script>
|
|
@stack('scripts')
|
|
</body>
|
|
</html>
|