- Change top models from Top 3 to Top 5
- Simplify titles: remove 'Top X' and parenthetical details
- Replace separate user tables (by amount/by count) with single ChartBar
- Replace separate provider tables with single ChartBar
- Add get_top_users_combined and get_top_providers_combined functions
Remove duplicate unprotected card that was always rendered regardless
of role, causing 403 for non-customer users. Keep only the customer-
only version wrapped in {% if 'customer.*' in roles %}.
- Add get_user_today_models() function to load_dashboard.py
Shows current user's today model call counts and amounts
- Create api/user_today_models.dspy endpoint
- Create user_today_models_chart.ui ChartBar widget (30s auto-refresh)
- Add '我的今日模型使用' card section to index.ui with refresh button
- Register new paths in load_path.py (logined permission)
1. Quick entry shortcuts: Replace VBox (no native click) with Button
widgets for reliable click event handling. Each entry wraps its
icon+text in a VBox inside the Button for layout.
2. Ranking tables: Changed get_top_users/ providers queries from
today-only (WHERE use_date=today) to all-time data so transaction
counts and amounts always display meaningful results.
3. Background color: Added bgcolor=#0B1120 to top-level index.ui VBox
so the page background matches the shell theme, eliminating the
white-vs-dark-blue contrast.
- Add get_active_users_today(), get_new_users_month(), get_total_orgs() to load_dashboard.py
- Create stat_active_users.ui, stat_new_users_month.ui, stat_total_orgs.ui widgets
- Add active users card to main stats row
- Add new row with new users this month and total organizations cards
Architecture:
- index.ui: title + RefreshWidget(cards) + ChartBar with refresh_period
- RefreshWidget wraps dashboard_cards.dspy → returns full card widget tree
with live data (cnt, amount, total_users, concurrent_users)
- ChartBar handles its own auto-refresh via refresh_period: 10
- No more JS polling file needed
.dspy import fixes:
- get_today_usage.dspy: remove import json, from datetime import date
- get_user_stats.dspy: remove from datetime import datetime, timedelta
- get_top_models.dspy: remove from datetime import date
- All use pre-loaded datetime module (datetime.date.today(), etc.)
- dashboard_cards.dspy: same pattern, no imports
Permission:
- load_path.py: add dashboard_cards.dspy logined
- Delete dashboard_refresh.js (no longer needed)
- Add api/dashboard_content.dspy returns dynamic UI with live data
(queries llmusage + users tables server-side, returns full widget tree)
- Simplify index.ui to use RefreshWidget with period_seconds=10
- ChartBar in dashboard_content.dspy auto-fetches top models via data_url
- load_path.py updated separately in sage repo