Add refresh buttons to hub plan and calculator pages.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-24 01:43:27 +08:00
parent 384d404bb3
commit 3e8ecbf712
3 changed files with 89 additions and 5 deletions
+43 -1
View File
@@ -188,6 +188,37 @@
fillExchangeSelect($("calc-roll-exchange"));
}
function fmtRefreshTime() {
const d = new Date();
const h = String(d.getHours()).padStart(2, "0");
const m = String(d.getMinutes()).padStart(2, "0");
const s = String(d.getSeconds()).padStart(2, "0");
return h + ":" + m + ":" + s;
}
async function refreshPage() {
const btn = $("calc-btn-refresh");
const status = $("calc-refresh-status");
const trendId = $("calc-trend-exchange") && $("calc-trend-exchange").value;
const rollId = $("calc-roll-exchange") && $("calc-roll-exchange").value;
if (btn) btn.disabled = true;
if (status) status.textContent = "刷新中…";
Object.keys(marketCache).forEach(function (k) {
delete marketCache[k];
});
try {
await loadCalculatorExchanges();
fillExchangeSelect($("calc-trend-exchange"), trendId);
fillExchangeSelect($("calc-roll-exchange"), rollId);
await Promise.all([refreshMarket("calc-trend"), refreshMarket("calc-roll")]);
if (status) status.textContent = "已刷新 " + fmtRefreshTime();
} catch (err) {
if (status) status.textContent = "刷新失败";
} finally {
if (btn) btn.disabled = false;
}
}
function bindMarket(prefix) {
const exchangeEl = $(prefix + "-exchange");
const baseEl = $(prefix + "-base");
@@ -557,12 +588,23 @@
bindRollLegsUI();
bindMarket("calc-trend");
bindMarket("calc-roll");
const refreshBtn = $("calc-btn-refresh");
if (refreshBtn) {
refreshBtn.addEventListener("click", function () {
void refreshPage();
});
}
}
window.hubCalculatorPage = {
init: function () {
bindOnce();
if (inited) {
void refreshPage();
return;
}
void bindOnce();
},
refresh: refreshPage,
destroy: function () {},
};
})();
+10 -2
View File
@@ -66,6 +66,10 @@
<h1><span class="head-tag">PLN</span> 开仓计划</h1>
<p class="page-desc">计划录入 · 进行中跟踪 · 历史归档与胜率统计</p>
</div>
<div class="toolbar">
<button type="button" id="plan-btn-refresh" class="primary">刷新</button>
<span id="plan-refresh-status" class="toolbar-meta"></span>
</div>
<div class="plan-layout">
<aside class="plan-left-panel">
<section class="plan-form-section card">
@@ -709,6 +713,10 @@
<h1><span class="head-tag">CAL</span> 策略计算器</h1>
<p class="page-desc">历史行情测算 · 以损定仓 · 价格均为手动输入</p>
</div>
<div class="toolbar">
<button type="button" id="calc-btn-refresh" class="primary">刷新</button>
<span id="calc-refresh-status" class="toolbar-meta"></span>
</div>
<div class="calc-layout">
<section class="calc-card card">
<h2>趋势回调计算器</h2>
@@ -1039,8 +1047,8 @@
<script src="https://unpkg.com/lightweight-charts@4.2.0/dist/lightweight-charts.standalone.production.js"></script>
<script src="/assets/chart_draw.js?v=20260609-market-day-split"></script>
<script src="/assets/chart.js?v=20260609-prev-day-lines"></script>
<script src="/assets/plan.js?v=20260614-entry-plan-scheme"></script>
<script src="/assets/calculator.js?v=2"></script>
<script src="/assets/plan.js?v=20260614-plan-refresh"></script>
<script src="/assets/calculator.js?v=3"></script>
<script src="/assets/archive.js?v=20260612-archive-ai-chat"></script>
<script src="/assets/funds.js?v=20260609-hub-funds-fold"></script>
<script src="/assets/dashboard.js?v=20260612-dash-monitor-count"></script>
+36 -2
View File
@@ -349,6 +349,31 @@
await Promise.all([loadActive(), loadHistory(), loadStats()]);
}
function fmtRefreshTime() {
const d = new Date();
const h = String(d.getHours()).padStart(2, "0");
const m = String(d.getMinutes()).padStart(2, "0");
const s = String(d.getSeconds()).padStart(2, "0");
return h + ":" + m + ":" + s;
}
async function refreshPage() {
const btn = $("plan-btn-refresh");
const status = $("plan-refresh-status");
if (btn) btn.disabled = true;
if (status) status.textContent = "刷新中…";
try {
await loadMeta();
await refreshAll();
if (status) status.textContent = "已刷新 " + fmtRefreshTime();
} catch (e) {
toast(e.message || "刷新失败", true);
if (status) status.textContent = "刷新失败";
} finally {
if (btn) btn.disabled = false;
}
}
function readCreateForm() {
const dir = document.querySelector('input[name="plan-direction"]:checked');
return {
@@ -524,6 +549,13 @@
}
function bindEvents() {
const refreshBtn = $("plan-btn-refresh");
if (refreshBtn) {
refreshBtn.addEventListener("click", function () {
void refreshPage();
});
}
const createForm = $("plan-create-form");
if (createForm) {
createForm.addEventListener("submit", function (ev) {
@@ -719,7 +751,7 @@
async function init() {
if (inited) {
await refreshAll();
await refreshPage();
return;
}
inited = true;
@@ -727,6 +759,8 @@
try {
await loadMeta();
await refreshAll();
const status = $("plan-refresh-status");
if (status) status.textContent = "已刷新 " + fmtRefreshTime();
} catch (e) {
toast(e.message || "加载失败", true);
}
@@ -734,5 +768,5 @@
function destroy() {}
window.hubPlanPage = { init: init, destroy: destroy };
window.hubPlanPage = { init: init, refresh: refreshPage, destroy: destroy };
})();