Duriin-API/public/admin/assets/js/intel-shared.js

97 lines
3.1 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");
if (!data.available) {
const notice = document.getElementById("intel-unavailable");
const content = document.getElementById("intel-content");
if (notice) notice.style.display = "";
if (content) content.style.display = "none";
return false;
}
const notice = document.getElementById("intel-unavailable");
const content = document.getElementById("intel-content");
if (notice) notice.style.display = "none";
if (content) content.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");
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);
});
}
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");
}
});