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
+72 -4
View File
@@ -1,10 +1,10 @@
window.XiaobaiPageModules.register("screener", ["screenerView"], {
bind: bindScreenerEvents,
enter: ["loadScreener"],
});
window.XiaobaiPageModules.register("screener", ["screenerTrackingView"]);
/* PRESERVATION-SOURCE-BEGIN app.js:3490-4336 */
function screenerStrategyKey(strategyId, strategyName) {
return strategyId != null && strategyId !== 0 ? `id:${strategyId}` : `name:${strategyName || ""}`;
}
@@ -841,8 +841,6 @@ async function executeScreenerFormula({ mode, formula, strategyName, strategyId
}
}
/* PRESERVATION-SOURCE-END app.js:3490-4336 */
/* PRESERVATION-SOURCE-BEGIN app.js:6668-6892 */
function renderScreenerResult() {
const mode = state.screenerMode || "smart";
const result = activeScreenerResult(mode);
@@ -1068,4 +1066,74 @@ function regimeLabel(regime) {
return state.screenerSetup?.regimes?.find((item) => item.id === regime)?.label || regime;
}
/* PRESERVATION-SOURCE-END app.js:6668-6892 */
function bindScreenerEvents() {
document.querySelector("#openStrategyDrawerButton").addEventListener("click", openCustomStrategyDrawer);
document.querySelector("#closeStrategyDrawerButton").addEventListener("click", () => document.querySelector("#strategyDrawer").close());
document.querySelector("#strategyDrawer").addEventListener("click", (event) => {
if (event.target === event.currentTarget) event.currentTarget.close();
});
document.querySelector("#openScreenerTrackingButton").addEventListener("click", async () => {
await loadScreenerTracking(true);
openView("screenerTrackingView");
});
document.querySelector("#closeScreenerTrackingButton").addEventListener("click", () => openView("screenerView"));
document.querySelector("#refreshTrackingButton").addEventListener("click", refreshScreenerTracking);
document.querySelector("#trackingTableBody").addEventListener("click", handleTrackingTableAction);
document.querySelectorAll("[data-screener-mobile-view]").forEach((button) => {
button.addEventListener("click", () => selectScreenerMobileView(button.dataset.screenerMobileView));
});
document.querySelector("#compileStrategyButton").addEventListener("click", compileStrategy);
document.querySelector("#saveStrategyButton").addEventListener("click", saveCurrentStrategy);
document.querySelector("#deleteStrategyButton").addEventListener("click", deleteCurrentStrategy);
document.querySelector("#screenerExportButton").addEventListener("click", exportScreenerResults);
document.querySelector("#runBacktestToggle").addEventListener("change", updateBacktestTaskStatus);
document.querySelectorAll("[data-screener-mode]").forEach((button) => {
button.addEventListener("click", () => selectScreenerMode(button.dataset.screenerMode));
});
document.querySelector("#curatedStrategyList").addEventListener("click", (event) => {
if (event.target.closest("button")) return;
const card = event.target.closest("[data-curated-strategy]");
if (!card) return;
state.selectedCuratedStrategyId = number(card.dataset.curatedStrategy);
renderCuratedStrategyLibrary();
renderScreenerResult();
});
document.querySelector("#curatedStrategySearch").addEventListener("input", (event) => {
state.curatedQuery = event.target.value.trim().toLocaleLowerCase("zh-CN");
renderCuratedStrategyLibrary();
});
document.querySelector("#curatedCategoryFilter").addEventListener("change", (event) => {
state.curatedCategory = event.target.value;
renderCuratedStrategyLibrary();
});
document.querySelector("#curatedSchoolFilters").addEventListener("click", (event) => {
const button = event.target.closest("[data-curated-school]");
if (!button) return;
state.curatedSchool = button.dataset.curatedSchool;
renderCuratedStrategyLibrary();
});
document.querySelectorAll("[data-curated-view]").forEach((button) => {
button.addEventListener("click", () => {
state.curatedViewMode = button.dataset.curatedView === "grid" ? "grid" : "list";
localStorage.setItem("xiaobaiCuratedViewMode", state.curatedViewMode);
renderCuratedStrategyLibrary();
});
});
document.querySelector("#quantResetButton").addEventListener("click", resetQuantBuilder);
document.querySelector("#addQuantFilterButton").addEventListener("click", () => addQuantFilter());
document.querySelector("#addQuantScoreButton").addEventListener("click", () => addQuantScore());
document.querySelector("#quantFilterRows").addEventListener("input", handleQuantBuilderInput);
document.querySelector("#quantFilterRows").addEventListener("change", handleQuantBuilderInput);
document.querySelector("#quantFilterRows").addEventListener("click", handleQuantBuilderClick);
document.querySelector("#quantScoreRows").addEventListener("input", handleQuantBuilderInput);
document.querySelector("#quantScoreRows").addEventListener("change", handleQuantBuilderInput);
document.querySelector("#quantScoreRows").addEventListener("click", handleQuantBuilderClick);
["quantListedDays", "quantLimit", "quantMinScore", "quantExcludeSt"].forEach((id) => {
document.querySelector(`#${id}`).addEventListener("input", renderQuantSummary);
document.querySelector(`#${id}`).addEventListener("change", renderQuantSummary);
});
document.querySelector("#quantRunButton").addEventListener("click", runQuantStrategy);
document.querySelector("#quantSaveButton").addEventListener("click", saveQuantAsStrategy);
document.querySelector("#quantBacktestToggle").addEventListener("change", updateBacktestTaskStatus);
}