import { getFieldByKey, getFieldValue } from "@/util/table-util"; export const fieldSorter = (sortKeys, nullsFirst, fields) => { return (a, b) => sortKeys.map(sortKey => { let dir = 1; if (sortKey[0] === '-') { dir = -1; sortKey = sortKey.substring(1); } let aValue = getFieldValue(a, sortKey, null).rawValue let bValue = getFieldValue(b, sortKey, null).rawValue const field = getFieldByKey(fields, sortKey) if(field) { if(field.sortByFormatted === true && field.formatter) { aValue = getFieldValue(a, field.key, field.formatter).formattedValue bValue = getFieldValue(b, field.key, field.formatter).formattedValue } else if(field.sortFormatter) { aValue = getFieldValue(a, field.key, field.sortFormatter).formattedValue bValue = getFieldValue(b, field.key, field.sortFormatter).formattedValue } } const nullValue = nullsFirst ? -1 : 1 // nulls are last by default, reverse that if 'nullsFirst' is true // console.log(`sort: a=[${aValue}], b=[${bValue}], !a=[${!aValue}], !b=[${!bValue}], a>b=[${aValue > bValue}], b>a=[${bValue > aValue}]`) if( !aValue && aValue !== 0 && !bValue && bValue !== 0 ) return 0 else if( !aValue && aValue !== 0 ) return dir * nullValue else if( !bValue && bValue !== 0 ) return -(dir) * nullValue else if( aValue > bValue ) return dir else if( bValue > aValue ) return -(dir) return 0 }).reduce((p, n) => p ? p : n, 0); }