From 6ce2a58f9bc959465c7a44d1d4105cadec75cf1e Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Fri, 14 Jun 2024 12:13:02 +0530 Subject: [PATCH] ui: improve sort utility for metrics (#9247) This improves the UI sorting utility to check for metrics data and sort after cleaning the string data. Fixes #8663 Signed-off-by: Rohit Yadav --- ui/src/utils/sort.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/ui/src/utils/sort.js b/ui/src/utils/sort.js index b2f3d5451ca..5e893fb58ec 100644 --- a/ui/src/utils/sort.js +++ b/ui/src/utils/sort.js @@ -23,13 +23,19 @@ function filterNumber (value) { } function stringComparator (a, b) { - return a.toString().localeCompare(b.toString()) + return a.toString().localeCompare(b.toString(), undefined, { numeric: true }) } function numericComparator (a, b) { return filterNumber(a) < filterNumber(b) ? 1 : -1 } +function metricComparator (ma, mb) { + var a = ('' + ma).replace(/((%)|(Ghz)|(Mhz)|(MiB)|(GiB)|(GB)).*$/g, '') + var b = ('' + mb).replace(/((%)|(Ghz)|(Mhz)|(MiB)|(GiB)|(GB)).*$/g, '') + return parseFloat(a) < parseFloat(b) ? 1 : -1 +} + function ipV4AddressCIDRComparator (a, b) { a = a.split(/[./]/gm) b = b.split(/[./]/gm) @@ -76,6 +82,10 @@ function isNumeric (obj) { return !Array.isArray(obj) && !isNaN(filterNumber(obj)) } +function isMetric (value) { + return /^[0-9\\. ]*((%)|(Ghz)|(Mhz)|(MiB)|(GiB)|(GB))/.test(value) +} + /** * Compare elements, attempting to determine type of element to get the best comparison * @@ -97,6 +107,9 @@ export function genericCompare (a, b) { if (isNumeric(a) && isNumeric(b)) { comparator = numericComparator } + if (isMetric(a) && isMetric(b)) { + comparator = metricComparator + } return comparator(a, b) }