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 d911a032..50633b30 100644 --- a/lib/page-fetcher.ts +++ b/lib/page-fetcher.ts @@ -1781,14 +1781,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; }); }