Skip to content

Commit

Permalink
Make sure data is parsed before updateElements (#9187)
Browse files Browse the repository at this point in the history
* Make sure data is parsed before updateElements
* Add test
  • Loading branch information
kurkle committed May 30, 2021
1 parent 9bfa7cc commit 33a4927
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 5 deletions.
11 changes: 6 additions & 5 deletions src/core/core.datasetController.js
Expand Up @@ -933,18 +933,19 @@ 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:
// chart.data.datasets[0].data[5] = 10;
// 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);
}
}

/**
Expand Down
55 changes: 55 additions & 0 deletions test/specs/core.datasetController.tests.js
Expand Up @@ -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: {
Expand Down Expand Up @@ -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() {
Expand Down

0 comments on commit 33a4927

Please sign in to comment.