Skip to content

Commit 6163b08

Browse files
etimbergsimonbrunel
authored andcommitted
Implement scriptable options for polar area charts (chartjs#5976)
1 parent 4160ef4 commit 6163b08

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+1092
-127
lines changed

docs/charts/polar.md

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,28 @@ new Chart(ctx, {
4444

4545
The following options can be included in a polar area chart dataset to configure options for that specific dataset.
4646

47-
| Name | Type | Description
48-
| ---- | ---- | -----------
49-
| `backgroundColor` | `Color/Color[]` | The fill color of the arcs in the dataset. See [Colors](../general/colors.md#colors).
50-
| `borderColor` | `Color/Color[]` | The border color of the arcs in the dataset. See [Colors](../general/colors.md#colors).
51-
| `borderWidth` | `Number/Number[]` | The border width of the arcs in the dataset.
52-
| `borderAlign` | `String/String[]` | The border alignment of the arcs in the dataset. [more...](#border-alignment)
53-
| `hoverBackgroundColor` | `Color/Color[]` | The fill colour of the arcs when hovered.
54-
| `hoverBorderColor` | `Color/Color[]` | The stroke colour of the arcs when hovered.
55-
| `hoverBorderWidth` | `Number/Number[]` | The stroke width of the arcs when hovered.
47+
| Name | Type | [Scriptable](../general/options.md#scriptable-options) | [Indexable](../general/options.md#indexable-options) | Default
48+
| ---- | ---- | :----: | :----: | ----
49+
| [`backgroundColor`](#styling) | [`Color`](../general/colors.md) | Yes | Yes | `'rgba(0,0,0,0.1)'`
50+
| [`borderAlign`](#border-alignment) | `String` | Yes | Yes | `'center'`
51+
| [`borderColor`](#styling) | [`Color`](../general/colors.md) | Yes | Yes | `'#fff'`
52+
| [`borderWidth`](#styling) | `Number` | Yes | Yes | `2`
53+
| [`data`](#data-structure) | `Number[]` | - | - | **required**
54+
| [`hoverBackgroundColor`](#interations) | [`Color`](../general/colors.md) | Yes | Yes | `undefined`
55+
| [`hoverBorderColor`](#interactions) | [`Color`](../general/colors.md) | Yes | Yes | `undefined`
56+
| [`hoverBorderWidth`](#interactions) | `Number` | Yes | Yes | `undefined`
57+
58+
### Styling
59+
60+
The style of each arc can be controlled with the following properties:
61+
62+
| Name | Description
63+
| ---- | ----
64+
| `backgroundColor` | arc background color.
65+
| `borderColor` | arc border color.
66+
| `borderWidth` | arc border width (in pixels).
67+
68+
All these values, if `undefined`, fallback to the associated [`elements.arc.*`](../configuration/elements.md#arc-configuration) options.
5669

5770
### Border Alignment
5871

@@ -62,6 +75,18 @@ The following values are supported for `borderAlign`.
6275

6376
When `'center'` is set, the borders of arcs next to each other will overlap. When `'inner'` is set, it is guaranteed that all the borders are not overlap.
6477

78+
### Interactions
79+
80+
The interaction with each arc can be controlled with the following properties:
81+
82+
| Name | Description
83+
| ---- | -----------
84+
| `hoverBackgroundColor` | arc background color when hovered.
85+
| `hoverBorderColor` | arc border color when hovered.
86+
| `hoverBorderWidth` | arc border width when hovered (in pixels).
87+
88+
All these values, if `undefined`, fallback to the associated [`elements.arc.*`](../configuration/elements.md#arc-configuration) options.
89+
6590
## Config Options
6691

6792
These are the customisation options specific to Polar Area charts. These options are merged with the [global chart default options](#default-options), and form the options of the chart.

src/controllers/controller.doughnut.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ module.exports = DatasetController.extend({
174174
}
175175

176176
for (i = 0, ilen = arcs.length; i < ilen; ++i) {
177-
arcs[i]._options = me._resolveElementOptions(arcs[i], i, reset);
177+
arcs[i]._options = me._resolveElementOptions(arcs[i], i);
178178
}
179179

180180
chart.borderWidth = me.getMaxBorderWidth();

src/controllers/controller.polarArea.js

Lines changed: 72 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ module.exports = DatasetController.extend({
123123
var start = me.chart.options.startAngle || 0;
124124
var starts = me._starts = [];
125125
var angles = me._angles = [];
126+
var arcs = meta.data;
126127
var i, ilen, angle;
127128

128129
me._updateRadius();
@@ -136,9 +137,10 @@ module.exports = DatasetController.extend({
136137
start += angle;
137138
}
138139

139-
helpers.each(meta.data, function(arc, index) {
140-
me.updateElement(arc, index, reset);
141-
});
140+
for (i = 0, ilen = arcs.length; i < ilen; ++i) {
141+
arcs[i]._options = me._resolveElementOptions(arcs[i], i);
142+
me.updateElement(arcs[i], i, reset);
143+
}
142144
},
143145

144146
/**
@@ -178,6 +180,7 @@ module.exports = DatasetController.extend({
178180
var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]);
179181

180182
var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);
183+
var options = arc._options || {};
181184

182185
helpers.extend(arc, {
183186
// Utility
@@ -187,6 +190,10 @@ module.exports = DatasetController.extend({
187190

188191
// Desired view properties
189192
_model: {
193+
backgroundColor: options.backgroundColor,
194+
borderColor: options.borderColor,
195+
borderWidth: options.borderWidth,
196+
borderAlign: options.borderAlign,
190197
x: centerX,
191198
y: centerY,
192199
innerRadius: 0,
@@ -197,16 +204,6 @@ module.exports = DatasetController.extend({
197204
}
198205
});
199206

200-
// Apply border and fill style
201-
var elementOpts = this.chart.options.elements.arc;
202-
var custom = arc.custom || {};
203-
var model = arc._model;
204-
205-
model.backgroundColor = resolve([custom.backgroundColor, dataset.backgroundColor, elementOpts.backgroundColor], undefined, index);
206-
model.borderColor = resolve([custom.borderColor, dataset.borderColor, elementOpts.borderColor], undefined, index);
207-
model.borderWidth = resolve([custom.borderWidth, dataset.borderWidth, elementOpts.borderWidth], undefined, index);
208-
model.borderAlign = resolve([custom.borderAlign, dataset.borderAlign, elementOpts.borderAlign], undefined, index);
209-
210207
arc.pivot();
211208
},
212209

@@ -224,6 +221,68 @@ module.exports = DatasetController.extend({
224221
return count;
225222
},
226223

224+
/**
225+
* @protected
226+
*/
227+
setHoverStyle: function(arc) {
228+
var model = arc._model;
229+
var options = arc._options;
230+
var getHoverColor = helpers.getHoverColor;
231+
var valueOrDefault = helpers.valueOrDefault;
232+
233+
arc.$previousStyle = {
234+
backgroundColor: model.backgroundColor,
235+
borderColor: model.borderColor,
236+
borderWidth: model.borderWidth,
237+
};
238+
239+
model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));
240+
model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor));
241+
model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth);
242+
},
243+
244+
/**
245+
* @private
246+
*/
247+
_resolveElementOptions: function(arc, index) {
248+
var me = this;
249+
var chart = me.chart;
250+
var dataset = me.getDataset();
251+
var custom = arc.custom || {};
252+
var options = chart.options.elements.arc;
253+
var values = {};
254+
var i, ilen, key;
255+
256+
// Scriptable options
257+
var context = {
258+
chart: chart,
259+
dataIndex: index,
260+
dataset: dataset,
261+
datasetIndex: me.index
262+
};
263+
264+
var keys = [
265+
'backgroundColor',
266+
'borderColor',
267+
'borderWidth',
268+
'borderAlign',
269+
'hoverBackgroundColor',
270+
'hoverBorderColor',
271+
'hoverBorderWidth',
272+
];
273+
274+
for (i = 0, ilen = keys.length; i < ilen; ++i) {
275+
key = keys[i];
276+
values[key] = resolve([
277+
custom[key],
278+
dataset[key],
279+
options[key]
280+
], context, index);
281+
}
282+
283+
return values;
284+
},
285+
227286
/**
228287
* @private
229288
*/

src/elements/element.arc.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ module.exports = Element.extend({
9292
ctx.save();
9393

9494
ctx.beginPath();
95-
ctx.arc(vm.x, vm.y, vm.outerRadius - pixelMargin, sA, eA);
95+
ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA);
9696
ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);
9797
ctx.closePath();
9898

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
module.exports = {
2+
config: {
3+
type: 'polarArea',
4+
data: {
5+
labels: [0, 1, 2, 3, 4, 5],
6+
datasets: [
7+
{
8+
// option in dataset
9+
data: [0, 2, 4, null, 6, 8],
10+
backgroundColor: [
11+
'#ff0000',
12+
'#00ff00',
13+
'#0000ff',
14+
'#ffff00',
15+
'#ff00ff',
16+
'#000000'
17+
]
18+
},
19+
]
20+
},
21+
options: {
22+
legend: false,
23+
title: false,
24+
scale: {
25+
display: false
26+
}
27+
}
28+
},
29+
options: {
30+
canvas: {
31+
height: 256,
32+
width: 512
33+
}
34+
}
35+
};
Loading
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
module.exports = {
2+
config: {
3+
type: 'polarArea',
4+
data: {
5+
labels: [0, 1, 2, 3, 4, 5],
6+
datasets: [
7+
{
8+
// option in element (fallback)
9+
data: [0, 2, 4, null, 6, 8],
10+
}
11+
]
12+
},
13+
options: {
14+
legend: false,
15+
title: false,
16+
elements: {
17+
arc: {
18+
backgroundColor: [
19+
'#ff88ff',
20+
'#888888',
21+
'#ff8800',
22+
'#00ff88',
23+
'#8800ff',
24+
'#ffff88'
25+
]
26+
}
27+
},
28+
scale: {
29+
display: false
30+
}
31+
}
32+
},
33+
options: {
34+
canvas: {
35+
height: 256,
36+
width: 512
37+
}
38+
}
39+
};
Loading
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
module.exports = {
2+
config: {
3+
type: 'polarArea',
4+
data: {
5+
labels: [0, 1, 2, 3, 4, 5],
6+
datasets: [
7+
{
8+
// option in dataset
9+
data: [0, 2, 4, null, 6, 8],
10+
backgroundColor: function(ctx) {
11+
var value = ctx.dataset.data[ctx.dataIndex] || 0;
12+
return value > 8 ? '#ff0000'
13+
: value > 6 ? '#00ff00'
14+
: value > 2 ? '#0000ff'
15+
: '#ff00ff';
16+
}
17+
},
18+
]
19+
},
20+
options: {
21+
legend: false,
22+
title: false,
23+
scale: {
24+
display: false
25+
}
26+
}
27+
},
28+
options: {
29+
canvas: {
30+
height: 256,
31+
width: 512
32+
}
33+
}
34+
};
Loading
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
module.exports = {
2+
config: {
3+
type: 'polarArea',
4+
data: {
5+
labels: [0, 1, 2, 3, 4, 5],
6+
datasets: [
7+
{
8+
// option in element (fallback)
9+
data: [0, 2, 4, null, 6, 8],
10+
}
11+
]
12+
},
13+
options: {
14+
legend: false,
15+
title: false,
16+
elements: {
17+
arc: {
18+
backgroundColor: function(ctx) {
19+
var value = ctx.dataset.data[ctx.dataIndex] || 0;
20+
return value > 8 ? '#ff0000'
21+
: value > 6 ? '#00ff00'
22+
: value > 2 ? '#0000ff'
23+
: '#ff00ff';
24+
}
25+
}
26+
},
27+
scale: {
28+
display: false
29+
}
30+
}
31+
},
32+
options: {
33+
canvas: {
34+
height: 256,
35+
width: 512
36+
}
37+
}
38+
};
Loading
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
module.exports = {
2+
config: {
3+
type: 'polarArea',
4+
data: {
5+
labels: [0, 1, 2, 3, 4, 5],
6+
datasets: [
7+
{
8+
// option in dataset
9+
data: [0, 2, 4, null, 6, 8],
10+
backgroundColor: '#ff0000'
11+
},
12+
]
13+
},
14+
options: {
15+
legend: false,
16+
title: false,
17+
scale: {
18+
display: false
19+
}
20+
}
21+
},
22+
options: {
23+
canvas: {
24+
height: 256,
25+
width: 512
26+
}
27+
}
28+
};
Loading

0 commit comments

Comments
 (0)