]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Return false from the average tooltip positioner on no valid data (#11863)
authorJacco van den Berg <jaccoberg2281@gmail.com>
Sat, 17 Aug 2024 06:52:36 +0000 (08:52 +0200)
committerGitHub <noreply@github.com>
Sat, 17 Aug 2024 06:52:36 +0000 (08:52 +0200)
src/core/core.scale.js
src/plugins/plugin.tooltip.js
test/specs/plugin.tooltip.tests.js

index 3265e103d1a8c4f80c9cbeed780e662f66932018..dcf4bd00b2b8091841295716366a1ddccad49dfb 100644 (file)
@@ -301,7 +301,6 @@ export default class Scale extends Element {
         * @since 3.0
         */
   getMinMax(canStack) {
-    // eslint-disable-next-line prefer-const
     let {min, max, minDefined, maxDefined} = this.getUserBounds();
     let range;
 
index e76b1479e06d05f49da0cb276390013365cf819a..b39681ce2ca88a631e4273de7c3133a1c32c1b4b 100644 (file)
@@ -38,6 +38,11 @@ const positioners = {
       }
     }
 
+    // No visible items where found, return false so we don't have to divide by 0 which reduces in NaN
+    if (count === 0 || xSet.size === 0) {
+      return false;
+    }
+
     const xAverage = [...xSet].reduce((a, b) => a + b) / xSet.size;
 
     return {
index 69e8c7f64c9952edc28d22b5ba323163f12f8d9f..94ae45b7246cfbbb55add088e5ee1f9010b73d2f 100644 (file)
@@ -1144,6 +1144,15 @@ describe('Plugin.Tooltip', function() {
       expect(tooltipModel.caretX).not.toBe(xPositionArrayAverage);
       expect(tooltipModel.caretX).toBe(xPositionSetAverage);
     });
+
+    it('Should not fail with all hiden data elements on the average positioner', function() {
+      const averagePositioner = tooltipPlugin.positioners.average;
+
+      // Simulate `hasValue` returns false
+      expect(() => averagePositioner([{x: 'invalidNumber', y: 'invalidNumber'}])).not.toThrow();
+      const result = averagePositioner([{x: 'invalidNumber', y: 'invalidNumber'}]);
+      expect(result).toBe(false);
+    });
   });
 
   it('Should avoid tooltip truncation in x axis if there is enough space to show tooltip without truncation', async function() {