From 3b9184b5558efb69f2cc4d582c54b8236c17686f Mon Sep 17 00:00:00 2001 From: archmoj Date: Tue, 30 Jun 2020 14:57:23 -0400 Subject: [PATCH] apply numeric sort for parcats when only include numbers - fix issue 4972 --- src/traces/parcats/calc.js | 17 ++++++-- test/image/baselines/parcats_numeric_sort.png | Bin 0 -> 6305 bytes test/image/mocks/parcats_numeric_sort.json | 40 ++++++++++++++++++ test/jasmine/tests/mock_test.js | 2 + 4 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 test/image/baselines/parcats_numeric_sort.png create mode 100644 test/image/mocks/parcats_numeric_sort.json diff --git a/src/traces/parcats/calc.js b/src/traces/parcats/calc.js index 510f4eba655..51ef5e28bfa 100644 --- a/src/traces/parcats/calc.js +++ b/src/traces/parcats/calc.js @@ -16,6 +16,7 @@ var colorscaleCalc = require('../../components/colorscale/calc'); var filterUnique = require('../../lib/filter_unique.js'); var Drawing = require('../../components/drawing'); var Lib = require('../../lib'); +var isNumeric = require('fast-isnumeric'); /** * Create a wrapped ParcatsModel object from trace @@ -40,9 +41,19 @@ module.exports = function calc(gd, trace) { // then add extra to the end in trace order categoryValues = dim.categoryarray; } else { - // Get all categories up front so we can order them - // Should we check for numbers as sort numerically? - categoryValues = filterUnique(dim.values).sort(); + // Get all categories up front + categoryValues = filterUnique(dim.values); + + // order them + var allNumeric = true; + for(var i = 0; i < categoryValues.length; i++) { + if(!isNumeric(categoryValues[i])) { + allNumeric = false; + break; + } + } + categoryValues.sort(allNumeric ? Lib.sorterAsc : undefined); + if(dim.categoryorder === 'category descending') { categoryValues = categoryValues.reverse(); } diff --git a/test/image/baselines/parcats_numeric_sort.png b/test/image/baselines/parcats_numeric_sort.png new file mode 100644 index 0000000000000000000000000000000000000000..0701334d71c8246ede5c4bf7b9f1d19db2367716 GIT binary patch literal 6305 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 literal 0 HcmV?d00001 diff --git a/test/image/mocks/parcats_numeric_sort.json b/test/image/mocks/parcats_numeric_sort.json new file mode 100644 index 00000000000..01c4593a86e --- /dev/null +++ b/test/image/mocks/parcats_numeric_sort.json @@ -0,0 +1,40 @@ +{ + "data": [ + { + "type": "parcats", + "dimensions": [ + { + "label": "A", + "values": [ + 1, + 2, + 3 + ], + "categoryorder": "category ascending" + }, + { + "label": "B", + "values": [ + 9, + 10, + 11 + ], + "categoryorder": "category ascending" + } + ] + } + ], + "layout": { + "width": 320, + "height": 200, + "margin": { + "t": 20, + "b": 20, + "l": 20, + "r": 20 + }, + "font": { + "size": 16 + } + } +} diff --git a/test/jasmine/tests/mock_test.js b/test/jasmine/tests/mock_test.js index 22e54a4a04c..eb7abbbfa29 100644 --- a/test/jasmine/tests/mock_test.js +++ b/test/jasmine/tests/mock_test.js @@ -743,6 +743,7 @@ var list = [ 'parcats_hoveron_color', 'parcats_hoveron_dimension', 'parcats_invisible_dimension', + 'parcats_numeric_sort', 'parcats_reordered', 'parcats_unbundled', 'percent_error_bar', @@ -1785,6 +1786,7 @@ figs['parcats_grid_subplots'] = require('@mocks/parcats_grid_subplots'); figs['parcats_hoveron_color'] = require('@mocks/parcats_hoveron_color'); figs['parcats_hoveron_dimension'] = require('@mocks/parcats_hoveron_dimension'); figs['parcats_invisible_dimension'] = require('@mocks/parcats_invisible_dimension'); +figs['parcats_numeric_sort'] = require('@mocks/parcats_numeric_sort'); figs['parcats_reordered'] = require('@mocks/parcats_reordered'); figs['parcats_unbundled'] = require('@mocks/parcats_unbundled'); figs['percent_error_bar'] = require('@mocks/percent_error_bar');