feat: colors for mixed charts (#10870)

This commit is contained in:
Dan Onoshko 2022-11-18 22:15:08 +04:00 committed by GitHub
parent 9a9ff6fdbd
commit 22f0dfe9a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 27 deletions

View File

@ -4,8 +4,6 @@ export interface ColorsPluginOptions {
enabled?: boolean;
}
type DatasetColorizer = (dataset: ChartDataset, i: number) => void;
interface ColorsDescriptor {
backgroundColor?: unknown;
borderColor?: unknown;
@ -32,38 +30,41 @@ function getBackgroundColor(i: number) {
return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];
}
function createDefaultDatasetColorizer() {
return (dataset: ChartDataset, i: number) => {
dataset.borderColor = getBorderColor(i);
dataset.backgroundColor = getBackgroundColor(i);
};
function colorizeDefaultDataset(dataset: ChartDataset, i: number) {
dataset.borderColor = getBorderColor(i);
dataset.backgroundColor = getBackgroundColor(i);
return ++i;
}
function createDoughnutDatasetColorizer() {
function colorizeDoughnutDataset(dataset: ChartDataset, i: number) {
dataset.backgroundColor = dataset.data.map(() => getBorderColor(i++));
return i;
}
function colorizePolarAreaDataset(dataset: ChartDataset, i: number) {
dataset.backgroundColor = dataset.data.map(() => getBackgroundColor(i++));
return i;
}
function getColorizer(chartType: string) {
let i = 0;
return (dataset: ChartDataset) => {
dataset.backgroundColor = dataset.data.map(() => getBorderColor(i++));
const type = dataset.type || chartType;
if (type === 'doughnut' || type === 'pie') {
i = colorizeDoughnutDataset(dataset, i);
} else if (type === 'polarArea') {
i = colorizePolarAreaDataset(dataset, i);
} else if (type) {
i = colorizeDefaultDataset(dataset, i);
}
};
}
function createPolarAreaDatasetColorizer() {
let i = 0;
return (dataset: ChartDataset) => {
dataset.backgroundColor = dataset.data.map(() => getBackgroundColor(i++));
};
}
function getColorizer(type: string) {
if (type === 'doughnut' || type === 'pie') {
return createDoughnutDatasetColorizer();
} else if (type === 'polarArea') {
return createPolarAreaDatasetColorizer();
}
return createDefaultDatasetColorizer();
}
function containsColorsDefinitions(
descriptors: ColorsDescriptor[] | Record<string, ColorsDescriptor>
) {
@ -100,7 +101,8 @@ export default {
return;
}
const colorizer: DatasetColorizer = getColorizer(type);
const colorizer = getColorizer(type);
datasets.forEach(colorizer);
}
};

41
test/fixtures/plugin.colors/mixed.js vendored Normal file
View File

@ -0,0 +1,41 @@
module.exports = {
config: {
data: {
labels: [0, 1, 2, 3],
datasets: [
{
type: 'line',
data: [5, 20, 1, 10],
},
{
type: 'bar',
data: [6, 16, 3, 19]
},
{
type: 'pie',
data: [5, 20, 1, 10],
}
]
},
options: {
scales: {
x: {
ticks: {
display: false,
}
},
y: {
ticks: {
display: false,
}
}
},
plugins: {
legend: false,
colors: {
enabled: true
}
}
}
}
};

BIN
test/fixtures/plugin.colors/mixed.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB