99 lines
2.9 KiB
JavaScript
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);
|
|
|
|
})();
|