From 6f33f7712d5940c2e665cb210497eb287bd843e4 Mon Sep 17 00:00:00 2001 From: Bro Date: Fri, 24 Jul 2026 19:08:40 +0700 Subject: [PATCH] feat: reset password user dari admin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Tombol key (oranye) di samping edit user - Klik → SweetAlert2 modal: input password baru + konfirmasi - Validasi: min 6 karakter, harus cocok - Admin tidak bisa reset password sendiri (lewat profil) --- app/Http/Controllers/Admin/UserController.php | 18 ++++++++ resources/views/users/index.blade.php | 44 ++++++++++++++++++- routes/web.php | 1 + 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 192a915..87b78f9 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -89,4 +89,22 @@ class UserController extends Controller return redirect()->route('users.index') ->with('success', 'User berhasil dihapus.'); } + + public function resetPassword(Request $request, User $user): RedirectResponse + { + if ($user->id === auth()->id() && $user->role === 'admin') { + return back()->with('error', 'Ganti password admin lewat profil.'); + } + + $validated = $request->validate([ + 'new_password' => ['required', 'string', 'min:6'], + ]); + + $user->update([ + 'password' => Hash::make($validated['new_password']), + ]); + + return redirect()->route('users.index') + ->with('success', 'Password untuk ' . $user->name . ' berhasil direset.'); + } } diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php index 002d629..d5ee6ef 100644 --- a/resources/views/users/index.blade.php +++ b/resources/views/users/index.blade.php @@ -111,9 +111,13 @@
+ @if($user->id !== auth()->id())
@@ -258,6 +262,44 @@ function userManager() { } }; } + function resetPassword(userId, userName) { + Swal.fire({ + title: 'Reset Password untuk ' + userName, + html: '' + + '', + confirmButtonText: ' Simpan', + showCancelButton: true, + cancelButtonText: 'Batal', + preConfirm: () => { + const pwd = document.getElementById('new-password').value; + const confirm = document.getElementById('confirm-password').value; + if (!pwd || pwd.length < 6) { + Swal.showValidationMessage('Password minimal 6 karakter'); + return false; + } + if (pwd !== confirm) { + Swal.showValidationMessage('Password tidak cocok'); + return false; + } + return pwd; + } + }).then((result) => { + if (result.isConfirmed) { + fetch('{{ url('users') }}/' + userId + '/reset-password', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content, + 'Accept': 'application/json', + }, + body: JSON.stringify({ new_password: result.value }), + }).then(r => { + if (r.redirected) window.location.href = r.url; + else location.reload(); + }); + } + }); + } @endpush @endsection diff --git a/routes/web.php b/routes/web.php index d65e44e..f5d6219 100644 --- a/routes/web.php +++ b/routes/web.php @@ -137,6 +137,7 @@ Route::middleware('auth')->group(function () { Route::post('/users', [UserController::class, 'store'])->name('users.store'); Route::put('/users/{user}', [UserController::class, 'update'])->name('users.update'); Route::delete('/users/{user}', [UserController::class, 'destroy'])->name('users.destroy'); + Route::post('/users/{user}/reset-password', [UserController::class, 'resetPassword'])->name('users.reset-password'); Route::get('/settings/permissions', [\App\Http\Controllers\Admin\PermissionController::class, 'index'])->name('settings.permissions'); Route::post('/settings/permissions', [\App\Http\Controllers\Admin\PermissionController::class, 'update'])->name('settings.permissions.update');