From 62594e13f6f74d1844a602ffbf4f77b47524f2a6 Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Wed, 30 Oct 2024 13:36:08 +0100 Subject: [PATCH] refactor etf provider --- .../etf/etf-providers/[slug]/+page.svelte | 124 +++++++++++++++--- 1 file changed, 109 insertions(+), 15 deletions(-) diff --git a/src/routes/etf/etf-providers/[slug]/+page.svelte b/src/routes/etf/etf-providers/[slug]/+page.svelte index b4ce3755..67e5d61f 100644 --- a/src/routes/etf/etf-providers/[slug]/+page.svelte +++ b/src/routes/etf/etf-providers/[slug]/+page.svelte @@ -2,6 +2,7 @@ import { abbreviateNumber, formatETFName } from "$lib/utils"; import { screenWidth, numberOfUnreadNotification } from "$lib/store"; import { onMount } from "svelte"; + import TableHeader from "$lib/components/Table/TableHeader.svelte"; export let data; let rawData = data?.getETFProviderData; @@ -35,7 +36,85 @@ }; }); - $: charNumber = $screenWidth < 640 ? 20 : 30; + $: charNumber = $screenWidth < 640 ? 20 : 20; + + let columns = [ + { key: "symbol", label: "Symbol", align: "left" }, + { key: "name", label: "Name", align: "left" }, + { key: "price", label: "Price", align: "right" }, + { key: "changesPercentage", label: "Change", align: "right" }, + { key: "totalAssets", label: "Total Assets", align: "right" }, + { key: "numberOfHoldings", label: "Holdings", align: "right" }, + { key: "expenseRatio", label: "Expense Ratio", align: "right" }, + ]; + + let sortOrders = { + symbol: { order: "none", type: "string" }, + name: { order: "none", type: "string" }, + price: { order: "none", type: "number" }, + changesPercentage: { order: "none", type: "number" }, + totalAssets: { order: "none", type: "number" }, + numberOfHoldings: { order: "none", type: "number" }, + expenseRatio: { order: "none", type: "number" }, + }; + + const sortData = (key) => { + // Reset all other keys to 'none' except the current key + for (const k in sortOrders) { + if (k !== key) { + sortOrders[k].order = "none"; + } + } + + // Cycle through 'none', 'asc', 'desc' for the clicked key + const orderCycle = ["none", "asc", "desc"]; + + let originalData = rawData; + + const currentOrderIndex = orderCycle.indexOf(sortOrders[key].order); + sortOrders[key].order = + orderCycle[(currentOrderIndex + 1) % orderCycle.length]; + const sortOrder = sortOrders[key].order; + + // Reset to original data when 'none' and stop further sorting + if (sortOrder === "none") { + etfProviderData = [...originalData]?.slice(0, 50); // Reset to original data (spread to avoid mutation) + return; + } + + // Define a generic comparison function + const compareValues = (a, b) => { + const { type } = sortOrders[key]; + let valueA, valueB; + + switch (type) { + case "date": + valueA = new Date(a[key]); + valueB = new Date(b[key]); + break; + case "string": + valueA = a[key].toUpperCase(); + valueB = b[key].toUpperCase(); + return sortOrder === "asc" + ? valueA.localeCompare(valueB) + : valueB.localeCompare(valueA); + case "number": + default: + valueA = parseFloat(a[key]); + valueB = parseFloat(b[key]); + break; + } + + if (sortOrder === "asc") { + return valueA < valueB ? -1 : valueA > valueB ? 1 : 0; + } else { + return valueA > valueB ? -1 : valueA < valueB ? 1 : 0; + } + }; + + // Sort using the generic comparison function + etfProviderData = [...originalData].sort(compareValues)?.slice(0, 50); + }; @@ -131,23 +210,12 @@
-
+
- - - - - - - + {#each etfProviderData as item} @@ -174,6 +242,32 @@ : item?.name} + + + +
SymbolFund NameTotal AssetsHoldingsExpense Ratio
+ {item?.price} + + {#if item?.changesPercentage >= 0} + +{item?.changesPercentage >= 1000 + ? abbreviateNumber(item?.changesPercentage) + : item?.changesPercentage?.toFixed(2)}% + {:else if item?.changesPercentage < 0} + {item?.changesPercentage <= -1000 + ? abbreviateNumber(item?.changesPercentage) + : item?.changesPercentage?.toFixed(2)}% + + {:else} + - + {/if} +