resetPage(); } /** * Render the ticket list. * * @return View */ public function render(): View { return view('helpdesk::livewire.ticket-index', [ 'tickets' => $this->tickets(), 'statuses' => Status::query()->orderBy('sort_order')->get(), 'priorities' => Priority::query()->orderBy('sort_order')->get(), ])->layout('layouts.app'); } /** * Build paginated ticket results. * * @return LengthAwarePaginator */ private function tickets(): LengthAwarePaginator { $user = Auth::user(); return Ticket::query() ->with(['owner', 'agent', 'status', 'priority', 'category', 'project']) ->visibleTo($user) ->when($this->scope === 'open', static fn (Builder $query): Builder => $query->whereNull('completed_at')) ->when($this->scope === 'closed', static fn (Builder $query): Builder => $query->whereNotNull('completed_at')) ->when($this->status !== '', fn (Builder $query): Builder => $query->where('status_id', (int) $this->status)) ->when($this->priority !== '', fn (Builder $query): Builder => $query->where('priority_id', (int) $this->priority)) ->when($this->search !== '', function (Builder $query): Builder { return $query->where(static function (Builder $subQuery): void { $subQuery->where('reference', 'like', '%' . $this->search . '%') ->orWhere('subject', 'like', '%' . $this->search . '%') ->orWhere('body', 'like', '%' . $this->search . '%'); }); }) ->latest('last_activity_at') ->paginate(15); } }