import { renderEmptyState } from './helpdesk-empty-state.js'; function esc(str) { const d = document.createElement('div'); d.textContent = String(str ?? ''); return d.innerHTML; } function activityActionLabel(typeVariant, type, stateSubtype, t) { if (typeVariant === 'status') { const base = t('changed status'); return stateSubtype ? `${base} (${stateSubtype})` : base; } if (typeVariant === 'forward') { return t('Forwarded'); } if (typeVariant === 'file') { return t('attached a file'); } if (type && String(type).trim() !== '') { return type; } return t('logged an activity'); } function entryTimestamp(entry, t) { const date = entry.date || ''; const timeRaw = entry.time || ''; const time = timeRaw.length >= 5 ? timeRaw.slice(0, 5) : timeRaw; if (date && time) return `${date} ${time}`; if (entry.timestamp_iso) return entry.timestamp_iso; if (date) return date; return '—'; } function participantRole(entry) { const explicitRole = String(entry.actor_role || '').trim().toLowerCase(); if (explicitRole === 'customer' || explicitRole === 'support') { return explicitRole; } const actor = String(entry.actor || '').trim().toLowerCase(); if (actor.startsWith('kt') || actor.includes('kontakt') || actor.includes('contact')) { return 'customer'; } return 'support'; } function ticketHref(baseUrl, ticketNo) { const base = String(baseUrl || '').trim(); const no = String(ticketNo || '').trim(); if (!base || !no) return ''; return `${base}${encodeURIComponent(no)}`; } export function renderCommunicationError(message) { return ``; } export function renderCommunicationHint(message) { return `

${esc(message)}

`; } export function renderCommunicationFeed(entries, options = {}) { const { t = (k) => k, emptyMessage = 'No communication found.', showTicketNo = false, ticketBaseUrl = '', fileDownloadUrl = '', } = options; const list = Array.isArray(entries) ? entries : []; if (list.length === 0) { return renderEmptyState({ message: t(emptyMessage), size: 'compact', align: 'center', icon: false, }); } let html = '
    '; for (const entry of list) { const actor = entry.actor || 'System'; const typeVariant = entry.type_variant || 'other'; const type = entry.type || ''; const stateSubtype = entry.state_subtype || ''; const message = entry.message || ''; const ticketNo = entry.ticket_no || ''; const timeLabel = entryTimestamp(entry, t); const ticketUrl = ticketHref(ticketBaseUrl, ticketNo); if (typeVariant === 'message') { const role = participantRole(entry); html += `
  1. `; html += '
    '; html += `${esc(actor)}`; html += ''; if (showTicketNo && ticketNo) { if (ticketUrl) { html += `${esc(t('Ticket'))} ${esc(ticketNo)}`; } else { html += `${esc(t('Ticket'))} ${esc(ticketNo)}`; } } html += `${esc(timeLabel)}`; html += ''; html += '
    '; html += `

    ${esc(message)}

    `; html += '
  2. '; continue; } // File attachment: render download link and inline image for images if (typeVariant === 'file' && fileDownloadUrl && entry.file_entry_no) { const fileName = entry.file_name || 'attachment'; const fileUrl = fileDownloadUrl + '?entryNo=' + encodeURIComponent(entry.file_entry_no) + '&filename=' + encodeURIComponent(fileName); const ext = fileName.includes('.') ? fileName.split('.').pop().toLowerCase() : ''; const imageExts = ['jpg', 'jpeg', 'png', 'gif', 'bmp']; const isImage = imageExts.includes(ext); html += `
  3. `; html += `
    `; html += `${esc(actor)} ${esc(t('attached a file'))}`; if (timeLabel) html += ` ${esc(t('on'))} ${esc(timeLabel)}`; html += ``; if (isImage) { html += `${esc(fileName)}`; } html += ` ${esc(fileName)}`; html += '
    '; html += '
  4. '; continue; } const activityAction = activityActionLabel(typeVariant, type, stateSubtype, t); let activityText = `${actor} ${activityAction}`.trim(); if (timeLabel) { activityText += ` ${t('on')} ${timeLabel}`; } if (showTicketNo && ticketNo) { activityText += ` · ${t('Ticket')} ${ticketNo}`; } html += `
  5. `; html += `
    ${esc(activityText)}
    `; html += '
  6. '; } html += '
'; return html; }