From 851861e9cce4c54c74dc4758b419aa0b6622cde0 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Thu, 18 Mar 2021 22:34:08 +0200 Subject: [PATCH] Fix category scale invalid data handling (#8668) * Fix category scale invalid data handling * Fix NaN --- src/scales/scale.category.js | 13 ++++-- test/fixtures/scale.category/invalid-data.js | 41 ++++++++++++++++++ test/fixtures/scale.category/invalid-data.png | Bin 0 -> 4013 bytes 3 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/scale.category/invalid-data.js create mode 100644 test/fixtures/scale.category/invalid-data.png diff --git a/src/scales/scale.category.js b/src/scales/scale.category.js index c6efd61b8..175bd3e8f 100644 --- a/src/scales/scale.category.js +++ b/src/scales/scale.category.js @@ -1,10 +1,14 @@ import Scale from '../core/core.scale'; -import {valueOrDefault} from '../helpers'; +import {isNullOrUndef, valueOrDefault} from '../helpers'; + +const addIfString = (labels, raw, index) => typeof raw === 'string' + ? labels.push(raw) - 1 + : isNaN(raw) ? null : index; function findOrAddLabel(labels, raw, index) { const first = labels.indexOf(raw); if (first === -1) { - return typeof raw === 'string' ? labels.push(raw) - 1 : index; + return addIfString(labels, raw, index); } const last = labels.lastIndexOf(raw); return first !== last ? index : first; @@ -21,6 +25,9 @@ export default class CategoryScale extends Scale { } parse(raw, index) { + if (isNullOrUndef(raw)) { + return null; + } const labels = this.getLabels(); return isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw)); @@ -96,7 +103,7 @@ export default class CategoryScale extends Scale { value = me.parse(value); } - return me.getPixelForDecimal((value - me._startValue) / me._valueRange); + return value === null ? NaN : me.getPixelForDecimal((value - me._startValue) / me._valueRange); } // Must override base implementation because it calls getPixelForValue diff --git a/test/fixtures/scale.category/invalid-data.js b/test/fixtures/scale.category/invalid-data.js new file mode 100644 index 000000000..33d1ee58b --- /dev/null +++ b/test/fixtures/scale.category/invalid-data.js @@ -0,0 +1,41 @@ +module.exports = { + config: { + type: 'line', + data: { + labels: ['a', 'b', 'c', 'd', 'e', 'f', 'g'], + datasets: [{ + data: [ + {x: 'a', y: 1}, + {x: null, y: 1}, + {x: 2, y: 1}, + {x: undefined, y: 1}, + {x: 4, y: 1}, + {x: NaN, y: 1}, + {x: 6, y: 1} + ], + backgroundColor: 'red', + borderColor: 'red', + borderWidth: 5 + }] + }, + options: { + scales: { + y: { + display: false + }, + x: { + grid: { + display: false + } + } + } + } + }, + options: { + spriteText: true, + canvas: { + width: 256, + height: 256 + } + } +}; diff --git a/test/fixtures/scale.category/invalid-data.png b/test/fixtures/scale.category/invalid-data.png new file mode 100644 index 0000000000000000000000000000000000000000..126c0c888d49231ada520794a6a125e49c42f2ad GIT binary patch literal 4013 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 Nv4J_J?yB2^{{Z`ZdyN19 literal 0 Hc-jL100001 -- 2.47.3