diff --git a/manual_trading_hub/hub.py b/manual_trading_hub/hub.py index 71329c8..f72a1b4 100644 --- a/manual_trading_hub/hub.py +++ b/manual_trading_hub/hub.py @@ -43,7 +43,7 @@ HUB_BRIDGE_TOKEN = (os.getenv("HUB_BRIDGE_TOKEN") or os.getenv("CONTROL_TOKEN") _trust_raw = (os.getenv("HUB_TRUST_LAN", "true") or "").strip().lower() HUB_TRUST_LAN = _trust_raw not in ("0", "false", "no", "off") DIR = Path(__file__).resolve().parent -HUB_BUILD = "20260525-tpsl-ui" +HUB_BUILD = "20260525-orders-ui" def _is_local(host: str | None) -> bool: diff --git a/manual_trading_hub/static/app.css b/manual_trading_hub/static/app.css index 10bc095..5f76f6d 100644 --- a/manual_trading_hub/static/app.css +++ b/manual_trading_hub/static/app.css @@ -370,9 +370,7 @@ button:disabled { box-shadow: var(--glow); } -.btn-close-pos { - font-size: 11px; - padding: 4px 10px; +.btn-close-pos.btn-sm { white-space: nowrap; } @@ -556,27 +554,117 @@ button:disabled { margin-bottom: 0; } -.pos-orders { - margin: 8px 0 0; - padding: 8px 10px; - background: rgba(0, 0, 0, 0.2); - border-radius: 6px; - border: 1px solid var(--border-soft); +.pos-action-group { + display: inline-flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; + gap: 6px; + flex-wrap: nowrap; + white-space: nowrap; } -.pos-orders-head { +.data-table .td-actions .btn-sm { + margin: 0; + vertical-align: middle; +} + +button.btn-sm { + padding: 4px 11px; + font-size: 11px; + line-height: 1.35; + border-radius: 6px; + min-width: 48px; +} + +.btn-place-tpsl.btn-sm { + border-color: rgba(0, 212, 255, 0.35); + color: var(--accent); +} + +.pos-orders-collapse { + margin: 10px 0 0; + padding: 0; + background: rgba(0, 0, 0, 0.28); + border: 1px solid var(--border-soft); + border-radius: 8px; + overflow: hidden; +} + +.pos-orders-collapse-summary { display: flex; align-items: center; - justify-content: space-between; - gap: 8px; - margin-bottom: 6px; + gap: 10px; + padding: 8px 10px; + cursor: pointer; + list-style: none; + user-select: none; + background: rgba(0, 212, 255, 0.04); + border-bottom: 1px solid transparent; } -.pos-orders-title { +.pos-orders-collapse[open] > .pos-orders-collapse-summary { + border-bottom-color: var(--border-soft); +} + +.pos-orders-collapse-summary::-webkit-details-marker { + display: none; +} + +.pos-orders-collapse-summary::before { + content: "▸"; + flex-shrink: 0; + color: var(--accent); + font-size: 11px; + width: 12px; + transition: transform 0.15s ease; +} + +.pos-orders-collapse[open] > .pos-orders-collapse-summary::before { + transform: rotate(90deg); +} + +.pos-orders-collapse-label { + font-size: 11px; + font-weight: 600; + letter-spacing: 0.04em; + color: var(--text); +} + +.pos-orders-collapse-label em { + font-style: normal; + color: var(--accent); + margin-left: 2px; +} + +.pos-orders-collapse-meta { + flex: 1; font-size: 10px; color: var(--muted); - letter-spacing: 0.06em; + min-width: 0; +} + +.pos-orders-collapse-summary .btn-cancel-cond-all { + flex-shrink: 0; + margin-left: auto; +} + +.pos-orders-collapse-body { + padding: 8px 10px 10px; +} + +.orders-section + .orders-section { + margin-top: 10px; + padding-top: 10px; + border-top: 1px dashed var(--border-soft); +} + +.orders-section-head { + font-size: 10px; + color: var(--muted); + letter-spacing: 0.08em; text-transform: uppercase; + margin-bottom: 6px; } .data-table-sub { @@ -594,48 +682,6 @@ button:disabled { padding: 6px 4px 8px; } -.td-actions-row { - display: flex; - flex-wrap: wrap; - gap: 6px; - justify-content: flex-end; -} - -.orders-collapse { - margin-bottom: 8px; -} - -.orders-collapse-summary { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - cursor: pointer; - list-style: none; - padding: 4px 0; - user-select: none; -} - -.orders-collapse-summary::-webkit-details-marker { - display: none; -} - -.orders-collapse-summary::before { - content: "▸"; - color: var(--muted); - margin-right: 6px; - font-size: 10px; - transition: transform 0.15s ease; -} - -.orders-collapse[open] > .orders-collapse-summary::before { - transform: rotate(90deg); -} - -.orders-collapse-body { - margin-top: 6px; -} - .modal { position: fixed; inset: 0; diff --git a/manual_trading_hub/static/app.js b/manual_trading_hub/static/app.js index fd0b628..564d924 100644 --- a/manual_trading_hub/static/app.js +++ b/manual_trading_hub/static/app.js @@ -218,11 +218,13 @@ const guess = guessTpslFromCondOrders(x.side, cond); const slAttr = esc(String(guess.sl)).replace(/"/g, """); const tpAttr = esc(String(guess.tp)).replace(/"/g, """); + const orderTotal = cond.length + reg.length; const condAllBtn = cond.length > 0 - ? `` + ? `` : ""; const condBody = renderOrderRows(exchangeId, x.symbol, cond, "conditional"); + const regBody = renderOrderRows(exchangeId, x.symbol, reg, "limit"); return `
@@ -230,25 +232,31 @@ -
合约方向张数浮盈操作
${esc(x.side)} ${fmt(x.contracts, 4)} ${fmt(x.unrealized_pnl, 4)} - - + +
+ + +
-
-
- - 条件单 · ${cond.length} - ${condAllBtn} - -
${condBody}
-
-
- 普通委托 · ${reg.length} +
+ + 委托单 ${orderTotal} + 条件 ${cond.length} · 普通 ${reg.length} + ${condAllBtn} + +
+
+
条件单
+ ${condBody} +
+
+
普通委托
+ ${regBody} +
- ${renderOrderRows(exchangeId, x.symbol, reg, "limit")} -
+
`; } diff --git a/manual_trading_hub/static/index.html b/manual_trading_hub/static/index.html index ac6bab1..c9f6b09 100644 --- a/manual_trading_hub/static/index.html +++ b/manual_trading_hub/static/index.html @@ -7,7 +7,7 @@ - + @@ -101,6 +101,6 @@
- +