Skip to content

Commit 5a4f701

Browse files
ypriverolclaude
andcommitted
fix: rewrite sort — descending first for numbers, 3-state toggle
- Click numeric column: descending (biggest first) → ascending → off - Click text column: ascending (A-Z) → descending → off - Null/empty values always pushed to bottom regardless of direction - No more stuck state after multiple clicks Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent d3386dc commit 5a4f701

File tree

1 file changed

+31
-18
lines changed

1 file changed

+31
-18
lines changed

frontend/src/components/DatasetTable.vue

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,8 @@ const props = defineProps({
142142
143143
const router = useRouter()
144144
const 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)
149149
const filterSpecies = ref('')
@@ -211,42 +211,55 @@ const filteredDatasets = computed(() => {
211211
212212
const 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
238243
function 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
247260
function sortIcon(key) {
248261
if (sortKey.value !== key) return ''
249-
return sortDir.value === 1 ? '' : ''
262+
return sortDir.value === -1 ? '' : ''
250263
}
251264
252265
function formatNum(n) {

0 commit comments

Comments
 (0)