refactor: improve measurement label anchoring and time duration format

This commit is contained in:
DiTus
2026-03-21 17:37:58 +01:00
parent 7c92aa38be
commit 78363fa269

View File

@ -182,7 +182,30 @@ export class DrawingManager {
const rect = this.container.getBoundingClientRect(); const rect = this.container.getBoundingClientRect();
const x = e.clientX - rect.left; const x = e.clientX - rect.left;
const y = e.clientY - rect.top; const y = e.clientY - rect.top;
const time = this.chart.timeScale().coordinateToTime(x);
const timeScale = this.chart.timeScale();
const candleData = this.dashboard.allData.get(this.dashboard.currentInterval) || [];
let time = timeScale.coordinateToTime(x);
if (time === null && candleData.length > 0) {
// Coordinate is likely in the future whitespace
const logical = timeScale.coordinateToLogical(x);
if (logical !== null) {
const lastIdx = candleData.length - 1;
const lastCandle = candleData[lastIdx];
// Logical index of the last candle is roughly 'lastIdx'
// (though logical range might have offsets, this is a good approximation for snapping)
const offset = logical - lastIdx;
if (offset > 0) {
const intervalSec = this.getIntervalSeconds();
time = lastCandle.time + Math.round(offset) * intervalSec;
} else {
// It's in the past but coordinateToTime failed (rare)
time = candleData[0].time;
}
}
}
const price = this.series.coordinateToPrice(y); const price = this.series.coordinateToPrice(y);
return { x, y, time, price }; return { x, y, time, price };
} }
@ -432,13 +455,36 @@ export class DrawingManager {
if (this.requestUpdate) this.requestUpdate(); if (this.requestUpdate) this.requestUpdate();
} }
getIntervalSeconds() {
const interval = this.dashboard.currentInterval;
const unit = interval.slice(-1);
const value = parseInt(interval.slice(0, -1));
switch (unit) {
case 'm': return value * 60;
case 'h': return value * 3600;
case 'd': return value * 86400;
case 'w': return value * 604800;
case 'M': return value * 2592000;
default: return 60;
}
}
snapToNearestTime(time) { snapToNearestTime(time) {
if (time === null) return null; if (time === null) return null;
const candleData = this.dashboard.allData.get(this.dashboard.currentInterval) || []; const candleData = this.dashboard.allData.get(this.dashboard.currentInterval) || [];
if (candleData.length === 0) return time; if (candleData.length === 0) return time;
const lastCandle = candleData[candleData.length - 1];
if (time > lastCandle.time) {
// Snapping for the future area
const intervalSec = this.getIntervalSeconds();
const diff = time - lastCandle.time;
const numIntervals = Math.round(diff / intervalSec);
return lastCandle.time + (numIntervals * intervalSec);
}
// Find nearest timestamp in current data // Find nearest timestamp in current data
// Since data is sorted, we can be efficient, but for now a simple find is safest
let nearest = candleData[0].time; let nearest = candleData[0].time;
let minDiff = Math.abs(time - nearest); let minDiff = Math.abs(time - nearest);