/** * 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); })();