Skip to content

Commit 3c0bad6

Browse files
committed
Per-controller options to fix mixed charts
1 parent 17f6fd2 commit 3c0bad6

File tree

6 files changed

+113
-17
lines changed

6 files changed

+113
-17
lines changed

src/controllers/controller.line.js

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ var resolve = helpers.options.resolve;
1010
var isPointInArea = helpers.canvas._isPointInArea;
1111

1212
defaults._set('line', {
13-
showLines: true,
14-
spanGaps: false,
15-
1613
hover: {
1714
mode: 'label'
1815
},
@@ -29,9 +26,12 @@ defaults._set('line', {
2926
}
3027
});
3128

32-
function lineEnabled(dataset, options) {
33-
return valueOrDefault(dataset.showLine, options.showLines);
34-
}
29+
defaults._set('datasets', {
30+
line: {
31+
showLine: true,
32+
spanGaps: false
33+
}
34+
});
3535

3636
module.exports = DatasetController.extend({
3737

@@ -44,9 +44,11 @@ module.exports = DatasetController.extend({
4444
var meta = me.getMeta();
4545
var line = meta.dataset;
4646
var points = meta.data || [];
47+
var options = me.chart.options;
4748
var scale = me.getScaleForId(meta.yAxisID);
4849
var dataset = me.getDataset();
49-
var showLine = lineEnabled(dataset, me.chart.options);
50+
var datasetDefaults = me._defaults();
51+
var showLine = me._showLine = resolve([dataset.showLine, options.showLines, datasetDefaults.showLine]);
5052
var i, ilen;
5153

5254
// Update Line
@@ -181,6 +183,7 @@ module.exports = DatasetController.extend({
181183
var dataset = chart.data.datasets[me.index];
182184
var custom = element.custom || {};
183185
var options = chart.options;
186+
var datasetDefaults = me._defaults();
184187
var elementOptions = options.elements.line;
185188
var values = {};
186189
var i, ilen, key;
@@ -202,16 +205,17 @@ module.exports = DatasetController.extend({
202205
values[key] = resolve([
203206
custom[key],
204207
dataset[key],
205-
elementOptions[key]
208+
elementOptions[key],
209+
datasetDefaults[key]
206210
]);
207211
}
208212

209213
// The default behavior of lines is to break at null values, according
210214
// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158
211215
// This option gives lines the ability to span gaps
212-
values.spanGaps = valueOrDefault(dataset.spanGaps, options.spanGaps);
213-
values.tension = resolve([custom.tension, dataset.lineTension, elementOptions.tension]);
214-
values.steppedLine = resolve([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]);
216+
values.spanGaps = valueOrDefault(dataset.spanGaps, options.spanGaps, datasetDefaults.spanGaps);
217+
values.tension = resolve([custom.tension, dataset.lineTension, elementOptions.tension, datasetDefaults.tension]);
218+
values.steppedLine = resolve([custom.steppedLine, dataset.steppedLine, elementOptions.stepped, datasetDefaults.steppedLine]);
215219

216220
return values;
217221
},
@@ -311,11 +315,11 @@ module.exports = DatasetController.extend({
311315
var meta = me.getMeta();
312316
var points = meta.data || [];
313317
var area = chart.chartArea;
314-
var ilen = points.length;
315318
var halfBorderWidth;
316319
var i = 0;
320+
var ilen = points.length;
317321

318-
if (lineEnabled(me.getDataset(), chart.options)) {
322+
if (me._showLine) {
319323
halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2;
320324

321325
helpers.canvas.clipArea(chart.ctx, {

src/controllers/controller.scatter.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ defaults._set('scatter', {
2121
}]
2222
},
2323

24-
showLines: false,
25-
2624
tooltips: {
2725
callbacks: {
2826
title: function() {
@@ -35,5 +33,11 @@ defaults._set('scatter', {
3533
}
3634
});
3735

36+
defaults._set('datasets', {
37+
scatter: {
38+
showLine: false
39+
}
40+
});
41+
3842
// Scatter charts use line controllers
3943
module.exports = LineController;

src/core/core.datasetController.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
'use strict';
22

3+
var defaults = require('../core/core.defaults');
34
var helpers = require('../helpers/index');
45

56
var resolve = helpers.options.resolve;
@@ -100,6 +101,7 @@ helpers.extend(DatasetController.prototype, {
100101
me.index = datasetIndex;
101102
me.linkScales();
102103
me.addElements();
104+
me._type = me.getMeta().type;
103105
},
104106

105107
updateIndex: function(datasetIndex) {
@@ -234,6 +236,15 @@ helpers.extend(DatasetController.prototype, {
234236
me.resyncElements();
235237
},
236238

239+
/**
240+
* Returns the default dataset-level options
241+
* @private
242+
*/
243+
_defaults: function() {
244+
var me = this;
245+
return defaults.datasets[me._type] || {};
246+
},
247+
237248
update: helpers.noop,
238249

239250
transition: function(easingValue) {

src/core/core.defaults.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ defaults._set('global', {
1717
defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
1818
defaultFontSize: 12,
1919
defaultFontStyle: 'normal',
20-
defaultLineHeight: 1.2,
21-
showLines: true
20+
defaultLineHeight: 1.2
2221
});
2322

2423
module.exports = defaults;

test/specs/controller.line.tests.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,61 @@ describe('Chart.controllers.line', function() {
573573
expect(meta.dataset._model.borderWidth).toBe(0.55);
574574
});
575575

576+
it('should fall back to the dataset default spanGaps option', function() {
577+
var chart = window.acquireChart({
578+
type: 'line',
579+
data: {
580+
datasets: [{
581+
data: [0, 0],
582+
label: 'dataset1'
583+
}],
584+
labels: ['label1', 'label2']
585+
}
586+
});
587+
588+
var meta = chart.getDatasetMeta(0);
589+
590+
expect(meta.dataset._model.spanGaps).toBe(false);
591+
});
592+
593+
it('should obey the global spanGaps option', function() {
594+
var chart = window.acquireChart({
595+
type: 'line',
596+
data: {
597+
datasets: [{
598+
data: [0, 0],
599+
label: 'dataset1'
600+
}],
601+
labels: ['label1', 'label2']
602+
},
603+
options: {
604+
spanGaps: true
605+
}
606+
});
607+
608+
var meta = chart.getDatasetMeta(0);
609+
610+
expect(meta.dataset._model.spanGaps).toBe(true);
611+
});
612+
613+
it('should obey the dataset spanGaps option', function() {
614+
var chart = window.acquireChart({
615+
type: 'line',
616+
data: {
617+
datasets: [{
618+
data: [0, 0],
619+
label: 'dataset1',
620+
spanGaps: true
621+
}],
622+
labels: ['label1', 'label2']
623+
}
624+
});
625+
626+
var meta = chart.getDatasetMeta(0);
627+
628+
expect(meta.dataset._model.spanGaps).toBe(true);
629+
});
630+
576631
it('should handle number of data point changes in update', function() {
577632
var chart = window.acquireChart({
578633
type: 'line',

test/specs/controller.scatter.test.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,28 @@ describe('Chart.controllers.scatter', function() {
4747
expect(meta.dataset.draw.calls.count()).toBe(0);
4848
expect(meta.data[0].draw.calls.count()).toBe(1);
4949
});
50+
51+
it('should draw a line if true', function() {
52+
var chart = window.acquireChart({
53+
type: 'scatter',
54+
data: {
55+
datasets: [{
56+
data: [{x: 10, y: 15}],
57+
showLine: true,
58+
label: 'dataset1'
59+
}],
60+
},
61+
options: {}
62+
});
63+
64+
var meta = chart.getDatasetMeta(0);
65+
spyOn(meta.dataset, 'draw');
66+
spyOn(meta.data[0], 'draw');
67+
68+
chart.update();
69+
70+
expect(meta.dataset.draw.calls.count()).toBe(1);
71+
expect(meta.data[0].draw.calls.count()).toBe(1);
72+
});
5073
});
5174
});

0 commit comments

Comments
 (0)