diff --git a/packages/x-charts-pro/src/FunnelChart/seriesConfig/index.ts b/packages/x-charts-pro/src/FunnelChart/seriesConfig/index.ts index 531b7ba288f6b..d512c1a83915e 100644 --- a/packages/x-charts-pro/src/FunnelChart/seriesConfig/index.ts +++ b/packages/x-charts-pro/src/FunnelChart/seriesConfig/index.ts @@ -1,6 +1,6 @@ import type { ChartSeriesTypeConfig } from '@mui/x-charts/internals'; import { getExtremumX, getExtremumY } from './extremums'; -import seriesProcessor from './seriesProcessor'; +import seriesProcessorWithoutDimensions from './seriesProcessor'; import getColor from './getColor'; import legendGetter from './legend'; import tooltipGetter from './tooltip'; @@ -8,7 +8,7 @@ import getSeriesWithDefaultValues from './getSeriesWithDefaultValues'; import tooltipItemPositionGetter from './tooltipPosition'; export const funnelSeriesConfig: ChartSeriesTypeConfig<'funnel'> = { - seriesProcessor, + seriesProcessorWithoutDimensions, colorProcessor: getColor, legendGetter, tooltipGetter, diff --git a/packages/x-charts-pro/src/FunnelChart/seriesConfig/seriesProcessor.ts b/packages/x-charts-pro/src/FunnelChart/seriesConfig/seriesProcessor.ts index 19d85d42690a4..2f4f4cc8cff0a 100644 --- a/packages/x-charts-pro/src/FunnelChart/seriesConfig/seriesProcessor.ts +++ b/packages/x-charts-pro/src/FunnelChart/seriesConfig/seriesProcessor.ts @@ -1,4 +1,4 @@ -import { SeriesProcessor, ChartSeriesDefaultized } from '@mui/x-charts/internals'; +import { SeriesProcessorWithoutDimensions, ChartSeriesDefaultized } from '@mui/x-charts/internals'; import type { FunnelCurveType } from '../curves'; const createPoint = ({ @@ -38,7 +38,7 @@ const getFunnelDirection = ( : 'decreasing'; }; -const seriesProcessor: SeriesProcessor<'funnel'> = (params) => { +const seriesProcessorWithoutDimensions: SeriesProcessorWithoutDimensions<'funnel'> = (params) => { const { seriesOrder, series } = params; const completedSeries: Record> = {}; @@ -143,4 +143,4 @@ const seriesProcessor: SeriesProcessor<'funnel'> = (params) => { }; }; -export default seriesProcessor; +export default seriesProcessorWithoutDimensions; diff --git a/packages/x-charts-pro/src/Heatmap/seriesConfig/index.ts b/packages/x-charts-pro/src/Heatmap/seriesConfig/index.ts index 4e4fb8ca32c0e..a42fae839ce24 100644 --- a/packages/x-charts-pro/src/Heatmap/seriesConfig/index.ts +++ b/packages/x-charts-pro/src/Heatmap/seriesConfig/index.ts @@ -1,13 +1,13 @@ import { ChartSeriesTypeConfig } from '@mui/x-charts/internals'; import { getBaseExtremum } from './extremums'; -import seriesProcessor from './seriesProcessor'; +import seriesProcessorWithoutDimensions from './seriesProcessor'; import getColor from './getColor'; import tooltipGetter from './tooltip'; import getSeriesWithDefaultValues from './getSeriesWithDefaultValues'; import tooltipItemPositionGetter from './tooltipPosition'; export const heatmapSeriesConfig: ChartSeriesTypeConfig<'heatmap'> = { - seriesProcessor, + seriesProcessorWithoutDimensions, colorProcessor: getColor, legendGetter: () => [], tooltipGetter, diff --git a/packages/x-charts-pro/src/Heatmap/seriesConfig/seriesProcessor.ts b/packages/x-charts-pro/src/Heatmap/seriesConfig/seriesProcessor.ts index c1bb8fdcae8d8..7b63da5204093 100644 --- a/packages/x-charts-pro/src/Heatmap/seriesConfig/seriesProcessor.ts +++ b/packages/x-charts-pro/src/Heatmap/seriesConfig/seriesProcessor.ts @@ -1,7 +1,7 @@ -import { SeriesProcessor, SeriesId } from '@mui/x-charts/internals'; +import { SeriesProcessorWithoutDimensions, SeriesId } from '@mui/x-charts/internals'; import { DefaultizedHeatmapSeriesType } from '../../models/seriesType/heatmap'; -const seriesProcessor: SeriesProcessor<'heatmap'> = (params) => { +const seriesProcessorWithoutDimensions: SeriesProcessorWithoutDimensions<'heatmap'> = (params) => { const { series, seriesOrder } = params; const defaultizedSeries: Record = {}; @@ -21,4 +21,4 @@ const seriesProcessor: SeriesProcessor<'heatmap'> = (params) => { }; }; -export default seriesProcessor; +export default seriesProcessorWithoutDimensions; diff --git a/packages/x-charts-pro/src/SankeyChart/SankeyPlot.tsx b/packages/x-charts-pro/src/SankeyChart/SankeyPlot.tsx index 99c64166f8507..7b57c3d828319 100644 --- a/packages/x-charts-pro/src/SankeyChart/SankeyPlot.tsx +++ b/packages/x-charts-pro/src/SankeyChart/SankeyPlot.tsx @@ -1,14 +1,11 @@ 'use client'; import * as React from 'react'; import PropTypes from 'prop-types'; -import { styled, useTheme } from '@mui/material/styles'; -import { useDrawingArea } from '@mui/x-charts/hooks'; +import { styled } from '@mui/material/styles'; import { - SankeyLayout, type SankeyLinkIdentifierWithData, type SankeyNodeIdentifierWithData, } from './sankey.types'; -import { calculateSankeyLayout } from './calculateSankeyLayout'; import { SankeyNodeElement } from './SankeyNodeElement'; import { SankeyLinkElement } from './SankeyLinkElement'; import { SankeyLinkLabel } from './SankeyLinkLabel'; @@ -66,15 +63,7 @@ function SankeyPlot(props: SankeyPlotProps) { const series = seriesContext.series[seriesContext.seriesOrder?.[0]]; const classes = useUtilityClasses({ classes: inputClasses }); - const drawingArea = useDrawingArea(); - const { data, linkOptions, nodeOptions } = series; - const theme = useTheme(); - - // Calculate layout based on data and dimensions - const layout: SankeyLayout = React.useMemo( - () => calculateSankeyLayout(data, drawingArea, theme, series), - [drawingArea, data, series, theme], - ); + const { data, linkOptions, nodeOptions, sankeyLayout } = series; // Early return if no data or dimensions if (!data || !data.links) { @@ -84,7 +73,7 @@ function SankeyPlot(props: SankeyPlotProps) { return ( - {layout.links.map((link) => ( + {sankeyLayout.links.map((link) => ( - {layout.nodes.map((node) => ( + {sankeyLayout.nodes.map((node) => ( - {layout.links.map((link) => ( + {sankeyLayout.links.map((link) => ( ))} diff --git a/packages/x-charts-pro/src/SankeyChart/calculateSankeyLayout.ts b/packages/x-charts-pro/src/SankeyChart/calculateSankeyLayout.ts index befd3f8adb613..ab9a643397a68 100644 --- a/packages/x-charts-pro/src/SankeyChart/calculateSankeyLayout.ts +++ b/packages/x-charts-pro/src/SankeyChart/calculateSankeyLayout.ts @@ -1,10 +1,8 @@ 'use client'; import { sankey, type SankeyGraph } from '@mui/x-charts-vendor/d3-sankey'; import type { ChartDrawingArea } from '@mui/x-charts/hooks'; -import type { Theme } from '@mui/material/styles'; import { path } from '@mui/x-charts-vendor/d3-path'; import type { - SankeySeriesType, SankeyLayout, SankeyLayoutLink, SankeyLayoutNode, @@ -22,12 +20,10 @@ import { getNodeAlignFunction } from './utils'; */ export function calculateSankeyLayout( - data: DefaultizedSankeySeriesType['data'], + series: DefaultizedSankeySeriesType, drawingArea: ChartDrawingArea, - theme: Theme, - series: Pick = {}, ): SankeyLayout { - const { iterations = 6, nodeOptions, linkOptions } = series; + const { data, iterations = 6, nodeOptions, linkOptions } = series; const { width: nodeWidth = 15, padding: nodePadding = 10, diff --git a/packages/x-charts-pro/src/SankeyChart/seriesConfig/index.ts b/packages/x-charts-pro/src/SankeyChart/seriesConfig/index.ts index 3174217168509..c4c1ede75df52 100644 --- a/packages/x-charts-pro/src/SankeyChart/seriesConfig/index.ts +++ b/packages/x-charts-pro/src/SankeyChart/seriesConfig/index.ts @@ -1,16 +1,37 @@ -import type { ChartSeriesTypeConfig } from '@mui/x-charts/internals'; +import type { + ChartSeriesTypeConfig, + SeriesProcessor, + SeriesProcessorResult, +} from '@mui/x-charts/internals'; import { getSeriesWithDefaultValues } from './getSeriesWithDefaultValues'; import { tooltipGetter } from './tooltipGetter'; +import { calculateSankeyLayout } from '../calculateSankeyLayout'; // Simple passthrough functions for sankey chart -const seriesProcessor = (series: any) => series; +const seriesProcessorWithoutDimensions = (series: any) => series; const colorProcessor = (series: any) => series; const legendGetter = () => []; +const seriesProcessor: SeriesProcessor<'sankey'> = (series, drawingArea) => { + if (series.seriesOrder.length === 0) { + return series as SeriesProcessorResult<'sankey'>; + } + return { + series: { + [series.seriesOrder[0]]: { + ...series.series[series.seriesOrder[0]], + sankeyLayout: calculateSankeyLayout(series.series[series.seriesOrder[0]], drawingArea), + }, + }, + seriesOrder: series.seriesOrder, + } satisfies SeriesProcessorResult<'sankey'>; +}; + export const sankeySeriesConfig: ChartSeriesTypeConfig<'sankey'> = { - seriesProcessor, + seriesProcessorWithoutDimensions, colorProcessor, legendGetter, tooltipGetter, getSeriesWithDefaultValues, + seriesProcessor, }; diff --git a/packages/x-charts-pro/src/typeOverloads/modules.ts b/packages/x-charts-pro/src/typeOverloads/modules.ts index 2e80a60c1cb47..455a18d8c35ed 100644 --- a/packages/x-charts-pro/src/typeOverloads/modules.ts +++ b/packages/x-charts-pro/src/typeOverloads/modules.ts @@ -13,6 +13,7 @@ import { HeatmapValueType, } from '../models/seriesType/heatmap'; import { + SankeyLayout, SankeySeriesType, type DefaultizedSankeySeriesType, type SankeyItemIdentifier, @@ -24,6 +25,7 @@ declare module '@mui/x-charts/internals' { heatmap: { seriesInput: DefaultizedProps; series: DefaultizedHeatmapSeriesType; + seriesComputedPosition: {}; seriesProp: HeatmapSeriesType; itemIdentifier: HeatmapItemIdentifier; itemIdentifierWithData: HeatmapItemIdentifier; @@ -35,6 +37,7 @@ declare module '@mui/x-charts/internals' { data: MakeRequired[]; }; series: DefaultizedFunnelSeriesType; + seriesComputedPosition: {}; seriesProp: FunnelSeriesType; itemIdentifier: FunnelItemIdentifier; itemIdentifierWithData: FunnelItemIdentifier; @@ -44,6 +47,7 @@ declare module '@mui/x-charts/internals' { sankey: { seriesInput: DefaultizedSankeySeriesType; series: DefaultizedSankeySeriesType; + seriesComputedPosition: { sankeyLayout: SankeyLayout }; seriesProp: SankeySeriesType; itemIdentifier: SankeyItemIdentifier; itemIdentifierWithData: SankeyItemIdentifierWithData; diff --git a/packages/x-charts/src/BarChart/seriesConfig/bar/seriesProcessor.ts b/packages/x-charts/src/BarChart/seriesConfig/bar/seriesProcessor.ts index a68d10dfffb65..cec49dab89e93 100644 --- a/packages/x-charts/src/BarChart/seriesConfig/bar/seriesProcessor.ts +++ b/packages/x-charts/src/BarChart/seriesConfig/bar/seriesProcessor.ts @@ -4,14 +4,17 @@ import type { DefaultizedBarSeriesType } from '../../../models'; import { getStackingGroups } from '../../../internals/stackSeries'; import { DatasetElementType, DatasetType } from '../../../models/seriesType/config'; import { SeriesId } from '../../../models/seriesType/common'; -import { SeriesProcessor } from '../../../internals/plugins/models'; +import { SeriesProcessorWithoutDimensions } from '../../../internals/plugins/models'; type BarDataset = DatasetType; const barValueFormatter = ((v) => v == null ? '' : v.toLocaleString()) as DefaultizedBarSeriesType['valueFormatter']; -const seriesProcessor: SeriesProcessor<'bar'> = (params, dataset) => { +const seriesProcessorWithoutDimensions: SeriesProcessorWithoutDimensions<'bar'> = ( + params, + dataset, +) => { const { seriesOrder, series } = params; const stackingGroups = getStackingGroups(params); @@ -112,4 +115,4 @@ const seriesProcessor: SeriesProcessor<'bar'> = (params, dataset) => { }; }; -export default seriesProcessor; +export default seriesProcessorWithoutDimensions; diff --git a/packages/x-charts/src/BarChart/seriesConfig/index.ts b/packages/x-charts/src/BarChart/seriesConfig/index.ts index 4beab799fde41..2203a42ad6ea3 100644 --- a/packages/x-charts/src/BarChart/seriesConfig/index.ts +++ b/packages/x-charts/src/BarChart/seriesConfig/index.ts @@ -1,6 +1,6 @@ import { ChartSeriesTypeConfig } from '../../internals/plugins/models/seriesConfig'; import { getExtremumX, getExtremumY } from './bar/extremums'; -import seriesProcessor from './bar/seriesProcessor'; +import seriesProcessorWithoutDimensions from './bar/seriesProcessor'; import legendGetter from './bar/legend'; import getColor from './bar/getColor'; import tooltipGetter, { axisTooltipGetter } from './bar/tooltip'; @@ -8,7 +8,7 @@ import tooltipItemPositionGetter from './bar/tooltipPosition'; import getSeriesWithDefaultValues from './bar/getSeriesWithDefaultValues'; export const barSeriesConfig: ChartSeriesTypeConfig<'bar'> = { - seriesProcessor, + seriesProcessorWithoutDimensions, colorProcessor: getColor, legendGetter, tooltipGetter, diff --git a/packages/x-charts/src/LineChart/seriesConfig/index.ts b/packages/x-charts/src/LineChart/seriesConfig/index.ts index d25cb9cddf6f6..2b40967315f54 100644 --- a/packages/x-charts/src/LineChart/seriesConfig/index.ts +++ b/packages/x-charts/src/LineChart/seriesConfig/index.ts @@ -1,6 +1,6 @@ import { ChartSeriesTypeConfig } from '../../internals/plugins/models/seriesConfig'; import { getExtremumX, getExtremumY } from './extremums'; -import seriesProcessor from './seriesProcessor'; +import seriesProcessorWithoutDimensions from './seriesProcessor'; import getColor from './getColor'; import legendGetter from './legend'; import tooltipGetter, { axisTooltipGetter } from './tooltip'; @@ -9,7 +9,7 @@ import tooltipItemPositionGetter from './tooltipPosition'; export const lineSeriesConfig: ChartSeriesTypeConfig<'line'> = { colorProcessor: getColor, - seriesProcessor, + seriesProcessorWithoutDimensions, legendGetter, tooltipGetter, tooltipItemPositionGetter, diff --git a/packages/x-charts/src/LineChart/seriesConfig/seriesProcessor.ts b/packages/x-charts/src/LineChart/seriesConfig/seriesProcessor.ts index 9256ef77bf2f3..23611647aacc9 100644 --- a/packages/x-charts/src/LineChart/seriesConfig/seriesProcessor.ts +++ b/packages/x-charts/src/LineChart/seriesConfig/seriesProcessor.ts @@ -5,9 +5,12 @@ import { getStackingGroups } from '../../internals/stackSeries'; import { ChartSeries, DatasetElementType, DatasetType } from '../../models/seriesType/config'; import { defaultizeValueFormatter } from '../../internals/defaultizeValueFormatter'; import { SeriesId } from '../../models/seriesType/common'; -import { SeriesProcessor } from '../../internals/plugins/models'; +import { SeriesProcessorWithoutDimensions } from '../../internals/plugins/models'; -const seriesProcessor: SeriesProcessor<'line'> = (params, dataset) => { +const seriesProcessorWithoutDimensions: SeriesProcessorWithoutDimensions<'line'> = ( + params, + dataset, +) => { const { seriesOrder, series } = params; const stackingGroups = getStackingGroups({ ...params, defaultStrategy: { stackOffset: 'none' } }); @@ -104,4 +107,4 @@ const seriesProcessor: SeriesProcessor<'line'> = (params, dataset) => { }; }; -export default seriesProcessor; +export default seriesProcessorWithoutDimensions; diff --git a/packages/x-charts/src/PieChart/seriesConfig/index.ts b/packages/x-charts/src/PieChart/seriesConfig/index.ts index 6cef47af86c9c..0e4f775602663 100644 --- a/packages/x-charts/src/PieChart/seriesConfig/index.ts +++ b/packages/x-charts/src/PieChart/seriesConfig/index.ts @@ -1,5 +1,5 @@ import { ChartSeriesTypeConfig } from '../../internals/plugins/models/seriesConfig'; -import seriesProcessor from './seriesProcessor'; +import seriesProcessorWithoutDimensions from './seriesProcessor'; import getColor from './getColor'; import legendGetter from './legend'; import tooltipGetter from './tooltip'; @@ -8,7 +8,7 @@ import tooltipItemPositionGetter from './tooltipPosition'; export const pieSeriesConfig: ChartSeriesTypeConfig<'pie'> = { colorProcessor: getColor, - seriesProcessor, + seriesProcessorWithoutDimensions, legendGetter, tooltipGetter, tooltipItemPositionGetter, diff --git a/packages/x-charts/src/PieChart/seriesConfig/seriesProcessor.ts b/packages/x-charts/src/PieChart/seriesConfig/seriesProcessor.ts index 161aaebf77482..66b41e436007f 100644 --- a/packages/x-charts/src/PieChart/seriesConfig/seriesProcessor.ts +++ b/packages/x-charts/src/PieChart/seriesConfig/seriesProcessor.ts @@ -3,7 +3,7 @@ import { ChartSeriesDefaultized } from '../../models/seriesType/config'; import { ChartsPieSorting, PieValueType } from '../../models/seriesType/pie'; import { SeriesId } from '../../models/seriesType/common'; import { getLabel } from '../../internals/getLabel'; -import { SeriesProcessor } from '../../internals/plugins/models'; +import { SeriesProcessorWithoutDimensions } from '../../internals/plugins/models'; import { deg2rad } from '../../internals/angleConversion'; const getSortingComparator = (comparator: ChartsPieSorting = 'none') => { @@ -22,7 +22,7 @@ const getSortingComparator = (comparator: ChartsPieSorting = 'none') => { } }; -const seriesProcessor: SeriesProcessor<'pie'> = (params) => { +const seriesProcessorWithoutDimensions: SeriesProcessorWithoutDimensions<'pie'> = (params) => { const { seriesOrder, series } = params; const defaultizedSeries: Record> = {}; @@ -63,4 +63,4 @@ const seriesProcessor: SeriesProcessor<'pie'> = (params) => { }; }; -export default seriesProcessor; +export default seriesProcessorWithoutDimensions; diff --git a/packages/x-charts/src/RadarChart/seriesConfig/formatter.ts b/packages/x-charts/src/RadarChart/seriesConfig/formatter.ts index ee54b7a785855..9416e4a357c5c 100644 --- a/packages/x-charts/src/RadarChart/seriesConfig/formatter.ts +++ b/packages/x-charts/src/RadarChart/seriesConfig/formatter.ts @@ -1,7 +1,7 @@ import { defaultizeValueFormatter } from '../../internals/defaultizeValueFormatter'; -import { SeriesProcessor } from '../../internals/plugins/models/seriesConfig'; +import { SeriesProcessorWithoutDimensions } from '../../internals/plugins/models/seriesConfig'; -const formatter: SeriesProcessor<'radar'> = (params) => { +const formatter: SeriesProcessorWithoutDimensions<'radar'> = (params) => { const { seriesOrder, series } = params; return { diff --git a/packages/x-charts/src/RadarChart/seriesConfig/index.ts b/packages/x-charts/src/RadarChart/seriesConfig/index.ts index d96cd29f5abe4..e5b568996e837 100644 --- a/packages/x-charts/src/RadarChart/seriesConfig/index.ts +++ b/packages/x-charts/src/RadarChart/seriesConfig/index.ts @@ -8,7 +8,7 @@ import getSeriesWithDefaultValues from './getSeriesWithDefaultValues'; export const radarSeriesConfig: ChartSeriesTypeConfig<'radar'> = { colorProcessor: getColor, - seriesProcessor: formatter, + seriesProcessorWithoutDimensions: formatter, legendGetter, tooltipGetter, axisTooltipGetter, diff --git a/packages/x-charts/src/ScatterChart/seriesConfig/index.ts b/packages/x-charts/src/ScatterChart/seriesConfig/index.ts index 6c214b17c4a6e..af4c6532332b8 100644 --- a/packages/x-charts/src/ScatterChart/seriesConfig/index.ts +++ b/packages/x-charts/src/ScatterChart/seriesConfig/index.ts @@ -1,6 +1,6 @@ import { ChartSeriesTypeConfig } from '../../internals/plugins/models/seriesConfig'; import { getExtremumX, getExtremumY } from './extremums'; -import seriesProcessor from './seriesProcessor'; +import seriesProcessorWithoutDimensions from './seriesProcessor'; import getColor from './getColor'; import legendGetter from './legend'; import tooltipGetter from './tooltip'; @@ -8,7 +8,7 @@ import getSeriesWithDefaultValues from './getSeriesWithDefaultValues'; import tooltipItemPositionGetter from './tooltipPosition'; export const scatterSeriesConfig: ChartSeriesTypeConfig<'scatter'> = { - seriesProcessor, + seriesProcessorWithoutDimensions, colorProcessor: getColor, legendGetter, tooltipGetter, diff --git a/packages/x-charts/src/ScatterChart/seriesConfig/seriesProcessor.ts b/packages/x-charts/src/ScatterChart/seriesConfig/seriesProcessor.ts index 289bb8603c84c..8a54f693a7cd5 100644 --- a/packages/x-charts/src/ScatterChart/seriesConfig/seriesProcessor.ts +++ b/packages/x-charts/src/ScatterChart/seriesConfig/seriesProcessor.ts @@ -1,7 +1,10 @@ import { ScatterValueType } from '../../models'; -import { SeriesProcessor } from '../../internals/plugins/models'; +import { SeriesProcessorWithoutDimensions } from '../../internals/plugins/models'; -const seriesProcessor: SeriesProcessor<'scatter'> = ({ series, seriesOrder }, dataset) => { +const seriesProcessorWithoutDimensions: SeriesProcessorWithoutDimensions<'scatter'> = ( + { series, seriesOrder }, + dataset, +) => { const completeSeries = Object.fromEntries( Object.entries(series).map(([seriesId, seriesData]) => { const datasetKeys = seriesData?.datasetKeys; @@ -53,4 +56,4 @@ const seriesProcessor: SeriesProcessor<'scatter'> = ({ series, seriesOrder }, da }; }; -export default seriesProcessor; +export default seriesProcessorWithoutDimensions; diff --git a/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/processSeries.ts b/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/processSeries.ts index c1b6c27272702..65611f7e0384f 100644 --- a/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/processSeries.ts +++ b/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/processSeries.ts @@ -2,7 +2,12 @@ import { SeriesId } from '../../../../models/seriesType/common'; import { AllSeriesType } from '../../../../models/seriesType'; import { ChartSeriesType, DatasetType } from '../../../../models/seriesType/config'; import { ChartSeriesConfig } from '../../models/seriesConfig'; -import { DefaultizedSeriesGroups, ProcessedSeries } from './useChartSeries.types'; +import { + DefaultizedSeriesGroups, + ProcessedSeries, + ProcessedSeriesWithoutDimensions, +} from './useChartSeries.types'; +import { ChartDrawingArea } from '../../../../hooks/useDrawingArea'; /** * This method groups series by type and adds defaultized values such as the ids and colors. @@ -55,7 +60,7 @@ export const defaultizeSeries = ({ * @param dataset The optional dataset * @returns Processed series with all transformations applied */ -export const applySeriesProcessors = ( +export const applySeriesProcessorsWithoutDimensions = ( defaultizedSeries: DefaultizedSeriesGroups, seriesConfig: ChartSeriesConfig, dataset?: Readonly, @@ -67,9 +72,43 @@ export const applySeriesProcessors = ( const group = (defaultizedSeries as any)[type]; if (group !== undefined) { (processedSeries as any)[type] = - seriesConfig[type]?.seriesProcessor?.(group, dataset) ?? group; + seriesConfig[type]?.seriesProcessorWithoutDimensions?.(group, dataset) ?? group; } }); return processedSeries; }; + +/** + * Applies series processors with drawing area to series if defined. + * @param processedSeries The processed series groups + * @param seriesConfig The series configuration + * @param drawingArea The drawing area + * @returns Processed series with all transformations applied + */ +export const applySeriesProcessors = ( + processedSeries: ProcessedSeriesWithoutDimensions, + seriesConfig: ChartSeriesConfig, + drawingArea: ChartDrawingArea, +): ProcessedSeries => { + let processingDetected = false; + const modifiedProcessedSeries: ProcessedSeries = {}; + + // Apply processors on series type per group + (Object.keys(processedSeries) as TSeriesType[]).forEach((type) => { + const processor = seriesConfig[type]?.seriesProcessor; + if (processor !== undefined) { + const newValue = processor(processedSeries[type] as any, drawingArea); + + if (newValue && newValue !== processedSeries[type]) { + processingDetected = true; + (modifiedProcessedSeries as any)[type] = newValue; + } + } + }); + + if (!processingDetected) { + return processedSeries as ProcessedSeries; + } + return { ...processedSeries, ...modifiedProcessedSeries }; +}; diff --git a/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/useChartSeries.selectors.ts b/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/useChartSeries.selectors.ts index 38a1325d2f2a2..f660c2700d3db 100644 --- a/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/useChartSeries.selectors.ts +++ b/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/useChartSeries.selectors.ts @@ -1,7 +1,8 @@ import { createSelectorMemoized, createSelector } from '@mui/x-internals/store'; import { ChartRootSelector } from '../../utils/selectors'; import { UseChartSeriesSignature } from './useChartSeries.types'; -import { applySeriesProcessors } from './processSeries'; +import { applySeriesProcessors, applySeriesProcessorsWithoutDimensions } from './processSeries'; +import { selectorChartDrawingArea } from '../useChartDimensions'; export const selectorChartSeriesState: ChartRootSelector = (state) => state.series; @@ -28,13 +29,28 @@ export const selectorChartDataset = createSelector( /** * Get the processed series after applying series processors. * This selector computes the processed series on-demand from the defaultized series. + * It's a first step before applying the drawing-area-dependent processors. * @returns {ProcessedSeries} The processed series. */ -export const selectorChartSeriesProcessed = createSelectorMemoized( +export const selectorChartSeriesProcessedWithoutDimensions = createSelectorMemoized( selectorChartDefaultizedSeries, selectorChartSeriesConfig, selectorChartDataset, - function selectorChartSeriesProcessed(defaultizedSeries, seriesConfig, dataset) { - return applySeriesProcessors(defaultizedSeries, seriesConfig, dataset); + function selectorChartSeriesProcessedWithoutDimensions(defaultizedSeries, seriesConfig, dataset) { + return applySeriesProcessorsWithoutDimensions(defaultizedSeries, seriesConfig, dataset); + }, +); + +/** + * Get the processed series after applying series processors. + * This selector computes the processed series on-demand from the defaultized series. + * @returns {ProcessedSeries} The processed series. + */ +export const selectorChartSeriesProcessed = createSelectorMemoized( + selectorChartSeriesProcessedWithoutDimensions, + selectorChartSeriesConfig, + selectorChartDrawingArea, + function selectorChartSeriesProcessed(processedSeries, seriesConfig, drawingArea) { + return applySeriesProcessors(processedSeries, seriesConfig, drawingArea); }, ); diff --git a/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/useChartSeries.types.ts b/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/useChartSeries.types.ts index 529b3fb99026a..1b2bd6b2f7787 100644 --- a/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/useChartSeries.types.ts +++ b/packages/x-charts/src/internals/plugins/corePlugins/useChartSeries/useChartSeries.types.ts @@ -5,7 +5,9 @@ import { ChartSeriesType, DatasetType } from '../../../../models/seriesType/conf import { SeriesProcessorParams, SeriesProcessorResult, + SeriesProcessorWithoutDimensionsResult, } from '../../models/seriesConfig/seriesProcessor.types'; +import { UseChartDimensionsSignature } from '../useChartDimensions'; export interface UseChartSeriesParameters { /** @@ -46,6 +48,12 @@ export type ProcessedSeries; }; +export type ProcessedSeriesWithoutDimensions< + TSeriesTypes extends ChartSeriesType = ChartSeriesType, +> = { + [type in TSeriesTypes]?: SeriesProcessorWithoutDimensionsResult; +}; + export type DefaultizedSeriesGroups = { [type in TSeriesTypes]?: SeriesProcessorParams; }; @@ -66,4 +74,5 @@ export type UseChartSeriesSignature; state: UseChartSeriesState; instance: UseChartSeriesInstance; + dependencies: [UseChartDimensionsSignature]; }>; diff --git a/packages/x-charts/src/internals/plugins/models/seriesConfig/seriesConfig.types.ts b/packages/x-charts/src/internals/plugins/models/seriesConfig/seriesConfig.types.ts index 85e360ad36af6..96443cf0cbe9b 100644 --- a/packages/x-charts/src/internals/plugins/models/seriesConfig/seriesConfig.types.ts +++ b/packages/x-charts/src/internals/plugins/models/seriesConfig/seriesConfig.types.ts @@ -1,4 +1,4 @@ -import type { SeriesProcessor } from './seriesProcessor.types'; +import type { SeriesProcessor, SeriesProcessorWithoutDimensions } from './seriesProcessor.types'; import type { CartesianChartSeriesType, ChartSeriesType, @@ -13,12 +13,13 @@ import { GetSeriesWithDefaultValues } from './getSeriesWithDefaultValues.types'; import { TooltipItemPositionGetter } from './tooltipItemPositionGetter.types'; export type ChartSeriesTypeConfig = { - seriesProcessor: SeriesProcessor; + seriesProcessorWithoutDimensions: SeriesProcessorWithoutDimensions; colorProcessor: ColorProcessor; legendGetter: LegendGetter; tooltipGetter: TooltipGetter; tooltipItemPositionGetter?: TooltipItemPositionGetter; getSeriesWithDefaultValues: GetSeriesWithDefaultValues; + seriesProcessor?: SeriesProcessor; } & (TSeriesType extends CartesianChartSeriesType ? { xExtremumGetter: CartesianExtremumGetter; diff --git a/packages/x-charts/src/internals/plugins/models/seriesConfig/seriesProcessor.types.ts b/packages/x-charts/src/internals/plugins/models/seriesConfig/seriesProcessor.types.ts index ec32269914d57..a61bd09ffeff0 100644 --- a/packages/x-charts/src/internals/plugins/models/seriesConfig/seriesProcessor.types.ts +++ b/packages/x-charts/src/internals/plugins/models/seriesConfig/seriesProcessor.types.ts @@ -5,6 +5,7 @@ import type { DatasetType, } from '../../../../models/seriesType/config'; import type { SeriesId } from '../../../../models/seriesType/common'; +import { ChartDrawingArea } from '../../../../hooks/useDrawingArea'; import type { StackingGroupsType } from '../../../stackSeries'; export type SeriesProcessorParams = { @@ -12,6 +13,26 @@ export type SeriesProcessorParams = { seriesOrder: SeriesId[]; }; +export type SeriesProcessorWithoutDimensionsResult = { + series: Record< + SeriesId, + Omit< + ChartSeriesDefaultized, + keyof ChartsSeriesConfig[TSeriesType]['seriesComputedPosition'] + > + >; + seriesOrder: SeriesId[]; +} & (ChartsSeriesConfig[TSeriesType] extends { + canBeStacked: true; +} + ? { stackingGroups: StackingGroupsType } + : {}); + +export type SeriesProcessorWithoutDimensions = ( + params: SeriesProcessorParams, + dataset?: Readonly, +) => SeriesProcessorWithoutDimensionsResult; + export type SeriesProcessorResult = { series: Record>; seriesOrder: SeriesId[]; @@ -22,6 +43,6 @@ export type SeriesProcessorResult = { : {}); export type SeriesProcessor = ( - params: SeriesProcessorParams, - dataset?: Readonly, + params: SeriesProcessorWithoutDimensionsResult, + drawingArea: Readonly, ) => SeriesProcessorResult; diff --git a/packages/x-charts/src/models/seriesType/config.ts b/packages/x-charts/src/models/seriesType/config.ts index 6979134503eea..0bf5bb9968de2 100644 --- a/packages/x-charts/src/models/seriesType/config.ts +++ b/packages/x-charts/src/models/seriesType/config.ts @@ -28,6 +28,11 @@ export interface ChartsSeriesConfig { * Series type when stored in the context (with all the preprocessing added)) */ series: DefaultizedBarSeriesType; + /** + * Additional data computed from the series plus drawing area. + * Usefull for special charts like sankey where the series data is not sufficient to draw the series. + */ + seriesComputedPosition: {}; /** * Series typing such that the one user need to provide */ @@ -42,6 +47,7 @@ export interface ChartsSeriesConfig { seriesInput: DefaultizedProps & MakeRequired, 'color'>; series: DefaultizedLineSeriesType; + seriesComputedPosition: {}; seriesProp: LineSeriesType; itemIdentifier: LineItemIdentifier; itemIdentifierWithData: LineItemIdentifier; @@ -53,6 +59,7 @@ export interface ChartsSeriesConfig { seriesInput: DefaultizedProps & MakeRequired, 'color'>; series: DefaultizedScatterSeriesType; + seriesComputedPosition: {}; seriesProp: ScatterSeriesType; valueType: ScatterValueType; itemIdentifier: ScatterItemIdentifier; @@ -66,6 +73,7 @@ export interface ChartsSeriesConfig { >; }; series: DefaultizedPieSeriesType; + seriesComputedPosition: {}; seriesProp: PieSeriesType>; itemIdentifier: PieItemIdentifier; itemIdentifierWithData: PieItemIdentifier; @@ -75,6 +83,7 @@ export interface ChartsSeriesConfig { seriesInput: DefaultizedProps & MakeRequired, 'color'>; series: DefaultizedRadarSeriesType; + seriesComputedPosition: {}; seriesProp: RadarSeriesType; itemIdentifier: RadarItemIdentifier; itemIdentifierWithData: RadarItemIdentifier; @@ -113,8 +122,9 @@ export type ChartSeries = ChartsSeriesConfig[T]['seri export type ChartSeriesDefaultized = ChartsSeriesConfig[T] extends { canBeStacked: true; } - ? ChartsSeriesConfig[T]['series'] & { stackedData: [number, number][] } - : ChartsSeriesConfig[T]['series']; + ? ChartsSeriesConfig[T]['series'] & + ChartsSeriesConfig[T]['seriesComputedPosition'] & { stackedData: [number, number][] } + : ChartsSeriesConfig[T]['series'] & ChartsSeriesConfig[T]['seriesComputedPosition']; export type ChartItemIdentifier = ChartsSeriesConfig[T]['itemIdentifier'];