]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
fix: calc visible points on update #10467 (#10523)
authorDan Onoshko <danon0404@gmail.com>
Thu, 28 Jul 2022 11:46:00 +0000 (18:46 +0700)
committerGitHub <noreply@github.com>
Thu, 28 Jul 2022 11:46:00 +0000 (07:46 -0400)
src/controllers/controller.line.js
src/helpers/helpers.collection.js
test/specs/controller.line.tests.js

index 9e799cd5567579456455c70d2424f28c1ae11026..b28997aad07e27ec14133f304475fd7d200833ce 100644 (file)
@@ -153,8 +153,8 @@ function getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {
     }
     if (maxDefined) {
       count = _limitValue(Math.max(
-        _lookupByKey(_parsed, iScale.axis, max).hi + 1,
-        animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max)).hi + 1),
+        _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,
+        animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1),
       start, pointCount) - start;
     } else {
       count = pointCount - start;
index 7280117afc80733f14f71e87935502dd9586190c..5b2369808a04196c3691b24a73b47b097b35a0fe 100644 (file)
@@ -30,10 +30,13 @@ export function _lookup(table, value, cmp) {
  * @param {array} table - the table search. must be sorted!
  * @param {string} key - property name for the value in each entry
  * @param {number} value - value to find
+ * @param {boolean} [last] - lookup last index
  * @private
  */
-export const _lookupByKey = (table, key, value) =>
-  _lookup(table, value, index => table[index][key] < value);
+export const _lookupByKey = (table, key, value, last) =>
+  _lookup(table, value, last
+    ? index => table[index][key] <= value
+    : index => table[index][key] < value);
 
 /**
  * Reverse binary search
index d166a4be36436068aaa918e0d335069f8d57fee8..c4f2fcd61f750333a70a1402a1070a208d6dd76b 100644 (file)
@@ -1016,4 +1016,51 @@ describe('Chart.controllers.line', function() {
       expect(point.stop).toBe(i === 3);
     }
   });
+
+  it('should correctly calc visible points on update', async() => {
+    var chart = window.acquireChart({
+      type: 'line',
+      data: {
+        datasets: [{
+          data: [
+            {x: 10, y: 20},
+            {x: 15, y: 19},
+          ]
+        }],
+      },
+      options: {
+        scales: {
+          y: {
+            type: 'linear',
+            min: 0,
+            max: 25,
+          },
+          x: {
+            type: 'linear',
+            min: 0,
+            max: 50
+          },
+        }
+      }
+    });
+
+    chart.data.datasets[0].data = [
+      {x: 10, y: 20},
+      {x: 15, y: 19},
+      {x: 17, y: 12},
+      {x: 50, y: 9},
+      {x: 50, y: 9},
+      {x: 50, y: 9},
+    ];
+    chart.update();
+
+    var point = chart.getDatasetMeta(0).data[0];
+    var event = {
+      type: 'mousemove',
+      native: true,
+      ...point
+    };
+
+    chart._handleEvent(event, false, true);
+  }, 500);
 });