// intelligence → signals (trade signal cards + detail popover) // cards are glance-only; clicking opens a modal with the full breakdown. // depends on: app.js, intel-shared.js // full dataset kept in memory so filters/sort never re-fetch let allSignals = []; // local lookup of signal rows keyed by company_id — so the modal can // render without re-fetching. references are still lazy-loaded per open. const signalsById = new Map(); function renderSignals(data) { const grid = document.getElementById("intel-signals-grid"); const empty = document.getElementById("intel-signals-empty"); if (!data || data.length === 0) { grid.innerHTML = ""; empty.style.display = ""; return; } empty.style.display = "none"; // glance tile — header, a short summary preview, the three meta tags // (conf/risk/timeframe), and the most recent source-event date. drivers, // risks, refs etc live in the dialog. grid.innerHTML = data.map(s => { const summary = (s.summary || "").trim(); const evDate = s.latest_event_date ? s.latest_event_date.slice(0, 10) : ""; return `
${escapeHtml(summary)}
` : ""} ${evDate ? `Loading…
`; document.getElementById("signalOverlay").classList.add("open"); loadSignalReferences(companyId); } function closeSignalModal() { document.getElementById("signalOverlay").classList.remove("open"); currentSignal = null; } async function loadSignalReferences(companyId) { const container = document.getElementById("signal-modal-refs"); let data; try { data = await api(`/admin/api/intelligence/signals/${companyId}/references`); } catch (_) { container.innerHTML = `Failed to load references
`; return; } // guard against stale responses if the user closed/switched modals mid-request if (!currentSignal || currentSignal.company_id !== companyId) return; const events = data?.events || []; if (!events.length) { container.innerHTML = `No linked events
`; return; } container.innerHTML = events.map(ev => { const dateStr = (ev.event_date || ev.created_at || "").slice(0, 10); const articles = (ev.articles || []).map(a => { const src = a.source ? `${escapeHtml(a.source)}` : ""; const pd = a.pub_date ? `${escapeHtml(a.pub_date.slice(0, 10))}` : ""; return `No articles linked
`}