gps_system/app/Livewire/UserManagement.php
sackey 6b878bb0a0
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
Initial commit
2025-09-12 16:19:56 +00:00

209 lines
6.1 KiB
PHP

<?php
namespace App\Livewire;
use App\Models\User;
use Spatie\Permission\Models\Role;
use Livewire\Component;
use Livewire\WithPagination;
class UserManagement extends Component
{
use WithPagination;
public $filters = [
'search' => '',
'status' => '',
'role' => '',
'subscription' => '',
];
public $showModal = false;
public $editingUser = null;
public $form = [
'name' => '',
'email' => '',
'password' => '',
'company' => '',
'status' => 'active',
'roles' => [],
'notes' => '',
];
public function mount()
{
//
}
public function render()
{
$users = User::query()
->when($this->filters['search'], function ($query) {
$query->where(function ($q) {
$q->where('name', 'like', '%' . $this->filters['search'] . '%')
->orWhere('email', 'like', '%' . $this->filters['search'] . '%');
});
})
->when($this->filters['status'], function ($query) {
$query->where('status', $this->filters['status']);
})
->when($this->filters['role'], function ($query) {
$query->role($this->filters['role']);
})
->when($this->filters['subscription'], function ($query) {
if ($this->filters['subscription'] === 'active') {
$query->whereHas('activeSubscription');
} elseif ($this->filters['subscription'] === 'expired') {
$query->whereHas('subscriptions', function ($q) {
$q->where('status', 'expired');
});
} elseif ($this->filters['subscription'] === 'none') {
$query->whereDoesntHave('subscriptions');
}
})
->with(['roles', 'activeSubscription'])
->paginate(15);
$roles = Role::all();
return view('livewire.user-management', [
'users' => $users,
'roles' => $roles,
]);
}
public function editUser($userId)
{
$this->editingUser = User::with('roles')->find($userId);
$this->form = [
'name' => $this->editingUser->name,
'email' => $this->editingUser->email,
'password' => '',
'company' => $this->editingUser->company,
'status' => $this->editingUser->status,
'roles' => $this->editingUser->roles->pluck('name')->toArray(),
'notes' => $this->editingUser->notes,
];
$this->showModal = true;
}
public function openCreateModal()
{
$this->resetForm();
$this->editingUser = null;
$this->showModal = true;
}
private function resetForm()
{
$this->form = [
'name' => '',
'email' => '',
'password' => '',
'company' => '',
'status' => 'active',
'roles' => [],
'notes' => ''
];
}
public function createUser()
{
$this->validate([
'form.name' => 'required|string|max:255',
'form.email' => 'required|email|unique:users,email',
'form.password' => 'required|string|min:8',
'form.company' => 'nullable|string|max:255',
'form.status' => 'required|in:active,inactive,suspended',
'form.notes' => 'nullable|string',
]);
$user = User::create([
'name' => $this->form['name'],
'email' => $this->form['email'],
'password' => bcrypt($this->form['password']),
'company' => $this->form['company'],
'status' => $this->form['status'],
'notes' => $this->form['notes'],
]);
if (!empty($this->form['roles'])) {
$user->assignRole($this->form['roles']);
}
$this->closeModal();
session()->flash('message', 'User created successfully.');
}
public function updateUser()
{
$this->validate([
'form.name' => 'required|string|max:255',
'form.email' => 'required|email|unique:users,email,' . $this->editingUser->id,
'form.password' => 'nullable|string|min:8',
'form.company' => 'nullable|string|max:255',
'form.status' => 'required|in:active,inactive,suspended',
'form.notes' => 'nullable|string',
]);
$this->editingUser->update([
'name' => $this->form['name'],
'email' => $this->form['email'],
'company' => $this->form['company'],
'status' => $this->form['status'],
'notes' => $this->form['notes'],
]);
if (!empty($this->form['password'])) {
$this->editingUser->update(['password' => bcrypt($this->form['password'])]);
}
$this->editingUser->syncRoles($this->form['roles']);
$this->closeModal();
session()->flash('message', 'User updated successfully.');
}
public function suspendUser($userId)
{
User::find($userId)->update(['status' => 'suspended']);
session()->flash('message', 'User suspended successfully.');
}
public function activateUser($userId)
{
User::find($userId)->update(['status' => 'active']);
session()->flash('message', 'User activated successfully.');
}
public function deleteUser($userId)
{
// Prevent deleting the current user
if ($userId == auth()->id()) {
session()->flash('error', 'You cannot delete your own account.');
return;
}
$user = User::find($userId);
if ($user) {
// Remove all roles before deleting
$user->syncRoles([]);
$user->delete();
session()->flash('message', 'User deleted successfully.');
}
}
public function closeModal()
{
$this->showModal = false;
$this->editingUser = null;
$this->reset('form');
}
public function updatingFilters()
{
$this->resetPage();
}
}