diff --git a/admin.html b/admin.html
index f715009..d39a878 100644
--- a/admin.html
+++ b/admin.html
@@ -401,6 +401,18 @@
+
+
@@ -772,6 +784,7 @@ async function loadIntelligence() {
if (type) params.set('type', type);
const data = await api(`/admin/api/intelligence/knowledge?${params}`);
+ intelRows = data.rows;
document.getElementById('intel-thead').innerHTML = `
| ID | Company | Event | Type | Data | Created |
`;
@@ -780,12 +793,12 @@ async function loadIntelligence() {
let parsed = {};
try { parsed = JSON.parse(r.data); } catch (_) {}
const summary = Object.values(parsed).filter(v => typeof v === 'string').join(' · ').slice(0, 120);
- return `
+ return `
| ${r.id} |
${r.company_name} |
${r.event_id} |
${r.type} |
- ${summary} |
+ ${summary} |
${r.created_at ? r.created_at.slice(0,16) : '—'} |
`;
}).join('');
@@ -800,12 +813,13 @@ async function loadIntelligence() {
document.getElementById('i-type').parentElement.style.display = 'none';
const data = await api(`/admin/api/intelligence/predictions?${params}`);
+ intelRows = data.rows;
document.getElementById('intel-thead').innerHTML = `
| ID | Company | Event | Type | Direction | Magnitude | Timeframe | Rationale | Created |
`;
document.getElementById('intel-tbody').innerHTML = data.rows.map(r => `
-
+
| ${r.id} |
${r.company_name} |
${r.event_id} |
@@ -813,7 +827,7 @@ async function loadIntelligence() {
${r.direction || '—'} |
${r.magnitude || '—'} |
${r.timeframe || '—'} |
- ${r.rationale || '—'} |
+ ${r.rationale || '—'} |
${r.created_at ? r.created_at.slice(0,16) : '—'} |
`).join('');
@@ -831,6 +845,45 @@ document.getElementById('iNextBtn').onclick = () => { intelOffset += PAGE; loadI
document.getElementById('i-view').onchange = () => { intelOffset = 0; loadIntelligence(); };
+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 => `${m}`).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.getElementById('intelCloseBtn').onclick = () =>
+ document.getElementById('intelOverlay').classList.remove('open');
+
+document.getElementById('intelOverlay').onclick = function(e) {
+ if (e.target === this) this.classList.remove('open');
+};
+
// ── sql console ────────────────────────────────────────────────────────────
async function runSql() {
@@ -899,18 +952,31 @@ const tabContents = {
sql: document.getElementById('tab-sql'),
};
+function switchTab(tab) {
+ if (!tabContents[tab]) tab = 'articles';
+
+ document.querySelectorAll('.tab-btn').forEach(b => {
+ b.classList.toggle('active', b.dataset.tab === tab);
+ });
+
+ Object.entries(tabContents).forEach(([k, el]) => {
+ el.style.display = k === tab ? '' : 'none';
+ });
+
+ location.hash = tab;
+
+ if (tab === 'events') loadEvents();
+ if (tab === 'stats') loadStats();
+ if (tab === 'intelligence') { intelOffset = 0; loadIntelligenceStats().then(ok => { if (ok) { loadIntelligenceCompanies(); loadIntelligence(); } }); }
+}
+
document.querySelectorAll('.tab-btn').forEach(btn => {
- btn.onclick = () => {
- document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
- btn.classList.add('active');
- const tab = btn.dataset.tab;
- Object.entries(tabContents).forEach(([k, el]) => {
- el.style.display = k === tab ? '' : 'none';
- });
- if (tab === 'events') loadEvents();
- if (tab === 'stats') loadStats();
- if (tab === 'intelligence') { intelOffset = 0; loadIntelligenceStats().then(ok => { if (ok) { loadIntelligenceCompanies(); loadIntelligence(); } }); }
- };
+ btn.onclick = () => switchTab(btn.dataset.tab);
+});
+
+window.addEventListener('hashchange', () => {
+ const tab = location.hash.replace('#', '');
+ switchTab(tab);
});
// close overlays on backdrop click
@@ -923,9 +989,12 @@ document.getElementById('eventOverlay').onclick = function(e) {
// ── init ───────────────────────────────────────────────────────────────────
-loadStats();
+const initialTab = location.hash.replace('#', '') || 'articles';
+switchTab(initialTab);
+
loadSources();
-loadArticles();
+if (initialTab === 'articles') loadArticles();
+loadStats();