diff --git a/src/routes/analysts/+page.svelte b/src/routes/analysts/+page.svelte index c4baa07a..1e0a055b 100644 --- a/src/routes/analysts/+page.svelte +++ b/src/routes/analysts/+page.svelte @@ -34,94 +34,77 @@ window.addEventListener('scroll', handleScroll); }) -let order = ''; -let sortBy = ''; // Default sorting by change percentage -function changeOrder(state:string) { - if (state === 'highToLow') - { - order = 'lowToHigh'; - } - else { - order = 'highToLow'; + +let sortOrders = { + rank: 'none', + successRate: 'none', + avgReturn: 'none', + totalRatings: 'none', + lastRating: 'none', +}; + +// Generalized sorting function +function sortData(key) { + // Reset all other keys to 'none' except the current key + for (const k in sortOrders) { + if (k !== key) { + sortOrders[k] = 'none'; } } -const sortByRank = (tickerList) => { - return tickerList?.sort(function(a, b) { - if(order === 'highToLow') - { - return b?.rank - a?.rank; - } - else { - return a?.rank - b?.rank; - } - - }); -} + // Cycle through 'none', 'asc', 'desc' for the clicked key + const orderCycle = ['none', 'asc', 'desc']; + const originalData = rawData?.slice(0,40) -const sortBySuccessRate = (tickerList) => { - return tickerList?.sort(function(a, b) { - if(order === 'highToLow') - { - return b?.successRate - a?.successRate; - } - else { - return a?.successRate - b?.successRate; - } - }); -} + const currentOrderIndex = orderCycle.indexOf(sortOrders[key]); + sortOrders[key] = orderCycle[(currentOrderIndex + 1) % orderCycle.length]; -const sortByAvgReturn = (tickerList) => { - return tickerList?.sort(function(a, b) { - if(order === 'highToLow') - { - return b?.avgReturn - a?.avgReturn; - } - else { - return a?.avgReturn - b?.avgReturn; - } - }); -} + const sortOrder = sortOrders[key]; -const sortByTotalRatings = (tickerList) => { - return tickerList?.sort(function(a, b) { - if(order === 'highToLow') - { - return b?.totalRatings - a?.totalRatings; - } - else { - return a?.totalRatings - b?.totalRatings; - } - }); -} - - - - -$: { - if(order) - { - if(sortBy === 'rank') - { - analytRatingList = sortByRank(rawData)?.slice(0,50); - } - else if(sortBy === 'successRate') - { - analytRatingList = sortBySuccessRate(rawData)?.slice(0,50); - } - else if(sortBy === 'avgReturn') - { - analytRatingList = sortByAvgReturn(rawData)?.slice(0,50); - } - else if(sortBy === 'totalRatings') - { - analytRatingList = sortByTotalRatings(rawData)?.slice(0,50); - } - + // Reset to original data when 'none' and stop further sorting + if (sortOrder === 'none') { + analytRatingList = [...originalData]; // Reset to original data (spread to avoid mutation) + return; } -} + // Define comparison functions for each key + const compareFunctions = { + rank: (a, b) => { + const numA = parseFloat(a?.rank); + const numB = parseFloat(b?.rank); + return sortOrder === 'asc' ? numA - numB : numB - numA; + }, + analystName: (a, b) => { + const nameA = a?.analystName.toUpperCase(); + const nameB = b?.analystName.toUpperCase(); + return sortOrder === 'asc' ? nameA.localeCompare(nameB) : nameB.localeCompare(nameA); + }, + successRate: (a, b) => { + const numA = parseFloat(a?.successRate); + const numB = parseFloat(b?.successRate); + return sortOrder === 'asc' ? numA - numB : numB - numA; + }, + avgReturn: (a, b) => { + const numA = parseFloat(a?.avgReturn); + const numB = parseFloat(b?.avgReturn); + return sortOrder === 'asc' ? numA - numB : numB - numA; + }, + totalRatings: (a, b) => { + const numA = parseFloat(a.totalRatings); + const numB = parseFloat(b.totalRatings); + return sortOrder === 'asc' ? numA - numB : numB - numA; + }, + lastRating: (a, b) => { + const timeA = new Date(a?.lastRating); + const timeB = new Date(b?.lastRating); + return sortOrder === 'asc' ? timeA - timeB : timeB - timeA; + }, + }; + + // Sort using the appropriate comparison function + analytRatingList = [...originalData].sort(compareFunctions[key]); +} @@ -225,34 +208,35 @@ $: { - - - - - - -
{ sortBy = 'rank'; changeOrder(order); }} class="cursor-pointer text-center bg-[#09090B] text-white text-[1rem] font-semibold"> + sortData('rank')} class="cursor-pointer select-none text-white font-semibold text-[1rem] whitespace-nowrap"> Rank - + + sortData('analystName')} class="cursor-pointer select-none text-white font-semibold text-[1rem] whitespace-nowrap"> Analyst + { sortBy = 'successRate'; changeOrder(order); }} class="cursor-pointer text-end bg-[#09090B] text-white text-[1rem] font-semibold"> + sortData('successRate')} class="text-end cursor-pointer select-none text-white font-semibold text-[1rem] whitespace-nowrap"> Success Rate - + { sortBy = 'avgReturn'; changeOrder(order); }} class="cursor-pointer text-end bg-[#09090B] text-white text-[1rem] font-semibold"> - Avg. return - + sortData('avgReturn')} class="text-end cursor-pointer select-none text-white font-semibold text-[1rem] whitespace-nowrap"> + Avg. Return + { sortBy = 'totalRatings'; changeOrder(order); }} class="cursor-pointer text-white font-semibold text-end text-[1rem]"> + sortData('totalRatings')} class="text-end cursor-pointer select-none text-white font-semibold text-[1rem] whitespace-nowrap"> Total Ratings - + + sortData('lastRating')} class="text-end cursor-pointer select-none text-white font-semibold text-[1rem] whitespace-nowrap"> Last Rating +