// Carte d'un job. Le détail (id, event, date) est replié par défaut ; le // bouton « Watch activity » remonte un évènement `job-select` que le dashboard // écoute pour ouvrir le flux d'activité du job. import { escapeHtml, relativeTime } from "./api.js"; class JobCard extends HTMLElement { set job(value) { this._job = value; this.render(); } get job() { return this._job; } set selected(value) { this._selected = Boolean(value); this.render(); } connectedCallback() { this.render(); } render() { if (!this._job) return; const job = this._job; // Préserve l'état replié/déplié à travers les re-rendus (mises à jour SSE). const open = this._details?.open ? " open" : ""; this.innerHTML = `
${escapeHtml(job.repo)} #${job.pr}
Job
${job.id}
${job.event_id != null ? `
Event
${job.event_id}
` : ""}
Created
${escapeHtml(relativeTime(job.created_at))}
`; this._details = this.querySelector("details"); this.querySelector(".job-watch").addEventListener("click", () => this.select()); } select() { this.dispatchEvent( new CustomEvent("job-select", { detail: { id: this._job.id }, bubbles: true }), ); } } customElements.define("steep-job-card", JobCard);