From be935e2ba617cd7749ca63fd2b64cd2f2f2fa45e Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 12 Jun 2025 17:58:25 +0200 Subject: [PATCH] fixes --- components/InterestDetailsModal.vue | 45 +++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/components/InterestDetailsModal.vue b/components/InterestDetailsModal.vue index ebf1ea0..2e36b68 100644 --- a/components/InterestDetailsModal.vue +++ b/components/InterestDetailsModal.vue @@ -943,21 +943,56 @@ const eoiSendToSales = async () => { } }; +// Natural sort function for alphanumeric berth numbers +const naturalSort = (a: string, b: string): number => { + const regex = /(\d+)|(\D+)/g; + const aParts = a.match(regex) || []; + const bParts = b.match(regex) || []; + + for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) { + if (!aParts[i]) return -1; + if (!bParts[i]) return 1; + + const aIsNum = /^\d+$/.test(aParts[i]); + const bIsNum = /^\d+$/.test(bParts[i]); + + if (aIsNum && bIsNum) { + const diff = parseInt(aParts[i]) - parseInt(bParts[i]); + if (diff !== 0) return diff; + } else if (aIsNum && !bIsNum) { + return -1; + } else if (!aIsNum && bIsNum) { + return 1; + } else { + const diff = aParts[i].localeCompare(bParts[i]); + if (diff !== 0) return diff; + } + } + + return 0; +}; + // Group berths by first letter const groupedBerths = computed(() => { const grouped: Record = {}; - const sortedBerths = [...availableBerths.value].sort((a, b) => - (a['Mooring Number'] || '').localeCompare(b['Mooring Number'] || '') - ); - sortedBerths.forEach(berth => { - const firstLetter = (berth['Mooring Number'] || '').charAt(0).toUpperCase(); + // First group by letter + availableBerths.value.forEach(berth => { + const mooringNumber = berth['Mooring Number'] || ''; + const firstLetter = mooringNumber.charAt(0).toUpperCase(); if (!grouped[firstLetter]) { grouped[firstLetter] = []; } grouped[firstLetter].push(berth); }); + // Sort each group numerically + Object.keys(grouped).forEach(letter => { + grouped[letter].sort((a, b) => + naturalSort(a['Mooring Number'] || '', b['Mooring Number'] || '') + ); + }); + // Create flat array with dividers const result: any[] = []; Object.keys(grouped).sort().forEach((letter, index) => {