From 9654c9aa58753bfc0fa00b8296b3987860dac79c Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Wed, 25 Dec 2024 19:42:20 +0100 Subject: [PATCH] ui fixes --- src/lib/components/AIScore.svelte | 22 +- src/lib/components/BorrowedShare.svelte | 6 +- src/lib/components/ClinicalTrial.svelte | 28 +- src/lib/components/DarkPool.svelte | 6 +- src/lib/components/FOMCImpact.svelte | 3 +- src/lib/components/FailToDeliver.svelte | 6 +- src/lib/components/FinancialTable.svelte | 8 +- src/lib/components/ImpliedVolatility.svelte | 6 +- src/lib/components/IndustryTable.svelte | 2 +- src/lib/components/MarketMaker.svelte | 10 +- src/lib/components/Markethour.svelte | 22 +- src/lib/components/NextEarnings.svelte | 15 +- src/lib/components/PastEarnings.svelte | 863 +++++++++--------- src/lib/components/RetailVolume.svelte | 6 +- src/lib/components/ShareHolders.svelte | 16 +- src/lib/components/ShareStatistics.svelte | 8 +- src/lib/components/TARating.svelte | 2 +- src/lib/components/Table/Table.svelte | 114 +-- src/lib/components/WatchListCard.svelte | 2 +- src/lib/utils.ts | 2 +- src/routes/+page.svelte | 2 +- src/routes/analysts/+page.svelte | 2 +- src/routes/analysts/[slug]/+page.svelte | 23 +- .../corporate-lobbying-tracker/+page.svelte | 2 +- src/routes/cramer-tracker/+page.svelte | 9 +- src/routes/crypto/+page.svelte | 2 +- .../[tickerID]/congress-trading/+page.svelte | 2 +- .../crypto/[tickerID]/stats/+page.svelte | 188 +--- src/routes/dividends-calendar/+page.svelte | 2 +- src/routes/earnings-calendar/+page.svelte | 2 +- src/routes/economic-calendar/+page.svelte | 2 +- src/routes/economic-indicator/+page.svelte | 2 +- src/routes/etf/+page.svelte | 2 +- .../etf/[tickerID]/dividends/+page.svelte | 2 +- .../etf/[tickerID]/insider/+page.svelte | 2 +- .../etf/[tickerID]/options/+page.svelte | 7 +- src/routes/etf/[tickerID]/stats/+page.svelte | 188 +--- src/routes/etf/etf-providers/+page.svelte | 113 ++- .../etf/etf-providers/[slug]/+page.svelte | 166 ++-- src/routes/etf/new-launches/+page.svelte | 2 +- src/routes/fda-calendar/+page.svelte | 2 +- src/routes/industry/all/+page.svelte | 2 +- src/routes/industry/sectors/+page.svelte | 2 +- src/routes/insider-tracker/+page.svelte | 2 +- src/routes/ipos/+page.svelte | 2 +- src/routes/ipos/[slug]/+page.svelte | 12 +- src/routes/list/bitcoin-etfs/+page.svelte | 2 +- src/routes/politicians/[slug]/+page.svelte | 2 +- src/routes/politicians/flow-data/+page.svelte | 2 +- src/routes/price-alert/+page.svelte | 2 +- src/routes/stock-screener/+page.svelte | 106 +-- src/routes/stocks/[tickerID]/+page.svelte | 22 +- .../[tickerID]/dividends/+layout.svelte | 12 +- .../stocks/[tickerID]/dividends/+page.svelte | 94 +- .../stocks/[tickerID]/financials/+page.svelte | 65 +- .../financials/balance-sheet/+page.svelte | 77 +- .../financials/cash-flow/+page.svelte | 67 +- .../[tickerID]/financials/ratios/+page.svelte | 314 +------ .../[tickerID]/forecast/analyst/+page.svelte | 11 +- .../stocks/[tickerID]/insider/+page.svelte | 77 +- .../insider/congress-trading/+page.svelte | 12 +- .../stocks/[tickerID]/options/+page.svelte | 40 +- .../statistics/market-cap/+page.svelte | 6 +- src/routes/watchlist/options/+page.svelte | 2 +- src/routes/watchlist/stocks/+page.svelte | 4 +- 65 files changed, 1207 insertions(+), 1599 deletions(-) diff --git a/src/lib/components/AIScore.svelte b/src/lib/components/AIScore.svelte index 1e7c8e30..b9d12170 100644 --- a/src/lib/components/AIScore.svelte +++ b/src/lib/components/AIScore.svelte @@ -187,7 +187,7 @@ - + @@ -197,53 +197,53 @@ - + - + - + - + - + - + - + - + - + - + diff --git a/src/lib/components/BorrowedShare.svelte b/src/lib/components/BorrowedShare.svelte index 83c2c092..2a048d51 100644 --- a/src/lib/components/BorrowedShare.svelte +++ b/src/lib/components/BorrowedShare.svelte @@ -80,7 +80,7 @@
Bullish Probability
+80% Strong Buy 10
+75% Buy 9
+70% Buy 8
+60% Buy 7
+50% Hold 6
+45% Hold 5
+40% Hold 4
+35% Sell 3
+30% Sell 2
+20% Strong Sell 1
- + @@ -90,7 +90,7 @@ {formatDateRange(rawData?.slice(-1)?.at(0)?.date)} - + @@ -100,7 +100,7 @@ {lowestFee + "%" + "-" + highestFee + "%"} - + diff --git a/src/lib/components/ClinicalTrial.svelte b/src/lib/components/ClinicalTrial.svelte index 40a87cca..e112a052 100644 --- a/src/lib/components/ClinicalTrial.svelte +++ b/src/lib/components/ClinicalTrial.svelte @@ -53,7 +53,7 @@ {#each displayList as item,index} - handleViewData(item)} class="border-y border-gray-800 odd:bg-secondary sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] bg-[#09090B] border-b-[#09090B] cursor-pointer"> + handleViewData(item)} class="border-y border-gray-800 odd:bg-odd sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] bg-[#09090B] border-b-[#09090B] cursor-pointer"> - +
Date
Fee Range
Total Available Shares
{item["Interventions"]?.length === 0 ? '-' : item["Interventions"]?.length > charNumber ? formatString(item["Interventions"]?.slice(0,charNumber)) + "..." : formatString(item["Interventions"])} @@ -250,49 +250,49 @@ >
NCT Number {trialId}
Start Date {trialStart}
End Date {trialEnd}
Study Status {trialStage}
Phase Status {trialPhase}
Study Results {trialResult}
Sex {formatString(trialSex)}
Age
Sponsor {trialSponsor}
Enrollment {trialEnrollment}
Study Type {trialStudyType}
Funder Type {trialFunderType}
Website - + @@ -98,7 +98,7 @@ {#each showFullStats ? tableList?.slice(0, 10) : tableList?.slice(0, 3) as item, index} 3 ? 'opacity-[0.5]' diff --git a/src/lib/components/FailToDeliver.svelte b/src/lib/components/FailToDeliver.svelte index 3cd73b27..843e0991 100644 --- a/src/lib/components/FailToDeliver.svelte +++ b/src/lib/components/FailToDeliver.svelte @@ -263,7 +263,7 @@
Date
Total Volume @@ -110,7 +110,7 @@
Avg. Short % of Volume diff --git a/src/lib/components/FOMCImpact.svelte b/src/lib/components/FOMCImpact.svelte index ee77b540..82efa6e3 100644 --- a/src/lib/components/FOMCImpact.svelte +++ b/src/lib/components/FOMCImpact.svelte @@ -240,8 +240,7 @@
- + @@ -273,7 +273,7 @@ {formatDateRange(rawData?.slice(-1)?.at(0)?.date)} - + @@ -283,7 +283,7 @@ {lowestPrice + "-" + highestPrice} - + diff --git a/src/lib/components/FinancialTable.svelte b/src/lib/components/FinancialTable.svelte index b7730cf0..98b4f56a 100644 --- a/src/lib/components/FinancialTable.svelte +++ b/src/lib/components/FinancialTable.svelte @@ -5,7 +5,7 @@ {#each fields as { label, key }} - + {#each data as item} {/each} diff --git a/src/lib/components/ImpliedVolatility.svelte b/src/lib/components/ImpliedVolatility.svelte index d9e563ca..759958f7 100644 --- a/src/lib/components/ImpliedVolatility.svelte +++ b/src/lib/components/ImpliedVolatility.svelte @@ -112,7 +112,7 @@
Date
Price Range
Latest FTD
@@ -13,9 +13,9 @@ - {item[key] !== null && item[key] !== 0 - ? abbreviateNumber(item[key]?.toFixed(2)) - : "-"} + {@html item[key] !== null && item[key] !== 0 + ? abbreviateNumber(item[key]?.toFixed(2), false, true) + : "n/a"}
- + @@ -122,7 +122,7 @@ {formatDateRange(rawData?.slice(-1)?.at(0)?.date)} - + @@ -132,7 +132,7 @@ {lowestIV + "%" + "-" + highestIV + "%"} - + diff --git a/src/lib/components/IndustryTable.svelte b/src/lib/components/IndustryTable.svelte index ea8c8c66..76377072 100644 --- a/src/lib/components/IndustryTable.svelte +++ b/src/lib/components/IndustryTable.svelte @@ -97,7 +97,7 @@ {#each displayList as item} + {/each} + + +
Date
IV Range
RV Range
- + @@ -98,7 +98,7 @@ {formatDateRange(historyData?.slice(-1)?.at(0)?.date)} - + @@ -110,7 +110,7 @@ )} - + @@ -122,7 +122,7 @@ )} - + @@ -173,7 +173,7 @@ {#each showFullStats ? topMarketMakers?.slice(0, 10) : topMarketMakers?.slice(0, 3) as item, index} 3 diff --git a/src/lib/components/Markethour.svelte b/src/lib/components/Markethour.svelte index 6b31eae4..3be55e0b 100644 --- a/src/lib/components/Markethour.svelte +++ b/src/lib/components/Markethour.svelte @@ -79,7 +79,7 @@ > - + @@ -88,44 +88,44 @@ - + - + - + - + - + - + - + - + - + - + diff --git a/src/lib/components/NextEarnings.svelte b/src/lib/components/NextEarnings.svelte index 2f2bdc89..3cc5f10c 100644 --- a/src/lib/components/NextEarnings.svelte +++ b/src/lib/components/NextEarnings.svelte @@ -38,7 +38,7 @@ {#if Object?.keys(rawData)?.length !== 0}
-
+
@@ -52,7 +52,7 @@
-
+
{$displayCompanyName} is scheduled to release its earnings on {new Date( rawData?.date ?? null, )?.toLocaleString("en-US", { @@ -70,7 +70,7 @@ {/if}
Analysts project revenue of {abbreviateNumber(rawData?.revenueEst, true)}{@html abbreviateNumber(rawData?.revenueEst, true, true)}, reflecting a
@@ -113,7 +113,10 @@
- +
-{/if} \ No newline at end of file +{/if} diff --git a/src/lib/components/PastEarnings.svelte b/src/lib/components/PastEarnings.svelte index 1de85a24..2b315765 100644 --- a/src/lib/components/PastEarnings.svelte +++ b/src/lib/components/PastEarnings.svelte @@ -1,456 +1,479 @@ - -
-
-
- - {#if isLoaded} - {#if rawData?.length !== 0} + } + + +
+
+
+ {#if isLoaded} + {#if rawData?.length !== 0} The average price volatility over this 3-day period is - {#if userTier !== 'Pro'} - ... Unlock content with - Pro Subscription + {#if userTier !== "Pro"} + ... Unlock content with + Pro Subscription {:else} - ±{averageVolatility?.toFixed(2)}%. - During this period, the reported revenue exceeded expectations {positiveRevenueSurprisePercentage}% of the time & the reported EPS surpassed analyst estimates {positiveEpsSurprisePercentage}% of the time. + ±{averageVolatility?.toFixed(2)}%. + During this period, the reported revenue exceeded expectations + {positiveRevenueSurprisePercentage}% + of the time & the reported EPS surpassed analyst estimates + {positiveEpsSurprisePercentage}% of + the time. {/if} -
+
Date
Total Notional Sum
Total Trade Count
Total Share Quantity
Exchange holidays
New Years Day 01.01.2024
Martin Luther King, Jr. Day 15.01.2024
Washington's Birthday 19.02.2024
Good Friday 29.03.2024
Memorial Day 27.05.2024
Juneteenth National Independence Day 19.06.2024
Independence Day 04.07.2024
Labor Day 02.09.2024
Thanksgiving Day 28.11.2024
Christmas 25.12.2024
-
- - - + + + {#each xData as item} + - {#each xData as item} - - {/each} - - - - - - - {#each tableRevenue as item, index} - - {/each} - - - - - - {#each tableRevenueEst as item, index} - - {/each} - - - - - {#each tableRevenueSurprise as item, index} - + + + + + {#each tableRevenue as item, index} + - {/each} - - - - - - {#each tableEPS as item, index} - - {/each} - + >{@html abbreviateNumber(item, false, true)} + {:else} + n/a + {/if} + {:else} + {@html abbreviateNumber(item, false, true)} + {/if} + + {/each} + - - - - {#each tableEPSEst as item, index} - - {/each} - - - - - - {#each tableEPSSurprise as item, index} - + + {#each tableRevenueEst as item, index} + - {/each} - + >{@html abbreviateNumber(item, false, true)} + {:else} + n/a + {/if} + {:else} + {@html abbreviateNumber(item, false, true)} + {/if} + + {/each} + - - + {#each tableRevenueSurprise as item, index} + + {/each} + + + + + {#each tableEPS as item, index} + + {/each} + + + + + {#each tableEPSEst as item, index} + + {/each} + + + + + {#each tableEPSSurprise as item, index} + + {/each} + + + + + {#each tableVolatility as item, index} + - {/each} - - - - - -
Date
Date{item}{item}
- Reported Revenue - - {#if index !== 0} - {#if userTier !== "Pro"} - - Pro - - - - - {:else} - {#if item !== undefined && item !== null} - {abbreviateNumber(item)} - {:else} - n/a - {/if} - {/if} - {:else} - {abbreviateNumber(item)} - {/if} -
- Est. Revenue - - {#if index !== 0} - {#if userTier !== "Pro"} - - Pro - - - - - {:else} - {#if item !== undefined && item !== null} - {abbreviateNumber(item)} - {:else} - n/a - {/if} - {/if} - {:else} - {abbreviateNumber(item)} - {/if} -
- Revenue Surprise - - {#if index !== 0} - {#if userTier !== "Pro"} - - Pro - - - - - {:else} - {#if item !== undefined && item !== null} - 0 - ? "text-[#00FC50] before:content-['+']" - : item < 0 - ? "text-[#FF2F1F]" - : ""} - > - {abbreviateNumber(item)}% - - {:else} - n/a - {/if} - {/if} - {:else} + {/each} +
+ Reported Revenue + + {#if index !== 0} + {#if userTier !== "Pro"} + + Pro + + + + + {:else if item !== undefined && item !== null} 0 - ? "text-[#00FC50] before:content-['+']" - : item < 0 - ? "text-[#FF2F1F]" - : ""} - > - {abbreviateNumber(item)}% - - {/if} -
- Reported EPS - - {#if index !== 0} - {#if userTier !== "Pro"} - - Pro - - - - - {:else} - {#if item !== undefined && item !== null} - {abbreviateNumber(item)} - {:else} - n/a - {/if} - {/if} - {:else} - {abbreviateNumber(item)} - {/if} -
- Est. EPS - - {#if index !== 0} - {#if userTier !== "Pro"} - - Pro - - - - - {:else} - {#if item !== undefined && item !== null} - {abbreviateNumber(item)} - {:else} - n/a - {/if} - {/if} - {:else} - {abbreviateNumber(item)} - {/if} -
- EPS Surprise - - {#if index !== 0} - {#if userTier !== "Pro"} - - Pro - - - - - {:else} - {#if item !== undefined && item !== null} - 0 - ? "text-[#00FC50] before:content-['+']" - : item < 0 - ? "text-[#FF2F1F]" - : ""} - > - {abbreviateNumber(item)}% - - {:else} - n/a - {/if} - {/if} - {:else} +
+ Est. Revenue + + {#if index !== 0} + {#if userTier !== "Pro"} + + Pro + + + + + {:else if item !== undefined && item !== null} 0 - ? "text-[#00FC50] before:content-['+']" - : item < 0 - ? "text-[#FF2F1F]" - : ""} - > - {abbreviateNumber(item)}% - - {/if} -
+ + Revenue Surprise + + {#if index !== 0} + {#if userTier !== "Pro"} + + Pro + + + + + {:else if item !== undefined && item !== null} + 0 + ? "text-[#00FC50] before:content-['+']" + : item < 0 + ? "text-[#FF2F1F]" + : ""} + > + {abbreviateNumber(item)}% + + {:else} + n/a + {/if} + {:else} + 0 + ? "text-[#00FC50] before:content-['+']" + : item < 0 + ? "text-[#FF2F1F]" + : ""} > - Volatility - - {#each tableVolatility as item, index} - - {#if index !== 0} - {#if userTier !== "Pro"} - - Pro - - - - - {:else} - {#if item !== undefined && item !== null} - ±{abbreviateNumber(item)}% - {:else} - n/a - {/if} - {/if} - {:else} + {abbreviateNumber(item)}% + + {/if} +
+ Reported EPS + + {#if index !== 0} + {#if userTier !== "Pro"} + + Pro + + + + + {:else if item !== undefined && item !== null} + {abbreviateNumber(item)} + {:else} + n/a + {/if} + {:else} + {abbreviateNumber(item)} + {/if} +
+ Est. EPS + + {#if index !== 0} + {#if userTier !== "Pro"} + + Pro + + + + + {:else if item !== undefined && item !== null} + {abbreviateNumber(item)} + {:else} + n/a + {/if} + {:else} + {abbreviateNumber(item)} + {/if} +
+ EPS Surprise + + {#if index !== 0} + {#if userTier !== "Pro"} + + Pro + + + + + {:else if item !== undefined && item !== null} + 0 + ? "text-[#00FC50] before:content-['+']" + : item < 0 + ? "text-[#FF2F1F]" + : ""} + > + {abbreviateNumber(item)}% + + {:else} + n/a + {/if} + {:else} + 0 + ? "text-[#00FC50] before:content-['+']" + : item < 0 + ? "text-[#FF2F1F]" + : ""} + > + {abbreviateNumber(item)}% + + {/if} +
+ Volatility + + {#if index !== 0} + {#if userTier !== "Pro"} + + Pro + + + + + {:else if item !== undefined && item !== null} ±{abbreviateNumber(item)}% - {/if} -
- - - - - {/if} - {:else} -
-
- -
+ {:else} + n/a + {/if} + {:else} + ±{abbreviateNumber(item)}% + {/if} +
{/if} - - - - - - - - \ No newline at end of file + } + + .chart { + width: 100%; + } + diff --git a/src/lib/components/RetailVolume.svelte b/src/lib/components/RetailVolume.svelte index 03dc6b17..d15bad83 100644 --- a/src/lib/components/RetailVolume.svelte +++ b/src/lib/components/RetailVolume.svelte @@ -272,7 +272,7 @@
- + @@ -282,7 +282,7 @@ {formatDateRange(rawData?.lastDate)} - + @@ -292,7 +292,7 @@ {monthlyVolume} - + diff --git a/src/lib/components/ShareHolders.svelte b/src/lib/components/ShareHolders.svelte index 33bce8d4..b6e6c1fa 100644 --- a/src/lib/components/ShareHolders.svelte +++ b/src/lib/components/ShareHolders.svelte @@ -248,11 +248,15 @@ > Institutions hold a total of {abbreviateNumber(rawData?.numberOf13Fshares)}{@html abbreviateNumber( + rawData?.numberOf13Fshares, + false, + true, + )} {$displayCompanyName} shares, with a combined investment of {abbreviateNumber(rawData?.totalInvested, true)}{@html abbreviateNumber(rawData?.totalInvested, true, true)}. @@ -320,7 +324,7 @@
0}
- {item?.sharesNumber !== null - ? abbreviateNumber(item?.sharesNumber) + {@html item?.sharesNumber !== null + ? abbreviateNumber(item?.sharesNumber, false, true) : "-"} diff --git a/src/lib/components/ShareStatistics.svelte b/src/lib/components/ShareStatistics.svelte index bb290af8..5cc5ffd1 100644 --- a/src/lib/components/ShareStatistics.svelte +++ b/src/lib/components/ShareStatistics.svelte @@ -111,7 +111,7 @@
Date
Volume in $
Retail Sentiment Range
- + @@ -121,7 +121,7 @@ {abbreviateNumber(rawData?.sharesShort)} - + @@ -131,7 +131,7 @@ {abbreviateNumber(rawData?.sharesShortPriorMonth)} - + @@ -141,7 +141,7 @@ {rawData?.shortOutStandingPercent}% - + diff --git a/src/lib/components/TARating.svelte b/src/lib/components/TARating.svelte index 85b1e321..13cfc2c0 100644 --- a/src/lib/components/TARating.svelte +++ b/src/lib/components/TARating.svelte @@ -206,7 +206,7 @@ {#each showFullStats ? signalList : signalList?.slice(0, 3) as item, index} 2 diff --git a/src/lib/components/Table/Table.svelte b/src/lib/components/Table/Table.svelte index 44c1cdb3..6413b7ea 100644 --- a/src/lib/components/Table/Table.svelte +++ b/src/lib/components/Table/Table.svelte @@ -148,8 +148,16 @@ }, { name: "Top Analyst Rating", rule: "topAnalystRating", type: "rating" }, { name: "Top Analyst Count", rule: "topAnalystCounter", type: "int" }, - { name: "Top Analyst Price Target", rule: "topAnalystPriceTarget", type: "float" }, - { name: "Top Analyst PT Upside", rule: "topAnalystUpside", type: "percentSign" }, + { + name: "Top Analyst Price Target", + rule: "topAnalystPriceTarget", + type: "float", + }, + { + name: "Top Analyst PT Upside", + rule: "topAnalystUpside", + type: "percentSign", + }, ]; allRows = [...allRows, ...specificRows]; @@ -164,58 +172,57 @@ allRows = sortIndicatorCheckMarks(allRows); - const handleDownloadMessage = (event) => { - let updateData = event?.data?.rawData ?? []; // Use a new variable for updated data - // Check if both arrays exist and have data - if (!updateData?.length || !rawData?.length) { - return; - } - - // Create a new array to ensure reactivity - const updatedRawData = [...rawData]; - - for (let i = 0; i < updateData.length; i++) { - if (updatedRawData[i]) { - // Create a new object to merge the data - let newData = {}; - - // Merge fields from updateData - Object.assign(newData, updateData[i]); - - // Merge fields from defaultRules that are missing in updateData - defaultRules.forEach((rule) => { - if (!(rule in updateData[i]) && rule in updatedRawData[i]) { - newData[rule] = updatedRawData[i][rule]; - } - }); - - // Preserve the original 'priceTarget' and other default rule values - for (let rule of defaultRules) { - if (rule in updatedRawData[i]) { - newData[rule] = updatedRawData[i][rule]; - } - } - - // Ensure 'rank' and 'years' are added if they are missing in updateData - if (!("rank" in updateData[i]) && "rank" in updatedRawData[i]) { - newData.rank = updatedRawData[i]["rank"]; - } - if (!("years" in updateData[i]) && "years" in updatedRawData[i]) { - newData.years = updatedRawData[i]["years"]; - } - - // Update the specific item in the array - updatedRawData[i] = newData; + let updateData = event?.data?.rawData ?? []; // Use a new variable for updated data + // Check if both arrays exist and have data + if (!updateData?.length || !rawData?.length) { + return; } - } - - // Trigger reactivity by creating a new reference - rawData = [...updatedRawData]; - stockList = rawData?.slice(0, 100); - columns = generateColumns(rawData); - sortOrders = generateSortOrders(rawData); -}; + + // Create a new array to ensure reactivity + const updatedRawData = [...rawData]; + + for (let i = 0; i < updateData.length; i++) { + if (updatedRawData[i]) { + // Create a new object to merge the data + let newData = {}; + + // Merge fields from updateData + Object.assign(newData, updateData[i]); + + // Merge fields from defaultRules that are missing in updateData + defaultRules.forEach((rule) => { + if (!(rule in updateData[i]) && rule in updatedRawData[i]) { + newData[rule] = updatedRawData[i][rule]; + } + }); + + // Preserve the original 'priceTarget' and other default rule values + for (let rule of defaultRules) { + if (rule in updatedRawData[i]) { + newData[rule] = updatedRawData[i][rule]; + } + } + + // Ensure 'rank' and 'years' are added if they are missing in updateData + if (!("rank" in updateData[i]) && "rank" in updatedRawData[i]) { + newData.rank = updatedRawData[i]["rank"]; + } + if (!("years" in updateData[i]) && "years" in updatedRawData[i]) { + newData.years = updatedRawData[i]["years"]; + } + + // Update the specific item in the array + updatedRawData[i] = newData; + } + } + + // Trigger reactivity by creating a new reference + rawData = [...updatedRawData]; + stockList = rawData?.slice(0, 100); + columns = generateColumns(rawData); + sortOrders = generateSortOrders(rawData); + }; const updateStockScreenerData = async () => { downloadWorker.postMessage({ @@ -687,7 +694,6 @@ }; $: charNumber = $screenWidth < 640 ? 15 : 20; - @@ -857,7 +863,7 @@ {#each stockList as item, index} {#each analystList as item, index}
-
+
{#each Array.from({ length: 5 }) as _, i} {#if i < Math.floor(analystScore)} - ({analystScore})({analystScore})
@@ -289,7 +290,9 @@
# {rank}
-
+
Out of {numOfAnalysts} analysts
@@ -299,7 +302,9 @@
{totalRatings}
-
+
Total ratings
@@ -313,7 +318,9 @@ : "text-[#EF4444]"}>{successRate?.toFixed(2)}%
-
+
Success rate
@@ -327,7 +334,9 @@ : "text-[#EF4444]"}>{avgReturn?.toFixed(2)}% -
+
Average return
@@ -388,7 +397,7 @@ {#each stockList as item, index} - - - +
{#each stockList as item, index}
- diff --git a/src/routes/crypto/+page.svelte b/src/routes/crypto/+page.svelte index fafc8912..baf1e715 100644 --- a/src/routes/crypto/+page.svelte +++ b/src/routes/crypto/+page.svelte @@ -174,7 +174,7 @@ {#each symbolList as item, index} goto("/crypto/" + item?.symbol)} - class="sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] odd:bg-secondary border-b-[#09090B] shake-ticker cursor-pointer" + class="sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] odd:bg-odd border-b-[#09090B] shake-ticker cursor-pointer" > {#each quantStats[$cryptoTicker?.toUpperCase()]["Worst 10 Drawdowns"] as item} - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + {#each rawData?.history as item} - + {#each senateTradingList as item} {#each data?.user?.tier === "Pro" ? optionChainList : optionChainList?.slice(0, 3) as item, index} {#each optionHistoryList as item} - + diff --git a/src/routes/etf/[tickerID]/stats/+page.svelte b/src/routes/etf/[tickerID]/stats/+page.svelte index b3c1b3db..68a3ef2f 100644 --- a/src/routes/etf/[tickerID]/stats/+page.svelte +++ b/src/routes/etf/[tickerID]/stats/+page.svelte @@ -329,9 +329,7 @@ updateYearRange() {#each quantStats[$etfTicker?.toUpperCase()]["Worst 10 Drawdowns"] as item} - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + {#each ipoList as item} {#each ipoList as item} {#each displayResults as item} {#each displayResults as item (item?.symbol)} {#each displayResults as item (item?.symbol)}
Short Interest
Short Previous Month
Short % of Shares Out
Short % of Float
{:else} {/if} diff --git a/src/routes/analysts/+page.svelte b/src/routes/analysts/+page.svelte index f0907536..39a9fa51 100644 --- a/src/routes/analysts/+page.svelte +++ b/src/routes/analysts/+page.svelte @@ -206,7 +206,7 @@
{#each senateTradingList as item}
@@ -432,9 +430,7 @@ updateYearRange()
@@ -476,9 +472,7 @@ updateYearRange()
@@ -514,9 +508,7 @@ updateYearRange()
@@ -536,9 +528,7 @@ updateYearRange()
@@ -558,9 +548,7 @@ updateYearRange()
@@ -598,9 +586,7 @@ updateYearRange()
@@ -620,9 +606,7 @@ updateYearRange()
@@ -642,9 +626,7 @@ updateYearRange()
@@ -662,9 +644,7 @@ updateYearRange()
@@ -682,9 +662,7 @@ updateYearRange()
@@ -702,9 +680,7 @@ updateYearRange()
@@ -724,9 +700,7 @@ updateYearRange()
@@ -746,9 +720,7 @@ updateYearRange()
@@ -786,9 +758,7 @@ updateYearRange()
@@ -826,9 +796,7 @@ updateYearRange()
@@ -866,9 +834,7 @@ updateYearRange()
@@ -888,9 +854,7 @@ updateYearRange()
@@ -910,9 +874,7 @@ updateYearRange()
@@ -954,9 +916,7 @@ updateYearRange()
@@ -998,9 +958,7 @@ updateYearRange()
@@ -1020,9 +978,7 @@ updateYearRange()
@@ -1040,9 +996,7 @@ updateYearRange()
@@ -1060,9 +1014,7 @@ updateYearRange()
@@ -1082,9 +1034,7 @@ updateYearRange()
@@ -1104,9 +1054,7 @@ updateYearRange()
@@ -1126,9 +1074,7 @@ updateYearRange()
@@ -1148,9 +1094,7 @@ updateYearRange()
@@ -1170,9 +1114,7 @@ updateYearRange()
@@ -1208,9 +1150,7 @@ updateYearRange()
@@ -1248,9 +1188,7 @@ updateYearRange()
@@ -1288,9 +1226,7 @@ updateYearRange()
@@ -1326,9 +1262,7 @@ updateYearRange()
@@ -1368,9 +1302,7 @@ updateYearRange()
@@ -1410,9 +1342,7 @@ updateYearRange()
@@ -1452,9 +1382,7 @@ updateYearRange()
@@ -1494,9 +1422,7 @@ updateYearRange()
@@ -1536,9 +1462,7 @@ updateYearRange()
@@ -1576,9 +1500,7 @@ updateYearRange()
@@ -1598,9 +1520,7 @@ updateYearRange()
@@ -1620,9 +1540,7 @@ updateYearRange()
@@ -1642,9 +1560,7 @@ updateYearRange()
@@ -1682,9 +1598,7 @@ updateYearRange()
@@ -1724,9 +1638,7 @@ updateYearRange()
@@ -1746,9 +1658,7 @@ updateYearRange()
@@ -1768,9 +1678,7 @@ updateYearRange()
@@ -1790,9 +1698,7 @@ updateYearRange()
diff --git a/src/routes/dividends-calendar/+page.svelte b/src/routes/dividends-calendar/+page.svelte index 6614caf9..28989ca6 100644 --- a/src/routes/dividends-calendar/+page.svelte +++ b/src/routes/dividends-calendar/+page.svelte @@ -478,7 +478,7 @@ {#each day as item}
{#each stockList as item, index}
diff --git a/src/routes/etf/[tickerID]/insider/+page.svelte b/src/routes/etf/[tickerID]/insider/+page.svelte index 162c3148..96db7dd1 100644 --- a/src/routes/etf/[tickerID]/insider/+page.svelte +++ b/src/routes/etf/[tickerID]/insider/+page.svelte @@ -321,7 +321,7 @@
handleViewData(item?.date)} on:mouseover={() => getDailyTransactions($etfTicker + "+" + item?.date)} - class="cursor-pointer sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] odd:bg-secondary border-b-[#09090B] {index + + class="cursor-pointer sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] odd:bg-odd border-b-[#09090B] {index + 1 === optionList?.slice(0, 3)?.length && data?.user?.tier !== 'Pro' @@ -1067,8 +1067,7 @@
{formatTime(item?.time)}
@@ -432,9 +430,7 @@ updateYearRange()
@@ -476,9 +472,7 @@ updateYearRange()
@@ -514,9 +508,7 @@ updateYearRange()
@@ -536,9 +528,7 @@ updateYearRange()
@@ -558,9 +548,7 @@ updateYearRange()
@@ -598,9 +586,7 @@ updateYearRange()
@@ -618,9 +604,7 @@ updateYearRange()
@@ -640,9 +624,7 @@ updateYearRange()
@@ -660,9 +642,7 @@ updateYearRange()
@@ -680,9 +660,7 @@ updateYearRange()
@@ -700,9 +678,7 @@ updateYearRange()
@@ -722,9 +698,7 @@ updateYearRange()
@@ -744,9 +718,7 @@ updateYearRange()
@@ -784,9 +756,7 @@ updateYearRange()
@@ -824,9 +794,7 @@ updateYearRange()
@@ -864,9 +832,7 @@ updateYearRange()
@@ -886,9 +852,7 @@ updateYearRange()
@@ -906,9 +870,7 @@ updateYearRange()
@@ -950,9 +912,7 @@ updateYearRange()
@@ -994,9 +954,7 @@ updateYearRange()
@@ -1016,9 +974,7 @@ updateYearRange()
@@ -1036,9 +992,7 @@ updateYearRange()
@@ -1056,9 +1010,7 @@ updateYearRange()
@@ -1078,9 +1030,7 @@ updateYearRange()
@@ -1100,9 +1050,7 @@ updateYearRange()
@@ -1122,9 +1070,7 @@ updateYearRange()
@@ -1144,9 +1090,7 @@ updateYearRange()
@@ -1166,9 +1110,7 @@ updateYearRange()
@@ -1204,9 +1146,7 @@ updateYearRange()
@@ -1244,9 +1184,7 @@ updateYearRange()
@@ -1284,9 +1222,7 @@ updateYearRange()
@@ -1322,9 +1258,7 @@ updateYearRange()
@@ -1364,9 +1298,7 @@ updateYearRange()
@@ -1406,9 +1338,7 @@ updateYearRange()
@@ -1448,9 +1378,7 @@ updateYearRange()
@@ -1490,9 +1418,7 @@ updateYearRange()
@@ -1532,9 +1458,7 @@ updateYearRange()
@@ -1572,9 +1496,7 @@ updateYearRange()
@@ -1594,9 +1516,7 @@ updateYearRange()
@@ -1616,9 +1536,7 @@ updateYearRange()
@@ -1638,9 +1556,7 @@ updateYearRange()
@@ -1678,9 +1594,7 @@ updateYearRange()
@@ -1720,9 +1634,7 @@ updateYearRange()
@@ -1742,9 +1654,7 @@ updateYearRange()
@@ -1764,9 +1674,7 @@ updateYearRange()
@@ -1786,9 +1694,7 @@ updateYearRange()
diff --git a/src/routes/etf/etf-providers/+page.svelte b/src/routes/etf/etf-providers/+page.svelte index e80ca66f..78df1e06 100644 --- a/src/routes/etf/etf-providers/+page.svelte +++ b/src/routes/etf/etf-providers/+page.svelte @@ -120,73 +120,72 @@ -
- - +
+
-
-
- - - - - - {#each etfProviderList as item,index} - - - + + {/each} + +
+
+ + + + + + {#each etfProviderList as item, index} + + - - {formatETFName(item?.etfProvider)} - - + + {formatETFName(item?.etfProvider)} + + - + - + - + - - - {/each} - -
- {abbreviateNumber(item?.totalAssets)} - + {abbreviateNumber(item?.totalAssets)} + - {item?.funds} - + {item?.funds} + - {item?.avgExpenseRatio}% - + {item?.avgExpenseRatio}% + - {item?.avgHoldings} -
+
+ {item?.avgHoldings} +
+
+
- -
-
diff --git a/src/routes/etf/etf-providers/[slug]/+page.svelte b/src/routes/etf/etf-providers/[slug]/+page.svelte index 45cd4b06..fef46a51 100644 --- a/src/routes/etf/etf-providers/[slug]/+page.svelte +++ b/src/routes/etf/etf-providers/[slug]/+page.svelte @@ -119,20 +119,18 @@ etfProviderData = [...originalData].sort(compareValues)?.slice(0, 50); }; - function generateStatementInfoHTML() { return ` ${etfProviderName} has ${rawData?.length} ETFs listed with a total of ${abbreviateNumber( - totalAssets - )} + totalAssets, + )} in assets under management. The funds have an average expense ratio of ${avgExpenseRatio?.toFixed( 2, )}%. `; -} - -let htmlOutput = generateStatementInfoHTML(); + } + let htmlOutput = generateStatementInfoHTML(); @@ -166,9 +164,9 @@ let htmlOutput = generateStatementInfoHTML();
{#if rawData?.length !== 0} -
- -
+
+ +
{/if}
-
-
- - - - - - {#each etfProviderData as item, index} - - - + + {/each} + +
+
+ + + + + + {#each etfProviderData as item, index} + + - - + - + - + - + - + - + - - - {/each} - -
+ + - {item?.name?.length > charNumber - ? item?.name?.slice(0, charNumber) + "..." - : item?.name} - + {item?.name?.length > charNumber + ? item?.name?.slice(0, charNumber) + "..." + : item?.name} + - {item?.price} - + {item?.price} + - {#if item?.changesPercentage >= 0} - +{item?.changesPercentage >= 1000 - ? abbreviateNumber(item?.changesPercentage) - : item?.changesPercentage?.toFixed(2)}% - {:else if item?.changesPercentage < 0} - {item?.changesPercentage <= -1000 - ? abbreviateNumber(item?.changesPercentage) - : item?.changesPercentage?.toFixed(2)}% - - {:else} - - - {/if} - + {#if item?.changesPercentage >= 0} + +{item?.changesPercentage >= 1000 + ? abbreviateNumber(item?.changesPercentage) + : item?.changesPercentage?.toFixed(2)}% + {:else if item?.changesPercentage < 0} + {item?.changesPercentage <= -1000 + ? abbreviateNumber(item?.changesPercentage) + : item?.changesPercentage?.toFixed(2)}% + + {:else} + - + {/if} + - {abbreviateNumber(item?.totalAssets)} - + {abbreviateNumber(item?.totalAssets)} + - {item?.numberOfHoldings} - + {item?.numberOfHoldings} + - {item?.expenseRatio}% -
+
+ {item?.expenseRatio}% +
+
+
- -
-
{:else}
{#each etfData as item}
goto(`/stocks/${item?.symbol}`)} - class="sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] odd:bg-secondary {index + + class="sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] odd:bg-odd {index + 1 === displayList?.length && data?.user?.tier !== 'Pro' ? 'opacity-[0.1]' diff --git a/src/routes/industry/all/+page.svelte b/src/routes/industry/all/+page.svelte index e87ad32d..6c8b0076 100644 --- a/src/routes/industry/all/+page.svelte +++ b/src/routes/industry/all/+page.svelte @@ -104,7 +104,7 @@ {#each displayList as item}
{#each stockList as item, index}
{#if isLoaded} -
- -
+
+ +
- -
Select Time period @@ -146,7 +146,7 @@
{#each tableData as item}
handleFilter(item?.id)} diff --git a/src/routes/stock-screener/+page.svelte b/src/routes/stock-screener/+page.svelte index f3e72a4e..6bfc02da 100644 --- a/src/routes/stock-screener/+page.svelte +++ b/src/routes/stock-screener/+page.svelte @@ -1569,7 +1569,7 @@ ruleOfList = strategyList?.find((item) => item.id === selectedStrategy)?.rules ?? []; - ruleOfList.forEach((rule) => { + ruleOfList.forEach((rule) => { ruleCondition[rule.name] = rule.condition || allRules[rule.name].defaultCondition; valueMappings[rule.name] = rule.value || allRules[rule.name].defaultValue; @@ -1596,11 +1596,19 @@ ) // Only include specific rules ?.map((rule) => [rule.name, new Set(rule.value)]), // Create Map from filtered rules ); - } function changeRule(state: string) { - if (data?.user?.tier !== "Pro" && ['topAnalystRating','topAnalystCounter','topAnalystPriceTarget','topAnalystUpside','score']?.includes(state)) { + if ( + data?.user?.tier !== "Pro" && + [ + "topAnalystRating", + "topAnalystCounter", + "topAnalystPriceTarget", + "topAnalystUpside", + "score", + ]?.includes(state) + ) { goto("/pricing"); } else { selectedPopularStrategy = ""; @@ -1624,7 +1632,7 @@ }; const loadWorker = async () => { - if (['performance', 'analysts']?.includes(displayTableTab) || hoverStatus) { + if (["performance", "analysts"]?.includes(displayTableTab) || hoverStatus) { syncWorker.postMessage({ stockScreenerData, ruleOfList: [...ruleOfList, ...otherTabRules], @@ -1638,7 +1646,7 @@ }; const updateStockScreenerData = async () => { - if (["performance","analysts"]?.includes(displayTableTab) || hoverStatus) { + if (["performance", "analysts"]?.includes(displayTableTab) || hoverStatus) { downloadWorker.postMessage({ ruleOfList: [...ruleOfList, ...otherTabRules], }); @@ -1823,7 +1831,7 @@ const handleKeyDown = (event) => { strategyList.find((item) => item.id === selectedStrategy).rules = ruleOfList; - const postData = { + const postData = { strategyId: selectedStrategy, rules: ruleOfList, }; @@ -1848,7 +1856,7 @@ const handleKeyDown = (event) => { } $: { - if (ruleOfList ) { + if (ruleOfList) { const ruleToUpdate = ruleOfList?.find((rule) => rule.name === ruleName); if (ruleToUpdate) { ruleToUpdate.value = valueMappings[ruleToUpdate.name]; @@ -2146,7 +2154,9 @@ const handleKeyDown = (event) => { ? sectorList : ruleName === "industry" ? industryList - : ['analystRating','topAnalystRating','score']?.includes(ruleName) + : ["analystRating", "topAnalystRating", "score"]?.includes( + ruleName, + ) ? ["Strong Buy", "Buy", "Hold", "Sell", "Strong Sell"] : ["Compliant", "Non-Compliant"]; testList = @@ -2300,8 +2310,9 @@ const handleKeyDown = (event) => { columns = [...(baseColumnsMap[displayTableTab] || [])]; sortOrders = { ...(baseSortOrdersMap[displayTableTab] || {}) }; - const rulesList = - ["performance","analysts"]?.includes(displayTableTab) ? tabRuleList : displayRules; + const rulesList = ["performance", "analysts"]?.includes(displayTableTab) + ? tabRuleList + : displayRules; rulesList?.forEach((rule) => { if (rule.rule !== "marketCap") { columns.push({ @@ -2351,7 +2362,7 @@ const handleKeyDown = (event) => { await updateStockScreenerData(); } } -/* + /* async function handleMouseOver() { if (displayTableTab !== "performance") { hoverStatus = true; @@ -2995,7 +3006,7 @@ const handleKeyDown = (event) => { autocomplete="off" class="{![ 'analystRating', - "topAnalystRating", + 'topAnalystRating', 'halalStocks', 'score', 'sector', @@ -3011,7 +3022,7 @@ const handleKeyDown = (event) => { {/if} - {#if !["sma20", "sma50", "sma100", "sma200", "ema20", "ema50", "ema100", "ema200", "grahamNumber", "analystRating", "topAnalystRating","halalStocks", "score", "sector", "industry", "country"]?.includes(row?.rule)} + {#if !["sma20", "sma50", "sma100", "sma200", "ema20", "ema50", "ema100", "ema200", "grahamNumber", "analystRating", "topAnalystRating", "halalStocks", "score", "sector", "industry", "country"]?.includes(row?.rule)} {#each row?.step as newValue, index} {#if ruleCondition[row?.rule] === "between"} {#if newValue && row?.step[index + 1]} @@ -3080,7 +3091,7 @@ const handleKeyDown = (event) => { {/each} {:else} - {#each testList.length > 0 && searchQuery?.length > 0 ? testList : searchQuery?.length > 0 && testList?.length === 0 ? [] : row?.rule === "country" ? listOfRelevantCountries : row?.rule === "sector" ? sectorList : row?.rule === "industry" ? industryList : ['analystRating','topAnalystRating','score']?.includes(ruleName) ? ["Strong Buy", "Buy", "Hold", "Sell", "Strong Sell"] : ["Compliant", "Non-Compliant"] as item} + {#each testList.length > 0 && searchQuery?.length > 0 ? testList : searchQuery?.length > 0 && testList?.length === 0 ? [] : row?.rule === "country" ? listOfRelevantCountries : row?.rule === "sector" ? sectorList : row?.rule === "industry" ? industryList : ["analystRating", "topAnalystRating", "score"]?.includes(ruleName) ? ["Strong Buy", "Buy", "Hold", "Sell", "Strong Sell"] : ["Compliant", "Non-Compliant"] as item}
{
  • {
    {
    {
    - {:else if displayTableTab === "analysts"} + {:else if displayTableTab === "analysts"}
    { {#each displayResults as item (item?.symbol)} @@ -3629,7 +3629,7 @@ const handleKeyDown = (event) => {
    - {#if ['topAnalystRating','topAnalystCounter','topAnalystPriceTarget','topAnalystUpside','score']?.includes(row?.rule) && data?.user?.tier !== "Pro"} + {#if ["topAnalystRating", "topAnalystCounter", "topAnalystPriceTarget", "topAnalystUpside", "score"]?.includes(row?.rule) && data?.user?.tier !== "Pro"}
    @@ -1169,8 +1173,8 @@ > @@ -1216,9 +1220,11 @@ diff --git a/src/routes/stocks/[tickerID]/dividends/+layout.svelte b/src/routes/stocks/[tickerID]/dividends/+layout.svelte index 1dab400b..ec88b81d 100644 --- a/src/routes/stocks/[tickerID]/dividends/+layout.svelte +++ b/src/routes/stocks/[tickerID]/dividends/+layout.svelte @@ -42,33 +42,33 @@ {#if similarStocks?.length > 0}

    Related Stocks

    { > {#if row?.rule === "marketCap"} {abbreviateNumber(item[row?.rule])} - - {:else if ['analystCounter','priceTarget']?.includes(row?.rule)} + {:else if ["analystCounter", "priceTarget"]?.includes(row?.rule)} {abbreviateNumber( - item[row?.rule], - )}{abbreviateNumber(item[row?.rule])} - - {:else if row?.rule === 'upside'} - {#if item[row?.rule] > 0} - +{item[row?.rule]?.toFixed(2)}% - {:else if item[row?.rule] < 0} - {item[row?.rule]?.toFixed(2)}% - {:else} - n/a - {/if} - - {:else if ['analystRating','topAnalystRating']?.includes(row?.rule)} + {:else if row?.rule === "upside"} + {#if item[row?.rule] > 0} + +{item[row?.rule]?.toFixed(2)}% + {:else if item[row?.rule] < 0} + {item[row?.rule]?.toFixed(2)}% + {:else} + n/a + {/if} + {:else if ["analystRating", "topAnalystRating"]?.includes(row?.rule)} {#if ["Strong Buy", "Buy"].includes(item[row?.rule])} - {item[row?.rule]} - {:else if ["Strong Sell", "Sell"].includes(item[row?.rule])} - {item[row?.rule]} - {:else if item[row?.rule] === "Hold"} - {item[row?.rule]} - {:else} - - + {item[row?.rule]} + {:else if ["Strong Sell", "Sell"].includes(item[row?.rule])} + {item[row?.rule]} + {:else if item[row?.rule] === "Hold"} + {item[row?.rule]} + {:else} + - {/if} {/if}
    {stockDeck?.revenueTTM !== null && + >{@html stockDeck?.revenueTTM !== null && stockDeck?.revenueTTM !== 0 - ? abbreviateNumber(stockDeck?.revenueTTM) + ? abbreviateNumber(stockDeck?.revenueTTM, false, true) : "n/a"}
    {stockDeck?.netIncomeTTM !== null - ? abbreviateNumber(stockDeck?.netIncomeTTM) + >{@html stockDeck?.netIncomeTTM !== null + ? abbreviateNumber(stockDeck?.netIncomeTTM, false, true) : "n/a"}
    {data?.getStockQuote?.sharesOutstanding !== null + >{@html data?.getStockQuote?.sharesOutstanding !== null ? abbreviateNumber( data?.getStockQuote?.sharesOutstanding, + false, + true, ) : "n/a"}
    {stockDeck?.floatShares !== null - ? abbreviateNumber(stockDeck?.floatShares) + >{@html stockDeck?.floatShares !== null + ? abbreviateNumber(stockDeck?.floatShares, false, true) : "n/a"}
    {#each similarStocks?.slice(0, 8) as item} - -
    Company Dividend Yield
    {item?.symbol}{item?.dividendYield !== null && item?.dividendYield !== undefined ? item?.dividendYield + "%" diff --git a/src/routes/stocks/[tickerID]/dividends/+page.svelte b/src/routes/stocks/[tickerID]/dividends/+page.svelte index c942b132..41ddc74e 100644 --- a/src/routes/stocks/[tickerID]/dividends/+page.svelte +++ b/src/routes/stocks/[tickerID]/dividends/+page.svelte @@ -120,56 +120,62 @@ isLoaded = true; }); -function generateDividendInfoHTML() { - const history = rawData?.history || []; + function generateDividendInfoHTML() { + const history = rawData?.history || []; - if (history.length !== 0) { - if (!dateDistance) { - const formattedExDividendDate = new Date(exDividendDate).toLocaleString('en-US', { - month: 'short', - day: 'numeric', - year: 'numeric' - }); + if (history.length !== 0) { + if (!dateDistance) { + const formattedExDividendDate = new Date(exDividendDate).toLocaleString( + "en-US", + { + month: "short", + day: "numeric", + year: "numeric", + }, + ); - const payoutFrequencyText = - payoutFrequency === 4 - ? '3 months' - : payoutFrequency === 2 - ? '6 months' - : payoutFrequency === 1 - ? '12 months' - : 'n/a'; + const payoutFrequencyText = + payoutFrequency === 4 + ? "3 months" + : payoutFrequency === 2 + ? "6 months" + : payoutFrequency === 1 + ? "12 months" + : "n/a"; - return ` + return ` ${$displayCompanyName} has an annual dividend of $${annualDividend} per share, with a forward yield of ${dividendYield}%. The dividend is paid every ${payoutFrequencyText} and the last ex-dividend date was ${formattedExDividendDate}. `; - } else { - const latestDividendDate = new Date(history.at(0)?.date).toLocaleString('en-US', { - month: 'short', - day: 'numeric', - year: 'numeric' - }); + } else { + const latestDividendDate = new Date(history.at(0)?.date).toLocaleString( + "en-US", + { + month: "short", + day: "numeric", + year: "numeric", + }, + ); - return ` + return ` ${$displayCompanyName} issued its most recent dividend on ${latestDividendDate}. Since then, the company has not distributed any further dividends for over 12 months. `; - } - } else { - return ` + } + } else { + return ` No dividend history available for ${$displayCompanyName}. `; + } } -} -const htmlOutput = generateDividendInfoHTML(); + const htmlOutput = generateDividendInfoHTML(); @@ -221,7 +227,7 @@ const htmlOutput = generateDividendInfoHTML(); Dividends - + {#if rawData?.history?.length !== 0} @@ -334,40 +340,42 @@ const htmlOutput = generateDividendInfoHTML();
    - + - + {#each rawData?.history as item} - + { @@ -393,7 +383,7 @@ class="w-full mt-5 mb-10 m-auto flex justify-center items-center p-1" >
    0}
    + diff --git a/src/routes/stocks/[tickerID]/insider/congress-trading/+page.svelte b/src/routes/stocks/[tickerID]/insider/congress-trading/+page.svelte index fc885bda..73a72c06 100644 --- a/src/routes/stocks/[tickerID]/insider/congress-trading/+page.svelte +++ b/src/routes/stocks/[tickerID]/insider/congress-trading/+page.svelte @@ -161,7 +161,7 @@ class="w-full mt-5 mb-10 m-auto flex justify-center items-center" >
    {#each senateTradingList as item}
    {#each data?.user?.tier === "Pro" ? optionChainList : optionChainList?.slice(0, 3) as item, index} - {/if} {/if} @@ -1229,7 +1223,7 @@ {#each optionHistoryList as item} - + diff --git a/src/routes/stocks/[tickerID]/statistics/market-cap/+page.svelte b/src/routes/stocks/[tickerID]/statistics/market-cap/+page.svelte index 1c7476fb..d6c65160 100644 --- a/src/routes/stocks/[tickerID]/statistics/market-cap/+page.svelte +++ b/src/routes/stocks/[tickerID]/statistics/market-cap/+page.svelte @@ -693,7 +693,11 @@ + {#each watchList as item}
    Ex-Divid. Date Cash Amount Record Date Pay Date
    {new Date(item?.date)?.toLocaleString("en-US", { month: "short", @@ -377,12 +385,12 @@ const htmlOutput = generateDividendInfoHTML(); })} {item?.adjDividend?.toFixed(3)} {item?.recordDate?.length !== 0 ? new Date(item?.recordDate)?.toLocaleString( @@ -397,7 +405,7 @@ const htmlOutput = generateDividendInfoHTML(); : "n/a"} {item?.paymentDate?.length !== 0 ? new Date(item?.paymentDate)?.toLocaleString( diff --git a/src/routes/stocks/[tickerID]/financials/+page.svelte b/src/routes/stocks/[tickerID]/financials/+page.svelte index 4d3fecae..f7ae081c 100644 --- a/src/routes/stocks/[tickerID]/financials/+page.svelte +++ b/src/routes/stocks/[tickerID]/financials/+page.svelte @@ -391,34 +391,33 @@ } function generateStatementInfoHTML() { - if ($coolMode) { - const statementText = statementConfig?.find( - (item) => item?.propertyName === displayStatement - )?.text; + if ($coolMode) { + const statementText = statementConfig?.find( + (item) => item?.propertyName === displayStatement, + )?.text; - return `${statementText || ''}`; - } else if (income?.length > 0) { - return ` + return `${statementText || ""}`; + } else if (income?.length > 0) { + return ` Get detailed income statement breakdowns, uncovering revenue, expenses, and much more. `; - } else { - return ` + } else { + return ` No financial data available for ${$displayCompanyName}. `; + } } -} - -let htmlOutput = null; -$: { - if($coolMode || displayStatement) { - htmlOutput = generateStatementInfoHTML() + let htmlOutput = null; + $: { + if ($coolMode || displayStatement) { + htmlOutput = generateStatementInfoHTML(); + } } -} @@ -559,9 +558,7 @@ $: { {/if} -
    +
    @@ -690,10 +687,10 @@ $: {
    - + {#each tableList as item, index} - + diff --git a/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.svelte b/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.svelte index 01450be3..e035cb25 100644 --- a/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.svelte +++ b/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.svelte @@ -446,35 +446,33 @@ } function generateStatementInfoHTML() { - if ($coolMode) { - const statementText = statementConfig?.find( - (item) => item?.propertyName === displayStatement - )?.text; + if ($coolMode) { + const statementText = statementConfig?.find( + (item) => item?.propertyName === displayStatement, + )?.text; - return `${statementText || ''}`; - } else if (balanceSheet?.length > 0) { - return ` + return `${statementText || ""}`; + } else if (balanceSheet?.length > 0) { + return ` Get detailed breakdowns of the balance-sheet with total debts, total investments, and much more. `; - } else { - return ` + } else { + return ` No financial data available for ${$displayCompanyName}. `; + } } -} - -let htmlOutput = null; -$: { - if($coolMode || displayStatement) { - htmlOutput = generateStatementInfoHTML() + let htmlOutput = null; + $: { + if ($coolMode || displayStatement) { + htmlOutput = generateStatementInfoHTML(); + } } -} - @@ -619,9 +617,7 @@ $: { {/if} -
    +
    @@ -779,24 +775,28 @@ $: {
    {filterRule === "annual" @@ -719,38 +716,40 @@ $: {
    {item?.date} - {abbreviateNumber(item?.value)} + {@html abbreviateNumber(item?.value, false, true)} - {item?.value - tableList[index + 1]?.value !== 0 + {@html item?.value - + tableList[index + 1]?.value !== + 0 ? abbreviateNumber( ( item?.value - tableList[index + 1]?.value )?.toFixed(2), + false, + true, ) - : "-"} + : "n/a"} {#if index + 1 - tableList?.length === 0} - - + n/a {:else if item?.value === 0 && tableList[index + 1]?.value < 0} -100.00% {:else if item?.value === 0 && tableList[index + 1]?.value > 0} @@ -775,7 +774,7 @@ $: { )?.toFixed(2)}% {:else} - - + n/a {/if}
    - - - - - @@ -804,38 +804,39 @@ $: { {#each tableList as item, index} - + diff --git a/src/routes/stocks/[tickerID]/financials/cash-flow/+page.svelte b/src/routes/stocks/[tickerID]/financials/cash-flow/+page.svelte index bd584692..e080887f 100644 --- a/src/routes/stocks/[tickerID]/financials/cash-flow/+page.svelte +++ b/src/routes/stocks/[tickerID]/financials/cash-flow/+page.svelte @@ -391,36 +391,34 @@ } } - function generateStatementInfoHTML() { - if ($coolMode) { - const statementText = statementConfig?.find( - (item) => item?.propertyName === displayStatement - )?.text; + if ($coolMode) { + const statementText = statementConfig?.find( + (item) => item?.propertyName === displayStatement, + )?.text; - return `${statementText || ''}`; - } else if (cashFlow?.length > 0) { - return ` + return `${statementText || ""}`; + } else if (cashFlow?.length > 0) { + return ` Get detailed ratio statement breakdowns, uncovering price to free cash flow ratio, price per earnings, and much more. `; - } else { - return ` + } else { + return ` No financial data available for ${$displayCompanyName}. `; + } } -} - -let htmlOutput = null; -$: { - if($coolMode || displayStatement) { - htmlOutput = generateStatementInfoHTML() + let htmlOutput = null; + $: { + if ($coolMode || displayStatement) { + htmlOutput = generateStatementInfoHTML(); + } } -} @@ -482,7 +480,7 @@ $: {
    - + {#if cashFlow?.length > 0}
    -
    +
    @@ -708,10 +704,10 @@ $: {
    + {filterRule === "annual" ? "Fiscal Year End" : "Quarter Ends"}{statementConfig?.find( (item) => item?.propertyName === displayStatement, )?.label}ChangeGrowth
    {item?.date} - {abbreviateNumber(item?.value)} + {@html abbreviateNumber(item?.value, false, true)} - {item?.value - tableList[index + 1]?.value !== 0 + {@html item?.value - tableList[index + 1]?.value !== + 0 ? abbreviateNumber( ( item?.value - tableList[index + 1]?.value )?.toFixed(2), + false, + true, ) - : "-"} + : "n/a"} {#if index + 1 - tableList?.length === 0} - - + n/a {:else if item?.value === 0 && tableList[index + 1]?.value < 0} -100.00% {:else if item?.value === 0 && tableList[index + 1]?.value > 0} @@ -859,7 +860,7 @@ $: { )?.toFixed(2)}% {:else} - - + n/a {/if}
    - + {#each tableList as item, index} - + diff --git a/src/routes/stocks/[tickerID]/financials/ratios/+page.svelte b/src/routes/stocks/[tickerID]/financials/ratios/+page.svelte index 2e43691d..1935ccfd 100644 --- a/src/routes/stocks/[tickerID]/financials/ratios/+page.svelte +++ b/src/routes/stocks/[tickerID]/financials/ratios/+page.svelte @@ -17,6 +17,7 @@ import { GridComponent, TooltipComponent } from "echarts/components"; import { CanvasRenderer } from "echarts/renderers"; import Infobox from "$lib/components/Infobox.svelte"; + import FinancialTable from "$lib/components/FinancialTable.svelte"; use([LineChart, BarChart, GridComponent, TooltipComponent, CanvasRenderer]); @@ -134,6 +135,11 @@ }, ]; + const fields = statementConfig.map((item) => ({ + label: item.label, + key: item.propertyName, + })); + function toggleMode() { $coolMode = !$coolMode; } @@ -349,36 +355,34 @@ } } - function generateStatementInfoHTML() { - if ($coolMode) { - const statementText = statementConfig?.find( - (item) => item?.propertyName === displayStatement - )?.text; + if ($coolMode) { + const statementText = statementConfig?.find( + (item) => item?.propertyName === displayStatement, + )?.text; - return `${statementText || ''}`; - } else if (ratios?.length > 0) { - return ` + return `${statementText || ""}`; + } else if (ratios?.length > 0) { + return ` Discover comprehensive ratio statement breakdowns that reveal insights into revenue, expenses, and beyond. `; - } else { - return ` + } else { + return ` No financial data available for ${$displayCompanyName}. `; + } } -} - -let htmlOutput = null; -$: { - if($coolMode || displayStatement) { - htmlOutput = generateStatementInfoHTML() + let htmlOutput = null; + $: { + if ($coolMode || displayStatement) { + htmlOutput = generateStatementInfoHTML(); + } } -} @@ -441,7 +445,7 @@ $: {
    - + {#if ratios?.length > 0}
    -
    +
    @@ -653,10 +655,10 @@ $: {
    {filterRule === "annual" @@ -737,38 +733,39 @@ $: {
    {item?.date} - {abbreviateNumber(item?.value)} + {@html abbreviateNumber(item?.value, false, true)} - {item?.value - tableList[index + 1]?.value !== 0 + {@html item?.value - tableList[index + 1]?.value !== + 0 ? abbreviateNumber( ( item?.value - tableList[index + 1]?.value )?.toFixed(2), + false, + true, ) - : "-"} + : "n/a"} {#if index + 1 - tableList?.length === 0} - - + n/a {:else if item?.value === 0 && tableList[index + 1]?.value < 0} -100.00% {:else if item?.value === 0 && tableList[index + 1]?.value > 0} @@ -792,7 +789,7 @@ $: { )?.toFixed(2)}% {:else} - - + n/a {/if}
    - + {#each tableList as item, index} - + @@ -775,246 +778,7 @@ $: { - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - - {#each ratios as item} - - {/each} - - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - - - - {#each ratios as item} - - {/each} - +
    {filterRule === "annual" @@ -682,38 +684,39 @@ $: {
    {item?.date} - {abbreviateNumber(item?.value)} + {@html abbreviateNumber(item?.value, false, true)} - {item?.value - tableList[index + 1]?.value !== 0 + {@html item?.value - tableList[index + 1]?.value !== + 0 ? abbreviateNumber( ( item?.value - tableList[index + 1]?.value )?.toFixed(2), + false, + true, ) - : "-"} + : "n/a"} {#if index + 1 - tableList?.length === 0} - - + n/a {:else if item?.value === 0 && tableList[index + 1]?.value < 0} -100.00% {:else if item?.value === 0 && tableList[index + 1]?.value > 0} @@ -737,7 +740,7 @@ $: { )?.toFixed(2)}% {:else} - - + n/a {/if}
    PE Ratio - {filterRule === "annual" - ? (item?.priceEarningsRatio / 4)?.toFixed(2) - : item?.priceEarningsRatio?.toFixed(2)} -
    PS Ratio - {filterRule === "annual" - ? (item?.priceToSalesRatio / 4)?.toFixed(2) - : item?.priceToSalesRatio?.toFixed(2)} -
    PB Ratio - {filterRule === "annual" - ? (item?.priceToBookRatio / 4)?.toFixed(2) - : item?.priceToBookRatio?.toFixed(2)} -
    P/FCF Ratio - {filterRule === "annual" - ? (item?.priceToFreeCashFlowsRatio / 4)?.toFixed( - 2, - ) - : item?.priceToFreeCashFlowsRatio?.toFixed(2)} -
    P/OCF Ratio - {filterRule === "annual" - ? ( - item?.priceToOperatingCashFlowsRatio / 4 - )?.toFixed(2) - : item?.priceToOperatingCashFlowsRatio?.toFixed( - 2, - )} -
    OCF/S Ratio - {filterRule === "annual" - ? ( - item?.operatingCashFlowSalesRatio / 4 - )?.toFixed(2) - : item?.operatingCashFlowSalesRatio?.toFixed(2)} -
    Debt / Equity Ratio - {filterRule === "annual" - ? (item?.debtEquityRatio / 4)?.toFixed(2) - : item?.debtEquityRatio?.toFixed(2)} -
    Quick Ratio - {filterRule === "annual" - ? (item?.quickRatio / 4)?.toFixed(2) - : item?.quickRatio?.toFixed(2)} -
    Current Ratio - {filterRule === "annual" - ? (item?.currentRatio / 4)?.toFixed(2) - : item?.currentRatio?.toFixed(2)} -
    Asset Turnover - {item?.assetTurnover?.toFixed(2)} -
    Interest Coverage - {filterRule === "annual" - ? (item?.interestCoverage / 4)?.toFixed(2) - : item?.interestCoverage?.toFixed(2)} -
    Return on Equity (ROE) - {(item?.returnOnEquity * 100)?.toFixed(2)}% -
    Return on Assets (ROA){(item?.returnOnAssets * 100)?.toFixed(2)}%
    Return on Capital (ROIC) - {(item?.returnOnCapitalEmployed * 100)?.toFixed( - 2, - )}%
    Dividend Yield - {(item?.dividendYield * 100)?.toFixed(2)}%
    Payout Ratio - {filterRule === "annual" - ? ((item?.payoutRatio / 4) * 100)?.toFixed(2) - : (item?.payoutRatio * 100)?.toFixed(2)}% -
    Gross Profit Margin - {filterRule === "annual" - ? ((item?.grossProfitMargin / 4) * 100)?.toFixed( - 2, - ) - : (item?.grossProfitMargin * 100)?.toFixed(2)}% -
    Net Profit Margin - {filterRule === "annual" - ? ((item?.netProfitMargin / 4) * 100)?.toFixed(2) - : (item?.netProfitMargin * 100)?.toFixed(2)}% -
    diff --git a/src/routes/stocks/[tickerID]/forecast/analyst/+page.svelte b/src/routes/stocks/[tickerID]/forecast/analyst/+page.svelte index dab5de6a..26908af5 100644 --- a/src/routes/stocks/[tickerID]/forecast/analyst/+page.svelte +++ b/src/routes/stocks/[tickerID]/forecast/analyst/+page.svelte @@ -96,7 +96,7 @@ }) ?.slice(0, 30); //Consider only the last 30 ratings in the last 12 months - const filteredAnalystCount = recentData?.length ?? 'n/a'; + const filteredAnalystCount = recentData?.length ?? "n/a"; const priceTargets = recentData ?.map((item) => parseFloat(item.adjusted_pt_current)) ?.filter((pt) => !isNaN(pt)); @@ -106,7 +106,7 @@ ] : "n/a"; - numOfAnalyst = filteredAnalystCount === 0 ? 'n/a' : filteredAnalystCount; + numOfAnalyst = filteredAnalystCount === 0 ? "n/a" : filteredAnalystCount; priceTarget = medianPriceTarget; changesPercentage = medianPriceTarget !== "-" && data?.getStockQuote?.price != null @@ -141,8 +141,9 @@ ? "Hold" : averageRatingScore >= 1.5 ? "Sell" - : averageRatingScore >= 1 - ? "Strong Sell" : 'n/a'; + : averageRatingScore >= 1 + ? "Strong Sell" + : "n/a"; rawData = recentData; historyList = rawData.slice(0, 50); @@ -423,7 +424,7 @@
    - {extractOfficeInfo(item?.typeOfOwner)}
    {new Date(item?.transactionDate)?.toLocaleString( "en-US", @@ -636,38 +627,32 @@ - {abbreviateNumber(item?.securitiesTransacted)} + {@html abbreviateNumber( + item?.securitiesTransacted, + false, + true, + )} - {item?.price?.toFixed(2)} + ${item?.price?.toFixed(2)} -
    - {#if transactionStyles[item?.transactionType]} -
    - {abbreviateNumber(item?.value)} -
    -
    - {transactionStyles[item?.transactionType].text} -
    - {:else} - n/a - {/if} + {@html abbreviateNumber(item?.value, false, true)} +
    +
    + {transactionStyles[item?.transactionType]}
    {new Date(item?.transactionDate)?.toLocaleString( "en-US", @@ -371,12 +371,12 @@ {item?.amount} {#if item?.type === "Bought"} Bought diff --git a/src/routes/stocks/[tickerID]/options/+page.svelte b/src/routes/stocks/[tickerID]/options/+page.svelte index a1a77a59..ade6da5e 100644 --- a/src/routes/stocks/[tickerID]/options/+page.svelte +++ b/src/routes/stocks/[tickerID]/options/+page.svelte @@ -575,7 +575,7 @@
    -
    +
    - {activeIdx === 0 ? "Historical Option Data" : "Option Chain Data"} - +

    + {activeIdx === 0 ? "Historical Option Data" : "Option Chain Data"} +

    handleViewData(item?.date)} on:mouseover={() => getDailyTransactions($stockTicker + "+" + item?.date)} - class="cursor-pointer sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] odd:bg-secondary border-b-[#09090B] {index + + class="cursor-pointer sm:hover:bg-[#245073] sm:hover:bg-opacity-[0.2] odd:bg-odd border-b-[#09090B] {index + 1 === optionList?.slice(0, 3)?.length && data?.user?.tier !== 'Pro' @@ -1061,8 +1057,7 @@
    {formatTime(item?.time)} - {abbreviateNumber(item?.marketCap)} + {@html abbreviateNumber( + item?.marketCap, + false, + true, + )} {#each optionsWatchlist as item, index} -
    diff --git a/src/routes/watchlist/stocks/+page.svelte b/src/routes/watchlist/stocks/+page.svelte index 7d5c968c..39427af5 100644 --- a/src/routes/watchlist/stocks/+page.svelte +++ b/src/routes/watchlist/stocks/+page.svelte @@ -1501,7 +1501,7 @@
    handleFilter(item?.symbol)} @@ -1769,7 +1769,7 @@ {item?.name} () will report - + {#if item?.time} {#if compareTimes(item?.time, "16:00") >= 0} after market closes.