// 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 };