]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Make sure data is parsed before updateElements (#9187)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Sun, 30 May 2021 18:51:11 +0000 (21:51 +0300)
committerJukka Kurkela <jukka.kurkela@gmail.com>
Sun, 30 May 2021 18:56:17 +0000 (21:56 +0300)
* Make sure data is parsed before updateElements
* Add test

src/core/core.datasetController.js
test/specs/core.datasetController.tests.js

index 81d865810e45300446a2d827cff055b923312062..231ade5fa1978d5b5233d4ab7461b4e91cd01763 100644 (file)
@@ -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);
+    }
   }
 
   /**
index dfc2dd8d5ab8d09d45b65d8505aa36976bc73173..5ceeae205cb097256e602d0fd4bbeb286e3039e8 100644 (file)
@@ -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() {