Fix position cards, breakeven badge, and tablet equal-height layout.
Stop clipping pos cards and match trailing-BE stop detection for the badge. On tablet, align order and live-trading panels to equal height with internal scroll; keep desktop positions scrollable after three cards. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+16
-5
@@ -95,8 +95,12 @@
|
||||
var sl = Number(row.stop_loss);
|
||||
if (isNaN(entry) || isNaN(sl) || entry <= 0) return false;
|
||||
var tick = Number(row.tick_size) || Math.max(Math.abs(entry) * 1e-6, 0.01);
|
||||
var buf = tick * 2.5;
|
||||
var beMult = 2;
|
||||
var dir = (row.direction || 'long').toString().toLowerCase();
|
||||
var expectedBe = dir === 'short' ? entry - beMult * tick : entry + beMult * tick;
|
||||
var tol = beMult * tick + tick * 0.05;
|
||||
if (Math.abs(sl - expectedBe) <= tol) return true;
|
||||
var buf = tick * Math.max(2, beMult);
|
||||
if (Math.abs(sl - entry) > buf + tick) return false;
|
||||
return dir === 'short' ? sl <= entry + tick * 0.05 : sl >= entry - tick * 0.05;
|
||||
}
|
||||
@@ -234,15 +238,19 @@
|
||||
titleInner += ' <span class="dash-symbol-ex text-muted">' + escHtml(exchange) + '</span>';
|
||||
}
|
||||
titleInner += mainBadge;
|
||||
titleInner += breakevenBadgeHtml(row);
|
||||
if (code && String(name).toLowerCase() !== String(code).toLowerCase()) {
|
||||
titleInner += ' <span class="text-accent">' + escHtml(code) + '</span> ' + directionBadgeHtml(row);
|
||||
titleInner += ' <span class="text-accent">' + escHtml(code) + '</span>';
|
||||
titleInner += breakevenBadgeHtml(row);
|
||||
titleInner += ' ' + directionBadgeHtml(row);
|
||||
} else if (!name && code) {
|
||||
titleInner = (exchange
|
||||
? '<span class="dash-symbol-ex text-muted">' + escHtml(exchange) + '</span> '
|
||||
: '') + '<span class="text-accent">' + escHtml(code) + '</span> ' + directionBadgeHtml(row);
|
||||
: '') + '<span class="text-accent">' + escHtml(code) + '</span>';
|
||||
titleInner += breakevenBadgeHtml(row);
|
||||
titleInner += ' ' + directionBadgeHtml(row);
|
||||
} else {
|
||||
titleInner += ' ' + directionBadgeHtml(row);
|
||||
titleInner += breakevenBadgeHtml(row);
|
||||
}
|
||||
return titleInner;
|
||||
}
|
||||
@@ -270,13 +278,16 @@
|
||||
titleInner += ' <span class="dash-symbol-ex text-muted">' + escHtml(exchange) + '</span>';
|
||||
}
|
||||
titleInner += mainBadge;
|
||||
titleInner += breakevenBadgeHtml(row);
|
||||
if (code && String(name).toLowerCase() !== String(code).toLowerCase()) {
|
||||
titleInner += ' <span class="text-accent">' + escHtml(code) + '</span>';
|
||||
titleInner += breakevenBadgeHtml(row);
|
||||
} else if (!name && code) {
|
||||
titleInner = (exchange
|
||||
? '<span class="dash-symbol-ex text-muted">' + escHtml(exchange) + '</span> '
|
||||
: '') + '<span class="text-accent">' + escHtml(code) + '</span>';
|
||||
titleInner += breakevenBadgeHtml(row);
|
||||
} else {
|
||||
titleInner += breakevenBadgeHtml(row);
|
||||
}
|
||||
return (
|
||||
'<div class="dash-symbol-cell">' +
|
||||
|
||||
+44
-19
@@ -322,12 +322,14 @@
|
||||
return;
|
||||
}
|
||||
list.innerHTML = '<div class="empty-hint">暂无持仓。</div>';
|
||||
syncPositionListScroll(0);
|
||||
return;
|
||||
}
|
||||
if (!connected && ctpAutoConnectEnabled) {
|
||||
tryAutoCtpReconnect();
|
||||
}
|
||||
list.innerHTML = rows.map(buildPosCard).join('');
|
||||
syncPositionListScroll(rows.length);
|
||||
bindPendingDismiss(list);
|
||||
bindCancelOpenButtons(list);
|
||||
bindSlTpButtons(list);
|
||||
@@ -1019,32 +1021,55 @@
|
||||
return '<span class="text-muted">未开启</span>';
|
||||
}
|
||||
|
||||
function syncPositionListScroll(count) {
|
||||
if (!list) return;
|
||||
var n = count != null ? count : list.querySelectorAll('.pos-card[data-pos-key]').length;
|
||||
var isDesktopTablet = !document.documentElement.classList.contains('layout-phone')
|
||||
&& document.documentElement.dataset.layout !== 'phone'
|
||||
&& document.documentElement.dataset.mobile !== '1';
|
||||
list.classList.toggle('pos-list-many', isDesktopTablet && n > 3);
|
||||
}
|
||||
|
||||
function breakevenBadgeHtml(row) {
|
||||
if (row.breakeven_locked) {
|
||||
return ' <span class="badge profit pos-be-badge">已保本</span>';
|
||||
}
|
||||
if ((row.trailing_r_locked || 0) >= 1) {
|
||||
return ' <span class="badge profit pos-be-badge">已保本</span>';
|
||||
}
|
||||
if (row.stop_loss == null || row.entry_price == null) return '';
|
||||
var entry = Number(row.entry_price);
|
||||
var sl = Number(row.stop_loss);
|
||||
if (isNaN(entry) || isNaN(sl) || entry <= 0) return '';
|
||||
var tick = Number(row.tick_size) || Math.max(Math.abs(entry) * 1e-6, 0.01);
|
||||
var beMult = 2;
|
||||
var dir = (row.direction || 'long').toString().toLowerCase();
|
||||
var expectedBe = dir === 'short' ? entry - beMult * tick : entry + beMult * tick;
|
||||
var tol = beMult * tick + tick * 0.05;
|
||||
if (Math.abs(sl - expectedBe) <= tol) {
|
||||
return ' <span class="badge profit pos-be-badge">已保本</span>';
|
||||
}
|
||||
var buf = tick * Math.max(2, beMult);
|
||||
if (Math.abs(sl - entry) > buf + tick) return '';
|
||||
if (dir === 'short' ? sl <= entry + tick * 0.05 : sl >= entry - tick * 0.05) {
|
||||
return ' <span class="badge profit pos-be-badge">已保本</span>';
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
function posSymbolTitleHtml(row, extraBadges) {
|
||||
extraBadges = extraBadges || '';
|
||||
var name = row.symbol_name || row.symbol || '';
|
||||
var code = row.symbol_code || '';
|
||||
var mainBadge = row.symbol_is_main ? ' <span class="badge planned pos-main-badge">主力</span>' : '';
|
||||
var beBadge = (function () {
|
||||
if (row.breakeven_locked) return ' <span class="badge profit dash-be-badge">已保本</span>';
|
||||
if ((row.trailing_r_locked || 0) >= 1) return ' <span class="badge profit dash-be-badge">已保本</span>';
|
||||
if (row.stop_loss == null || row.entry_price == null) return '';
|
||||
var entry = Number(row.entry_price);
|
||||
var sl = Number(row.stop_loss);
|
||||
if (isNaN(entry) || isNaN(sl)) return '';
|
||||
var tick = Number(row.tick_size) || Math.max(Math.abs(entry) * 1e-6, 0.01);
|
||||
var buf = tick * 2.5;
|
||||
var dir = (row.direction || 'long').toString().toLowerCase();
|
||||
if (Math.abs(sl - entry) > buf + tick) return '';
|
||||
if (dir === 'short' ? sl <= entry + tick * 0.05 : sl >= entry - tick * 0.05) {
|
||||
return ' <span class="badge profit dash-be-badge">已保本</span>';
|
||||
}
|
||||
return '';
|
||||
}());
|
||||
var inner = name + mainBadge + beBadge;
|
||||
var beBadge = breakevenBadgeHtml(row);
|
||||
var inner = name + mainBadge;
|
||||
if (code && String(name).toLowerCase() !== String(code).toLowerCase()) {
|
||||
inner += ' <span class="text-accent">' + code + '</span>';
|
||||
inner += ' <span class="text-accent">' + code + '</span>' + beBadge;
|
||||
} else if (!name && code) {
|
||||
inner = '<span class="text-accent">' + code + '</span>';
|
||||
inner = '<span class="text-accent">' + code + '</span>' + beBadge;
|
||||
} else {
|
||||
inner += beBadge;
|
||||
}
|
||||
if (marketNavEnabled && code) {
|
||||
var href = '/market?symbol=' + encodeURIComponent(code) + '&period=15m';
|
||||
|
||||
Reference in New Issue
Block a user