From ff8fc51500de0f75ed33297d1882983ca961b462 Mon Sep 17 00:00:00 2001 From: pand03-CEO Date: Wed, 14 Oct 2026 11:35:28 +0700 Subject: [PATCH] Hidupkan CRUD level-user: store/show/update/destroy + inline form + cegah hapus level terpakai --- .../Setup/UserLevel/LevelUserController.php | 50 +++++- app/Models/LevelPegawai.php | 2 + .../setup/UserLevel/level-user.blade.php | 160 ++++++++---------- 3 files changed, 120 insertions(+), 92 deletions(-) diff --git a/app/Http/Controllers/Parking/Setup/UserLevel/LevelUserController.php b/app/Http/Controllers/Parking/Setup/UserLevel/LevelUserController.php index 387cc82..26a686a 100644 --- a/app/Http/Controllers/Parking/Setup/UserLevel/LevelUserController.php +++ b/app/Http/Controllers/Parking/Setup/UserLevel/LevelUserController.php @@ -7,6 +7,7 @@ use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; class LevelUserController extends Controller @@ -43,7 +44,24 @@ public function create() */ public function store(Request $request) { - // + $data = $request->validate( + [ + 'level_code' => 'required|string|max:10|unique:level_user,level_code', + 'level_name' => 'required|string|max:30', + ], + [ + 'level_code.unique' => 'Kode level sudah dipakai, ganti dengan yang unik.', + ] + ); + + $level = LevelPegawai::create([ + 'level_code' => $data['level_code'], + 'level_name' => $data['level_name'], + 'create_by' => Auth::user()->nomer ?? Auth::user()->username ?? 'system', + 'create_date' => now(), + ]); + + return response()->json(['success' => true, 'message' => 'Level pengguna berhasil ditambahkan.', 'data' => $level], 201); } /** @@ -54,7 +72,7 @@ public function store(Request $request) */ public function show($id) { - Log::info($id); + return response()->json(['success' => true, 'data' => LevelPegawai::findOrFail($id)]); } /** @@ -65,7 +83,7 @@ public function show($id) */ public function edit($id) { - // + return response()->json(['success' => true, 'data' => LevelPegawai::findOrFail($id)]); } /** @@ -77,7 +95,17 @@ public function edit($id) */ public function update(Request $request, $id) { - // + // level_code tidak bisa diubah (dipakai relasi pegawai.level_pegawai) + $data = $request->validate(['level_name' => 'required|string|max:30']); + + $level = LevelPegawai::findOrFail($id); + $level->update([ + 'level_name' => $data['level_name'], + 'update_by' => Auth::id(), + 'update_date' => now(), + ]); + + return response()->json(['success' => true, 'message' => 'Level pengguna berhasil diperbarui.', 'data' => $level]); } /** @@ -88,6 +116,18 @@ public function update(Request $request, $id) */ public function destroy($id) { - // + $level = LevelPegawai::findOrFail($id); + + $dipakai = DB::table('pegawai')->where('level_pegawai', $level->level_code)->count(); + if ($dipakai > 0) { + return response()->json([ + 'success' => false, + 'message' => "Level {$level->level_code} dipakai {$dipakai} pegawai, tidak bisa dihapus.", + ], 409); + } + + $level->delete(); + + return response()->json(['success' => true, 'message' => 'Level pengguna berhasil dihapus.']); } } diff --git a/app/Models/LevelPegawai.php b/app/Models/LevelPegawai.php index 5f2054a..3ccf6a3 100644 --- a/app/Models/LevelPegawai.php +++ b/app/Models/LevelPegawai.php @@ -10,6 +10,8 @@ class LevelPegawai extends Model use HasFactory; protected $table = 'level_user'; + protected $primaryKey = 'level_id'; + public $timestamps = false; // pakai create_date / update_date manual protected $fillable = [ 'level_code', 'level_name','create_by','create_date','update_date','update_by' diff --git a/resources/views/setup/UserLevel/level-user.blade.php b/resources/views/setup/UserLevel/level-user.blade.php index 5409067..3c2a10d 100644 --- a/resources/views/setup/UserLevel/level-user.blade.php +++ b/resources/views/setup/UserLevel/level-user.blade.php @@ -56,9 +56,9 @@
-

Daftar Pintu/Pos

+

Daftar Level Pengguna

- +
@@ -73,9 +73,9 @@ - + - +
No.
{{ $loop->iteration }} {{ $level->level_code }} {{ $level->level_code }} {{ $level->level_name }}{{ \Carbon\Carbon::parse($level->create_date)->format('Y-m-d')}}{{ $level->create_date ? \Carbon\Carbon::parse($level->create_date)->format('Y-m-d') : '-' }} @@ -86,11 +86,11 @@
-
- - - - +
+ + + +
@@ -102,6 +102,12 @@
+
@@ -120,85 +126,65 @@ - {{-- --}} + function formRow(mode, level) { + const isEdit = mode === 'edit'; + return `
`; + } + + $('#level-table tbody').on('click', 'tr:not(.level-form-row)', function () { setSelected(this); }); + $('#btnAddLevel').on('click', function () { $('.level-form-row').remove(); $('#level-table tbody').prepend(formRow('create')); setSelected(null); }); + $('#btnEditLevel').on('click', function () { if (!selected) return; $('.level-form-row').remove(); $('#level-table tbody tr').filter(function(){ return $(this).find('[data-level-id]').data('level-id') === selected.levelId; }).after(formRow('edit', selected)); }); + $(document).on('click', '.cancel-level-form', function () { $(this).closest('tr').remove(); }); + + $(document).on('submit', '.level-inline-form', function (event) { + event.preventDefault(); const form = $(this); const id = form.data('id'); const edit = form.data('mode') === 'edit'; + const btn = form.find('[type="submit"]'); const btnHtml = btn.html(); + btn.prop('disabled', true).html('Menyimpan...'); + $.ajax({ + url: edit ? routes.update.replace(':id', encodeURIComponent(id)) : routes.store, + type: edit ? 'PUT' : 'POST', data: form.serialize(), headers: {'X-CSRF-TOKEN': csrf}, + success: () => window.location.reload(), + error: xhr => { + btn.prop('disabled', false).html(btnHtml); + Swal.fire({icon: 'error', title: 'Gagal menyimpan', text: xhr.responseJSON?.message || Object.values(xhr.responseJSON?.errors || {}).flat().join('\n') || 'Gagal menyimpan level.'}); + } + }); + }); + + $('#btnDeleteLevel').on('click', function () { + if (!selected) return; + Swal.fire({title:'Hapus level?', text:`${selected.levelCode} - ${selected.levelName}`, icon:'warning', showCancelButton:true, confirmButtonText:'Ya, hapus', cancelButtonText:'Batal', confirmButtonColor:'#dc3545', showLoaderOnConfirm: true, preConfirm: () => $.ajax({url: routes.destroy.replace(':id', encodeURIComponent(selected.levelId)), type:'DELETE', headers:{'X-CSRF-TOKEN':csrf}}).catch(xhr => { Swal.showValidationMessage(xhr.responseJSON?.message || 'Level tidak dapat dihapus.'); })}) + .then(result => { if (result.isConfirmed && result.value) { Swal.fire({icon: 'success', title: 'Berhasil', text: 'Level dihapus.', timer: 1500, showConfirmButton: false}).then(() => window.location.reload()); } }); + }); + + $('#btnDetailLevel').on('click', function () { + if (!selected) return; + const btn = $(this); const btnHtml = btn.html(); + btn.prop('disabled', true).html('Memuat...'); + $('#level-detail-body').html('
Memuat detail...
'); + new bootstrap.Modal(document.getElementById('level-detail-modal')).show(); + $.get(routes.show.replace(':id', encodeURIComponent(selected.levelId)), function(r) { + $('#level-detail-body').html(`
Level Code
${r.data.level_code}
Nama Level
${r.data.level_name}
Dibuat
${r.data.create_date ?? '-'}
Diubah
${r.data.update_date ?? '-'}
`); + }).fail(xhr => { $('#level-detail-body').html('
' + (xhr.responseJSON?.message || 'Gagal memuat detail.') + '
'); }).always(() => btn.prop('disabled', false).html(btnHtml)); + }); + }); + @endsection