first commit
This commit is contained in:
11
resources/css/app.css
Normal file
11
resources/css/app.css
Normal file
@@ -0,0 +1,11 @@
|
||||
@import 'tailwindcss';
|
||||
|
||||
@source '../../vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php';
|
||||
@source '../../storage/framework/views/*.php';
|
||||
@source '../**/*.blade.php';
|
||||
@source '../**/*.js';
|
||||
|
||||
@theme {
|
||||
--font-sans: 'Instrument Sans', ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
|
||||
'Segoe UI Symbol', 'Noto Color Emoji';
|
||||
}
|
||||
1
resources/js/app.js
Normal file
1
resources/js/app.js
Normal file
@@ -0,0 +1 @@
|
||||
import './bootstrap';
|
||||
4
resources/js/bootstrap.js
vendored
Normal file
4
resources/js/bootstrap.js
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
import axios from 'axios';
|
||||
window.axios = axios;
|
||||
|
||||
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
|
||||
6
resources/views/admin/jabatan/form.blade.php
Normal file
6
resources/views/admin/jabatan/form.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
@extends('layouts.app')
|
||||
@section('title', $jabatan->exists ? 'Edit Jabatan' : 'Tambah Jabatan')
|
||||
@section('content')
|
||||
<div class="card p-4 col-lg-8"><form method="POST" action="{{ $jabatan->exists ? route('jabatan.update',$jabatan) : route('jabatan.store') }}">@csrf @if($jabatan->exists) @method('PUT') @endif
|
||||
<div class="row g-3"><div class="col-md-8"><label class="form-label">Nama</label><input name="nama" class="form-control" value="{{ old('nama',$jabatan->nama) }}" required></div><div class="col-md-4"><label class="form-label">Kod</label><input name="kod" class="form-control" value="{{ old('kod',$jabatan->kod) }}"></div><div class="col-md-6"><label class="form-label">Peringkat</label><select name="peringkat" class="form-select" required>@foreach(['Jabatan','Bahagian','Seksyen','Unit','Sub Unit'] as $p)<option @selected(old('peringkat',$jabatan->peringkat)===$p)>{{ $p }}</option>@endforeach</select></div><div class="col-md-6 d-flex align-items-end"><label class="form-check"><input type="checkbox" name="status" value="1" class="form-check-input" @checked(old('status',$jabatan->status ?? true))> Aktif</label></div><div class="col-12"><label class="form-label">Penerangan</label><textarea name="penerangan" class="form-control">{{ old('penerangan',$jabatan->penerangan) }}</textarea></div></div><div class="mt-4"><button class="btn btn-primary">Simpan</button><a class="btn btn-light" href="{{ route('jabatan.index') }}">Kembali</a></div></form></div>
|
||||
@endsection
|
||||
6
resources/views/admin/jabatan/index.blade.php
Normal file
6
resources/views/admin/jabatan/index.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Konfigurasi Jabatan')
|
||||
@section('content')
|
||||
<div class="d-flex justify-content-between mb-3"><form class="d-flex gap-2"><input name="search" class="form-control" placeholder="Cari nama/kod" value="{{ request('search') }}"><select name="peringkat" class="form-select"><option value="">Semua peringkat</option>@foreach(['Jabatan','Bahagian','Seksyen','Unit','Sub Unit'] as $p)<option @selected(request('peringkat')===$p)>{{ $p }}</option>@endforeach</select><button class="btn btn-outline-primary"><i class="bi bi-search"></i></button></form><a href="{{ route('jabatan.create') }}" class="btn btn-primary"><i class="bi bi-plus-lg"></i> Jabatan</a></div>
|
||||
<div class="card p-3 table-responsive"><table class="table align-middle" data-datatable><thead><tr><th>Kod</th><th>Nama</th><th>Peringkat</th><th>Status</th><th></th></tr></thead><tbody>@foreach($jabatan as $j)<tr><td>{{ $j->kod }}</td><td>{{ $j->nama }}</td><td>{{ $j->peringkat }}</td><td><span class="badge text-bg-{{ $j->status ? 'success':'secondary' }}">{{ $j->status ? 'Aktif':'Tidak Aktif' }}</span></td><td class="text-end"><a class="btn btn-sm btn-outline-primary" href="{{ route('jabatan.edit',$j) }}"><i class="bi bi-pencil"></i></a><form class="d-inline" data-confirm method="POST" action="{{ route('jabatan.destroy',$j) }}">@csrf @method('DELETE')<button class="btn btn-sm btn-outline-danger"><i class="bi bi-trash"></i></button></form></td></tr>@endforeach</tbody></table>{{ $jabatan->links() }}</div>
|
||||
@endsection
|
||||
6
resources/views/admin/roles/form.blade.php
Normal file
6
resources/views/admin/roles/form.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
@extends('layouts.app')
|
||||
@section('title', $role->exists ? 'Edit Role' : 'Tambah Role')
|
||||
@section('content')
|
||||
<div class="card p-4 col-lg-8"><form method="POST" action="{{ $role->exists ? route('roles.update',$role) : route('roles.store') }}">@csrf @if($role->exists) @method('PUT') @endif
|
||||
<div class="mb-3"><label class="form-label">Nama Role</label><input name="name" class="form-control" value="{{ old('name',$role->name) }}" required></div><div class="row g-2">@foreach($permissions as $p)<div class="col-md-4"><label class="form-check"><input class="form-check-input" type="checkbox" name="permissions[]" value="{{ $p->name }}" @checked($role->permissions->contains('name',$p->name))> {{ $p->name }}</label></div>@endforeach</div><div class="mt-4"><button class="btn btn-primary">Simpan</button><a class="btn btn-light" href="{{ route('roles.index') }}">Kembali</a></div></form></div>
|
||||
@endsection
|
||||
6
resources/views/admin/roles/index.blade.php
Normal file
6
resources/views/admin/roles/index.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Role & Permission')
|
||||
@section('content')
|
||||
<div class="d-flex justify-content-end mb-3"><a class="btn btn-primary" href="{{ route('roles.create') }}"><i class="bi bi-plus-lg"></i> Role</a></div>
|
||||
<div class="card p-3 table-responsive"><table class="table align-middle"><thead><tr><th>Role</th><th>Permission</th><th></th></tr></thead><tbody>@foreach($roles as $r)<tr><td class="fw-semibold">{{ $r->name }}</td><td>@foreach($r->permissions as $p)<span class="badge text-bg-light border">{{ $p->name }}</span>@endforeach</td><td class="text-end"><a href="{{ route('roles.edit',$r) }}" class="btn btn-sm btn-outline-primary"><i class="bi bi-pencil"></i></a><form class="d-inline" method="POST" action="{{ route('roles.destroy',$r) }}" data-confirm>@csrf @method('DELETE')<button class="btn btn-sm btn-outline-danger"><i class="bi bi-trash"></i></button></form></td></tr>@endforeach</tbody></table>{{ $roles->links() }}</div>
|
||||
@endsection
|
||||
6
resources/views/admin/users/form.blade.php
Normal file
6
resources/views/admin/users/form.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
@extends('layouts.app')
|
||||
@section('title', $user->exists ? 'Edit User' : 'Tambah User')
|
||||
@section('content')
|
||||
<div class="card p-4 col-xl-9"><form method="POST" action="{{ $user->exists ? route('users.update',$user) : route('users.store') }}">@csrf @if($user->exists) @method('PUT') @endif
|
||||
<div class="row g-3"><div class="col-md-6"><label class="form-label">Nama</label><input name="name" class="form-control" value="{{ old('name',$user->name) }}" required></div><div class="col-md-6"><label class="form-label">Email</label><input name="email" type="email" class="form-control" value="{{ old('email',$user->email) }}" required></div><div class="col-md-6"><label class="form-label">No Telefon</label><input name="no_telefon" class="form-control" value="{{ old('no_telefon',$user->no_telefon) }}"></div><div class="col-md-6"><label class="form-label">Jawatan</label><input name="jawatan" class="form-control" value="{{ old('jawatan',$user->jawatan) }}"></div><div class="col-md-6"><label class="form-label">Jabatan</label><select name="jabatan_id" class="form-select"><option value="">Pilih Jabatan</option>@foreach($jabatan as $j)<option value="{{ $j->id }}" @selected(old('jabatan_id',$user->jabatan_id)==$j->id)>{{ $j->nama }}</option>@endforeach</select></div><div class="col-md-6"><label class="form-label">Role</label><select name="role" class="form-select"><option value="">Pilih Role</option>@foreach($roles as $r)<option value="{{ $r->name }}" @selected(old('role',$user->roles->first()?->name)===$r->name)>{{ $r->name }}</option>@endforeach</select></div><div class="col-md-6"><label class="form-label">Kata Laluan</label><input name="password" type="password" class="form-control" @required(!$user->exists)></div><div class="col-md-6"><label class="form-label">Sahkan Kata Laluan</label><input name="password_confirmation" type="password" class="form-control" @required(!$user->exists)></div><div class="col-12"><label class="form-check"><input type="checkbox" name="status" value="1" class="form-check-input" @checked(old('status',$user->status ?? true))> Aktif</label></div></div><div class="mt-4"><button class="btn btn-primary">Simpan</button><a class="btn btn-light" href="{{ route('users.index') }}">Kembali</a></div></form></div>
|
||||
@endsection
|
||||
6
resources/views/admin/users/index.blade.php
Normal file
6
resources/views/admin/users/index.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Pengurusan User')
|
||||
@section('content')
|
||||
<div class="d-flex justify-content-between mb-3"><form class="d-flex gap-2"><input name="search" class="form-control" placeholder="Cari user" value="{{ request('search') }}"><button class="btn btn-outline-primary"><i class="bi bi-search"></i></button></form><a class="btn btn-primary" href="{{ route('users.create') }}"><i class="bi bi-person-plus"></i> User</a></div>
|
||||
<div class="card p-3 table-responsive"><table class="table align-middle"><thead><tr><th>Nama</th><th>Email</th><th>Jabatan</th><th>Role</th><th>Status</th><th></th></tr></thead><tbody>@foreach($users as $u)<tr><td>{{ $u->name }}<div class="small text-muted">{{ $u->jawatan }}</div></td><td>{{ $u->email }}</td><td>{{ $u->jabatan?->nama }}</td><td>{{ $u->roles->pluck('name')->join(', ') }}</td><td><span class="badge text-bg-{{ $u->status ? 'success':'secondary' }}">{{ $u->status ? 'Aktif':'Tidak Aktif' }}</span></td><td class="text-end"><a class="btn btn-sm btn-outline-primary" href="{{ route('users.edit',$u) }}"><i class="bi bi-pencil"></i></a><form class="d-inline" method="POST" action="{{ route('users.reset-password',$u) }}" data-confirm>@csrf<button class="btn btn-sm btn-outline-warning"><i class="bi bi-key"></i></button></form><form class="d-inline" method="POST" action="{{ route('users.destroy',$u) }}" data-confirm>@csrf @method('DELETE')<button class="btn btn-sm btn-outline-secondary"><i class="bi bi-toggle2-on"></i></button></form></td></tr>@endforeach</tbody></table>{{ $users->links() }}</div>
|
||||
@endsection
|
||||
6
resources/views/admin/vot/form.blade.php
Normal file
6
resources/views/admin/vot/form.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
@extends('layouts.app')
|
||||
@section('title', $vot->exists ? 'Edit VOT' : 'Tambah VOT')
|
||||
@section('content')
|
||||
<div class="card p-4 col-lg-8"><form method="POST" action="{{ $vot->exists ? route('vot.update',$vot) : route('vot.store') }}">@csrf @if($vot->exists) @method('PUT') @endif
|
||||
<div class="row g-3"><div class="col-md-4"><label class="form-label">Kod</label><input name="kod" class="form-control" value="{{ old('kod',$vot->kod) }}" required></div><div class="col-md-8"><label class="form-label">Nama</label><input name="nama" class="form-control" value="{{ old('nama',$vot->nama) }}" required></div><div class="col-md-8"><label class="form-label">Jabatan</label><select name="jabatan_id" class="form-select"><option value="">Pilih Jabatan</option>@foreach($jabatan as $j)<option value="{{ $j->id }}" @selected(old('jabatan_id',$vot->jabatan_id)==$j->id)>{{ $j->nama }}</option>@endforeach</select></div><div class="col-md-4 d-flex align-items-end"><label class="form-check"><input type="checkbox" name="status" value="1" class="form-check-input" @checked(old('status',$vot->status ?? true))> Aktif</label></div><div class="col-12"><label class="form-label">Penerangan</label><textarea name="penerangan" class="form-control">{{ old('penerangan',$vot->penerangan) }}</textarea></div></div><div class="mt-4"><button class="btn btn-primary">Simpan</button><a class="btn btn-light" href="{{ route('vot.index') }}">Kembali</a></div></form></div>
|
||||
@endsection
|
||||
6
resources/views/admin/vot/index.blade.php
Normal file
6
resources/views/admin/vot/index.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Konfigurasi VOT')
|
||||
@section('content')
|
||||
<div class="d-flex justify-content-between mb-3"><form class="d-flex gap-2"><input name="search" class="form-control" placeholder="Cari VOT" value="{{ request('search') }}"><select name="jabatan_id" class="form-select"><option value="">Semua jabatan</option>@foreach($jabatan as $j)<option value="{{ $j->id }}" @selected(request('jabatan_id')==$j->id)>{{ $j->nama }}</option>@endforeach</select><button class="btn btn-outline-primary"><i class="bi bi-search"></i></button></form><a href="{{ route('vot.create') }}" class="btn btn-primary"><i class="bi bi-plus-lg"></i> VOT</a></div>
|
||||
<div class="card p-3 table-responsive"><table class="table align-middle"><thead><tr><th>Kod</th><th>Nama</th><th>Jabatan</th><th>Status</th><th></th></tr></thead><tbody>@foreach($vot as $v)<tr><td>{{ $v->kod }}</td><td>{{ $v->nama }}</td><td>{{ $v->jabatan?->nama }}</td><td><span class="badge text-bg-{{ $v->status ? 'success':'secondary' }}">{{ $v->status ? 'Aktif':'Tidak Aktif' }}</span></td><td class="text-end"><a class="btn btn-sm btn-outline-primary" href="{{ route('vot.edit',$v) }}"><i class="bi bi-pencil"></i></a><form class="d-inline" data-confirm method="POST" action="{{ route('vot.destroy',$v) }}">@csrf @method('DELETE')<button class="btn btn-sm btn-outline-danger"><i class="bi bi-trash"></i></button></form></td></tr>@endforeach</tbody></table>{{ $vot->links() }}</div>
|
||||
@endsection
|
||||
12
resources/views/auth/change-password.blade.php
Normal file
12
resources/views/auth/change-password.blade.php
Normal file
@@ -0,0 +1,12 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Tukar Kata Laluan')
|
||||
@section('content')
|
||||
<div class="card p-4 col-lg-6">
|
||||
<form method="POST" action="{{ route('password.update') }}">@csrf @method('PUT')
|
||||
<div class="mb-3"><label class="form-label">Kata Laluan Semasa</label><input type="password" name="current_password" class="form-control" required></div>
|
||||
<div class="mb-3"><label class="form-label">Kata Laluan Baru</label><input type="password" name="password" class="form-control" required></div>
|
||||
<div class="mb-3"><label class="form-label">Sahkan Kata Laluan</label><input type="password" name="password_confirmation" class="form-control" required></div>
|
||||
<button class="btn btn-primary">Kemaskini</button>
|
||||
</form>
|
||||
</div>
|
||||
@endsection
|
||||
5
resources/views/auth/forgot-password.blade.php
Normal file
5
resources/views/auth/forgot-password.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Forgot Password')
|
||||
@section('content')
|
||||
<div class="row justify-content-center"><div class="col-md-5"><div class="card p-4"><h1 class="h5 mb-3">Reset Password</h1><form method="POST" action="{{ route('password.email') }}">@csrf<div class="mb-3"><label class="form-label">Email</label><input name="email" type="email" class="form-control" required autofocus></div><button class="btn btn-primary w-100">Hantar Pautan Reset</button><a href="{{ route('login') }}" class="btn btn-link w-100 mt-2">Kembali ke login</a></form></div></div></div>
|
||||
@endsection
|
||||
25
resources/views/auth/login.blade.php
Normal file
25
resources/views/auth/login.blade.php
Normal file
@@ -0,0 +1,25 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Log Masuk')
|
||||
@section('content')
|
||||
<div class="row justify-content-center align-items-center" style="min-height:78vh">
|
||||
<div class="col-md-5 col-lg-4">
|
||||
<div class="card p-4">
|
||||
<div class="text-center mb-4">
|
||||
<div class="stat-icon mx-auto mb-3"><i class="bi bi-bank2 fs-4"></i></div>
|
||||
<h1 class="h4 mb-1">MyBajet MBIP</h1>
|
||||
<p class="text-muted mb-0">Sistem Pengurusan Bajet</p>
|
||||
</div>
|
||||
<form method="POST" action="{{ route('login') }}">
|
||||
@csrf
|
||||
<div class="mb-3"><label class="form-label">Email</label><input name="email" type="email" value="{{ old('email') }}" class="form-control" required autofocus></div>
|
||||
<div class="mb-3"><label class="form-label">Kata Laluan</label><input name="password" type="password" class="form-control" required></div>
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<label class="form-check"><input class="form-check-input" type="checkbox" name="remember"> <span class="form-check-label">Ingat saya</span></label>
|
||||
<a class="small" href="{{ route('password.request') }}">Lupa kata laluan?</a>
|
||||
</div>
|
||||
<button class="btn btn-primary w-100">Log Masuk</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
5
resources/views/auth/reset-password.blade.php
Normal file
5
resources/views/auth/reset-password.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Reset Password')
|
||||
@section('content')
|
||||
<div class="row justify-content-center"><div class="col-md-5"><div class="card p-4"><h1 class="h5 mb-3">Tetapkan Kata Laluan Baru</h1><form method="POST" action="{{ route('password.store') }}">@csrf<input type="hidden" name="token" value="{{ $token }}"><div class="mb-3"><label class="form-label">Email</label><input name="email" type="email" class="form-control" value="{{ old('email',$email) }}" required></div><div class="mb-3"><label class="form-label">Kata Laluan</label><input name="password" type="password" class="form-control" required></div><div class="mb-3"><label class="form-label">Sahkan Kata Laluan</label><input name="password_confirmation" type="password" class="form-control" required></div><button class="btn btn-primary w-100">Reset Password</button></form></div></div></div>
|
||||
@endsection
|
||||
35
resources/views/dashboard/index.blade.php
Normal file
35
resources/views/dashboard/index.blade.php
Normal file
@@ -0,0 +1,35 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Dashboard')
|
||||
@section('content')
|
||||
<div class="row g-3 mb-4">
|
||||
@foreach([
|
||||
['Jumlah Permohonan',$total,'bi-folder2-open'],
|
||||
['Bajet Diluluskan','RM '.number_format($approved,2),'bi-cash-coin'],
|
||||
['Permohonan Ditolak',$rejected,'bi-x-octagon'],
|
||||
['Menunggu Tindakan',$pending,'bi-hourglass-split'],
|
||||
] as $card)
|
||||
<div class="col-md-6 col-xl-3"><div class="card p-3"><div class="d-flex justify-content-between align-items-center"><div><div class="text-muted small">{{ $card[0] }}</div><div class="h4 mb-0">{{ $card[1] }}</div></div><div class="stat-icon"><i class="bi {{ $card[2] }}"></i></div></div></div></div>
|
||||
@endforeach
|
||||
</div>
|
||||
<div class="row g-3">
|
||||
<div class="col-lg-7">
|
||||
<div class="card p-3">
|
||||
<div class="fw-semibold mb-3">Recent Submission</div>
|
||||
<div class="table-responsive"><table class="table align-middle">
|
||||
<thead><tr><th>No Rujukan</th><th>Jabatan</th><th>Status</th><th class="text-end">Jumlah</th></tr></thead>
|
||||
<tbody>@forelse($recent as $p)<tr><td>{{ $p->no_rujukan }}</td><td>{{ $p->jabatan?->nama }}</td><td><span class="badge text-bg-primary">{{ $p->status }}</span></td><td class="text-end">RM {{ number_format($p->jumlah_keseluruhan,2) }}</td></tr>@empty<tr><td colspan="4" class="text-muted">Tiada rekod.</td></tr>@endforelse</tbody>
|
||||
</table></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-5">
|
||||
<div class="card p-3 mb-3">
|
||||
<div class="fw-semibold mb-3">Statistik Jabatan</div>
|
||||
@foreach($byJabatan as $j)<div class="d-flex justify-content-between border-bottom py-2"><span>{{ $j->nama }}</span><span class="badge text-bg-light">{{ $j->users_count }} user</span></div>@endforeach
|
||||
</div>
|
||||
<div class="card p-3">
|
||||
<div class="fw-semibold mb-3">Recent Activities</div>
|
||||
@forelse($activities as $a)<div class="small border-bottom py-2"><span class="text-muted">{{ $a->created_at->format('d/m/Y H:i') }}</span> {{ $a->description }}</div>@empty<div class="text-muted small">Tiada aktiviti.</div>@endforelse
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
92
resources/views/layouts/app.blade.php
Normal file
92
resources/views/layouts/app.blade.php
Normal file
@@ -0,0 +1,92 @@
|
||||
<!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>
|
||||
5
resources/views/pelaksana/index.blade.php
Normal file
5
resources/views/pelaksana/index.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Senarai Tugasan Semakan')
|
||||
@section('content')
|
||||
<div class="card p-3 table-responsive"><table class="table align-middle"><thead><tr><th>No Rujukan</th><th>Pemohon</th><th>VOT</th><th>Status</th><th class="text-end">Jumlah</th><th></th></tr></thead><tbody>@foreach($permohonan as $p)<tr><td>{{ $p->no_rujukan }}</td><td>{{ $p->user?->name }}</td><td>{{ $p->vot?->kod }}</td><td><span class="badge text-bg-info">{{ $p->status }}</span></td><td class="text-end">RM {{ number_format($p->jumlah_keseluruhan,2) }}</td><td class="text-end"><a href="{{ route('semakan.show',$p) }}" class="btn btn-sm btn-primary">Semak</a></td></tr>@endforeach</tbody></table>{{ $permohonan->links() }}</div>
|
||||
@endsection
|
||||
9
resources/views/pelaksana/show.blade.php
Normal file
9
resources/views/pelaksana/show.blade.php
Normal file
@@ -0,0 +1,9 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Semak Permohonan')
|
||||
@section('content')
|
||||
<form method="POST" action="{{ route('semakan.update',$permohonan) }}" class="card p-4">@csrf @method('PUT')
|
||||
<div class="mb-3"><div class="fw-semibold">{{ $permohonan->no_rujukan }}</div><div class="text-muted">{{ $permohonan->user?->name }} | {{ $permohonan->jabatan?->nama }}</div></div>
|
||||
<div class="table-responsive"><table class="table align-middle"><thead><tr><th>Item</th><th>Jumlah</th><th>Status Item</th><th>Catatan</th></tr></thead><tbody>@foreach($permohonan->items as $item)<tr><td>{{ $item->item }}<div class="small text-muted">{{ $item->kuantiti }} x RM {{ number_format($item->harga_anggaran,2) }}</div></td><td>RM {{ number_format($item->jumlah,2) }}</td><td><select name="items[{{ $item->id }}][status_item]" class="form-select">@foreach(['Pending','Accepted','Rejected','Partial Accept'] as $s)<option @selected($item->status_item===$s)>{{ $s }}</option>@endforeach</select></td><td><input name="items[{{ $item->id }}][catatan_pelaksana]" class="form-control" value="{{ $item->catatan_pelaksana }}"></td></tr>@endforeach</tbody></table></div>
|
||||
<div class="mb-3"><label class="form-label">Catatan Semakan</label><textarea name="catatan_semakan" class="form-control">{{ $permohonan->catatan_semakan }}</textarea></div><button class="btn btn-primary">Submit kepada Admin</button>
|
||||
</form>
|
||||
@endsection
|
||||
13
resources/views/permohonan/form.blade.php
Normal file
13
resources/views/permohonan/form.blade.php
Normal file
@@ -0,0 +1,13 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Create Permohonan')
|
||||
@section('content')
|
||||
<form method="POST" action="{{ route('permohonan.store') }}" enctype="multipart/form-data" class="card p-4">@csrf
|
||||
<div class="row g-3"><div class="col-md-6"><label class="form-label">VOT</label><select name="vot_id" class="form-select" required><option value="">Pilih VOT</option>@foreach($vot as $v)<option value="{{ $v->id }}">{{ $v->kod }} - {{ $v->nama }} ({{ $v->jabatan?->nama }})</option>@endforeach</select></div><div class="col-md-6"><label class="form-label">Kategori</label><input name="kategori" class="form-control" required></div><div class="col-12"><label class="form-label">Tujuan</label><textarea name="tujuan" class="form-control" rows="3" required></textarea></div><div class="col-md-6"><label class="form-label">Gambar 1</label><input type="file" name="gambar_1" class="form-control image-input" accept="image/png,image/jpeg"></div><div class="col-md-6"><label class="form-label">Gambar 2</label><input type="file" name="gambar_2" class="form-control image-input" accept="image/png,image/jpeg"></div></div>
|
||||
<hr><div class="d-flex justify-content-between align-items-center mb-2"><h2 class="h6 mb-0">Maklumat Item</h2><button type="button" class="btn btn-sm btn-outline-primary" id="addItem"><i class="bi bi-plus"></i> Item</button></div>
|
||||
<div class="table-responsive"><table class="table" id="itemsTable"><thead><tr><th>Item</th><th style="width:130px">Kuantiti</th><th style="width:180px">Harga Anggaran</th><th></th></tr></thead><tbody><tr><td><input name="items[0][item]" class="form-control" required></td><td><input name="items[0][kuantiti]" type="number" min="1" class="form-control" required></td><td><input name="items[0][harga_anggaran]" type="number" min="0" step="0.01" class="form-control" required></td><td><button type="button" class="btn btn-outline-danger remove-item"><i class="bi bi-trash"></i></button></td></tr></tbody></table></div>
|
||||
<div class="d-flex gap-2"><button name="action" value="draft" class="btn btn-outline-secondary">Simpan Draft</button><button name="action" value="submit" class="btn btn-primary">Hantar kepada Pelaksana</button></div>
|
||||
</form>
|
||||
@push('scripts')<script>
|
||||
let i=1;document.getElementById('addItem').onclick=()=>{document.querySelector('#itemsTable tbody').insertAdjacentHTML('beforeend',`<tr><td><input name="items[${i}][item]" class="form-control" required></td><td><input name="items[${i}][kuantiti]" type="number" min="1" class="form-control" required></td><td><input name="items[${i}][harga_anggaran]" type="number" min="0" step="0.01" class="form-control" required></td><td><button type="button" class="btn btn-outline-danger remove-item"><i class="bi bi-trash"></i></button></td></tr>`);i++};document.addEventListener('click',e=>{if(e.target.closest('.remove-item')&&document.querySelectorAll('#itemsTable tbody tr').length>1)e.target.closest('tr').remove()});
|
||||
</script>@endpush
|
||||
@endsection
|
||||
6
resources/views/permohonan/index.blade.php
Normal file
6
resources/views/permohonan/index.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Permohonan Bajet')
|
||||
@section('content')
|
||||
<div class="d-flex justify-content-end mb-3"><a href="{{ route('permohonan.create') }}" class="btn btn-primary"><i class="bi bi-plus-lg"></i> Permohonan</a></div>
|
||||
<div class="card p-3 table-responsive"><table class="table align-middle"><thead><tr><th>No Rujukan</th><th>VOT</th><th>Kategori</th><th>Status</th><th class="text-end">Jumlah</th><th></th></tr></thead><tbody>@foreach($permohonan as $p)<tr><td>{{ $p->no_rujukan }}</td><td>{{ $p->vot?->kod }}</td><td>{{ $p->kategori }}</td><td><span class="badge text-bg-primary">{{ $p->status }}</span></td><td class="text-end">RM {{ number_format($p->jumlah_keseluruhan,2) }}</td><td class="text-end"><a class="btn btn-sm btn-outline-primary" href="{{ route('permohonan.show',$p) }}"><i class="bi bi-eye"></i></a>@if($p->status==='Draft')<form class="d-inline" method="POST" action="{{ route('permohonan.submit',$p) }}">@csrf<button class="btn btn-sm btn-primary">Hantar</button></form>@endif</td></tr>@endforeach</tbody></table>{{ $permohonan->links() }}</div>
|
||||
@endsection
|
||||
6
resources/views/permohonan/show.blade.php
Normal file
6
resources/views/permohonan/show.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Butiran Permohonan')
|
||||
@section('content')
|
||||
<div class="card p-4 mb-3"><div class="row g-3"><div class="col-md-4"><div class="text-muted small">No Rujukan</div><div class="fw-semibold">{{ $permohonan->no_rujukan }}</div></div><div class="col-md-4"><div class="text-muted small">Status</div><span class="badge text-bg-primary">{{ $permohonan->status }}</span></div><div class="col-md-4"><div class="text-muted small">Jumlah</div><div class="fw-semibold">RM {{ number_format($permohonan->jumlah_keseluruhan,2) }}</div></div><div class="col-md-6"><div class="text-muted small">Jabatan</div>{{ $permohonan->jabatan?->nama }}</div><div class="col-md-6"><div class="text-muted small">VOT</div>{{ $permohonan->vot?->kod }} - {{ $permohonan->vot?->nama }}</div><div class="col-12"><div class="text-muted small">Tujuan</div>{{ $permohonan->tujuan }}</div></div></div>
|
||||
<div class="card p-3 table-responsive"><table class="table"><thead><tr><th>Item</th><th>Kuantiti</th><th>Harga</th><th>Jumlah</th><th>Status</th><th>Catatan</th></tr></thead><tbody>@foreach($permohonan->items as $item)<tr><td>{{ $item->item }}</td><td>{{ $item->kuantiti }}</td><td>RM {{ number_format($item->harga_anggaran,2) }}</td><td>RM {{ number_format($item->jumlah,2) }}</td><td>{{ $item->status_item }}</td><td>{{ $item->catatan_pelaksana }}</td></tr>@endforeach</tbody></table></div>
|
||||
@endsection
|
||||
15
resources/views/profile/edit.blade.php
Normal file
15
resources/views/profile/edit.blade.php
Normal file
@@ -0,0 +1,15 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Profil')
|
||||
@section('content')
|
||||
<div class="card p-4 col-lg-7">
|
||||
<form method="POST" action="{{ route('profile.update') }}">@csrf @method('PUT')
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6"><label class="form-label">Nama</label><input name="name" class="form-control" value="{{ old('name', auth()->user()->name) }}" required></div>
|
||||
<div class="col-md-6"><label class="form-label">Email</label><input class="form-control" value="{{ auth()->user()->email }}" disabled></div>
|
||||
<div class="col-md-6"><label class="form-label">No Telefon</label><input name="no_telefon" class="form-control" value="{{ old('no_telefon', auth()->user()->no_telefon) }}"></div>
|
||||
<div class="col-md-6"><label class="form-label">Jawatan</label><input name="jawatan" class="form-control" value="{{ old('jawatan', auth()->user()->jawatan) }}"></div>
|
||||
</div>
|
||||
<div class="mt-4 d-flex gap-2"><button class="btn btn-primary">Simpan</button><a href="{{ route('password.edit') }}" class="btn btn-outline-secondary">Tukar Kata Laluan</a></div>
|
||||
</form>
|
||||
</div>
|
||||
@endsection
|
||||
1
resources/views/reports/_table.blade.php
Normal file
1
resources/views/reports/_table.blade.php
Normal file
@@ -0,0 +1 @@
|
||||
<div class="card p-3 table-responsive"><table class="table align-middle"><thead><tr><th>No Rujukan</th><th>Pemohon</th><th>Jabatan</th><th>VOT</th><th>Status</th><th class="text-end">Jumlah</th><th></th></tr></thead><tbody>@foreach($permohonan as $p)<tr><td>{{ $p->no_rujukan }}</td><td>{{ $p->user?->name }}</td><td>{{ $p->jabatan?->nama }}</td><td>{{ $p->vot?->kod }}</td><td><span class="badge text-bg-primary">{{ $p->status }}</span></td><td class="text-end">RM {{ number_format($p->jumlah_keseluruhan,2) }}</td><td class="text-end">@isset($approval)<form class="d-inline" method="POST" action="{{ route('approvals.approve',$p) }}">@csrf<button class="btn btn-sm btn-success">Approve</button></form><form class="d-inline" method="POST" action="{{ route('approvals.reopen',$p) }}">@csrf<button class="btn btn-sm btn-outline-secondary">Reopen</button></form>@endisset</td></tr>@endforeach</tbody></table>{{ $permohonan->links() }}</div>
|
||||
6
resources/views/reports/index.blade.php
Normal file
6
resources/views/reports/index.blade.php
Normal file
@@ -0,0 +1,6 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Report & Analytics')
|
||||
@section('content')
|
||||
<div class="d-flex gap-2 justify-content-end mb-3"><a class="btn btn-outline-success" href="{{ route('reports.excel') }}"><i class="bi bi-file-earmark-excel"></i> Excel</a><a class="btn btn-outline-danger" href="{{ route('reports.pdf') }}"><i class="bi bi-file-earmark-pdf"></i> PDF</a></div>
|
||||
@include('reports._table')
|
||||
@endsection
|
||||
1
resources/views/reports/pdf.blade.php
Normal file
1
resources/views/reports/pdf.blade.php
Normal file
@@ -0,0 +1 @@
|
||||
<!doctype html><html><head><meta charset="utf-8"><style>body{font-family:DejaVu Sans,sans-serif;font-size:12px}table{width:100%;border-collapse:collapse}td,th{border:1px solid #bbb;padding:6px;text-align:left}h1{font-size:18px}</style></head><body><h1>Laporan Permohonan Bajet Tahunan MBIP</h1><table><thead><tr><th>No Rujukan</th><th>Pemohon</th><th>Jabatan</th><th>VOT</th><th>Status</th><th>Jumlah</th></tr></thead><tbody>@foreach($permohonan as $p)<tr><td>{{ $p->no_rujukan }}</td><td>{{ $p->user?->name }}</td><td>{{ $p->jabatan?->nama }}</td><td>{{ $p->vot?->kod }}</td><td>{{ $p->status }}</td><td>RM {{ number_format($p->jumlah_keseluruhan,2) }}</td></tr>@endforeach</tbody></table></body></html>
|
||||
5
resources/views/reports/permohonan.blade.php
Normal file
5
resources/views/reports/permohonan.blade.php
Normal file
@@ -0,0 +1,5 @@
|
||||
@extends('layouts.app')
|
||||
@section('title','Kelulusan Admin')
|
||||
@section('content')
|
||||
@include('reports._table', ['approval' => true])
|
||||
@endsection
|
||||
277
resources/views/welcome.blade.php
Normal file
277
resources/views/welcome.blade.php
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user