diff --git a/packages/x-charts-pro/src/Heatmap/HeatmapContainer.tsx b/packages/x-charts-pro/src/Heatmap/HeatmapContainer.tsx index d29edbfed6614..72dd502e6b386 100644 --- a/packages/x-charts-pro/src/Heatmap/HeatmapContainer.tsx +++ b/packages/x-charts-pro/src/Heatmap/HeatmapContainer.tsx @@ -12,9 +12,10 @@ import { CartesianContextProvider, CartesianContextProviderProps, HighlightProvider, + ExtremumGetter, } from '@mui/x-charts/internals'; -export type ChartContainerProps = Omit< +export type HeatmapContainerProps = Omit< ChartsSurfaceProps & SeriesContextProviderProps & Omit & @@ -24,7 +25,25 @@ export type ChartContainerProps = Omit< children?: React.ReactNode; }; -const HeatmapContainer = React.forwardRef(function ChartContainer(props: ChartContainerProps, ref) { +const getBaseExtremum: ExtremumGetter<'heatmap'> = (params) => { + const { axis } = params; + + const minX = Math.min(...(axis.data ?? [])); + const maxX = Math.max(...(axis.data ?? [])); + return [minX, maxX]; +}; + +const xExtremumGetters = { + heatmap: getBaseExtremum, +}; +const yExtremumGetters = { + heatmap: getBaseExtremum, +}; + +export const HeatmapContainer = React.forwardRef(function HeatmapContainer( + props: HeatmapContainerProps, + ref, +) { const { width, height, diff --git a/packages/x-charts-pro/src/typeOverloads/index.ts b/packages/x-charts-pro/src/typeOverloads/index.ts new file mode 100644 index 0000000000000..01628104738a4 --- /dev/null +++ b/packages/x-charts-pro/src/typeOverloads/index.ts @@ -0,0 +1 @@ +export * from './modules'; diff --git a/packages/x-charts-pro/src/typeOverloads/modules.ts b/packages/x-charts-pro/src/typeOverloads/modules.ts new file mode 100644 index 0000000000000..64622dc35dabf --- /dev/null +++ b/packages/x-charts-pro/src/typeOverloads/modules.ts @@ -0,0 +1,14 @@ +import { DefaultizedProps } from '@mui/x-charts/internals'; +import { BarItemIdentifier, BarSeriesType, DefaultizedBarSeriesType } from '@mui/x-charts/models'; + +declare module '@mui/x-charts/internals' { + interface ChartsSeriesConfig { + heatmap: { + seriesInput: DefaultizedProps & { color: string }; + series: DefaultizedBarSeriesType; + itemIdentifier: BarItemIdentifier; + canBeStacked: true; + cartesian: true; + }; + } +} diff --git a/packages/x-charts/src/context/CartesianContextProvider.tsx b/packages/x-charts/src/context/CartesianContextProvider.tsx index e737a71ea5a01..74275cb5e5053 100644 --- a/packages/x-charts/src/context/CartesianContextProvider.tsx +++ b/packages/x-charts/src/context/CartesianContextProvider.tsx @@ -37,11 +37,11 @@ export type CartesianContextProviderProps = { /** * An object with x-axis extremum getters per series type. */ - xExtremumGetters: { [T in CartesianChartSeriesType]: ExtremumGetter }; + xExtremumGetters: { [T in CartesianChartSeriesType]?: ExtremumGetter }; /** * An object with y-axis extremum getters per series type. */ - yExtremumGetters: { [T in CartesianChartSeriesType]: ExtremumGetter }; + yExtremumGetters: { [T in CartesianChartSeriesType]?: ExtremumGetter }; children: React.ReactNode; }; @@ -133,17 +133,17 @@ function CartesianContextProvider(props: CartesianContextProviderProps) { acc: ExtremumGetterResult, chartType: T, axis: AxisConfig, - getters: { [T2 in CartesianChartSeriesType]: ExtremumGetter }, + getters: { [T2 in CartesianChartSeriesType]?: ExtremumGetter }, isDefaultAxis: boolean, ): ExtremumGetterResult => { const getter = getters[chartType]; const series = (formattedSeries[chartType]?.series as Record>) ?? {}; - const [minChartTypeData, maxChartTypeData] = getter({ + const [minChartTypeData, maxChartTypeData] = getter?.({ series, axis, isDefaultAxis, - }); + }) ?? [null, null]; const [minData, maxData] = acc; @@ -160,7 +160,7 @@ function CartesianContextProvider(props: CartesianContextProviderProps) { const getAxisExtremum = ( axis: AxisConfig, - getters: { [T in CartesianChartSeriesType]: ExtremumGetter }, + getters: { [T in CartesianChartSeriesType]?: ExtremumGetter }, isDefaultAxis: boolean, ) => { const charTypes = Object.keys(getters) as CartesianChartSeriesType[]; diff --git a/packages/x-charts/src/internals/index.ts b/packages/x-charts/src/internals/index.ts index a912da1cea001..19518a1f8a55e 100644 --- a/packages/x-charts/src/internals/index.ts +++ b/packages/x-charts/src/internals/index.ts @@ -12,3 +12,8 @@ export * from '../context/HighlightProvider'; export * from '../context/InteractionProvider'; export * from '../context/SeriesContextProvider'; export * from '../context/ZAxisContextProvider'; + +// series configuration +export * from '../models/seriesType/config'; + +export * from '../models/helpers'; diff --git a/packages/x-charts/src/models/seriesType/config.ts b/packages/x-charts/src/models/seriesType/config.ts index 608962f6af702..7ccc1b1f480ff 100644 --- a/packages/x-charts/src/models/seriesType/config.ts +++ b/packages/x-charts/src/models/seriesType/config.ts @@ -7,23 +7,26 @@ import { DefaultizedProps, MakeOptional } from '../helpers'; import { StackingGroupsType } from '../../internals/stackSeries'; import { SeriesId } from './common'; -interface ChartsSeriesConfig { +export interface ChartsSeriesConfig { bar: { seriesInput: DefaultizedProps & { color: string }; series: DefaultizedBarSeriesType; - canBeStacked: true; itemIdentifier: BarItemIdentifier; + canBeStacked: true; + cartesian: true; }; line: { seriesInput: DefaultizedProps & { color: string }; series: DefaultizedLineSeriesType; - canBeStacked: true; itemIdentifier: LineItemIdentifier; + canBeStacked: true; + cartesian: true; }; scatter: { seriesInput: DefaultizedProps & { color: string }; series: DefaultizedScatterSeriesType; itemIdentifier: ScatterItemIdentifier; + cartesian: true; }; pie: { seriesInput: Omit, 'data'> & { @@ -34,8 +37,14 @@ interface ChartsSeriesConfig { }; } -export type CartesianChartSeriesType = 'bar' | 'line' | 'scatter'; -export type ChartSeriesType = 'bar' | 'line' | 'scatter' | 'pie'; +export type ChartSeriesType = keyof ChartsSeriesConfig; + +export type CartesianChartSeriesType = keyof Pick< + ChartsSeriesConfig, + { + [Key in ChartSeriesType]: ChartsSeriesConfig[Key] extends { cartesian: true } ? Key : never; + }[ChartSeriesType] +>; export type ChartSeries = ChartsSeriesConfig[T] extends { canBeStacked: true;