From 7ea51818f1ea42f5c76ff949d676f10e0059e113 Mon Sep 17 00:00:00 2001 From: dekun Date: Mon, 8 Jun 2026 08:12:33 +0800 Subject: [PATCH] Fix chart viewport hiding after timeframe switch. Use pendingViewportEpoch so tail refresh applies default range on new timeframe instead of reusing the previous period's saved range. Co-authored-by: Cursor --- manual_trading_hub/static/chart.js | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/manual_trading_hub/static/chart.js b/manual_trading_hub/static/chart.js index 27618b0..bbe943a 100644 --- a/manual_trading_hub/static/chart.js +++ b/manual_trading_hub/static/chart.js @@ -178,6 +178,7 @@ let chartRangeUserLocked = false; let chartRangeLockTimer = null; let suppressRangeUserLock = false; + let pendingViewportEpoch = -1; let priceTagTimer = null; let tfDigitBuf = ""; let tfDigitTimer = null; @@ -2032,6 +2033,7 @@ } function markChartRangeUserAdjusted() { + pendingViewportEpoch = -1; chartRangeUserLocked = true; if (chartRangeLockTimer) clearTimeout(chartRangeLockTimer); chartRangeLockTimer = setTimeout(function () { @@ -2248,16 +2250,27 @@ applyChartPriceFormat(); } } + const keepViewport = + pendingViewportEpoch !== chartViewEpoch && + savedRange && + isVisibleRangeValidForCandles(savedRange, candleCountBefore); applyCandlesToChart( mergeCandles(lastCandles, alignCandlesToTick(data.candles), { prepend: false }), 0, - { preserveRange: true, skipAutoScale: chartRangeUserLocked } + { + preserveRange: !!keepViewport, + skipAutoScale: chartRangeUserLocked, + } ); if (epochAtStart !== chartViewEpoch) return; const n = lastCandles.length; - if (!restoreVisibleLogicalRange(savedRange, n)) { + if (pendingViewportEpoch === chartViewEpoch) { + applyDefaultVisibleRange(); + } else if (savedRange && isVisibleRangeValidForCandles(savedRange, n)) { + restoreVisibleLogicalRange(savedRange, n); + } else if (!chartRangeUserLocked) { const curRange = chart && chart.timeScale().getVisibleLogicalRange(); - if (!chartRangeUserLocked && curRange && !isVisibleRangeValidForCandles(curRange, n)) { + if (!curRange || !isVisibleRangeValidForCandles(curRange, n)) { restoreVisibleLogicalRange(tailVisibleLogicalRange(n), n); } } @@ -2512,6 +2525,7 @@ chartDataLoading = true; if (resetView) { chartViewEpoch += 1; + pendingViewportEpoch = chartViewEpoch; chartRangeUserLocked = false; if (chartRangeLockTimer) { clearTimeout(chartRangeLockTimer);