search) { $query->where(function ($q) { $q->where('name', 'like', '%' . $this->search . '%') ->orWhere('email', 'like', '%' . $this->search . '%'); }); } // Filter berdasarkan Role if ($this->filterRole) { $query->role($this->filterRole); // Scope dari Spatie Permission } return view('livewire.admin.user-manager', [ 'users' => $query->latest()->paginate(10), 'roles' => Role::all() ]); } public function create() { $this->reset(['userId', 'name', 'email', 'password', 'selectedRole']); $this->isModalOpen = true; } public function edit(User $user) { $this->userId = $user->id; $this->name = $user->name; $this->email = $user->email; $this->selectedRole = $user->roles->pluck('name')->first(); $this->password = ''; // Kosongkan password saat edit $this->isModalOpen = true; } public function save() { $rules = [ 'name' => 'required|string|max:255', 'email' => 'required|email|unique:users,email,' . $this->userId, 'selectedRole' => 'required', ]; // Password hanya wajib jika user baru if (!$this->userId) { $rules['password'] = 'required|min:8'; } $this->validate($rules); $data = [ 'name' => $this->name, 'email' => $this->email, ]; if ($this->password) { $data['password'] = Hash::make($this->password); } $user = User::updateOrCreate( ['id' => $this->userId], $data ); // Sinkronisasi Role (Spatie) $user->syncRoles($this->selectedRole); Toaster::success($this->userId ? 'User berhasil diperbarui!' : 'User berhasil dibuat!'); $this->isModalOpen = false; } public function delete($id) { $user = User::findOrFail($id); if ($user->id === auth()->id()) { Toaster::error('Anda tidak bisa menghapus akun sendiri!'); return; } $user->delete(); Toaster::success('User telah dihapus.'); } }