si-klinik/sk-klinik.my.id/app/Livewire/Admin/UserManager.php

109 lines
2.8 KiB
PHP

<?php
namespace App\Livewire\Admin;
use App\Models\User;
use Livewire\Component;
use Livewire\WithPagination;
use Spatie\Permission\Models\Role;
use Illuminate\Support\Facades\Hash;
use Masmerise\Toaster\Toaster;
class UserManager extends Component
{
use WithPagination;
public $userId, $name, $email, $password, $selectedRole;
public $search = '';
public $isModalOpen = false;
public $filterRole = '';
public function render()
{
$query = User::query();
// Filter berdasarkan Pencarian (Nama/Email)
if ($this->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.');
}
}