refactor: Refactor user management logic, fix route URL generation in Blade templates, and enhance user action button UI.

This commit is contained in:
cukiprit 2026-02-27 06:45:36 +07:00
parent 6f94cb2a91
commit f63628e48e
5 changed files with 32 additions and 164 deletions

View File

@ -7,10 +7,6 @@
use App\Models\MasterInduk;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
use App\Models\MasterInduk;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class UserController extends Controller
{
@ -38,63 +34,6 @@ public function create()
return view('admin.pengguna.create', ['pageTitle' => 'Tambah Pengguna Baru']);
}
public function store(Request $request)
{
$request->validate([
'nama_lengkap' => 'required|string|max:255',
'email' => 'required|email|unique:users,email',
'role' => 'required|in:siswa,guru,penjaga perpus',
'no_hp' => 'nullable|string|max:20',
'password' => 'required|min:6|confirmed',
'nomor_induk' => [
'required',
function ($attribute, $value, $fail) use ($request) {
$label = $request->role == 'siswa' ? 'NISN' : 'NIP/NIK';
// Cek Nisn/Nip sudah dipakai di tabel users
$sudahDipakai = User::where('nisn', $value)->orWhere('nip', $value)->exists();
if ($sudahDipakai) {
$fail("{$label} ini sudah digunakan oleh akun lain.");
return;
}
if (in_array($request->role, ['siswa', 'guru'])) {
$terdaftar = MasterInduk::where('nomor_induk', $value)
->where('role', $request->role)
->exists();
if (!$terdaftar) {
$fail("{$label} tidak terdaftar di data sekolah. Hubungi admin.");
}
}
},
],
], [
'role.in' => 'Pilih role yang valid.',
'email.unique' => 'Email sudah terdaftar.',
'password.confirmed' => 'Konfirmasi password tidak cocok.'
]);
$user = new User();
$user->name = $request->nama_lengkap;
$user->email = $request->email;
$user->role = $request->role;
$user->password = Hash::make($request->password);
$user->no_hp = $request->no_hp;
// Validasi NISN dan NIP berdasarkan Role
if ($request->role == 'siswa') {
$user->nisn = $request->nomor_induk;
$user->kelas = $request->kelas;
$user->golongan = $request->golongan;
} else {
$user->nip = $request->nomor_induk;
}
$user->save();
return redirect()->route('admin.pengguna.index')->with('success', 'Pengguna berhasil ditambahkan.');
}
public function edit($id)
{
$pengguna = User::findOrFail($id);
@ -104,77 +43,6 @@ public function edit($id)
]);
}
public function update(Request $request, $id)
{
$request->validate([
'nama_lengkap' => 'required|string|max:255',
'email' => 'required|email|unique:users,email,' . $id,
'role' => 'required|in:siswa,guru,penjaga perpus',
'no_hp' => 'nullable|string|max:20',
'password' => 'nullable|min:6|confirmed',
'nomor_induk' => [
'required',
function ($attribute, $value, $fail) use ($request, $id) {
$label = $request->role == 'siswa' ? 'NISN' : 'NIP/NIK';
// cek nisn/nip sudah dipakai di tabel users (kecuali oleh dirinya sendiri)
$sudahDipakai = User::where(function ($query) use ($value) {
$query->where('nisn', $value)->orWhere('nip', $value);
})->where('id', '!=', $id)->exists();
if ($sudahDipakai) {
$fail("{$label} ini sudah digunakan oleh akun lain.");
return;
}
if (in_array($request->role, ['siswa', 'guru'])) {
$terdaftar = MasterInduk::where('nomor_induk', $value)
->where('role', $request->role)
->exists();
if (!$terdaftar) {
$fail("{$label} tidak terdaftar di data sekolah. Hubungi admin.");
}
}
},
],
]);
$user = User::findOrFail($id);
$user->name = $request->nama_lengkap;
$user->email = $request->email;
$user->role = $request->role;
$user->no_hp = $request->no_hp;
// Jika password diisi, maka update. Jika kosong, biarkan password lama.
if ($request->filled('password')) {
$user->password = \Illuminate\Support\Facades\Hash::make($request->password);
}
$user->nisn = null;
$user->nip = null;
$user->kelas = null;
$user->golongan = null;
// Masukkan kembali sesuai role
if ($request->role == 'siswa') {
$user->nisn = $request->nomor_induk;
$user->kelas = $request->kelas;
$user->golongan = $request->golongan;
} else {
$user->nip = $request->nomor_induk;
}
$user->save();
return redirect()->route('admin.pengguna.index')->with('success', 'Data pengguna berhasil diperbarui.');
}
public function destroy($id)
{
User::findOrFail($id)->delete();
return back()->with('success', 'Pengguna berhasil dihapus.');
}
public function store(Request $request)
{
$validated = $request->validate([

View File

@ -5,7 +5,6 @@
use App\Models\Loan;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Auth;
class RiwayatController extends Controller
{

View File

@ -218,8 +218,7 @@ function(settings, data, dataIndex) {
});
$.ajax({
url: '{{ route('
admin.denda.sanksi ') }}',
url: "{{ route('admin.denda.sanksi') }}",
method: 'POST',
data: {
_token: '{{ csrf_token() }}',
@ -266,8 +265,7 @@ function(settings, data, dataIndex) {
});
$.ajax({
url: '{{ route('
admin.denda.sanksi ') }}',
url: "{{ route('admin.denda.sanksi ') }}",
method: 'POST',
data: {
_token: '{{ csrf_token() }}',

View File

@ -382,8 +382,7 @@ function hitungTotalDenda(modal) {
function finishTransaction(returnsData, userId, waLink) {
$.ajax({
url: '{{ route('
admin.peminjaman.kembali ') }}',
url: "{{ route('admin.peminjaman.kembali ') }}",
method: 'POST',
data: {
_token: '{{ csrf_token() }}',

View File

@ -71,23 +71,26 @@
@endif
</td>
<td class="text-center">
<a href="{{ route('admin.pengguna.edit', $user->id) }}"
class="btn btn-sm btn-warning">
<i class="bi bi-pencil"></i> Edit
</a>
<div class="d-flex justify-content-center gap-1">
<a href="{{ route('admin.pengguna.edit', $user->id) }}"
class="btn btn-sm btn-warning" title="Edit Pengguna">
<i class="bi bi-pencil"></i>
</a>
<button type="button" class="btn btn-sm btn-secondary btn-reset-password"
data-nama="{{ $user->name }}" title="Reset Password (OTP)">
<i class="bi bi-key-fill"></i>
</button>
<button type="button" class="btn btn-sm btn-secondary btn-reset-password"
data-nama="{{ $user->name }}" title="Reset Password (OTP)">
<i class="bi bi-key-fill"></i>
</button>
<form action="{{ route('admin.pengguna.destroy', $user->id) }}" method="POST"
class="d-inline form-delete-user" data-nama="{{ $user->name }}">
@csrf
@method('DELETE')
<button type="button" class="btn btn-sm btn-danger btn-hapus"><i
class="bi bi-trash"></i></button>
</form>
<form action="{{ route('admin.pengguna.destroy', $user->id) }}" method="POST"
class="form-delete-user" data-nama="{{ $user->name }}">
@csrf
@method('DELETE')
<button type="button" class="btn btn-sm btn-danger btn-hapus" title="Hapus Pengguna">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@empty
@ -149,8 +152,7 @@ class="bi bi-trash"></i></button>
</td>
<td class="text-center">
@php
$isRegistered = \App\Models\User::where('nisn', $item->nomor_induk)->orWhere('nip',
$item->nomor_induk)->exists();
$isRegistered = \App\Models\User::where('nomor_induk', $item->nomor_induk)->exists();
@endphp
@if ($isRegistered)
<span class="badge bg-success text-white"><i
@ -161,14 +163,16 @@ class="bi bi-hourglass-split me-1"></i>Belum Daftar</span>
@endif
</td>
<td class="text-center">
<form action="{{ route('admin.master-induk.destroy', $item->id) }}" method="POST"
class="d-inline form-delete-whitelist" data-induk="{{ $item->nomor_induk }}">
@csrf
@method('DELETE')
<button type="button" class="btn btn-sm btn-outline-danger btn-hapus-whitelist">
<i class="bi bi-trash"></i> Hapus
</button>
</form>
<div class="d-flex justify-content-center">
<form action="{{ route('admin.master-induk.destroy', $item->id) }}" method="POST"
class="form-delete-whitelist" data-induk="{{ $item->nomor_induk }}">
@csrf
@method('DELETE')
<button type="button" class="btn btn-sm btn-outline-danger btn-hapus-whitelist" title="Hapus Data Induk">
<i class="bi bi-trash"></i>
</button>
</form>
</div>
</td>
</tr>
@empty