@php $helpdeskAttachmentAccept = collect(config('helpdesk.allowed_extensions', config('helpdesk.allowed_mimes', []))) ->filter(fn ($extension) => is_string($extension) && trim($extension) !== '') ->map(fn ($extension) => '.' . strtolower(ltrim(trim($extension), '.'))) ->unique() ->implode(','); @endphp @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, '