Show total pages and card-local AJAX paging on options review.
Trades and reviewed lists now report page X / Y and flip without full-page sync refresh. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -29,7 +29,9 @@
|
||||
var tradesCache = {};
|
||||
var reviewedCache = {};
|
||||
var tradesPage = 0;
|
||||
var tradesHasMore = false;
|
||||
var tradesPages = 1;
|
||||
var reviewedPage = 0;
|
||||
var reviewedPages = 1;
|
||||
|
||||
function $(id) {
|
||||
return document.getElementById(id);
|
||||
@@ -115,8 +117,8 @@
|
||||
|
||||
function reloadAll() {
|
||||
setSyncStatus("读取本地记录…");
|
||||
loadTrades();
|
||||
loadReviewed();
|
||||
loadTrades({ sync: true });
|
||||
loadReviewed({ sync: false });
|
||||
loadStats();
|
||||
}
|
||||
|
||||
@@ -198,6 +200,7 @@
|
||||
function setActiveTab(source) {
|
||||
activeSource = source || "option_spot";
|
||||
tradesPage = 0;
|
||||
reviewedPage = 0;
|
||||
document.querySelectorAll(".or-tab").forEach(function (btn) {
|
||||
btn.classList.toggle("active", btn.getAttribute("data-source") === activeSource);
|
||||
});
|
||||
@@ -213,12 +216,49 @@
|
||||
var label = $("or-trades-page-label");
|
||||
var prev = $("or-trades-prev");
|
||||
var next = $("or-trades-next");
|
||||
if (label) label.textContent = "第 " + (tradesPage + 1) + " 页";
|
||||
if (label) {
|
||||
label.textContent = "第 " + (tradesPage + 1) + " / " + tradesPages + " 页";
|
||||
}
|
||||
if (prev) prev.disabled = tradesPage <= 0;
|
||||
if (next) next.disabled = !tradesHasMore;
|
||||
if (next) next.disabled = tradesPage + 1 >= tradesPages;
|
||||
}
|
||||
|
||||
function loadTrades() {
|
||||
function updateReviewedPager() {
|
||||
var label = $("or-reviewed-page-label");
|
||||
var prev = $("or-reviewed-prev");
|
||||
var next = $("or-reviewed-next");
|
||||
if (label) {
|
||||
label.textContent = "第 " + (reviewedPage + 1) + " / " + reviewedPages + " 页";
|
||||
}
|
||||
if (prev) prev.disabled = reviewedPage <= 0;
|
||||
if (next) next.disabled = reviewedPage + 1 >= reviewedPages;
|
||||
}
|
||||
|
||||
function applyPagerMeta(data, kind) {
|
||||
var pages = Number(data.pages || 1);
|
||||
if (!pages || pages < 1) pages = 1;
|
||||
var clamped = false;
|
||||
if (kind === "trades") {
|
||||
tradesPages = pages;
|
||||
if (tradesPage >= tradesPages) {
|
||||
tradesPage = Math.max(0, tradesPages - 1);
|
||||
clamped = true;
|
||||
}
|
||||
updateTradesPager();
|
||||
} else {
|
||||
reviewedPages = pages;
|
||||
if (reviewedPage >= reviewedPages) {
|
||||
reviewedPage = Math.max(0, reviewedPages - 1);
|
||||
clamped = true;
|
||||
}
|
||||
updateReviewedPager();
|
||||
}
|
||||
return clamped;
|
||||
}
|
||||
|
||||
function loadTrades(opts) {
|
||||
opts = opts || {};
|
||||
var doSync = opts.sync !== false;
|
||||
var tbody = $("or-trades-tbody");
|
||||
if (!tbody) return;
|
||||
tbody.innerHTML = '<tr><td colspan="6" class="muted">加载中…</td></tr>';
|
||||
@@ -226,20 +266,23 @@
|
||||
p.set("reviewed", "0");
|
||||
p.set("limit", String(PAGE_SIZE));
|
||||
p.set("offset", String(tradesPage * PAGE_SIZE));
|
||||
if (!doSync) p.set("sync", "0");
|
||||
fetch("/api/options/review/trades?" + p.toString(), { credentials: "same-origin" })
|
||||
.then(function (r) {
|
||||
return r.json();
|
||||
})
|
||||
.then(function (data) {
|
||||
setSyncStatus("本地记录已加载");
|
||||
if (doSync) setSyncStatus("本地记录已加载");
|
||||
if (!data.ok) {
|
||||
tbody.innerHTML = '<tr><td colspan="6" class="muted">加载失败</td></tr>';
|
||||
return;
|
||||
}
|
||||
if (applyPagerMeta(data, "trades") && Number(data.total || 0) > 0) {
|
||||
loadTrades(opts);
|
||||
return;
|
||||
}
|
||||
var rows = data.trades || [];
|
||||
tradesHasMore = rows.length >= PAGE_SIZE;
|
||||
tradesCache = {};
|
||||
updateTradesPager();
|
||||
if (!rows.length) {
|
||||
tbody.innerHTML =
|
||||
'<tr><td colspan="6" class="muted">暂无待复盘记录</td></tr>';
|
||||
@@ -304,14 +347,17 @@
|
||||
});
|
||||
}
|
||||
|
||||
function loadReviewed() {
|
||||
function loadReviewed(opts) {
|
||||
opts = opts || {};
|
||||
var doSync = opts.sync === true;
|
||||
var tbody = $("or-reviewed-tbody");
|
||||
if (!tbody) return;
|
||||
tbody.innerHTML = '<tr><td colspan="6" class="muted">加载中…</td></tr>';
|
||||
var p = baseQs();
|
||||
p.set("reviewed", "1");
|
||||
p.set("limit", "100");
|
||||
p.set("offset", "0");
|
||||
p.set("limit", String(PAGE_SIZE));
|
||||
p.set("offset", String(reviewedPage * PAGE_SIZE));
|
||||
if (!doSync) p.set("sync", "0");
|
||||
fetch("/api/options/review/trades?" + p.toString(), { credentials: "same-origin" })
|
||||
.then(function (r) {
|
||||
return r.json();
|
||||
@@ -321,6 +367,10 @@
|
||||
tbody.innerHTML = '<tr><td colspan="6" class="muted">加载失败</td></tr>';
|
||||
return;
|
||||
}
|
||||
if (applyPagerMeta(data, "reviewed") && Number(data.total || 0) > 0) {
|
||||
loadReviewed(opts);
|
||||
return;
|
||||
}
|
||||
var rows = data.trades || [];
|
||||
reviewedCache = {};
|
||||
if (!rows.length) {
|
||||
@@ -929,6 +979,8 @@
|
||||
var delBtn = $("or-del-btn");
|
||||
var prevBtn = $("or-trades-prev");
|
||||
var nextBtn = $("or-trades-next");
|
||||
var reviewedPrev = $("or-reviewed-prev");
|
||||
var reviewedNext = $("or-reviewed-next");
|
||||
var detailClose = $("or-detail-close-btn");
|
||||
var detailEdit = $("or-detail-edit-btn");
|
||||
if (reloadBtn) reloadBtn.addEventListener("click", reloadAll);
|
||||
@@ -939,14 +991,28 @@
|
||||
prevBtn.addEventListener("click", function () {
|
||||
if (tradesPage <= 0) return;
|
||||
tradesPage -= 1;
|
||||
loadTrades();
|
||||
loadTrades({ sync: false });
|
||||
});
|
||||
}
|
||||
if (nextBtn) {
|
||||
nextBtn.addEventListener("click", function () {
|
||||
if (!tradesHasMore) return;
|
||||
if (tradesPage + 1 >= tradesPages) return;
|
||||
tradesPage += 1;
|
||||
loadTrades();
|
||||
loadTrades({ sync: false });
|
||||
});
|
||||
}
|
||||
if (reviewedPrev) {
|
||||
reviewedPrev.addEventListener("click", function () {
|
||||
if (reviewedPage <= 0) return;
|
||||
reviewedPage -= 1;
|
||||
loadReviewed({ sync: false });
|
||||
});
|
||||
}
|
||||
if (reviewedNext) {
|
||||
reviewedNext.addEventListener("click", function () {
|
||||
if (reviewedPage + 1 >= reviewedPages) return;
|
||||
reviewedPage += 1;
|
||||
loadReviewed({ sync: false });
|
||||
});
|
||||
}
|
||||
if (detailClose) detailClose.addEventListener("click", hideDetail);
|
||||
@@ -961,6 +1027,7 @@
|
||||
if (el) {
|
||||
el.addEventListener("change", function () {
|
||||
tradesPage = 0;
|
||||
reviewedPage = 0;
|
||||
reloadAll();
|
||||
});
|
||||
}
|
||||
@@ -970,6 +1037,7 @@
|
||||
if (el) {
|
||||
el.addEventListener("change", function () {
|
||||
tradesPage = 0;
|
||||
reviewedPage = 0;
|
||||
reloadAll();
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user