From 61bc78ca0f01707c78558a3df8aa671f390f7376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ignas=20Lun=C4=97nas?= <34475426+lunenas@users.noreply.github.com> Date: Fri, 27 Mar 2026 12:02:05 +0200 Subject: [PATCH] fix: correct date field sorting in collections Replace parseFloat with Number for numeric detection in collection item sorting. parseFloat("2025-04-01") returns 2025, causing all dates in the same year to compare as equal. Number() correctly returns NaN for date strings, allowing them to fall through to string comparison where ISO format sorts chronologically. Made-with: Cursor --- app/ycode/api/collections/[id]/items/filter/route.ts | 12 ++++++------ app/ycode/api/collections/[id]/items/route.ts | 12 +++++------- lib/page-fetcher.ts | 8 +++++--- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/ycode/api/collections/[id]/items/filter/route.ts b/app/ycode/api/collections/[id]/items/filter/route.ts index 65ae6b44..6aeae66a 100644 --- a/app/ycode/api/collections/[id]/items/filter/route.ts +++ b/app/ycode/api/collections/[id]/items/filter/route.ts @@ -537,16 +537,16 @@ export async function POST( // then hydrate only the requested page window. const sortValueByItem = await getFieldValuesForItems(sortBy, true, matchingIds); const sortedIds = [...matchingIds].sort((a, b) => { - const aVal = sortValueByItem.get(a) || ''; - const bVal = sortValueByItem.get(b) || ''; - const aNum = parseFloat(String(aVal)); - const bNum = parseFloat(String(bVal)); + const aStr = String(sortValueByItem.get(a) || ''); + const bStr = String(sortValueByItem.get(b) || ''); + const aNum = aStr.trim() !== '' ? Number(aStr) : NaN; + const bNum = bStr.trim() !== '' ? Number(bStr) : NaN; if (!isNaN(aNum) && !isNaN(bNum)) { return sortOrder === 'desc' ? bNum - aNum : aNum - bNum; } return sortOrder === 'desc' - ? String(bVal).localeCompare(String(aVal)) - : String(aVal).localeCompare(String(bVal)); + ? bStr.localeCompare(aStr) + : aStr.localeCompare(bStr); }); pageItemIds = sortedIds.slice(pageOffset, pageOffset + pageLimit); if (pageItemIds.length > 0) { diff --git a/app/ycode/api/collections/[id]/items/route.ts b/app/ycode/api/collections/[id]/items/route.ts index 7a1fcc98..d3d0bb90 100644 --- a/app/ycode/api/collections/[id]/items/route.ts +++ b/app/ycode/api/collections/[id]/items/route.ts @@ -126,19 +126,17 @@ export async function GET( } else { // Sort by field value (globally, before pagination) items = [...items].sort((a, b) => { - const aValue = a.values[sortBy] || ''; - const bValue = b.values[sortBy] || ''; + const aStr = String(a.values[sortBy] || ''); + const bStr = String(b.values[sortBy] || ''); - // Try numeric comparison - const aNum = parseFloat(String(aValue)); - const bNum = parseFloat(String(bValue)); + const aNum = aStr.trim() !== '' ? Number(aStr) : NaN; + const bNum = bStr.trim() !== '' ? Number(bStr) : NaN; if (!isNaN(aNum) && !isNaN(bNum)) { return sortOrder === 'asc' ? aNum - bNum : bNum - aNum; } - // String comparison - const comparison = String(aValue).localeCompare(String(bValue)); + const comparison = aStr.localeCompare(bStr); return sortOrder === 'asc' ? comparison : -comparison; }); } diff --git a/lib/page-fetcher.ts b/lib/page-fetcher.ts index 5447a122..ef3a0489 100644 --- a/lib/page-fetcher.ts +++ b/lib/page-fetcher.ts @@ -1780,14 +1780,16 @@ export async function resolveCollectionLayers( sortedItems = items.sort((a, b) => { const aValue = a.values[sortBy] || ''; const bValue = b.values[sortBy] || ''; - const aNum = parseFloat(String(aValue)); - const bNum = parseFloat(String(bValue)); + const aStr = String(aValue); + const bStr = String(bValue); + const aNum = aStr.trim() !== '' ? Number(aStr) : NaN; + const bNum = bStr.trim() !== '' ? Number(bStr) : NaN; if (!isNaN(aNum) && !isNaN(bNum)) { return sortOrder === 'desc' ? bNum - aNum : aNum - bNum; } - const comparison = String(aValue).localeCompare(String(bValue)); + const comparison = aStr.localeCompare(bStr); return sortOrder === 'desc' ? -comparison : comparison; }); }