Skip to content

Commit c696c76

Browse files
committed
fix: debounce legend tooltips
1 parent de3f351 commit c696c76

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

src/core/__tests__/chart-core-legend.test.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ const getItem = (index: number, options?: { active?: boolean; dimmed?: boolean }
9292
const mouseOver = (element: HTMLElement) => element.dispatchEvent(new MouseEvent("mouseover", { bubbles: true }));
9393
const mouseOut = (element: HTMLElement) => element.dispatchEvent(new MouseEvent("mouseout", { bubbles: true }));
9494
const mouseLeavePause = () => new Promise((resolve) => setTimeout(resolve, 300));
95+
const tooltipShowPause = () => new Promise((resolve) => setTimeout(resolve, 350));
9596

9697
describe("CoreChart: legend", () => {
9798
test("renders no legend when legend.enabled=false", () => {
@@ -378,12 +379,14 @@ describe("CoreChart: legend", () => {
378379
expect(wrapper.findLegend()!.findItemTooltip()).toBe(null);
379380

380381
act(() => mouseOver(getItem(0).getElement()));
382+
await tooltipShowPause();
381383

382384
expect(wrapper.findLegend()!.findItemTooltip()).not.toBe(null);
383385
expect(wrapper.findLegend()!.findItemTooltip()!.findHeader()!.getElement().textContent).toBe("L1");
384386

385387
act(() => mouseOut(getItem(0).getElement()));
386388
act(() => mouseOver(getItem(2).getElement()));
389+
await tooltipShowPause();
387390

388391
expect(wrapper.findLegend()!.findItemTooltip()).not.toBe(null);
389392
expect(wrapper.findLegend()!.findItemTooltip()!.findHeader()!.getElement().textContent).toBe("Line 3");
@@ -394,7 +397,7 @@ describe("CoreChart: legend", () => {
394397
expect(wrapper.findLegend()!.findItemTooltip()).toBe(null);
395398
});
396399

397-
test("renders legend tooltip on focus in cartesian chart", () => {
400+
test("renders legend tooltip on focus in cartesian chart", async () => {
398401
const { wrapper } = renderChart({
399402
highcharts,
400403
options: {
@@ -412,11 +415,13 @@ describe("CoreChart: legend", () => {
412415
expect(wrapper.findLegend()!.findItemTooltip()).toBe(null);
413416

414417
act(() => getItem(0).focus());
418+
await tooltipShowPause();
415419

416420
expect(wrapper.findLegend()!.findItemTooltip()).not.toBe(null);
417421
expect(wrapper.findLegend()!.findItemTooltip()!.findHeader()!.getElement().textContent).toBe("L1");
418422

419423
getItem(0).keydown({ keyCode: KeyCode.right });
424+
await tooltipShowPause();
420425

421426
expect(wrapper.findLegend()!.findItemTooltip()).not.toBe(null);
422427
expect(wrapper.findLegend()!.findItemTooltip()!.findHeader()!.getElement().textContent).toBe("L2");
@@ -436,13 +441,15 @@ describe("CoreChart: legend", () => {
436441
expect(wrapper.findLegend()!.findItemTooltip()).toBe(null);
437442

438443
act(() => mouseOver(getItem(0).getElement()));
444+
await tooltipShowPause();
439445

440446
expect(wrapper.findLegend()!.findItemTooltip()).not.toBe(null);
441447
expect(wrapper.findLegend()!.findItemTooltip()).not.toBe(null);
442448
expect(wrapper.findLegend()!.findItemTooltip()!.findHeader()!.getElement().textContent).toBe("P1");
443449

444450
act(() => mouseOut(getItem(0).getElement()));
445451
act(() => mouseOver(getItem(2).getElement()));
452+
await tooltipShowPause();
446453

447454
expect(wrapper.findLegend()!.findItemTooltip()).not.toBe(null);
448455
expect(wrapper.findLegend()!.findItemTooltip()!.findHeader()!.getElement().textContent).toBe("Pie 3");
@@ -453,7 +460,7 @@ describe("CoreChart: legend", () => {
453460
expect(wrapper.findLegend()!.findItemTooltip()).toBe(null);
454461
});
455462

456-
test("renders legend tooltip on focus in pie chart", () => {
463+
test("renders legend tooltip on focus in pie chart", async () => {
457464
const { wrapper } = renderChart({
458465
highcharts,
459466
options: { series: series.filter((s) => s.type === "pie") },
@@ -467,11 +474,13 @@ describe("CoreChart: legend", () => {
467474
expect(wrapper.findLegend()!.findItemTooltip()).toBe(null);
468475

469476
act(() => getItem(0).focus());
477+
await tooltipShowPause();
470478

471479
expect(wrapper.findLegend()!.findItemTooltip()).not.toBe(null);
472480
expect(wrapper.findLegend()!.findItemTooltip()!.findHeader()!.getElement().textContent).toBe("P1");
473481

474482
getItem(0).keydown({ keyCode: KeyCode.right });
483+
await tooltipShowPause();
475484

476485
expect(wrapper.findLegend()!.findItemTooltip()).not.toBe(null);
477486
expect(wrapper.findLegend()!.findItemTooltip()!.findHeader()!.getElement().textContent).toBe("P2");

src/internal/components/chart-legend/index.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { GetLegendTooltipContentProps, LegendItem, LegendTooltipContent } from "
2323
import styles from "./styles.css.js";
2424
import testClasses from "./test-classes/styles.css.js";
2525

26+
const TOOLTIP_SHOW_DELAY = 300;
2627
const TOOLTIP_BLUR_DELAY = 50;
2728
const HIGHLIGHT_LOST_DELAY = 50;
2829
const SCROLL_DELAY = 100;
@@ -73,7 +74,7 @@ export const ChartLegend = ({
7374
const control = new DebouncedCall();
7475
return {
7576
showTooltip(itemId: string) {
76-
control.call(() => setTooltipItemId(itemId));
77+
control.call(() => setTooltipItemId(itemId), TOOLTIP_SHOW_DELAY);
7778
},
7879
hideTooltip(lock = false) {
7980
control.call(() => setTooltipItemId(null), TOOLTIP_BLUR_DELAY);

0 commit comments

Comments
 (0)