81f7a7c451
Co-authored-by: Cursor <cursoragent@cursor.com>
215 lines
6.8 KiB
JavaScript
215 lines
6.8 KiB
JavaScript
(function (global) {
|
|
|
|
var delegated = false;
|
|
|
|
|
|
|
|
function queryInScope(scope, id) {
|
|
|
|
if (scope && scope.querySelector) return scope.querySelector("#" + id);
|
|
|
|
return document.getElementById(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
function categoriesData() {
|
|
|
|
return global.ORDER_ENTRY_MODEL_CATEGORIES || [];
|
|
|
|
}
|
|
|
|
|
|
|
|
function codeToCategoryMap() {
|
|
|
|
return global.ORDER_ENTRY_MODEL_CODE_TO_CATEGORY || {};
|
|
|
|
}
|
|
|
|
|
|
|
|
function tradeStyleForCode(code, modelSel) {
|
|
|
|
if (modelSel && code) {
|
|
|
|
var opt = modelSel.querySelector('option[value="' + code.replace(/"/g, '\\"') + '"]');
|
|
|
|
if (opt) {
|
|
|
|
var ds = opt.getAttribute("data-trade-style");
|
|
|
|
if (ds === "swing" || ds === "trend") return ds;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var map = global.ORDER_ENTRY_MODEL_TRADE_STYLE || {};
|
|
|
|
return map[code] || "trend";
|
|
|
|
}
|
|
|
|
|
|
|
|
function findOption(catKey, code) {
|
|
|
|
var cats = categoriesData();
|
|
|
|
for (var i = 0; i < cats.length; i++) {
|
|
|
|
if (cats[i].key !== catKey) continue;
|
|
|
|
var opts = cats[i].options || [];
|
|
|
|
for (var j = 0; j < opts.length; j++) {
|
|
|
|
if (opts[j].code === code) return opts[j];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
function filterDomSubOptions(modelSel, catKey, preserveCode) {
|
|
|
|
var tagged = modelSel.querySelectorAll("option[data-entry-category]");
|
|
|
|
if (!tagged.length) return false;
|
|
|
|
|
|
|
|
var any = false;
|
|
|
|
for (var i = 0; i < tagged.length; i++) {
|
|
|
|
var opt = tagged[i];
|
|
|
|
var show = !!catKey && opt.getAttribute("data-entry-category") === catKey;
|
|
|
|
opt.hidden = !show;
|
|
|
|
opt.disabled = !show;
|
|
|
|
if (show) any = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
modelSel.disabled = !any;
|
|
|
|
if (!any) {
|
|
|
|
modelSel.value = "";
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
var pick = preserveCode || "";
|
|
|
|
if (pick) {
|
|
|
|
var picked = modelSel.querySelector('option[value="' + pick.replace(/"/g, '\\"') + '"]:not([disabled])');
|
|
|
|
if (picked) {
|
|
|
|
modelSel.value = pick;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var visible = [];
|
|
|
|
for (var k = 0; k < tagged.length; k++) {
|
|
|
|
if (!tagged[k].disabled) visible.push(tagged[k]);
|
|
|
|
}
|
|
|
|
if (visible.length === 1) modelSel.value = visible[0].value;
|
|
|
|
else modelSel.value = "";
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
function rebuildFromCategories(modelSel, catKey, preserveCode) {
|
|
|
|
var cats = categoriesData();
|
|
|
|
var cat = null;
|
|
|
|
for (var i = 0; i < cats.length; i++) {
|
|
|
|
if (cats[i].key === catKey) {
|
|
|
|
cat = cats[i];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
modelSel.innerHTML = "";
|
|
|
|
var placeholder = document.createElement("option");
|
|
|
|
placeholder.value = "";
|
|
|
|
placeholder.textContent = "类型";
|
|
|
|
modelSel.appendChild(placeholder);
|
|
|
|
|
|
|
|
if (!cat || !cat.options || !cat.options.length) {
|
|
|
|
modelSel.disabled = true;
|
|
|
|
modelSel.value = "";
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
modelSel.disabled = false;
|
|
|
|
var pick = preserveCode || "";
|
|
|
|
for (var k = 0; k < cat.options.length; k++) {
|
|
|
|
var o = cat.options[k];
|
|
|
|
var opt = document.createElement("option");
|
|
|
|
opt.value = o.code;
|
|
|
|
opt.textContent = o.label;
|
|
|
|
if (o.trade_style) opt.setAttribute("data-trade-style", o.trade_style);
|
|
|
|
if (o.help) opt.title = o.help;
|
|
|
|
modelSel.appendChild(opt);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pick && findOption(catKey, pick)) {
|
|
|
|
modelSel.value = pick;
|
|
|
|
} else if (cat.options.length === 1) {
|
|
|
|
modelSel.value = cat.options[0].code;
|
|
|
|
} else {
|
|
|
|
modelSel.value = "";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function rebuildEntryModelSubSelect(preserveCode, scope) {
|
|
|
|
var root = scope && scope.querySelector ? scope : document;
|
|
|
|
var catSel = queryInScope(root, "order-entry-category");
|
|
|
|
var modelSel = queryInScope(root, "order-entry-model");
|
|
|
|
if (!catSel || !modelSel) return;
|
|
|
|
|
|
|
|
var catKey = catSel.value;
|
|
|
|
if (filterDomSubOptions(modelSel, catKey, preserveCode)) {
|
|
|
|
syncOrderEntryModelTradeStyle(modelSel);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
rebuildFromCategories(modelSel, catKey, preserveCode);
|
|
|
|
syncOrderEntryModelTradeStyle(modelSel);
|
|
|
|
}
|
|
|
|
|
|
|
|
function syncOrderEntryModelTradeStyle(modelSel) {
|
|
|
|
if (!modelSel) modelSel = document.getElementById("order-entry-model");
|
|
|
|
var hidden = document.getElementById("order-trade-style-hidden");
|
|
|
|
var hint = document.getElementById("order-trade-style-hint");
|
|
|
|
if (!modelSel || !hidden) return;
|
|
|
|
var labels = { trend: "趋势单", swing: "波段单" };
|
|
|
|
var code = modelSel.value || "";
|
|
|
|
var ts = tradeStyleForCode(code, modelSel);
|
|
|
|
hidden.value = ts;
|
|
|
|
if (hint) hint.textContent = labels[ts] || ts;
|
|
|
|
}
|
|
|
|
|
|
|
|
function wireDelegation() {
|
|
|
|
if (delegated) return;
|
|
|
|
delegated = true;
|
|
|
|
document.addEventListener(
|
|
|
|
"change",
|
|
|
|
function (ev) {
|
|
|
|
var t = ev.target;
|
|
|
|
if (!t || !t.id) return;
|
|
|
|
if (t.id === "order-entry-category") {
|
|
|
|
rebuildEntryModelSubSelect("");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (t.id === "order-entry-model") {
|
|
|
|
syncOrderEntryModelTradeStyle(t);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
false
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function initOrderEntryModelSelect(root) {
|
|
|
|
wireDelegation();
|
|
|
|
var scope = root && root.querySelector ? root : document;
|
|
|
|
var catSel = queryInScope(scope, "order-entry-category");
|
|
|
|
var modelSel = queryInScope(scope, "order-entry-model");
|
|
|
|
if (!catSel || !modelSel) return;
|
|
|
|
|
|
|
|
var presetCode = modelSel.getAttribute("data-preset-code") || modelSel.value || "";
|
|
|
|
if (presetCode) {
|
|
|
|
var catMap = codeToCategoryMap();
|
|
|
|
var catKey = catMap[presetCode];
|
|
|
|
if (catKey) {
|
|
|
|
catSel.value = catKey;
|
|
|
|
rebuildEntryModelSubSelect(presetCode, scope);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
rebuildEntryModelSubSelect("", scope);
|
|
|
|
}
|
|
|
|
|
|
|
|
global.paintOrderLeverageHint = function (leverage) {
|
|
|
|
var hidden = document.getElementById("order-leverage");
|
|
|
|
var hint = document.getElementById("order-leverage-hint");
|
|
|
|
if (!hidden && !hint) return;
|
|
|
|
var lev = parseInt(leverage, 10);
|
|
|
|
if (!Number.isFinite(lev) || lev <= 0) {
|
|
|
|
if (hint) hint.textContent = "杠杆 —";
|
|
|
|
if (hidden) hidden.value = "";
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (hidden) hidden.value = String(lev);
|
|
|
|
if (hint) hint.textContent = "杠杆 " + lev + "x";
|
|
|
|
};
|
|
|
|
|
|
|
|
global.initOrderEntryModelSelect = initOrderEntryModelSelect;
|
|
|
|
global.syncOrderEntryModelTradeStyle = syncOrderEntryModelTradeStyle;
|
|
|
|
global.rebuildEntryModelSubSelect = rebuildEntryModelSubSelect;
|
|
|
|
|
|
|
|
wireDelegation();
|
|
|
|
if (document.readyState === "loading") {
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
|
|
initOrderEntryModelSelect();
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
initOrderEntryModelSelect();
|
|
|
|
}
|
|
|
|
})(typeof window !== "undefined" ? window : globalThis);
|
|
|