Fix turbo nav for settings and stats pages.
Extract settings.js, preserve inline scripts from raw HTML (DOMParser strips them), and load trade config via JSON script tag. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
/* Copyright (c) 2025-2026 马建军. All rights reserved.
|
||||
* 专有软件 — 未经授权禁止复制、传播、转售。
|
||||
* 详见 LICENSE.zh-CN.txt
|
||||
*/
|
||||
(function () {
|
||||
function bootSettingsPage() {
|
||||
if (!document.querySelector('.settings-page')) return;
|
||||
|
||||
var sel = document.getElementById('position-sizing-mode');
|
||||
var lotsField = document.getElementById('field-fixed-lots');
|
||||
var amountField = document.getElementById('field-fixed-amount');
|
||||
function syncSizingFields() {
|
||||
if (!sel) return;
|
||||
var isAmount = sel.value === 'amount';
|
||||
if (lotsField) lotsField.hidden = isAmount;
|
||||
if (amountField) amountField.hidden = !isAmount;
|
||||
}
|
||||
if (sel && !sel.dataset.settingsBound) {
|
||||
sel.dataset.settingsBound = '1';
|
||||
sel.addEventListener('change', syncSizingFields);
|
||||
}
|
||||
syncSizingFields();
|
||||
|
||||
var SETTINGS_FOLD_KEY = 'qihuo_settings_fold';
|
||||
function setSettingsFold(el, collapsed) {
|
||||
if (!el) return;
|
||||
el.classList.toggle('is-collapsed', collapsed);
|
||||
var head = el.querySelector('.settings-fold-head');
|
||||
if (head) head.setAttribute('aria-expanded', collapsed ? 'false' : 'true');
|
||||
}
|
||||
function saveSettingsFoldState() {
|
||||
var state = {};
|
||||
document.querySelectorAll('[data-settings-fold]').forEach(function (el) {
|
||||
state[el.getAttribute('data-settings-fold')] = el.classList.contains('is-collapsed');
|
||||
});
|
||||
try { localStorage.setItem(SETTINGS_FOLD_KEY, JSON.stringify(state)); } catch (e) { /* ignore */ }
|
||||
}
|
||||
function loadSettingsFoldState() {
|
||||
try {
|
||||
var raw = localStorage.getItem(SETTINGS_FOLD_KEY);
|
||||
if (!raw) return;
|
||||
var state = JSON.parse(raw);
|
||||
document.querySelectorAll('[data-settings-fold]').forEach(function (el) {
|
||||
var key = el.getAttribute('data-settings-fold');
|
||||
if (Object.prototype.hasOwnProperty.call(state, key)) {
|
||||
setSettingsFold(el, !!state[key]);
|
||||
}
|
||||
});
|
||||
} catch (e) { /* ignore */ }
|
||||
}
|
||||
document.querySelectorAll('.settings-fold-head').forEach(function (btn) {
|
||||
if (btn.dataset.settingsBound) return;
|
||||
btn.dataset.settingsBound = '1';
|
||||
btn.addEventListener('click', function () {
|
||||
var panel = btn.closest('[data-settings-fold]');
|
||||
if (!panel) return;
|
||||
setSettingsFold(panel, !panel.classList.contains('is-collapsed'));
|
||||
saveSettingsFoldState();
|
||||
});
|
||||
});
|
||||
loadSettingsFoldState();
|
||||
|
||||
var CTP_FOLD_KEY = 'qihuo_ctp_fold';
|
||||
function setCtpFold(el, collapsed) {
|
||||
if (!el) return;
|
||||
el.classList.toggle('is-collapsed', collapsed);
|
||||
var head = el.querySelector('.settings-ctp-fold-head');
|
||||
if (head) head.setAttribute('aria-expanded', collapsed ? 'false' : 'true');
|
||||
}
|
||||
function saveCtpFoldState() {
|
||||
var state = {};
|
||||
document.querySelectorAll('[data-ctp-fold]').forEach(function (el) {
|
||||
state[el.getAttribute('data-ctp-fold')] = el.classList.contains('is-collapsed');
|
||||
});
|
||||
try { localStorage.setItem(CTP_FOLD_KEY, JSON.stringify(state)); } catch (e) { /* ignore */ }
|
||||
}
|
||||
function loadCtpFoldState() {
|
||||
try {
|
||||
var raw = localStorage.getItem(CTP_FOLD_KEY);
|
||||
if (!raw) return;
|
||||
var state = JSON.parse(raw);
|
||||
document.querySelectorAll('[data-ctp-fold]').forEach(function (el) {
|
||||
var key = el.getAttribute('data-ctp-fold');
|
||||
if (Object.prototype.hasOwnProperty.call(state, key)) {
|
||||
setCtpFold(el, !!state[key]);
|
||||
}
|
||||
});
|
||||
} catch (e) { /* ignore */ }
|
||||
}
|
||||
document.querySelectorAll('.settings-ctp-fold-head').forEach(function (btn) {
|
||||
if (btn.dataset.settingsBound) return;
|
||||
btn.dataset.settingsBound = '1';
|
||||
btn.addEventListener('click', function () {
|
||||
var panel = btn.closest('[data-ctp-fold]');
|
||||
if (!panel) return;
|
||||
setCtpFold(panel, !panel.classList.contains('is-collapsed'));
|
||||
saveCtpFoldState();
|
||||
});
|
||||
});
|
||||
loadCtpFoldState();
|
||||
|
||||
var ctpForm = document.getElementById('ctp-settings-form');
|
||||
if (ctpForm && !ctpForm.dataset.settingsBound) {
|
||||
ctpForm.dataset.settingsBound = '1';
|
||||
ctpForm.addEventListener('submit', function (ev) {
|
||||
var ctpCard = document.querySelector('[data-settings-fold="ctp"]');
|
||||
if (ctpCard) setSettingsFold(ctpCard, false);
|
||||
var simnowFold = document.querySelector('[data-ctp-fold="simnow"]');
|
||||
if (simnowFold) setCtpFold(simnowFold, false);
|
||||
var pwd = document.getElementById('simnow_password');
|
||||
var pwdVal = pwd && pwd.value ? pwd.value.trim() : '';
|
||||
var pwdWasSet = ctpForm.getAttribute('data-simnow-pwd-set') === '1';
|
||||
if (pwdWasSet && !pwdVal) {
|
||||
var ok = window.confirm(
|
||||
'SimNow 交易密码为空,保存后不会更新密码(仍用旧密码)。\n\n'
|
||||
+ '若快期已改密,请取消后在「交易密码」框手打新密码再保存。\n\n仍要保存其他项?'
|
||||
);
|
||||
if (!ok) ev.preventDefault();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (window.qihuoPageBoot) window.qihuoPageBoot(bootSettingsPage, '.settings-page');
|
||||
else document.addEventListener('DOMContentLoaded', bootSettingsPage);
|
||||
})();
|
||||
Reference in New Issue
Block a user