feat(chart-interaction): add getSvgPointerX function for improved pointer handling in charts
This commit is contained in:
parent
3c6f836a7e
commit
dfafd9a826
1 changed files with 9 additions and 6 deletions
|
|
@ -115,6 +115,13 @@ function getDateTicks(values: Date[], width: number): Date[] {
|
||||||
return scale.ticks(Math.max(2, Math.floor(width / 120)));
|
return scale.ticks(Math.max(2, Math.floor(width / 120)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getSvgPointerX(event: PointerEvent): number {
|
||||||
|
const target = event.currentTarget as SVGGraphicsElement;
|
||||||
|
const container = target.ownerSVGElement ?? target;
|
||||||
|
const [x] = d3.pointer(event, container);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
interface TimeSeriesChartSeries {
|
interface TimeSeriesChartSeries {
|
||||||
key: string;
|
key: string;
|
||||||
label: string;
|
label: string;
|
||||||
|
|
@ -279,9 +286,7 @@ export function TimeSeriesChart(props: TimeSeriesChartProps) {
|
||||||
};
|
};
|
||||||
|
|
||||||
const handlePointerMove = (event: PointerEvent) => {
|
const handlePointerMove = (event: PointerEvent) => {
|
||||||
const rect = (event.currentTarget as SVGRectElement).getBoundingClientRect();
|
const hoveredDate = xScale().invert(getSvgPointerX(event));
|
||||||
const offsetX = event.clientX - rect.left;
|
|
||||||
const hoveredDate = xScale().invert(offsetX);
|
|
||||||
const nearestIndex = d3.leastIndex(points(), (point: ParsedTimeSeriesDatum) => Math.abs(point.parsedDate.getTime() - hoveredDate.getTime()));
|
const nearestIndex = d3.leastIndex(points(), (point: ParsedTimeSeriesDatum) => Math.abs(point.parsedDate.getTime() - hoveredDate.getTime()));
|
||||||
setHoverIndex(nearestIndex ?? null);
|
setHoverIndex(nearestIndex ?? null);
|
||||||
};
|
};
|
||||||
|
|
@ -486,9 +491,7 @@ export function ComboChart(props: ComboChartProps) {
|
||||||
});
|
});
|
||||||
|
|
||||||
const handlePointerMove = (event: PointerEvent) => {
|
const handlePointerMove = (event: PointerEvent) => {
|
||||||
const rect = (event.currentTarget as SVGRectElement).getBoundingClientRect();
|
const hoveredDate = xScale().invert(getSvgPointerX(event));
|
||||||
const offsetX = event.clientX - rect.left;
|
|
||||||
const hoveredDate = xScale().invert(offsetX);
|
|
||||||
const nearestIndex = d3.leastIndex(points(), (point: ParsedComboDatum) => Math.abs(point.parsedDate.getTime() - hoveredDate.getTime()));
|
const nearestIndex = d3.leastIndex(points(), (point: ParsedComboDatum) => Math.abs(point.parsedDate.getTime() - hoveredDate.getTime()));
|
||||||
setHoverIndex(nearestIndex ?? null);
|
setHoverIndex(nearestIndex ?? null);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue