Collapse daily stats by default.

Show only total floating PnL until expanded; enlarge details and lower exchange headers.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-16 14:31:00 +08:00
parent 35b23836e3
commit 4e86595f2a
4 changed files with 134 additions and 33 deletions
+44 -11
View File
@@ -2346,12 +2346,34 @@
return (n > 0 ? "+" : "-") + abs;
}
const MONITOR_STATS_FOLD_KEY = "hub_monitor_stats_collapsed";
function isMonitorStatsCollapsed() {
try {
const v = localStorage.getItem(MONITOR_STATS_FOLD_KEY);
if (v === null || v === "") return true;
return v === "1";
} catch (_e) {
return true;
}
}
function setMonitorStatsCollapsed(collapsed) {
try {
localStorage.setItem(MONITOR_STATS_FOLD_KEY, collapsed ? "1" : "0");
} catch (_e) {
/* ignore */
}
}
function renderMonitorStatsCard(totals) {
const t = totals || {};
const day = t.trading_day || "—";
const resetH = t.reset_hour != null ? t.reset_hour : 8;
const winN = Number(t.win_count) || 0;
const lossN = Number(t.loss_count) || 0;
const floatVal = Number(t.float_pnl_u);
const collapsed = isMonitorStatsCollapsed();
function cell(label, main, sub, valCls) {
return `<div class="monitor-stat-cell">
<div class="monitor-stat-label">${esc(label)}</div>
@@ -2367,29 +2389,31 @@
lossN > 0 && Number.isFinite(Number(t.loss_pnl_u))
? `<span class="${pnlCls(t.loss_pnl_u)}">${esc(pnlSigned(t.loss_pnl_u, 2))}U</span>`
: "—";
const floatVal = Number(t.float_pnl_u);
return `<div class="card card-online monitor-stats-card" data-monitor-stats="1">
<div class="card-head">
<div>
const floatMain = esc(pnlSigned(floatVal, 2)) + "U";
const floatCls = Math.abs(floatVal) > 1e-9 ? pnlCls(floatVal) : "";
const foldLabel = collapsed ? "展开明细" : "收起";
return `<div class="card card-online monitor-stats-card${collapsed ? " is-collapsed" : ""}" data-monitor-stats="1">
<div class="card-head monitor-stats-head">
<div class="monitor-stats-head-main">
<div class="card-title-row">
<div class="card-title">今日统计</div>
<button type="button" class="ghost btn-monitor-stats-toggle" aria-expanded="${collapsed ? "false" : "true"}">${foldLabel}</button>
</div>
<div class="card-sub">交易日 ${esc(day)} · 北京时间 ${esc(String(resetH))}:00 切日</div>
</div>
<div class="monitor-stats-float-summary">
<div class="monitor-stat-label">总浮盈亏</div>
<div class="monitor-stat-value monitor-stats-float-value ${floatCls}">${floatMain}</div>
</div>
</div>
<div class="card-body">
<div class="card-body monitor-stats-detail">
<div class="monitor-stats-grid">
${cell("今日开仓", String(Number(t.open_count) || 0), "含未平", "")}
${cell("今日平仓", String(Number(t.closed_count) || 0), "", "")}
${cell("持有仓位", String(Number(t.open_position_count) || 0), "", "")}
${cell("盈利", String(winN), winSub, winN > 0 ? "pnl-pos" : "")}
${cell("亏损", String(lossN), lossSub, lossN > 0 ? "pnl-neg" : "")}
${cell(
"总浮盈亏",
esc(pnlSigned(floatVal, 2)) + "U",
"",
Math.abs(floatVal) > 1e-9 ? pnlCls(floatVal) : ""
)}
${cell("总浮盈亏", floatMain, "", floatCls)}
</div>
</div>
</div>`;
@@ -2809,6 +2833,15 @@
}
function bindMonitorInteractions(box) {
box.querySelectorAll(".btn-monitor-stats-toggle").forEach((btn) => {
btn.onclick = (ev) => {
ev.preventDefault();
ev.stopPropagation();
const next = !isMonitorStatsCollapsed();
setMonitorStatsCollapsed(next);
if (lastMonitorRows) renderMonitorGrid(lastMonitorRows);
};
});
box.querySelectorAll(".btn-open-market").forEach((btn) => {
btn.onclick = (ev) => {
ev.preventDefault();