Skip to content

Commit 340d369

Browse files
committed
Make legend appearance consistent with chart elements
- Use the default value for each element type if a property is not set - Stroke after fill to move borders to the front - Support property arrays - Use point's colors and border width when usePointStyle is true - Disable line styles when usePointStyle is true or the dataset type is not 'line' or 'radar' - Fix the existing tests and add more tests
1 parent ef507e1 commit 340d369

File tree

2 files changed

+243
-63
lines changed

2 files changed

+243
-63
lines changed

src/plugins/plugin.legend.js

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,36 @@ defaults._set('global', {
4848
generateLabels: function(chart) {
4949
var data = chart.data;
5050
return helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {
51+
var type = chart.getDatasetMeta(i).type;
52+
var options = chart.options;
53+
var legendOpts = options.legend;
54+
var valueAtIndexOrDefault = helpers.valueAtIndexOrDefault;
55+
var valueOrDefault = helpers.valueOrDefault;
56+
57+
var usePointStyle = legendOpts && legendOpts.labels && legendOpts.labels.usePointStyle;
58+
var backgroundColor = usePointStyle ? valueAtIndexOrDefault(dataset.pointBackgroundColor, 0, dataset.backgroundColor) : dataset.backgroundColor;
59+
var borderWidth = usePointStyle ? valueAtIndexOrDefault(dataset.pointBorderWidth, 0, dataset.borderWidth) : dataset.borderWidth;
60+
var borderColor = usePointStyle ? valueAtIndexOrDefault(dataset.pointBorderColor, 0, dataset.borderColor) : dataset.borderColor;
61+
62+
var useLineStyles = (type === 'line' || type === 'radar') && !usePointStyle;
63+
var borderCapStyle = useLineStyles ? dataset.borderCapStyle : 'butt';
64+
var borderDash = useLineStyles ? dataset.borderDash : [];
65+
var borderDashOffset = useLineStyles ? dataset.borderDashOffset : 0;
66+
var borderJoinStyle = useLineStyles ? dataset.borderJoinStyle : 'miter';
67+
68+
var elementOpts = options.elements[useLineStyles ? 'line' : type === 'bar' ? 'rectangle' : 'point'];
69+
5170
return {
5271
text: dataset.label,
53-
fillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),
72+
fillStyle: valueAtIndexOrDefault(backgroundColor, 0, elementOpts.backgroundColor),
5473
hidden: !chart.isDatasetVisible(i),
55-
lineCap: dataset.borderCapStyle,
56-
lineDash: dataset.borderDash,
57-
lineDashOffset: dataset.borderDashOffset,
58-
lineJoin: dataset.borderJoinStyle,
59-
lineWidth: dataset.borderWidth,
60-
strokeStyle: dataset.borderColor,
61-
pointStyle: dataset.pointStyle,
74+
lineCap: valueOrDefault(borderCapStyle, elementOpts.borderCapStyle),
75+
lineDash: valueOrDefault(borderDash, elementOpts.borderDash),
76+
lineDashOffset: valueOrDefault(borderDashOffset, elementOpts.borderDashOffset),
77+
lineJoin: valueOrDefault(borderJoinStyle, elementOpts.borderJoinStyle),
78+
lineWidth: valueAtIndexOrDefault(borderWidth, 0, elementOpts.borderWidth),
79+
strokeStyle: valueAtIndexOrDefault(borderColor, 0, elementOpts.borderColor),
80+
pointStyle: valueAtIndexOrDefault(dataset.pointStyle, 0, elementOpts.pointStyle),
6281

6382
// Below is extra data used for toggling the datasets
6483
datasetIndex: i
@@ -377,10 +396,10 @@ var Legend = Element.extend({
377396
helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);
378397
} else {
379398
// Draw box as legend symbol
399+
ctx.fillRect(x, y, boxWidth, fontSize);
380400
if (lineWidth !== 0) {
381401
ctx.strokeRect(x, y, boxWidth, fontSize);
382402
}
383-
ctx.fillRect(x, y, boxWidth, fontSize);
384403
}
385404

386405
ctx.restore();

0 commit comments

Comments
 (0)