// jobs.js — Aktivitaets-Stream ("Incident Stream"): Hintergrund-Jobs mit Live-Log. // Exportiert track(id), damit andere Panels einen frisch gestarteten Job auto-aufklappen. import { $, esc } from "../core/ui.js"; const tracked = new Set(); let JOBS = []; export function track(id) { tracked.add(id); render(); } function statusBadge(state) { if (state === "done") return 'fertig'; if (state === "failed") return 'fehler'; return 'läuft…'; } function dotClass(state) { if (state === "done") return "on"; if (state === "failed") return ""; return "load"; } function mount() { $("#ov-activity").innerHTML = `

Aktivität

Noch nichts losgemacht.
Downloads, Updates & Co. erscheinen hier mit Live-Log.
`; // Klicks auf Job-Kopf -> auf/zuklappen (Event-Delegation) $("#jobs").addEventListener("click", e => { const h = e.target.closest(".job-h"); if (!h) return; const id = h.getAttribute("data-id"); tracked.has(id) ? tracked.delete(id) : tracked.add(id); render(); }); } function render() { const c = $("#jobs"); if (!c) return; $("#jobs-empty").style.display = JOBS.length ? "none" : "flex"; const failed = JOBS.filter(j => j.state === "failed").length; $("#job-count").textContent = JOBS.length ? (failed ? failed + " Fehler" : JOBS.length + " gesamt") : ""; c.innerHTML = JOBS.map(j => { const open = tracked.has(j.id); const log = open ? `
${esc((j.log || []).join("\n"))}
` : ""; return `
${esc(j.label)}${statusBadge(j.state)}
${log}
`; }).join(""); } function onJobs(jobs) { JOBS = jobs || []; render(); } export default { id: "jobs", mount, onJobs };