import { apiGet, apiUrl } from '../api.js'; import { esc, formatDateTime, formatRemoteDurationDe, telHref } from './utils.js'; function formatFileSizeDe(n) { if (n == null || typeof n !== 'number' || n < 0) return ''; if (n < 1024) return `${n} B`; if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`; return `${(n / (1024 * 1024)).toFixed(1)} MB`; } /** Zwischenspeicher für GET /integrations/teamviewer/connections */ let tvSessionsCache = null; /** HTML für die Inhaltsspalte (nur server-/formularbekannte Typen) */ export function eventInhaltHtml(ev) { const t = ev.type; if (t === 'CALL') { let h = `

Beschreibung

${esc(ev.description)}
`; if (ev.callbackNumber) { const th = telHref(ev.callbackNumber); const numHtml = th ? `${esc(ev.callbackNumber)}` : esc(ev.callbackNumber); h += `

Rückrufnummer: ${numHtml}

`; } return `${h}
`; } if (t === 'REMOTE') { let h = `

Beschreibung

${esc(ev.description)}
`; if (ev.teamviewerId) { h += `

Gerät-ID (TeamViewer): ${esc(ev.teamviewerId)}

`; } if (ev.remoteDurationSeconds != null) { h += `

Remote-Dauer: ${esc(formatRemoteDurationDe(ev.remoteDurationSeconds))}

`; } if (ev.teamviewerNotes && String(ev.teamviewerNotes).trim()) { h += `

Notizen: ${esc(String(ev.teamviewerNotes).trim())}

`; } return `${h}
`; } if (t === 'PART') { let h = `

Artikelnummer: ${esc(ev.articleNumber || '')}

`; if (ev.description && String(ev.description).trim()) { h += `

Bemerkung

${esc(ev.description)}
`; } return `${h}
`; } if (t === 'ATTACHMENT') { let h = ''; if (ev.description && String(ev.description).trim()) { h += `

Beschreibung

${esc(ev.description)}
`; } const atts = ev.attachments || []; if (atts.length === 0) { h += '

Keine Dateien.

'; } else { h += ''; } return h; } return `
${esc(ev.description)}
`; } export function fillTvDeviceSelect() { const userSel = document.getElementById('tv-user-select'); const devSel = document.getElementById('tv-conn-select'); if (!devSel) return; const ukey = userSel?.value ?? ''; devSel.innerHTML = ''; if (!ukey || !tvSessionsCache) { devSel.disabled = true; return; } const u = (tvSessionsCache.users || []).find((x) => x.userKey === ukey); const devices = u?.devices || []; if (devices.length === 0) { devSel.disabled = true; return; } devSel.disabled = false; devSel.innerHTML += devices .map( (d) => ``, ) .join(''); } export async function loadTeamViewerConnectionsIntoSelect() { const userSel = document.getElementById('tv-user-select'); const devSel = document.getElementById('tv-conn-select'); const hint = document.getElementById('tv-conn-hint'); if (!userSel || !devSel) return; userSel.innerHTML = ''; devSel.innerHTML = ''; devSel.disabled = true; if (hint) hint.textContent = ''; try { const data = await apiGet('/integrations/teamviewer/connections'); tvSessionsCache = data; const users = data.users || []; userSel.innerHTML = '' + users .map((u) => { const label = u.username && u.username !== '_unbekannt' ? u.username : u.userid ? `Benutzer ${u.userid}` : 'Unbekannt (Benutzer)'; return ``; }) .join(''); devSel.innerHTML = ''; devSel.disabled = true; userSel.onchange = () => fillTvDeviceSelect(); if (hint) { const ndev = users.reduce((n, u) => n + (u.devices?.length || 0), 0); if (users.length) { hint.textContent = `${users.length} Benutzer, ${ndev} Gerät(e)/Session(s).`; } else { hint.textContent = data.meta?.recordCount === 0 ? 'Keine Verbindungen in den letzten 7 Tagen.' : 'Keine gruppierten Einträge (TeamViewer-Antwort prüfen).'; } } } catch (e) { tvSessionsCache = null; userSel.innerHTML = ''; devSel.innerHTML = ''; devSel.disabled = true; if (hint) hint.textContent = e.message || 'Fehler'; } } export function syncEventFormFieldGroups(form) { const sel = form.querySelector('#ev-type-sel'); if (!sel) return; const v = sel.value; form.querySelectorAll('.ev-field-group').forEach((el) => { const show = el.getAttribute('data-ev-type') === v; el.hidden = !show; el.querySelectorAll('input, textarea').forEach((inp) => { const name = inp.getAttribute('name'); let req = false; if (show) { if (v === 'NOTE' && name === 'description_note') req = true; if (v === 'CALL' && name === 'description_call') req = true; if (v === 'REMOTE' && name === 'description_remote') req = false; if (v === 'PART' && name === 'articleNumber') req = true; if (v === 'ATTACHMENT') req = false; } inp.required = req; }); }); if (v === 'REMOTE') { loadTeamViewerConnectionsIntoSelect(); } } /** Neueste zuerst; ATTACHMENT-Blöcke bleiben unten (innerhalb ebenfalls neuer über älter). */ export function sortEventsChronologicalWithAttachmentsLast(events) { const non = events .filter((e) => e.type !== 'ATTACHMENT') .sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)); const att = events .filter((e) => e.type === 'ATTACHMENT') .sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)); return [...non, ...att]; } export function buildEventPostBody(ticketId, fd) { const type = fd.get('type'); const base = { ticketId, type }; if (type === 'NOTE') { return { ...base, description: fd.get('description_note') }; } if (type === 'CALL') { return { ...base, description: fd.get('description_call'), callbackNumber: fd.get('callbackNumber'), }; } if (type === 'REMOTE') { const body = { ...base, description: fd.get('description_remote'), }; const tv = fd.get('teamviewerDevice'); if (tv && String(tv).trim()) body.teamviewerId = String(tv).trim(); return body; } if (type === 'PART') { return { ...base, articleNumber: fd.get('articleNumber'), description: fd.get('description_part') || '', }; } return base; }