Files
coolify/app/Livewire/Team/AdminView.php
Andras Bacsai 0a35909ddf feat(ui): standardize paginated tables and responsive dropdowns
Add reusable pagination and page-size controls, improve mobile dropdown positioning, and migrate paginated views to consistent table components.
2026-08-16 00:58:23 +02:00

122 lines
3.2 KiB
PHP

<?php
namespace App\Livewire\Team;
use App\Models\User;
use Livewire\Component;
use Livewire\WithPagination;
class AdminView extends Component
{
use WithPagination;
public string $search = '';
public string $teamFilter = 'all';
public string $sort = 'name_asc';
public int $perPage = 10;
public function mount()
{
if (! isInstanceAdmin()) {
return redirect()->route('dashboard');
}
}
public function updatedSearch(): void
{
if (! isInstanceAdmin()) {
return;
}
$this->resetPage();
}
public function updatedTeamFilter(): void
{
$this->resetPage();
}
public function updatedSort(): void
{
$this->resetPage();
}
public function updatedPerPage(): void
{
$this->perPage = max(1, min(100, $this->perPage));
$this->resetPage();
}
public function submitSearch(): void
{
if (! isInstanceAdmin()) {
return;
}
$this->resetPage();
}
public function delete($id, $password, $selectedActions = [])
{
if (! isInstanceAdmin()) {
return redirect()->route('dashboard');
}
if (! verifyPasswordConfirmation($password, $this)) {
return 'The provided password is incorrect.';
}
if (! auth()->user()->isInstanceAdmin()) {
return $this->dispatch('error', 'You are not authorized to delete users');
}
$user = User::find($id);
if (! $user) {
return $this->dispatch('error', 'User not found');
}
try {
$user->delete();
$this->resetPage();
return true;
} catch (\Exception $e) {
return $this->dispatch('error', $e->getMessage());
}
}
public function render()
{
$search = trim($this->search);
$teamId = currentTeam()->id;
$users = User::query()
->where('id', '!=', auth()->id())
->when($search !== '', function ($query) use ($search): void {
$query->where(function ($query) use ($search): void {
$query->where('name', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%");
});
})
->when($this->teamFilter === 'current', function ($query) use ($teamId): void {
$query->whereHas('teams', fn ($teamQuery) => $teamQuery->where('teams.id', $teamId));
})
->when($this->teamFilter === 'outside', function ($query) use ($teamId): void {
$query->whereDoesntHave('teams', fn ($teamQuery) => $teamQuery->where('teams.id', $teamId));
})
->when($this->sort === 'name_desc', fn ($query) => $query->orderByDesc('name'))
->when($this->sort === 'email_asc', fn ($query) => $query->orderBy('email'))
->when($this->sort === 'email_desc', fn ($query) => $query->orderByDesc('email'))
->when($this->sort === 'name_asc', fn ($query) => $query->orderBy('name'))
->orderBy('id')
->paginate($this->perPage);
return view('livewire.team.admin-view', [
'users' => $users,
]);
}
}