From 3c480d849ccfd3f7ebf65e35a3957d39d9b63539 Mon Sep 17 00:00:00 2001 From: Ben McCann Date: Sun, 30 Jul 2017 12:13:48 -0700 Subject: [PATCH] Allow updating dataset types --- src/core/core.controller.js | 30 ++++++++++++++++++------- test/specs/core.controller.tests.js | 35 +++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/core/core.controller.js b/src/core/core.controller.js index 1dbf90f0162..52157c82059 100644 --- a/src/core/core.controller.js +++ b/src/core/core.controller.js @@ -289,9 +289,13 @@ module.exports = function(Chart) { helpers.each(me.data.datasets, function(dataset, datasetIndex) { var meta = me.getDatasetMeta(datasetIndex); - if (!meta.type) { - meta.type = dataset.type || me.config.type; + var type = dataset.type || me.config.type; + + if (meta.type && meta.type !== type) { + me.destroyDatasetMeta(datasetIndex); + meta = me.getDatasetMeta(datasetIndex); } + meta.type = type; types.push(meta.type); @@ -672,20 +676,30 @@ module.exports = function(Chart) { return this.options.legendCallback(this); }, + /** + * @private + */ + destroyDatasetMeta: function(datasetIndex) { + var id = this.id; + var dataset = this.data.datasets[datasetIndex]; + var meta = dataset._meta && dataset._meta[id]; + + if (meta) { + meta.controller.destroy(); + delete dataset._meta[id]; + } + }, + destroy: function() { var me = this; var canvas = me.canvas; - var meta, i, ilen; + var i, ilen; me.stop(); // dataset controllers need to cleanup associated data for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { - meta = me.getDatasetMeta(i); - if (meta.controller) { - meta.controller.destroy(); - meta.controller = null; - } + me.destroyDatasetMeta(i); } if (canvas) { diff --git a/test/specs/core.controller.tests.js b/test/specs/core.controller.tests.js index 4c6e6185865..ea4950a76c5 100644 --- a/test/specs/core.controller.tests.js +++ b/test/specs/core.controller.tests.js @@ -693,6 +693,41 @@ describe('Chart', function() { chart.update(); expect(chart.tooltip._options).toEqual(jasmine.objectContaining(newTooltipConfig)); }); + + it ('should update the metadata', function() { + var cfg = { + data: { + labels: ['A', 'B', 'C', 'D'], + datasets: [{ + type: 'line', + data: [10, 20, 30, 0] + }] + }, + options: { + responsive: true, + scales: { + xAxes: [{ + type: 'time' + }], + yAxes: [{ + scaleLabel: { + display: true, + labelString: 'Value' + } + }] + } + } + }; + var chart = acquireChart(cfg); + var meta = chart.getDatasetMeta(0); + expect(meta.type).toBe('line'); + + // change the dataset to bar and check that meta was updated + chart.config.data.datasets[0].type = 'bar'; + chart.update(); + meta = chart.getDatasetMeta(0); + expect(meta.type).toBe('bar'); + }); }); describe('plugin.extensions', function() {