From b314d73a35c6c9566e1d4a704130e060cb549636 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Thu, 18 Mar 2021 17:14:37 +0200 Subject: [PATCH 1/3] Fix category scale invalid data handling --- src/scales/scale.category.js | 7 ++- test/fixtures/scale.category/invalid-data.js | 41 ++++++++++++++++++ test/fixtures/scale.category/invalid-data.png | Bin 0 -> 4013 bytes 3 files changed, 46 insertions(+), 2 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 c6efd61b8f4..25035d1cf5c 100644 --- a/src/scales/scale.category.js +++ b/src/scales/scale.category.js @@ -1,5 +1,5 @@ import Scale from '../core/core.scale'; -import {valueOrDefault} from '../helpers'; +import {isNullOrUndef, valueOrDefault} from '../helpers'; function findOrAddLabel(labels, raw, index) { const first = labels.indexOf(raw); @@ -21,6 +21,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 +99,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 00000000000..f238209eb3a --- /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: 5, y: NaN}, + {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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 QzTtqefjPGJlH0xi0Q-D Date: Thu, 18 Mar 2021 17:28:44 +0200 Subject: [PATCH 2/3] Fix NaN --- src/scales/scale.category.js | 2 +- test/fixtures/scale.category/invalid-data.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scales/scale.category.js b/src/scales/scale.category.js index 25035d1cf5c..6d589d90a85 100644 --- a/src/scales/scale.category.js +++ b/src/scales/scale.category.js @@ -4,7 +4,7 @@ import {isNullOrUndef, valueOrDefault} from '../helpers'; function findOrAddLabel(labels, raw, index) { const first = labels.indexOf(raw); if (first === -1) { - return typeof raw === 'string' ? labels.push(raw) - 1 : index; + return typeof raw === 'string' ? labels.push(raw) - 1 : isNaN(raw) ? null : index; } const last = labels.lastIndexOf(raw); return first !== last ? index : first; diff --git a/test/fixtures/scale.category/invalid-data.js b/test/fixtures/scale.category/invalid-data.js index f238209eb3a..33d1ee58b9b 100644 --- a/test/fixtures/scale.category/invalid-data.js +++ b/test/fixtures/scale.category/invalid-data.js @@ -10,7 +10,7 @@ module.exports = { {x: 2, y: 1}, {x: undefined, y: 1}, {x: 4, y: 1}, - {x: 5, y: NaN}, + {x: NaN, y: 1}, {x: 6, y: 1} ], backgroundColor: 'red', From 4f61475f1744f74bf5b9c118d6247a31ef994826 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Thu, 18 Mar 2021 17:36:32 +0200 Subject: [PATCH 3/3] cc --- src/scales/scale.category.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/scales/scale.category.js b/src/scales/scale.category.js index 6d589d90a85..175bd3e8fde 100644 --- a/src/scales/scale.category.js +++ b/src/scales/scale.category.js @@ -1,10 +1,14 @@ import Scale from '../core/core.scale'; 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 : isNaN(raw) ? null : index; + return addIfString(labels, raw, index); } const last = labels.lastIndexOf(raw); return first !== last ? index : first;