Skip to content

Commit 3aba96c

Browse files
nagixsimonbrunel
authored andcommitted
Make legend appearance consistent with chart elements (chartjs#5621)
1 parent fb7e8ae commit 3aba96c

15 files changed

+548
-391
lines changed

docs/configuration/legend.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ Items passed to the legend `onClick` function are the ones returned from `labels
8282
strokeStyle: Color,
8383

8484
// Point style of the legend box (only used if usePointStyle is true)
85-
pointStyle: string
85+
pointStyle: string | Image,
86+
87+
// Rotation of the point in degrees (only used if usePointStyle is true)
88+
rotation: number
8689
}
8790
```
8891

src/controllers/controller.bar.js

Lines changed: 11 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ var defaults = require('../core/core.defaults');
55
var elements = require('../elements/index');
66
var helpers = require('../helpers/index');
77

8-
var resolve = helpers.options.resolve;
9-
108
defaults._set('bar', {
119
hover: {
1210
mode: 'label'
@@ -120,6 +118,16 @@ module.exports = DatasetController.extend({
120118

121119
dataElementType: elements.Rectangle,
122120

121+
/**
122+
* @private
123+
*/
124+
_dataElementOptions: [
125+
'backgroundColor',
126+
'borderColor',
127+
'borderSkipped',
128+
'borderWidth'
129+
],
130+
123131
initialize: function() {
124132
var me = this;
125133
var meta;
@@ -147,7 +155,7 @@ module.exports = DatasetController.extend({
147155
var me = this;
148156
var meta = me.getMeta();
149157
var dataset = me.getDataset();
150-
var options = me._resolveElementOptions(rectangle, index);
158+
var options = me._resolveDataElementOptions(rectangle, index);
151159

152160
rectangle._xScale = me.getScaleForId(meta.xAxisID);
153161
rectangle._yScale = me.getScaleForId(meta.yAxisID);
@@ -372,46 +380,5 @@ module.exports = DatasetController.extend({
372380
}
373381

374382
helpers.canvas.unclipArea(chart.ctx);
375-
},
376-
377-
/**
378-
* @private
379-
*/
380-
_resolveElementOptions: function(rectangle, index) {
381-
var me = this;
382-
var chart = me.chart;
383-
var datasets = chart.data.datasets;
384-
var dataset = datasets[me.index];
385-
var datasetOpts = me._config;
386-
var custom = rectangle.custom || {};
387-
var options = chart.options.elements.rectangle;
388-
var values = {};
389-
var i, ilen, key;
390-
391-
// Scriptable options
392-
var context = {
393-
chart: chart,
394-
dataIndex: index,
395-
dataset: dataset,
396-
datasetIndex: me.index
397-
};
398-
399-
var keys = [
400-
'backgroundColor',
401-
'borderColor',
402-
'borderSkipped',
403-
'borderWidth'
404-
];
405-
406-
for (i = 0, ilen = keys.length; i < ilen; ++i) {
407-
key = keys[i];
408-
values[key] = resolve([
409-
custom[key],
410-
datasetOpts[key],
411-
options[key]
412-
], context, index);
413-
}
414-
415-
return values;
416383
}
417384
});

src/controllers/controller.bubble.js

Lines changed: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,22 @@ module.exports = DatasetController.extend({
4747
*/
4848
dataElementType: elements.Point,
4949

50+
/**
51+
* @private
52+
*/
53+
_dataElementOptions: [
54+
'backgroundColor',
55+
'borderColor',
56+
'borderWidth',
57+
'hoverBackgroundColor',
58+
'hoverBorderColor',
59+
'hoverBorderWidth',
60+
'hoverRadius',
61+
'hitRadius',
62+
'pointStyle',
63+
'rotation'
64+
],
65+
5066
/**
5167
* @protected
5268
*/
@@ -70,7 +86,7 @@ module.exports = DatasetController.extend({
7086
var custom = point.custom || {};
7187
var xScale = me.getScaleForId(meta.xAxisID);
7288
var yScale = me.getScaleForId(meta.yAxisID);
73-
var options = me._resolveElementOptions(point, index);
89+
var options = me._resolveDataElementOptions(point, index);
7490
var data = me.getDataset().data[index];
7591
var dsIndex = me.index;
7692

@@ -122,17 +138,13 @@ module.exports = DatasetController.extend({
122138
/**
123139
* @private
124140
*/
125-
_resolveElementOptions: function(point, index) {
141+
_resolveDataElementOptions: function(point, index) {
126142
var me = this;
127143
var chart = me.chart;
128-
var datasets = chart.data.datasets;
129-
var dataset = datasets[me.index];
130-
var datasetOpts = me._config;
144+
var dataset = me.getDataset();
131145
var custom = point.custom || {};
132-
var options = chart.options.elements.point;
133-
var data = dataset.data[index];
134-
var values = {};
135-
var i, ilen, key;
146+
var data = dataset.data[index] || {};
147+
var values = DatasetController.prototype._resolveDataElementOptions.apply(me, arguments);
136148

137149
// Scriptable options
138150
var context = {
@@ -142,34 +154,12 @@ module.exports = DatasetController.extend({
142154
datasetIndex: me.index
143155
};
144156

145-
var keys = [
146-
'backgroundColor',
147-
'borderColor',
148-
'borderWidth',
149-
'hoverBackgroundColor',
150-
'hoverBorderColor',
151-
'hoverBorderWidth',
152-
'hoverRadius',
153-
'hitRadius',
154-
'pointStyle',
155-
'rotation'
156-
];
157-
158-
for (i = 0, ilen = keys.length; i < ilen; ++i) {
159-
key = keys[i];
160-
values[key] = resolve([
161-
custom[key],
162-
datasetOpts[key],
163-
options[key]
164-
], context, index);
165-
}
166-
167157
// Custom radius resolution
168158
values.radius = resolve([
169159
custom.radius,
170-
data ? data.r : undefined,
171-
dataset.radius,
172-
options.radius
160+
data.r,
161+
me._config.radius,
162+
chart.options.elements.point.radius
173163
], context, index);
174164

175165
return values;

src/controllers/controller.doughnut.js

Lines changed: 20 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ var defaults = require('../core/core.defaults');
55
var elements = require('../elements/index');
66
var helpers = require('../helpers/index');
77

8-
var resolve = helpers.options.resolve;
98
var valueOrDefault = helpers.valueOrDefault;
109

1110
var PI = Math.PI;
@@ -50,20 +49,14 @@ defaults._set('doughnut', {
5049
if (data.labels.length && data.datasets.length) {
5150
return data.labels.map(function(label, i) {
5251
var meta = chart.getDatasetMeta(0);
53-
var ds = data.datasets[0];
54-
var arc = meta.data[i];
55-
var custom = arc && arc.custom || {};
56-
var arcOpts = chart.options.elements.arc;
57-
var fill = resolve([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i);
58-
var stroke = resolve([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i);
59-
var bw = resolve([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i);
52+
var style = meta.controller.getStyle(i);
6053

6154
return {
6255
text: label,
63-
fillStyle: fill,
64-
strokeStyle: stroke,
65-
lineWidth: bw,
66-
hidden: isNaN(ds.data[i]) || meta.data[i].hidden,
56+
fillStyle: style.backgroundColor,
57+
strokeStyle: style.borderColor,
58+
lineWidth: style.borderWidth,
59+
hidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,
6760

6861
// Extra data used for toggling the correct item
6962
index: i
@@ -131,6 +124,19 @@ module.exports = DatasetController.extend({
131124

132125
linkScales: helpers.noop,
133126

127+
/**
128+
* @private
129+
*/
130+
_dataElementOptions: [
131+
'backgroundColor',
132+
'borderColor',
133+
'borderWidth',
134+
'borderAlign',
135+
'hoverBackgroundColor',
136+
'hoverBorderColor',
137+
'hoverBorderWidth',
138+
],
139+
134140
// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly
135141
getRingIndex: function(datasetIndex) {
136142
var ringIndex = 0;
@@ -184,7 +190,7 @@ module.exports = DatasetController.extend({
184190
}
185191

186192
for (i = 0, ilen = arcs.length; i < ilen; ++i) {
187-
arcs[i]._options = me._resolveElementOptions(arcs[i], i);
193+
arcs[i]._options = me._resolveDataElementOptions(arcs[i], i);
188194
}
189195

190196
chart.borderWidth = me.getMaxBorderWidth();
@@ -317,7 +323,7 @@ module.exports = DatasetController.extend({
317323
arc = arcs[i];
318324
if (controller) {
319325
controller._configure();
320-
options = controller._resolveElementOptions(arc, i);
326+
options = controller._resolveDataElementOptions(arc, i);
321327
} else {
322328
options = arc._options;
323329
}
@@ -351,49 +357,6 @@ module.exports = DatasetController.extend({
351357
model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth);
352358
},
353359

354-
/**
355-
* @private
356-
*/
357-
_resolveElementOptions: function(arc, index) {
358-
var me = this;
359-
var chart = me.chart;
360-
var dataset = me.getDataset();
361-
var datasetOpts = me._config;
362-
var custom = arc.custom || {};
363-
var options = chart.options.elements.arc;
364-
var values = {};
365-
var i, ilen, key;
366-
367-
// Scriptable options
368-
var context = {
369-
chart: chart,
370-
dataIndex: index,
371-
dataset: dataset,
372-
datasetIndex: me.index
373-
};
374-
375-
var keys = [
376-
'backgroundColor',
377-
'borderColor',
378-
'borderWidth',
379-
'borderAlign',
380-
'hoverBackgroundColor',
381-
'hoverBorderColor',
382-
'hoverBorderWidth',
383-
];
384-
385-
for (i = 0, ilen = keys.length; i < ilen; ++i) {
386-
key = keys[i];
387-
values[key] = resolve([
388-
custom[key],
389-
datasetOpts[key],
390-
options[key]
391-
], context, index);
392-
}
393-
394-
return values;
395-
},
396-
397360
/**
398361
* Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly
399362
* @private

0 commit comments

Comments
 (0)