diff --git a/packages/charts/src/components/BarChart/__snapshots__/BarChart.test.tsx.snap b/packages/charts/src/components/BarChart/__snapshots__/BarChart.test.tsx.snap index b3496028acc..9f6620cb655 100644 --- a/packages/charts/src/components/BarChart/__snapshots__/BarChart.test.tsx.snap +++ b/packages/charts/src/components/BarChart/__snapshots__/BarChart.test.tsx.snap @@ -2,7 +2,7 @@ exports[`BarChart loading placeholder 1`] = `
; height?: number | string; width?: number | string; + minHeight?: number; + minWidth?: number; options?: ChartOptions; categoryAxisFormatter?: (value: any, currentDataset?: object, currentContext?: object) => string | number; valueAxisFormatter?: (value: any, currentDataset?: object, currentContext?: object) => string | number; diff --git a/packages/charts/src/internal/useSizeMonitor.ts b/packages/charts/src/internal/useSizeMonitor.ts index 1beea5686aa..131e7f1537e 100644 --- a/packages/charts/src/internal/useSizeMonitor.ts +++ b/packages/charts/src/internal/useSizeMonitor.ts @@ -1,18 +1,33 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import ResizeObserver from 'resize-observer-polyfill'; -export const useSizeMonitor = (heightProp, widthProp, container) => { +export const useSizeMonitor = (props, container) => { + const { height: heightProp, width: widthProp, minHeight, minWidth } = props; const [height, setHeight] = useState(null); const [width, setWidth] = useState(null); const enableSizeMonitor = typeof heightProp === 'string' || typeof widthProp === 'string'; - const recalculateSize = useCallback(() => { - const { height: clientRectHeight, width: clientRectWidth } = container.current.getBoundingClientRect(); - - setHeight(clientRectHeight); - setWidth(clientRectWidth); - }, [container.current, setHeight, setWidth]); + const recalculateSize = useCallback( + (e?) => { + let clientRectHeight; + let clientRectWidth; + + if (!e || !e[0] || !e[0].contentRect) { + clientRectHeight = container.current.getBoundingClientRect().height; + clientRectWidth = container.current.getBoundingClientRect().width; + } else { + clientRectHeight = e[0].contentRect.height; + clientRectWidth = e[0].contentRect.width; + } + + // console.log(props); + + setHeight(Math.max(minHeight, clientRectHeight)); + setWidth(Math.max(minWidth, clientRectWidth)); + }, + [container.current, setHeight, setWidth] + ); const observer = useRef(new ResizeObserver(recalculateSize)); diff --git a/packages/charts/src/internal/withChartContainer.tsx b/packages/charts/src/internal/withChartContainer.tsx index 537cad05822..7774d6fc277 100644 --- a/packages/charts/src/internal/withChartContainer.tsx +++ b/packages/charts/src/internal/withChartContainer.tsx @@ -4,19 +4,15 @@ import { ChartBaseProps } from '../interfaces/ChartBaseProps'; import { getLoadingState } from './Placeholder'; import { useSizeMonitor } from './useSizeMonitor'; -// const calculateChartHeight = (props) => { -// if (props.noLegend) { -// return `${props.height}px`; -// } -// return `${props.height - 60}px`; -// }; +const calculateChartHeight = (props) => { + if (props.noLegend) { + return typeof props.height === 'string' ? props.height : `${props.height}px`; + } + return typeof props.height === 'string' ? `calc(${props.height} - 60px)` : `${props.height - 60}px`; +}; const styles = { chart: { - // '& svg': { - // width: (props) => `${props.width}px`, - // height: calculateChartHeight - // }, '& .legend': { height: '55px', maxHeight: '55px', @@ -26,6 +22,10 @@ const styles = { flexWrap: 'wrap', padding: '0 1rem', boxSizing: 'border-box' + }, + '& svg': { + width: (props) => `${props.width}px`, + height: calculateChartHeight } } }; @@ -49,7 +49,7 @@ export const withChartContainer = (Component: ComponentType) => { return getLoadingState(loading, datasets, (Component as any).LoadingPlaceholder); }, [loading, datasets, Component]); - const { height, width } = useSizeMonitor(props.height, props.width, outerContainer); + const { height, width } = useSizeMonitor(props, outerContainer); const inlineStyle: CSSProperties = useMemo(() => { return { @@ -90,11 +90,7 @@ export const withChartContainer = (Component: ComponentType) => { ); }); - ChartContainer.defaultProps = { - width: 350, - height: 350, - ...(Component.defaultProps || {}) - }; + ChartContainer.defaultProps = Component.defaultProps; ChartContainer.displayName = Component.displayName; return ChartContainer; diff --git a/packages/charts/src/util/ChartBaseDefaultProps.ts b/packages/charts/src/util/ChartBaseDefaultProps.ts index d0b6ca06782..16f33bfd0de 100644 --- a/packages/charts/src/util/ChartBaseDefaultProps.ts +++ b/packages/charts/src/util/ChartBaseDefaultProps.ts @@ -5,6 +5,8 @@ export const ChartBaseDefaultProps: ChartBaseProps = { datasets: [], colors: [], height: 300, + minHeight: 300, + minWidth: 300, width: 300, options: {}, categoryAxisFormatter: (d) => d,