diff --git a/src/lib/components/FinancialChart.svelte b/src/lib/components/FinancialChart.svelte index 5067b6a0..75313754 100644 --- a/src/lib/components/FinancialChart.svelte +++ b/src/lib/components/FinancialChart.svelte @@ -9,6 +9,7 @@ export let filterRule = "annual"; export let statementConfig; export let processedData = null; // Accept pre-processed data + export let color = "#fff"; let config = null; let isLoaded = false; @@ -102,8 +103,10 @@ { name: labelName, data: valueList, - color: "#fff", + color: color, + borderColor: color, borderRadius: "1px", + animation: false, }, ], }; @@ -121,7 +124,7 @@ try { // Add a small delay to ensure the loading state is visible - await new Promise((resolve) => setTimeout(resolve, 300)); + await new Promise((resolve) => setTimeout(resolve, 100)); const { xList, valueList, labelName } = processedData[displayStatement]; return getChartOptions(xList, valueList, labelName); @@ -159,7 +162,7 @@ {:else} - +
-
+
{ - const getIncomeStatement = async () => { + const getData = async () => { const { apiKey, apiURL } = locals; const postData = { ticker: params.tickerID, @@ -28,7 +28,7 @@ export const load = async ({ locals, params }) => { // Make sure to return a promise return { - getIncomeStatement: await getIncomeStatement(), + getData: await getData(), }; }; diff --git a/src/routes/stocks/[tickerID]/financials/+page.svelte b/src/routes/stocks/[tickerID]/financials/+page.svelte index 5d77f5e5..e223dd9d 100644 --- a/src/routes/stocks/[tickerID]/financials/+page.svelte +++ b/src/routes/stocks/[tickerID]/financials/+page.svelte @@ -20,7 +20,7 @@ let tableList = []; let processedData = {}; - let income = []; + let financialData = []; let fullStatement = []; let filterRule = "annual"; let displayStatement = "revenue"; @@ -192,7 +192,7 @@ } }; - fullStatement = data?.getIncomeStatement; + fullStatement = data?.getData; displayStatement = "revenue"; const exportFundamentalData = (format = "csv") => { @@ -263,8 +263,8 @@ // Precompute xList from income (reverse order) const xList = []; - for (let i = income.length - 1; i >= 0; i--) { - const statement = income[i]; + for (let i = financialData.length - 1; i >= 0; i--) { + const statement = financialData[i]; const year = statement.calendarYear.slice(-2); const quarter = statement.period; xList.push( @@ -279,9 +279,9 @@ if (!config) return; const valueList = []; - // Loop through income in reverse to match xList order - for (let i = income.length - 1; i >= 0; i--) { - const statement = income[i]; + // Loop through financialData in reverse to match xList order + for (let i = financialData.length - 1; i >= 0; i--) { + const statement = financialData[i]; const rawValue = Number(statement[config.propertyName]); // Round to two decimals const value = parseFloat(rawValue.toFixed(2)); @@ -296,7 +296,7 @@ }); // Build tableList once for all charts and sort by date (newest first) - tableList = income.map((statement) => ({ + tableList = financialData.map((statement) => ({ date: statement.date, // Add more properties if needed })); @@ -308,19 +308,19 @@ if ($timeFrame || activeIdx) { if (activeIdx === 0) { filterRule = "annual"; - fullStatement = data?.getIncomeStatement?.annual; + fullStatement = data?.getData?.annual; } else { filterRule = "quarterly"; - fullStatement = data?.getIncomeStatement?.quarter; + fullStatement = data?.getData?.quarter; } - income = filterStatement(fullStatement, $timeFrame); + financialData = filterStatement(fullStatement, $timeFrame); preprocessFinancialData(); } } @@ -390,7 +390,7 @@
- {#if income?.length > 0} + {#if financialData?.length > 0}
@@ -497,11 +497,14 @@
{#each fields as item, i} {/each}
@@ -518,7 +521,7 @@ class="text-start bg-default text-white text-sm font-semibold pr-10" >Year - {#each income as cash} + {#each financialData as cash} {#if filterRule === "annual"} - +
diff --git a/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.server.ts b/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.server.ts index c3f14f97..759e5848 100644 --- a/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.server.ts +++ b/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.server.ts @@ -1,7 +1,7 @@ import { getCache, setCache } from "$lib/store"; export const load = async ({ locals, params }) => { - const getBalanceSheetStatement = async () => { + const getData = async () => { const { apiKey, apiURL } = locals; const postData = { ticker: params.tickerID, @@ -24,6 +24,6 @@ export const load = async ({ locals, params }) => { // Make sure to return a promise return { - getBalanceSheetStatement: await getBalanceSheetStatement(), + getData: await getData(), }; }; diff --git a/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.svelte b/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.svelte index 7f1ad056..9e737361 100644 --- a/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.svelte +++ b/src/routes/stocks/[tickerID]/financials/balance-sheet/+page.svelte @@ -1,36 +1,29 @@ -
+
-
-
-
-

- {removeCompanyStrings($displayCompanyName)} Balance Sheet -

-
- -
- {#if balanceSheet?.length > 0} + {#if isLoaded} +
+
+
+

+ {removeCompanyStrings($displayCompanyName)} Income Statement +

-
- {#each tabs as item, i} - {#if data?.user?.tier !== "Pro" && i > 0} - - {:else} - - {/if} - {/each} -
-
- -
- - -
-
- - - - - - - Select time frame - - - - ($timeFrame = "5Y")} - class="cursor-pointer hover:bg-primary" - > - 5 years - - ($timeFrame = "10Y")} - class="cursor-pointer hover:bg-primary" - > - 10 years - - ($timeFrame = "MAX")} - class="cursor-pointer hover:bg-primary" - > - Max - - - - -
- -
+ {/each}
+
- {#if $coolMode} -
-
- +
+ {#if $coolMode} + + Chart Mode + + {:else} + + Table Mode + + {/if} + + +
+
+ + + + + + + Select time frame + + + + ($timeFrame = "5Y")} + class="cursor-pointer hover:bg-primary" + > + 5 years + + ($timeFrame = "10Y")} + class="cursor-pointer hover:bg-primary" + > + 10 years + + ($timeFrame = "MAX")} + class="cursor-pointer hover:bg-primary" + > + Max + + + + +
+
-
- -
- -

- {statementConfig?.find( - (item) => item?.propertyName === displayStatement, - )?.label} History -

- -
- + {#each fields as item, i} + + {/each} + + {:else} +
-
- - - - - - - - - {#each tableList as item, index} - - +
{filterRule === "annual" - ? "Fiscal Year End" - : "Quarter Ends"}{statementConfig?.find( - (item) => item?.propertyName === displayStatement, - )?.label}ChangeGrowth
+ + - {item?.date} - - - - - - - {:else} - n/a + {/if} - + {/each} - {/each} - -
Year - {@html abbreviateNumber(item?.value, false, true)} - - {@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} - 100.00% - {:else if item?.value - tableList[index + 1]?.value > 0} - - {( - ((item?.value - tableList[index + 1]?.value) / - Math.abs(item?.value)) * - 100 - )?.toFixed(2)}% - - {:else if item?.value - tableList[index + 1]?.value < 0} - - -{( - Math?.abs( - (tableList[index + 1]?.value - - item?.value) / - Math.abs(item?.value), - ) * 100 - )?.toFixed(2)}% - + {#each financialData as cash} + {#if filterRule === "annual"} + + {"FY" + cash?.calendarYear?.slice(-2)} + + {"FY" + + cash?.calendarYear?.slice(-2) + + " " + + cash?.period} +
-
- {:else} -
- - - - - {#each balanceSheet as cash} - {#if filterRule === "annual"} - - {:else} - - {/if} - {/each} - - - - - - -
Year - {"FY" + cash?.calendarYear?.slice(-2)} - - {"FY" + - cash?.calendarYear?.slice(-2) + - " " + - cash?.period} -
-
+ + + + + + +
+ {/if} {/if} - {/if} +
+
+
+ {:else} +
+
+
- + {/if}
- - diff --git a/src/routes/stocks/[tickerID]/financials/cash-flow/+page.server.ts b/src/routes/stocks/[tickerID]/financials/cash-flow/+page.server.ts index 3a9a0b90..c747278f 100644 --- a/src/routes/stocks/[tickerID]/financials/cash-flow/+page.server.ts +++ b/src/routes/stocks/[tickerID]/financials/cash-flow/+page.server.ts @@ -1,5 +1,5 @@ export const load = async ({ locals, params }) => { - const getCashFlowStatement = async () => { + const getData = async () => { const { apiKey, apiURL } = locals; const postData = { @@ -23,6 +23,6 @@ export const load = async ({ locals, params }) => { // Make sure to return a promise return { - getCashFlowStatement: await getCashFlowStatement(), + getData: await getData(), }; }; diff --git a/src/routes/stocks/[tickerID]/financials/cash-flow/+page.svelte b/src/routes/stocks/[tickerID]/financials/cash-flow/+page.svelte index b78fc1de..03ffc3ad 100644 --- a/src/routes/stocks/[tickerID]/financials/cash-flow/+page.svelte +++ b/src/routes/stocks/[tickerID]/financials/cash-flow/+page.svelte @@ -1,36 +1,28 @@ -
+
-
-
-
-

- {removeCompanyStrings($displayCompanyName)} Cash Flow -

-
- -
- - {#if cashFlow?.length > 0} + {#if isLoaded} +
+
+
+

+ {removeCompanyStrings($displayCompanyName)} Income Statement +

-
- {#each tabs as item, i} - {#if data?.user?.tier !== "Pro" && i > 0} - - {:else} - - {/if} - {/each} -
-
- -
- - -
-
- - - - - - - Select time frame - - - - ($timeFrame = "5Y")} - class="cursor-pointer hover:bg-primary" - > - 5 years - - ($timeFrame = "10Y")} - class="cursor-pointer hover:bg-primary" - > - 10 years - - ($timeFrame = "MAX")} - class="cursor-pointer hover:bg-primary" - > - Max - - - - -
- -
+ {/each}
+
- {#if $coolMode} -
-
- +
+ {#if $coolMode} + + Chart Mode + + {:else} + + Table Mode + + {/if} + + +
+
+ + + + + + + Select time frame + + + + ($timeFrame = "5Y")} + class="cursor-pointer hover:bg-primary" + > + 5 years + + ($timeFrame = "10Y")} + class="cursor-pointer hover:bg-primary" + > + 10 years + + ($timeFrame = "MAX")} + class="cursor-pointer hover:bg-primary" + > + Max + + + + +
+
-
- -
- -
- + {#each fields as item, i} + + {/each} + + {:else} +
-
- - - - - - - - - {#each tableList as item, index} - - +
{filterRule === "annual" - ? "Fiscal Year End" - : "Quarter Ends"}{statementConfig?.find( - (item) => item?.propertyName === displayStatement, - )?.label}ChangeGrowth
+ + - {item?.date} - - - - - - - {:else} - n/a + {/if} - + {/each} - {/each} - -
Year - {@html abbreviateNumber(item?.value, false, true)} - - {@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} - 100.00% - {:else if item?.value - tableList[index + 1]?.value > 0} - - {( - ((item?.value - tableList[index + 1]?.value) / - Math.abs(item?.value)) * - 100 - )?.toFixed(2)}% - - {:else if item?.value - tableList[index + 1]?.value < 0} - - -{( - Math?.abs( - (tableList[index + 1]?.value - - item?.value) / - Math.abs(item?.value), - ) * 100 - )?.toFixed(2)}% - + {#each financialData as cash} + {#if filterRule === "annual"} + + {"FY" + cash?.calendarYear?.slice(-2)} + + {"FY" + + cash?.calendarYear?.slice(-2) + + " " + + cash?.period} +
-
- {:else} -
- - - - - {#each cashFlow as cash} - {#if filterRule === "annual"} - - {:else} - - {/if} - {/each} - - - - - - -
Year - {"FY" + cash?.calendarYear?.slice(-2)} - - {"FY" + - cash?.calendarYear?.slice(-2) + - " " + - cash?.period} -
-
+ + + + + + +
+ {/if} {/if} - {/if} +
+
+
+ {:else} +
+
+
- + {/if}
- - diff --git a/src/routes/stocks/[tickerID]/financials/ratios/+page.server.ts b/src/routes/stocks/[tickerID]/financials/ratios/+page.server.ts index 8f95a3e0..3d5d95e8 100644 --- a/src/routes/stocks/[tickerID]/financials/ratios/+page.server.ts +++ b/src/routes/stocks/[tickerID]/financials/ratios/+page.server.ts @@ -1,5 +1,5 @@ export const load = async ({ locals, params }) => { - const getRatiosStatement = async () => { + const getData = async () => { const { apiKey, apiURL } = locals; const postData = { @@ -23,6 +23,6 @@ export const load = async ({ locals, params }) => { // Make sure to return a promise return { - getRatiosStatement: await getRatiosStatement(), + getData: await getData(), }; }; diff --git a/src/routes/stocks/[tickerID]/financials/ratios/+page.svelte b/src/routes/stocks/[tickerID]/financials/ratios/+page.svelte index 38c3e090..9d932741 100644 --- a/src/routes/stocks/[tickerID]/financials/ratios/+page.svelte +++ b/src/routes/stocks/[tickerID]/financials/ratios/+page.svelte @@ -1,36 +1,28 @@ -
+
-
-
-
-

- {#if $coolMode} - {statementConfig?.find( - (item) => item?.propertyName === displayStatement, - )?.label} - {:else} - Ratios {filterRule === "annual" ? "(Annual)" : "(Quarter)"} - {/if} -

-
- -
- - {#if ratios?.length > 0} + {#if isLoaded} +
+
+
+

+ {removeCompanyStrings($displayCompanyName)} Income Statement +

-
- {#each tabs as item, i} - {#if data?.user?.tier !== "Pro" && i > 0} - - {:else} - - {/if} - {/each} -
-
- -
- - -
-
- - - - - - - Select time frame - - - - ($timeFrame = "5Y")} - class="cursor-pointer hover:bg-primary" - > - 5 years - - ($timeFrame = "10Y")} - class="cursor-pointer hover:bg-primary" - > - 10 years - - ($timeFrame = "MAX")} - class="cursor-pointer hover:bg-primary" - > - Max - - - - -
- -
+ {/each}
+
- {#if $coolMode} -
-
- +
+ {#if $coolMode} + + Chart Mode + + {:else} + + Table Mode + + {/if} + + +
+
+ + + + + + + Select time frame + + + + ($timeFrame = "5Y")} + class="cursor-pointer hover:bg-primary" + > + 5 years + + ($timeFrame = "10Y")} + class="cursor-pointer hover:bg-primary" + > + 10 years + + ($timeFrame = "MAX")} + class="cursor-pointer hover:bg-primary" + > + Max + + + + +
+
-
- -
- -
- + {#each fields as item, i} + + {/each} + + {:else} +
-
- - - - - - - - - {#each tableList as item, index} - - +
{filterRule === "annual" - ? "Fiscal Year End" - : "Quarter Ends"}{statementConfig?.find( - (item) => item?.propertyName === displayStatement, - )?.label}ChangeGrowth
+ + - {item?.date} - - - - - - - {:else} - n/a + {/if} - + {/each} - {/each} - -
Year - {@html abbreviateNumber(item?.value, false, true)} - - {@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} - 100.00% - {:else if item?.value - tableList[index + 1]?.value > 0} - - {( - ((item?.value - tableList[index + 1]?.value) / - Math.abs(item?.value)) * - 100 - )?.toFixed(2)}% - - {:else if item?.value - tableList[index + 1]?.value < 0} - - -{( - Math?.abs( - (tableList[index + 1]?.value - - item?.value) / - Math.abs(item?.value), - ) * 100 - )?.toFixed(2)}% - + {#each financialData as cash} + {#if filterRule === "annual"} + + {"FY" + cash?.calendarYear?.slice(-2)} + + {"FY" + + cash?.calendarYear?.slice(-2) + + " " + + cash?.period} +
-
- {:else} -
- - - - - {#each ratios as item} - {#if filterRule === "annual"} - - {:else} - - {/if} - {/each} - - - - - - -
Year - {"FY" + item?.calendarYear?.slice(-2)} - - {"FY" + - item?.calendarYear?.slice(-2) + - " " + - item?.period} -
-
+ + + + + + +
+ {/if} {/if} - {/if} +
+
+
+ {:else} +
+
+
- + {/if}
- -