visibleTo(Auth::user())->findOrFail($ticketId); $status = Status::query()->findOrFail($statusId); $oldStatus = $ticket->status?->name; $ticket->forceFill([ 'status_id' => $status->id, 'completed_at' => $status->is_closed ? now() : null, 'last_activity_at' => now(), ])->save(); $workflow->dispatch( $ticket->fresh(['owner', 'agent', 'status', 'priority', 'category', 'project', 'team']), $status->is_closed ? 'ticket_closed' : 'ticket_updated', Auth::user() ); session()->flash('success', 'Ticket moved to ' . $status->name . '.'); } /** * Render the Kanban board. * * @return View */ public function render(): View { return view('helpdesk::livewire.kanban-board', [ 'statuses' => Status::query()->orderBy('sort_order')->get(), 'ticketsByStatus' => $this->ticketsByStatus(), ])->layout('layouts.app'); } /** * Get visible tickets grouped by status. * * @return array> */ private function ticketsByStatus(): array { return Ticket::query() ->with(['owner', 'agent', 'status', 'priority', 'category', 'project', 'team']) ->visibleTo(Auth::user()) ->latest('last_activity_at') ->limit(200) ->get() ->groupBy('status_id') ->all(); } }