@@ -142,8 +142,8 @@ const props = defineProps({
142142
143143const router = useRouter ()
144144const searchQuery = ref (' ' )
145- const sortKey = ref (' accession ' )
146- const sortDir = ref (1 )
145+ const sortKey = ref (' ' )
146+ const sortDir = ref (- 1 ) // -1 = descending (biggest first, natural for counts )
147147
148148// Column filters (MSNet only)
149149const filterSpecies = ref (' ' )
@@ -211,42 +211,55 @@ const filteredDatasets = computed(() => {
211211
212212const sortedDatasets = computed (() => {
213213 const arr = [... filteredDatasets .value ]
214+ if (! sortKey .value ) return arr // no sort active → original order
215+
214216 const key = sortKey .value
215217 const dir = sortDir .value
218+ const isNum = NUMERIC_COLS .has (key)
216219
217220 arr .sort ((a , b ) => {
218- const av = a[key]
219- const bv = b[key]
221+ let av = a[key]
222+ let bv = b[key]
220223
221- if (NUMERIC_COLS .has (key)) {
222- // Treat null/undefined/empty/0 as "no value" → push to end
223- const aHas = av != null && av !== ' ' && av !== 0
224- const bHas = bv != null && bv !== ' ' && bv !== 0
225- if (aHas && bHas) return (Number (av) - Number (bv)) * dir
226- if (aHas) return - 1 // a has value, b doesn't → a first
227- if (bHas) return 1
228- return 0
224+ if (isNum) {
225+ // Convert to number; treat null/undefined/empty as -Infinity so they go last
226+ const na = (av != null && av !== ' ' ) ? Number (av) : null
227+ const nb = (bv != null && bv !== ' ' ) ? Number (bv) : null
228+ // Push nulls to bottom regardless of direction
229+ if (na == null && nb == null ) return 0
230+ if (na == null ) return 1
231+ if (nb == null ) return - 1
232+ return (na - nb) * dir
229233 }
230234
231- if (typeof av === ' number' && typeof bv === ' number' ) return (av - bv) * dir
232-
233- return String (av ?? ' ' ).localeCompare (String (bv ?? ' ' )) * dir
235+ // String sort
236+ const sa = String (av ?? ' ' )
237+ const sb = String (bv ?? ' ' )
238+ return sa .localeCompare (sb) * dir
234239 })
235240 return arr
236241})
237242
238243function sortBy (key ) {
239244 if (sortKey .value === key) {
240- sortDir .value *= - 1
245+ // Toggle: desc → asc → off
246+ if (sortDir .value === - 1 ) {
247+ sortDir .value = 1
248+ } else {
249+ // Reset sort
250+ sortKey .value = ' '
251+ sortDir .value = - 1
252+ }
241253 } else {
254+ // New column: start descending (biggest first for numbers)
242255 sortKey .value = key
243- sortDir .value = 1
256+ sortDir .value = NUMERIC_COLS . has (key) ? - 1 : 1
244257 }
245258}
246259
247260function sortIcon (key ) {
248261 if (sortKey .value !== key) return ' ↕'
249- return sortDir .value === 1 ? ' ↑ ' : ' ↓ '
262+ return sortDir .value === - 1 ? ' ↓ ' : ' ↑ '
250263}
251264
252265function formatNum (n ) {
0 commit comments