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 listMineEl = document.getElementById('home-ticket-list-mine'); const emptyEl = document.getElementById('home-empty'); const tpl = document.getElementById('tpl-home-ticket'); function formatAssigneeLabel(ticket) { const u = ticket.assignedTo; if (!u) return '—'; const name = [u.firstName, u.lastName].filter(Boolean).join(' ').trim(); return name || u.username || u.id; } 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 ? '▲' : '▼'; }; } function renderTicketListInto(container, tickets, eventsLists, listKind) { container.innerHTML = ''; tickets.forEach((t, i) => { const frag = tpl.content.cloneNode(true); const article = frag.querySelector('.home-ticket-card'); fillTicketCard(article, t, eventsLists[i] || [], listKind); container.appendChild(article); }); } async function run() { const [ticketsAll, ticketsMine] = await Promise.all([ apiGet('/tickets?open=1&assignedTo=not_me'), apiGet('/tickets?open=1&assignedTo=me'), ]); const eventsAll = ticketsAll.length === 0 ? [] : await Promise.all(ticketsAll.map((t) => apiGet(`/tickets/${t.id}/events`))); const eventsMine = ticketsMine.length === 0 ? [] : await Promise.all(ticketsMine.map((t) => apiGet(`/tickets/${t.id}/events`))); const openCount = ticketsAll.filter((t) => t.status === 'OPEN').length; const waitingCount = ticketsAll.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: ${ticketsAll.length}`; const mineOpen = ticketsMine.filter((t) => t.status === 'OPEN').length; const mineWaiting = ticketsMine.filter((t) => t.status === 'WAITING').length; document.getElementById('kpi-mine-open').textContent = `${mineOpen} Offen`; document.getElementById('kpi-mine-waiting').textContent = `${mineWaiting} Wartend`; document.getElementById('kpi-mine-total').textContent = `gesamt: ${ticketsMine.length}`; if (ticketsAll.length === 0) { emptyEl.hidden = false; emptyEl.textContent = 'Keine offenen Tickets.'; listEl.innerHTML = ''; } else { emptyEl.hidden = true; renderTicketListInto(listEl, ticketsAll, eventsAll, 'open'); } renderTicketListInto(listMineEl, ticketsMine, eventsMine, 'mine'); } 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();