dashboard_for_sage/wwwroot/scripts/dashboard_refresh.js

99 lines
2.9 KiB
JavaScript

/**
* Dashboard auto-refresh script
* Polls API every 10 seconds and updates stat cards + chart
* Auto-loaded by Sage's header.tmpl from wwwroot/scripts/
*/
(function() {
'use strict';
// Derive base URL from current page (e.g. /dashboard_for_sage/index.ui -> /dashboard_for_sage)
function getBaseUrl() {
var path = window.location.pathname;
// Remove .ui or .dspy extension
var idx = path.lastIndexOf('/');
return path.substring(0, idx);
}
function buildUrl(dspyFile) {
var base = getBaseUrl();
// Add _webbricks_=1 for non-initial requests
return base + '/' + dspyFile + '?_webbricks_=1';
}
function updateCard(id, value) {
try {
var widget = bricks.app.find_widget_by_id(id);
if (widget && widget.el) {
widget.el.textContent = value;
}
} catch(e) {
// Widget may not be ready yet
}
}
function formatNumber(n) {
if (typeof n === 'number') {
return n.toLocaleString();
}
return n;
}
function formatAmount(n) {
if (typeof n === 'number') {
return '¥' + n.toFixed(2);
}
return '¥0.00';
}
async function refreshStats() {
try {
var url = buildUrl('api/get_today_usage.dspy');
var resp = await fetch(url, { credentials: 'include' });
if (!resp.ok) return;
var data = await resp.json();
updateCard('today_cnt_value', formatNumber(data.cnt));
updateCard('today_amount_value', formatAmount(data.total_amount));
} catch(e) {
// Silently fail on refresh errors
}
}
async function refreshUsers() {
try {
var url = buildUrl('api/get_user_stats.dspy');
var resp = await fetch(url, { credentials: 'include' });
if (!resp.ok) return;
var data = await resp.json();
updateCard('total_users_value', formatNumber(data.total_users));
updateCard('concurrent_users_value', formatNumber(data.concurrent_users));
} catch(e) {
// Silently fail on refresh errors
}
}
async function refreshChart() {
try {
var chart = bricks.app.find_widget_by_id('top_models_chart');
if (chart && chart.render_urldata) {
await chart.render_urldata({});
}
} catch(e) {
// Silently fail on refresh errors
}
}
async function refreshAll() {
await refreshStats();
await refreshUsers();
await refreshChart();
}
// Start auto-refresh every 10 seconds
// Delay initial load to allow bricks framework to initialize
setTimeout(function() {
refreshAll();
setInterval(refreshAll, 10000);
}, 1000);
})();