{"version":3,"file":"etf-holdings-widget.32559d84.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/maps/services/api.ts","webpack://@finviz/website/./js/app/shared/components/Boxover.tsx","webpack://@finviz/website/./js/app/shared/components/ChartBoxover.tsx","webpack://@finviz/website/./js/app/shared/components/HoverChart.tsx","webpack://@finviz/website/./js/app/shared/components/QueryClientContext.tsx","webpack://@finviz/website/./js/app/shared/hover-chart.ts","webpack://@finviz/website/./js/app/stats/constants.ts","webpack://@finviz/website/./js/main/modules/portfolio/hooks/use-refetch-perf.ts","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/types.ts","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/constants.ts","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/utils.ts","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/hooks.ts","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/api.ts","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/Box.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/BreakdownMap.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/Navigation.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/Header.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/Pie.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/BreakdownView.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/StandardMap.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/TableNameColumn.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/Table.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/ETFHoldingsDialog.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/EliteAdOverlay.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/TableFooter.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/TopTenView.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/components/ETFHoldings.tsx"],"sourcesContent":["import { ContentType, apiRequest } from '../../../main/services/api'\r\nimport { MapSubtypeId, MapTypeId, PerfData } from '../types'\r\n\r\nexport function mapPerf(type: MapTypeId, subtype: MapSubtypeId) {\r\n return apiRequest(`/api/map_perf.ashx`, { query: { t: type, st: subtype } })\r\n}\r\n\r\nexport function mapPerfScreener(query = window.location.search) {\r\n return apiRequest(`/api/map_perf_screener.ashx${query}`)\r\n}\r\n\r\nexport interface UploadMapResponse {\r\n imgUrl: string\r\n shareUrl: string\r\n}\r\n\r\nexport function uploadMap({ type, subtype, data }: { type: MapTypeId; subtype: MapSubtypeId; data: string }) {\r\n return apiRequest(`/publish_map_submit.ashx`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': ContentType.FormUrlEncoded,\r\n },\r\n body: new URLSearchParams({\r\n file: data.replace('data:image/png;base64,', ''),\r\n type,\r\n subtype,\r\n }),\r\n })\r\n}\r\n","import * as React from 'react'\r\nimport * as ReactDOMServer from 'react-dom/server'\r\n\r\nconst BOXOVER_THEME = {\r\n default: { body: 'tooltip_bdy', header: 'tooltip_hdr' },\r\n chart: { body: 'hoverchart', header: 'tabchrthdr' },\r\n}\r\n\r\ninterface BoxoverProps {\r\n children: React.ReactNode\r\n\r\n /**\r\n * Which tooltip design to use\r\n *\r\n * @default default\r\n */\r\n theme?: keyof typeof BOXOVER_THEME\r\n\r\n /**\r\n * Tooltip header\r\n */\r\n header?: string\r\n\r\n /**\r\n * Tooltip body, can be any react node\r\n */\r\n body: React.ReactNode\r\n\r\n /**\r\n * Delay in ms to show the tooltip\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n offsetX?: number\r\n offsetY?: number\r\n}\r\n\r\n/**\r\n * This component composes boxover and forwards `data-boxover` prop to children\r\n */\r\nexport function Boxover({\r\n children,\r\n theme = 'default',\r\n header,\r\n body,\r\n delay = 300,\r\n offsetX = 100,\r\n offsetY = 100,\r\n}: BoxoverProps) {\r\n const boxover = React.useMemo(\r\n () =>\r\n [\r\n `cssbody=[${BOXOVER_THEME[theme].body}]`,\r\n `cssheader=[${BOXOVER_THEME[theme].header}]`,\r\n header && `header=[${header}]`,\r\n `body=[${React.isValidElement(body) ? ReactDOMServer.renderToString(body) : body}]`,\r\n `delay=[${delay}]`,\r\n `offsetx=[${offsetX}]`,\r\n `offsety=[${offsetY}]`,\r\n ]\r\n .filter(Boolean)\r\n .join(' '),\r\n [theme, header, body, delay, offsetX, offsetY]\r\n )\r\n\r\n return React.Children.map(children, (child) =>\r\n React.isValidElement(child)\r\n ? React.cloneElement(child as React.ReactElement<{ 'data-boxover': string }>, {\r\n 'data-boxover': boxover,\r\n })\r\n : child\r\n ) as unknown as JSX.Element\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { shortFormatNumber } from '../../../main/util'\r\nimport { Boxover } from './Boxover'\r\nimport { HoverChart } from './HoverChart'\r\n\r\nexport type ChartBoxoverEntry = {\r\n isDelisted?: boolean\r\n country: string\r\n company: string\r\n ticker: string\r\n industry: string\r\n marketCap?: number | null\r\n aum?: number | null\r\n}\r\n\r\ninterface Props {\r\n entry: ChartBoxoverEntry\r\n rowIndex?: number\r\n children: React.ReactElement\r\n offsetX?: number\r\n offsetY?: number\r\n}\r\n\r\nconst MOUSE_LEAVE_DEBOUNCE_MS = 250\r\n\r\n/**\r\n * Renders basic chart boxover for the stock ticker\r\n */\r\nexport function ChartBoxover({ entry, rowIndex = 0, children, offsetX, offsetY }: Props) {\r\n const [isMouseOver, setIsMouseOver] = React.useState(false)\r\n const mouseLeaveTimeoutRef = React.useRef(null)\r\n const clearMouseLeaveTimoutRef = React.useRef(() => {\r\n if (mouseLeaveTimeoutRef.current) {\r\n window.clearTimeout(mouseLeaveTimeoutRef.current)\r\n mouseLeaveTimeoutRef.current = null\r\n }\r\n })\r\n const mouseEventsRef = React.useRef({\r\n onMouseEnter: () => {\r\n clearMouseLeaveTimoutRef.current()\r\n setIsMouseOver(true)\r\n },\r\n onMouseLeave: () => {\r\n mouseLeaveTimeoutRef.current = window.setTimeout(() => {\r\n setIsMouseOver(false)\r\n }, MOUSE_LEAVE_DEBOUNCE_MS)\r\n },\r\n })\r\n\r\n const value = React.useMemo(() => {\r\n if (Number.isFinite(entry.aum)) {\r\n return 'AUM: ' + shortFormatNumber(entry.aum! * 1_000_000)\r\n }\r\n return shortFormatNumber(entry.marketCap ? entry.marketCap * 1_000_000 : null)\r\n }, [entry.marketCap, entry.aum])\r\n\r\n React.useEffect(\r\n () => () => {\r\n clearMouseLeaveTimoutRef.current()\r\n },\r\n []\r\n )\r\n\r\n const child = React.cloneElement(children, mouseEventsRef.current)\r\n\r\n if (!isMouseOver || entry.isDelisted) {\r\n return child\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n {entry.company}\r\n {entry.industry} {entry.country} {value}\r\n
\r\n \r\n }\r\n delay={0}\r\n offsetX={offsetX ?? 50}\r\n offsetY={offsetY ?? (rowIndex < 10 ? 0 : -260)}\r\n >\r\n {child}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport * as utils from '../hover-chart'\r\n\r\nexport interface ImageProps\r\n extends React.DetailedHTMLProps, HTMLImageElement> {\r\n ticker: string\r\n}\r\n\r\nexport function HoverChart({ ticker, ...props }: ImageProps) {\r\n const referrerPolicy = utils.getReferrerPolicy()\r\n const dimensions = utils.getHoverChartDimensions()\r\n const url = utils.getHoverChartUrl(ticker, true)\r\n const srcSet = utils.getSrcSet(url)\r\n\r\n return \r\n}\r\n","import { DefaultOptions, MutationCache, QueryCache, QueryClient, QueryClientProvider } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\n\r\nimport { DefaultErrorBoundary } from '../../../main/components/error-view'\r\n\r\ninterface QueryClientConfig {\r\n queryCache?: QueryCache\r\n mutationCache?: MutationCache\r\n defaultOptions?: DefaultOptions\r\n}\r\n\r\ninterface QueryContextProps {\r\n queryOptions?: QueryClientConfig\r\n}\r\n\r\nexport function getQueryClient(queryOptions?: QueryClientConfig) {\r\n return new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n useErrorBoundary: true,\r\n refetchOnWindowFocus: false,\r\n ...queryOptions?.defaultOptions?.queries,\r\n },\r\n ...queryOptions?.defaultOptions,\r\n },\r\n ...queryOptions,\r\n })\r\n}\r\n\r\nexport function QueryClientContext({ children, queryOptions }: React.PropsWithChildren) {\r\n const client = React.useRef(getQueryClient(queryOptions))\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport function withQueryClientContext(\r\n Component: React.ComponentType,\r\n config?: QueryClientConfig\r\n): React.ComponentType {\r\n const hocComponent = (props: Props) => (\r\n \r\n \r\n \r\n )\r\n\r\n hocComponent.displayName = `withQueryClientContext(${Component.displayName ?? 'Component'})`\r\n\r\n return hocComponent\r\n}\r\n","import { HTMLAttributeReferrerPolicy } from 'react'\r\n\r\nimport { encodeQueryString } from '../queryString'\r\n\r\nconst DEFAULT_OVERLAYS =\r\n '&o[0][ot]=sma&o[0][op]=50&o[0][oc]=FF8F33C6&o[1][ot]=sma&o[1][op]=200&o[1][oc]=DCB3326D&o[2][ot]=patterns&o[2][op]=&o[2][oc]=000'\r\n\r\nexport function getHoverChartUrl(\r\n ticker: string,\r\n escaped: boolean = false,\r\n timeframe = FinvizSettings.hoverCharts?.stock?.timeframe,\r\n dateRange = FinvizSettings.hoverCharts?.stock?.dateRange\r\n): string {\r\n const theme = FinvizSettings.hasDarkTheme ? 'd' : undefined\r\n const overlays = FinvizSettings.hasUserPremium && FinvizSettings.hoverCharts?.stock?.patterns ? DEFAULT_OVERLAYS : ''\r\n const query = encodeQueryString({\r\n cs: 'm',\r\n t: ticker,\r\n tf: timeframe ?? 'd',\r\n ct: 'candle_stick',\r\n r: dateRange,\r\n tm: theme,\r\n })\r\n\r\n let imgUrl = `${FinvizSettings.nodeChartsDomain}/chart.ashx?${query}${overlays}`\r\n\r\n if (escaped) {\r\n // \"Escaping\" [ and ] because of how boxover.js works\r\n imgUrl = imgUrl.replace(/\\[/g, '[[').replace(/]/g, ']]')\r\n }\r\n return imgUrl\r\n}\r\n\r\nexport function getHoverChartDimensions() {\r\n switch (FinvizSettings.hoverCharts?.stock?.timeframe) {\r\n case 'i3':\r\n case 'i15':\r\n return { width: 584, height: 180 }\r\n case 'i5':\r\n return { width: 376, height: 180 }\r\n case 'd':\r\n if (FinvizSettings.hoverCharts?.stock?.patterns) return { width: 464, height: 230 }\r\n return { width: 324, height: 180 }\r\n default:\r\n return { width: 324, height: 180 }\r\n }\r\n}\r\n\r\nexport function getReferrerPolicy(): HTMLAttributeReferrerPolicy {\r\n return 'no-referrer-when-downgrade'\r\n}\r\n\r\nexport function getHoverChartImg(\r\n ticker: string,\r\n escaped: boolean = false,\r\n timeframe = FinvizSettings.hoverCharts?.stock?.timeframe,\r\n dateRange?: string\r\n) {\r\n const chartSize = getHoverChartDimensions()\r\n const referrerPolicy = getReferrerPolicy()\r\n const url = getHoverChartUrl(ticker, escaped, timeframe, dateRange)\r\n const srcSet = getSrcSet(url)\r\n const srcsetString = srcSet?.length ? ` srcset='${srcSet}'` : ''\r\n\r\n return {\r\n img: ``,\r\n ...chartSize,\r\n }\r\n}\r\n\r\nexport function getSrcSet(url: string) {\r\n // You must keep a space after , for refresh to work\r\n return `${url} 1x, ${url}&sf=2 2x`\r\n}\r\n","import tailwindColors from '../../../../config/colors'\r\n\r\nexport const colors = [\r\n tailwindColors.violet[400],\r\n tailwindColors.emerald[300],\r\n tailwindColors.orange[300],\r\n tailwindColors.teal[300],\r\n tailwindColors.pink[400],\r\n tailwindColors.lime[300],\r\n tailwindColors.purple[400],\r\n tailwindColors.green[400],\r\n tailwindColors.yellow[200],\r\n tailwindColors.blue[300],\r\n tailwindColors.red[400],\r\n]\r\n\r\nexport const colors_old = [\r\n '#27399d',\r\n '#7f35d4',\r\n '#74b9ff',\r\n '#afaac2',\r\n '#ecc100',\r\n '#e999d8',\r\n '#e28e00',\r\n '#aa8240',\r\n '#61d8c3',\r\n]\r\n\r\nexport const colorsPerfChart = [tailwindColors.yellow[300], tailwindColors.teal[400], tailwindColors.purple[400]]\r\n","import { useQuery, useQueryClient } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\n\r\nimport { useMapContext } from '../../../../app/maps/components/Map'\r\nimport { FALLBACK_PERF_RESPONSE } from '../../../../app/maps/constants/constants'\r\nimport * as mapsApi from '../../../../app/maps/services/api'\r\nimport { MapSubtypeId, PerfData } from '../../../../app/maps/types'\r\nimport { ScreenerQuery } from '../../../../app/screener/utils'\r\nimport { PortfolioGroup } from '../types'\r\nimport { getPortfolioRefreshInterval } from '../utils'\r\n\r\nexport function useRefetchPerf({\r\n enabled,\r\n subtype,\r\n portfolioEntries,\r\n}: {\r\n enabled?: boolean\r\n subtype: MapSubtypeId\r\n portfolioEntries: PortfolioGroup[]\r\n}) {\r\n const { treemap } = useMapContext()\r\n const queryClient = useQueryClient()\r\n const dataVersion = React.useRef()\r\n const tickers = React.useMemo(\r\n () =>\r\n portfolioEntries\r\n .map((entry) => entry.ticker)\r\n .filter((ticker, index, arr) => arr.indexOf(ticker) === index)\r\n .join(','),\r\n [portfolioEntries]\r\n )\r\n const queryKey = ['mapPerf', subtype, tickers]\r\n\r\n const perfDataQuery = useQuery({\r\n queryKey,\r\n refetchInterval: getPortfolioRefreshInterval,\r\n staleTime: 1000,\r\n enabled: enabled ?? (!!treemap && !subtype.startsWith('portfolio')),\r\n keepPreviousData: true,\r\n queryFn: async () => {\r\n const data = await mapsApi.mapPerfScreener(\r\n `?${new URLSearchParams({\r\n [ScreenerQuery.MapSubtype]: subtype,\r\n [ScreenerQuery.Tickers]: tickers,\r\n v: '711',\r\n })}`\r\n )\r\n\r\n return (\r\n data ??\r\n queryClient.getQueryData(['mapPerf', subtype]) ?? {\r\n ...FALLBACK_PERF_RESPONSE,\r\n version: dataVersion.current,\r\n }\r\n )\r\n },\r\n onSuccess(data) {\r\n if (!dataVersion.current && data) {\r\n dataVersion.current = data.version\r\n }\r\n\r\n if (dataVersion.current !== data?.version) {\r\n window.location.reload()\r\n return\r\n }\r\n },\r\n })\r\n\r\n return perfDataQuery\r\n}\r\n","import { IconNameType } from '../../../components/icon'\r\n\r\ntype DeepRequired = {\r\n [K in keyof T]-?: T[K] extends object ? DeepRequired : T[K]\r\n}\r\n\r\nexport enum ETFHoldingsQuery {\r\n Breakdown = 'bd',\r\n TopTen = 'tt',\r\n}\r\n\r\nexport enum ETFHoldingsBreakdownType {\r\n PieChart = 'bd-piechart',\r\n Map = 'bd-map',\r\n}\r\n\r\nexport enum ETFHoldingsTopTenType {\r\n Table = 'tt-table',\r\n Map = 'tt-map',\r\n}\r\n\r\nexport enum ETFHoldingsDialogType {\r\n Table = 'table',\r\n Map = 'map',\r\n}\r\n\r\nexport type ETFHoldingsWidgetNavigation = {\r\n navType: ETFHoldingsQuery\r\n title: string\r\n viewTypes: ETFHoldingsWidgetViewType[]\r\n}\r\n\r\nexport type ETFHoldingsDialogNavigation = {\r\n navType: 'dialog'\r\n viewTypes: ETFHoldingsDialogViewType[]\r\n}\r\n\r\nexport type ETFHoldingsWidgetViewType = {\r\n icon: IconNameType\r\n chartType: ETFHoldingsBreakdownType | ETFHoldingsTopTenType\r\n}\r\n\r\nexport type ETFHoldingsDialogViewType = {\r\n icon: IconNameType\r\n chartType: ETFHoldingsDialogType\r\n}\r\n\r\nexport enum ETFHoldingDataType {\r\n Breakdown = 'breakdown',\r\n TopTen = 'topTen',\r\n Full = 'full',\r\n}\r\n\r\nexport type ETFHoldingsBreakdownApiResponse = {\r\n rowData: ETFHoldingsBreakdownApiRowData[]\r\n etfTotalWeight: number\r\n version?: number\r\n}\r\n\r\nexport type ETFHoldingsBreakdownApiRowData = {\r\n instrument: string\r\n data: Array<{\r\n sector?: string\r\n absoluteWeight: number\r\n }>\r\n instrumentSum: number\r\n}\r\n\r\nexport interface ETFHoldingsBreakdownRowData extends DeepRequired {\r\n itemsToDisplay: number\r\n}\r\n\r\nexport type ETFHoldingsBreakdownResponse = {\r\n rowData: ETFHoldingsBreakdownRowData[]\r\n etfTotalWeight: number\r\n}\r\n\r\nexport type ETFHoldingsStandardApiResponse = {\r\n rowData: ETFHoldingsStandardApiRowData[]\r\n etfHoldingsTotal: number\r\n etfTotalWeight: number\r\n version?: number\r\n}\r\n\r\nexport type ETFHoldingsStandardApiRowData = {\r\n ticker?: string\r\n name?: string\r\n instrument?: string\r\n sector?: string\r\n country?: string\r\n industry?: string\r\n weight?: number\r\n marketCap?: number\r\n}\r\n\r\nexport interface ETFHoldingsStandardRowData\r\n extends DeepRequired> {\r\n ticker: string | null\r\n marketCap?: number\r\n absoluteWeight: number\r\n}\r\n\r\nexport type ETFHoldingsStandardResponse = {\r\n rowData: ETFHoldingsStandardRowData[]\r\n etfHoldingsTotal: number\r\n etfTotalWeight: number\r\n}\r\n\r\nexport type GetETFHoldingsResponseDataType = T extends ETFHoldingDataType.Breakdown\r\n ? ETFHoldingsBreakdownApiResponse\r\n : ETFHoldingsStandardApiResponse\r\n","import { ETFHoldingsBreakdownApiResponse, ETFHoldingsStandardApiResponse } from './types'\r\n\r\nexport const EFT_HOLDINGS_QUERY_KEY = 'etfHoldings'\r\n\r\nexport enum ETFHoldingsPollingIntervalInMs {\r\n Free = 43_200_000, // 12h\r\n Elite = 3_600_000, // 1h\r\n EliteStocksReduced = 21_600_000, // 6h\r\n}\r\n\r\nexport const FALLBACK_BREAKDOWN_RESPONSE: ETFHoldingsBreakdownApiResponse = {\r\n rowData: [],\r\n etfTotalWeight: 0,\r\n}\r\n\r\nexport const FALLBACK_STANDARD_RESPONSE: ETFHoldingsStandardApiResponse = {\r\n rowData: [],\r\n etfHoldingsTotal: 0,\r\n etfTotalWeight: 0,\r\n}\r\n\r\nexport const NON_STOCK_INSTRUMENT_CATEGORIES = {\r\n // Bond: 'Fixed-Income Securities',\r\n Cash: 'Cash and Cash Equivalents',\r\n // Commodity: 'Alternative Investments',\r\n // CoveredWarrant: 'Derivatives',\r\n // DepositoryReceipt: 'Equities',\r\n // Derivative: 'Derivatives',\r\n // ExchangeTradedCommodity: 'Alternative Investments',\r\n // ExchangeTradedFund: 'Collective Investment Vehicles',\r\n // Fund: 'Collective Investment Vehicles',\r\n // Future: 'Derivatives',\r\n // Indices: 'Equities',\r\n MoneyMarket: 'Cash and Cash Equivalents',\r\n // Option: 'Derivatives',\r\n // PreferredShares: 'Equities',\r\n // StructuredProduct: 'Structured Products',\r\n // Swap: 'Derivatives',\r\n // Units: 'Collective Investment Vehicles',\r\n // Warrant: 'Derivatives',\r\n}\r\n\r\nexport const WIDGET_BOX_STYLES =\r\n 'relative ml-3 mt-3 flex max-h-85 min-h-85 min-w-152 max-w-175 shrink grow basis-0 flex-col overflow-hidden'\r\n","import { MapDataNode, MapDataRoot, PerfData } from '../../../../app/maps/types'\r\nimport { isStockFastRefreshAvailable } from '../../../../app/shared/isStockFastRefreshAvailable'\r\nimport { FORMAT_PERCENT, formatNumber } from '../../../util'\r\nimport { getIndustries, groupByKey } from '../../portfolio/utils'\r\nimport { ETFHoldingsPollingIntervalInMs, NON_STOCK_INSTRUMENT_CATEGORIES } from './constants'\r\nimport {\r\n ETFHoldingsBreakdownApiResponse,\r\n ETFHoldingsBreakdownResponse,\r\n ETFHoldingsBreakdownRowData,\r\n ETFHoldingsStandardApiResponse,\r\n ETFHoldingsStandardResponse,\r\n ETFHoldingsStandardRowData,\r\n} from './types'\r\n\r\nexport function getRounding() {\r\n return FinvizSettings.hasRedesignEnabled ? 'regular' : 'none'\r\n}\r\n\r\nexport function getKeyFromStrings(...args: string[]) {\r\n return args.join('-')\r\n}\r\n\r\nexport function splitStringByUpperCase(value: string) {\r\n return value.split(/(?=[A-Z])/).join(' ')\r\n}\r\n\r\nenum ETFHoldingsDataKey {\r\n Stocks = 'stocks',\r\n MoneyLike = 'moneyLike',\r\n Other = 'other',\r\n}\r\n\r\nconst ETFHoldingsGroupLabel = {\r\n [ETFHoldingsDataKey.Stocks]: 'Stocks',\r\n [ETFHoldingsDataKey.MoneyLike]: 'Bonds, Cash & Other',\r\n [ETFHoldingsDataKey.Other]: 'Other',\r\n}\r\n\r\nexport function getNormalizedStandardData(data?: ETFHoldingsStandardApiResponse) {\r\n if (!data?.rowData) return null\r\n\r\n const normalizedData: ETFHoldingsStandardRowData[] = data.rowData\r\n .map((holding) => ({\r\n ticker: holding.ticker ?? null,\r\n name: holding.name ?? 'Other',\r\n instrument: holding.instrument ?? 'Other',\r\n industry: splitStringByUpperCase(holding.industry ?? 'Other'),\r\n country: holding.country ?? 'Unknown',\r\n sector: splitStringByUpperCase(holding.sector ?? 'Other'),\r\n weight: holding.weight ?? 0,\r\n marketCap: holding.marketCap,\r\n absoluteWeight: Math.abs(holding.weight ?? 0),\r\n }))\r\n .sort((a, b) => b.absoluteWeight - a.absoluteWeight)\r\n\r\n return {\r\n rowData: normalizedData,\r\n etfHoldingsTotal: data.etfHoldingsTotal,\r\n etfTotalWeight: data.etfTotalWeight,\r\n }\r\n}\r\n\r\nexport function getNormalizedBreakdownData(data?: ETFHoldingsBreakdownApiResponse) {\r\n if (!data?.rowData) return null\r\n\r\n const normalizedData: ETFHoldingsBreakdownRowData[] = data.rowData.map((instrumentGroup) => ({\r\n instrument: instrumentGroup.instrument ?? 'Other',\r\n data: instrumentGroup.data.map((sector) => ({\r\n sector: splitStringByUpperCase(sector.sector ?? 'Other'),\r\n absoluteWeight: sector.absoluteWeight,\r\n })),\r\n itemsToDisplay: 0,\r\n instrumentSum: instrumentGroup.instrumentSum,\r\n }))\r\n\r\n return { rowData: normalizedData, etfTotalWeight: data.etfTotalWeight }\r\n}\r\n\r\ntype ETFHoldingsMapData = { [key in ETFHoldingsDataKey]: MapDataNode[] }\r\n\r\nfunction createGroup(key: ETFHoldingsDataKey, data: ETFHoldingsMapData) {\r\n const groupName = ETFHoldingsGroupLabel[key] ?? key\r\n\r\n const children = getIndustries(groupByKey(data[key], 'description'))\r\n return {\r\n name: groupName,\r\n children,\r\n }\r\n}\r\n\r\nfunction getPerf(rowItem: ETFHoldingsStandardRowData, perfData?: PerfData) {\r\n if (rowItem.ticker) {\r\n return !perfData?.nodes ? undefined : (perfData?.nodes as { [key: string]: number })[rowItem.ticker.toUpperCase()]\r\n }\r\n}\r\n\r\nexport function getStandardMapData({\r\n data,\r\n limitDataTo,\r\n perfData,\r\n}: {\r\n data?: ETFHoldingsStandardResponse\r\n limitDataTo?: number\r\n perfData?: PerfData\r\n}) {\r\n if (!data?.rowData) return { hasData: false }\r\n const dataToUse = limitDataTo ? data.rowData.slice(0, limitDataTo) : data.rowData\r\n\r\n const parsedData = dataToUse.reduce(\r\n (prev: ETFHoldingsMapData, current) => {\r\n const group = current.instrument === 'Stock' ? ETFHoldingsDataKey.Stocks : ETFHoldingsDataKey.MoneyLike\r\n const value = current.absoluteWeight\r\n\r\n const entry = {\r\n name: current.ticker ?? current.name?.slice(0, 10) ?? 'Unknown',\r\n value,\r\n perf: getPerf(current, perfData),\r\n description: getSector(current.instrument, current.sector),\r\n data: { group, nameOverride: !current.ticker ? current.name : undefined, ticker: current.ticker },\r\n } as MapDataNode\r\n\r\n if (value > 0) {\r\n return { ...prev, [group]: [...prev[group], entry] }\r\n }\r\n\r\n return prev\r\n },\r\n {\r\n [ETFHoldingsDataKey.Stocks]: [],\r\n [ETFHoldingsDataKey.MoneyLike]: [],\r\n [ETFHoldingsDataKey.Other]: [],\r\n }\r\n )\r\n\r\n if (limitDataTo !== undefined) {\r\n parsedData[ETFHoldingsDataKey.Other] = [\r\n {\r\n name: 'Other',\r\n value: data.etfTotalWeight - dataToUse.reduce((prev, curr) => prev + curr.absoluteWeight, 0),\r\n perf: undefined,\r\n description: 'Other',\r\n data: { group: 'Other', nameOverride: 'Other', ticker: 'Other' },\r\n } as MapDataNode,\r\n ]\r\n }\r\n\r\n return {\r\n hasData: Object.values(parsedData).some((arr) => arr.length > 0),\r\n data: {\r\n name: 'Root',\r\n children: Object.keys(parsedData)\r\n .map((key) => createGroup(key as ETFHoldingsDataKey, parsedData))\r\n .filter((category) => category.children.length),\r\n } as MapDataRoot,\r\n }\r\n}\r\n\r\nexport function getBreakdownMapData(data: ETFHoldingsBreakdownResponse) {\r\n if (!data) return { hasData: false }\r\n const dataToUse = data.rowData\r\n\r\n return {\r\n hasData: dataToUse.some((item) => item.data.length > 0),\r\n data: {\r\n name: 'Breakdown',\r\n children: dataToUse.map((instrumentGroup) => ({\r\n name: instrumentGroup.instrument,\r\n children: instrumentGroup.data.map((sector) => ({\r\n name: sector.sector,\r\n value: (sector.absoluteWeight / data.etfTotalWeight) * 100,\r\n additional: formatNumber((sector.absoluteWeight / data.etfTotalWeight) * 100, FORMAT_PERCENT),\r\n data: {\r\n group: instrumentGroup.instrument,\r\n },\r\n })),\r\n })),\r\n } as unknown as MapDataRoot,\r\n }\r\n}\r\n\r\nexport function getSector(instrument: string, sector: string) {\r\n if (instrument === 'Stock' || sector !== 'Other') return sector\r\n return NON_STOCK_INSTRUMENT_CATEGORIES[instrument as keyof typeof NON_STOCK_INSTRUMENT_CATEGORIES] ?? 'Other'\r\n}\r\n\r\nexport function getReducedBreakdownData(data: ETFHoldingsBreakdownRowData[]) {\r\n const breakdownDataFull = data\r\n\r\n const MAX_SECTOR_SPACES = 22\r\n const instrumentsSum = breakdownDataFull.reduce((prev, curr) => (prev += curr.instrumentSum), 0)\r\n let instrumentSumOrderedIndexArray = [0]\r\n if (breakdownDataFull.length > 1) {\r\n instrumentSumOrderedIndexArray =\r\n breakdownDataFull[0].instrumentSum > breakdownDataFull[1].instrumentSum ? [0, 1] : [1, 0]\r\n }\r\n let availableSectorsSpaces = MAX_SECTOR_SPACES\r\n\r\n instrumentSumOrderedIndexArray.forEach((itemIndex, index) => {\r\n const sectorsInInstrument = breakdownDataFull[itemIndex].data.length\r\n let itemsToDisplay = 0\r\n const sectorsToShowByInstrumentWeight = Math.round(\r\n (index === 0 ? Math.min : Math.max)(\r\n breakdownDataFull[itemIndex].instrumentSum / instrumentsSum,\r\n index === 0 ? 0.9 : 0.1\r\n ) * MAX_SECTOR_SPACES\r\n )\r\n\r\n if (index === 0) {\r\n itemsToDisplay = Math.min(sectorsToShowByInstrumentWeight, sectorsInInstrument, availableSectorsSpaces)\r\n } else {\r\n itemsToDisplay = Math.min(\r\n Math.max(sectorsToShowByInstrumentWeight, sectorsInInstrument),\r\n availableSectorsSpaces,\r\n sectorsInInstrument\r\n )\r\n }\r\n\r\n breakdownDataFull[itemIndex].itemsToDisplay = itemsToDisplay\r\n\r\n availableSectorsSpaces -= itemsToDisplay\r\n\r\n if (availableSectorsSpaces && index === 1) {\r\n const firstInstrument = breakdownDataFull[instrumentSumOrderedIndexArray[0]]\r\n const sectorsInFirstInstrument = firstInstrument.data.length\r\n firstInstrument.itemsToDisplay = Math.min(\r\n availableSectorsSpaces + firstInstrument.itemsToDisplay,\r\n sectorsInFirstInstrument\r\n )\r\n }\r\n })\r\n\r\n const breakdownDataReduced = breakdownDataFull.map((instrument) => {\r\n const MAX_ITEMS =\r\n instrument.itemsToDisplay === instrument.data.length\r\n ? instrument.itemsToDisplay\r\n : Math.min(instrument.itemsToDisplay, Math.max(instrument.itemsToDisplay - 1, 1))\r\n return {\r\n instrument: instrument.instrument,\r\n data: [...instrument.data]\r\n .sort((a, b) => b.absoluteWeight - a.absoluteWeight)\r\n .reduce(\r\n (prev, curr, index) => {\r\n if (index < MAX_ITEMS) {\r\n return [...prev, curr]\r\n } else {\r\n const otherSectorIndex = prev.findIndex(({ sector }) => sector === 'Other')\r\n const indexForRemainingSectors = otherSectorIndex !== -1 ? otherSectorIndex : MAX_ITEMS\r\n prev[indexForRemainingSectors] = {\r\n sector: 'Other',\r\n absoluteWeight: (prev[indexForRemainingSectors]?.absoluteWeight ?? 0) + curr.absoluteWeight,\r\n }\r\n return prev\r\n }\r\n },\r\n [] as Array<{ sector: string; absoluteWeight: number }>\r\n )\r\n .sort((a, b) => b.absoluteWeight - a.absoluteWeight),\r\n itemsToDisplay: instrument.itemsToDisplay,\r\n }\r\n })\r\n\r\n return breakdownDataReduced\r\n}\r\n\r\nexport function getETFHoldingsRefreshInterval() {\r\n const isPremium = FinvizSettings.hasUserPremium\r\n let customRefreshInterval = ETFHoldingsPollingIntervalInMs.Elite\r\n if (!isPremium) {\r\n customRefreshInterval = ETFHoldingsPollingIntervalInMs.Free\r\n } else if (!isStockFastRefreshAvailable()) {\r\n customRefreshInterval = ETFHoldingsPollingIntervalInMs.EliteStocksReduced\r\n }\r\n\r\n return customRefreshInterval\r\n}\r\n","import { useQuery, useQueryClient } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { QuoteContext } from '../QuoteContext'\r\nimport { getEtfHoldingsRequest } from './api'\r\nimport { EFT_HOLDINGS_QUERY_KEY, FALLBACK_BREAKDOWN_RESPONSE, FALLBACK_STANDARD_RESPONSE } from './constants'\r\nimport {\r\n ETFHoldingDataType,\r\n ETFHoldingsBreakdownType,\r\n ETFHoldingsQuery,\r\n ETFHoldingsTopTenType,\r\n GetETFHoldingsResponseDataType,\r\n} from './types'\r\nimport { getETFHoldingsRefreshInterval } from './utils'\r\n\r\nexport function useETFHoldingsQuery() {\r\n const quoteContext = React.useContext(QuoteContext)\r\n const [params] = useSearchParams()\r\n\r\n return React.useMemo(\r\n () => ({\r\n ticker: quoteContext.ticker,\r\n params: Object.fromEntries(params.entries()),\r\n [ETFHoldingsQuery.Breakdown]: (params.get(ETFHoldingsQuery.Breakdown) ??\r\n ETFHoldingsBreakdownType.PieChart) as ETFHoldingsBreakdownType,\r\n [ETFHoldingsQuery.TopTen]: (params.get(ETFHoldingsQuery.TopTen) ??\r\n ETFHoldingsTopTenType.Table) as ETFHoldingsTopTenType,\r\n }),\r\n [params, quoteContext.ticker]\r\n )\r\n}\r\n\r\nexport function useRefetchData(ticker: string, type: Type) {\r\n const queryClient = useQueryClient()\r\n const dataVersion = React.useRef()\r\n const queryKey = EFT_HOLDINGS_QUERY_KEY + type\r\n\r\n const etfHoldingsDataQuery = useQuery({\r\n queryKey: [queryKey],\r\n refetchInterval: getETFHoldingsRefreshInterval,\r\n staleTime: 1000,\r\n keepPreviousData: true,\r\n queryFn: async () => {\r\n const data = await getEtfHoldingsRequest(type, ticker)\r\n\r\n return (\r\n data ??\r\n queryClient.getQueryData>([queryKey]) ??\r\n ({\r\n ...(type === ETFHoldingDataType.Breakdown ? FALLBACK_BREAKDOWN_RESPONSE : FALLBACK_STANDARD_RESPONSE),\r\n version: dataVersion.current,\r\n } as GetETFHoldingsResponseDataType)\r\n )\r\n },\r\n onSuccess(data) {\r\n if (!dataVersion.current && data) {\r\n dataVersion.current = data.version\r\n }\r\n\r\n if (dataVersion.current !== data?.version) {\r\n window.location.reload()\r\n return\r\n }\r\n },\r\n })\r\n\r\n return etfHoldingsDataQuery\r\n}\r\n","import { apiRequest } from '../../../services/api'\r\nimport { ETFHoldingDataType, GetETFHoldingsResponseDataType } from './types'\r\n\r\nexport function getEtfHoldingsRequest(type: T, ticker: string) {\r\n const pathBase = `/api/etf_holdings/${ticker}`\r\n\r\n switch (type) {\r\n case ETFHoldingDataType.Breakdown:\r\n return apiRequest>(`${pathBase}/breakdown`)\r\n case ETFHoldingDataType.TopTen:\r\n return apiRequest>(`${pathBase}/top_ten`)\r\n case ETFHoldingDataType.Full:\r\n return apiRequest>(pathBase)\r\n default:\r\n throw new Error('Invalid ETFHoldings request type provided')\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { BoxRounding } from '../../../../components/box'\r\nimport { getRounding } from '../utils'\r\n\r\ninterface BoxProps extends React.HTMLProps {\r\n 'data-testid'?: string\r\n}\r\n\r\nexport function Box(props: BoxProps) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Map } from '../../../../../app/maps/components/Map'\r\nimport { MAP_SUBTYPE_DAY_PERF, MAP_TYPE_ETF_HOLDINGS_WIDGET } from '../../../../../app/maps/constants/constants'\r\nimport { SettingsScreener, SettingsScreenerDark } from '../../../../../app/maps/constants/settings'\r\nimport { onNodeClick } from '../../../../../app/maps/utils'\r\nimport { ETFHoldingsBreakdownResponse } from '../types'\r\nimport { getBreakdownMapData } from '../utils'\r\n\r\ninterface IBreakdownProps {\r\n type: string\r\n data: ETFHoldingsBreakdownResponse\r\n dataTimestamp: number\r\n}\r\n\r\nexport function BreakdownMap({ type, data, dataTimestamp }: IBreakdownProps) {\r\n const mapData = React.useMemo(() => getBreakdownMapData(data), [data])\r\n\r\n return (\r\n
\r\n {\r\n if (!nodeProps.node?.data?.data?.ticker) return\r\n onNodeClick(nodeProps)\r\n }}\r\n legend={false}\r\n zoom={false}\r\n truncateNodeName\r\n />\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { Link } from 'react-router-dom'\r\n\r\nimport { Button, ButtonComponentProps } from '../../../../components/button'\r\nimport { IconNameType } from '../../../../components/icon'\r\nimport { useETFHoldingsQuery } from '../hooks'\r\nimport { ETFHoldingsDialogType, ETFHoldingsDialogViewType, ETFHoldingsQuery, ETFHoldingsWidgetViewType } from '../types'\r\nimport { getRounding } from '../utils'\r\n\r\nexport function NavButton({ to, ...props }: ButtonComponentProps<'a'> & { to: Record }) {\r\n return \r\n ) : (\r\n
\r\n )}\r\n {treemap && }\r\n
\r\n \r\n )\r\n}\r\n","import { ChartBoxover } from '../../../../../app/shared/components/ChartBoxover'\r\nimport { ETFHoldingsStandardRowData } from '../types'\r\n\r\ninterface PortfolioTableColumnProps {\r\n rowData: ETFHoldingsStandardRowData\r\n}\r\n\r\nexport function TableNameColumn(props: React.PropsWithChildren) {\r\n const { ticker, name } = props.rowData\r\n return (\r\n \r\n {ticker ? (\r\n \r\n \r\n {name}\r\n \r\n \r\n ) : (\r\n name\r\n )}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { formatNumber } from '../../../../util'\r\nimport { ETFHoldingsStandardResponse, ETFHoldingsStandardRowData } from '../types'\r\nimport { getSector } from '../utils'\r\nimport { TableNameColumn } from './TableNameColumn'\r\n\r\ninterface TableRowProps {\r\n rowData: ETFHoldingsStandardRowData\r\n isLimitedView: boolean\r\n}\r\n\r\nexport function TableRow({ rowData, isLimitedView }: TableRowProps) {\r\n const sector = getSector(rowData.instrument, rowData.sector)\r\n return (\r\n \r\n \r\n {formatNumber(rowData.weight * 100, { suffix: ' %' })}\r\n \r\n {sector}\r\n \r\n {!isLimitedView && (\r\n \r\n {rowData.industry}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\ninterface TableProps {\r\n data: ETFHoldingsStandardResponse\r\n limitDataTo?: number\r\n type: string\r\n}\r\n\r\nexport function TableChart({ data, limitDataTo, type }: TableProps) {\r\n const dataToUse = limitDataTo ? data.rowData.slice(0, limitDataTo) : data.rowData\r\n const isLimitedView = limitDataTo !== undefined\r\n\r\n const dataTotal = dataToUse.reduce((prev, curr) => prev + curr.weight, 0) * 100\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n Name\r\n \r\n \r\n \r\n {!isLimitedView && }\r\n \r\n \r\n \r\n {dataToUse.map((item, index) => (\r\n \r\n ))}\r\n {isLimitedView && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
% HoldingsSectorIndustry
Percent of Portfolio in Top {limitDataTo} Holdings{formatNumber(dataTotal, { suffix: ' %' })}
\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Dialog, DialogBody, DialogHeader, DialogStateReturn } from '../../../../components/dialog'\r\nimport { Heading } from '../../../../components/typography'\r\nimport { useRefetchData } from '../hooks'\r\nimport { ETFHoldingDataType, ETFHoldingsDialogNavigation, ETFHoldingsDialogType } from '../types'\r\nimport { getNormalizedStandardData } from '../utils'\r\nimport { Navigation } from './Navigation'\r\nimport { StandardMap } from './StandardMap'\r\nimport { TableChart } from './Table'\r\n\r\ninterface IEtfHoldingsDialog {\r\n etfTicker: string\r\n type: ETFHoldingsDialogType\r\n dialogState: DialogStateReturn\r\n handleDialogToggle: (value?: ETFHoldingsDialogType) => void\r\n}\r\n\r\nconst VIEW_SETTINGS: ETFHoldingsDialogNavigation = {\r\n navType: 'dialog',\r\n viewTypes: [\r\n { icon: 'chartTable', chartType: ETFHoldingsDialogType.Table },\r\n { icon: 'chartTreemap', chartType: ETFHoldingsDialogType.Map },\r\n ],\r\n}\r\n\r\nexport function ETFHoldingsDialog({ type, etfTicker, dialogState, handleDialogToggle }: IEtfHoldingsDialog) {\r\n const isMounted = dialogState.useState('mounted')\r\n const fetchedData = useRefetchData(etfTicker, ETFHoldingDataType.Full)\r\n const data = React.useMemo(() => getNormalizedStandardData(fetchedData.data), [fetchedData.data])\r\n if (!data || !isMounted) return null\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n {`${etfTicker.toUpperCase()}: ${data.rowData.length} Holdings`}\r\n \r\n handleDialogToggle(value)}\r\n active={type}\r\n />\r\n
\r\n
\r\n \r\n {type === ETFHoldingsDialogType.Table ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { encodeQueryString } from '../../../../../app/queryString'\r\nimport { Button } from '../../../../components/button'\r\nimport { Icon } from '../../../../components/icon'\r\nimport { Heading } from '../../../../components/typography'\r\n\r\nexport function EliteAdOverlay({ onOverlayClick }: { onOverlayClick: () => void }) {\r\n return (\r\n \r\n
\r\n
\r\n \r\n \r\n Subscribe to FINVIZ*Elite to unlock data\r\n \r\n
\r\n
\r\n Beat the market and make more informed decisions with our premium features. Real-time quotes, intraday charts,\r\n indicators, alerts, historical statements, and much more.\r\n
\r\n
\r\n \r\n Unlock All Holdings Data\r\n \r\n
\r\n
\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button } from '../../../../components/button'\r\nimport { ETFHoldingsDialogType, ETFHoldingsStandardResponse } from '../types'\r\n\r\ninterface ITableFooter {\r\n ticker: string\r\n data: ETFHoldingsStandardResponse\r\n handleDialogToggle: (value?: ETFHoldingsDialogType) => void\r\n type: string\r\n}\r\n\r\nexport function TableFooter({ ticker, data, handleDialogToggle, type }: ITableFooter) {\r\n const isPremium = FinvizSettings.hasUserPremium\r\n\r\n return (\r\n
\r\n
{`${data.etfHoldingsTotal} Holding${\r\n data.etfHoldingsTotal > 1 ? 's' : ''\r\n } Total`}
\r\n {data.etfHoldingsTotal > 10 && (\r\n <>\r\n
\r\n handleDialogToggle(ETFHoldingsDialogType.Table)}\r\n className=\"tab-link flex cursor-pointer items-center text-link hover:underline\"\r\n leftContent={!isPremium ? 'lock' : undefined}\r\n data-testid={`etf-holdings-${type}-btn-show-all`}\r\n >\r\n Show All\r\n \r\n \r\n )}\r\n
\r\n handleDialogToggle(ETFHoldingsDialogType.Table)}\r\n className=\"tab-link flex cursor-pointer items-center text-link hover:underline\"\r\n leftContent={!isPremium ? 'lock' : undefined}\r\n data-testid={`etf-holdings-${type}-btn-open-in-screener`}\r\n >\r\n Open in Screener\r\n \r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Delayed } from '../../../../components/delayed'\r\nimport { useDialogState } from '../../../../components/dialog'\r\nimport { Spinner } from '../../../../components/spinner'\r\nimport { WIDGET_BOX_STYLES } from '../constants'\r\nimport { useETFHoldingsQuery, useRefetchData } from '../hooks'\r\nimport {\r\n ETFHoldingDataType,\r\n ETFHoldingsDialogType,\r\n ETFHoldingsQuery,\r\n ETFHoldingsStandardResponse,\r\n ETFHoldingsTopTenType,\r\n ETFHoldingsWidgetNavigation,\r\n} from '../types'\r\nimport { getNormalizedStandardData } from '../utils'\r\nimport { Box } from './Box'\r\nimport { ETFHoldingsDialog } from './ETFHoldingsDialog'\r\nimport { EliteAdOverlay } from './EliteAdOverlay'\r\nimport { Header } from './Header'\r\nimport { StandardMap } from './StandardMap'\r\nimport { TableChart } from './Table'\r\nimport { TableFooter } from './TableFooter'\r\n\r\ntype TopTenViewProps = {\r\n query: ReturnType\r\n}\r\n\r\nconst VIEW_SETTINGS: ETFHoldingsWidgetNavigation = {\r\n navType: ETFHoldingsQuery.TopTen,\r\n title: 'Top 10 Holdings',\r\n viewTypes: [\r\n { icon: 'chartTable', chartType: ETFHoldingsTopTenType.Table },\r\n { icon: 'chartTreemap', chartType: ETFHoldingsTopTenType.Map },\r\n ],\r\n}\r\n\r\nfunction getChartComponent({\r\n ticker,\r\n type,\r\n data,\r\n handleDialogToggle,\r\n}: {\r\n ticker: string\r\n type: ETFHoldingsTopTenType\r\n data: ETFHoldingsStandardResponse | null\r\n handleDialogToggle: (value?: ETFHoldingsDialogType) => void\r\n}) {\r\n if (!data || data.rowData.length === 0)\r\n return (\r\n }>\r\n
\r\n \r\n
\r\n
\r\n )\r\n\r\n return type === ETFHoldingsTopTenType.Table ? (\r\n <>\r\n \r\n \r\n \r\n ) : (\r\n \r\n )\r\n}\r\n\r\nexport function TopTenView({ query }: TopTenViewProps) {\r\n const isPremium = FinvizSettings.hasUserPremium\r\n const fetchedData = useRefetchData(query.ticker, ETFHoldingDataType.TopTen)\r\n const data = React.useMemo(() => getNormalizedStandardData(fetchedData.data), [fetchedData.data])\r\n const dialogState = useDialogState()\r\n const [isEliteOverlayVisible, setIsEliteOverlayVisible] = React.useState(false)\r\n const [dialogViewType, setDialogViewType] = React.useState()\r\n\r\n const handleDialogToggle = (value?: ETFHoldingsDialogType) => {\r\n if (isPremium) {\r\n if (value) {\r\n setDialogViewType(value)\r\n dialogState.show()\r\n } else {\r\n dialogState.hide()\r\n }\r\n } else {\r\n setIsEliteOverlayVisible(true)\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n {getChartComponent({ ticker: query.ticker, type: query.tt, data, handleDialogToggle })}\r\n
\r\n {VIEW_SETTINGS.navType === ETFHoldingsQuery.TopTen && isEliteOverlayVisible && (\r\n setIsEliteOverlayVisible(false)} />\r\n )}\r\n {isPremium && dialogViewType && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { withQueryClientContext } from '../../../../../app/shared/components/QueryClientContext'\r\nimport { useETFHoldingsQuery } from '../hooks'\r\nimport { BreakdownView } from './BreakdownView'\r\nimport { TopTenView } from './TopTenView'\r\n\r\nexport const ETFHoldings = withQueryClientContext(() => {\r\n const query = useETFHoldingsQuery()\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n )\r\n})\r\n"],"names":["mapPerf","type","subtype","apiRequest","query","t","st","mapPerfScreener","arguments","length","undefined","window","location","search","uploadMap","_ref","data","method","headers","ContentType","FormUrlEncoded","body","URLSearchParams","file","replace","BOXOVER_THEME","default","header","chart","Boxover","children","theme","delay","offsetX","offsetY","boxover","React","ReactDOMServer","filter","Boolean","join","map","child","MOUSE_LEAVE_DEBOUNCE_MS","ChartBoxover","entry","rowIndex","isMouseOver","setIsMouseOver","mouseLeaveTimeoutRef","clearMouseLeaveTimoutRef","current","clearTimeout","mouseEventsRef","onMouseEnter","onMouseLeave","setTimeout","value","Number","isFinite","aum","shortFormatNumber","marketCap","isDelisted","_jsx","_jsxs","_Fragment","HoverChart","ticker","company","industry","country","props","referrerPolicy","utils","dimensions","url","srcSet","src","getQueryClient","queryOptions","_queryOptions$default","QueryClient","defaultOptions","queries","useErrorBoundary","refetchOnWindowFocus","QueryClientContext","client","QueryClientProvider","ErrorBoundary","FallbackComponent","DefaultErrorBoundary","withQueryClientContext","Component","config","_Component$displayNam","hocComponent","displayName","DEFAULT_OVERLAYS","getHoverChartUrl","_FinvizSettings$hover","_FinvizSettings$hover2","_FinvizSettings$hover3","escaped","timeframe","FinvizSettings","hoverCharts","stock","dateRange","hasDarkTheme","overlays","hasUserPremium","patterns","encodeQueryString","cs","tf","ct","r","tm","imgUrl","nodeChartsDomain","getHoverChartDimensions","_FinvizSettings$hover4","_FinvizSettings$hover5","width","height","getReferrerPolicy","getHoverChartImg","_FinvizSettings$hover6","chartSize","getSrcSet","img","colors","tailwindColors","colors_old","colorsPerfChart","useRefetchPerf","enabled","portfolioEntries","treemap","useMapContext","queryClient","useQueryClient","dataVersion","tickers","index","arr","indexOf","queryKey","useQuery","refetchInterval","getPortfolioRefreshInterval","staleTime","startsWith","keepPreviousData","queryFn","async","_ref2","mapsApi","ScreenerQuery","MapSubtype","Tickers","v","getQueryData","FALLBACK_PERF_RESPONSE","version","onSuccess","reload","ETFHoldingsQuery","ETFHoldingsBreakdownType","ETFHoldingsTopTenType","ETFHoldingsDialogType","ETFHoldingDataType","EFT_HOLDINGS_QUERY_KEY","ETFHoldingsPollingIntervalInMs","FALLBACK_BREAKDOWN_RESPONSE","rowData","etfTotalWeight","FALLBACK_STANDARD_RESPONSE","etfHoldingsTotal","NON_STOCK_INSTRUMENT_CATEGORIES","Cash","MoneyMarket","WIDGET_BOX_STYLES","getRounding","hasRedesignEnabled","getKeyFromStrings","_len","args","Array","_key","splitStringByUpperCase","split","ETFHoldingsDataKey","ETFHoldingsGroupLabel","Stocks","MoneyLike","Other","getNormalizedStandardData","holding","_holding$ticker","_holding$name","_holding$instrument","_holding$industry","_holding$country","_holding$sector","_holding$weight","_holding$weight2","name","instrument","sector","weight","absoluteWeight","Math","abs","sort","a","b","getPerf","rowItem","perfData","nodes","toUpperCase","getStandardMapData","limitDataTo","hasData","dataToUse","slice","parsedData","reduce","prev","_current$ticker","_current$name","group","perf","description","getSector","nameOverride","curr","Object","values","some","keys","key","_ETFHoldingsGroupLabe","getIndustries","groupByKey","createGroup","category","_NON_STOCK_INSTRUMENT","getETFHoldingsRefreshInterval","isPremium","customRefreshInterval","Elite","isStockFastRefreshAvailable","EliteStocksReduced","Free","useRefetchData","etfHoldingsDataQuery","pathBase","Breakdown","TopTen","Full","Error","getEtfHoldingsRequest","Box","className","classnames","BoxRounding","BreakdownMap","dataTimestamp","mapData","item","instrumentGroup","additional","formatNumber","FORMAT_PERCENT","getBreakdownMapData","Map","isFetchingPerf","isLoadingData","dataHash","toString","MAP_TYPE_ETF_HOLDINGS_WIDGET","MAP_SUBTYPE_DAY_PERF","settings","SettingsScreenerDark","SettingsScreener","onNodeClick","nodeProps","_nodeProps$node","node","legend","zoom","truncateNodeName","NavButton","to","Button","as","Link","preventScrollReset","Navigation","viewTypes","navType","buttonProps","rounding","appearance","leftContent","icon","chartType","size","_createElement","params","active","onClick","onNavigationChange","Header","widgetType","title","PieChart","hovered","setHovered","reducedBreakdownData","breakdownDataFull","instrumentsSum","instrumentSum","instrumentSumOrderedIndexArray","availableSectorsSpaces","forEach","itemIndex","sectorsInInstrument","itemsToDisplay","sectorsToShowByInstrumentWeight","round","min","max","firstInstrument","sectorsInFirstInstrument","MAX_ITEMS","_prev$indexForRemaini","_prev$indexForRemaini2","otherSectorIndex","findIndex","_ref3","indexForRemainingSectors","getReducedBreakdownData","radius","pieData","flatMap","dataItem","label","color","d3","range","arc","outerRadius","innerRadius","pie","d","totalSize","p","c","isSomethingHovered","transform","i","style","fill","gridTemplateRows","ceil","backgroundColor","VIEW_SETTINGS","getChartComponent","Delayed","delayComponent","Spinner","BreakdownView","bd","fetchedData","_instrumentGroup$inst","_sector$sector","getNormalizedBreakdownData","dataUpdatedAt","StandardMap","MapContextProvider","StandardMapContent","_perfQuery$data","handleDialogToggle","perfQuery","MapSubtypeId","DayPerf","hash","Legend","TableNameColumn","href","target","TableRow","isLimitedView","suffix","TableChart","dataTotal","Table","ETFHoldingsDialog","etfTicker","dialogState","isMounted","useState","Dialog","state","DialogHeader","asHeading","Heading","level","DialogBody","EliteAdOverlay","onOverlayClick","Icon","utm_source","utm_medium","utm_campaign","TableFooter","TopTenView","useDialogState","isEliteOverlayVisible","setIsEliteOverlayVisible","dialogViewType","setDialogViewType","show","hide","tt","ETFHoldings","quoteContext","QuoteContext","useSearchParams","_params$get","_params$get2","fromEntries","entries","get","useETFHoldingsQuery"],"sourceRoot":""}