From 582cb04e49120e4edb023d4b0b2369fa360f8916 Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Tue, 19 Nov 2024 17:41:50 +0100 Subject: [PATCH] add performance tab --- src/routes/stock-screener/+page.svelte | 198 ++++++++++++++---- .../stock-screener/workers/downloadWorker.ts | 2 - 2 files changed, 158 insertions(+), 42 deletions(-) diff --git a/src/routes/stock-screener/+page.svelte b/src/routes/stock-screener/+page.svelte index a078bf73..a3874261 100644 --- a/src/routes/stock-screener/+page.svelte +++ b/src/routes/stock-screener/+page.svelte @@ -47,6 +47,7 @@ let displayRules = []; let selectedPopularStrategy = ""; let displayTableTab = "general"; + let otherTabRules = []; let stockScreenerData = data?.getStockScreenerData?.filter((item) => Object?.values(item)?.every( @@ -217,7 +218,7 @@ step: ["20%", "10%", "5%", "1%", "-1%", "-5%", "-10%", "-20%"], category: "ta", defaultCondition: "over", - defaultValue: "1%", + defaultValue: "any", }, change1M: { label: "Price Change 1M", @@ -236,7 +237,7 @@ ], category: "ta", defaultCondition: "over", - defaultValue: "10%", + defaultValue: "any", }, change3M: { label: "Price Change 3M", @@ -255,7 +256,7 @@ ], category: "ta", defaultCondition: "over", - defaultValue: "10%", + defaultValue: "any", }, change6M: { label: "Price Change 6M", @@ -274,7 +275,7 @@ ], category: "ta", defaultCondition: "over", - defaultValue: "10%", + defaultValue: "any", }, change1Y: { label: "Price Change 1Y", @@ -293,7 +294,7 @@ ], category: "ta", defaultCondition: "over", - defaultValue: "10%", + defaultValue: "any", }, change3Y: { label: "Price Change 3Y", @@ -312,7 +313,7 @@ ], category: "ta", defaultCondition: "over", - defaultValue: "10%", + defaultValue: "any", }, marketCap: { label: "Market Cap", @@ -1478,8 +1479,9 @@ const handleMessage = (event) => { displayRules = allRows?.filter((row) => - ruleOfList.some((rule) => rule.name === row.rule), + ruleOfList?.some((rule) => rule.name === row.rule), ); + filteredData = event.data?.filteredData ?? []; displayResults = filteredData?.slice(0, 50); }; @@ -1490,11 +1492,27 @@ }; const loadWorker = async () => { - syncWorker.postMessage({ stockScreenerData, ruleOfList }); + if (displayTableTab === "performance") { + syncWorker.postMessage({ + stockScreenerData, + ruleOfList: [...ruleOfList, ...otherTabRules], + }); + } else { + syncWorker.postMessage({ + stockScreenerData, + ruleOfList, + }); + } }; const updateStockScreenerData = async () => { - downloadWorker.postMessage({ ruleOfList: ruleOfList }); + if (displayTableTab === "performance") { + downloadWorker.postMessage({ + ruleOfList: [...ruleOfList, ...otherTabRules], + }); + } else { + downloadWorker.postMessage({ ruleOfList: ruleOfList }); + } }; function handleAddRule() { @@ -1988,8 +2006,8 @@ const handleKeyDown = (event) => { { key: "symbol", label: "Symbol", align: "left" }, { key: "name", label: "Name", align: "left" }, { key: "marketCap", label: "Market Cap", align: "right" }, - { key: "changesPercentage", label: "% Change", align: "right" }, { key: "price", label: "Price", align: "right" }, + { key: "changesPercentage", label: "% Change", align: "right" }, { key: "volume", label: "Volume", align: "right" }, { key: "pe", label: "PE Ratio", align: "right" }, ]; @@ -2004,19 +2022,6 @@ const handleKeyDown = (event) => { pe: { order: "none", type: "number" }, }; - // Initial columns and sort orders for other tabs - const baseColumns = [ - { key: "symbol", label: "Symbol", align: "left" }, - { key: "name", label: "Name", align: "left" }, - { key: "marketCap", label: "Market Cap", align: "right" }, - ]; - - const baseSortOrders = { - symbol: { order: "none", type: "string" }, - name: { order: "none", type: "string" }, - marketCap: { order: "none", type: "number" }, - }; - const stringTypeRules = [ "country", "industry", @@ -2032,18 +2037,43 @@ const handleKeyDown = (event) => { $: { if (displayTableTab) { + const baseColumnsMap = { + performance: [ + { key: "symbol", label: "Symbol", align: "left" }, + { key: "name", label: "Name", align: "left" }, + { key: "marketCap", label: "Market Cap", align: "right" }, + ], + filters: [ + { key: "symbol", label: "Symbol", align: "left" }, + { key: "name", label: "Name", align: "left" }, + { key: "marketCap", label: "Market Cap", align: "right" }, + ], + }; + + const baseSortOrdersMap = { + performance: { + symbol: { order: "none", type: "string" }, + name: { order: "none", type: "string" }, + marketCap: { order: "none", type: "number" }, + }, + filters: { + symbol: { order: "none", type: "string" }, + name: { order: "none", type: "string" }, + marketCap: { order: "none", type: "number" }, + }, + }; + if (displayTableTab === "general") { - // Set columns and sortOrders for the "general" tab columns = [...generalColumns]; sortOrders = { ...generalSortOrders }; } else { - // Set base columns and sortOrders, then extend with displayRules - columns = [...baseColumns]; - sortOrders = { ...baseSortOrders }; + columns = [...(baseColumnsMap[displayTableTab] || [])]; + sortOrders = { ...(baseSortOrdersMap[displayTableTab] || {}) }; - displayRules?.forEach((rule) => { + const rulesList = + displayTableTab === "performance" ? tabRuleList : displayRules; + rulesList?.forEach((rule) => { if (rule.rule !== "marketCap") { - // Ignore "marketCap" if it's present in displayRules columns.push({ key: rule.rule, label: rule.label, @@ -2055,6 +2085,26 @@ const handleKeyDown = (event) => { } } } + + let tabRuleList = []; + async function changeTab(state) { + displayTableTab = state; + + if (displayTableTab === "performance") { + otherTabRules = [ + { name: "marketCap", value: "any" }, + { name: "change1W", value: "any" }, + { name: "change1M", value: "any" }, + { name: "change3M", value: "any" }, + { name: "change1Y", value: "any" }, + ]; + tabRuleList = otherTabRules + .map((rule) => allRows.find((row) => row.rule === rule.name)) + .filter(Boolean); + + await updateStockScreenerData(); + } + } @@ -2757,9 +2807,9 @@ const handleKeyDown = (event) => { {filteredData?.length} Stocks
-