update plot
This commit is contained in:
parent
d6db0850f2
commit
e3cb01ac04
@ -9,6 +9,13 @@
|
|||||||
|
|
||||||
let config = null;
|
let config = null;
|
||||||
|
|
||||||
|
let modalLabel;
|
||||||
|
let highestValue;
|
||||||
|
let highestValueDate;
|
||||||
|
let lowestValueDate;
|
||||||
|
let lowestValue;
|
||||||
|
let fiveYearsGrowth;
|
||||||
|
|
||||||
const marginKeys = new Set([
|
const marginKeys = new Set([
|
||||||
/*
|
/*
|
||||||
"pretaxProfitMargin",
|
"pretaxProfitMargin",
|
||||||
@ -48,11 +55,28 @@
|
|||||||
|
|
||||||
const valueList = rawData?.map((item) => item[key]);
|
const valueList = rawData?.map((item) => item[key]);
|
||||||
|
|
||||||
|
// Calculate highest and lowest value
|
||||||
|
highestValue = Math.max(...valueList);
|
||||||
|
lowestValue = Math.min(...valueList);
|
||||||
|
let highestValueIndex = valueList.indexOf(highestValue);
|
||||||
|
let lowestValueIndex = valueList.indexOf(lowestValue);
|
||||||
|
|
||||||
|
highestValueDate = dateList[highestValueIndex] || null;
|
||||||
|
lowestValueDate = dateList[lowestValueIndex] || null;
|
||||||
|
|
||||||
|
// Calculate last 5 years growth
|
||||||
|
fiveYearsGrowth = null;
|
||||||
|
if (valueList?.length >= 5) {
|
||||||
|
let firstValue = valueList[valueList.length - 5];
|
||||||
|
let lastValue = valueList[valueList.length - 1];
|
||||||
|
fiveYearsGrowth = ((lastValue - firstValue) / Math.abs(firstValue)) * 100;
|
||||||
|
}
|
||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
chart: {
|
chart: {
|
||||||
type: "column",
|
type: "column",
|
||||||
backgroundColor: $mode === "light" ? "#fff" : "#09090B",
|
backgroundColor: $mode === "light" ? "#fff" : "#2A2E39",
|
||||||
plotBackgroundColor: $mode === "light" ? "#fff" : "#09090B",
|
plotBackgroundColor: $mode === "light" ? "#fff" : "#2A2E39",
|
||||||
height: 360,
|
height: 360,
|
||||||
animation: false,
|
animation: false,
|
||||||
},
|
},
|
||||||
@ -98,7 +122,7 @@
|
|||||||
},
|
},
|
||||||
yAxis: {
|
yAxis: {
|
||||||
gridLineWidth: 1,
|
gridLineWidth: 1,
|
||||||
gridLineColor: $mode === "light" ? "#e5e7eb" : "#111827",
|
gridLineColor: $mode === "light" ? "#e5e7eb" : "#404657",
|
||||||
labels: {
|
labels: {
|
||||||
style: { color: $mode === "light" ? "black" : "white" },
|
style: { color: $mode === "light" ? "black" : "white" },
|
||||||
formatter: function () {
|
formatter: function () {
|
||||||
@ -125,7 +149,7 @@
|
|||||||
this.points.forEach((point) => {
|
this.points.forEach((point) => {
|
||||||
tooltipContent += `<span class="text-white font-semibold text-sm">${point.series.name}:</span>
|
tooltipContent += `<span class="text-white font-semibold text-sm">${point.series.name}:</span>
|
||||||
<span class="text-white font-normal text-sm">${abbreviateNumber(
|
<span class="text-white font-normal text-sm">${abbreviateNumber(
|
||||||
point.y,
|
point.y?.toFixed(2),
|
||||||
)}</span><br>`;
|
)}</span><br>`;
|
||||||
});
|
});
|
||||||
return tooltipContent;
|
return tooltipContent;
|
||||||
@ -146,6 +170,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleChart(label, key) {
|
async function handleChart(label, key) {
|
||||||
|
modalLabel = label;
|
||||||
config = plotData(label, key);
|
config = plotData(label, key);
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@ -157,7 +182,7 @@
|
|||||||
<td
|
<td
|
||||||
class="text-start min-w-[220px] sm:min-w-[320px] border-r border-gray-300 dark:border-gray-700 text-sm sm:text-[1rem] w-full flex flex-row items-center justify-between"
|
class="text-start min-w-[220px] sm:min-w-[320px] border-r border-gray-300 dark:border-gray-700 text-sm sm:text-[1rem] w-full flex flex-row items-center justify-between"
|
||||||
>
|
>
|
||||||
<span class="truncate w-fit max-w-40 sm:max-w-fit">{label}</span>
|
<span class="truncate w-fit max-w-40 sm:max-w-64">{label}</span>
|
||||||
<label
|
<label
|
||||||
for="financialPlotModal"
|
for="financialPlotModal"
|
||||||
on:click={() => handleChart(label, key)}
|
on:click={() => handleChart(label, key)}
|
||||||
@ -200,24 +225,27 @@
|
|||||||
<label for="financialPlotModal" class="cursor-pointer modal-backdrop"></label>
|
<label for="financialPlotModal" class="cursor-pointer modal-backdrop"></label>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
class="modal-box bg-white relative dark:bg-default w-full max-w-3xl rounded-md border-t sm:border border-gray-300 dark:border-gray-700 min-h-48 h-auto"
|
class="modal-box w-full p-6 rounded shadow-lg border
|
||||||
|
bg-white dark:bg-secondary border border-gray-600 dark:border-gray-800"
|
||||||
>
|
>
|
||||||
<label
|
|
||||||
for="financialPlotModal"
|
|
||||||
class="cursor-pointer text-[1.8rem] focus:outline-hidden absolute top-2 right-3"
|
|
||||||
>
|
|
||||||
<svg
|
|
||||||
class="w-8 h-8 text-muted dark:text-white"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
viewBox="0 0 24 24"
|
|
||||||
><path
|
|
||||||
fill="currentColor"
|
|
||||||
d="m6.4 18.308l-.708-.708l5.6-5.6l-5.6-5.6l.708-.708l5.6 5.6l5.6-5.6l.708.708l-5.6 5.6l5.6 5.6l-.708.708l-5.6-5.6z"
|
|
||||||
/>
|
|
||||||
</svg>
|
|
||||||
</label>
|
|
||||||
{#if config}
|
{#if config}
|
||||||
<div class="mt-2" use:highcharts={config}></div>
|
<div class="mt-2" use:highcharts={config}></div>
|
||||||
{/if}
|
{/if}
|
||||||
|
<p class="text-sm mb-6">
|
||||||
|
Revenue peaked at {abbreviateNumber(highestValue?.toFixed(2))} in {highestValueDate}
|
||||||
|
and hit its lowest at {abbreviateNumber(lowestValue?.toFixed(2))} in {lowestValueDate}.
|
||||||
|
Over the past five years, it has {fiveYearsGrowth >= 0
|
||||||
|
? "grown"
|
||||||
|
: "declined"} by {fiveYearsGrowth?.toFixed(2)}%.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="border-t border-gray-300 dark:border-gray-600 mt-2 w-full">
|
||||||
|
<label
|
||||||
|
for="financialPlotModal"
|
||||||
|
class="mt-4 font-semibold text-xl m-auto flex justify-center cursor-pointer"
|
||||||
|
>
|
||||||
|
Close
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|||||||
@ -22,7 +22,6 @@
|
|||||||
let financialData = [];
|
let financialData = [];
|
||||||
let fullStatement = [];
|
let fullStatement = [];
|
||||||
let filterRule = "annual";
|
let filterRule = "annual";
|
||||||
let displayStatement = "revenue";
|
|
||||||
|
|
||||||
let activeIdx = 0;
|
let activeIdx = 0;
|
||||||
|
|
||||||
@ -38,135 +37,92 @@
|
|||||||
const statementConfig = [
|
const statementConfig = [
|
||||||
{
|
{
|
||||||
propertyName: "revenue",
|
propertyName: "revenue",
|
||||||
growthPropertyName: "growthRevenue",
|
|
||||||
label: "Revenue",
|
label: "Revenue",
|
||||||
text: "Revenue, also called sales, is the amount of money a company receives from its business activities, such as sales of products or services. Revenue does not take any expenses into account and is therefore different from profits.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "costOfRevenue",
|
propertyName: "costOfRevenue",
|
||||||
growthPropertyName: "growthCostOfRevenue",
|
|
||||||
label: "Cost of Revenue",
|
label: "Cost of Revenue",
|
||||||
text: "Cost of revenue is also called cost of goods sold (COGS). It is the variable cost related to the company's production of products and services.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "grossProfit",
|
propertyName: "grossProfit",
|
||||||
growthPropertyName: "growthGrossProfit",
|
|
||||||
label: "Gross Profit",
|
label: "Gross Profit",
|
||||||
text: "Gross profit is a company’s profit after subtracting the costs directly linked to making and delivering its products and services.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "operatingIncome",
|
propertyName: "operatingIncome",
|
||||||
growthPropertyName: "growthOperatingIncome",
|
|
||||||
label: "Operating Income",
|
label: "Operating Income",
|
||||||
text: "Gross profit is a company’s profit after subtracting the costs directly linked to making and delivering its products and services.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "interestIncome",
|
propertyName: "interestIncome",
|
||||||
growthPropertyName: "growthInterestIncome",
|
|
||||||
label: "Interest Income",
|
label: "Interest Income",
|
||||||
text: "Gross profit is a company’s profit after subtracting the costs directly linked to making and delivering its products and services.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "incomeBeforeTax",
|
propertyName: "incomeBeforeTax",
|
||||||
growthPropertyName: "growthIncomeBeforeTax",
|
|
||||||
label: "Pretax Income",
|
label: "Pretax Income",
|
||||||
text: "Pretax income is a company's profits before accounting for income taxes.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "netIncome",
|
propertyName: "netIncome",
|
||||||
growthPropertyName: "growthNetIncome",
|
|
||||||
label: "Net Income",
|
label: "Net Income",
|
||||||
text: `Net income is a company's accounting profits after subtracting all costs and expenses from the revenue. It is also called earnings, profits or "the bottom line."`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "sellingGeneralAndAdministrativeExpenses",
|
propertyName: "sellingGeneralAndAdministrativeExpenses",
|
||||||
growthPropertyName: "growthSellingGeneralAndAdministrativeExpenses",
|
|
||||||
label: "Selling & General & Admin",
|
label: "Selling & General & Admin",
|
||||||
text: "Selling, general and administrative (SG&A) is an operating expense. It involves various company expenses that are not related to production.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "researchAndDevelopmentExpenses",
|
propertyName: "researchAndDevelopmentExpenses",
|
||||||
growthPropertyName: "growthResearchAndDevelopmentExpenses",
|
|
||||||
label: "Research & Development",
|
label: "Research & Development",
|
||||||
text: "Research and development (R&D) is an operating expense. It is the amount of money a company spends on researching and developing new products and services, or improving existing ones.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "otherExpenses",
|
propertyName: "otherExpenses",
|
||||||
growthPropertyName: "growthOtherExpenses",
|
|
||||||
label: "Other Expenses",
|
label: "Other Expenses",
|
||||||
text: "Other expenses typically refer to costs that are not directly related to the primary operations of the business. These can include a wide variety of things, such as interest expense, taxes, depreciation and amortization, losses from investments, legal fees and restructuring costs.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "operatingExpenses",
|
propertyName: "operatingExpenses",
|
||||||
growthPropertyName: "growthOperatingExpenses",
|
|
||||||
label: "Operating Expenses",
|
label: "Operating Expenses",
|
||||||
text: "Operating expenses are a company's fixed costs that a company incurs during its ongoing business operations. It can include SG&A, R&D and other expenses.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "interestExpense",
|
propertyName: "interestExpense",
|
||||||
growthPropertyName: "growthInterestExpense",
|
|
||||||
label: "Interest Expense",
|
label: "Interest Expense",
|
||||||
text: "Interest expense is the amount that the company paid or received in interest. A positive number indicates a net expense, while a negative number implies that the company had more interest income from its cash reserves than it paid for interest on debt.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "sellingAndMarketingExpenses",
|
propertyName: "sellingAndMarketingExpenses",
|
||||||
growthPropertyName: "growthSellingAndMarketingExpenses",
|
|
||||||
label: "Selling & Marketing Expenses",
|
label: "Selling & Marketing Expenses",
|
||||||
text: "Revenue, also called sales, is the amount of money a company receives from its business activities, such as sales of products or services. Revenue does not take any expenses into account and is therefore different from profits.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "costAndExpenses",
|
propertyName: "costAndExpenses",
|
||||||
growthPropertyName: "growthCostAndExpensess",
|
|
||||||
label: "Cost & Expenses",
|
label: "Cost & Expenses",
|
||||||
text: "Revenue, also called sales, is the amount of money a company receives from its business activities, such as sales of products or services. Revenue does not take any expenses into account and is therefore different from profits.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "incomeTaxExpense",
|
propertyName: "incomeTaxExpense",
|
||||||
growthPropertyName: "growthIncomeTaxExpense",
|
|
||||||
label: "Income Tax",
|
label: "Income Tax",
|
||||||
text: "Income tax is the amount of corporate income tax that the company has incurred during the fiscal period.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "weightedAverageShsOut",
|
propertyName: "weightedAverageShsOut",
|
||||||
growthPropertyName: "growthWeightedAverageShsOut",
|
|
||||||
label: "Shares Outstanding (Basic)",
|
label: "Shares Outstanding (Basic)",
|
||||||
text: "Basic shares outstanding is the total amount of common stock held by all of a company's shareholders.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "weightedAverageShsOutDil",
|
propertyName: "weightedAverageShsOutDil",
|
||||||
growthPropertyName: "growthWeightedAverageShsOutDil",
|
|
||||||
label: "Shares Outstanding (Diluted)",
|
label: "Shares Outstanding (Diluted)",
|
||||||
text: "Diluted shares outstanding is the total amount of common stock that will be outstanding if all stock options, warrants and convertible securities are exercised.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "eps",
|
propertyName: "eps",
|
||||||
growthPropertyName: "growthEPS",
|
growthPropertyName: "growthEPS",
|
||||||
label: "EPS (Basic)",
|
label: "EPS (Basic)",
|
||||||
text: "Earnings per share is the portion of a company's profit that is allocated to each individual stock. EPS is calculated by dividing net income by shares outstanding.",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "epsDiluted",
|
propertyName: "epsDiluted",
|
||||||
growthPropertyName: "growthEPSDiluted",
|
|
||||||
label: "EPS (Diluted)",
|
label: "EPS (Diluted)",
|
||||||
text: `Earnings per share is the portion of a company's profit that is allocated to each individual stock. Diluted EPS is calculated by dividing net income by "diluted" shares outstanding.`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "ebitda",
|
propertyName: "ebitda",
|
||||||
growthPropertyName: "growthEBITDA",
|
|
||||||
label: "EBITDA",
|
label: "EBITDA",
|
||||||
text: `EBITDA stands for "Earnings Before Interest, Taxes, Depreciation and Amortization." It is a commonly used measure of profitability.`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "ebit",
|
propertyName: "ebit",
|
||||||
growthPropertyName: "growthEBIT",
|
|
||||||
label: "EBIT",
|
label: "EBIT",
|
||||||
text: ``,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
propertyName: "depreciationAndAmortization",
|
propertyName: "depreciationAndAmortization",
|
||||||
growthPropertyName: "growthDepreciationAndAmortization",
|
|
||||||
label: "Depreciation & Amortization",
|
label: "Depreciation & Amortization",
|
||||||
text: "Depreciation and amortization are accounting methods for calculating how the value of a business's assets change over time. Depreciation refers to physical assets, while amortization refers to intangible assets.",
|
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -198,7 +154,6 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
fullStatement = data?.getData;
|
fullStatement = data?.getData;
|
||||||
displayStatement = "revenue";
|
|
||||||
|
|
||||||
const exportFundamentalData = (format = "csv") => {
|
const exportFundamentalData = (format = "csv") => {
|
||||||
if (["Pro", "Plus"]?.includes(data?.user?.tier)) {
|
if (["Pro", "Plus"]?.includes(data?.user?.tier)) {
|
||||||
@ -326,7 +281,7 @@
|
|||||||
|
|
||||||
<SEO
|
<SEO
|
||||||
title={`${$displayCompanyName} (${$stockTicker}) Financials - Income Statement`}
|
title={`${$displayCompanyName} (${$stockTicker}) Financials - Income Statement`}
|
||||||
description={`Detailed annual and timeFramely income statement for ${$displayCompanyName} (${$stockTicker}). See many years of revenue, expenses and profits or losses.`}
|
description={`Detailed annual and quarter income statement for ${$displayCompanyName} (${$stockTicker}). See many years of revenue, expenses and profits or losses.`}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<section class=" w-full overflow-hidden h-full">
|
<section class=" w-full overflow-hidden h-full">
|
||||||
@ -506,10 +461,10 @@
|
|||||||
</div>
|
</div>
|
||||||
{:else}
|
{:else}
|
||||||
<div
|
<div
|
||||||
class="flex flex-col sm:flex-row items-start sm:items-center sm:justify-between"
|
class="flex flex-col sm:flex-row items-start sm:items-end sm:justify-between"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
class="text-sm order-1 sm:order-0 mt-5 sm:mt-0 text-gray-600 dark:text-gray-400 w-full"
|
class="text-xs sm:text-sm order-1 sm:order-0 mt-5 sm:mt-0 text-gray-600 dark:text-gray-400 w-full"
|
||||||
>
|
>
|
||||||
Financials in {data?.getProfileData?.currency}. Fiscal year
|
Financials in {data?.getProfileData?.currency}. Fiscal year
|
||||||
is
|
is
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user