diff --git a/src/lib/components/DarkPool/HistoricalVolume.svelte b/src/lib/components/DarkPool/HistoricalVolume.svelte index 124cebb4..078d75c8 100644 --- a/src/lib/components/DarkPool/HistoricalVolume.svelte +++ b/src/lib/components/DarkPool/HistoricalVolume.svelte @@ -2,7 +2,7 @@ import { displayCompanyName, stockTicker, etfTicker } from "$lib/store"; import InfoModal from "$lib/components/InfoModal.svelte"; import { Chart } from "svelte-echarts"; - import { abbreviateNumber, formatDateRange } from "$lib/utils"; + import { abbreviateNumber, formatDateRange, monthNames } from "$lib/utils"; import { init, use } from "echarts/core"; import { LineChart } from "echarts/charts"; import { GridComponent, TooltipComponent } from "echarts/components"; @@ -12,7 +12,6 @@ export let rawData = []; - let isLoaded = false; let optionsData; let avgVolume = 0; let avgShortVolume = 0; @@ -110,12 +109,24 @@ top: "5%", containLabel: true, }, - xAxis: { - type: "category", - boundaryGap: false, - data: dates, - axisLabel: { color: "#fff" }, - }, + xAxis: [ + { + type: "category", + data: dates, + axisLabel: { + color: "#fff", + + formatter: function (value) { + // Assuming dates are in the format 'yyyy-mm-dd' + const dateParts = value.split("-"); + const monthIndex = parseInt(dateParts[1]) - 1; // Months are zero-indexed in JavaScript Date objects + const year = parseInt(dateParts[0]); + const day = parseInt(dateParts[2]); + return `${day} ${monthNames[monthIndex]} ${year}`; + }, + }, + }, + ], yAxis: [ { type: "value", @@ -143,10 +154,8 @@ }; } - $: if (typeof window !== "undefined" && ($stockTicker || $etfTicker)) { - isLoaded = false; + $: if ($stockTicker || $etfTicker) { optionsData = getPlotOptions(); - isLoaded = true; } @@ -166,132 +175,118 @@ /> - {#if isLoaded} - {#if rawData?.length !== 0} -
-
- Over the past 12 months, {$displayCompanyName} has experienced an average - dark pool trading volume of - {abbreviateNumber(avgVolume)} - shares. Out of this total, an average of - {abbreviateNumber(avgShortVolume)} - shares, constituting approximately - {((avgShortVolume / avgVolume) * 100)?.toFixed(2)}%, were short volume. -
+ {#if rawData?.length !== 0} +
+
+ Over the past 12 months, {$displayCompanyName} has experienced an average + dark pool trading volume of + {abbreviateNumber(avgVolume)} + shares. Out of this total, an average of + {abbreviateNumber(avgShortVolume)} + shares, constituting approximately + {((avgShortVolume / avgVolume) * 100)?.toFixed(2)}%, were short volume.
+
-
-
- -
+
+
+
+
+
- - - - Total Volume - -
+ class="h-full transform -translate-x-1/2" + aria-hidden="true" + >
+ - - - - Short Volume - -
+ Total Volume +
- -

- Latest Information -

-
- + + - - - - - - - - - - - - - - - -
- {/if} - {:else} -
-
- + Short Volume +
+ +

+ Latest Information +

+ +
+ + + + + + + + + + + + + + + +
+ Date + + {formatDateRange(rawData?.slice(-1)?.at(0)?.date)} +
+ Total Volume + + {monthlyVolume} +
+ Avg. Short % of Volume + + {avgMonthlyShort}% +
+
{/if} diff --git a/src/lib/components/DarkPool/HottestTrades.svelte b/src/lib/components/DarkPool/HottestTrades.svelte index 5072e4cd..1ebb363c 100644 --- a/src/lib/components/DarkPool/HottestTrades.svelte +++ b/src/lib/components/DarkPool/HottestTrades.svelte @@ -1,5 +1,4 @@
@@ -144,88 +136,71 @@ />
- {#if isLoaded} - {#if rawData?.length !== 0} -
-
- Get in realtime the latest hottest trades based on premium. -
+ {#if rawData?.length !== 0} +
+
+ Get in realtime the latest hottest trades based on premium.
+
-
+ -
- - - - - {#each stockList as item, index} - + + + + {#each stockList as item, index} + + + {item?.rank} + - + - + - + - + - - + + - - - {/each} - -
- - {item?.rank} - - {formatToNewYorkTime(item?.date)} - + {formatToNewYorkTime(item?.date)} + - {item?.price} - + {item?.price} + - {@html abbreviateNumberWithColor(item?.size, false, true)} - + {@html abbreviateNumberWithColor(item?.size, false, true)} + - {@html abbreviateNumberWithColor(item?.volume, false, true)} - + {@html abbreviateNumberWithColor(item?.volume, false, true)} + - {item?.sizeVolRatio?.toFixed(2)}% - - {item?.sizeAvgVolRatio?.toFixed(2)}% - + {item?.sizeVolRatio?.toFixed(2)}% + + {item?.sizeAvgVolRatio?.toFixed(2)}% + - {@html abbreviateNumberWithColor( - item?.premium, - false, - true, - )} -
-
- {/if} - {:else} -
-
- -
+ + {@html abbreviateNumberWithColor(item?.premium, false, true)} + + + {/each} + +
{/if} diff --git a/src/lib/components/DarkPool/PriceLevel.svelte b/src/lib/components/DarkPool/PriceLevel.svelte index 36cd8452..b2d9c167 100644 --- a/src/lib/components/DarkPool/PriceLevel.svelte +++ b/src/lib/components/DarkPool/PriceLevel.svelte @@ -15,7 +15,6 @@ export let rawData = []; export let metrics = {}; - let isLoaded = false; let optionsData; function getPlotOptions(category) { @@ -105,14 +104,8 @@ return options; } - $: if ( - typeof window !== "undefined" && - ($stockTicker || $etfTicker) && - category - ) { - isLoaded = false; + $: if (($stockTicker || $etfTicker) && category) { optionsData = getPlotOptions(category); - isLoaded = true; } @@ -132,56 +125,43 @@ />
- {#if isLoaded} - {#if rawData?.length !== 0 && Object?.keys(metrics)?.length > 0} -
-
- {$displayCompanyName} has seen an average dark pool trade size of {@html abbreviateNumberWithColor( - metrics?.avgTradeSize, - false, - true, - )} and an average premium per trade of {@html abbreviateNumberWithColor( - metrics?.avgPremTrade, - false, - true, - )}, with a total premium of {@html abbreviateNumberWithColor( - metrics?.totalPrem, - false, - true, - )}. -
+ {#if rawData?.length !== 0 && Object?.keys(metrics)?.length > 0} +
+
+ {$displayCompanyName} has seen an average dark pool trade size of {@html abbreviateNumberWithColor( + metrics?.avgTradeSize, + false, + true, + )} and an average premium per trade of {@html abbreviateNumberWithColor( + metrics?.avgPremTrade, + false, + true, + )}, with a total premium of {@html abbreviateNumberWithColor( + metrics?.totalPrem, + false, + true, + )}.
+
-
-
-
- {#each ["Size", "Premium"] as item} - - {/each} -
- - -
-
- {/if} - {:else} -
-
-
{/if} diff --git a/src/lib/components/FailToDeliver.svelte b/src/lib/components/FailToDeliver.svelte index 6f60e2ea..28ab704b 100644 --- a/src/lib/components/FailToDeliver.svelte +++ b/src/lib/components/FailToDeliver.svelte @@ -170,7 +170,7 @@ $: { const ticker = $assetType === "stock" ? $stockTicker : $etfTicker; - if (ticker && typeof window !== "undefined") { + if (ticker) { isLoaded = false; console.log(rawData); if (rawData?.length > 0) { diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 41d83865..519a3604 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -11,7 +11,7 @@ import { compareTimes, formatTime, isPWAInstalled } from "$lib/utils"; import Infobox from "$lib/components/Infobox.svelte"; import { closedPWA } from "$lib/store"; - import { options } from "marked"; + import Feedback from "$lib/components/Feedback.svelte"; export let data; let optionsMode = "openInterest"; @@ -32,7 +32,6 @@ optionsTable = data?.getDashboard?.optionsData?.openInterest || []; } } - let Feedback; let pwaInstalled = false; let AppInstalled = null; @@ -64,8 +63,6 @@ console.error("Error loading AppInstalled component:", e); } } - - Feedback = (await import("$lib/components/Feedback.svelte")).default; }); $: charNumber = $screenWidth < 640 ? 20 : 15; @@ -165,9 +162,7 @@
- {#if Feedback} - - {/if} + + {#if senateTradingList?.length !== 0} + +
+
- -
-
- Buy/Sell - - {buySellRatio?.toFixed(3)} - -
- -
- - +
+ Buy/Sell + + {buySellRatio?.toFixed(3)} + +
+ +
+ + + + + = 0 + ? 100 - (buySellRatio * 100)?.toFixed(2) + : 0} > - - - = 0 - ? 100 - (buySellRatio * 100)?.toFixed(2) - : 0} - > - - - -
- {buySellRatio?.toFixed(2)} -
-
- -
- - -
-
+ + + +
Dem/Rep{buySellRatio?.toFixed(2)} - - {partyRatio?.toFixed(3)} -
- -
- - - - - - = 0 - ? 100 - (partyRatio * 100)?.toFixed(2) - : 0} - > - - - -
- {partyRatio?.toFixed(2)} -
-
-
- +
-
- - -
- + +
-
- - - - {#each senateTradingList as item, index} - + Dem/Rep + + {partyRatio?.toFixed(3)} + + + +
+ + + + + + = 0 + ? 100 - (partyRatio * 100)?.toFixed(2) + : 0} + > + + + +
+ {partyRatio?.toFixed(2)} -
- - - - - - - - - {/each} - -
- - - - {item?.party} - - {new Date(item?.transactionDate)?.toLocaleString( - "en-US", - { - month: "short", - day: "numeric", - year: "numeric", - daySuffix: "2-digit", - }, - )} - - {item?.amount} - - {#if item?.type === "Bought"} - Bought - {:else if item?.type === "Sold"} - Sold - {:else if item?.type === "Exchange"} - Exchange - {/if} -
-
- - - {#if rawData?.length >= 20} - - {/if} - {:else} -

- No trading history available for {$displayCompanyName}. Likely - no corrupt politican has interest in this stock. -

- {/if} - {:else} -
-
- +
+
+ +
+
+ + +
+ + + + + + {#each senateTradingList as item, index} + + + + + + + + + + + {/each} + +
+ + + + {item?.party} + + {new Date(item?.transactionDate)?.toLocaleString( + "en-US", + { + month: "short", + day: "numeric", + year: "numeric", + daySuffix: "2-digit", + }, + )} + + {item?.amount} + + {#if item?.type === "Bought"} + Bought + {:else if item?.type === "Sold"} + Sold + {:else if item?.type === "Exchange"} + Exchange + {/if} +
+
+ + + {#if rawData?.length >= 20} + + {/if} + {:else} + {/if}
diff --git a/src/routes/stocks/[tickerID]/insider/transcripts/+page.svelte b/src/routes/stocks/[tickerID]/insider/transcripts/+page.svelte deleted file mode 100644 index 86a5c738..00000000 --- a/src/routes/stocks/[tickerID]/insider/transcripts/+page.svelte +++ /dev/null @@ -1,334 +0,0 @@ - - - - - - - {$numberOfUnreadNotification > 0 ? `(${$numberOfUnreadNotification})` : ""} - {$displayCompanyName} ({$stockTicker}) · Q{quarter} - {year} · Earnings Call Transcript · Stocknear - - - - - - - - - - - - - - - - -
-
-
-
-
-

- Transcripts -

- -
-
- - - - - - - Select Year - - - - {#each yearRange as index} - { - year = index; - getTranscripts(); - }} - class="cursor-pointer hover:bg-primary" - > - {index} - - {/each} - - - -
-
- - - - - - - Select Quarter - - - - {#each [1, 2, 3, 4] as index} - { - quarter = index; - getTranscripts(); - }} - class="cursor-pointer hover:bg-primary" - > - Q{index} - - {/each} - - - -
-
-
- - {#if isLoaded} - {#if chats?.length !== 0} -
- - Q{displayQuarter} - {displayYear} · Earnings Call Transcript - - - {new Date(date).toLocaleDateString("en-US", { - month: "short", - day: "numeric", - year: "numeric", - })} - -
- - {#each chats as item} - {#if item?.name === "Operator"} -
-
-
- - {item?.name} - -
-
- -
-
-
-

- {@html item?.description} -

-
-
- {:else} -
-
-
- - {item?.name?.slice(0, 1)} - -
-
- - {item?.name} - -
-
-
-

- {@html item?.description} -

-
-
- {/if} - {/each} - - - {:else} -
- -
- {/if} - {:else} -
-
- -
-
- {/if} -
-
-
-
diff --git a/src/routes/stocks/[tickerID]/metrics/+page.svelte b/src/routes/stocks/[tickerID]/metrics/+page.svelte index 7092cc15..eb4fea0a 100644 --- a/src/routes/stocks/[tickerID]/metrics/+page.svelte +++ b/src/routes/stocks/[tickerID]/metrics/+page.svelte @@ -5,6 +5,7 @@ stockTicker, } from "$lib/store"; import { abbreviateNumber } from "$lib/utils"; + import Infobox from "$lib/components/Infobox.svelte"; export let data; @@ -338,29 +339,9 @@
{/if} {:else} -
- -
-
-
- Currently, there are no business metrics available for {$stockTicker}. -
-
-
-
+ {/if}
diff --git a/src/routes/stocks/[tickerID]/statistics/employees/+page.svelte b/src/routes/stocks/[tickerID]/statistics/employees/+page.svelte index 17df3d4f..210378f4 100644 --- a/src/routes/stocks/[tickerID]/statistics/employees/+page.svelte +++ b/src/routes/stocks/[tickerID]/statistics/employees/+page.svelte @@ -628,7 +628,7 @@
diff --git a/src/routes/stocks/[tickerID]/statistics/fail-to-deliver/+page.svelte b/src/routes/stocks/[tickerID]/statistics/fail-to-deliver/+page.svelte index 3c90a21f..6eab9e69 100644 --- a/src/routes/stocks/[tickerID]/statistics/fail-to-deliver/+page.svelte +++ b/src/routes/stocks/[tickerID]/statistics/fail-to-deliver/+page.svelte @@ -5,14 +5,11 @@ stockTicker, } from "$lib/store"; import { abbreviateNumber } from "$lib/utils"; - - import { onMount } from "svelte"; + import Infobox from "$lib/components/Infobox.svelte"; import FailToDeliver from "$lib/components/FailToDeliver.svelte"; export let data; - let isLoaded = false; - let rawData = data?.getData || []; let changePercentageYearAgo = 0; let relativeFTD = @@ -60,10 +57,7 @@ return change; } - onMount(async () => { - changePercentageYearAgo = computeYearOverYearChange(rawData); - isLoaded = true; - }); + changePercentageYearAgo = computeYearOverYearChange(rawData); @@ -104,98 +98,81 @@
- {#if isLoaded} -
-
-
-

- Fail-to-Deliver (FTD) -

-
+
+
+
+

+ Fail-to-Deliver (FTD) +

+
- {#if rawData?.length !== 0} -
-
-
-
-
- FTD Shares -
-
- {abbreviateNumber( - rawData?.slice(-1)?.at(0)?.failToDeliver, - false, - )} -
+ {#if rawData?.length !== 0} +
+
+
+
+
+ FTD Shares
-
-
-
-
- FTD / Avg Volume -
-
- {relativeFTD > 0.01 - ? relativeFTD + "%" - : relativeFTD !== "n/a" - ? "< 0.01%" - : "n/a"} -
-
-
-
-
-
- 1-Year Change -
-
- {changePercentageYearAgo !== null - ? abbreviateNumber( - changePercentageYearAgo?.toFixed(2), - ) + "%" - : "n/a"} -
+
+ {abbreviateNumber( + rawData?.slice(-1)?.at(0)?.failToDeliver, + false, + )} +
+
+
+
+
+
+ FTD / Avg Volume +
+
+ {relativeFTD > 0.01 + ? relativeFTD + "%" + : relativeFTD !== "n/a" + ? "< 0.01%" + : "n/a"} +
+
+
+
+
+
+ 1-Year Change +
+
+ {changePercentageYearAgo !== null + ? abbreviateNumber( + changePercentageYearAgo?.toFixed(2), + ) + "%" + : "n/a"}
- -
- {:else} -

- No data available -

- {/if} -
-
- {:else} -
-
- -
+ + +
+ {:else} + + {/if}
- {/if} +
diff --git a/src/routes/stocks/[tickerID]/statistics/market-cap/+page.svelte b/src/routes/stocks/[tickerID]/statistics/market-cap/+page.svelte index 491fedab..73c86aaa 100644 --- a/src/routes/stocks/[tickerID]/statistics/market-cap/+page.svelte +++ b/src/routes/stocks/[tickerID]/statistics/market-cap/+page.svelte @@ -15,13 +15,11 @@ import { LineChart, BarChart } from "echarts/charts"; import { GridComponent, TooltipComponent } from "echarts/components"; import { CanvasRenderer } from "echarts/renderers"; - import { onMount } from "svelte"; import Infobox from "$lib/components/Infobox.svelte"; use([LineChart, BarChart, GridComponent, TooltipComponent, CanvasRenderer]); export let data; - let isLoaded = false; let optionsData; let rawData = data?.getHistoricalMarketCap || []; @@ -201,13 +199,10 @@ tableList?.sort((a, b) => new Date(b?.date) - new Date(a?.date)); } - onMount(async () => { - optionsData = await plotData(); - tableList = filterEndOfYearDates(rawData); - tableList?.sort((a, b) => new Date(b?.date) - new Date(a?.date)); - changePercentageYearAgo = computeYearOverYearChange(rawData); - isLoaded = true; - }); + optionsData = plotData(); + tableList = filterEndOfYearDates(rawData); + tableList?.sort((a, b) => new Date(b?.date) - new Date(a?.date)); + changePercentageYearAgo = computeYearOverYearChange(rawData); async function changeStatement(state) { timePeriod = state; @@ -265,7 +260,7 @@ return { dates, marketCapList }; } - async function plotData() { + function plotData() { const filteredData = filterDataByTimePeriod(rawData, timePeriod); const options = { @@ -277,13 +272,24 @@ top: "10%", containLabel: true, }, - xAxis: { - axisLabel: { - color: "#fff", + xAxis: [ + { + type: "category", + data: filteredData?.dates, + axisLabel: { + color: "#fff", + + formatter: function (value) { + // Assuming dates are in the format 'yyyy-mm-dd' + const dateParts = value.split("-"); + const monthIndex = parseInt(dateParts[1]) - 1; // Months are zero-indexed in JavaScript Date objects + const year = parseInt(dateParts[0]); + const day = parseInt(dateParts[2]); + return `${day} ${monthNames[monthIndex]} ${year}`; + }, + }, }, - data: filteredData?.dates, - type: "category", - }, + ], yAxis: [ { type: "value", @@ -422,359 +428,331 @@
- {#if isLoaded} -
-
-
-

- Market Cap -

-
+
+
+
+

Market Cap

+
- {#if rawData?.length !== 0} -
- 0 - ? "increased" - : changePercentageYearAgo < 0 - ? "decreased" - : "unchanged" - } by ${abbreviateNumber( - changePercentageYearAgo?.toFixed(2), - )}% in one year.`} - /> + {#if rawData?.length !== 0} +
+ 0 + ? "increased" + : changePercentageYearAgo < 0 + ? "decreased" + : "unchanged" + } by ${abbreviateNumber( + changePercentageYearAgo?.toFixed(2), + )}% in one year.`} + /> -
-
-
-
- Market Cap -
-
- {@html abbreviateNumber( - data?.getStockQuote?.marketCap, - false, - true, - )} -
+
+
+
+
+ Market Cap
-
-
-
-
- Category -
-
- {#if capCategory} - - {capCategory.name} - - {:else} - n/a - {/if} -
-
-
-
-
-
- 1-Year Change -
-
- {changePercentageYearAgo !== null - ? abbreviateNumber( - changePercentageYearAgo?.toFixed(2), - ) + "%" - : "n/a"} -
-
-
-
- -
-

- Market Cap Chart -

-
-
- - - - - - - Select time frame - - - - changeStatement("1M")} - class="cursor-pointer hover:bg-primary" - > - 1 Month - - changeStatement("6M")} - class="cursor-pointer hover:bg-primary" - > - 6 Months - - changeStatement("1Y")} - class="cursor-pointer hover:bg-primary" - > - 1 Year - - changeStatement("3Y")} - class="cursor-pointer hover:bg-primary" - > - 3 Years - - changeStatement("5Y")} - class="cursor-pointer hover:bg-primary" - > - 5 Years - - changeStatement("10Y")} - class="cursor-pointer hover:bg-primary" - > - 10 Years - - changeStatement("Max")} - class="cursor-pointer hover:bg-primary" - > - Max - - - - -
- + {@html abbreviateNumber( + data?.getStockQuote?.marketCap, + false, + true, + )} +
- -
- -
- -

- Market Cap History -

- -
-
- {#each tabs as item, i} - {#if data?.user?.tier !== "Pro" && i > 0} - + {capCategory.name} + {:else} - + n/a {/if} - {/each} +
- -
-
- - - - - - - - - {#each tableList as item, index} - - - - - - - - - {/each} - -
DateMarket Cap% Change
- {item?.date} - - {@html abbreviateNumber( - item?.marketCap, - false, - true, - )} - - {#if index + 1 - tableList?.length === 0} - - - {:else if item?.marketCap - tableList[index + 1]?.marketCap > 0} - - +{( - ((item?.marketCap - - tableList[index + 1]?.marketCap) / - item?.marketCap) * - 100 - )?.toFixed(2)}% - - {:else if item?.marketCap - tableList[index + 1]?.marketCap < 0} - - -{( - Math?.abs( - (tableList[index + 1]?.marketCap - - item?.marketCap) / - item?.marketCap, - ) * 100 - )?.toFixed(2)}% - - {:else} - - - {/if} -
+
+
+
+ 1-Year Change +
+
+ {changePercentageYearAgo !== null + ? abbreviateNumber( + changePercentageYearAgo?.toFixed(2), + ) + "%" + : "n/a"} +
+
- {:else} -

- No data available + +
+

Market Cap Chart

+
+
+ + + + + + + Select time frame + + + + changeStatement("1M")} + class="cursor-pointer hover:bg-primary" + > + 1 Month + + changeStatement("6M")} + class="cursor-pointer hover:bg-primary" + > + 6 Months + + changeStatement("1Y")} + class="cursor-pointer hover:bg-primary" + > + 1 Year + + changeStatement("3Y")} + class="cursor-pointer hover:bg-primary" + > + 3 Years + + changeStatement("5Y")} + class="cursor-pointer hover:bg-primary" + > + 5 Years + + changeStatement("10Y")} + class="cursor-pointer hover:bg-primary" + > + 10 Years + + changeStatement("Max")} + class="cursor-pointer hover:bg-primary" + > + Max + + + + +
+ +
+
+ +
+ +
+ +

+ Market Cap History

- {/if} - - - {:else} -
-
- -
+ +
+
+ {#each tabs as item, i} + {#if data?.user?.tier !== "Pro" && i > 0} + + {:else} + + {/if} + {/each} +
+
+ +
+ + + + + + + + + + {#each tableList as item, index} + + + + + + + + + {/each} + +
DateMarket Cap% Change
+ {item?.date} + + {@html abbreviateNumber(item?.marketCap, false, true)} + + {#if index + 1 - tableList?.length === 0} + - + {:else if item?.marketCap - tableList[index + 1]?.marketCap > 0} + + +{( + ((item?.marketCap - + tableList[index + 1]?.marketCap) / + item?.marketCap) * + 100 + )?.toFixed(2)}% + + {:else if item?.marketCap - tableList[index + 1]?.marketCap < 0} + + -{( + Math?.abs( + (tableList[index + 1]?.marketCap - + item?.marketCap) / + item?.marketCap, + ) * 100 + )?.toFixed(2)}% + + {:else} + - + {/if} +
+
+
+ {:else} + + {/if} - {/if} +