From be30c1bd48ce3e50b8e9fa28c0d8999b6366b305 Mon Sep 17 00:00:00 2001 From: Nick Partridge Date: Tue, 7 Nov 2023 08:29:05 -0700 Subject: [PATCH] fix: `onRenderChange` callback trigger on resize (#2228) --- .../resize-debounce-chrome-linux.png | Bin 0 -> 67102 bytes packages/charts/api/charts.api.md | 12 ++- .../__snapshots__/chart.test.tsx.snap | 4 +- .../charts/src/components/chart_resizer.tsx | 31 +++--- .../charts/src/components/chart_status.tsx | 10 +- packages/charts/src/specs/constants.ts | 5 +- packages/charts/src/specs/settings.tsx | 15 +++ packages/charts/src/state/chart_state.ts | 5 +- ...y.tsx => 10_highlighter_z_index.story.tsx} | 0 .../test_cases/11_resize_debounce.story.tsx | 93 ++++++++++++++++++ .../stories/test_cases/test_cases.stories.tsx | 3 +- 11 files changed, 157 insertions(+), 21 deletions(-) create mode 100644 e2e/screenshots/all.test.ts-snapshots/baselines/test-cases/resize-debounce-chrome-linux.png rename storybook/stories/test_cases/{20_highlighter_z_index.story.tsx => 10_highlighter_z_index.story.tsx} (100%) create mode 100644 storybook/stories/test_cases/11_resize_debounce.story.tsx diff --git a/e2e/screenshots/all.test.ts-snapshots/baselines/test-cases/resize-debounce-chrome-linux.png b/e2e/screenshots/all.test.ts-snapshots/baselines/test-cases/resize-debounce-chrome-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..91fff008e717561f985b4ff8c6b6296e96bccf5b GIT binary patch literal 67102 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

ldm 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±y~6jH=q>L!rB|jy5--k5r%ttqz=_} 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 tk`gXH2Pl21PGh@rW? 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 z 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 literal 0 HcmV?d00001 diff --git a/packages/charts/api/charts.api.md b/packages/charts/api/charts.api.md index 58d76123d0..c1f4855648 100644 --- a/packages/charts/api/charts.api.md +++ b/packages/charts/api/charts.api.md @@ -2353,6 +2353,9 @@ export type RenderChangeListener = (isRendered: boolean) => void; // @public (undocumented) export type Rendering = 'canvas' | 'svg'; +// @alpha +export type ResizeListener = () => void; + // @public (undocumented) export type RGB = number; @@ -2512,7 +2515,7 @@ export const Settings: (props: SFProps; +export const settingsBuildProps: BuildProps; // @public (undocumented) export type SettingsProps = ComponentProps; @@ -2555,6 +2558,10 @@ export interface SettingsSpec extends Spec, LegendSpec { onProjectionClick?: ProjectionClickListener; // (undocumented) onRenderChange?: RenderChangeListener; + // @alpha + onResize?: ResizeListener; + // (undocumented) + onWillRender?: WillRenderListener; orderOrdinalBinsBy?: OrderBy; pointBuffer: MarkBuffer; pointerUpdateDebounce?: number; @@ -3209,6 +3216,9 @@ export const WeightFn: Readonly<{ // @public (undocumented) export type WeightFn = $Values; +// @public +export type WillRenderListener = () => void; + // @alpha export const Wordcloud: FC>; diff --git a/packages/charts/src/components/__snapshots__/chart.test.tsx.snap b/packages/charts/src/components/__snapshots__/chart.test.tsx.snap index fa47f466e3..3084b3130b 100644 --- a/packages/charts/src/components/__snapshots__/chart.test.tsx.snap +++ b/packages/charts/src/components/__snapshots__/chart.test.tsx.snap @@ -12,12 +12,12 @@ exports[`Chart should render the legend name test 1`] = ` - +

- +
diff --git a/packages/charts/src/components/chart_resizer.tsx b/packages/charts/src/components/chart_resizer.tsx index b3c4ac8f0a..57b7a2fe4a 100644 --- a/packages/charts/src/components/chart_resizer.tsx +++ b/packages/charts/src/components/chart_resizer.tsx @@ -11,24 +11,25 @@ import { connect } from 'react-redux'; import { Dispatch, bindActionCreators } from 'redux'; import ResizeObserver from 'resize-observer-polyfill'; +import { DEFAULT_RESIZE_DEBOUNCE } from '../specs/constants'; +import { ResizeListener } from '../specs/settings'; import { updateParentDimensions } from '../state/actions/chart_settings'; import { GlobalChartState } from '../state/chart_state'; import { getSettingsSpecSelector } from '../state/selectors/get_settings_spec'; import { isFiniteNumber } from '../utils/common'; import { debounce, DebouncedFunction } from '../utils/debounce'; -import { Dimensions } from '../utils/dimensions'; interface ResizerStateProps { resizeDebounce: number; + onResize?: ResizeListener; } interface ResizerDispatchProps { - updateParentDimensions(dimension: Dimensions): void; + updateParentDimensions: typeof updateParentDimensions; } type ResizerProps = ResizerStateProps & ResizerDispatchProps; - -const DEFAULT_RESIZE_DEBOUNCE = 200; +type ResizeFn = (entries: ResizeObserverEntry[]) => void; class Resizer extends React.Component { private initialResizeComplete = false; @@ -39,10 +40,7 @@ class Resizer extends React.Component { private animationFrameID: number; - private onResizeDebounced?: DebouncedFunction< - [entries: ResizeObserverEntry[]], - (entries: ResizeObserverEntry[]) => void - >; + private onResizeDebounced?: ResizeFn | DebouncedFunction, ResizeFn>; constructor(props: ResizerProps) { super(props); @@ -52,18 +50,27 @@ class Resizer extends React.Component { } componentDidMount() { - this.onResizeDebounced = debounce(this.onResize, this.props.resizeDebounce); + this.setupResizeDebounce(); if (this.containerRef.current) { this.ro.observe(this.containerRef.current as Element); } } + componentDidUpdate({ resizeDebounce }: Readonly): void { + if (resizeDebounce !== this.props.resizeDebounce) this.setupResizeDebounce(); + } + componentWillUnmount() { window.cancelAnimationFrame(this.animationFrameID); this.ro.disconnect(); } - onResize = (entries: ResizeObserverEntry[]) => { + setupResizeDebounce() { + this.onResizeDebounced = + this.props.resizeDebounce > 0 ? debounce(this.onResize, this.props.resizeDebounce) : this.onResize; + } + + onResize: ResizeFn = (entries) => { if (!Array.isArray(entries)) { return; } @@ -73,6 +80,7 @@ class Resizer extends React.Component { const { width, height } = entries[0].contentRect; this.animationFrameID = window.requestAnimationFrame(() => { this.props.updateParentDimensions({ width, height, top: 0, left: 0 }); + this.props.onResize?.(); }); }; @@ -99,9 +107,10 @@ const mapDispatchToProps = (dispatch: Dispatch): ResizerDispatchProps => ); const mapStateToProps = (state: GlobalChartState): ResizerStateProps => { - const { resizeDebounce } = getSettingsSpecSelector(state); + const { resizeDebounce, onResize } = getSettingsSpecSelector(state); return { resizeDebounce: isFiniteNumber(resizeDebounce) ? resizeDebounce : DEFAULT_RESIZE_DEBOUNCE, + onResize, }; }; diff --git a/packages/charts/src/components/chart_status.tsx b/packages/charts/src/components/chart_status.tsx index efac78d2a7..04dc1ec177 100644 --- a/packages/charts/src/components/chart_status.tsx +++ b/packages/charts/src/components/chart_status.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { connect } from 'react-redux'; -import { RenderChangeListener } from '../specs'; +import { RenderChangeListener, WillRenderListener } from '../specs'; import { GlobalChartState } from '../state/chart_state'; import { globalSelectorCache } from '../state/create_selector'; import { getDebugStateSelector } from '../state/selectors/get_debug_state'; @@ -21,6 +21,7 @@ interface ChartStatusStateProps { rendered: boolean; renderedCount: number; onRenderChange?: RenderChangeListener; + onWillRender?: WillRenderListener; debugState: DebugState | null; } @@ -38,7 +39,9 @@ class ChartStatusComponent extends React.Component { } dispatchRenderChange = () => { - const { onRenderChange, rendered } = this.props; + const { onWillRender, onRenderChange, rendered } = this.props; + onWillRender?.(); + if (onRenderChange) { window.requestAnimationFrame(() => { onRenderChange(rendered); @@ -61,12 +64,13 @@ class ChartStatusComponent extends React.Component { } const mapStateToProps = (state: GlobalChartState): ChartStatusStateProps => { - const { onRenderChange, debugState } = getSettingsSpecSelector(state); + const { onWillRender, onRenderChange, debugState } = getSettingsSpecSelector(state); return { chartId: state.chartId, rendered: state.chartRendered, renderedCount: state.chartRenderedCount, + onWillRender, onRenderChange, debugState: debugState ? getDebugStateSelector(state) : null, }; diff --git a/packages/charts/src/specs/constants.ts b/packages/charts/src/specs/constants.ts index 2215c5cb6e..72608e35d0 100644 --- a/packages/charts/src/specs/constants.ts +++ b/packages/charts/src/specs/constants.ts @@ -127,6 +127,9 @@ export const TooltipStickTo = Object.freeze({ /** @public */ export type TooltipStickTo = $Values; +/** @internal */ +export const DEFAULT_RESIZE_DEBOUNCE = 10; + /** * Default legend config * @internal @@ -151,7 +154,7 @@ export const settingsBuildProps = buildSFProps()( rendering: 'canvas' as const, rotation: 0 as const, animateData: true, - resizeDebounce: 10, + resizeDebounce: DEFAULT_RESIZE_DEBOUNCE, debug: false, pointerUpdateTrigger: PointerUpdateTrigger.X, externalPointerEvents: { diff --git a/packages/charts/src/specs/settings.tsx b/packages/charts/src/specs/settings.tsx index ca7f173af7..ca1dc797eb 100644 --- a/packages/charts/src/specs/settings.tsx +++ b/packages/charts/src/specs/settings.tsx @@ -205,6 +205,11 @@ export type LegendItemListener = (series: SeriesIdentifier[]) => void; * @public */ export type PointerUpdateListener = (event: PointerEvent) => void; +/** + * Listener to be called when chart resizes + * @alpha + */ +export type ResizeListener = () => void; /** * Listener to be called when chart render state changes * @@ -212,6 +217,11 @@ export type PointerUpdateListener = (event: PointerEvent) => void; * @public */ export type RenderChangeListener = (isRendered: boolean) => void; +/** + * Listener to be called *before* chart renders + * @public + */ +export type WillRenderListener = () => void; /** @public */ export type BasicListener = () => undefined | void; /** @public */ @@ -510,7 +520,12 @@ export interface SettingsSpec extends Spec, LegendSpec { onElementOut?: BasicListener; onBrushEnd?: BrushEndListener; onPointerUpdate?: PointerUpdateListener; + /** + * @alpha subject to be removed in the future + */ + onResize?: ResizeListener; onRenderChange?: RenderChangeListener; + onWillRender?: WillRenderListener; onProjectionAreaChange?: ProjectionAreaChangeListener; /** diff --git a/packages/charts/src/state/chart_state.ts b/packages/charts/src/state/chart_state.ts index b45bf7c06c..e6c3e8536b 100644 --- a/packages/charts/src/state/chart_state.ts +++ b/packages/charts/src/state/chart_state.ts @@ -380,11 +380,11 @@ export const chartStoreReducer = (chartId: string, title?: string, description?: }, }; case CHART_RENDERED: - const count = state.chartRendered ? state.chartRenderedCount : state.chartRenderedCount + 1; + const chartRenderedCount = state.chartRendered ? state.chartRenderedCount : state.chartRenderedCount + 1; return { ...state, chartRendered: true, - chartRenderedCount: count, + chartRenderedCount, }; case UPDATE_PARENT_DIMENSION: return { @@ -401,6 +401,7 @@ export const chartStoreReducer = (chartId: string, title?: string, description?: parentDimensions: { ...action.dimensions, }, + chartRendered: false, }; case UPDATE_CHART_TITLES: return { diff --git a/storybook/stories/test_cases/20_highlighter_z_index.story.tsx b/storybook/stories/test_cases/10_highlighter_z_index.story.tsx similarity index 100% rename from storybook/stories/test_cases/20_highlighter_z_index.story.tsx rename to storybook/stories/test_cases/10_highlighter_z_index.story.tsx diff --git a/storybook/stories/test_cases/11_resize_debounce.story.tsx b/storybook/stories/test_cases/11_resize_debounce.story.tsx new file mode 100644 index 0000000000..12e9dcbee0 --- /dev/null +++ b/storybook/stories/test_cases/11_resize_debounce.story.tsx @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { action } from '@storybook/addon-actions'; +import { number } from '@storybook/addon-knobs'; +import moment from 'moment'; +import React from 'react'; + +import { Axis, Chart, BarSeries, Position, ScaleType, Settings } from '@elastic/charts'; +import { getRandomNumberGenerator } from '@elastic/charts/src/mocks/utils'; + +import { ChartsStory } from '../../types'; +import { useBaseTheme } from '../../use_base_theme'; + +const rng = getRandomNumberGenerator(); + +const data: { t: number; values: { v: number; cat: string }[] }[] = []; +const end = moment(1699037055867); +const days = 3; +const maxCardinality = 100; +const start = end.clone().subtract(days, 'days'); +const hours = 6; +while (start.isBefore(end)) { + const values = Array.from({ length: maxCardinality }, (_, i) => ({ + v: rng(0, 100), + cat: `Category ${i + 1}`, + })); + data.push({ t: start.add(hours, 'hours').valueOf(), values }); +} + +export const Example: ChartsStory = (_, { title, description }) => { + const resizeDebounce = number('resizeDebounce (ms)', 10, { min: 0, step: 20 }); + const cardinality = number('cardinality', 100, { min: 1, max: maxCardinality }); + return ( +
+ + + + + + values.slice(0, cardinality).map(({ v, cat }) => ({ t, v, cat })))} + /> + +
+ ); +}; + +Example.parameters = { + markdown: `The \`resizeDebounce\` option on the \`Settings\` spec provides control over the eagerness of the chart to re-render upon resize. A value of \`0\` will remove the debounce altogether. +You can play with the cardinality and debounce time to see how the debouncing affects the chart render timing`, +}; diff --git a/storybook/stories/test_cases/test_cases.stories.tsx b/storybook/stories/test_cases/test_cases.stories.tsx index ab48aba620..0dff7160e5 100644 --- a/storybook/stories/test_cases/test_cases.stories.tsx +++ b/storybook/stories/test_cases/test_cases.stories.tsx @@ -19,4 +19,5 @@ export { Example as accessibilityCustomizations } from './6_a11y_custom_descript export { Example as rtlText } from './7_rtl_text.story'; export { Example as testPointsOutsideOfDomain } from './8_test_points_outside_of_domain.story'; export { Example as duplicateLabelsInPartitionLegend } from './9_duplicate_labels_in_partition_legend.story'; -export { Example as highlighterZIndex } from './20_highlighter_z_index.story'; +export { Example as highlighterZIndex } from './10_highlighter_z_index.story'; +export { Example as resizeDebounce } from './11_resize_debounce.story';