From 4ac38d033e2b914f1cd1f60eadbf40b397ca88db Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Sun, 30 May 2021 21:51:11 +0300 Subject: [PATCH] Make sure data is parsed before updateElements (#9187) * Make sure data is parsed before updateElements * Add test --- src/core/core.datasetController.js | 11 +++-- test/specs/core.datasetController.tests.js | 55 ++++++++++++++++++++++ 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 81d865810e4..231ade5fa19 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -933,11 +933,6 @@ export default class DatasetController { const numData = data.length; const count = Math.min(numData, numMeta); - if (numData > numMeta) { - me._insertElements(numMeta, numData - numMeta, resetNewElements); - } else if (numData < numMeta) { - me._removeElements(numData, numMeta - numData); - } if (count) { // TODO: It is not optimal to always parse the old data // This is done because we are not detecting direct assignments: @@ -945,6 +940,12 @@ export default class DatasetController { // chart.data.datasets[0].data[5].y = 10; me.parse(0, count); } + + if (numData > numMeta) { + me._insertElements(numMeta, numData - numMeta, resetNewElements); + } else if (numData < numMeta) { + me._removeElements(numData, numMeta - numData); + } } /** diff --git a/test/specs/core.datasetController.tests.js b/test/specs/core.datasetController.tests.js index dfc2dd8d5ab..5ceeae205cb 100644 --- a/test/specs/core.datasetController.tests.js +++ b/test/specs/core.datasetController.tests.js @@ -379,6 +379,8 @@ describe('Chart.DatasetController', function() { it('should re-synchronize metadata when the data object reference changes', function() { var data0 = [0, 1, 2, 3, 4, 5]; var data1 = [6, 7, 8]; + var data2 = [1, 2, 3, 4, 5, 6, 7, 8]; + var chart = acquireChart({ type: 'line', data: { @@ -410,6 +412,59 @@ describe('Chart.DatasetController', function() { expect(meta.data.length).toBe(6); expect(meta._parsed.map(p => p.y)).toEqual(data0); + + chart.data.datasets[0].data = data2; + chart.update(); + + expect(meta.data.length).toBe(8); + expect(meta._parsed.map(p => p.y)).toEqual(data2); + }); + + it('should re-synchronize metadata when the data object reference changes, with animation', function() { + var data0 = [0, 1, 2, 3, 4, 5]; + var data1 = [6, 7, 8]; + var data2 = [1, 2, 3, 4, 5, 6, 7, 8]; + + var chart = acquireChart({ + type: 'line', + data: { + datasets: [{ + data: data0 + }] + }, + options: { + animation: true + } + }); + + var meta = chart.getDatasetMeta(0); + + expect(meta.data.length).toBe(6); + expect(meta._parsed.map(p => p.y)).toEqual(data0); + const point0 = meta.data[0]; + + chart.data.datasets[0].data = data1; + chart.update(); + + expect(meta.data.length).toBe(3); + expect(meta._parsed.map(p => p.y)).toEqual(data1); + expect(meta.data[0]).toEqual(point0); + + data1.push(9); + chart.update(); + expect(meta.data.length).toBe(4); + + chart.data.datasets[0].data = data0; + chart.update(); + + expect(meta.data.length).toBe(6); + expect(meta._parsed.map(p => p.y)).toEqual(data0); + + chart.data.datasets[0].data = data2; + chart.update(); + + expect(meta.data.length).toBe(8); + expect(meta._parsed.map(p => p.y)).toEqual(data2); }); it('should re-synchronize metadata when data are unusually altered', function() {