102 lines
3.2 KiB
JavaScript
102 lines
3.2 KiB
JavaScript
// helpers shared across all intelligence sub-pages:
|
|
// stats-row loader, company dropdown, detail modal opener.
|
|
// depends on: app.js
|
|
|
|
async function loadIntelStatsRow() {
|
|
const row = document.getElementById("intel-stats-row");
|
|
if (!row) return true;
|
|
|
|
const data = await api("/admin/api/intelligence/stats");
|
|
const notice = document.getElementById("intel-unavailable");
|
|
const content = document.getElementById("intel-content");
|
|
|
|
if (!data.available) {
|
|
if (notice) notice.style.display = "";
|
|
if (content) content.style.display = "none";
|
|
row.style.display = "none"; // hide the full-width stats strip too
|
|
return false;
|
|
}
|
|
|
|
if (notice) notice.style.display = "none";
|
|
if (content) content.style.display = "";
|
|
row.style.display = "";
|
|
|
|
const queueMap = {};
|
|
(data.queue || []).forEach(r => queueMap[r.status] = r.n);
|
|
|
|
row.innerHTML = [
|
|
["Queue pending", (queueMap.pending || 0).toLocaleString()],
|
|
["Processed", (queueMap.processed || 0).toLocaleString()],
|
|
["Skipped", (queueMap.skipped || 0).toLocaleString()],
|
|
["Knowledge rows", data.knowledge.toLocaleString()],
|
|
["Predictions", data.predictions.toLocaleString()],
|
|
["Companies", `${data.embeddings}/${data.companies} embedded`],
|
|
].map(([label, value]) => `
|
|
<div class="intel-stat-card">
|
|
<span class="label">${label}</span>
|
|
<span class="value">${value}</span>
|
|
</div>
|
|
`).join("");
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
async function loadIntelCompanies() {
|
|
const sel = document.getElementById("i-company");
|
|
if (!sel) return;
|
|
|
|
const companies = await api("/admin/api/intelligence/companies");
|
|
const current = queryGet("company_id"); // preserve selection if url set it
|
|
|
|
sel.innerHTML = '<option value="">All companies</option>';
|
|
companies.forEach(c => {
|
|
const opt = document.createElement("option");
|
|
opt.value = c.id;
|
|
opt.textContent = `${c.name} (${c.ticker})`;
|
|
sel.appendChild(opt);
|
|
});
|
|
|
|
if (current) sel.value = current;
|
|
}
|
|
|
|
|
|
let intelRows = [];
|
|
|
|
function openIntelDetail(id, view) {
|
|
const row = intelRows.find(r => r.id === id);
|
|
if (!row) return;
|
|
|
|
document.getElementById("intel-modal-title").textContent =
|
|
`${row.company_name} — Event ${row.event_id}`;
|
|
|
|
const meta = [`type: ${row.type || view}`, `created: ${row.created_at ? row.created_at.slice(0,16) : "—"}`];
|
|
document.getElementById("intel-modal-meta").innerHTML = meta.map(m => `<span>${escapeHtml(m)}</span>`).join("");
|
|
|
|
let body = "";
|
|
if (view === "knowledge") {
|
|
try {
|
|
const parsed = JSON.parse(row.data);
|
|
body = Object.entries(parsed).map(([k, v]) => `${k}: ${v}`).join("\n");
|
|
} catch (_) { body = row.data; }
|
|
} else {
|
|
body = [
|
|
row.rationale,
|
|
"",
|
|
`direction: ${row.direction || "—"}`,
|
|
`magnitude: ${row.magnitude || "—"}`,
|
|
`timeframe: ${row.timeframe || "—"}`,
|
|
].join("\n");
|
|
}
|
|
|
|
document.getElementById("intel-modal-body").textContent = body;
|
|
document.getElementById("intelOverlay").classList.add("open");
|
|
}
|
|
|
|
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
const closeBtn = document.getElementById("intelCloseBtn");
|
|
if (closeBtn) {
|
|
closeBtn.onclick = () => document.getElementById("intelOverlay").classList.remove("open");
|
|
}
|
|
});
|