when($request->search, fn ($q, $v) => $q->where('name', 'like', "%$v%")->orWhere('email', 'like', "%$v%")) ->latest()->paginate(10)->withQueryString(); return view('admin.users.index', compact('users')); } public function create() { return view('admin.users.form', $this->formData(new User())); } public function store(Request $request) { $validated = $this->validated($request); $role = $validated['role'] ?? null; unset($validated['role']); $validated['password'] = Hash::make($validated['password']); $user = User::create($validated); $user->syncRoles($role ? [$role] : []); return redirect()->route('users.index')->with('success', 'User berjaya ditambah.'); } public function edit(User $user) { return view('admin.users.form', $this->formData($user)); } public function update(Request $request, User $user) { $validated = $this->validated($request, $user->id); $role = $validated['role'] ?? null; unset($validated['role']); if (empty($validated['password'])) { unset($validated['password']); } else { $validated['password'] = Hash::make($validated['password']); } $user->update($validated); $user->syncRoles($role ? [$role] : []); return redirect()->route('users.index')->with('success', 'User berjaya dikemaskini.'); } public function destroy(User $user) { $user->update(['status' => ! $user->status]); return back()->with('success', 'Status user berjaya dikemaskini.'); } public function resetPassword(User $user) { $user->update(['password' => Hash::make('password')]); return back()->with('success', 'Kata laluan diset semula kepada: password'); } private function formData(User $user): array { return [ 'user' => $user, 'jabatan' => Jabatan::orderBy('nama')->get(), 'roles' => Role::orderBy('name')->get(), ]; } private function validated(Request $request, ?int $id = null): array { return $request->validate([ 'name' => ['required', 'max:255'], 'email' => ['required', 'email', 'unique:users,email,'.$id], 'no_telefon' => ['nullable', 'max:30'], 'jawatan' => ['nullable', 'max:255'], 'jabatan_id' => ['nullable', 'exists:jabatan,id'], 'role' => ['nullable', 'exists:roles,name'], 'password' => [$id ? 'nullable' : 'required', 'confirmed', 'min:8'], 'status' => ['nullable', 'boolean'], ]) + ['status' => $request->boolean('status')]; } }