import type { DefaultizedProps, MakeOptional, MakeRequired } from '@mui/x-internals/types'; import type { ScatterSeriesType, DefaultizedScatterSeriesType, ScatterItemIdentifier, ScatterValueType } from "./scatter.js"; import type { LineSeriesType, DefaultizedLineSeriesType, LineItemIdentifier } from "./line.js"; import type { BarItemIdentifier, BarSeriesType, DefaultizedBarSeriesType } from "./bar.js"; import type { PieSeriesType, DefaultizedPieSeriesType, PieItemIdentifier, PieValueType, DefaultizedPieValueType, PieSeriesLayout } from "./pie.js"; import type { DefaultizedRadarSeriesType, RadarItemIdentifier, RadarSeriesType } from "./radar.js"; import type { SeriesColor, SeriesId } from "./common.js"; import type { ChartsRadiusAxisProps, ChartsRotationAxisProps, ComputedXAxis, ComputedYAxis, PolarAxisDefaultized } from "../axis.js"; import type { CommonHighlightScope } from "../../internals/plugins/featurePlugins/useChartHighlight/highlightConfig.types.js"; export interface ChartsSeriesConfig { bar: { /** * Series type when passed to the formatter (some ids are given default values to simplify the DX) */ seriesInput: DefaultizedProps & MakeRequired, 'color'>; /** * Series type when stored in the context (with all the preprocessing added)) */ series: DefaultizedBarSeriesType; /** * Additional data computed from the series plus drawing area. * Useful for special charts like sankey where the series data is not sufficient to draw the series. * */ seriesLayout: {}; /** * Series typing such that the one user need to provide */ seriesProp: BarSeriesType; /** * The minimal information to identify a specific item in the series. */ itemIdentifier: BarItemIdentifier; /** * The minimal information to identify a specific item in the series. Plus the data associated to it. */ itemIdentifierWithData: BarItemIdentifier; valueType: number | null; canBeStacked: true; axisType: 'cartesian'; highlightScope: CommonHighlightScope; descriptionGetterParams: { identifier: BarItemIdentifier; xAxis: ComputedXAxis; yAxis: ComputedYAxis; series: DefaultizedBarSeriesType; }; highlightIdentifier: { type: 'bar'; seriesId: SeriesId; dataIndex?: number | undefined; }; }; line: { seriesInput: DefaultizedProps & MakeRequired, 'color'>; series: DefaultizedLineSeriesType; seriesLayout: {}; seriesProp: LineSeriesType; itemIdentifier: LineItemIdentifier; itemIdentifierWithData: LineItemIdentifier; valueType: number | null; canBeStacked: true; axisType: 'cartesian'; highlightScope: CommonHighlightScope; descriptionGetterParams: { identifier: LineItemIdentifier; xAxis: ComputedXAxis; yAxis: ComputedYAxis; series: DefaultizedLineSeriesType; }; highlightIdentifier: { type: 'line'; seriesId: SeriesId; dataIndex?: number; }; }; scatter: { seriesInput: DefaultizedProps & MakeRequired, 'color'>; series: DefaultizedScatterSeriesType; seriesLayout: {}; seriesProp: ScatterSeriesType; valueType: ScatterValueType; itemIdentifier: ScatterItemIdentifier; itemIdentifierWithData: ScatterItemIdentifier; axisType: 'cartesian'; highlightScope: CommonHighlightScope; descriptionGetterParams: { identifier: ScatterItemIdentifier; xAxis: ComputedXAxis; yAxis: ComputedYAxis; series: DefaultizedScatterSeriesType; }; highlightIdentifier: { type: 'scatter'; seriesId: SeriesId; dataIndex?: number; }; }; pie: { seriesInput: Omit, 'data'> & { data: Array & MakeRequired, 'color'>>; }; series: DefaultizedPieSeriesType; seriesLayout: PieSeriesLayout; seriesProp: PieSeriesType>; itemIdentifier: PieItemIdentifier; itemIdentifierWithData: PieItemIdentifier; valueType: DefaultizedPieValueType; highlightScope: CommonHighlightScope; descriptionGetterParams: { identifier: PieItemIdentifier; series: DefaultizedPieSeriesType; }; highlightIdentifier: { type: 'pie'; seriesId: SeriesId; dataIndex?: number; }; }; radar: { seriesInput: DefaultizedProps & MakeRequired, 'color'>; series: DefaultizedRadarSeriesType; seriesLayout: {}; seriesProp: RadarSeriesType; itemIdentifier: RadarItemIdentifier; itemIdentifierWithData: RadarItemIdentifier; valueType: number; axisType: 'polar'; highlightScope: CommonHighlightScope; descriptionGetterParams: { identifier: RadarItemIdentifier; rotationAxis: PolarAxisDefaultized; radiusAxis: PolarAxisDefaultized; series: DefaultizedRadarSeriesType; }; highlightIdentifier: { type: 'radar'; seriesId: SeriesId; dataIndex?: number; }; }; } /** * All the existing series types. */ export type ChartSeriesType = keyof ChartsSeriesConfig; export type CartesianChartSeriesType = keyof Pick; /** * Extracts series types whose itemIdentifier includes a `dataIndex` property. * This prevents accidentally using dataIndex-based cleaners/serializers * for series types that use different identifier properties (e.g., heatmap uses xIndex/yIndex). */ export type SeriesTypeWithDataIndex = { [K in ChartSeriesType]: 'dataIndex' extends keyof ChartsSeriesConfig[K]['itemIdentifier'] ? K : never }[ChartSeriesType]; export type PolarChartSeriesType = keyof Pick; export type StackableChartSeriesType = keyof Pick; export type ChartSeries = ChartsSeriesConfig[SeriesType]['seriesInput']; export type ChartSeriesDefaultized = ChartsSeriesConfig[SeriesType] extends { canBeStacked: true; } ? ChartsSeriesConfig[SeriesType]['series'] & { visibleStackedData: [number, number][]; stackedData: [number, number][]; } : ChartsSeriesConfig[SeriesType]['series']; export type ChartSeriesLayout = ChartsSeriesConfig[SeriesType] extends any ? ChartsSeriesConfig[SeriesType]['seriesLayout'] : never; export type DatasetElementType = { [key: string]: T; }; export type DatasetType = DatasetElementType[]; export type HighlightScope = ChartsSeriesConfig[SeriesType] extends any ? ChartsSeriesConfig[SeriesType]['highlightScope'] : never;