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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user