|
@@ -263,15 +263,22 @@ async function reloadSentiment() {
|
|
|
var topic = $('sentiment-topic').value;
|
|
var topic = $('sentiment-topic').value;
|
|
|
var hours = $('sentiment-hours').value;
|
|
var hours = $('sentiment-hours').value;
|
|
|
var bucket = $('sentiment-bucket').value;
|
|
var bucket = $('sentiment-bucket').value;
|
|
|
|
|
+ // Use a wrapper div so we don't depend on the canvas element surviving innerHTML replacement
|
|
|
|
|
+ var wrap = $('chart-sentiment') ? $('chart-sentiment').parentElement : null;
|
|
|
|
|
+ var statsEl = $('sentiment-stats');
|
|
|
|
|
+ if (statsEl) statsEl.innerHTML = '';
|
|
|
|
|
+ if (wrap) wrap.innerHTML = '<div class="loading">Loading sentiment data…</div>';
|
|
|
try {
|
|
try {
|
|
|
var res = await fetch(API + '/sentiment-series?topic=' + encodeURIComponent(topic) + '&hours=' + hours + '&bucket_hours=' + bucket);
|
|
var res = await fetch(API + '/sentiment-series?topic=' + encodeURIComponent(topic) + '&hours=' + hours + '&bucket_hours=' + bucket);
|
|
|
var d = await res.json();
|
|
var d = await res.json();
|
|
|
|
|
+ if (wrap && !$('chart-sentiment')) {
|
|
|
|
|
+ wrap.innerHTML = '<canvas id="chart-sentiment"></canvas>';
|
|
|
|
|
+ }
|
|
|
renderSentimentChart(d.series || [], 'chart-sentiment', true);
|
|
renderSentimentChart(d.series || [], 'chart-sentiment', true);
|
|
|
renderSentimentStats(d.series || []);
|
|
renderSentimentStats(d.series || []);
|
|
|
} catch(e) {
|
|
} catch(e) {
|
|
|
console.error('Sentiment error:', e);
|
|
console.error('Sentiment error:', e);
|
|
|
- var el = $('chart-sentiment');
|
|
|
|
|
- if (el) el.parentElement.innerHTML = '<div class="loading">Error: ' + esc(e.message) + '</div>';
|
|
|
|
|
|
|
+ if (wrap) wrap.innerHTML = '<div class="loading">Error: ' + esc(e.message) + '</div>';
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|