app.js

 1// Confirm danger buttons, split the trigger form's select, and stream the log.
 2document.addEventListener("submit", (e) => {
 3  const q = e.target.dataset.confirm;
 4  if (q && !confirm(q)) e.preventDefault();
 5});
 6document.addEventListener("DOMContentLoaded", () => {
 7  const target = document.getElementById("target");
 8  if (target) {
 9    const sync = () => {
10      const [repo, wf] = target.value.split("|");
11      document.getElementById("trigger-repo").value = repo;
12      document.getElementById("trigger-workflow").value = wf;
13    };
14    target.addEventListener("change", sync);
15    sync();
16  }
17  const log = document.getElementById("log");
18  if (log && log.dataset.live && window.EventSource) {
19    const atBottom = () => window.innerHeight + window.scrollY >= document.body.offsetHeight - 40;
20    const es = new EventSource(log.dataset.live);
21    es.onmessage = (m) => {
22      const l = JSON.parse(m.data);
23      const follow = atBottom();
24      const span = document.createElement("span");
25      span.className = "l " + l.class;
26      span.textContent = l.text;
27      log.append(span, "\n");
28      if (follow) window.scrollTo(0, document.body.scrollHeight);
29    };
30    es.addEventListener("end", () => { es.close(); location.reload(); });
31  }
32});