@props(['comments', 'level' => 0, 'ticket' => null, 'canSeeInternalNotes' => false])
@foreach ($comments as $comment) @php $commentUser = $comment->relationLoaded('user') ? $comment->getRelation('user') : null; $commentAttachments = $comment->relationLoaded('attachments') ? $comment->getRelation('attachments') : collect(); $commentReplies = $comment->relationLoaded('replies') ? $comment->getRelation('replies') : collect(); $replyFormId = 'helpdesk-reply-form-'.$comment->id; $currentTicket = $ticket ?? $comment->ticket ?? null; $replyCount = $commentReplies->count(); $isInternal = (bool) $comment->is_internal; $borderClass = $isInternal ? 'border-purple-400/70 dark:border-purple-600/70' : 'border-zinc-200 dark:border-zinc-700'; $railClass = $isInternal ? 'bg-purple-500' : ((int) $level % 3 === 0 ? 'bg-red-500' : (((int) $level % 3 === 1) ? 'bg-blue-500' : 'bg-emerald-500')); $commentSubject = trim((string) ($comment->subject ?? '')); if ($commentSubject === '') { $plainSubject = trim((string) ($comment->body_text ?? strip_tags((string) $comment->body))); $commentSubject = Str::limit($plainSubject !== '' ? $plainSubject : 'Response', 72); } if ($isInternal && ! Str::startsWith(Str::lower($commentSubject), 'internal')) { $commentSubject = 'Internal note'; } $renderedBody = html_entity_decode((string) $comment->body, ENT_QUOTES | ENT_HTML5, 'UTF-8'); while (str_contains($renderedBody, '<') || str_contains($renderedBody, '>') || str_contains($renderedBody, '&lt;')) { $decodedBody = html_entity_decode($renderedBody, ENT_QUOTES | ENT_HTML5, 'UTF-8'); if ($decodedBody === $renderedBody) { break; } $renderedBody = $decodedBody; } if ($currentTicket !== null) { $renderedBody = strtr($renderedBody, [ '{{ ticket.reference }}' => (string) e((string) ($currentTicket->reference ?? '')), '{{ ticket.subject }}' => (string) e((string) ($currentTicket->subject ?? '')), '{{ ticket.status }}' => (string) e((string) ($currentTicket->status?->name ?? '')), '{{ ticket.priority }}' => (string) e((string) ($currentTicket->priority?->name ?? '')), '{{ ticket.category }}' => (string) e((string) ($currentTicket->category?->name ?? '')), '{{ ticket.project }}' => (string) e((string) ($currentTicket->project?->title ?? '')), '{{ ticket.team }}' => (string) e((string) ($currentTicket->team?->name ?? '')), '{{ requester.name }}' => (string) e((string) ($currentTicket->owner?->name ?? $currentTicket->user?->name ?? '')), '{{ agent.name }}' => (string) e((string) ($currentTicket->agent?->name ?? '')), '{{ actor.name }}' => (string) e((string) ($commentUser?->name ?? '')), '{{ ticket.url }}' => (string) e(route('helpdesk.tickets.show', ['ticket' => $currentTicket->getKey()])), ]); } $containsHtml = $renderedBody !== strip_tags($renderedBody); $renderedBody = preg_replace('/<\s*(script|style)[^>]*>.*?<\s*\/\s*\1\s*>/is', '', $renderedBody) ?: ''; $renderedBody = preg_replace('/\s+on[a-z]+\s*=\s*("[^"]*"|\'[^\']*\'|[^\s>]+)/i', '', $renderedBody) ?: ''; $renderedBody = preg_replace('/javascript\s*:/i', '', $renderedBody) ?: ''; $renderedBody = strip_tags($renderedBody, '