// cockpit/fester-module/targets.js // State for available targets let targets = []; // Fetch current targets from backend async function fetchTargets() { try { const res = await fetch("/api/targets"); targets = await res.json(); renderTargets(); } catch (err) { console.error("Failed to fetch targets:", err); } } // Render target list in the sidebar function renderTargets() { let sidebar = document.getElementById("sidebar"); let panel = document.getElementById("targets-panel"); if(!panel) { panel = document.createElement("div"); panel.id = "targets-panel"; panel.className = "panel"; sidebar.appendChild(panel); } panel.innerHTML = "

Targets

"; targets.forEach(target => { const container = document.createElement("div"); container.style.marginBottom = "5px"; const checkbox = document.createElement("input"); checkbox.type = "checkbox"; checkbox.id = `target-${target.name}`; checkbox.checked = target.enabled; checkbox.addEventListener("change", () => toggleTarget(target.name, checkbox.checked)); const label = document.createElement("label"); label.htmlFor = checkbox.id; label.innerText = target.name; container.appendChild(checkbox); container.appendChild(label); panel.appendChild(container); }); } // Enable/disable target via backend async function toggleTarget(targetName, enabled) { try { const res = await fetch(`/api/targets/${targetName}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ enabled }) }); if (!res.ok) { console.error("Failed to update target", targetName); } else { console.log(`Target ${targetName} set to ${enabled}`); } } catch (err) { console.error("Error toggling target:", err); } } // WebSocket for live target state updates const wsTargets = new WebSocket("ws://localhost:8080/ws-targets"); wsTargets.onmessage = (msg) => { const event = JSON.parse(msg.data); if (event.type === "target-update") { const t = targets.find(t => t.name === event.data.name); if (t) { t.enabled = event.data.enabled; renderTargets(); } } }; // Initial fetch fetchTargets();