*/ public array $attachments = []; public ?int $status_id = null; /** * Mount the component. * * @param Ticket $ticket * @return void */ public function mount(Ticket $ticket): void { $this->authorize('view', $ticket); $this->ticket = $ticket->load(['owner', 'agent', 'status', 'priority', 'category', 'project', 'attachments.user']); $this->status_id = $this->ticket->status_id; } /** * Add a comment to the ticket. * * @param TicketService $tickets * @return void */ public function addComment(TicketService $tickets): void { $this->authorize('comment', $this->ticket); $this->validate([ 'commentBody' => ['required', 'string', 'min:2'], 'attachments.*' => 'file|max:' . config('helpdesk.max_upload_kb') . '|mimes:' . implode(',', config('helpdesk.allowed_mimes')), ]); $tickets->comment($this->ticket, Auth::user(), $this->commentBody, $this->internal, $this->attachments); $this->reset(['commentBody', 'internal', 'attachments']); $this->ticket = $this->ticket->fresh(['owner', 'agent', 'status', 'priority', 'category', 'project', 'comments.user', 'comments.attachments', 'attachments.user']); $this->dispatch('helpdesk-comment-added'); } /** * Update status using Livewire AJAX. * * @return void */ public function updateStatus(): void { $this->authorize('update', $this->ticket); $this->validate(['status_id' => ['required', 'integer', 'exists:helpdesk_statuses,id']]); $status = Status::query()->findOrFail($this->status_id); $this->ticket->forceFill([ 'status_id' => $status->id, 'completed_at' => $status->is_closed ? now() : null, 'last_activity_at' => now(), ])->save(); $this->ticket = $this->ticket->fresh(['owner', 'agent', 'status', 'priority', 'category', 'project', 'comments.user', 'comments.attachments', 'attachments.user']); $this->dispatch('helpdesk-status-updated'); } /** @return View */ public function render(): View { return view('helpdesk::livewire.ticket-show', [ 'statuses' => Status::query()->orderBy('sort_order')->get(), ])->layout('layouts.app'); } }