diff --git a/src/lib/components/AnalystEstimate.svelte b/src/lib/components/AnalystEstimate.svelte index 4e65c624..3106049f 100644 --- a/src/lib/components/AnalystEstimate.svelte +++ b/src/lib/components/AnalystEstimate.svelte @@ -28,11 +28,40 @@ let lowEPSList = []; let highEPSList = []; + let highRevenueGrowthList = []; + let revenueGrowthList = []; let epsGrowthList = []; let displayData = "Revenue"; + function computeGrowthSingleList(data, actualList) { + let lastNonNull = actualList + ?.filter((value) => value !== null) + .slice(-1)[0]; + const newList = data; + newList?.unshift(lastNonNull); + // Remove leading null values + while (newList?.length > 0 && newList[0] === null) { + newList?.shift(); + } + + let growthPercentages = []; + + for (let i = 1; i < newList?.length; i++) { + let previous = newList[i - 1]; + let current = newList[i]; + + // Check if previous or current is null to avoid NaN results + if (previous !== null && current !== null) { + let growth = (((current - previous) / previous) * 100)?.toFixed(2); + growthPercentages.push(Number(growth)); // Convert to number + } + } + + return growthPercentages; + } + function computeGrowthList(tableActualRevenue, tableForecastRevenue) { return tableActualRevenue?.map((item, index) => { // If it's the first item or the list is empty, return null @@ -292,6 +321,7 @@ avgRevenueList = avgList?.slice(currentYearIndex) || []; lowRevenueList = lowList?.slice(currentYearIndex) || []; highRevenueList = highList?.slice(currentYearIndex) || []; + highRevenueGrowthList = highList?.slice(currentYearIndex) || []; } else if (dataType === "EPS") { let currentYearIndex = dates?.findIndex((date) => date === searchString); @@ -695,7 +725,7 @@ - {#each highRevenueList as val, index} + {#each computeGrowthSingleList(highRevenueList, tableActualRevenue) as val, index} {/each} @@ -737,7 +777,7 @@ > - {#each avgRevenueList as val, index} + {#each computeGrowthSingleList(avgRevenueList, tableActualRevenue) as val, index} {/each} @@ -762,7 +812,7 @@ > - {#each lowRevenueList as val, index} + {#each computeGrowthSingleList(lowRevenueList, tableActualRevenue) as val, index} {/each} @@ -908,7 +968,6 @@
Revenue GrowthHigh {#if data?.user?.tier !== "Pro" && index >= highRevenueList?.length - 2} {:else} - {abbreviateNumber(val)} + 0 + ? "text-[#00FC50] before:content-['+']" + : val < 0 + ? "text-[#FF2F1F]" + : "text-white"} + > + {val !== null && Math.abs(val - 0) > 0 + ? abbreviateNumber(val) + "%" + : "-"} + {/if} Avg {#if data?.user?.tier !== "Pro" && index >= avgRevenueList?.length - 2} {:else} - {abbreviateNumber(val)} + 0 + ? "text-[#00FC50] before:content-['+']" + : val < 0 + ? "text-[#FF2F1F]" + : "text-white"} + > + {val !== null && Math.abs(val - 0) > 0 + ? abbreviateNumber(val) + "%" + : "-"} + {/if} Low {#if data?.user?.tier !== "Pro" && index >= lowRevenueList?.length - 2} {:else} - {abbreviateNumber(val)} + 0 + ? "text-[#00FC50] before:content-['+']" + : val < 0 + ? "text-[#FF2F1F]" + : "text-white"} + > + {val !== null && Math.abs(val - 0) > 0 + ? abbreviateNumber(val) + "%" + : "-"} + {/if}
- {#each highEPSList as val, index} + {#each computeGrowthSingleList(highEPSList, tableActualEPS) as val, index} {/each} @@ -954,7 +1024,7 @@ > - {#each avgEPSList as val, index} + {#each computeGrowthSingleList(avgEPSList, tableActualEPS) as val, index} {/each} @@ -979,7 +1059,7 @@ > - {#each lowEPSList as val, index} + {#each computeGrowthSingleList(lowEPSList, tableActualEPS) as val, index} {/each} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index d499f165..3c452c61 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -762,9 +762,7 @@ const handleTwitchMessage = (event) => { > - Stock Analysis Pro + Get Pro @@ -1174,7 +1172,7 @@ const handleTwitchMessage = (event) => { > - Stock Analysis Pro + Get Pro {#if !data?.user || data?.user?.tier === "Free" || data?.user?.freeTrial === true}
High {#if data?.user?.tier !== "Pro" && index >= highEPSList?.length - 2} {:else} - {abbreviateNumber(val)} + 0 + ? "text-[#00FC50] before:content-['+']" + : val < 0 + ? "text-[#FF2F1F]" + : "text-white"} + > + {val !== null && Math.abs(val - 0) > 0 + ? abbreviateNumber(val) + "%" + : "-"} + {/if} Avg {#if data?.user?.tier !== "Pro" && index >= avgEPSList?.length - 2} {:else} - {abbreviateNumber(val)} + 0 + ? "text-[#00FC50] before:content-['+']" + : val < 0 + ? "text-[#FF2F1F]" + : "text-white"} + > + {val !== null && Math.abs(val - 0) > 0 + ? abbreviateNumber(val) + "%" + : "-"} + {/if} Low {#if data?.user?.tier !== "Pro" && index >= lowEPSList?.length - 2} {:else} - {abbreviateNumber(val)} + 0 + ? "text-[#00FC50] before:content-['+']" + : val < 0 + ? "text-[#FF2F1F]" + : "text-white"} + > + {val !== null && Math.abs(val - 0) > 0 + ? abbreviateNumber(val) + "%" + : "-"} + {/if}