Quellcode durchsuchen

fix: restore buildDetailHTML for cluster modal drill-down

Lukas Goldschmidt vor 6 Tagen
Ursprung
Commit
9a39782637
1 geänderte Dateien mit 22 neuen und 0 gelöschten Zeilen
  1. 22 0
      dashboard/dashboard.js

+ 22 - 0
dashboard/dashboard.js

@@ -467,6 +467,28 @@ function openClusterModal(clusterId) {
 
 function closeModal() { var m = $('cluster-modal'); if (m) m.classList.remove('open'); }
 
+function buildDetailHTML(d) {
+  var h = '<div class="detail-section"><h4>Headline</h4><div class="detail-content">' + esc(d.headline||'') + '</div></div>';
+  h += '<div class="detail-section"><h4>Metadata</h4><div class="detail-content">';
+  h += topicChip(d.topic) + ' <span class="' + sentimentClass(d.sentiment) + '" style="font-weight:600">' + esc(d.sentiment) + ' (' + esc(String(d.sentimentScore||'')) + ')</span>';
+  h += ' <span style="color:var(--accent);margin-left:.5rem">Importance: ' + (d.importance||0) + '</span>';
+  h += '<br><span class="muted">First: ' + (d.first_seen||'n/a') + ' &middot; Updated: ' + (d.last_updated||'n/a') + '</span></div></div>';
+  if (d.summary_text) h += '<div class="detail-section"><h4>Summary</h4><div class="detail-content">' + esc(d.summary_text) + '</div></div>';
+  if (d.summary) h += '<div class="detail-section"><h4>LLM Summary</h4><div class="detail-content">' + esc(d.summary) + '</div></div>';
+  if (d.key_facts && d.key_facts.length) h += '<div class="detail-section"><h4>Key Facts</h4><div class="detail-content">' + d.key_facts.map(function(f){return '<div class="key-fact">&bull; ' + esc(f) + '</div>';}).join('') + '</div></div>';
+  if (d.entities && d.entities.length) h += '<div class="detail-section"><h4>Entities ('+d.entities.length+')</h4><div class="detail-content">' + d.entities.map(function(e){return '<span class="chip">' + esc(e) + '</span>';}).join('') + '</div></div>';
+  if (d.keywords && d.keywords.length) h += '<div class="detail-section"><h4>Keywords ('+d.keywords.length+')</h4><div class="detail-content">' + d.keywords.map(function(k){return '<span class="chip">' + esc(k) + '</span>';}).join('') + '</div></div>';
+  if (d.articles && d.articles.length) {
+    h += '<div class="detail-section"><h4>Articles ('+d.articles.length+')</h4>';
+    for (var ai = 0; ai < Math.min(d.articles.length, 8); ai++) {
+      var a = d.articles[ai];
+      h += '<div style="margin-bottom:.5rem;padding:.5rem;background:var(--surface2);border-radius:6px;font-size:.82rem"><a href="' + esc(a.url||'#') + '" target="_blank" rel="noopener">' + esc(a.title||'Untitled') + '</a><br><span class="muted">' + esc(a.source||'') + ' &middot; ' + (a.timestamp||'') + '</span></div>';
+    }
+    h += '</div>';
+  }
+  return h;
+}
+
 // ── Config ──────────────────────────────────────────────
 
 async function loadConfig() {