From 6bcfd74e30ac845c14e40b116ca1f0ebdcb97c35 Mon Sep 17 00:00:00 2001 From: Evert Timberg Date: Sun, 18 Jul 2021 10:14:46 -0400 Subject: [PATCH] Allow dataset specific ChartMeta type extensions --- types/index.esm.d.ts | 35 +++++++++++++++---- .../tests/controllers/doughnut_meta_total.ts | 16 +++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 types/tests/controllers/doughnut_meta_total.ts diff --git a/types/index.esm.d.ts b/types/index.esm.d.ts index 5e5b12f5e43..dcbe8188bb8 100644 --- a/types/index.esm.d.ts +++ b/types/index.esm.d.ts @@ -327,11 +327,16 @@ export const DoughnutController: ChartComponent & { new (chart: Chart, datasetIndex: number): DoughnutController; }; +export interface DoughnutMetaExtensions { + total: number; +} + export type PieControllerDatasetOptions = DoughnutControllerDatasetOptions; export type PieControllerChartOptions = DoughnutControllerChartOptions; export type PieAnimationOptions = DoughnutAnimationOptions; export type PieDataPoint = DoughnutDataPoint; +export type PieMetaExtensions = DoughnutMetaExtensions; export type PieController = DoughnutController export const PieController: ChartComponent & { @@ -401,7 +406,7 @@ export const RadarController: ChartComponent & { prototype: RadarController; new (chart: Chart, datasetIndex: number): RadarController; }; -export interface ChartMeta { +interface ChartMetaCommon { type: string; controller: DatasetController; order: number; @@ -436,6 +441,16 @@ export interface ChartMeta = DeepPartial< + { [key in ChartType]: ChartTypeRegistry[key]['metaExtensions'] }[TType] +> & ChartMetaCommon; + export interface ActiveDataPoint { datasetIndex: number; index: number; @@ -547,7 +562,7 @@ export class DatasetController< readonly chart: Chart; readonly index: number; - readonly _cachedMeta: ChartMeta; + readonly _cachedMeta: ChartMeta; enableOptionSharing: boolean; linkScales(): void; @@ -560,7 +575,7 @@ export class DatasetController< draw(): void; reset(): void; getDataset(): ChartDataset; - getMeta(): ChartMeta; + getMeta(): ChartMeta; getScaleForId(scaleID: string): Scale | undefined; configure(): void; initialize(): void; @@ -596,9 +611,9 @@ export class DatasetController< setHoverStyle(element: TElement, datasetIndex: number, index: number): void; parse(start: number, count: number): void; - protected parsePrimitiveData(meta: ChartMeta, data: AnyObject[], start: number, count: number): AnyObject[]; - protected parseArrayData(meta: ChartMeta, data: AnyObject[], start: number, count: number): AnyObject[]; - protected parseObjectData(meta: ChartMeta, data: AnyObject[], start: number, count: number): AnyObject[]; + protected parsePrimitiveData(meta: ChartMeta, data: AnyObject[], start: number, count: number): AnyObject[]; + protected parseArrayData(meta: ChartMeta, data: AnyObject[], start: number, count: number): AnyObject[]; + protected parseObjectData(meta: ChartMeta, data: AnyObject[], start: number, count: number): AnyObject[]; protected getParsed(index: number): TParsedData; protected applyStack(scale: Scale, parsed: unknown[]): number; protected updateRangeFromParsed( @@ -3335,6 +3350,7 @@ export interface ChartTypeRegistry { chartOptions: BarControllerChartOptions; datasetOptions: BarControllerDatasetOptions; defaultDataPoint: number; + metaExtensions: {}; parsedDataType: BarParsedData, scales: keyof CartesianScaleTypeRegistry; }; @@ -3342,6 +3358,7 @@ export interface ChartTypeRegistry { chartOptions: LineControllerChartOptions; datasetOptions: LineControllerDatasetOptions & FillerControllerDatasetOptions; defaultDataPoint: ScatterDataPoint | number | null; + metaExtensions: {}; parsedDataType: CartesianParsedData; scales: keyof CartesianScaleTypeRegistry; }; @@ -3349,6 +3366,7 @@ export interface ChartTypeRegistry { chartOptions: ScatterControllerChartOptions; datasetOptions: ScatterControllerDatasetOptions; defaultDataPoint: ScatterDataPoint | number | null; + metaExtensions: {}; parsedDataType: CartesianParsedData; scales: keyof CartesianScaleTypeRegistry; }; @@ -3356,6 +3374,7 @@ export interface ChartTypeRegistry { chartOptions: unknown; datasetOptions: BubbleControllerDatasetOptions; defaultDataPoint: BubbleDataPoint; + metaExtensions: {}; parsedDataType: BubbleParsedData; scales: keyof CartesianScaleTypeRegistry; }; @@ -3363,6 +3382,7 @@ export interface ChartTypeRegistry { chartOptions: PieControllerChartOptions; datasetOptions: PieControllerDatasetOptions; defaultDataPoint: PieDataPoint; + metaExtensions: PieMetaExtensions; parsedDataType: number; scales: keyof CartesianScaleTypeRegistry; }; @@ -3370,6 +3390,7 @@ export interface ChartTypeRegistry { chartOptions: DoughnutControllerChartOptions; datasetOptions: DoughnutControllerDatasetOptions; defaultDataPoint: DoughnutDataPoint; + metaExtensions: DoughnutMetaExtensions; parsedDataType: number; scales: keyof CartesianScaleTypeRegistry; }; @@ -3377,6 +3398,7 @@ export interface ChartTypeRegistry { chartOptions: PolarAreaControllerChartOptions; datasetOptions: PolarAreaControllerDatasetOptions; defaultDataPoint: number; + metaExtensions: {}; parsedDataType: RadialParsedData; scales: keyof RadialScaleTypeRegistry; }; @@ -3384,6 +3406,7 @@ export interface ChartTypeRegistry { chartOptions: RadarControllerChartOptions; datasetOptions: RadarControllerDatasetOptions & FillerControllerDatasetOptions; defaultDataPoint: number | null; + metaExtensions: {}; parsedDataType: RadialParsedData; scales: keyof RadialScaleTypeRegistry; }; diff --git a/types/tests/controllers/doughnut_meta_total.ts b/types/tests/controllers/doughnut_meta_total.ts new file mode 100644 index 00000000000..5a57295ce8e --- /dev/null +++ b/types/tests/controllers/doughnut_meta_total.ts @@ -0,0 +1,16 @@ +import { Chart, ChartMeta, Element } from '../../index.esm'; + +const chart = new Chart('id', { + type: 'doughnut', + data: { + labels: [], + datasets: [{ + data: [], + }] + }, +}); + +// A cast is required because the exact type of ChartMeta will vary with +// mixed charts +const meta = >chart.getDatasetMeta(0); +const total = meta.total;