diff --git a/app/main.py b/app/main.py
index 54d5826..3263077 100644
--- a/app/main.py
+++ b/app/main.py
@@ -273,6 +273,7 @@ PAGE_HTML = """
.range-label { font-size: 12px; color: var(--muted); margin-right: 2px; }
.range-btn { cursor: pointer; border: 1px solid var(--border); background: #fff; color: var(--muted); border-radius: 8px; font-size: 12px; font-weight: 600; padding: 5px 12px; }
.range-btn.active { background: var(--green-mid); color: #fff; border-color: var(--green-mid); }
+ .members-all-time .balance-col { display: none; }
.table-scroll { overflow-x: auto; border-radius: 12px; }
.table-scroll table { min-width: 980px; }
th.sortable { cursor: pointer; user-select: none; }
@@ -291,7 +292,6 @@ PAGE_HTML = """
@@ -302,6 +302,10 @@ PAGE_HTML = """
Members
+
+
+
+
Period
@@ -317,11 +321,11 @@ PAGE_HTML = """
Status |
Activated |
Source |
- Allowance |
- Credits |
- Spend (current) |
- Remaining |
- Reset |
+ Allowance |
+ Credits |
+ Spend |
+ Remaining |
+ Reset |
Adjust |
@@ -376,7 +380,6 @@ async function load() {
if (r.status === 403) { document.body.innerHTML = 'Forbidden
'; return; }
const d = await r.json();
$('tot-members').textContent = d.totals.members;
- $('tot-active').textContent = d.totals.active;
$('tot-spend-cycle').textContent = fmt(d.totals.total_spend);
$('tot-spend-all').textContent = fmt(d.totals.total_all_time_spend ?? d.totals.total_spend);
membersData = d.members || [];
@@ -393,7 +396,7 @@ let currentView = 'members';
let memberSort = { key: 'email', dir: 1 };
let modelSort = { key: 'spend', dir: -1 };
let rangeDays = 0; // 0 = all time
-let spendMode = 'cycle'; // 'cycle' | 'all' — Spend column in Members view ('cycle' = usage from the member's current balance period)
+let memberMode = 'balance'; // 'balance' | 'all' — Members view: current-balance figures vs all-time spend
function arrowFor(key, sortState) {
if (sortState.key !== key) return '';
@@ -417,8 +420,9 @@ function switchView(view) {
$('tab-members').className = 'tab-btn' + (view === 'members' ? ' active' : '');
$('tab-models').className = 'tab-btn' + (view === 'models' ? ' active' : '');
$('view-title').textContent = view === 'members' ? 'Members' : 'Model usage';
- // Range buttons only apply to the models view (spend logs are model-level).
+ // Mode groups: Balance/All-time for members; Period for models.
$('range-group').style.display = view === 'models' ? '' : 'none';
+ $('member-mode-group').style.display = view === 'members' ? '' : 'none';
render();
}
@@ -429,20 +433,25 @@ function setRange(days) {
loadModels();
}
+function setMemberMode(mode) {
+ memberMode = mode;
+ $('mmode-balance').className = 'range-btn' + (mode === 'balance' ? ' active' : '');
+ $('mmode-all').className = 'range-btn' + (mode === 'all' ? ' active' : '');
+ // Header label reflects the mode
+ $('spend-mode-label').textContent = mode === 'all' ? 'All-time spend' : 'Spend';
+ // Balance-only columns (Allowance/Credits/Remaining/Reset) hide in all-time mode
+ $('table-members').parentElement.classList.toggle('members-all-time', mode === 'all');
+ renderMembers();
+}
+
function sortMembers(key) {
- // Clicking the Spend header toggles the value shown (since-reset ↔ all-time)
- // before sorting; other headers just sort.
- if (key === 'spend') {
- spendMode = spendMode === 'cycle' ? 'all' : 'cycle';
- $('spend-mode-label').textContent = spendMode === 'cycle' ? 'current' : 'all-time';
- }
memberSort = { key, dir: memberSort.key === key ? -memberSort.dir : 1 };
clearArrows('members', memberSort);
render();
}
function memberSpend(m) {
- return spendMode === 'all' ? (m.all_time_spend ?? m.spend ?? 0) : (m.spend ?? 0);
+ return memberMode === 'all' ? (m.all_time_spend ?? m.spend ?? 0) : (m.spend ?? 0);
}
function sortModels(key) {
@@ -484,11 +493,11 @@ function renderMembers() {
'' + pill + ' | ' +
'' + act + ' | ' +
'' + src + ' | ' +
- '' + fmt(m.balance) + ' | ' +
- '' + creditsPill + ' | ' +
+ '' + fmt(m.balance) + ' | ' +
+ '' + creditsPill + ' | ' +
'' + fmt(memberSpend(m)) + ' | ' +
- '' + fmt(m.remaining) + ' | ' +
- '' + esc(reset) + ' | ' +
+ '' + fmt(m.remaining) + ' | ' +
+ '' + esc(reset) + ' | ' +
'' +
'' +
'' +
|