209 lines
6.1 KiB
PHP
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();
|
|
}
|
|
}
|