import { apiGet, isAuthRedirectError } from '../api.js'; import { guard } from '../core/auth-guard.js'; import { ticketStatusLabel, ticketPriorityLabel, eventTypeLabel, eventTypeBadgeClass, statusBadgeClass, priorityBadgeClass, } from '../core/constants.js'; import { esc, formatDateTime, extrasName } from '../core/utils.js'; import { bindAttachmentPreview } from '../core/attachment-preview.js'; import { eventInhaltHtml, sortEventsChronologicalWithAttachmentsLast, } from '../core/ticket-events.js'; const loadingEl = document.getElementById('page-loading'); const mainEl = document.getElementById('page-main'); const errEl = document.getElementById('page-error'); const listEl = document.getElementById('home-ticket-list'); const emptyEl = document.getElementById('home-empty'); const tpl = document.getElementById('tpl-home-ticket'); function showError(msg) { loadingEl.hidden = true; mainEl.hidden = true; errEl.hidden = false; errEl.textContent = msg; } function renderEventBoxes(events) { const evChrono = sortEventsChronologicalWithAttachmentsLast(events); if (evChrono.length === 0) { return '
Noch keine Ereignisse in der Historie.
'; } return evChrono .map( (ev) => `Maschine: ${esc(m.seriennummer)}${mn ? ` · ${esc(mn)}` : ''} · Typ: ${esc(m.typ)}
`; } else { mBlock.innerHTML = ''; } node.querySelector('.js-events').innerHTML = renderEventBoxes(events); const chev = btn.querySelector('.home-ticket-chevron'); btn.onclick = () => { const willShow = panel.hidden; panel.hidden = !willShow; btn.setAttribute('aria-expanded', String(willShow)); chev.textContent = willShow ? '▲' : '▼'; }; } async function run() { const tickets = await apiGet('/tickets?open=1'); const eventsLists = tickets.length === 0 ? [] : await Promise.all(tickets.map((t) => apiGet(`/tickets/${t.id}/events`))); const openCount = tickets.filter((t) => t.status === 'OPEN').length; const waitingCount = tickets.filter((t) => t.status === 'WAITING').length; document.getElementById('kpi-open').textContent = `${openCount} Offen`; document.getElementById('kpi-waiting').textContent = `${waitingCount} Wartend`; document.getElementById('kpi-total').textContent = `gesamt: ${tickets.length}`; listEl.innerHTML = ''; if (tickets.length === 0) { emptyEl.hidden = false; } else { emptyEl.hidden = true; tickets.forEach((t, i) => { const frag = tpl.content.cloneNode(true); const article = frag.querySelector('.home-ticket-card'); fillTicketCard(article, t, eventsLists[i] || []); listEl.appendChild(article); }); } } async function init() { const st = await guard({ activeNav: 'start' }); if (!st) return; loadingEl.hidden = true; mainEl.hidden = false; bindAttachmentPreview(document.body); try { await run(); } catch (e) { if (isAuthRedirectError(e)) return; showError(e.message || 'Fehler'); } } init();