Skip to content

Commit e4e022b

Browse files
Pigbibicursoragent
andcommitted
Distinguish unread from default in console summary for margin and options.
Show platform or strategy defaults when GitHub variables are unset but account state is known, and reserve notRead for cases where current config could not be loaded. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 8ea6159 commit e4e022b

3 files changed

Lines changed: 68 additions & 11 deletions

File tree

tests/strategy_switch_worker_validation.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ assert.ok(indexHtml.includes('id="reserve-policy-stack"'));
5151
assert.ok(indexHtml.includes('class="reserve-policy-stack"'));
5252
assert.equal(indexHtml.match(/class="form-section dca-section"/g)?.length, 1);
5353
assert.ok(indexHtml.includes('qmtDryRunOnlyNote'));
54-
assert.ok(indexHtml.includes('cashOnlyExecutionMode: "允许融资"'));
54+
assert.ok(indexHtml.includes('optionOverlayDefaultSimple: "策略默认:开启"'));
55+
assert.ok(indexHtml.includes('cashOnlyExecutionDefault: "平台默认:允许融资"'));
56+
assert.ok(indexHtml.includes("function effectiveOptionOverlayForAccount("));
57+
assert.ok(indexHtml.includes("function effectiveCashOnlyExecutionForAccount("));
5558
assert.ok(indexHtml.includes('cashOnlyExecutionValueYes: "允许融资:是"'));
5659
assert.ok(indexHtml.includes('cashOnlyExecutionMode: "Allow margin"'));
5760
assert.ok(indexHtml.includes('el("cash-only-execution-mode-select").addEventListener("change"'));

web/strategy-switch-console/index.html

Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1787,6 +1787,9 @@ <h2 data-i18n="summary">切换摘要</h2>
17871787
incomeLayerOn: "开启,起始 {start},最高 {ratio}",
17881788
optionOverlayOff: "关闭",
17891789
optionOverlayOn: "开启(策略默认)",
1790+
optionOverlayDefaultSimple: "策略默认:开启",
1791+
optionOverlayDefault: "策略默认:开启,{detail}",
1792+
cashOnlyExecutionDefault: "平台默认:允许融资",
17901793
},
17911794
en: {
17921795
appTitle: "Strategy Switch",
@@ -1950,6 +1953,9 @@ <h2 data-i18n="summary">切换摘要</h2>
19501953
incomeLayerOn: "Enabled, starts at {start}, max {ratio}",
19511954
optionOverlayOff: "Disabled",
19521955
optionOverlayOn: "Enabled (strategy default)",
1956+
optionOverlayDefaultSimple: "Strategy default: enabled",
1957+
optionOverlayDefault: "Strategy default: enabled, {detail}",
1958+
cashOnlyExecutionDefault: "Platform default: margin allowed",
19531959
},
19541960
};
19551961

@@ -2468,22 +2474,68 @@ <h2 data-i18n="summary">切换摘要</h2>
24682474
return enabled ? t("cashOnlyExecutionValueNo") : t("cashOnlyExecutionValueYes");
24692475
}
24702476

2477+
function platformCashOnlyExecutionDefault() {
2478+
return false;
2479+
}
2480+
2481+
function effectiveCashOnlyExecutionForAccount(platform, account) {
2482+
const configured = currentCashOnlyExecutionForAccount(platform, account);
2483+
if (configured !== null) return configured;
2484+
if (!platformSupportsMarginPolicy(platform)) return null;
2485+
return platformCashOnlyExecutionDefault();
2486+
}
2487+
24712488
function currentCashOnlyExecutionForAccount(platform, account) {
24722489
return cleanOptionalBoolean(currentEntryForAccount(platform, account)?.cash_only_execution);
24732490
}
24742491

24752492
function currentCashOnlyExecutionText(platform = state.selected, account = selectedAccount(platform)) {
2476-
return cashOnlyExecutionText(currentCashOnlyExecutionForAccount(platform, account));
2493+
if (!platformSupportsMarginPolicy(platform)) return t("notRead");
2494+
const entry = currentEntryForAccount(platform, account);
2495+
if (!entry) return t("notRead");
2496+
const configured = cleanOptionalBoolean(entry.cash_only_execution);
2497+
if (configured === null) return t("cashOnlyExecutionDefault");
2498+
return cashOnlyExecutionText(configured);
24772499
}
24782500

24792501
function currentOptionOverlayForAccount(platform, account) {
24802502
return cleanOptionalBoolean(currentEntryForAccount(platform, account)?.option_overlay_enabled);
24812503
}
24822504

2505+
function effectiveOptionOverlayForAccount(platform, account, profile = state.forms[platform]?.strategy) {
2506+
const configured = currentOptionOverlayForAccount(platform, account);
2507+
if (configured !== null) return configured;
2508+
if (!optionOverlaySupported(profile)) return null;
2509+
return true;
2510+
}
2511+
2512+
function optionOverlayDefaultSummaryDetail(defaults) {
2513+
if (!defaults?.families?.length) return "";
2514+
return defaults.families.map((item) => {
2515+
const family = item.family === "income" ? t("optionOverlayFamilyIncome") : t("optionOverlayFamilyGrowth");
2516+
const ratioText = item.ratioKind === "risk"
2517+
? t("optionOverlayRiskRatio").replace("{ratio}", formatRatioPercent(item.ratio))
2518+
: t("optionOverlayBudgetRatio").replace("{ratio}", formatRatioPercent(item.ratio));
2519+
return `${family} ${ratioText}`;
2520+
}).join(" / ");
2521+
}
2522+
2523+
function optionOverlayDefaultText(profile) {
2524+
const defaults = optionOverlayDefaultForStrategy(profile);
2525+
if (!defaults) return t("optionOverlayNotSupported");
2526+
const detail = optionOverlayDefaultSummaryDetail(defaults);
2527+
return detail ? t("optionOverlayDefault").replace("{detail}", detail) : t("optionOverlayDefaultSimple");
2528+
}
2529+
24832530
function currentOptionOverlayText(platform = state.selected, account = selectedAccount(platform), profile = state.forms[platform]?.strategy) {
2484-
const enabled = currentOptionOverlayForAccount(platform, account);
2485-
if (!optionOverlaySupported(profile) && enabled === null) return t("optionOverlayNotSupported");
2486-
return enabled === null ? t("notRead") : optionOverlayText(enabled);
2531+
const entry = currentEntryForAccount(platform, account);
2532+
if (!entry) return t("notRead");
2533+
const configured = cleanOptionalBoolean(entry.option_overlay_enabled);
2534+
if (!optionOverlaySupported(profile)) {
2535+
return configured === null ? t("optionOverlayNotSupported") : optionOverlayText(configured);
2536+
}
2537+
if (configured === null) return optionOverlayDefaultText(profile);
2538+
return optionOverlayText(configured);
24872539
}
24882540

24892541
function currentIncomeLayerForAccount(platform, account) {
@@ -3234,12 +3286,12 @@ <h2 data-i18n="summary">切换摘要</h2>
32343286
const profile = cleanStrategyProfile(inputs.strategy_profile || state.forms[platform]?.strategy);
32353287
const supported = optionOverlaySupported(profile);
32363288
const mode = normalizeOptionOverlayMode(inputs.option_overlay_mode);
3237-
const current = currentOptionOverlayForAccount(platform, account);
3289+
const current = effectiveOptionOverlayForAccount(platform, account, profile);
32383290
if (mode === "current") {
32393291
return {
32403292
supported,
32413293
changed: false,
3242-
inputs: { option_overlay_enabled: current },
3294+
inputs: { option_overlay_enabled: currentOptionOverlayForAccount(platform, account) },
32433295
};
32443296
}
32453297
if (mode === "enabled") {
@@ -3258,11 +3310,11 @@ <h2 data-i18n="summary">切换摘要</h2>
32583310

32593311
function pendingCashOnlyExecution(inputs, platform = state.selected, account = selectedAccount(platform)) {
32603312
const mode = normalizeCashOnlyExecutionMode(inputs.cash_only_execution_mode);
3261-
const current = currentCashOnlyExecutionForAccount(platform, account);
3313+
const current = effectiveCashOnlyExecutionForAccount(platform, account);
32623314
if (mode === "current") {
32633315
return {
32643316
changed: false,
3265-
inputs: { cash_only_execution: current },
3317+
inputs: { cash_only_execution: currentCashOnlyExecutionForAccount(platform, account) },
32663318
};
32673319
}
32683320
const nextEnabled = mode === "enabled";
@@ -3413,8 +3465,10 @@ <h2 data-i18n="summary">切换摘要</h2>
34133465
],
34143466
[t("currentPluginMode"), pluginModeLabel(changes.currentPluginMode)],
34153467
[t("reservedCashPolicy"), currentReservedCashPolicyText(state.selected, account)],
3416-
[t("currentCashOnlyExecution"), currentCashOnlyExecutionText(state.selected, account)],
34173468
];
3469+
if (platformSupportsMarginPolicy(state.selected)) {
3470+
rows.push([t("currentCashOnlyExecution"), currentCashOnlyExecutionText(state.selected, account)]);
3471+
}
34183472
if (incomeLayerSupported(inputs.strategy_profile)) {
34193473
rows.push([t("currentIncomeLayer"), currentIncomeLayerText(state.selected, account, inputs.strategy_profile)]);
34203474
}

web/strategy-switch-console/page_asset.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)