filled('search')) { $search = $request->search; $query->where(function ($q) use ($search) { $q->where('name', 'like', "%{$search}%") ->orWhere('username', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%"); }); } if ($request->filled('role')) { $role = $request->role; $query->where(function ($q) use ($role) { $q->where('role', $role) ->orWhereJsonContains('roles', $role); }); } $users = $query->orderBy('name')->paginate(20); return view('users.index', compact('users')); } public function store(Request $request): RedirectResponse { $validated = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'username' => ['required', 'string', 'max:255', 'unique:users,username'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email'], 'password' => ['required', 'string', 'min:6'], 'roles' => ['required', 'array', 'min:1'], 'roles.*' => ['in:admin,bk,wali_kelas,staff,other,kepala_sekolah,waka_kesiswaan,ketua_tim'], 'is_active' => ['boolean'], ]); $roles = array_values(array_unique($validated['roles'])); $validated['roles'] = $roles; $validated['role'] = $roles[0]; $validated['password'] = Hash::make($validated['password']); $validated['is_active'] = $request->boolean('is_active', true); User::create($validated); return redirect()->route('users.index') ->with('success', 'User berhasil ditambahkan.'); } public function update(Request $request, User $user): RedirectResponse { $validated = $request->validate([ 'name' => ['required', 'string', 'max:255'], 'username' => ['required', 'string', 'max:255', 'unique:users,username,' . $user->id], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,' . $user->id], 'password' => ['nullable', 'string', 'min:6'], 'roles' => ['required', 'array', 'min:1'], 'roles.*' => ['in:admin,bk,wali_kelas,staff,other,kepala_sekolah,waka_kesiswaan,ketua_tim'], 'is_active' => ['boolean'], ]); $roles = array_values(array_unique($validated['roles'])); $validated['roles'] = $roles; $validated['role'] = $roles[0]; if (!empty($validated['password'])) { $validated['password'] = Hash::make($validated['password']); } else { unset($validated['password']); } $validated['is_active'] = $request->boolean('is_active', true); $user->update($validated); return redirect()->route('users.index') ->with('success', 'User berhasil diperbarui.'); } public function destroy(User $user): RedirectResponse { if ($user->id === auth()->id()) { return back()->with('error', 'Tidak bisa menghapus akun sendiri.'); } $user->delete(); return redirect()->route('users.index') ->with('success', 'User berhasil dihapus.'); } public function resetPassword(Request $request, User $user): RedirectResponse { if ($user->id === auth()->id() && $user->isAdmin()) { 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.'); } }