Skip to content

Commit 29a89bc

Browse files
committed
feat: check all datasets and elements options before apply colors
1 parent 83bcd03 commit 29a89bc

File tree

1 file changed

+34
-13
lines changed

1 file changed

+34
-13
lines changed

src/plugins/plugin.colors.ts

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ import type {Chart, ChartDataset} from '../types';
22

33
type DatasetColorizer = (dataset: ChartDataset, i: number) => void;
44

5+
interface ColorsDescriptor {
6+
backgroundColor?: unknown;
7+
borderColor?: unknown;
8+
}
9+
510
const BORDER_COLORS = [
611
'rgb(54, 162, 235)', // blue
712
'rgb(255, 99, 132)', // red
@@ -25,40 +30,56 @@ function getBackgroundColor(i: number) {
2530

2631
function createDefaultDatasetColorizer() {
2732
return (dataset: ChartDataset, i: number) => {
28-
if (!dataset.borderColor && !dataset.backgroundColor) {
29-
dataset.borderColor = getBorderColor(i);
30-
dataset.backgroundColor = getBackgroundColor(i);
31-
}
33+
dataset.borderColor = getBorderColor(i);
34+
dataset.backgroundColor = getBackgroundColor(i);
3235
};
3336
}
3437

3538
function createDoughnutDatasetColorizer() {
3639
let i = 0;
3740

3841
return (dataset: ChartDataset) => {
39-
if (!dataset.borderColor && !dataset.backgroundColor) {
40-
dataset.backgroundColor = dataset.data.map(() => getBorderColor(i++));
41-
}
42+
dataset.backgroundColor = dataset.data.map(() => getBorderColor(i++));
4243
};
4344
}
4445

4546
function createPolarAreaDatasetColorizer() {
4647
let i = 0;
4748

4849
return (dataset: ChartDataset) => {
49-
if (!dataset.borderColor && !dataset.backgroundColor) {
50-
dataset.backgroundColor = dataset.data.map(() => getBackgroundColor(i++));
51-
}
50+
dataset.backgroundColor = dataset.data.map(() => getBackgroundColor(i++));
5251
};
5352
}
5453

54+
function containsColorsDefinitions(
55+
descriptors: ColorsDescriptor[] | Record<string, ColorsDescriptor>
56+
) {
57+
let k: number | string;
58+
59+
for (k in descriptors) {
60+
if (descriptors[k].borderColor || descriptors[k].backgroundColor) {
61+
return true;
62+
}
63+
}
64+
65+
return false;
66+
}
67+
5568
export default {
5669
id: 'colors',
5770

5871
beforeLayout(chart: Chart) {
59-
const {type} = chart.config;
72+
const {
73+
type,
74+
options: {elements},
75+
data: {datasets}
76+
} = chart.config;
6077
let colorizer: DatasetColorizer;
6178

79+
if (containsColorsDefinitions(datasets) || elements && containsColorsDefinitions(elements)) {
80+
return;
81+
}
82+
6283
if (type === 'doughnut') {
6384
colorizer = createDoughnutDatasetColorizer();
6485
} else if (type === 'polarArea') {
@@ -67,6 +88,6 @@ export default {
6788
colorizer = createDefaultDatasetColorizer();
6889
}
6990

70-
chart.data.datasets.forEach(colorizer);
71-
},
91+
datasets.forEach(colorizer);
92+
}
7293
};

0 commit comments

Comments
 (0)