Merge pull request #13 from Traijan1/main
added forward pe to analyst-estimates component
This commit is contained in:
commit
46985e413a
@ -20,12 +20,12 @@
|
||||
let xData = [];
|
||||
let optionsData;
|
||||
|
||||
let displayData = "Revenue";
|
||||
let displayData = "Revenue";
|
||||
|
||||
function findIndex(data) {
|
||||
function findIndex(data) {
|
||||
const currentYear = new Date().getFullYear();
|
||||
return data.findIndex(item => item.date >= currentYear && item.revenue === null);
|
||||
}
|
||||
return data.findIndex((item) => item.date >= currentYear && item.revenue === null);
|
||||
}
|
||||
|
||||
function changeStatement(event) {
|
||||
displayData = event.target.value;
|
||||
@ -50,7 +50,6 @@ function findIndex(data) {
|
||||
let tableDataActual = [];
|
||||
let tableDataForecast = [];
|
||||
|
||||
|
||||
function getPlotOptions() {
|
||||
let dates = [];
|
||||
let valueList = [];
|
||||
@ -58,58 +57,54 @@ function findIndex(data) {
|
||||
let lowList = [];
|
||||
let highList = [];
|
||||
|
||||
|
||||
let filteredData = analystEstimateList?.filter((item) => item.date >= 2019) ?? [];
|
||||
const stopIndex = findIndex(filteredData);
|
||||
|
||||
if (filteredData) {
|
||||
filteredData.forEach((item, index) => {
|
||||
const date = item.date?.toString().slice(-2);
|
||||
const isBeforeStopIndex = index < stopIndex - 1;
|
||||
const isAfterStartIndex = index >= stopIndex - 2;
|
||||
dates.push(`FY${date}`);
|
||||
switch (displayData) {
|
||||
case "Revenue":
|
||||
valueList.push(isBeforeStopIndex ? item.revenue : null);
|
||||
avgList.push(isAfterStartIndex ? item.estimatedRevenueAvg : null);
|
||||
lowList.push(isAfterStartIndex ? item.estimatedRevenueLow : null);
|
||||
highList.push(isAfterStartIndex ? item.estimatedRevenueHigh : null);
|
||||
break;
|
||||
case "Net Income":
|
||||
valueList.push(isBeforeStopIndex ? item.netIncome : null);
|
||||
avgList.push(isAfterStartIndex ? item.estimatedNetIncomeAvg : null);
|
||||
lowList.push(isAfterStartIndex ? item.estimatedNetIncomeLow : null);
|
||||
highList.push(isAfterStartIndex ? item.estimatedNetIncomeHigh : null);
|
||||
break;
|
||||
case "EBITDA":
|
||||
valueList.push(isBeforeStopIndex ? item.ebitda : null);
|
||||
avgList.push(isAfterStartIndex ? item.estimatedEbitdaAvg : null);
|
||||
lowList.push(isAfterStartIndex ? item.estimatedEbitdaLow : null);
|
||||
highList.push(isAfterStartIndex ? item.estimatedEbitdaHigh : null);
|
||||
break;
|
||||
case "EPS":
|
||||
valueList.push(isBeforeStopIndex ? item.eps : null);
|
||||
avgList.push(isAfterStartIndex ? item.estimatedEpsAvg : null);
|
||||
lowList.push(isAfterStartIndex ? item.estimatedEpsLow : null);
|
||||
highList.push(isAfterStartIndex ? item.estimatedEpsHigh : null);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
if (filteredData) {
|
||||
filteredData.forEach((item, index) => {
|
||||
const date = item.date?.toString().slice(-2);
|
||||
const isBeforeStopIndex = index < stopIndex - 1;
|
||||
const isAfterStartIndex = index >= stopIndex - 2;
|
||||
dates.push(`FY${date}`);
|
||||
switch (displayData) {
|
||||
case "Revenue":
|
||||
valueList.push(isBeforeStopIndex ? item.revenue : null);
|
||||
avgList.push(isAfterStartIndex ? item.estimatedRevenueAvg : null);
|
||||
lowList.push(isAfterStartIndex ? item.estimatedRevenueLow : null);
|
||||
highList.push(isAfterStartIndex ? item.estimatedRevenueHigh : null);
|
||||
break;
|
||||
case "Net Income":
|
||||
valueList.push(isBeforeStopIndex ? item.netIncome : null);
|
||||
avgList.push(isAfterStartIndex ? item.estimatedNetIncomeAvg : null);
|
||||
lowList.push(isAfterStartIndex ? item.estimatedNetIncomeLow : null);
|
||||
highList.push(isAfterStartIndex ? item.estimatedNetIncomeHigh : null);
|
||||
break;
|
||||
case "EBITDA":
|
||||
valueList.push(isBeforeStopIndex ? item.ebitda : null);
|
||||
avgList.push(isAfterStartIndex ? item.estimatedEbitdaAvg : null);
|
||||
lowList.push(isAfterStartIndex ? item.estimatedEbitdaLow : null);
|
||||
highList.push(isAfterStartIndex ? item.estimatedEbitdaHigh : null);
|
||||
break;
|
||||
case "EPS":
|
||||
valueList.push(isBeforeStopIndex ? item.eps : null);
|
||||
avgList.push(isAfterStartIndex ? item.estimatedEpsAvg : null);
|
||||
lowList.push(isAfterStartIndex ? item.estimatedEpsLow : null);
|
||||
highList.push(isAfterStartIndex ? item.estimatedEpsHigh : null);
|
||||
break;
|
||||
|
||||
}
|
||||
try {
|
||||
const lastValue = valueList[stopIndex-2];
|
||||
avgList[stopIndex-2] = lastValue;
|
||||
lowList[stopIndex-2] = lastValue;
|
||||
highList[stopIndex-2] = lastValue;
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
try {
|
||||
const lastValue = valueList[stopIndex - 2];
|
||||
avgList[stopIndex - 2] = lastValue;
|
||||
lowList[stopIndex - 2] = lastValue;
|
||||
highList[stopIndex - 2] = lastValue;
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Normalize the data if needed (not required in this case, but leaving it here for reference)
|
||||
const { unit, denominator } = normalizer(Math.max(...valueList, ...avgList) ?? 0);
|
||||
@ -171,7 +166,7 @@ function findIndex(data) {
|
||||
color: "#fff", // Change line plot color to green
|
||||
},
|
||||
lineStyle: {
|
||||
type: "dashed" // Set the line type to dashed
|
||||
type: "dashed", // Set the line type to dashed
|
||||
},
|
||||
showSymbol: false, // Show symbols for line plot points
|
||||
},
|
||||
@ -179,11 +174,11 @@ function findIndex(data) {
|
||||
name: "Low",
|
||||
data: lowList,
|
||||
type: "line",
|
||||
itemStyle: {
|
||||
itemStyle: {
|
||||
color: "#3CB2EF", // Change line plot color to green
|
||||
},
|
||||
lineStyle: {
|
||||
type: "dashed" // Set the line type to dashed
|
||||
type: "dashed", // Set the line type to dashed
|
||||
},
|
||||
showSymbol: false, // Show symbols for line plot points
|
||||
},
|
||||
@ -195,7 +190,7 @@ function findIndex(data) {
|
||||
color: "#3CB2EF", // Change line plot color to green
|
||||
},
|
||||
lineStyle: {
|
||||
type: "dashed" // Set the line type to dashed
|
||||
type: "dashed", // Set the line type to dashed
|
||||
},
|
||||
showSymbol: false, // Show symbols for line plot points
|
||||
},
|
||||
@ -238,16 +233,35 @@ function findIndex(data) {
|
||||
});
|
||||
});
|
||||
} else if (displayData === "EPS") {
|
||||
let forwardPeStart = false;
|
||||
filteredData?.forEach((item) => {
|
||||
const fy = Number(String(item?.date)?.slice(-2));
|
||||
const actualVal = item?.eps ?? null;
|
||||
const forecastVal = item?.estimatedEpsAvg;
|
||||
|
||||
tableDataActual?.push({
|
||||
FY: Number(String(item?.date)?.slice(-2)),
|
||||
val: item?.eps ?? null,
|
||||
FY: fy,
|
||||
val: actualVal,
|
||||
});
|
||||
tableDataForecast?.push({
|
||||
FY: Number(String(item?.date)?.slice(-2)),
|
||||
val: item?.estimatedEpsAvg,
|
||||
|
||||
if (actualVal === null) {
|
||||
forwardPeStart = true;
|
||||
}
|
||||
|
||||
const forecastEntry: any = {
|
||||
FY: fy,
|
||||
val: forecastVal,
|
||||
numOfAnalysts: item?.numOfAnalysts,
|
||||
});
|
||||
};
|
||||
|
||||
// Add forwardPe if the condition is met
|
||||
if (forwardPeStart && forecastVal !== null) {
|
||||
forecastEntry.forwardPe = Math.round((data.getStockQuote.price / forecastVal) * 100) / 100;
|
||||
} else {
|
||||
forecastEntry.forwardPe = null;
|
||||
}
|
||||
|
||||
tableDataForecast?.push(forecastEntry);
|
||||
});
|
||||
} else if (displayData === "EBITDA") {
|
||||
filteredData?.forEach((item) => {
|
||||
@ -388,14 +402,34 @@ function findIndex(data) {
|
||||
{/each}
|
||||
</tr>
|
||||
|
||||
<tr class="bg-[#27272A] border-b-[#27272A]">
|
||||
<th class="bg-[#27272A] whitespace-nowrap text-sm sm:text-[1rem] text-white text-start font-medium bg-[#27272A] border-b border-[#27272A]"> No. Analysts </th>
|
||||
{#each tableDataForecast as item}
|
||||
<td class="text-white text-sm sm:text-[1rem] text-end font-medium bg-[#27272A]">
|
||||
{item?.numOfAnalysts === (null || 0) ? "-" : item?.numOfAnalysts}
|
||||
</td>
|
||||
{/each}
|
||||
</tr>
|
||||
{#if displayData === "EPS"}
|
||||
<tr class="bg-[#27272A] border-b-[#27272A]">
|
||||
<th class="bg-[#27272A] text-sm sm:text-[1rem] whitespace-nowrap text-white text-start font-medium bg-[#27272A] border-b border-[#27272A]">Forward PE</th>
|
||||
{#each tableDataForecast as item}
|
||||
<td class="text-white text-sm sm:text-[1rem] text-end font-medium bg-[#27272A]">
|
||||
{item?.forwardPe === "0.00" || item?.forwardPe === null || item?.forwardPe === 0 ? "-" : abbreviateNumber(item.forwardPe)}
|
||||
</td>
|
||||
{/each}
|
||||
</tr>
|
||||
|
||||
<tr class="odd:bg-[#09090B] border-b-[#09090B]">
|
||||
<th class="text-white whitespace-nowrap text-sm sm:text-[1rem] text-start font-medium bg-[#09090B] border-b border-[#09090B]">No. Analysts</th>
|
||||
{#each tableDataForecast as item}
|
||||
<td class="text-white text-sm sm:text-[1rem] text-end font-medium border-b border-[#09090B]">
|
||||
{item?.numOfAnalysts === (null || 0) ? "-" : item?.numOfAnalysts}
|
||||
</td>
|
||||
{/each}
|
||||
</tr>
|
||||
{:else}
|
||||
<tr class="bg-[#27272A] border-b-[#27272A]">
|
||||
<th class="bg-[#27272A] whitespace-nowrap text-sm sm:text-[1rem] text-white text-start font-medium bg-[#27272A] border-b border-[#27272A]"> No. Analysts </th>
|
||||
{#each tableDataForecast as item}
|
||||
<td class="text-white text-sm sm:text-[1rem] text-end font-medium bg-[#27272A]">
|
||||
{item?.numOfAnalysts === (null || 0) ? "-" : item?.numOfAnalysts}
|
||||
</td>
|
||||
{/each}
|
||||
</tr>
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@ -8,20 +8,18 @@
|
||||
let changeNetIncome = 0;
|
||||
let changeEBITDA = 0;
|
||||
let changeEPS = 0;
|
||||
function findIndex(data) {
|
||||
function findIndex(data) {
|
||||
const currentYear = new Date().getFullYear();
|
||||
return data?.findIndex(item => item?.date >= currentYear && item?.revenue === null);
|
||||
}
|
||||
|
||||
|
||||
if(data?.getAnalystEstimate?.length !== 0) {
|
||||
index = findIndex(data?.getAnalystEstimate);
|
||||
changeRevenue = ((data?.getAnalystEstimate[index-1]?.estimatedRevenueAvg/data?.getAnalystEstimate[index-2]?.revenue-1)*100)
|
||||
changeNetIncome = ((data?.getAnalystEstimate[index-1]?.estimatedNetIncomeAvg/data?.getAnalystEstimate[index-2]?.netIncome-1)*100)
|
||||
changeEBITDA = ((data?.getAnalystEstimate[index-1]?.estimatedEbitdaAvg/data?.getAnalystEstimate[index-2]?.ebitda-1)*100)
|
||||
changeEPS = ((data?.getAnalystEstimate[index-1]?.estimatedEpsAvg/data?.getAnalystEstimate[index-2]?.eps-1)*100)
|
||||
}
|
||||
return data?.findIndex((item) => item?.date >= currentYear && item?.revenue === null);
|
||||
}
|
||||
|
||||
if (data?.getAnalystEstimate?.length !== 0) {
|
||||
index = findIndex(data?.getAnalystEstimate);
|
||||
changeRevenue = (data?.getAnalystEstimate[index - 1]?.estimatedRevenueAvg / data?.getAnalystEstimate[index - 2]?.revenue - 1) * 100;
|
||||
changeNetIncome = (data?.getAnalystEstimate[index - 1]?.estimatedNetIncomeAvg / data?.getAnalystEstimate[index - 2]?.netIncome - 1) * 100;
|
||||
changeEBITDA = (data?.getAnalystEstimate[index - 1]?.estimatedEbitdaAvg / data?.getAnalystEstimate[index - 2]?.ebitda - 1) * 100;
|
||||
changeEPS = (data?.getAnalystEstimate[index - 1]?.estimatedEpsAvg / data?.getAnalystEstimate[index - 2]?.eps - 1) * 100;
|
||||
}
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
@ -50,83 +48,78 @@ if(data?.getAnalystEstimate?.length !== 0) {
|
||||
<div class="flex justify-center m-auto h-full overflow-hidden w-full">
|
||||
<div class="relative flex justify-center items-center overflow-hidden w-full">
|
||||
<div class="sm:p-7 w-full m-auto mt-2 sm:mt-0">
|
||||
|
||||
<h2 class="mt-5 text-xl sm:text-2xl text-gray-200 font-bold mb-4">
|
||||
Financial Forecast this Year
|
||||
</h2>
|
||||
<h2 class="mt-5 text-xl sm:text-2xl text-gray-200 font-bold mb-4">Financial Forecast this Year</h2>
|
||||
{#if data?.getAnalystEstimate?.length !== 0}
|
||||
<div class="mb-4 grid grid-cols-2 grid-rows-1 divide-gray-500 rounded-lg border border-gray-600 bg-[#272727] shadow md:grid-cols-4 md:grid-rows-1 md:divide-x">
|
||||
<div class="p-4 bp:p-5 sm:p-6">
|
||||
<label class="mr-1 cursor-pointer flex flex-row items-center text-white text-[1rem] font-semibold">
|
||||
Revenue
|
||||
</label>
|
||||
<div class="mt-1 flex flex-col items-baseline justify-start space-y-2 bp:space-y-0">
|
||||
<div class="flex items-baseline text-2xl font-semibold text-white">
|
||||
{abbreviateNumber(data?.getAnalystEstimate[index-1]?.estimatedRevenueAvg,true)}
|
||||
</div>
|
||||
<div class="inline-flex items-baseline rounded-full px-2.5 py-0.5 text-sm font-semibold md:mt-2 lg:mt-0 bg-green-100 text-green-800 dark:bg-green-700 dark:text-dark-100">
|
||||
<svg class="-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center {changeRevenue > 0 ? 'text-green-500' : 'text-red-500 rotate-180'}" fill="none" viewBox="0 0 24 24" stroke="currentColor" style="max-width:40px" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 11l5-5m0 0l5 5m-5-5v12"></path></svg>
|
||||
{abbreviateNumber(changeRevenue?.toFixed(1))}%
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-0.5 mt-1.5 text-sm font-semibold text-white/60 lg:block">
|
||||
from {abbreviateNumber(data?.getAnalystEstimate[index-2]?.revenue)}
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-4 bp:p-5 sm:p-6 border-l border-contrast md:border-0">
|
||||
<label class="mr-1 cursor-pointer flex flex-row items-center text-white text-[1rem] font-semibold">
|
||||
Net Income
|
||||
</label>
|
||||
<div class="mt-1 flex flex-col items-baseline justify-start space-y-2 bp:space-y-0">
|
||||
<div class="flex items-baseline text-2xl font-semibold text-white">
|
||||
{abbreviateNumber(data?.getAnalystEstimate[index-1]?.estimatedNetIncomeAvg,true)}
|
||||
</div>
|
||||
<div class="inline-flex items-baseline rounded-full px-2.5 py-0.5 text-sm font-semibold md:mt-2 lg:mt-0 bg-green-100 text-green-800 dark:bg-green-700 dark:text-dark-100">
|
||||
<svg class="-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center {changeNetIncome > 0 ? 'text-green-500' : 'text-red-500 rotate-180'}" fill="none" viewBox="0 0 24 24" stroke="currentColor" style="max-width:40px" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 11l5-5m0 0l5 5m-5-5v12"></path></svg>
|
||||
{abbreviateNumber(changeNetIncome?.toFixed(1))}%
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-0.5 mt-1.5 text-sm font-semibold text-white/60 lg:block">
|
||||
from {abbreviateNumber(data?.getAnalystEstimate[index-2]?.netIncome,true)}
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-4 bp:p-5 sm:p-6 border-t border-contrast md:border-0">
|
||||
<label class="mr-1 cursor-pointer flex flex-row items-center text-white text-[1rem] font-semibold">
|
||||
EBITDA
|
||||
</label>
|
||||
<div class="mt-1 flex flex-col items-baseline justify-start space-y-2 bp:space-y-0">
|
||||
<div class="flex items-baseline text-2xl font-semibold text-white">
|
||||
{abbreviateNumber(data?.getAnalystEstimate[index-1]?.estimatedEbitdaAvg,true)}
|
||||
</div>
|
||||
<div class="inline-flex items-baseline rounded-full px-2.5 py-0.5 text-sm font-semibold md:mt-2 lg:mt-0 bg-green-100 text-green-800 dark:bg-green-700 dark:text-dark-100">
|
||||
<svg class="-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center {changeEBITDA > 0 ? 'text-green-500' : 'text-red-500 rotate-180'}" fill="none" viewBox="0 0 24 24" stroke="currentColor" style="max-width:40px" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 11l5-5m0 0l5 5m-5-5v12"></path></svg>
|
||||
{abbreviateNumber(changeEBITDA?.toFixed(2))}%
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-0.5 mt-1.5 text-sm font-semibold text-white/60 lg:block">
|
||||
from {abbreviateNumber(data?.getAnalystEstimate[index-2]?.ebitda,true)}
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-4 bp:p-5 sm:p-6 border-t border-contrast md:border-0 border-l border-contrast md:border-0">
|
||||
<label class="mr-1 cursor-pointer flex flex-row items-center text-white text-[1rem] font-semibold">
|
||||
EPS
|
||||
</label>
|
||||
<div class="mt-1 flex flex-col items-baseline justify-start space-y-2 bp:space-y-0">
|
||||
<div class="flex items-baseline text-2xl font-semibold text-white">
|
||||
{data?.getAnalystEstimate[index-1]?.estimatedEpsAvg}
|
||||
</div>
|
||||
<div class="inline-flex items-baseline rounded-full px-2.5 py-0.5 text-sm font-semibold md:mt-2 lg:mt-0 bg-green-100 text-green-800 dark:bg-green-700 dark:text-dark-100">
|
||||
<svg class="-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center {changeEPS > 0 ? 'text-green-500' : 'text-red-500 rotate-180'}" fill="none" viewBox="0 0 24 24" stroke="currentColor" style="max-width:40px" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 11l5-5m0 0l5 5m-5-5v12"></path></svg>
|
||||
{abbreviateNumber(changeEPS?.toFixed(1))}%
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-0.5 mt-1.5 text-sm font-semibold text-white/60 lg:block">
|
||||
from {data?.getAnalystEstimate[index-2]?.eps}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="mb-4 grid grid-cols-2 grid-rows-1 divide-gray-500 rounded-lg border border-gray-600 bg-[#272727] shadow md:grid-cols-4 md:grid-rows-1 md:divide-x">
|
||||
<div class="p-4 bp:p-5 sm:p-6">
|
||||
<label class="mr-1 cursor-pointer flex flex-row items-center text-white text-[1rem] font-semibold"> Revenue </label>
|
||||
<div class="mt-1 flex flex-col items-baseline justify-start space-y-2 bp:space-y-0">
|
||||
<div class="flex items-baseline text-2xl font-semibold text-white">
|
||||
{abbreviateNumber(data?.getAnalystEstimate[index - 1]?.estimatedRevenueAvg, true)}
|
||||
</div>
|
||||
<div class="inline-flex items-baseline rounded-full px-2.5 py-0.5 text-sm font-semibold md:mt-2 lg:mt-0 bg-green-100 text-green-800 dark:bg-green-700 dark:text-dark-100">
|
||||
<svg class="-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center {changeRevenue > 0 ? 'text-green-500' : 'text-red-500 rotate-180'}" fill="none" viewBox="0 0 24 24" stroke="currentColor" style="max-width:40px" aria-hidden="true"
|
||||
><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 11l5-5m0 0l5 5m-5-5v12"></path></svg
|
||||
>
|
||||
{abbreviateNumber(changeRevenue?.toFixed(1))}%
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-0.5 mt-1.5 text-sm font-semibold text-white/60 lg:block">
|
||||
from {abbreviateNumber(data?.getAnalystEstimate[index - 2]?.revenue)}
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-4 bp:p-5 sm:p-6 border-l border-contrast md:border-0">
|
||||
<label class="mr-1 cursor-pointer flex flex-row items-center text-white text-[1rem] font-semibold"> Net Income </label>
|
||||
<div class="mt-1 flex flex-col items-baseline justify-start space-y-2 bp:space-y-0">
|
||||
<div class="flex items-baseline text-2xl font-semibold text-white">
|
||||
{abbreviateNumber(data?.getAnalystEstimate[index - 1]?.estimatedNetIncomeAvg, true)}
|
||||
</div>
|
||||
<div class="inline-flex items-baseline rounded-full px-2.5 py-0.5 text-sm font-semibold md:mt-2 lg:mt-0 bg-green-100 text-green-800 dark:bg-green-700 dark:text-dark-100">
|
||||
<svg class="-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center {changeNetIncome > 0 ? 'text-green-500' : 'text-red-500 rotate-180'}" fill="none" viewBox="0 0 24 24" stroke="currentColor" style="max-width:40px" aria-hidden="true"
|
||||
><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 11l5-5m0 0l5 5m-5-5v12"></path></svg
|
||||
>
|
||||
{abbreviateNumber(changeNetIncome?.toFixed(1))}%
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-0.5 mt-1.5 text-sm font-semibold text-white/60 lg:block">
|
||||
from {abbreviateNumber(data?.getAnalystEstimate[index - 2]?.netIncome, true)}
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-4 bp:p-5 sm:p-6 border-t border-contrast md:border-0">
|
||||
<label class="mr-1 cursor-pointer flex flex-row items-center text-white text-[1rem] font-semibold"> EBITDA </label>
|
||||
<div class="mt-1 flex flex-col items-baseline justify-start space-y-2 bp:space-y-0">
|
||||
<div class="flex items-baseline text-2xl font-semibold text-white">
|
||||
{abbreviateNumber(data?.getAnalystEstimate[index - 1]?.estimatedEbitdaAvg, true)}
|
||||
</div>
|
||||
<div class="inline-flex items-baseline rounded-full px-2.5 py-0.5 text-sm font-semibold md:mt-2 lg:mt-0 bg-green-100 text-green-800 dark:bg-green-700 dark:text-dark-100">
|
||||
<svg class="-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center {changeEBITDA > 0 ? 'text-green-500' : 'text-red-500 rotate-180'}" fill="none" viewBox="0 0 24 24" stroke="currentColor" style="max-width:40px" aria-hidden="true"
|
||||
><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 11l5-5m0 0l5 5m-5-5v12"></path></svg
|
||||
>
|
||||
{abbreviateNumber(changeEBITDA?.toFixed(2))}%
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-0.5 mt-1.5 text-sm font-semibold text-white/60 lg:block">
|
||||
from {abbreviateNumber(data?.getAnalystEstimate[index - 2]?.ebitda, true)}
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-4 bp:p-5 sm:p-6 border-t border-contrast md:border-0 border-l border-contrast md:border-0">
|
||||
<label class="mr-1 cursor-pointer flex flex-row items-center text-white text-[1rem] font-semibold"> EPS </label>
|
||||
<div class="mt-1 flex flex-col items-baseline justify-start space-y-2 bp:space-y-0">
|
||||
<div class="flex items-baseline text-2xl font-semibold text-white">
|
||||
{data?.getAnalystEstimate[index - 1]?.estimatedEpsAvg}
|
||||
</div>
|
||||
<div class="inline-flex items-baseline rounded-full px-2.5 py-0.5 text-sm font-semibold md:mt-2 lg:mt-0 bg-green-100 text-green-800 dark:bg-green-700 dark:text-dark-100">
|
||||
<svg class="-ml-1 mr-0.5 h-5 w-5 flex-shrink-0 self-center {changeEPS > 0 ? 'text-green-500' : 'text-red-500 rotate-180'}" fill="none" viewBox="0 0 24 24" stroke="currentColor" style="max-width:40px" aria-hidden="true"
|
||||
><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 11l5-5m0 0l5 5m-5-5v12"></path></svg
|
||||
>
|
||||
{abbreviateNumber(changeEPS?.toFixed(1))}%
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-0.5 mt-1.5 text-sm font-semibold text-white/60 lg:block">
|
||||
from {data?.getAnalystEstimate[index - 2]?.eps}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full m-auto sm:pb-6 sm:pt-6 {!$analystEstimateComponent ? 'hidden' : ''}">
|
||||
{#await import("$lib/components/AnalystEstimate.svelte") then { default: Comp }}
|
||||
@ -134,13 +127,13 @@ if(data?.getAnalystEstimate?.length !== 0) {
|
||||
{/await}
|
||||
</div>
|
||||
{:else}
|
||||
<div class="text-white p-3 sm:p-5 mb-10 rounded-lg sm:flex sm:flex-row sm:items-center border border-slate-800 text-sm sm:text-[1rem]">
|
||||
<svg class="w-6 h-6 flex-shrink-0 inline-block sm:mr-2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><path fill="#a474f6" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m-4 48a12 12 0 1 1-12 12a12 12 0 0 1 12-12m12 112a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 0 16"/></svg>
|
||||
<div class="text-white p-3 sm:p-5 mb-10 rounded-lg sm:flex sm:flex-row sm:items-center border border-slate-800 text-sm sm:text-[1rem]">
|
||||
<svg class="w-6 h-6 flex-shrink-0 inline-block sm:mr-2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"
|
||||
><path fill="#a474f6" d="M128 24a104 104 0 1 0 104 104A104.11 104.11 0 0 0 128 24m-4 48a12 12 0 1 1-12 12a12 12 0 0 1 12-12m12 112a16 16 0 0 1-16-16v-40a8 8 0 0 1 0-16a16 16 0 0 1 16 16v40a8 8 0 0 1 0 16" /></svg
|
||||
>
|
||||
No analyst forecast available for {$displayCompanyName}.
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user