update insider page
This commit is contained in:
parent
8bcc13ee57
commit
2dd9a0601c
@ -57,6 +57,7 @@ export const load = async ({ locals, params }) => {
|
|||||||
return output;
|
return output;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
const getInsiderTradingStatistics = async () => {
|
const getInsiderTradingStatistics = async () => {
|
||||||
const postData = {
|
const postData = {
|
||||||
ticker: params.tickerID,
|
ticker: params.tickerID,
|
||||||
@ -76,10 +77,11 @@ export const load = async ({ locals, params }) => {
|
|||||||
|
|
||||||
return output;
|
return output;
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
// Make sure to return a promise
|
// Make sure to return a promise
|
||||||
return {
|
return {
|
||||||
getInsiderTrading: await getInsiderTrading(),
|
getInsiderTrading: await getInsiderTrading(),
|
||||||
getInsiderTradingStatistics: await getInsiderTradingStatistics(),
|
//getInsiderTradingStatistics: await getInsiderTradingStatistics(),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -8,20 +8,58 @@ import { onMount } from 'svelte';
|
|||||||
|
|
||||||
export let data;
|
export let data;
|
||||||
let isLoaded = false;
|
let isLoaded = false;
|
||||||
let statistics = data?.getInsiderTradingStatistics ?? {};
|
|
||||||
|
|
||||||
let buySellRatio = statistics?.totalBought/statistics?.totalSold
|
let statistics = {};
|
||||||
let buyShares = statistics?.totalBought
|
|
||||||
let soldShares = statistics?.totalSold
|
|
||||||
let buySharesPercentage = Math.floor(buyShares/(buyShares+soldShares)*100);
|
|
||||||
let soldSharesPercentage = 100 - buySharesPercentage;
|
|
||||||
|
|
||||||
|
|
||||||
|
function calculateInsiderTradingStatistics(data) {
|
||||||
|
const now = new Date();
|
||||||
|
const year = now.getFullYear();
|
||||||
|
const quarter = Math.floor(now.getMonth() / 3) + 1;
|
||||||
|
|
||||||
|
// Helper function to check if the transaction date is within the current quarter
|
||||||
|
const isInCurrentQuarter = (transactionDate) => {
|
||||||
|
const date = new Date(transactionDate);
|
||||||
|
return date.getFullYear() === year && Math.floor(date.getMonth() / 3) + 1 === quarter;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Initialize statistics object
|
||||||
|
let statistics = {
|
||||||
|
soldShares: 0,
|
||||||
|
buyShares: 0,
|
||||||
|
buySharesPercentage: 0,
|
||||||
|
soldSharesPercentage: 0,
|
||||||
|
quarter: quarter,
|
||||||
|
year: year,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Summing up bought and sold shares efficiently in a single loop
|
||||||
|
data.forEach(({ transactionType, securitiesTransacted, price, transactionDate }) => {
|
||||||
|
if (price > 0 && isInCurrentQuarter(transactionDate)) {
|
||||||
|
if (transactionType === "Sold") {
|
||||||
|
statistics.soldShares += securitiesTransacted;
|
||||||
|
} else if (transactionType === "Bought") {
|
||||||
|
statistics.buyShares += securitiesTransacted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const totalShares = statistics.buyShares + statistics.soldShares;
|
||||||
|
|
||||||
|
if (totalShares > 0) {
|
||||||
|
statistics.buySharesPercentage = Math.floor((statistics.buyShares / totalShares) * 100);
|
||||||
|
statistics.soldSharesPercentage = 100 - statistics.buySharesPercentage;
|
||||||
|
}
|
||||||
|
|
||||||
|
return statistics;
|
||||||
|
}
|
||||||
|
|
||||||
let rawData = data?.getInsiderTrading?.sort(
|
let rawData = data?.getInsiderTrading?.sort(
|
||||||
(a, b) => new Date(b?.transactionDate) - new Date(a?.transactionDate)
|
(a, b) => new Date(b?.transactionDate) - new Date(a?.transactionDate)
|
||||||
);
|
);
|
||||||
let insiderTradingList = rawData?.slice(0,20)
|
|
||||||
|
|
||||||
|
let insiderTradingList = rawData?.slice(0,50)
|
||||||
|
|
||||||
|
|
||||||
function backToTop() {
|
function backToTop() {
|
||||||
@ -61,6 +99,9 @@ async function handleScroll() {
|
|||||||
|
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
|
|
||||||
|
statistics = calculateInsiderTradingStatistics(rawData);
|
||||||
|
|
||||||
isLoaded = true;
|
isLoaded = true;
|
||||||
window.addEventListener('scroll', handleScroll);
|
window.addEventListener('scroll', handleScroll);
|
||||||
return () => {
|
return () => {
|
||||||
@ -148,7 +189,7 @@ const transactionStyles = {
|
|||||||
<div class="flex flex-col items-start">
|
<div class="flex flex-col items-start">
|
||||||
<span class="font-medium text-gray-200 text-sm sm:text-[1rem]">Buy/Sell</span>
|
<span class="font-medium text-gray-200 text-sm sm:text-[1rem]">Buy/Sell</span>
|
||||||
<span class="text-start text-sm sm:text-[1rem] font-medium text-white">
|
<span class="text-start text-sm sm:text-[1rem] font-medium text-white">
|
||||||
{buySellRatio?.toFixed(3) }
|
{(statistics?.buyShares/statistics?.soldShares)?.toFixed(2) }
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- Circular Progress -->
|
<!-- Circular Progress -->
|
||||||
@ -158,12 +199,12 @@ const transactionStyles = {
|
|||||||
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-[#3E3E3E]" stroke-width="3"></circle>
|
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-[#3E3E3E]" stroke-width="3"></circle>
|
||||||
<!-- Progress Circle inside a group with rotation -->
|
<!-- Progress Circle inside a group with rotation -->
|
||||||
<g class="origin-center -rotate-90 transform">
|
<g class="origin-center -rotate-90 transform">
|
||||||
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-blue-500" stroke-width="3" stroke-dasharray="100" stroke-dashoffset={buySellRatio>= 1 ? 0 : 100-(buySellRatio*100)?.toFixed(2)}></circle>
|
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-blue-500" stroke-width="3" stroke-dasharray="100" stroke-dashoffset={statistics?.buyShares/statistics?.soldShares>= 1 ? 0 : 100-(statistics?.buyShares/statistics?.soldShares*100)?.toFixed(2)}></circle>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
<!-- Percentage Text -->
|
<!-- Percentage Text -->
|
||||||
<div class="absolute top-1/2 start-1/2 transform -translate-y-1/2 -translate-x-1/2">
|
<div class="absolute top-1/2 start-1/2 transform -translate-y-1/2 -translate-x-1/2">
|
||||||
<span class="text-center text-white text-sm sm:text-[1rem]">{buySellRatio?.toFixed(2)}</span>
|
<span class="text-center text-white text-sm sm:text-[1rem]">{(statistics?.buyShares/statistics?.soldShares)?.toFixed(2)}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- End Circular Progress -->
|
<!-- End Circular Progress -->
|
||||||
@ -178,7 +219,7 @@ const transactionStyles = {
|
|||||||
{new Intl.NumberFormat("en", {
|
{new Intl.NumberFormat("en", {
|
||||||
minimumFractionDigits: 0,
|
minimumFractionDigits: 0,
|
||||||
maximumFractionDigits: 0
|
maximumFractionDigits: 0
|
||||||
}).format(buyShares)}
|
}).format(statistics?.buyShares)}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- Circular Progress -->
|
<!-- Circular Progress -->
|
||||||
@ -188,12 +229,12 @@ const transactionStyles = {
|
|||||||
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-[#3E3E3E]" stroke-width="3"></circle>
|
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-[#3E3E3E]" stroke-width="3"></circle>
|
||||||
<!-- Progress Circle inside a group with rotation -->
|
<!-- Progress Circle inside a group with rotation -->
|
||||||
<g class="origin-center -rotate-90 transform">
|
<g class="origin-center -rotate-90 transform">
|
||||||
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-[#00FC50]" stroke-width="3" stroke-dasharray="100" stroke-dashoffset={100-buySharesPercentage}></circle>
|
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-[#00FC50]" stroke-width="3" stroke-dasharray="100" stroke-dashoffset={100-statistics?.buySharesPercentage}></circle>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
<!-- Percentage Text -->
|
<!-- Percentage Text -->
|
||||||
<div class="absolute top-1/2 start-1/2 transform -translate-y-1/2 -translate-x-1/2">
|
<div class="absolute top-1/2 start-1/2 transform -translate-y-1/2 -translate-x-1/2">
|
||||||
<span class="text-center text-white text-sm sm:text-[1rem]">{buySharesPercentage}%</span>
|
<span class="text-center text-white text-sm sm:text-[1rem]">{statistics?.buySharesPercentage}%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- End Circular Progress -->
|
<!-- End Circular Progress -->
|
||||||
@ -207,7 +248,7 @@ const transactionStyles = {
|
|||||||
{new Intl.NumberFormat("en", {
|
{new Intl.NumberFormat("en", {
|
||||||
minimumFractionDigits: 0,
|
minimumFractionDigits: 0,
|
||||||
maximumFractionDigits: 0
|
maximumFractionDigits: 0
|
||||||
}).format(soldShares)}
|
}).format(statistics?.soldShares)}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- Circular Progress -->
|
<!-- Circular Progress -->
|
||||||
@ -217,12 +258,12 @@ const transactionStyles = {
|
|||||||
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-[#3E3E3E]" stroke-width="3"></circle>
|
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-[#3E3E3E]" stroke-width="3"></circle>
|
||||||
<!-- Progress Circle inside a group with rotation -->
|
<!-- Progress Circle inside a group with rotation -->
|
||||||
<g class="origin-center -rotate-90 transform">
|
<g class="origin-center -rotate-90 transform">
|
||||||
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-[#EE5365]" stroke-width="3" stroke-dasharray="100" stroke-dashoffset={100-soldSharesPercentage}></circle>
|
<circle cx="18" cy="18" r="16" fill="none" class="stroke-current text-[#EE5365]" stroke-width="3" stroke-dasharray="100" stroke-dashoffset={100-statistics?.soldSharesPercentage}></circle>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
<!-- Percentage Text -->
|
<!-- Percentage Text -->
|
||||||
<div class="absolute top-1/2 start-1/2 transform -translate-y-1/2 -translate-x-1/2">
|
<div class="absolute top-1/2 start-1/2 transform -translate-y-1/2 -translate-x-1/2">
|
||||||
<span class="text-center text-white text-sm sm:text-[1rem]">{soldSharesPercentage}%</span>
|
<span class="text-center text-white text-sm sm:text-[1rem]">{statistics?.soldSharesPercentage}%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- End Circular Progress -->
|
<!-- End Circular Progress -->
|
||||||
@ -258,6 +299,7 @@ const transactionStyles = {
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{#each (data?.user?.tier === 'Pro' ? insiderTradingList : insiderTradingList?.slice(0,3)) as item, index}
|
{#each (data?.user?.tier === 'Pro' ? insiderTradingList : insiderTradingList?.slice(0,3)) as item, index}
|
||||||
|
{#if item?.price > 0}
|
||||||
<tr class="text-white odd:bg-[#27272A] {index+1 === insiderTradingList?.slice(0,3)?.length && data?.user?.tier !== 'Pro' ? 'opacity-[0.1]' : ''}">
|
<tr class="text-white odd:bg-[#27272A] {index+1 === insiderTradingList?.slice(0,3)?.length && data?.user?.tier !== 'Pro' ? 'opacity-[0.1]' : ''}">
|
||||||
|
|
||||||
<td class="text-white text-sm sm:text-[1rem] border-b border-[#09090B] whitespace-nowrap">
|
<td class="text-white text-sm sm:text-[1rem] border-b border-[#09090B] whitespace-nowrap">
|
||||||
@ -291,6 +333,7 @@ const transactionStyles = {
|
|||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
{/if}
|
||||||
{/each}
|
{/each}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@ -1,15 +1,11 @@
|
|||||||
<script lang='ts'>
|
<script lang='ts'>
|
||||||
import { stockTicker, getCache, setCache, displayCompanyName, screenWidth, numberOfUnreadNotification } from '$lib/store';
|
import { stockTicker, getCache, setCache, displayCompanyName, numberOfUnreadNotification } from '$lib/store';
|
||||||
import { page } from '$app/stores';
|
|
||||||
|
|
||||||
export let data;
|
export let data;
|
||||||
|
|
||||||
let chats = data?.getTranscripts?.chat ?? [];
|
let chats = data?.getTranscripts?.chat ?? [];
|
||||||
let date = data?.getTranscripts?.date;
|
let date = data?.getTranscripts?.date;
|
||||||
|
|
||||||
let notDestroyed = true;
|
|
||||||
|
|
||||||
let charNumber = 20;
|
|
||||||
let displayQuarter = data?.quarter;
|
let displayQuarter = data?.quarter;
|
||||||
let displayYear = data?.year;
|
let displayYear = data?.year;
|
||||||
let quarter = displayQuarter;
|
let quarter = displayQuarter;
|
||||||
@ -62,17 +58,6 @@
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
$: {
|
|
||||||
if($screenWidth < 640)
|
|
||||||
{
|
|
||||||
charNumber = 10;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
charNumber =20;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user