Skip to content

Commit 5c9f115

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 88308c6 commit 5c9f115

File tree

2 files changed

+219
-63
lines changed

2 files changed

+219
-63
lines changed

src/plugins/plugin.legend.js

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

6281
// Below is extra data used for toggling the datasets
6382
datasetIndex: i
@@ -383,10 +402,10 @@ var Legend = Element.extend({
383402
helpers.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);
384403
} else {
385404
// Draw box as legend symbol
405+
ctx.fillRect(x, y, boxWidth, fontSize);
386406
if (!isLineWidthZero) {
387407
ctx.strokeRect(x, y, boxWidth, fontSize);
388408
}
389-
ctx.fillRect(x, y, boxWidth, fontSize);
390409
}
391410

392411
ctx.restore();

0 commit comments

Comments
 (0)