refactor: establish standalone application boundary

This commit is contained in:
leefer
2026-08-03 21:42:25 +08:00
parent cc5fb8d73e
commit e1e76cd51e
324 changed files with 63090 additions and 44743 deletions
+91 -3
View File
@@ -4,9 +4,8 @@ window.XiaobaiPageModules.register("pools", [
"downView",
"yesterdayView",
"performanceView",
]);
], { bind: bindPoolEvents });
/* PRESERVATION-SOURCE-BEGIN app.js:1517-1915 */
function getVisibleStocks() {
if (!state.dashboard) return [];
let rows = [...(state.dashboard.limits || [])];
@@ -406,4 +405,93 @@ function renderPerformanceConclusion(rows) {
`;
}
/* PRESERVATION-SOURCE-END app.js:1517-1915 */
function changeSort(key) {
if (state.sortKey === key) state.sortDirection = state.sortDirection === "asc" ? "desc" : "asc";
else {
state.sortKey = key;
state.sortDirection = ["name", "code", "sector", "first_time", "last_time"].includes(key) ? "asc" : "desc";
}
renderLimitTable();
}
function compareRows(left, right) {
const leftValue = left[state.sortKey] ?? "";
const rightValue = right[state.sortKey] ?? "";
let result = typeof leftValue === "number" || typeof rightValue === "number"
? number(leftValue) - number(rightValue)
: String(leftValue).localeCompare(String(rightValue), "zh-CN", { numeric: true });
if (result === 0 && state.sortKey !== "first_time") result = String(left.first_time || "").localeCompare(String(right.first_time || ""));
return state.sortDirection === "asc" ? result : -result;
}
function updateSortHeaders() {
document.querySelectorAll("#limitTable th[data-sort]").forEach((header) => {
header.classList.remove("sort-asc", "sort-desc", "sorted");
const active = header.dataset.sort === state.sortKey;
if (active) header.classList.add(state.sortDirection === "asc" ? "sort-asc" : "sort-desc", "sorted");
const arrow = header.querySelector(".arr");
if (arrow) arrow.textContent = active ? (state.sortDirection === "asc" ? "▲" : "▼") : "↕";
});
}
function bindPoolEvents() {
document.querySelector("#stockSearch").addEventListener("input", (event) => {
state.query = event.target.value.trim().toLowerCase();
renderLimitTable();
});
document.querySelectorAll("[data-table-search]").forEach((input) => {
input.addEventListener("input", () => {
const query = input.value.trim().toLowerCase();
const body = document.querySelector(`#${CSS.escape(input.dataset.tableSearch)}`);
body?.querySelectorAll("tr").forEach((row) => {
row.hidden = Boolean(query) && !row.textContent.toLowerCase().includes(query);
});
});
});
document.querySelectorAll("[data-filter]").forEach((button) => {
button.addEventListener("click", () => {
document.querySelectorAll("[data-filter]").forEach((item) => item.classList.remove("active"));
button.classList.add("active");
state.filter = button.dataset.filter;
renderLimitTable();
});
});
document.querySelectorAll("#limitTable th[data-sort]").forEach((header) => {
header.addEventListener("click", () => changeSort(header.dataset.sort));
});
document.querySelector("#brokenSearch").addEventListener("input", (event) => {
state.brokenQuery = event.target.value.trim().toLowerCase();
renderBrokenTable(state.dashboard?.broken || []);
});
document.querySelectorAll("#brokenTable th[data-broken-sort]").forEach((header) => {
header.addEventListener("click", () => changeBrokenSort(header.dataset.brokenSort));
});
document.querySelector("#downSearch").addEventListener("input", (event) => {
state.downQuery = event.target.value.trim().toLowerCase();
renderDownTable(state.dashboard?.down_limits || []);
});
document.querySelectorAll("#downTable th[data-down-sort]").forEach((header) => {
header.addEventListener("click", () => changeDownSort(header.dataset.downSort));
});
document.querySelector("#yesterdaySearch").addEventListener("input", (event) => {
state.yesterdayQuery = event.target.value.trim().toLowerCase();
renderYesterdayTable(state.dashboard?.yesterday_limits || []);
});
document.querySelectorAll("[data-yesterday-filter]").forEach((button) => {
button.addEventListener("click", () => {
state.yesterdayFilter = button.dataset.yesterdayFilter;
renderYesterdayTable(state.dashboard?.yesterday_limits || []);
});
});
document.querySelectorAll("#yesterdayTable th[data-yesterday-sort]").forEach((header) => {
header.addEventListener("click", () => changeYesterdaySort(header.dataset.yesterdaySort));
});
document.querySelector("#exportButton").addEventListener("click", exportStocks);
document.querySelector("#brokenExportButton").addEventListener("click", exportBroken);
document.querySelector("#downExportButton").addEventListener("click", exportDown);
document.querySelector("#yesterdayExportButton").addEventListener("click", exportYesterday);
document.querySelector("#reasonForm").addEventListener("submit", saveReasonOverride);
}