} function drawControls() { const ctl = $("#monCtl"); if (!ctl) return; fetch(`/campaigns/${MON.id}`).then(r => r.json()).then(c => { ctl.innerHTML = ""; const mk = (label, cls, fn, confirmMsg) => { const b = el("button", { class: "btn sm " + cls, onclick: () => confirmMsg ? confirmedAction(confirmMsg, fn, { title: label }) : fn() }, label); ctl.append(b); }; if (c.status === "draft") mk("Start", "", async () => { await POST(`/campaigns/${MON.id}/start`); toast("Campaign started", "ok"); startMonitor(); }); if (c.status === "running") mk("Pause", "secondary", async () => { await POST(`/campaigns/${MON.id}/pause`); toast("Campaign paused", "ok"); startMonitor(); }); if (c.status === "paused") mk("Resume", "", async () => { await POST(`/campaigns/${MON.id}/resume`); toast("Campaign resumed", "ok"); startMonitor(); }); if (["running", "paused", "queued", "draft"].includes(c.status)) mk("Cancel", "danger-o", async () => { await POST(`/campaigns/${MON.id}/cancel`); toast("Campaign cancelled", "warn"); startMonitor(); }, `Cancel campaign #${MON.id}? In-flight messages already accepted by Gmail cannot be recalled.`); const ex = el("button", { class: "btn sm secondary", onclick: () => { window.location = `/campaigns/${MON.id}/export`; } }, "Export CSV"); const pv = el("button", { class: "btn sm secondary", onclick: () => campaignPreview(MON.id) }, "Preview"); ctl.append(ex, pv); }).catch(() => {}); } async function drawRecipients() {