ui/perfherder/perf-helpers/sort.js (85 lines of code) (raw):
export const sortTables = {
alert: 'Alert',
compare: 'Compare',
};
export const tableSort = {
ascending: 'ascending',
descending: 'descending',
default: 'default',
};
export const sortTypes = {
[tableSort.ascending]: {
sortByString: (value) => (a, b) => a[value].localeCompare(b[value]),
sortByStrFirstElement: (value) => (a, b) =>
a.series_signature[value][0].localeCompare(b.series_signature[value][0]),
sortBySeriesSignatureValue: (value) => (a, b) =>
a.series_signature[value].localeCompare(b.series_signature[value]),
sortByValue: (value) => (a, b) => a[value] - b[value],
},
[tableSort.descending]: {
sortByString: (value) => (a, b) => b[value].localeCompare(a[value]),
sortByStrFirstElement: (value) => (a, b) =>
b.series_signature[value][0].localeCompare(a.series_signature[value][0]),
sortBySeriesSignatureValue: (value) => (a, b) =>
b.series_signature[value].localeCompare(a.series_signature[value]),
sortByValue: (value) => (a, b) => b[value] - a[value],
},
};
export const getNextSort = (currentSort) => {
const { ascending, descending, default: defaultSort } = tableSort;
const nextSort = {
ascending: descending,
descending: defaultSort,
default: ascending,
};
return nextSort[currentSort];
};
export const sort = (sortValue, sortType, data, table) => {
let validData = [];
const nullData = [];
if (table === sortTables.compare) {
data.forEach((item) => {
if (item[sortValue] || item[sortValue] === 0) {
validData.push(item);
} else {
nullData.push(item);
}
});
} else {
validData = data;
}
const {
sortByString,
sortByValue,
sortByStrFirstElement,
sortBySeriesSignatureValue,
} = sortTypes[sortType];
const getSortType = {
title: sortByString,
name: sortByString,
tags: sortByStrFirstElement,
machine_platform: sortBySeriesSignatureValue,
noise_profile: sortByString,
};
let doSort = getSortType[sortValue];
if (doSort === undefined) doSort = sortByValue;
if (validData.length) {
data = validData.sort(doSort(sortValue));
data = data.concat(nullData);
}
return data;
};
export const sortData = function sortData(data, sortBy, desc) {
data.sort((a, b) => {
const item1 = desc ? b[sortBy] : a[sortBy];
const item2 = desc ? a[sortBy] : b[sortBy];
if (item1 < item2) {
return -1;
}
if (item1 > item2) {
return 1;
}
return 0;
});
return data;
};