109 lines
2.8 KiB
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.');
|
|
}
|
|
}
|