{"version":3,"file":"quote-portal-components.3c775000.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/backtest/utils.tsx","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/components/Ads.tsx","webpack://@finviz/website/./js/app/shared/getInitChartConfig.ts","webpack://@finviz/website/./js/main/components/Portal.tsx","webpack://@finviz/website/./js/main/hooks/useToggleStaticElement.ts","webpack://@finviz/website/./js/main/components/chart/CartesianGrid.tsx","webpack://@finviz/website/./js/main/components/chart/Label.tsx","webpack://@finviz/website/./js/main/components/chart/XAxis.tsx","webpack://@finviz/website/./js/main/hooks/use-check-non-idea-chart-missing-config.ts","webpack://@finviz/website/./js/main/modules/charts/util.ts","webpack://@finviz/website/./js/main/modules/earnings-common/TempRenameSettingsProperties.tsx","webpack://@finviz/website/./js/main/modules/earnings-common/WidgetSettingsSection.tsx","webpack://@finviz/website/./js/main/modules/earnings-common/constants.ts","webpack://@finviz/website/./js/main/modules/earnings-common/types.ts","webpack://@finviz/website/./js/main/modules/quote/QuoteContext.tsx","webpack://@finviz/website/./js/main/modules/quote/components/QuoteChart.tsx","webpack://@finviz/website/./js/main/modules/quote/components/Navigation/QuoteLinksWrapper.tsx","webpack://@finviz/website/./js/main/modules/quote/hooks/use-chart-timeframe-path-watch.ts","webpack://@finviz/website/./js/main/modules/quote/components/Navigation/QuoteLinkComponent.tsx","webpack://@finviz/website/./js/main/modules/quote/components/Navigation/CreateAlertLink.tsx","webpack://@finviz/website/./js/main/modules/quote/components/Navigation/SaveToPortfolioLink.tsx","webpack://@finviz/website/./js/main/modules/quote/Navigation.tsx","webpack://@finviz/website/./js/main/modules/quote/components/ComparePerformance.tsx","webpack://@finviz/website/./js/main/components/chart/ChartBox.tsx","webpack://@finviz/website/./js/main/modules/quote/components/FundFlowsChart.tsx","webpack://@finviz/website/./js/main/components/chart/utils.ts","webpack://@finviz/website/./js/main/modules/quote/components/InsiderTradingChart/constants.ts","webpack://@finviz/website/./js/main/modules/quote/components/InsiderTradingChart/InsiderVolumeBar.tsx","webpack://@finviz/website/./js/main/modules/quote/components/InsiderTradingChart/utils.tsx","webpack://@finviz/website/./js/main/modules/quote/components/InsiderTradingChart/InsiderTradingVolumeChart.tsx","webpack://@finviz/website/./js/main/modules/quote/components/InstitutionalOwnership.tsx","webpack://@finviz/website/./js/main/modules/quote/components/Portal.tsx","webpack://@finviz/website/./js/main/modules/quote/components/QuotePrice.tsx","webpack://@finviz/website/./js/main/modules/quote/components/Price/hooks.ts","webpack://@finviz/website/./js/main/modules/quote/components/Price/QuoteHeader.tsx","webpack://@finviz/website/./js/main/modules/quote/components/barChart.tsx","webpack://@finviz/website/./js/main/modules/quote/components/Statements/constants.ts","webpack://@finviz/website/./js/main/modules/quote/components/Statements/statements.tsx","webpack://@finviz/website/./js/main/modules/quote/components/StaticChartHeader.tsx","webpack://@finviz/website/./js/main/modules/quote/components/fundamentalCharts.tsx","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/async-modules.ts","webpack://@finviz/website/./js/main/modules/quote/etf-holdings/index.tsx","webpack://@finviz/website/./js/main/modules/quote/PortalComponents.tsx","webpack://@finviz/website/./js/main/modules/quote/hooks/use-stock-detail-updater.tsx","webpack://@finviz/website/./js/main/modules/quote/components/QuoteSharedWrapper.tsx","webpack://@finviz/website/./js/main/modules/quote/hooks/useToggleRatings.ts"],"sourcesContent":["export function round(n: number, places: number = 2) {\r\n return (+(Math.round(Number(n + 'e+' + places)) + 'e-' + places)).toFixed(places)\r\n}\r\n\r\nexport const format = {\r\n totalReturn: (totalReturn: number | string) => round(Number(totalReturn) * 100) + '%',\r\n maxDrawdown: (maxDrawdown: number | string) => round(Number(maxDrawdown) * 100) + '%',\r\n sharpeRatio: (sharpeRatio: number) => round(sharpeRatio),\r\n calmarRatio: (calmarRatio: number) => round(calmarRatio),\r\n CAGR: (CAGR: number) => round(CAGR * 100) + '%',\r\n cagr: (CAGR: number) => round(CAGR * 100) + '%',\r\n volatility: (volatility: number) => round(volatility * 100) + '%',\r\n numberOfTrades: (numberOfTrades: any) => numberOfTrades,\r\n positiveDays: (positiveDays: any) => positiveDays,\r\n negativeDays: (negativeDays: any) => negativeDays,\r\n bestMonth: (bestMonth: number) => round(bestMonth * 100) + '%',\r\n worstMonth: (worstMonth: number) => round(worstMonth * 100) + '%',\r\n}\r\n\r\nexport const figureSpace = ' '\r\n\r\nexport const BACKTEST_MIN_MAX_DATES = Object.freeze({\r\n min: new Date(1996, 5, 3),\r\n max: new Date(2023, 0, 31),\r\n})\r\n","import { SpecificChartFunctionality } from '../../main/constants/common'\r\nimport { ChartConfigChartPaneElement, Instrument, LayoutType, ScaleType, TIMEFRAME, Theme } from '../charts-lib'\r\nimport { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps extends ChartConfigChartPaneElement {\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n width?: number\r\n height?: number\r\n ticker: string\r\n timeframe: TIMEFRAME\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n theme?: Theme\r\n colors?: ReturnType\r\n refreshData?: boolean\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n width = 800,\r\n height = 400,\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n theme,\r\n colors = getCustomColorsFromCookies(),\r\n refreshData = false,\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: LayoutType['1h1v'],\r\n width,\r\n height,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n theme,\r\n colors,\r\n charts: [\r\n {\r\n width: 0,\r\n premarket: false,\r\n aftermarket: false,\r\n dateRange: null,\r\n height,\r\n timeframe,\r\n scale: ScaleType.Linear,\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: Instrument.Stock,\r\n refreshData,\r\n stretch: true,\r\n panes: [\r\n {\r\n height,\r\n elements: paneElements,\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nexport function getCustomColorsFromCookies() {\r\n try {\r\n return JSON.parse(getParsedCookies('customColors') as string)\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport * as tracking from '../tracking'\r\n\r\nexport const IC_PUBLISHER_ID = 'df0d0d52-cc7f-11e8-82a5-0abbb61c4a6a'\r\n\r\nenum AdTagName {\r\n IC_TickerInContent = 'IC_D_3x3',\r\n IC_MapsLeftRail = 'IC_D_125x125',\r\n IC_Statements = 'IC_D_300x60',\r\n IC_Groups = 'IC_D_300x250',\r\n}\r\n\r\nconst tagDefinition = {\r\n [AdTagName.IC_TickerInContent]: { placements: 3, style: { width: 970, minHeight: 250 } },\r\n [AdTagName.IC_MapsLeftRail]: { placements: 2, style: { width: 125, minHeight: 125 } },\r\n [AdTagName.IC_Statements]: { placements: 1, style: { width: 300, minHeight: 60 } },\r\n [AdTagName.IC_Groups]: { placements: 1, style: { width: 336, minHeight: 280 } },\r\n}\r\n\r\nconst hasInvestingChannelAds = tracking.getAdsProvider() === tracking.AdsProvider.InvestingChannel\r\n\r\n/**\r\n * Get create/destroy methods to control ads insertion\r\n */\r\nexport function getInvestingChannelPage() {\r\n var page: ICPageReturn\r\n\r\n function create() {\r\n try {\r\n if (hasInvestingChannelAds) {\r\n window.InvestingChannelQueue?.push(() => {\r\n let config = window['FINVIZ_IC_UAT_CONFIG'] ?? {}\r\n page = window.InvestingChannel?.UAT.Run(IC_PUBLISHER_ID, config)\r\n })\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n }\r\n\r\n function destroy() {\r\n try {\r\n if (hasInvestingChannelAds) {\r\n window.InvestingChannelQueue?.push(() => {\r\n page?.destroy()\r\n })\r\n }\r\n } catch (e) {\r\n console.error(e)\r\n }\r\n }\r\n\r\n return { create, destroy }\r\n}\r\n\r\n/**\r\n * Hook which recreates ads on deps change (SPA navigation,…)\r\n */\r\nexport function useInvestingChannelAds(deps: unknown[] = []) {\r\n React.useLayoutEffect(() => {\r\n const page = getInvestingChannelPage()\r\n\r\n page.create()\r\n\r\n return () => page.destroy()\r\n // eslint cannot statically check the dependencies and complains about it\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, deps)\r\n\r\n return hasInvestingChannelAds\r\n}\r\n\r\ninterface AdTagProps extends Omit, 'name'> {\r\n /**\r\n * Name of the ad tag\r\n */\r\n name: keyof typeof AdTagName\r\n\r\n /**\r\n * Manually set the placement position for this tag\r\n *\r\n * @default 1\r\n */\r\n position?: number\r\n\r\n /**\r\n * Additional class names for the wrapper div\r\n */\r\n className?: string\r\n}\r\n\r\nexport function AdTag({ name, position = 1, ...props }: AdTagProps) {\r\n const tagName = AdTagName[name]\r\n const tagProps = tagDefinition[tagName]\r\n const placementName = `${tagName}_${Math.min(Math.max(position, 1), tagProps.placements)}`\r\n\r\n if (!hasInvestingChannelAds) return null\r\n\r\n return
\r\n}\r\n","import { type RootChartConfigObject, Utils, convertTa } from '../charts-lib'\r\n\r\nexport function getInitChartConfig(initialConfig: RootChartConfigObject, initialTA = FinvizSettings.TA) {\r\n const config: RootChartConfigObject = JSON.parse(JSON.stringify(initialConfig))\r\n\r\n config.scrollable = config.editable || !Utils.isMobile()\r\n\r\n if (initialTA) {\r\n const COTs = FinvizSettings.COTs\r\n convertTa.mergeChartAndTAConfig(config, initialTA, COTs ? { COTs } : undefined)\r\n }\r\n\r\n return config\r\n}\r\n","import * as React from 'react'\r\nimport * as ReactDOM from 'react-dom'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\n\r\nimport { useToggleStaticElements } from '../hooks/useToggleStaticElement'\r\n\r\ntype AnyElement = Element | Element[] | NodeListOf\r\n\r\ninterface PortalContextProps {\r\n /**\r\n * The root element this component will get rendered into\r\n */\r\n rootElement?: HTMLElement\r\n\r\n /**\r\n * Static (server rendered) element associated with this component.\r\n * Hide this element when the component gets rendered\r\n */\r\n staticElement?: HTMLElement\r\n\r\n toggleStaticElement: (isEnabled?: boolean) => void\r\n}\r\n\r\nexport const PortalContext = React.createContext({\r\n rootElement: undefined,\r\n staticElement: undefined,\r\n toggleStaticElement: () => {},\r\n})\r\n\r\n/**\r\n * Portal component props\r\n */\r\nexport interface PortalProps {\r\n /**\r\n * Override the ticker index from context if you need to skip the first ticker\r\n */\r\n index?: number\r\n\r\n /**\r\n * Server rendered elements to replace with react components\r\n */\r\n staticElements?: AnyElement | null\r\n\r\n /**\r\n * Immediately replace the static element with react children.\r\n * Turn this off if the child component is suspended\r\n *\r\n * @default true (if root exists)\r\n */\r\n toggleStaticElement?: boolean\r\n\r\n /**\r\n * Elements to render the react components into\r\n */\r\n roots: AnyElement | null\r\n\r\n /**\r\n * Intentionally restricted to JSX element so that we don’t have to check children is valid react element\r\n */\r\n children: JSX.Element\r\n}\r\n\r\nexport function Portal({ index = 0, toggleStaticElement, staticElements, roots, children }: PortalProps) {\r\n // Get the root and associated static html element, get them by index if array\r\n const staticElement =\r\n staticElements instanceof NodeList || Array.isArray(staticElements) ? staticElements[index] : staticElements\r\n const rootElement = roots instanceof NodeList || Array.isArray(roots) ? roots[index] : roots\r\n\r\n /**\r\n * Set up element switching. We might want to hold off if we’re passing a suspendable component.\r\n * We can’t catch the promise here, it might have already been caught down the tree\r\n * and we want to avoid hiding the server-rendered element before the react content is ready\r\n */\r\n const [isEnabled, setIsEnabled] = React.useState(toggleStaticElement ?? (!!staticElement && !!rootElement))\r\n useToggleStaticElements(staticElement, rootElement, isEnabled)\r\n\r\n const portalContextValue = React.useMemo(\r\n () => ({\r\n // Cast here to make it easier to pass any `Element`s as props\r\n rootElement: rootElement as HTMLElement,\r\n staticElement: staticElement as HTMLElement,\r\n // A way to get notified when children get rendered, because they could be suspended and waiting for requests\r\n toggleStaticElement: (enabled?: boolean) => setIsEnabled((prevValue) => enabled ?? !prevValue),\r\n }),\r\n [rootElement, staticElement]\r\n )\r\n\r\n if (!rootElement) return null\r\n\r\n return (\r\n setIsEnabled(false)}>\r\n \r\n {ReactDOM.createPortal(React.cloneElement(children, { staticElement, rootElement }), rootElement)}\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\ntype QuerySelectorReturn = Element | null\r\ntype AnyElement = QuerySelectorReturn | QuerySelectorReturn[] | NodeListOf\r\n\r\nexport function useToggleStaticElements(elementToHide?: AnyElement, elementToShow: AnyElement = [], enabled = true) {\r\n React.useEffect(() => {\r\n if (!elementToHide) return\r\n\r\n const hideElement = (element?: QuerySelectorReturn) => element?.classList.add('hidden')\r\n const showElement = (element?: QuerySelectorReturn) => element?.classList.remove('hidden')\r\n const toggleElements = (element: AnyElement | undefined, toggleFn: typeof hideElement) => {\r\n if (element instanceof NodeList || Array.isArray(element)) {\r\n element.forEach(toggleFn)\r\n } else {\r\n toggleFn(element)\r\n }\r\n }\r\n\r\n toggleElements(elementToHide, enabled ? hideElement : showElement)\r\n toggleElements(elementToShow, enabled ? showElement : hideElement)\r\n\r\n return () => {\r\n toggleElements(elementToHide, showElement)\r\n toggleElements(elementToShow, hideElement)\r\n }\r\n }, [elementToHide, elementToShow, enabled])\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\nimport { CartesianGrid as RechartsCartesianGrid } from 'recharts'\r\n\r\nimport { CARTESIAN_STROKE } from './constants'\r\n\r\nexport function CartesianGrid({\r\n vertical = false,\r\n ...props\r\n}: React.PropsWithoutRef>) {\r\n return (\r\n \r\n )\r\n}\r\n\r\nCartesianGrid.displayName = RechartsCartesianGrid.displayName\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\nimport { Label as RechartsLabel } from 'recharts'\r\n\r\nimport { CHART_ITEM_COLORS, ChartItemColorType } from './constants'\r\n\r\ninterface LabelInnerProps extends LabelProps {\r\n dx?: number\r\n dy?: number\r\n viewBox?: { x: number; y: number; width: number; height: number }\r\n color?: ChartItemColorType\r\n}\r\n\r\nfunction LabelInner({\r\n color,\r\n viewBox,\r\n dx = 0,\r\n dy = 0,\r\n angle = -90,\r\n children,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n if (!viewBox) return\r\n\r\n const x = viewBox.x + viewBox.width / 2 + dx\r\n const y = viewBox.y + viewBox.height / 2 + dy\r\n\r\n return (\r\n \r\n {color && }\r\n {children}\r\n \r\n )\r\n}\r\n\r\ninterface LabelProps extends React.PropsWithoutRef> {\r\n color?: ChartItemColorType\r\n}\r\n\r\nexport function Label({ children, color, ...props }: LabelProps) {\r\n return } {...props} />\r\n}\r\n\r\nLabel.displayName = RechartsLabel.displayName\r\n","import { format } from 'date-fns'\r\nimport { XAxis as RechartsXAxis } from 'recharts'\r\n\r\nimport { getDate } from '../../../app/header/utils'\r\nimport { CARTESIAN_STROKE } from './constants'\r\n\r\nexport enum DateFormat {\r\n MonthSingleChar = 'MMMMM',\r\n MonthShort = 'MMM',\r\n MonthShortDayNum = 'MMM dd',\r\n MonthShortYear = 'MMM yyy',\r\n MonthShortDayNumYearFull = 'MMM dd, yyyy',\r\n}\r\n\r\nconst TICK_STYLE = {\r\n fontSize: 10,\r\n fontWeight: 400, // Different from YAxis\r\n fill: '',\r\n}\r\n\r\nexport function dateAxisFormatter({\r\n value,\r\n outFormat,\r\n parseAsNY = false,\r\n breakOnYear = false,\r\n}: {\r\n value: any\r\n outFormat: DateFormat\r\n parseAsNY?: boolean\r\n breakOnYear?: boolean\r\n}) {\r\n if (!Number.isFinite(new Date(value).getTime())) return ''\r\n\r\n const date = parseAsNY ? getDate(value) : new Date(value)\r\n\r\n if (breakOnYear && date.getMonth() === 0) {\r\n if ([DateFormat.MonthSingleChar, DateFormat.MonthShort].includes(outFormat))\r\n return date.getFullYear().toString().substring(2)\r\n return date.getFullYear().toString()\r\n }\r\n\r\n return format(date, outFormat)\r\n}\r\n\r\nexport class XAxis extends RechartsXAxis {\r\n static defaultProps = {\r\n ...RechartsXAxis.defaultProps,\r\n className: 'fill-gray-500 dark:fill-gray-300',\r\n tickLine: false,\r\n axisLine: false,\r\n dy: 5,\r\n tick: TICK_STYLE,\r\n dataKey: 'date',\r\n scale: 'time',\r\n type: 'number',\r\n interval: 'equidistantPreserveStart',\r\n }\r\n}\r\n\r\nexport const SOLID_AXIS_LINE = { stroke: 'currentColor', className: CARTESIAN_STROKE }\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { decodeQueryString } from '../../app/queryString'\r\n\r\nexport function useCheckNonIdeaChartMissingConfig() {\r\n const location = useLocation()\r\n\r\n React.useEffect(() => {\r\n // Navigation (back/forward) from nonexisting idea page doesn't fully reload the page\r\n // So if we're on non idea page and have still isIdeaNotFoundPage flag we want to reload the page\r\n const { i } = decodeQueryString(location.search)\r\n if (!i && window.isIdeaNotFoundPage) {\r\n window.location.reload()\r\n }\r\n }, [location.search])\r\n}\r\n","import Quote from 'finviz-charts/app/models/quote'\r\n\r\nimport { convertTa } from '../../../app/charts-lib'\r\nimport { ObjectHash } from '../../components/types'\r\nimport { getInstrumentForTicker } from '../../util'\r\n\r\nconst PADDING = 2 // Border widths\r\n\r\nexport function getChartsDimensions(chartElementId: string) {\r\n const containerElement = document.getElementById(chartElementId)\r\n\r\n const box = containerElement?.getBoundingClientRect()\r\n\r\n return {\r\n width: Math.max((box?.width ?? 0) - PADDING, 0),\r\n height: Math.max((box?.height ?? 0) - PADDING, 0),\r\n }\r\n}\r\n\r\nexport function getChartConfig(idea: any, chartElementId: string) {\r\n const chartsDimensions = getChartsDimensions(chartElementId)\r\n\r\n if (idea) {\r\n const chartConfig = Object.assign({}, FinvizChartsSettings.ideaChart, {\r\n colors: FinvizChartsSettings.colors,\r\n width: chartsDimensions.width,\r\n height: chartsDimensions.height,\r\n scrollable: true,\r\n editors: ['layout', 'settings', 'publish', 'tools'],\r\n })\r\n for (let i = 0; i < chartConfig.charts.length; i++) {\r\n if (!chartConfig.charts[i].instrument) {\r\n chartConfig.charts[i].instrument = 'stock'\r\n }\r\n }\r\n\r\n return chartConfig\r\n }\r\n\r\n return {\r\n newCharts: true,\r\n width: chartsDimensions.width,\r\n height: chartsDimensions.height,\r\n barWidth: 3,\r\n barMargin: 1,\r\n scrollable: true,\r\n alignChartsToRight: true,\r\n theme: FinvizChartsSettings.theme,\r\n colors: FinvizChartsSettings.colors,\r\n editors: ['layout', 'settings', 'publish', 'tools'],\r\n layout: FinvizChartsSettings.layout,\r\n charts: FinvizChartsSettings.tickers.map(function (ticker: string, index: number) {\r\n return {\r\n timeframe: FinvizChartsSettings.periods[index],\r\n dateRange: FinvizChartsSettings.ranges[index],\r\n scale: FinvizChartsSettings.taConfig.scale || 'linear',\r\n ticker: ticker,\r\n instrument: getInstrumentForTicker(ticker),\r\n premarket: FinvizChartsSettings.taConfig.premarket,\r\n aftermarket: FinvizChartsSettings.taConfig.aftermarket,\r\n hasChartEvents: FinvizChartsSettings.taConfig.hasChartEvents,\r\n refreshData: true,\r\n panes: convertTa.getPanes(FinvizChartsSettings.taConfig),\r\n }\r\n }),\r\n }\r\n}\r\n\r\nexport const initIdeaQuotes = (quotes: Array, ideaChart: ObjectHash) => {\r\n const hasPatterns = JSON.stringify(ideaChart).includes('patterns')\r\n\r\n for (let i = 0; i < quotes.length; i++) {\r\n const quote = quotes[i]\r\n\r\n if (quote.timeframe === 'i1' || quote.timeframe === 'i3' || quote.timeframe === 'i5' || quote.timeframe === 'i15') {\r\n if (!quote.hasOwnProperty('drawMinutesPerDay')) {\r\n quote.drawMinutesPerDay = quote.timeframe === 'i15' ? 390 : 420\r\n }\r\n\r\n if (!quote.hasOwnProperty('marketStartMinutes')) {\r\n quote.marketStartMinutes = quote.timeframe === 'i15' ? 570 : 540\r\n }\r\n\r\n if (!quote.hasOwnProperty('premarketLengthMinutes')) {\r\n quote.premarketLengthMinutes = quote.timeframe === 'i15' ? 0 : 30\r\n }\r\n\r\n if (!quote.hasOwnProperty('aftermarketLengthMinutes')) {\r\n quote.aftermarketLengthMinutes = 0\r\n }\r\n }\r\n\r\n if (!quote.hasOwnProperty('hasPatterns')) {\r\n quote.hasPatterns = hasPatterns\r\n }\r\n\r\n quote.ideaID = ideaChart.idea.id\r\n\r\n Quote.create(quote)\r\n }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { useFinancialsTableContext } from '../../components/financials-table'\r\nimport { EarningsSettings } from './types'\r\n\r\nexport function TempRenameSettingsProperties({\r\n defaultSettings,\r\n keysReplace,\r\n}: {\r\n defaultSettings: Record\r\n keysReplace: Array<[string, string]>\r\n}) {\r\n const { settings, setSettings } = useFinancialsTableContext()\r\n\r\n React.useEffect(() => {\r\n const oldKeys = keysReplace.map((keyPair) => keyPair[0])\r\n const hasOldKey = Object.keys(settings).some((settingKey) => oldKeys.includes(settingKey))\r\n\r\n if (hasOldKey) {\r\n setSettings(\r\n Object.keys(defaultSettings as EarningsSettings).reduce((acc, key) => {\r\n let valueKey = key\r\n const replaceKeyPair = keysReplace.find((keyPair) => keyPair[1] === key)\r\n\r\n if (replaceKeyPair) {\r\n valueKey = replaceKeyPair[0]\r\n }\r\n return {\r\n ...acc,\r\n [key]: settings[valueKey as keyof typeof settings] ?? defaultSettings[key],\r\n }\r\n }, {} as EarningsSettings)\r\n )\r\n }\r\n // We want to run it on mount only\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return null\r\n}\r\n","import React from 'react'\r\n\r\nimport { ChipSwitch, ChipSwitchButton } from '../../components/ChipSwitch'\r\nimport { useFinancialsTableContext } from '../../components/financials-table'\r\nimport { EarningsDataEnum, EarningsSettings, EarningsTimeframeEnum } from './types'\r\n\r\ninterface Props {\r\n timeframe: EarningsTimeframeEnum\r\n isSemiAnnual: boolean\r\n showTimeframe: boolean\r\n hasOldDesign?: boolean\r\n canShrinkLabels?: boolean\r\n}\r\n\r\nfunction GrowthLabel({\r\n isPercentage,\r\n isQuarterlyTimeframe,\r\n isSemiAnnual,\r\n canShrinkLabels,\r\n}: {\r\n canShrinkLabels?: boolean\r\n isSemiAnnual?: boolean\r\n isQuarterlyTimeframe?: boolean\r\n isPercentage?: boolean\r\n}) {\r\n const growthLabel = 'Growth'\r\n let timeframeLabel = 'YoY'\r\n if (isQuarterlyTimeframe) {\r\n timeframeLabel = isSemiAnnual ? 'SoS' : 'QoQ'\r\n }\r\n\r\n const longLabel = `${timeframeLabel} ${growthLabel} ${isPercentage ? '%' : ''}`\r\n\r\n if (!canShrinkLabels) {\r\n return longLabel\r\n }\r\n\r\n return (\r\n <>\r\n {longLabel}\r\n \r\n {timeframeLabel} {isPercentage ? '%' : growthLabel}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default function WidgetSettingsSection({\r\n timeframe,\r\n isSemiAnnual,\r\n showTimeframe,\r\n canShrinkLabels = false,\r\n hasOldDesign = false,\r\n}: Props) {\r\n const { settings, setSettings } = useFinancialsTableContext()\r\n\r\n const toggleSetting = (key: keyof EarningsSettings, value: EarningsSettings[keyof EarningsSettings]) => {\r\n setSettings({\r\n ...settings,\r\n [key]: value,\r\n })\r\n }\r\n\r\n const isQuarterlyTimeframe = timeframe === EarningsTimeframeEnum.quarterly // EarningsTimeframeEnum.quarterly is used for both quarterly & semiannual\r\n\r\n return (\r\n
\r\n \r\n {isQuarterlyTimeframe ? (\r\n {\r\n toggleSetting(EarningsDataEnum.extraChangeYoYonQoQ, !settings[EarningsDataEnum.extraChangeYoYonQoQ])\r\n }}\r\n >\r\n \r\n \r\n ) : null}\r\n {isQuarterlyTimeframe ? (\r\n {\r\n toggleSetting(EarningsDataEnum.extraChangePctYoYonQoQ, !settings[EarningsDataEnum.extraChangePctYoYonQoQ])\r\n }}\r\n >\r\n \r\n \r\n ) : null}\r\n {\r\n toggleSetting(EarningsDataEnum.mainChange, !settings[EarningsDataEnum.mainChange])\r\n }}\r\n >\r\n \r\n \r\n {\r\n toggleSetting(EarningsDataEnum.mainChangePct, !settings[EarningsDataEnum.mainChangePct])\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n {showTimeframe && (\r\n \r\n {\r\n toggleSetting('timeframe', EarningsTimeframeEnum.annual)\r\n }}\r\n >\r\n Annual\r\n \r\n {\r\n toggleSetting('timeframe', EarningsTimeframeEnum.quarterly)\r\n }}\r\n >\r\n {isSemiAnnual ? 'Semiannual' : 'Quarterly'}\r\n \r\n \r\n )}\r\n
\r\n )\r\n}\r\n","import { EarningsDataEnum, EarningsEstimateType } from './types'\r\n\r\nexport enum EarningsWidgetCategory {\r\n Eps,\r\n EpsGaap,\r\n Revenue,\r\n}\r\n\r\nexport const EARNINGS_WIDGET_LABELS: Record = {\r\n [EarningsWidgetCategory.Eps]: 'EPS Performance and Forecast',\r\n [EarningsWidgetCategory.EpsGaap]: 'GAAP EPS Performance and Forecast',\r\n [EarningsWidgetCategory.Revenue]: 'Revenue Performance and Forecast',\r\n}\r\n\r\nexport const ESTIMATE_TYPE_LABEL = {\r\n [EarningsEstimateType.eps]: 'EPS',\r\n [EarningsEstimateType.epsGaap]: 'GAAP EPS',\r\n [EarningsEstimateType.sales]: 'Sales',\r\n}\r\n\r\nexport const BAR_WIDTH = 72\r\nexport const CHART_HEIGHT = 250\r\nexport const LABELS_WIDTH = 28\r\nexport const LABELS_MARGIN = 22\r\nexport const BAR_WIDTH_NARROW = 52\r\nexport const BAR_GAP = 16\r\nexport const EXTRA_WIDTH = 44\r\nexport const CHART_MARGINS = { top: 2, right: 0, bottom: 0, left: 0 }\r\n\r\nexport const DEFAULT_SETTINGS_FOR_EARNINGS_DATA = {\r\n [EarningsDataEnum.mainChange]: false,\r\n [EarningsDataEnum.mainChangePct]: false,\r\n [EarningsDataEnum.extraChangeYoYonQoQ]: false,\r\n [EarningsDataEnum.extraChangePctYoYonQoQ]: false,\r\n}\r\n","// These values match keys which come from BE so don't change them\r\nimport { FinancialsColumnDefinition, FinancialsRowDataType } from '../../components/financials-table/types'\r\n\r\nexport enum EarningValueProperty {\r\n EpsActual = 'epsActual',\r\n EpsAnalysts = 'epsAnalysts',\r\n EpsEstimate = 'epsEstimate',\r\n EpsReportedActual = 'epsReportedActual',\r\n EpsReportedAnalysts = 'epsReportedAnalysts',\r\n EpsReportedEstimate = 'epsReportedEstimate',\r\n SalesActual = 'salesActual',\r\n SalesAnalysts = 'salesAnalysts',\r\n SalesEstimate = 'salesEstimate',\r\n Surprise = 'surprise',\r\n}\r\n\r\nexport type Earning = {\r\n earningsDate: string | null\r\n epsActual: number | null\r\n epsEstimate: number | null\r\n fiscalEndDate: string\r\n fiscalPeriod: string\r\n ticker: string\r\n} & Record\r\n\r\nexport interface EarningsDataType extends Omit {\r\n id: EarningValueProperty\r\n values: Array<{ year: string; value: number | null; isEstimate: boolean }>\r\n isEstimate?: boolean\r\n}\r\n\r\nexport enum EarningsEstimateType {\r\n eps = 'E',\r\n epsGaap = 'R',\r\n sales = 'S',\r\n}\r\n\r\nexport enum EarningsDataEnum {\r\n analysts = 'analysts',\r\n mainChange = 'mainChange',\r\n mainChangePct = 'mainChangePct',\r\n extraChangeYoYonQoQ = 'extraChangeYoYonQoQ',\r\n extraChangePctYoYonQoQ = 'extraChangePctYoYonQoQ',\r\n}\r\n\r\nexport enum EarningsTimeframeEnum {\r\n annual = 'annual',\r\n quarterly = 'quarterly',\r\n}\r\n\r\ntype EarningRowDataType = Omit & {\r\n values: Array<{ year: string; value: number | null; percentageValue: number | null; isEstimate?: boolean }>\r\n}\r\n\r\nexport type EarningsColumnsType = {\r\n columns: FinancialsColumnDefinition[]\r\n subColumns: Record\r\n}\r\n\r\nexport type EarningPriceReaction = {\r\n date: string\r\n prevPrice: number\r\n price: number\r\n priceDiff: number\r\n spyPriceDiff: number\r\n}\r\n\r\nexport type EarningPriceReactions = {\r\n [K: string]: EarningPriceReaction\r\n}\r\n\r\nexport type EarningReportReaction = {\r\n ticker: string\r\n reportDate: string\r\n fiscalPeriod: string\r\n fiscalEndDate: string | null\r\n chartStartDate: string\r\n chartEndDate: string\r\n rsi: number | null\r\n reactions: EarningPriceReactions\r\n}\r\n\r\nexport enum PriceReactionWhen {\r\n MINUS_DAYS_3 = 'minus_3_days',\r\n MINUS_DAYS_2 = 'minus_2_days',\r\n MINUS_DAYS_1 = 'minus_1_day',\r\n OPEN = 'open',\r\n HIGH = 'high',\r\n LOW = 'low',\r\n CLOSE = 'close',\r\n PLUS_DAYS_1 = 'plus_1_day',\r\n PLUS_DAYS_2 = 'plus_2_days',\r\n PLUS_DAYS_3 = 'plus_3_days',\r\n PLUS_WEEK_1 = 'plus_1_week',\r\n MINUS_WEEK_1 = 'minus_1_week',\r\n}\r\n\r\nexport interface EarningsCommonData {\r\n earningsDate: string | null\r\n earningsAnnualData: Earning[]\r\n earningsData: Earning[]\r\n priceReactionData: EarningReportReaction[]\r\n}\r\n\r\nexport type EarningsDataSettings = {\r\n [EarningsDataEnum.mainChange]: boolean\r\n [EarningsDataEnum.mainChangePct]: boolean\r\n [EarningsDataEnum.extraChangeYoYonQoQ]: boolean\r\n [EarningsDataEnum.extraChangePctYoYonQoQ]: boolean\r\n}\r\n\r\nexport type EarningsSettings = EarningsDataSettings & {\r\n estimateType: EarningsEstimateType\r\n fiscalPeriod: string\r\n timeframe: EarningsTimeframeEnum\r\n}\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../../app/charts-lib'\r\nimport { QuoteQuery, QuoteSubview, QuoteView } from './types'\r\nimport { getQuoteSubview, getQuoteView } from './utils'\r\n\r\nexport const QuoteContext = React.createContext<{\r\n index: number\r\n ticker: string\r\n period: TIMEFRAME\r\n view: QuoteView | null\r\n subview: QuoteSubview | null\r\n}>({ index: -1, ticker: '', period: TIMEFRAME.d, view: null, subview: null })\r\n\r\nexport function QuoteContextProvider({\r\n ticker,\r\n index,\r\n children,\r\n}: React.PropsWithChildren<{ ticker: string; index: number }>) {\r\n const [query] = useSearchParams()\r\n const type = query.get(QuoteQuery.Type) as QuoteView | QuoteSubview\r\n const period = query.get(QuoteQuery.Period) as TIMEFRAME\r\n const contextValue = React.useMemo(\r\n () => ({ index, ticker, period, view: getQuoteView(type), subview: getQuoteSubview(type) }),\r\n [index, period, ticker, type]\r\n )\r\n\r\n return {children}\r\n}\r\n","import { CHART_ELEMENT_ID } from 'finviz-charts/app/constants/common'\r\nimport * as React from 'react'\r\nimport ReactDOM from 'react-dom'\r\n\r\nimport {\r\n ChartLayoutWithGlobalState,\r\n FREE_DATE_RANGES,\r\n Quote,\r\n RootChartConfigObject,\r\n Theme,\r\n getChartLayoutSizeConfig,\r\n} from '../../../../app/charts-lib'\r\nimport { decodeQueryString } from '../../../../app/queryString'\r\nimport { getInitChartConfig } from '../../../../app/shared/getInitChartConfig'\r\nimport { SpecificChartFunctionality, TIMEFRAME } from '../../../constants/common'\r\nimport { initIdeaQuotes } from '../../charts/util'\r\n\r\nexport function QuoteChart({\r\n configOverride,\r\n TAOverride,\r\n}: {\r\n configOverride?: Partial\r\n TAOverride?: any\r\n}) {\r\n const chartEl = React.useRef(document.getElementById(CHART_ELEMENT_ID))\r\n\r\n const config = React.useMemo(() => {\r\n let chartConfig = window.globalChartConfig\r\n\r\n if (!chartConfig) return\r\n\r\n if (chartConfig.ideaQuotes) {\r\n // Load idea quote data\r\n initIdeaQuotes(chartConfig.ideaQuotes, chartConfig)\r\n } else {\r\n // Create Quote from inlined data so we don’t have to fetch it\r\n if (chartConfig.quoteData) Quote.create(chartConfig.quoteData)\r\n chartConfig = getInitChartConfig(chartConfig, TAOverride)\r\n }\r\n\r\n const { p = FinvizSettings.defaultPeriod } = decodeQueryString()\r\n const sizeConfig = getChartLayoutSizeConfig(chartConfig, p as TIMEFRAME)\r\n\r\n return {\r\n ...chartConfig,\r\n ...sizeConfig,\r\n theme: FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light,\r\n specificChartFunctionality: SpecificChartFunctionality.quotePage,\r\n charts: chartConfig.charts.map((chart) => ({\r\n ...chart,\r\n dateRange:\r\n FinvizSettings.hasUserPremium || FREE_DATE_RANGES.includes(chart.dateRange ?? '') ? chart.dateRange : null,\r\n })),\r\n ...configOverride,\r\n }\r\n }, [TAOverride, configOverride])\r\n\r\n if (!config || !chartEl.current) return null\r\n\r\n return ReactDOM.createPortal(, chartEl.current)\r\n}\r\n","import React from 'react'\r\n\r\nimport { PortalContext } from '../../../../components/Portal'\r\nimport { useChartTimeframePathWatch } from '../../hooks/use-chart-timeframe-path-watch'\r\n\r\nexport type QuoteLinksContextType = ReturnType\r\n\r\nfunction getDefaultContextValue() {\r\n const urlObject = new URL(window.location.href)\r\n\r\n return {\r\n chartLayoutModel: null,\r\n location: urlObject,\r\n }\r\n}\r\n\r\nexport const QuoteLinksContext = React.createContext(getDefaultContextValue())\r\n\r\nexport function QuoteLinksWrapper({ children }: React.PropsWithChildren) {\r\n const { toggleStaticElement } = React.useContext(PortalContext)\r\n const info = useChartTimeframePathWatch()\r\n\r\n React.useEffect(() => toggleStaticElement(), [toggleStaticElement])\r\n\r\n return {children}\r\n}\r\n","import { useChartModelCustomDateRangeValues } from 'finviz-charts/app/controllers/chart-controls/use-chart-model-custom-date-range-values'\r\nimport { useChartLayoutGlobalModelAsync, useModelState } from 'finviz-charts/app/lib-export'\r\n\r\nexport function useChartTimeframePathWatch() {\r\n const isPremium = window.FinvizSettings.hasUserPremium\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const chartModel = useModelState(chartLayoutModel?.activeChart ?? null, {\r\n watchProperties: ['timeframe', 'dateRange'],\r\n })\r\n const { generateChartLayoutRouterPath } = useChartModelCustomDateRangeValues({\r\n chartModel,\r\n isPremium,\r\n })\r\n\r\n if (!chartModel)\r\n return {\r\n location: new URL(`${window.location.pathname}${window.location.search}`, window.location.origin),\r\n chartLayoutModel,\r\n }\r\n\r\n const location = generateChartLayoutRouterPath({\r\n ticker: chartModel?.ticker,\r\n timeframe: chartModel?.timeframe,\r\n dateRange: chartModel?.dateRange,\r\n })\r\n\r\n return { location: new URL(`${location.pathname}${location.search}`, window.location.origin), chartLayoutModel }\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\nimport { Link, LinkProps, To } from 'react-router-dom'\r\n\r\nimport { getElitePageLink, getNavigationLinkUrl } from '../../../../util'\r\nimport { QuoteContext } from '../../QuoteContext'\r\nimport { QuoteQuery, QuoteSubview, QuoteView } from '../../types'\r\nimport { QuoteLinksContext, QuoteLinksContextType } from './QuoteLinksWrapper'\r\n\r\nconst isPremium = FinvizSettings.hasUserPremium\r\n\r\ninterface SharedNavigationLinkProps {\r\n /**\r\n * Mark as only available to elite users. When se to `true`, free users will be\r\n * redirected to elite landing when clicking the link\r\n */\r\n isEliteOnly?: boolean\r\n\r\n /**\r\n * Used together with isEliteOnly to set the correct utm campaign param\r\n */\r\n utmCampaign?: string\r\n}\r\n\r\ninterface NavigationLinkProps extends SharedNavigationLinkProps, Omit {\r\n /**\r\n * Keys to preserve from the current URL query. Runs first when manipulating the URL\r\n *\r\n * @default [Ticker, Type, Period, DateRange]\r\n */\r\n preserveQueryKeys?: Array\r\n\r\n /**\r\n * Keys to omit from the current URL query. Runs after `preserveQueryKeys`\r\n */\r\n removeQueryKeys?: Array\r\n\r\n /**\r\n * Additional values to set to the URL query after preserving/removing\r\n *\r\n * @default { Type: props.view }\r\n */\r\n additionalQueryValues?: Partial>\r\n\r\n /**\r\n * The view the component links to\r\n */\r\n view: QuoteView | QuoteSubview\r\n\r\n getLink?: never\r\n}\r\n\r\ninterface CustomNavigationLinkProps extends SharedNavigationLinkProps, Omit {\r\n view?: never\r\n preserveQueryKeys?: never\r\n removeQueryKeys?: never\r\n additionalQueryValues?: never\r\n\r\n /**\r\n * Custom function to get the link\r\n */\r\n getLink: (context: QuoteLinksContextType) => To\r\n}\r\n\r\nexport function NavigationLink({\r\n isEliteOnly,\r\n utmCampaign,\r\n view,\r\n getLink,\r\n reloadDocument = true,\r\n preserveQueryKeys = [\r\n QuoteQuery.Ticker,\r\n QuoteQuery.Type,\r\n QuoteQuery.Period,\r\n QuoteQuery.DateRange,\r\n QuoteQuery.BackToScreener,\r\n ],\r\n removeQueryKeys,\r\n additionalQueryValues,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const quoteContext = React.useContext(QuoteContext)\r\n const linkContext = React.useContext(QuoteLinksContext)\r\n\r\n const linkUrl = React.useMemo(() => {\r\n if (isEliteOnly && !isPremium) return getElitePageLink(utmCampaign)\r\n if (typeof getLink === 'function') return getLink(linkContext)\r\n\r\n return getNavigationLinkUrl(\r\n linkContext.location,\r\n preserveQueryKeys,\r\n removeQueryKeys,\r\n additionalQueryValues ?? { [QuoteQuery.Type]: view }\r\n ).toString()\r\n }, [isEliteOnly, utmCampaign, getLink, linkContext, preserveQueryKeys, removeQueryKeys, additionalQueryValues, view])\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Dialog, useDialogState } from '../../../../components/dialog'\r\nimport { Spinner } from '../../../../components/spinner'\r\nimport { useAsyncModule } from '../../../../services/async-modules-utils'\r\nimport { createAlertAsyncModule } from '../../../create-alert/async-modules'\r\nimport { QuoteContext } from '../../QuoteContext'\r\nimport { NavigationLink } from './QuoteLinkComponent'\r\n\r\nexport function CreateAlertLink() {\r\n const { ticker } = React.useContext(QuoteContext)\r\n const dialog = useDialogState()\r\n const isVisible = dialog.useState('open')\r\n\r\n const [createAlertModule] = useAsyncModule({\r\n ...createAlertAsyncModule,\r\n shouldLoadModule: isVisible,\r\n })\r\n const CreateAlert = createAlertModule?.CreateAlert\r\n\r\n return (\r\n <>\r\n `/create_alert.ashx?t=${ticker}`}\r\n onClick={(e) => {\r\n if (!FinvizSettings.hasUserPremium) return\r\n window.gtag?.('event', 'click', { event_category: 'create-alert' })\r\n if (e.ctrlKey || e.metaKey) return\r\n e.preventDefault() // needed to prevent opening parent link\r\n dialog.show()\r\n }}\r\n data-testid=\"set-alert-link\"\r\n >\r\n Set Alert\r\n \r\n \r\n {CreateAlert ? (\r\n \r\n ) : (\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 { Dialog, useDialogState } from '../../../../components/dialog'\r\nimport { Spinner } from '../../../../components/spinner'\r\nimport { useAsyncModule } from '../../../../services/async-modules-utils'\r\nimport { saveToPortfolioAsyncModule } from '../../../save-to-portfolio/async-modules'\r\nimport { QuoteContext } from '../../QuoteContext'\r\nimport { NavigationLink } from './QuoteLinkComponent'\r\n\r\nexport function SaveToPortfolioLink() {\r\n const { ticker } = React.useContext(QuoteContext)\r\n const dialog = useDialogState()\r\n const isVisible = dialog.useState('open')\r\n\r\n const [saveToPortfolioModule] = useAsyncModule({\r\n ...saveToPortfolioAsyncModule,\r\n shouldLoadModule: isVisible,\r\n })\r\n const SaveToPortfolio = saveToPortfolioModule?.SaveToPortfolio\r\n\r\n return (\r\n <>\r\n `/save_to_portfolio.ashx?t=${ticker}`}\r\n onClick={(e) => {\r\n if (!FinvizSettings.email.length) return\r\n window.gtag?.('event', 'click', { event_category: 'save-to-portfolio' })\r\n if (e.ctrlKey || e.metaKey) return\r\n e.preventDefault() // needed to prevent opening parent link\r\n dialog.show()\r\n }}\r\n >\r\n Add to Portfolio\r\n \r\n \r\n {SaveToPortfolio ? (\r\n \r\n ) : (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { PortalContext } from '../../components/Portal'\r\nimport { CreateAlertLink } from './components/Navigation/CreateAlertLink'\r\nimport { NavigationLink } from './components/Navigation/QuoteLinkComponent'\r\nimport { QuoteLinksWrapper } from './components/Navigation/QuoteLinksWrapper'\r\nimport { SaveToPortfolioLink } from './components/Navigation/SaveToPortfolioLink'\r\nimport { QuoteQuery, QuoteSubview, QuoteView } from './types'\r\n\r\nexport function QuoteNavigation() {\r\n const { rootElement } = React.useContext(PortalContext)\r\n const hasShortInterest = rootElement!.dataset.shortinterest === 'true'\r\n const isFund = rootElement!.dataset.isfund === 'true'\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n Chart\r\n Stock Detail\r\n \r\n \r\n\r\n \r\n Compare\r\n Compare Perf.\r\n \r\n \r\n\r\n {hasShortInterest && (\r\n <>\r\n Short Interest\r\n \r\n \r\n )}\r\n\r\n \r\n Financials\r\n \r\n\r\n \r\n\r\n Traffic\r\n \r\n\r\n \r\n Options\r\n \r\n \r\n\r\n \r\n Filings\r\n Latest Filings\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","/* global FinvizQuoteTickers */\r\nimport classnames from 'classnames'\r\nimport * as dateFns from 'date-fns'\r\nimport React, { ChangeEvent, Component, FormEvent } from 'react'\r\n\r\nimport {\r\n ChartElementType,\r\n ChartLayout,\r\n Instrument,\r\n Quote,\r\n QuoteFetchType,\r\n TIMEFRAME,\r\n Theme,\r\n Utils,\r\n} from '../../../../app/charts-lib'\r\nimport { decodeQueryString } from '../../../../app/queryString'\r\nimport { getStaticChartConfig } from '../../../../app/shared/chartLayoutConfig'\r\nimport { getSanitizedTicker } from '../../../../app/shared/ticker-sanitizer'\r\nimport { formatDateToStringUS } from '../../../../app/shared/utils'\r\nimport { DatePicker } from '../../../components/date-picker'\r\nimport { SpecificChartFunctionality } from '../../../constants/common'\r\n\r\nconst redesignEnabled = !!FinvizSettings.hasRedesignEnabled\r\n\r\nconst colorScaleClass = function (value: number) {\r\n if (value < 0) {\r\n return 'color-text is-negative'\r\n } else if (value > 0) {\r\n return 'color-text is-positive'\r\n }\r\n return ''\r\n}\r\n\r\nconst monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nconst arraysEqual = function (arr1: unknown[], arr2: unknown[]) {\r\n if (arr1.length !== arr2.length) {\r\n return false\r\n }\r\n for (let i = 0; i < arr1.length; i++) {\r\n if (arr1[i] !== arr2[i]) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\ninterface ChartProps {\r\n tickers: string[]\r\n fromDay: string\r\n toDay: string\r\n}\r\n\r\nclass Chart extends Component {\r\n containerRef = React.createRef()\r\n\r\n shouldComponentUpdate(nextProps: ChartProps) {\r\n return !arraysEqual(this.props.tickers, nextProps.tickers)\r\n }\r\n\r\n render() {\r\n const theme = FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light\r\n const tickerQuote = Quote.select((q) => q.close.length > 0 && this.props.tickers.includes(q.ticker))\r\n const chartConfig = getStaticChartConfig({\r\n ticker: tickerQuote[0]?.ticker ?? '',\r\n timeframe: TIMEFRAME.d,\r\n paneElements: [\r\n {\r\n type: ChartElementType.PerfChart,\r\n tickers: this.props.tickers,\r\n fromDate: this.props.fromDay,\r\n toDate: this.props.toDay,\r\n overlays: [],\r\n },\r\n ],\r\n width: 1000,\r\n height: 450,\r\n refreshData: false,\r\n specificChartFunctionality: SpecificChartFunctionality.quotePerf,\r\n theme,\r\n })\r\n return (\r\n
\r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\ninterface TableProps {\r\n months: string[]\r\n rows: Array<{\r\n ticker: string\r\n months: string[]\r\n total: string\r\n }>\r\n}\r\n\r\n// mozno vyfarbovat tabulku?\r\nclass Table extends Component {\r\n render() {\r\n const { months, rows } = this.props\r\n const groupsCount = Math.ceil(months.length / 12)\r\n const tdClasses = classnames('text-center', {\r\n 'body-table-nw font-bold': !redesignEnabled,\r\n })\r\n\r\n const trs = []\r\n for (let g = 0; g < groupsCount; g++) {\r\n trs.push(\r\n \r\n \r\n {months.splice(0, 12).map((month) => (\r\n \r\n {month}\r\n \r\n ))}\r\n {g === groupsCount - 1 && Total}\r\n \r\n )\r\n rows.forEach((row, i) => {\r\n trs.push(\r\n \r\n {row.ticker}\r\n {row.months.splice(0, 12).map((col, monthIndex) => (\r\n \r\n {col}\r\n \r\n ))}\r\n {g === groupsCount - 1 && (\r\n \r\n {row.total}\r\n \r\n )}\r\n \r\n )\r\n })\r\n }\r\n\r\n return (\r\n \r\n {trs}\r\n \r\n )\r\n }\r\n}\r\n\r\ninterface PerfState {\r\n tickersInput: string\r\n tickers: string[]\r\n months: Array<{\r\n value: string\r\n label: string\r\n }>\r\n fromMonth: {\r\n value: string\r\n label: string\r\n }\r\n toMonth: {\r\n value: string\r\n label: string\r\n }\r\n minDate: string\r\n maxDate: string\r\n fromDay: string\r\n toDay: string\r\n loading: boolean\r\n}\r\n\r\nfunction getInitialTickers() {\r\n return {\r\n tickersInput: FinvizQuoteTickers.join(','),\r\n tickers: FinvizQuoteTickers,\r\n }\r\n}\r\n\r\nexport class Perf extends Component {\r\n constructor(props: any) {\r\n super(props)\r\n const now = new Date(),\r\n months = []\r\n const startYear = new Date().getFullYear() - 36 // We have 37.25 years of data in DB, so leaving some offset\r\n for (let year = startYear; year <= now.getFullYear(); year++) {\r\n for (let month = 1; month <= 12; month++) {\r\n if (year === now.getFullYear() && month > now.getMonth() + 1) {\r\n break\r\n }\r\n months.push({\r\n value: month.toString().padStart(2, '0') + '/01/' + year,\r\n label: monthNames[month - 1] + ' ' + year.toString().substring(2),\r\n })\r\n }\r\n }\r\n\r\n this.state = {\r\n ...getInitialTickers(),\r\n months: months,\r\n fromMonth: months[months.length - 12],\r\n toMonth: months[months.length - 1],\r\n /**\r\n * DB_BARS_LIMIT - code below is dependent on amount of data we store for specific timeframes\r\n * Search DB_BARS_LIMIT in the project to find other places with such code.\r\n */\r\n // 2510 bars = ±10 years\r\n minDate: formatDateToStringUS(dateFns.sub(new Date(), { years: 9, months: 11 })),\r\n maxDate: formatDateToStringUS(new Date()),\r\n fromDay: formatDateToStringUS(dateFns.subYears(new Date(), 1)),\r\n toDay: formatDateToStringUS(new Date()),\r\n loading: true,\r\n }\r\n }\r\n\r\n render() {\r\n if (this.state.loading) {\r\n return (\r\n \r\n Loading...\r\n
\r\n )\r\n }\r\n\r\n const from = new Date(this.state.fromMonth.value)\r\n const to = new Date(this.state.toMonth.value)\r\n const monthsToShow = this.state.months\r\n .map((month) => month.value)\r\n .filter((month) => new Date(month) >= from && new Date(month) <= to)\r\n\r\n const quotes = Quote.select((q: any) => q.timeframe === 'm')\r\n const quotesPerf = quotes.map((q: any) => {\r\n const obj: { ticker: string; perf: Record } = { ticker: q.ticker, perf: {} }\r\n q.date.forEach((d: any, i: number) => {\r\n if (i === 0) {\r\n return\r\n }\r\n const date = Utils.dateFromUnixTimestamp(d)\r\n const perf = (q.close[i] * 100) / q.close[i - 1] - 100\r\n obj.perf[(date.getMonth() + 1).toString().padStart(2, '0') + '/01/' + date.getFullYear()] = perf\r\n })\r\n return obj\r\n })\r\n\r\n const months = monthsToShow.map(\r\n (month) => monthNames[new Date(month).getMonth()] + ' ' + new Date(month).getFullYear().toString().substring(2)\r\n )\r\n const rows = quotesPerf.map((quote: any) => {\r\n const cols: string[] = []\r\n let total = 1\r\n monthsToShow.forEach((month) => {\r\n const perf = Math.round(quote.perf[month] * 100) / 100\r\n if (!isNaN(perf)) {\r\n total *= quote.perf[month] / 100 + 1\r\n cols.push((perf > 0 ? '+' : '') + perf.toFixed(2) + '%')\r\n } else {\r\n cols.push('N/A')\r\n }\r\n })\r\n total = (total - 1) * 100\r\n return { ticker: quote.ticker, months: cols, total: (total > 0 ? '+' : '') + total.toFixed(2) + '%' }\r\n })\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
Tickers:\r\n {\r\n this.setState({ tickersInput: e.target.value })\r\n }}\r\n style={{ width: '100%' }}\r\n data-testid=\"quote-compare-perf-tickers-input\"\r\n />\r\n \r\n \r\n
\r\n
\r\n\r\n \r\n\r\n \r\n
\r\n {\r\n this._onDatePickerChange('from', formatDateToStringUS(newValue))\r\n }}\r\n >\r\n \r\n \r\n
\r\n {' - '}\r\n
\r\n {\r\n this._onDatePickerChange('to', formatDateToStringUS(newValue))\r\n }}\r\n >\r\n \r\n \r\n
\r\n \r\n\r\n

\r\n Monthly performance from  \r\n \r\n {this.state.months.map((option) => (\r\n \r\n ))}\r\n \r\n   to  \r\n \r\n {this.state.months.map((option) => (\r\n \r\n ))}\r\n \r\n

\r\n \r\n\r\n
\r\n \r\n )\r\n }\r\n\r\n refetchQuotes = () => {\r\n this._fetch(this.state.tickers, false)\r\n }\r\n\r\n componentDidMount() {\r\n this._fetch(this.state.tickers)\r\n\r\n // We have to listen to these events to synchrnously update quote data, if we do after awaiting Quote.getAll in _fetch\r\n // there's a visual glitch because it rerenders with new data from the server (there's a complete refetch after 15 requests with no new data)\r\n // and then it rerenders again after updateQuoteData\r\n Quote.bind('refetch newerData', this.updateQuoteData)\r\n document.addEventListener('quoteFetchEvent', this.refetchQuotes)\r\n\r\n this._trackTickers(true)\r\n }\r\n\r\n _trackTickers(isInitial = false) {\r\n const { tickers } = this.state\r\n window.gtag?.('event', 'compare-perf', {\r\n event_category: 'compare-perf',\r\n is_initial: isInitial,\r\n quote_tickers: FinvizQuoteTickers.join(','),\r\n tickers: tickers.join(','),\r\n })\r\n }\r\n\r\n componentWillUnmount() {\r\n Quote.unbind('refetch newerData', this.updateQuoteData)\r\n document.removeEventListener('quoteFetchEvent', this.refetchQuotes)\r\n }\r\n\r\n getFromToDayTimestamps = () => {\r\n const { fromDay, toDay } = this.state\r\n\r\n if (!fromDay || !toDay) {\r\n return null\r\n }\r\n\r\n const fromDate = Utils.convertLocalToNyTime(new Date(fromDay + ' 00:00'), false)\r\n const toDate = Utils.convertLocalToNyTime(new Date(toDay + ' 23:59'), false)\r\n\r\n return {\r\n fromTimestamp: fromDate.getTime() / 1000,\r\n toTimestamp: toDate.getTime() / 1000,\r\n }\r\n }\r\n\r\n updateQuoteData = () => {\r\n const fromToDayTimestamps = this.getFromToDayTimestamps()\r\n\r\n if (fromToDayTimestamps === null) {\r\n return\r\n }\r\n\r\n const dailyQuotes = Quote.select((q: any) => q.timeframe === 'd')\r\n dailyQuotes.forEach((q: any) => {\r\n const o = [],\r\n h = [],\r\n l = [],\r\n c = [],\r\n d = [],\r\n v = []\r\n for (let i = 0; i < q.close.length; i++) {\r\n if (fromToDayTimestamps.fromTimestamp <= q.date[i] && q.date[i] <= fromToDayTimestamps.toTimestamp) {\r\n o.push(q.open[i])\r\n h.push(q.high[i])\r\n l.push(q.low[i])\r\n c.push(q.close[i])\r\n d.push(q.date[i])\r\n v.push(q.volume[i])\r\n }\r\n }\r\n // Clear cache so we'll recalculate values after updating quote data on next line\r\n // Cache invalidates only on quote.fetchedAt change and in this case we mutate quote values and don't change fetchedAt (which is correct)\r\n // Updating quote this way should be an edge case and that's why we have to clear the cache manually\r\n q.clearCachedData()\r\n q.updateAttributes({\r\n open: o,\r\n high: h,\r\n low: l,\r\n close: c,\r\n date: d,\r\n volume: v,\r\n })\r\n })\r\n\r\n // This is to rerender perf table on quote update\r\n this.forceUpdate()\r\n }\r\n\r\n _fetch = async (tickers: string[], isRefetch = true) => {\r\n const fromToDayTimestamps = this.getFromToDayTimestamps()\r\n const { t } = decodeQueryString<{ t: string; p?: TIMEFRAME }>()\r\n if (isRefetch) {\r\n this.setState({ loading: true })\r\n }\r\n\r\n const dailyQuoteOptions = {\r\n dateFrom: fromToDayTimestamps?.fromTimestamp,\r\n dateTo: fromToDayTimestamps?.toTimestamp,\r\n }\r\n\r\n Quote.all().forEach(async (quote) => {\r\n if (quote.ticker === t && quote.timeframe === TIMEFRAME.d && !isRefetch) {\r\n // We don't want to trigger main ticker quote newer data fetch because it's done in withQuotePolling which also triggers this function\r\n // by emmiting quoteFetchEvent\r\n return\r\n }\r\n if (tickers.includes(quote.ticker)) {\r\n await quote.fetchData({\r\n fetchType: isRefetch ? QuoteFetchType.Refetch : QuoteFetchType.NewerData,\r\n options: quote.timeframe === TIMEFRAME.d ? dailyQuoteOptions : undefined,\r\n })\r\n this.updateQuoteData()\r\n } else {\r\n quote.destroy()\r\n }\r\n })\r\n\r\n if (isRefetch) {\r\n const d = tickers.map((ticker) => ({\r\n ticker: ticker,\r\n timeframe: TIMEFRAME.d,\r\n instrument: Instrument.Stock,\r\n options: dailyQuoteOptions as typeof dailyQuoteOptions | undefined,\r\n }))\r\n const m = tickers.map((ticker) => ({\r\n ticker: ticker,\r\n timeframe: TIMEFRAME.m,\r\n instrument: Instrument.Stock,\r\n options: undefined,\r\n }))\r\n await Quote.getAll(d.concat(m))\r\n\r\n this.setState({ loading: false })\r\n }\r\n\r\n this.updateQuoteData()\r\n }\r\n\r\n _onSubmit = (e: FormEvent) => {\r\n e.preventDefault()\r\n const tickersInput = getSanitizedTicker(this.state.tickersInput, true)\r\n const tickers = tickersInput.split(',')\r\n\r\n let newState = { tickersInput, tickers }\r\n if (!tickersInput.length || !tickers.length) newState = getInitialTickers()\r\n\r\n const tickersChanged = !arraysEqual([...this.state.tickers].sort(), [...tickers].sort())\r\n\r\n this.setState(newState, () => {\r\n this._fetch(newState.tickers)\r\n\r\n if (tickersChanged && tickers.length >= 2) {\r\n this._trackTickers()\r\n }\r\n })\r\n }\r\n\r\n _onMonthChange = (type: string, e: ChangeEvent) => {\r\n const state: any = {}\r\n state[type + 'Month'] = this.state.months.filter((m) => m.value === e.target.value)[0]\r\n this.setState(state)\r\n }\r\n\r\n _onDatePickerChange = (type: string, date: any) => {\r\n const formattedDate = formatDateToStringUS(new Date(date))\r\n\r\n const state: any = {}\r\n state[type + 'Day'] = formattedDate\r\n state[type + 'DatePickerOpen'] = false\r\n this.setState(state, () => {\r\n this._fetch(this.state.tickers)\r\n })\r\n }\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface ChartBoxProps extends Omit, 'label'> {\r\n label?: React.ReactNode\r\n}\r\n\r\nexport function ChartBox({ label, children, ...props }: React.PropsWithChildren) {\r\n return (\r\n \r\n
\r\n {label}\r\n
\r\n {children}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { ComposedChart } from 'recharts'\r\n\r\nimport { RedGreenText } from '../../../components/RedGreenText'\r\nimport { Bar } from '../../../components/chart/Bar'\r\nimport { CartesianGrid } from '../../../components/chart/CartesianGrid'\r\nimport { ChartBox } from '../../../components/chart/ChartBox'\r\nimport { ChartWrapper } from '../../../components/chart/ChartWrapper'\r\nimport { Label } from '../../../components/chart/Label'\r\nimport { Line } from '../../../components/chart/Line'\r\nimport { Tooltip, TooltipRow } from '../../../components/chart/Tooltip'\r\nimport { DateFormat, XAxis, dateAxisFormatter } from '../../../components/chart/XAxis'\r\nimport { YAxis } from '../../../components/chart/YAxis'\r\nimport { getMonthlyTicks } from '../../../components/chart/utils'\r\nimport { dateStrToTimestamp, shortFormatDollar } from '../../../util'\r\nimport { parseRouteInitData } from '../../../util-routing'\r\nimport { QuoteContext } from '../QuoteContext'\r\n\r\ninterface FundFlowsRow {\r\n date: string\r\n aum: number | null\r\n flow: number | null\r\n}\r\n\r\nenum FlowsChartDataKeys {\r\n Aum = 'aum',\r\n Flows = 'flow',\r\n}\r\n\r\nconst AXIS_LABEL_OFFSET = 38\r\n\r\nfunction tooltipValueFormatter(value: number, { dataKey }: { dataKey: string }) {\r\n const formatted = shortFormatDollar(value)\r\n if (dataKey === FlowsChartDataKeys.Aum) return formatted\r\n\r\n return (\r\n \r\n {formatted}\r\n \r\n )\r\n}\r\n\r\nexport function FundFlowsChart(props: React.HTMLProps) {\r\n const { index } = React.useContext(QuoteContext)\r\n const initData = React.useMemo(() => {\r\n const routeData = parseRouteInitData({\r\n elementId: `route-init-data-fundflows-${index}`,\r\n removeElement: false,\r\n })\r\n\r\n return routeData?.map((row) => ({ ...row, date: dateStrToTimestamp(row.date) }))\r\n }, [index])\r\n\r\n const monthlyTicks = React.useMemo(\r\n () => (initData?.length ? getMonthlyTicks(initData[0].date, initData[initData?.length - 1].date) : undefined),\r\n [initData]\r\n )\r\n\r\n if (!initData?.length) return null\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n dateAxisFormatter({ value, outFormat: DateFormat.MonthShort, breakOnYear: true })}\r\n />\r\n \r\n \r\n \r\n {\r\n const absMax = Math.max(Math.abs(dataMin), Math.abs(dataMax)) * 1.2\r\n return [-absMax, absMax]\r\n }}\r\n >\r\n \r\n \r\n dateAxisFormatter({ value, outFormat: DateFormat.MonthShortDayNumYearFull })}\r\n formatValue={tooltipValueFormatter}\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n yAxisId=\"flowAxis\"\r\n dataKey={FlowsChartDataKeys.Flows}\r\n radius={[1, 1, 0, 0]}\r\n color={(value) => (value == null ? 'blue' : value > 0 ? 'green' : 'red')}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nexport function getMonthlyTicks(startingTimestamp: number, endingTimestamp: number, dayOfMonth = 1) {\r\n const ticks: number[] = []\r\n const endingDate = new Date(endingTimestamp)\r\n const initTimestamp = new Date(startingTimestamp)\r\n const startDate = dateFns.setDay(initTimestamp, dayOfMonth)\r\n let date = dateFns.isBefore(startDate, initTimestamp) ? initTimestamp : startDate\r\n\r\n while (date <= endingDate) {\r\n ticks.push(date.getTime())\r\n date = new Date(date.getFullYear(), date.getMonth() + 1, dayOfMonth)\r\n }\r\n\r\n return ticks\r\n}\r\n","export const CHART_HEIGHT = 300\r\nexport const BAR_WIDTH = 8\r\n\r\nexport enum BarType {\r\n Buy = 'buyAggregated',\r\n Sale = 'saleAggregated',\r\n}\r\n","import * as React from 'react'\r\nimport { Rectangle } from 'recharts'\r\n\r\nimport { BarInner } from '../../../../components/chart/Bar'\r\nimport { BAR_WIDTH, BarType } from './constants'\r\n\r\nexport function InsiderVolumeBar({ x, width, ...props }: any) {\r\n let newX = x\r\n const value = props.payload[props.dataKey]\r\n const isCenteredBar = props.payload.saleAggregated === 0 || props.payload.buyAggregated === 0\r\n if (isCenteredBar) {\r\n if (props.dataKey === BarType.Sale) newX += width / 2\r\n else newX -= width / 2\r\n }\r\n\r\n if (value === 0 || !Number.isFinite(value)) {\r\n // Needs to return an element, so return an empty node\r\n return \r\n }\r\n\r\n return (\r\n \r\n \r\n {props.dataKey === BarType.Sale && (\r\n \r\n )}\r\n {props.dataKey === BarType.Buy && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport { endOfMonth, startOfMonth } from 'date-fns'\r\n\r\nimport { RedGreenText } from '../../../../components/RedGreenText'\r\nimport { shortFormatDollar } from '../../../../util'\r\nimport { BarType } from './constants'\r\nimport { VolumeChartDataPerTimeframe } from './types'\r\n\r\nexport function tooltipTitleFormatter(date: number) {\r\n const startDate = startOfMonth(date)\r\n const endDate = endOfMonth(startDate)\r\n\r\n const month = startDate.toLocaleString('en-US', { month: 'short' })\r\n const startDay = startDate.getDate()\r\n const year = startDate.getFullYear()\r\n const endDay = endDate.getDate()\r\n return `${month} ${startDay}-${endDay}, ${year}`\r\n}\r\n\r\nexport function tooltipDataFormatter(\r\n _: unknown,\r\n {\r\n dataKey,\r\n fullTooltipPayload,\r\n }: { dataKey: string; fullTooltipPayload: { payload?: { insider: VolumeChartDataPerTimeframe } }[] }\r\n) {\r\n const { insider } = fullTooltipPayload[0]?.payload ?? {}\r\n\r\n if (!insider) return null\r\n\r\n const tradeCount = dataKey === BarType.Buy ? insider?.buyTransactionCount : insider?.saleTransactionCount\r\n const value = dataKey === BarType.Buy ? insider?.buyAggregated : insider?.saleAggregated\r\n const isZeroValue = value === 0\r\n const valueToUse = isZeroValue ? null : dataKey === BarType.Buy ? value : -value\r\n\r\n return (\r\n \r\n {shortFormatDollar(isZeroValue ? null : value, { defaultValue: '—' })} \r\n {!isZeroValue && (\r\n \r\n ({tradeCount ?? 0} Trade{tradeCount === 1 ? '' : 's'})\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { endOfMonth, startOfMonth } from 'date-fns'\r\nimport { getInstrument } from 'finviz-charts/app/utils/chart'\r\nimport * as React from 'react'\r\nimport { ComposedChart } from 'recharts'\r\n\r\nimport { Quote, TIMEFRAME } from '../../../../../app/charts-lib'\r\nimport { getDate } from '../../../../../app/header/utils'\r\nimport { Bar } from '../../../../components/chart/Bar'\r\nimport { CartesianGrid } from '../../../../components/chart/CartesianGrid'\r\nimport { ChartBox } from '../../../../components/chart/ChartBox'\r\nimport { ChartWrapper } from '../../../../components/chart/ChartWrapper'\r\nimport { CursorBar } from '../../../../components/chart/Cursor'\r\nimport { Label } from '../../../../components/chart/Label'\r\nimport { Line } from '../../../../components/chart/Line'\r\nimport { Tooltip, TooltipRow } from '../../../../components/chart/Tooltip'\r\nimport { DateFormat, XAxis, dateAxisFormatter } from '../../../../components/chart/XAxis'\r\nimport { YAxis } from '../../../../components/chart/YAxis'\r\nimport { shortFormatDollar } from '../../../../util'\r\nimport { parseRouteInitData } from '../../../../util-routing'\r\nimport { QuoteContext } from '../../QuoteContext'\r\nimport { InsiderVolumeBar } from './InsiderVolumeBar'\r\nimport { BarType, CHART_HEIGHT } from './constants'\r\nimport { ChartData, TradingVolumeChartInit } from './types'\r\nimport { tooltipDataFormatter, tooltipTitleFormatter } from './utils'\r\n\r\nexport function InsiderTradingVolumeChart({ className }: { className?: string }) {\r\n const { ticker, index } = React.useContext(QuoteContext)\r\n const [chartData, setChartData] = React.useState([])\r\n\r\n const initData = React.useMemo(() => {\r\n const data = parseRouteInitData({\r\n elementId: `insider-init-data-${index}`,\r\n removeElement: false,\r\n })\r\n\r\n return {\r\n data,\r\n domain: data?.length\r\n ? [\r\n getDate(startOfMonth(getDate(data[0].date))).getTime(),\r\n getDate(endOfMonth(getDate(data[data.length - 1].date))).getTime(),\r\n ]\r\n : [],\r\n }\r\n }, [index])\r\n\r\n const hasInsiderTradingHistory = React.useMemo(\r\n () => initData.data?.some((x) => x.saleTransactionCount > 0 || x.buyTransactionCount > 0),\r\n [initData]\r\n )\r\n\r\n React.useEffect(() => {\r\n if (!hasInsiderTradingHistory) return\r\n\r\n async function fetchQuoteData() {\r\n if (!initData.data?.length) return\r\n\r\n // We need to convert domain timestamps to seconds because quote API requires timestamps in seconds\r\n // and also returned data have date in seconds, but we need to convert those data to milliseconds\r\n // because recharts requires timestamps in milliseconds\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe: TIMEFRAME.d,\r\n shouldUseCache: false,\r\n // Do not reuse quote, it might not have required data, and because this is standalone part\r\n // we can't easily consider requirements for data in other parts of the app where quote\r\n // with same timeframe might be created\r\n options: { dateFrom: initData.domain[0] / 1000, dateTo: initData.domain[1] / 1000 },\r\n })\r\n\r\n setChartData(\r\n quote.close.map((close, index) => ({\r\n date: quote.date[index] * 1000,\r\n close,\r\n insider: initData.data?.[index],\r\n }))\r\n )\r\n }\r\n\r\n fetchQuoteData()\r\n }, [initData, hasInsiderTradingHistory, index, ticker])\r\n\r\n if (!initData.data?.length || !hasInsiderTradingHistory) return null\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n dateAxisFormatter({ value, outFormat: DateFormat.MonthShort, breakOnYear: true })}\r\n />\r\n \r\n \r\n \r\n shortFormatDollar(value)} domain={['dataMin', 'auto']}>\r\n \r\n \r\n }\r\n >\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Heading } from '../../../components'\r\nimport { ChipSwitch, ChipSwitchButton } from '../../../components/ChipSwitch'\r\nimport { RedGreenText } from '../../../components/RedGreenText'\r\nimport { Table, TableAlign, TableBody, TableCell, TableRow } from '../../../components/Table'\r\nimport { FORMAT_PERCENT, formatNumber } from '../../../util'\r\nimport { parseRouteInitData } from '../../../util-routing'\r\nimport { QuoteContext } from '../QuoteContext'\r\n\r\ntype InstitutionalOwnershipInitData = {\r\n managersOwnership: Array | null\r\n fundsOwnership: Array | null\r\n}\r\n\r\ninterface InstitutionalOwnershipItem {\r\n investorId: string\r\n name: string\r\n percOwnership: number\r\n}\r\n\r\nenum InstitutionalOwnershipType {\r\n Managers,\r\n Funds,\r\n}\r\n\r\nfunction getInvestorLink(investorId: string, type: InstitutionalOwnershipType) {\r\n const view = type === InstitutionalOwnershipType.Funds ? 'fund-details' : 'manager-details'\r\n return `/insidertrading.ashx?view=${view}&investorId=${investorId}`\r\n}\r\n\r\nconst isRedesignEnabled = FinvizSettings.hasRedesignEnabled\r\n\r\nconst commonTdClassName = {\r\n '!px-0.5': !isRedesignEnabled,\r\n}\r\n\r\nexport function InstitutionalOwnership() {\r\n const { index } = React.useContext(QuoteContext)\r\n const { managersItems, hasManagersItems, fundsItems, hasFundsItems } = React.useMemo(() => {\r\n const initData = parseRouteInitData({\r\n elementId: `institutional-ownership-init-data-${index}`,\r\n removeElement: false,\r\n })\r\n\r\n const managersItems = initData?.managersOwnership ?? []\r\n const fundsItems = initData?.fundsOwnership ?? []\r\n\r\n return {\r\n managersItems,\r\n hasManagersItems: managersItems.length > 0,\r\n fundsItems,\r\n hasFundsItems: fundsItems.length > 0,\r\n }\r\n }, [index])\r\n\r\n const [institutionalOwnership, setInstitutionalOwnership] = React.useState(\r\n hasManagersItems ? InstitutionalOwnershipType.Managers : InstitutionalOwnershipType.Funds\r\n )\r\n const items = institutionalOwnership === InstitutionalOwnershipType.Managers ? managersItems : fundsItems\r\n\r\n return (\r\n \r\n \r\n \r\n Institutional Ownership\r\n \r\n \r\n {\r\n setInstitutionalOwnership(InstitutionalOwnershipType.Managers)\r\n }}\r\n >\r\n Managers\r\n \r\n {\r\n setInstitutionalOwnership(InstitutionalOwnershipType.Funds)\r\n }}\r\n >\r\n Funds\r\n \r\n \r\n \r\n
\r\n \r\n \r\n {items.map(({ investorId, name, percOwnership }) => (\r\n \r\n \r\n \r\n {name ?? '-'}\r\n \r\n \r\n \r\n \r\n {formatNumber(percOwnership, FORMAT_PERCENT)}\r\n \r\n \r\n \r\n ))}\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Portal, PortalProps } from '../../../components/Portal'\r\nimport { QuoteContext } from '../QuoteContext'\r\n\r\nexport function QuotePortal({ index, ...props }: PortalProps) {\r\n // We might need to offset the index if we want to skip the first ticker (eg. static image chart)\r\n const context = React.useContext(QuoteContext)\r\n const elementIndex = index ?? context.index\r\n\r\n return \r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { formatDate } from '../../../../app/header/utils'\r\nimport { RedGreenMultiline, RedGreenText } from '../../../components/RedGreenText'\r\nimport { formatNumber } from '../../../util'\r\n\r\nexport interface QuotePriceProps {\r\n title?: string\r\n date?: Date | null\r\n dateLabel?: string | null\r\n price: number\r\n changeUsd: number\r\n changePct: number\r\n}\r\n\r\nexport function QuotePrice({ title, date, dateLabel, price, changeUsd, changePct }: QuotePriceProps) {\r\n const fractions = !isNaN(price) && price < 1 ? 4 : 2\r\n const hasValue = changeUsd && Number.isFinite(changeUsd)\r\n\r\n return (\r\n
\r\n {title &&
{title}
}\r\n\r\n {(date || dateLabel) && (\r\n \r\n {dateLabel ?? formatDate(date, '', 'MMM dd')}\r\n {date && (\r\n <>\r\n {' '}\r\n {formatDate(date, '', 'hh:mmaa')} ET\r\n \r\n )}\r\n \r\n )}\r\n\r\n
\r\n {formatNumber(price, { defaultValue: '—', fractions })}\r\n
\r\n \r\n \r\n
Dollar change
\r\n {formatNumber(changeUsd, { showPlusSign: true, fractions })}\r\n
\r\n %}\r\n >\r\n
Percentage change
\r\n {formatNumber(changePct)}\r\n \r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import { useModelState } from '../../../../../app/charts-lib'\r\n\r\nconst CHANGE_UPATE_EVENTS = ['change', 'update']\r\nconst QUOTE_MODEL_CHANGE_EVENTS = [...CHANGE_UPATE_EVENTS, 'refetch', 'newerData']\r\n\r\nexport interface HeaderPricesContext {\r\n prevClose: number\r\n lastClose: number\r\n lastTime: number\r\n lastDate?: number\r\n afterClose: number\r\n afterTime: number\r\n}\r\n\r\nexport function useChartContextPrices(chartLayoutModel: any): HeaderPricesContext | null {\r\n const chartModel = useModelState(chartLayoutModel?.charts().first(), {\r\n watchProperties: ['quote'],\r\n listenOnEvents: CHANGE_UPATE_EVENTS,\r\n })\r\n const quoteModel = useModelState(chartModel?.quote() ?? null, {\r\n watchProperties: ['lastClose', 'prevClose', 'afterClose', 'afterTime'],\r\n listenOnEvents: QUOTE_MODEL_CHANGE_EVENTS,\r\n })\r\n\r\n if (!quoteModel) return null\r\n\r\n return {\r\n prevClose: quoteModel.prevClose,\r\n lastClose: quoteModel.lastClose,\r\n lastTime: quoteModel.lastTime,\r\n lastDate: quoteModel.lastDate,\r\n afterClose: quoteModel.afterClose,\r\n afterTime: quoteModel.afterTime,\r\n }\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport React from 'react'\r\n\r\nimport {\r\n Quote,\r\n useChartLayoutGlobalModelAsync,\r\n withCompleteLayoutModelInit,\r\n withQuotePolling,\r\n} from '../../../../../app/charts-lib'\r\nimport { formatDate, getDate } from '../../../../../app/header/utils'\r\nimport { PortalContext } from '../../../../components/Portal'\r\nimport { QuotePrice } from '../QuotePrice'\r\nimport { HeaderPricesContext, useChartContextPrices } from './hooks'\r\n\r\nexport function ChartContextQuoteHeader() {\r\n const { toggleStaticElement } = React.useContext(PortalContext)\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const data = useChartContextPrices(chartLayoutModel)\r\n const hasData = !!data\r\n\r\n React.useEffect(() => {\r\n if (hasData) toggleStaticElement(true)\r\n\r\n return () => toggleStaticElement(false)\r\n }, [hasData, toggleStaticElement])\r\n\r\n return \r\n}\r\n\r\ninterface QuoteHeaderWithManualInitProps {\r\n chartLayoutModel: any\r\n config: any\r\n}\r\n\r\nfunction ManualInitQuoteHeaderComponent({ chartLayoutModel, config }: QuoteHeaderWithManualInitProps) {\r\n const { toggleStaticElement } = React.useContext(PortalContext)\r\n const data = useChartContextPrices(chartLayoutModel)\r\n\r\n /**\r\n * We need to instantiate layout model in order to use quote refetch on page\r\n * without an actual chart (options.) We also need to manually create a chart model\r\n *\r\n * It is then correctly caught in `useChartContextPrices`\r\n */\r\n React.useEffect(() => {\r\n async function fetchAndMapInitialQuote() {\r\n for (const chartConfig of config.charts) {\r\n const modelProperties = Object.assign({}, chartConfig)\r\n\r\n modelProperties.chart_layout = chartLayoutModel\r\n delete modelProperties.panes\r\n if (modelProperties.refreshData == null) {\r\n modelProperties.refreshData = true\r\n }\r\n chartLayoutModel.charts().create(modelProperties)\r\n }\r\n\r\n const chart = chartLayoutModel.charts().first()\r\n\r\n const quote = await Quote.get({\r\n ticker: chart.ticker,\r\n instrument: chart.instrument,\r\n timeframe: chart.timeframe,\r\n options: { barsCount: 0 },\r\n })\r\n\r\n chart.updateAttributes({ quote })\r\n toggleStaticElement()\r\n }\r\n\r\n fetchAndMapInitialQuote()\r\n }, [chartLayoutModel, config.charts, toggleStaticElement])\r\n\r\n return \r\n}\r\n\r\nexport const ManualInitQuoteHeader = withCompleteLayoutModelInit(withQuotePolling(ManualInitQuoteHeaderComponent))\r\n\r\nexport function QuoteHeaderContent({ data }: { data: HeaderPricesContext | null }) {\r\n if (!data) return null\r\n\r\n const isChange = Number.isFinite(data.prevClose)\r\n const isAfterChange = Number.isFinite(data.afterClose) && data.afterClose !== data.lastClose\r\n const lastTime = data.lastTime ? getDate(data.lastTime * 1000) : null\r\n const lastDate = !lastTime && data.lastDate ? formatDate(data.lastDate, 'yyyyMMdd', 'MMM dd, yyyy') : null\r\n const afterDate = data.afterTime ? getDate(data.afterTime * 1000) : null\r\n\r\n let afterhoursTitle\r\n if (lastTime && afterDate) {\r\n if (dateFns.isBefore(afterDate, lastTime)) afterhoursTitle = 'Premarket'\r\n else afterhoursTitle = 'Aftermarket'\r\n }\r\n\r\n return (\r\n <>\r\n {isChange && (\r\n \r\n )}\r\n {isAfterChange && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as d3 from 'd3'\r\nimport { Component, RefObject, createRef } from 'react'\r\n\r\nexport interface Bar {\r\n name: string\r\n value: number\r\n}\r\n\r\ninterface BarChartProps {\r\n title?: string\r\n data: Bar[]\r\n width?: number\r\n height?: number\r\n valueFormatter?: (value: number) => string\r\n xAxisRotate?: boolean\r\n marginRight?: number\r\n className?: string\r\n}\r\n\r\nexport default class BarChart extends Component {\r\n svgRef: RefObject = createRef()\r\n\r\n declare _prevData: Bar[]\r\n\r\n componentDidMount() {\r\n this.renderChart()\r\n }\r\n\r\n componentDidUpdate() {\r\n this.renderChart()\r\n }\r\n\r\n renderChart() {\r\n const { data, title } = this.props\r\n if (data === this._prevData) {\r\n return\r\n }\r\n this._prevData = data\r\n this.svgRef.current!.innerHTML = ''\r\n\r\n const xAxisRotate = this.props.xAxisRotate === true\r\n\r\n const margin = {\r\n top: title ? 20 : 10,\r\n right: this.props.marginRight || 60,\r\n bottom: xAxisRotate ? 70 : 20,\r\n left: 15,\r\n }\r\n const totalWidth = this.props.width || 440\r\n const totalHeight = this.props.height || 330\r\n const width = totalWidth - margin.left - margin.right\r\n const height = totalHeight - margin.top - margin.bottom\r\n\r\n const x = d3\r\n .scaleBand()\r\n .domain(data.map((d) => d.name))\r\n .rangeRound([0, width])\r\n .padding(0.1)\r\n\r\n let min = d3.min(data, (d: Bar) => d.value)!\r\n if (min < 0) {\r\n min = d3.min(data, (d: Bar) => Math.min(d.value, -d.value))!\r\n } else {\r\n min = 0\r\n }\r\n\r\n const y = d3\r\n .scaleLinear()\r\n .range([height, 0])\r\n .domain([min, d3.max(data, (d: Bar) => Math.abs(d.value))!])\r\n .nice()\r\n const yFormat = this.props.valueFormatter ? this.props.valueFormatter : y.tickFormat()\r\n\r\n const svg = d3\r\n .select(this.svgRef.current)\r\n .property('value', [])\r\n .append('g')\r\n .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')\r\n\r\n const xAxis = d3.axisBottom(x)\r\n const yAxis = d3.axisRight(y).ticks(height > 200 ? 10 : 5)\r\n\r\n const makeYLines = () => d3.axisLeft(y)\r\n // @ts-expect-error - tickFormat arg can be any string\r\n svg.append('g').attr('class', 'grid').call(makeYLines().tickSize(-width).tickSizeOuter(0).tickFormat(''))\r\n\r\n svg\r\n .append('g')\r\n .attr('class', 'x-axis axis')\r\n .attr('transform', 'translate(0,' + height + ')')\r\n .call(xAxis)\r\n\r\n svg\r\n .selectAll('.x-axis text')\r\n .style('text-anchor', xAxisRotate ? 'end' : 'middle')\r\n .attr('dx', xAxisRotate ? '-.8em' : 0)\r\n .attr('dy', xAxisRotate ? '.15em' : '0.8em')\r\n .attr('transform', 'rotate(' + (xAxisRotate ? -65 : 0) + ')')\r\n\r\n svg\r\n .append('g')\r\n .attr('class', 'y-axis axis')\r\n .attr('transform', 'translate(' + width + ', 0)')\r\n .call(yAxis)\r\n\r\n if (title) {\r\n svg\r\n .append('text')\r\n .attr('class', 'bar-chart-title')\r\n .attr('x', 4)\r\n .attr('y', -5)\r\n .attr('text-anchor', 'start')\r\n .text(title)\r\n }\r\n\r\n const getHeight = (d: Bar) => {\r\n let height = Math.abs(y(d.value ?? 0) - y(0))\r\n if (d.value > 0 || d.value < 0) {\r\n height = Math.max(height, 0.5)\r\n }\r\n return height\r\n }\r\n const isOutside = (height: number) => height < 14\r\n const bars = svg.selectAll('.bar').data(data)\r\n bars\r\n .enter()\r\n .append('rect')\r\n .attr('class', function (d: Bar) {\r\n return 'bar bar--' + (d.value < 0 ? 'negative' : 'positive')\r\n })\r\n .attr('x', (d: Bar) => x(d.name)!)\r\n .attr('y', (d: Bar) => y(Math.max(0, d.value)))\r\n .attr('height', getHeight)\r\n .attr('width', x.bandwidth())\r\n .attr('ry', FinvizSettings?.hasRedesignEnabled ? 2 : 0)\r\n\r\n svg\r\n .selectAll('.bar-label')\r\n .data(data)\r\n .enter()\r\n .append('text')\r\n .attr('class', 'divergence')\r\n .attr('x', (d: Bar) => x(d.name)! + x.bandwidth() / 2)\r\n .attr('y', (d: Bar) => {\r\n const height = getHeight(d)\r\n const outside = isOutside(height)\r\n if (d.value < 0) {\r\n return y(Math.max(0, d.value)) + height + (outside ? 12 : -4)\r\n }\r\n return y(Math.max(0, d.value)) + (outside ? -4 : 12)\r\n })\r\n .attr('fill', (d: Bar) => (!FinvizSettings.hasDarkTheme && isOutside(getHeight(d)) ? 'black' : 'white'))\r\n .attr('text-anchor', 'middle')\r\n .attr('font-size', '10px')\r\n .text((d: Bar) => (d.value !== null ? yFormat(d.value) : ''))\r\n\r\n this.svgRef.current!.style.width = totalWidth + 'px'\r\n this.svgRef.current!.style.height = totalHeight + 'px'\r\n }\r\n\r\n render() {\r\n return \r\n }\r\n}\r\n","import { DEFAULT_SETTINGS_FOR_EARNINGS_DATA } from '../../../earnings-common/constants'\r\nimport { EarningsDataSettings, EarningsTimeframeEnum } from '../../../earnings-common/types'\r\n\r\nexport const SETTINGS_COOKIE_KEY = 'quoteStatementsTableSettings'\r\n\r\nexport const DEFAULT_SETTINGS = {\r\n ...DEFAULT_SETTINGS_FOR_EARNINGS_DATA,\r\n timeframe: EarningsTimeframeEnum.annual,\r\n}\r\n\r\nexport type StatementsType = EarningsDataSettings & {\r\n timeframe: EarningsTimeframeEnum\r\n}\r\n\r\nexport enum StatementsSourceEnum {\r\n Reuters = 'R',\r\n FactSet = 'F',\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as d3 from 'd3'\r\nimport { isRedesignEnabled } from 'finviz-charts/app/utils'\r\nimport { decodeQueryString } from 'finviz-charts/app/utils/query_string'\r\nimport * as React from 'react'\r\nimport { Component, RefObject, createRef } from 'react'\r\n\r\nimport { AdTag, getInvestingChannelPage } from '../../../../../app/shared/components/Ads'\r\nimport { Icon } from '../../../../components'\r\nimport { RedGreenText } from '../../../../components/RedGreenText'\r\nimport { FinancialsTableContextProvider, useFinancialsTableContext } from '../../../../components/financials-table'\r\nimport { getValue, setValue } from '../../../../services/local-storage'\r\nimport { shortFormatNumber } from '../../../../util'\r\nimport { TempRenameSettingsProperties } from '../../../earnings-common/TempRenameSettingsProperties'\r\nimport WidgetSettingsSection from '../../../earnings-common/WidgetSettingsSection'\r\nimport { EarningsDataEnum, EarningsTimeframeEnum } from '../../../earnings-common/types'\r\nimport BarChartBig from '../barChart'\r\nimport { DEFAULT_SETTINGS, SETTINGS_COOKIE_KEY, StatementsSourceEnum, StatementsType } from './constants'\r\n\r\ninterface Bar {\r\n name: string\r\n value: number\r\n}\r\n\r\ninterface BarChartProps {\r\n data: Bar[]\r\n}\r\n\r\nclass BarChart extends Component {\r\n svgRef: RefObject\r\n\r\n constructor(props: BarChartProps) {\r\n super(props)\r\n this.svgRef = createRef()\r\n }\r\n\r\n componentDidMount() {\r\n this.renderChart()\r\n }\r\n\r\n componentDidUpdate() {\r\n this.renderChart()\r\n }\r\n\r\n renderChart() {\r\n const data = this.props.data\r\n\r\n const barWidth = 3\r\n const width = data.length * (barWidth + 1)\r\n const height = 16\r\n\r\n const x = d3\r\n .scaleBand()\r\n .domain(data.map((d) => d.name))\r\n .range([0, width])\r\n\r\n let min = d3.min(data, (d: Bar) => d.value)!\r\n if (min < 0) {\r\n min = d3.min(data, (d: Bar) => Math.min(d.value, -d.value))!\r\n } else {\r\n min = 0\r\n }\r\n\r\n const y = d3\r\n .scaleLinear()\r\n .range([height, 0])\r\n .domain([min, d3.max(data, (d: Bar) => Math.abs(d.value))] as [number, number])\r\n .nice()\r\n .unknown(height / 2)\r\n\r\n const svg = d3.select(this.svgRef.current).property('value', [])\r\n\r\n const bars = svg.selectAll('.bar').data(data)\r\n bars\r\n .enter()\r\n .append('rect')\r\n .attr('class', function (d: Bar) {\r\n return 'bar bar--' + (d.value < 0 ? 'negative' : 'positive')\r\n })\r\n .attr('x', function (d: Bar) {\r\n return x(d.name)!\r\n })\r\n .attr('y', function (d: Bar) {\r\n return y(Math.max(0, d.value))\r\n })\r\n .attr('height', function (d: Bar) {\r\n let height = Math.abs(y(d.value) - y(0))\r\n if (d.value > 0 || d.value < 0) {\r\n height = Math.max(height, 0.5)\r\n }\r\n return height\r\n })\r\n .attr('width', barWidth)\r\n bars\r\n .transition()\r\n .attr('class', function (d: Bar) {\r\n return 'bar bar--' + (d.value < 0 ? 'negative' : 'positive')\r\n })\r\n .attr('x', function (d: Bar) {\r\n return x(d.name)!\r\n })\r\n .attr('y', function (d: Bar) {\r\n return y(Math.max(0, d.value))\r\n })\r\n .attr('height', function (d: Bar) {\r\n let height = Math.abs(y(d.value) - y(0))\r\n if (d.value > 0 || d.value < 0) {\r\n height = Math.max(height, 0.5)\r\n }\r\n return height\r\n })\r\n .attr('width', barWidth)\r\n bars.exit().remove()\r\n\r\n this.svgRef.current!.style.width = width + 'px'\r\n this.svgRef.current!.style.height = height + 'px'\r\n }\r\n\r\n render() {\r\n return \r\n }\r\n}\r\n\r\nfunction EliteHoverAd() {\r\n return (\r\n
\r\n
\r\n \r\n

Upgrade your FINVIZ experience

\r\n

\r\n Join thousands of traders who make more informed decisions with our premium features. Real-time\r\n quotes, advanced visualizations, historical statements, and much more.\r\n

\r\n \r\n Learn more\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\ninterface BarChartWrapperProps {\r\n data: Bar[]\r\n}\r\n\r\nclass BarChartWrapper extends Component {\r\n state = {\r\n hover: false,\r\n }\r\n\r\n render() {\r\n return (\r\n
\r\n \r\n x.value !== null)}>\r\n \r\n \r\n \r\n {FinvizSettings.hasUserPremium ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n
\r\n )\r\n }\r\n}\r\n\r\nconst DEFAULT_SOURCE = StatementsSourceEnum.FactSet\r\n\r\nconst _getDefaultSource = (): StatementsSourceEnum => {\r\n if (!FinvizSettings.hasUserPremium) {\r\n return DEFAULT_SOURCE\r\n }\r\n\r\n return getValue('statements-source', DEFAULT_SOURCE) === StatementsSourceEnum.Reuters\r\n ? StatementsSourceEnum.Reuters\r\n : StatementsSourceEnum.FactSet\r\n}\r\n\r\ninterface StatementsState {\r\n source: StatementsSourceEnum\r\n sheet: string\r\n currency: string | null\r\n data: Record | null\r\n}\r\n\r\nfunction StatementsComponent() {\r\n const { settings } = useFinancialsTableContext()\r\n const pageRef = React.useRef(getInvestingChannelPage())\r\n\r\n const [state, setState] = React.useState({\r\n source: _getDefaultSource(),\r\n sheet: 'I',\r\n currency: null,\r\n data: null,\r\n })\r\n\r\n const timeframe = settings.timeframe === EarningsTimeframeEnum.quarterly ? 'Q' : 'A'\r\n\r\n const { data } = state\r\n const hasData = data && !data.error && Object.keys(data).length > 0\r\n const hasRedesignEnabled = FinvizSettings?.hasRedesignEnabled\r\n\r\n const _fetch = async () => {\r\n const { source, sheet } = state\r\n const { t } = decodeQueryString()\r\n\r\n try {\r\n const response = await fetch(`/api/statement.ashx?t=${t}&so=${source}&s=${sheet}${timeframe}`)\r\n const json = await response.json()\r\n\r\n setState({\r\n ...state,\r\n currency: json.currency,\r\n data: json.error ? json : json.data,\r\n })\r\n } catch {}\r\n }\r\n\r\n React.useEffect(() => {\r\n pageRef.current = getInvestingChannelPage()\r\n pageRef.current?.create()\r\n\r\n return () => {\r\n pageRef.current?.destroy()\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n _fetch()\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [state.sheet, state.source, timeframe])\r\n\r\n const _renderSheetLink = (id: string, text: string) => (\r\n // eslint-disable-next-line jsx-a11y/anchor-is-valid\r\n {\r\n e.preventDefault()\r\n setState({\r\n ...state,\r\n sheet: id,\r\n })\r\n }}\r\n >\r\n {text}\r\n \r\n )\r\n\r\n if (data === null) {\r\n return null\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n {FinvizSettings.hasUserPremium && (\r\n // TODO fix classname when css mixins removal is merged\r\n {\r\n e.preventDefault()\r\n const source =\r\n e.target.value === StatementsSourceEnum.Reuters\r\n ? StatementsSourceEnum.Reuters\r\n : StatementsSourceEnum.FactSet\r\n setState({ ...state, source })\r\n setValue('statements-source', source, DEFAULT_SOURCE, false)\r\n }}\r\n >\r\n \r\n \r\n \r\n )}\r\n {FinvizSettings.hasUserPremium && <>   }\r\n\r\n \r\n {_renderSheetLink('I', 'Income Statement')} {' '}\r\n {_renderSheetLink('B', 'Balance Sheet')} {' '}\r\n {_renderSheetLink('C', 'Cash Flow')}\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n {hasData && }\r\n {!hasData && (\r\n \r\n \r\n \r\n \r\n The statement is not available. Try switching between FactSet-Reuters source.\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction Statements() {\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nfunction isChartable(label: string) {\r\n switch (label) {\r\n case 'Period':\r\n case 'Period End Date':\r\n case 'Period Length':\r\n return false\r\n }\r\n\r\n return true\r\n}\r\n\r\nfunction parseData(data: Record, skipFirst: boolean) {\r\n const parsed: any = {}\r\n Object.keys(data).forEach((key) => {\r\n parsed[key] = data[key]\r\n .map((value, index) => {\r\n if (isChartable(key)) {\r\n let parsedValue\r\n if (value === '') {\r\n parsedValue = null\r\n } else {\r\n parsedValue = parseFloat(value.replace(/,/g, ''))\r\n }\r\n return {\r\n name: data['Period End Date'][index],\r\n value: parsedValue,\r\n }\r\n }\r\n return null\r\n })\r\n .slice(skipFirst ? 1 : 0)\r\n })\r\n\r\n return parsed as Record>\r\n}\r\n\r\nfunction getIsHighlightRow(label: string, source: StatementsSourceEnum) {\r\n const periodLabel = source === StatementsSourceEnum.FactSet ? 'Period' : 'Period End Date'\r\n switch (label) {\r\n case periodLabel:\r\n case 'Total Revenue':\r\n case 'Total Premiums Earned':\r\n case 'Interest Income':\r\n case 'Gross Profit':\r\n case 'Total Operating Expense':\r\n case 'Operating Income':\r\n case 'Net Income Before Taxes':\r\n case 'Net Income':\r\n case 'Total Current Assets':\r\n case 'Total Assets':\r\n case 'Total Current Liabilities':\r\n case 'Total Liabilities':\r\n case 'Total Equity':\r\n case 'Total Liabilities and Equity':\r\n case 'Cash from Operating Activities':\r\n case 'Cash from Investing Activities':\r\n case 'Cash from Financing Activities':\r\n case 'Net Change in Cash':\r\n case 'Price To Earnings Ratio':\r\n case 'Price to Book Ratio':\r\n case 'Price to Free Cash Flow':\r\n case 'Cash & Short Term Investments':\r\n return true\r\n }\r\n\r\n return false\r\n}\r\n\r\ntype StatementsTableProps = Pick\r\n\r\nfunction StatementsTable({ source, data, currency }: StatementsTableProps) {\r\n const { settings } = useFinancialsTableContext()\r\n const skipFirst = [data?.['Period End Date'][0], data?.Period?.[0]].includes('TTM')\r\n const parsedData = data ? parseData(data, skipFirst) : null\r\n const isQuarterlyTimeframe = settings.timeframe === EarningsTimeframeEnum.quarterly\r\n\r\n const yoyData = React.useMemo(\r\n () =>\r\n parsedData\r\n ? Object.entries(parsedData).reduce<\r\n Record<\r\n string,\r\n {\r\n change: Array\r\n changePct: Array\r\n yoyOnQoqChange: Array\r\n yoyOnQoqChangePct: Array\r\n }\r\n >\r\n >((acc, [key, values]) => {\r\n if (!isChartable(key)) {\r\n return acc\r\n }\r\n const yoyData: Array<{\r\n change: number | null\r\n changePct: number | null\r\n yoyOnQoqChange: number | null\r\n yoyOnQoqChangePct: number | null\r\n }> = []\r\n let prevValue: number | null = null\r\n\r\n // values are in DESC order\r\n const reversedValues = [...values].reverse()\r\n\r\n reversedValues.forEach(({ value }, index) => {\r\n const isValidValue = Number.isFinite(value)\r\n const isValidPrevValue = Number.isFinite(prevValue)\r\n\r\n let yoyOnQoqChange = null\r\n let yoyOnQoqChangePct = null\r\n let change = null\r\n let changePct = null\r\n\r\n if (isValidValue && isValidPrevValue) {\r\n change = value - prevValue!\r\n changePct = prevValue !== 0 ? (change / Math.abs(prevValue!)) * 100 : null\r\n }\r\n\r\n if (isQuarterlyTimeframe) {\r\n const prevQt = reversedValues[index - 4]\r\n yoyOnQoqChange = isValidValue && Number.isFinite(prevQt?.value) ? value - prevQt!.value : null\r\n yoyOnQoqChangePct =\r\n prevQt?.value && yoyOnQoqChange !== null ? (yoyOnQoqChange / Math.abs(prevQt.value)) * 100 : null\r\n }\r\n\r\n yoyData.push({\r\n change,\r\n changePct,\r\n yoyOnQoqChange,\r\n yoyOnQoqChangePct,\r\n })\r\n\r\n prevValue = value\r\n })\r\n\r\n const reversedYoyData = [...yoyData].reverse()\r\n return {\r\n ...acc,\r\n [key]: {\r\n change: reversedYoyData.map(({ change }) => change),\r\n changePct: reversedYoyData.map(({ changePct }) => changePct),\r\n yoyOnQoqChange: reversedYoyData.map(({ yoyOnQoqChange }) => yoyOnQoqChange),\r\n yoyOnQoqChangePct: reversedYoyData.map(({ yoyOnQoqChangePct }) => yoyOnQoqChangePct),\r\n },\r\n }\r\n }, {})\r\n : {},\r\n [parsedData, isQuarterlyTimeframe]\r\n )\r\n\r\n if (!data || !parsedData) return null\r\n\r\n const hasRedesignEnabled = FinvizSettings?.hasRedesignEnabled\r\n const cellClass = classnames('align-top', {\r\n 'snapshot-td2 h-6 !leading-4 !pt-[4px]': !hasRedesignEnabled,\r\n })\r\n let adRowIndexStart = !hasRedesignEnabled && data['Period Length'] ? 2 : 1\r\n adRowIndexStart += data['Period'] ? 1 : 0\r\n const yoyGrowthLabel = isQuarterlyTimeframe ? 'QoQ Growth' : 'YoY Growth'\r\n\r\n return (\r\n <>\r\n \r\n \r\n {Object.keys(data).map((key, rowIndex) => {\r\n const hasYoYData = !!yoyData[key] && data[key].some((value) => value)\r\n const isHighlightRow = getIsHighlightRow(key, source)\r\n return (\r\n \r\n \r\n {key}\r\n {hasYoYData && isQuarterlyTimeframe && settings[EarningsDataEnum.extraChangeYoYonQoQ] && (\r\n <>\r\n
\r\n YoY Growth\r\n \r\n )}\r\n {hasYoYData && isQuarterlyTimeframe && settings[EarningsDataEnum.extraChangePctYoYonQoQ] && (\r\n <>\r\n
\r\n YoY Growth %\r\n \r\n )}\r\n {hasYoYData && settings[EarningsDataEnum.mainChange] && (\r\n <>\r\n
\r\n {yoyGrowthLabel}\r\n \r\n )}\r\n {hasYoYData && settings[EarningsDataEnum.mainChangePct] && (\r\n <>\r\n
\r\n {`${yoyGrowthLabel} %`}\r\n \r\n )}\r\n \r\n \r\n {isChartable(key) && }\r\n \r\n {data[key].slice(0, 8).map((value, index) => {\r\n const changeIndex = skipFirst ? index - 1 : index\r\n const yoyChangeValue = yoyData[key]?.change[changeIndex] ?? null\r\n const yoyChangePctValue = yoyData[key]?.changePct[changeIndex] ?? null\r\n const yoyOnQoqChangeValue = yoyData[key]?.yoyOnQoqChange[changeIndex] ?? null\r\n const yoyOnQoqChangePctValue = yoyData[key]?.yoyOnQoqChangePct[changeIndex] ?? null\r\n\r\n let formattedValue = value === '' ? null : value\r\n if (source === StatementsSourceEnum.FactSet && key === 'Period') {\r\n if (isQuarterlyTimeframe && value.includes('Q')) {\r\n const [year, quarterNumber] = value.split('Q')\r\n formattedValue = `Q${quarterNumber} ${year}`\r\n } else if (value.includes('FY')) {\r\n const [year] = value.split('FY')\r\n formattedValue = `FY ${year}`\r\n }\r\n }\r\n\r\n if (!FinvizSettings.hasUserPremium) {\r\n if (rowIndex === adRowIndexStart && index === 3) {\r\n return (\r\n \r\n \r\n \r\n

Upgrade your FINVIZ experience

\r\n

\r\n Join thousands of traders who make more informed decisions with our premium\r\n features. Real-time quotes, advanced visualizations, historical statements, and much\r\n more.\r\n

\r\n \r\n Learn more\r\n \r\n \r\n )\r\n }\r\n if (\r\n index > 2 &&\r\n ((hasRedesignEnabled && !['Period End Date', 'Period'].includes(key)) || isChartable(key))\r\n ) {\r\n return null\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n {Number.isFinite(formattedValue) || formattedValue === null\r\n ? shortFormatNumber(formattedValue as number | null, { defaultValue: '—' })\r\n : formattedValue}\r\n \r\n {hasYoYData && isQuarterlyTimeframe && settings[EarningsDataEnum.extraChangeYoYonQoQ] && (\r\n <>\r\n
\r\n \r\n {shortFormatNumber(yoyOnQoqChangeValue, { defaultValue: '—' })}\r\n \r\n \r\n )}\r\n {hasYoYData && isQuarterlyTimeframe && settings[EarningsDataEnum.extraChangePctYoYonQoQ] && (\r\n <>\r\n
\r\n \r\n {yoyOnQoqChangePctValue?.toFixed(2) ?? '—'}\r\n \r\n \r\n )}\r\n {hasYoYData && settings[EarningsDataEnum.mainChange] && (\r\n <>\r\n
\r\n \r\n {shortFormatNumber(yoyChangeValue, { defaultValue: '—' })}\r\n \r\n \r\n )}\r\n {hasYoYData && settings[EarningsDataEnum.mainChangePct] && (\r\n <>\r\n
\r\n \r\n {yoyChangePctValue?.toFixed(2) ?? '—'}\r\n \r\n \r\n )}\r\n \r\n )\r\n })}\r\n \r\n )\r\n })}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
values in Millions, {currency}
\r\n \r\n )\r\n}\r\n\r\nexport default Statements\r\n","import classNames from 'classnames'\r\nimport { isRedesignEnabled } from 'finviz-charts/app/utils'\r\nimport React from 'react'\r\n\r\nimport { ChartTypesSelect, StockDetailTimeframeBar } from '../../../../app/charts-lib'\r\nimport { Button } from '../../../components'\r\nimport { SpecificChartFunctionality } from '../../../constants/common'\r\nimport { QuoteContext } from '../QuoteContext'\r\n\r\ninterface Props {\r\n isStockDetailUpdating: boolean\r\n}\r\n\r\nconst hasRedesign = isRedesignEnabled()\r\nconst isPremium = window.FinvizSettings.hasUserPremium\r\n\r\nexport function StaticChartHeader({ isStockDetailUpdating }: Props) {\r\n const { index, ticker, period } = React.useContext(QuoteContext)\r\n\r\n return (\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n Share\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { round } from '../../../../app/backtest/utils'\r\nimport { parseRouteInitData } from '../../../util-routing'\r\nimport { QuoteContext } from '../QuoteContext'\r\nimport BarChart, { Bar } from './barChart'\r\n\r\nfunction convertData(endYear: number, values: any[]) {\r\n return values.map((value, index) => ({ name: endYear - index, value })).reverse() as unknown as Bar[]\r\n}\r\n\r\ninterface FAChartProps {\r\n year: number\r\n data: number[]\r\n title: string\r\n smallRoundPlaces?: number\r\n largeRoundPlaces?: number\r\n smallScale?: number\r\n largeScale?: number\r\n smallTitleSufix?: string\r\n largeTitleSufix?: string\r\n}\r\n\r\nfunction FAChart({\r\n year,\r\n data,\r\n title,\r\n smallRoundPlaces = 2,\r\n largeRoundPlaces = 0,\r\n smallScale = 1,\r\n largeScale = 1,\r\n smallTitleSufix = '',\r\n largeTitleSufix = '',\r\n}: FAChartProps) {\r\n const range = Math.max(...data.map((value) => Math.abs(value)).filter(Number))\r\n const isLarge = Math.abs(range) >= 1000\r\n const scale = isLarge ? largeScale : smallScale\r\n const values = data.map((value) => {\r\n const rounded = round(scale * value, isLarge ? largeRoundPlaces : smallRoundPlaces)\r\n return value == null || Number.isNaN(rounded) ? null : rounded\r\n })\r\n\r\n return (\r\n round(value, isLarge ? largeRoundPlaces : smallRoundPlaces)}\r\n width={280}\r\n height={150}\r\n marginRight={37}\r\n className=\"is-fa\"\r\n />\r\n )\r\n}\r\n\r\nexport default function FundamentalCharts() {\r\n const { index } = React.useContext(QuoteContext)\r\n\r\n const routeData = React.useMemo(\r\n () =>\r\n parseRouteInitData<{ year: number; values: Array }>({\r\n elementId: `fa-init-data-${index}`,\r\n removeElement: false,\r\n }),\r\n [index]\r\n )\r\n\r\n if (!routeData) return null\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","export const etfHoldingsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"etf-holdings-widget\" */ './module-entry'),\r\n cacheKey: 'etf-holdings-widget',\r\n}\r\n","import { withNotificationContext } from '../../../components/notification'\r\nimport { Spinner } from '../../../components/spinner'\r\nimport { useAsyncModule } from '../../../services/async-modules-utils'\r\nimport { etfHoldingsAsyncModule } from './async-modules'\r\n\r\nfunction LoadingFallback() {\r\n const widgetClass =\r\n 'ml-3 mt-3 flex max-h-85 min-h-85 min-w-152 max-w-175 shrink grow basis-0 rounded-md border border-primary justify-center items-center'\r\n return (\r\n
\r\n {Array.from(Array(2)).map((_, index) => (\r\n
\r\n \r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n\r\nfunction ETFHoldings() {\r\n const [etfHoldingsModule] = useAsyncModule({\r\n ...etfHoldingsAsyncModule,\r\n shouldLoadModule: true,\r\n errorSeverity: 'high',\r\n })\r\n const ETFHoldingsComponent = etfHoldingsModule?.ETFHoldings\r\n return ETFHoldingsComponent ? : \r\n}\r\n\r\nexport default withNotificationContext(ETFHoldings)\r\n","import * as React from 'react'\r\n\r\nimport { QuoteNavigation } from './Navigation'\r\nimport { QuoteContext } from './QuoteContext'\r\nimport { Perf } from './components/ComparePerformance'\r\nimport { FundFlowsChart } from './components/FundFlowsChart'\r\nimport { InsiderTradingVolumeChart } from './components/InsiderTradingChart'\r\nimport { InstitutionalOwnership } from './components/InstitutionalOwnership'\r\nimport { QuotePortal } from './components/Portal'\r\nimport { ChartContextQuoteHeader, ManualInitQuoteHeader } from './components/Price'\r\nimport { QuoteChart } from './components/QuoteChart'\r\nimport Statements from './components/Statements/statements'\r\nimport { StaticChartHeader } from './components/StaticChartHeader'\r\nimport FundamentalCharts from './components/fundamentalCharts'\r\nimport EtfHoldings from './etf-holdings'\r\nimport { QuoteSubview, QuoteView } from './types'\r\n\r\nconst PRICE_STATIC = document.querySelectorAll('.js-quote-price-static')\r\nconst PRICE_ROOTS = document.querySelectorAll('.js-quote-price-root')\r\n\r\nconst NAVIGATION_STATIC = document.querySelectorAll('.js-quote-navigation-static')\r\nconst NAVIGATION_ROOTS = document.querySelectorAll('.js-quote-navigation-root')\r\n\r\nconst STATIC_CHART_HEADER_ROOTS = document.querySelectorAll('.quote-menu')\r\n\r\nconst FUNDAMENTAL_CHARTS_ROOTS = document.querySelectorAll('.js-quote-fa')\r\n\r\nconst STATEMENTS_ROOTS = document.querySelectorAll('#statements')\r\n\r\nconst INSIDER_CHART_ROOTS = document.querySelectorAll('.insider-trading-chart')\r\n\r\nconst MANAGERS_AND_FUNDS_ROOTS = document.querySelectorAll('.managers-and-funds')\r\n\r\nexport function QuotePortalComponents({ isStockDetailUpdating }: { isStockDetailUpdating: boolean }) {\r\n const context = React.useContext(QuoteContext)\r\n\r\n const ETF_HOLDINGS_STATIC = document.querySelector(`.js-etf-holdings-static-${context.ticker}`)\r\n const ETF_HOLDINGS_ROOTS = document.querySelector(`.js-etf-holdings-root-${context.ticker}`)\r\n const isETF = !!ETF_HOLDINGS_ROOTS && !!ETF_HOLDINGS_STATIC\r\n\r\n return (\r\n <>\r\n {context.index === 0 && !window.isIdeaNotFoundPage && (\r\n \r\n \r\n {context.view === QuoteView.ChartDetail || context.subview === QuoteSubview.ShortInterest ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n {context.view === QuoteView.ChartDetail && (\r\n \r\n {context.index === 0 && }\r\n\r\n {context.index > 0 && (\r\n \r\n \r\n \r\n )}\r\n \r\n )}\r\n\r\n {context.subview === QuoteSubview.ComparePerf && window.FinvizQuoteTickers && context.index === 0 && }\r\n\r\n {isETF && (\r\n \r\n <>\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { decodeQueryString } from '../../../../app/queryString'\r\n\r\nconst CORRELATION_LINKS_CONTAINER_SELECTOR = 'js-quote-correlation-links-container'\r\nconst MULTITICKER_CHART_ELEMENT_SELECTOR = 'js-multi-ticker-chart'\r\nconst SET_SEARCH_EXT_SELECTOR = 'js-set-search-ext-argument'\r\n\r\nexport function useStockDetailUpdater() {\r\n const location = useLocation()\r\n const { p, ty } = decodeQueryString(location.search)\r\n const isInitializedRef = React.useRef(false)\r\n const [isStockDetailUpdating, setIsStockDetailUpdating] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const multiTickerElements = document.getElementsByClassName(MULTITICKER_CHART_ELEMENT_SELECTOR)\r\n const correlationElements = document.getElementsByClassName(CORRELATION_LINKS_CONTAINER_SELECTOR)\r\n const abortController = new AbortController()\r\n\r\n if (isInitializedRef.current) {\r\n if (multiTickerElements.length > 0) setIsStockDetailUpdating(true)\r\n\r\n fetch(location.pathname + location.search, { signal: abortController.signal })\r\n .then((response) => response.text())\r\n .then((text) => {\r\n const virtualDOM = new DOMParser().parseFromString(text, 'text/html')\r\n\r\n // Multiticker update\r\n if (multiTickerElements.length > 0) {\r\n const multiTickerHtmlElements = Array.from(multiTickerElements) as HTMLImageElement[]\r\n const newMultiTickerHtmlElements = Array.from(\r\n virtualDOM.getElementsByClassName(MULTITICKER_CHART_ELEMENT_SELECTOR)\r\n ) as HTMLImageElement[]\r\n\r\n if (newMultiTickerHtmlElements?.length === multiTickerHtmlElements.length) {\r\n multiTickerHtmlElements.forEach((element, index) => {\r\n element.onload = () => setIsStockDetailUpdating(false)\r\n element.src = newMultiTickerHtmlElements[index].src\r\n })\r\n } else {\r\n setIsStockDetailUpdating(false)\r\n }\r\n }\r\n\r\n // Correlation update\r\n const correlationLinksTableCellHtmlElements = Array.from(correlationElements) as HTMLTableCellElement[]\r\n const newCorrelationLinksTableCellHtmlElements = Array.from(\r\n virtualDOM.getElementsByClassName(CORRELATION_LINKS_CONTAINER_SELECTOR)\r\n ) as HTMLTableCellElement[]\r\n\r\n if (newCorrelationLinksTableCellHtmlElements?.length === correlationLinksTableCellHtmlElements.length) {\r\n correlationLinksTableCellHtmlElements.forEach((element, index) => {\r\n element.innerHTML = newCorrelationLinksTableCellHtmlElements[index].innerHTML\r\n })\r\n }\r\n\r\n // Search function update\r\n const newsearchFunctionWrapperElement = virtualDOM.getElementById(SET_SEARCH_EXT_SELECTOR) as HTMLDivElement\r\n if (newsearchFunctionWrapperElement?.dataset.setSearchExtArgument) {\r\n FinvizSettings.quoteSearchExt = newsearchFunctionWrapperElement.dataset.setSearchExtArgument\r\n }\r\n })\r\n .catch((err) => {\r\n setIsStockDetailUpdating(false)\r\n if (err.name !== 'AbortError') {\r\n Sentry.captureException(err)\r\n }\r\n })\r\n }\r\n isInitializedRef.current = true\r\n return () => {\r\n abortController.abort()\r\n }\r\n // We don't want to trigger effect on any location change just if period or type change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [p, ty])\r\n\r\n return { isStockDetailUpdating }\r\n}\r\n","import { useSearchParams } from 'react-router-dom'\r\n\r\nimport { useCheckNonIdeaChartMissingConfig } from '../../../hooks/use-check-non-idea-chart-missing-config'\r\nimport { QuotePortalComponents } from '../PortalComponents'\r\nimport { QuoteContextProvider } from '../QuoteContext'\r\nimport { useStockDetailUpdater } from '../hooks/use-stock-detail-updater'\r\nimport { useToggleRatings } from '../hooks/useToggleRatings'\r\nimport { QuoteQuery } from '../types'\r\n\r\nexport default function QuoteSharedWrapper() {\r\n useCheckNonIdeaChartMissingConfig()\r\n useToggleRatings()\r\n\r\n const [query] = useSearchParams()\r\n const tickers = query.get(QuoteQuery.Ticker)!.split(',')\r\n const { isStockDetailUpdating } = useStockDetailUpdater()\r\n\r\n return tickers.map((ticker, index) => (\r\n \r\n \r\n \r\n ))\r\n}\r\n","import * as React from 'react'\r\n\r\nexport function useToggleRatings() {\r\n React.useEffect(() => {\r\n const revealButtons = document.querySelectorAll('.js-reveal-ratings-button')\r\n\r\n function onToggleRatingsClick(ev: MouseEvent) {\r\n ev.preventDefault()\r\n\r\n const button = ev.currentTarget as HTMLElement\r\n const ratingsRowWithTable = button.previousElementSibling\r\n\r\n ratingsRowWithTable?.querySelectorAll('table tr').forEach((rating, index, rows) => {\r\n if (rating.classList.contains('is-last')) {\r\n rating.classList.remove('is-last')\r\n }\r\n\r\n rating.classList.remove('hidden')\r\n\r\n if (index === rows.length - 1) {\r\n rating.classList.add('is-last')\r\n }\r\n })\r\n\r\n button.classList.add('hidden')\r\n window.gtag && window.gtag('event', 'click', { event_category: 'reveal-ratings' })\r\n }\r\n\r\n revealButtons.forEach((button) => button.addEventListener('click', onToggleRatingsClick))\r\n\r\n return () => {\r\n revealButtons.forEach((button) => button.removeEventListener('click', onToggleRatingsClick))\r\n }\r\n }, [])\r\n}\r\n"],"names":["round","n","places","arguments","length","undefined","Math","Number","toFixed","format","totalReturn","maxDrawdown","sharpeRatio","calmarRatio","CAGR","cagr","volatility","numberOfTrades","positiveDays","negativeDays","bestMonth","worstMonth","figureSpace","BACKTEST_MIN_MAX_DATES","Object","freeze","min","Date","max","getStaticChartConfig","_ref","width","height","ticker","timeframe","paneElements","specificChartFunctionality","SpecificChartFunctionality","default","colorsOverride","theme","colors","getCustomColorsFromCookies","refreshData","layout","LayoutType","barWidth","barMargin","scrollable","editable","charts","premarket","aftermarket","dateRange","scale","ScaleType","Linear","leftOffset","instrument","Instrument","Stock","stretch","panes","elements","JSON","parse","getParsedCookies","IC_PUBLISHER_ID","AdTagName","tagDefinition","IC_TickerInContent","placements","style","minHeight","IC_MapsLeftRail","IC_Statements","IC_Groups","hasInvestingChannelAds","tracking","InvestingChannel","getInvestingChannelPage","page","create","_window$InvestingChan","window","InvestingChannelQueue","push","_window$FINVIZ_IC_UAT","_window$InvestingChan2","config","UAT","Run","e","console","error","destroy","_window$InvestingChan3","_page","useInvestingChannelAds","deps","React","AdTag","name","position","props","tagName","tagProps","placementName","_jsx","id","getInitChartConfig","initialConfig","initialTA","FinvizSettings","TA","stringify","Utils","isMobile","COTs","convertTa","PortalContext","rootElement","staticElement","toggleStaticElement","Portal","index","staticElements","roots","children","NodeList","Array","isArray","isEnabled","setIsEnabled","elementToHide","elementToShow","enabled","hideElement","element","classList","add","showElement","remove","toggleElements","toggleFn","forEach","useToggleStaticElements","portalContextValue","prevValue","ErrorBoundary","fallback","onError","Provider","value","ReactDOM","CartesianGrid","vertical","RechartsCartesianGrid","stroke","strokeDasharray","className","classNames","CARTESIAN_STROKE","displayName","LabelInner","color","viewBox","dx","dy","angle","x","y","_jsxs","fontSize","fontWeight","textAnchor","dominantBaseline","transform","CHART_ITEM_COLORS","Label","_ref2","RechartsLabel","content","DateFormat","dateAxisFormatter","outFormat","parseAsNY","breakOnYear","isFinite","getTime","date","getDate","getMonth","MonthSingleChar","MonthShort","includes","getFullYear","toString","substring","XAxis","RechartsXAxis","defaultProps","tickLine","axisLine","tick","fill","dataKey","type","interval","SOLID_AXIS_LINE","useCheckNonIdeaChartMissingConfig","location","useLocation","i","decodeQueryString","search","isIdeaNotFoundPage","reload","PADDING","getChartsDimensions","chartElementId","_box$width","_box$height","containerElement","document","getElementById","box","getBoundingClientRect","getChartConfig","idea","chartsDimensions","chartConfig","assign","FinvizChartsSettings","ideaChart","editors","newCharts","alignChartsToRight","tickers","map","periods","ranges","taConfig","getInstrumentForTicker","hasChartEvents","initIdeaQuotes","quotes","hasPatterns","quote","hasOwnProperty","drawMinutesPerDay","marketStartMinutes","premarketLengthMinutes","aftermarketLengthMinutes","ideaID","Quote","TempRenameSettingsProperties","defaultSettings","keysReplace","settings","setSettings","useFinancialsTableContext","oldKeys","keyPair","keys","some","settingKey","reduce","acc","key","_settings","valueKey","replaceKeyPair","find","GrowthLabel","isPercentage","isQuarterlyTimeframe","isSemiAnnual","canShrinkLabels","growthLabel","timeframeLabel","longLabel","_Fragment","WidgetSettingsSection","showTimeframe","hasOldDesign","toggleSetting","EarningsTimeframeEnum","quarterly","ChipSwitch","size","label","rounding","ChipSwitchButton","active","EarningsDataEnum","extraChangeYoYonQoQ","onClick","extraChangePctYoYonQoQ","mainChange","mainChangePct","annual","EarningsWidgetCategory","EARNINGS_WIDGET_LABELS","Eps","EpsGaap","Revenue","ESTIMATE_TYPE_LABEL","EarningsEstimateType","eps","epsGaap","sales","BAR_WIDTH","CHART_HEIGHT","LABELS_WIDTH","LABELS_MARGIN","BAR_WIDTH_NARROW","BAR_GAP","EXTRA_WIDTH","CHART_MARGINS","top","right","bottom","left","DEFAULT_SETTINGS_FOR_EARNINGS_DATA","EarningValueProperty","PriceReactionWhen","QuoteContext","period","TIMEFRAME","d","view","subview","QuoteContextProvider","query","useSearchParams","get","QuoteQuery","Type","Period","contextValue","getQuoteView","getQuoteSubview","QuoteChart","configOverride","TAOverride","chartEl","CHART_ELEMENT_ID","globalChartConfig","ideaQuotes","quoteData","p","defaultPeriod","sizeConfig","getChartLayoutSizeConfig","hasDarkTheme","Theme","dark","light","quotePage","chart","_chart$dateRange","hasUserPremium","FREE_DATE_RANGES","current","ChartLayoutWithGlobalState","parentElement","QuoteLinksContext","chartLayoutModel","URL","href","QuoteLinksWrapper","info","_chartLayoutModel$act","isPremium","useChartLayoutGlobalModelAsync","chartModel","useModelState","activeChart","watchProperties","generateChartLayoutRouterPath","useChartModelCustomDateRangeValues","pathname","origin","useChartTimeframePathWatch","NavigationLink","isEliteOnly","utmCampaign","getLink","reloadDocument","preserveQueryKeys","Ticker","DateRange","BackToScreener","removeQueryKeys","additionalQueryValues","quoteContext","linkContext","linkUrl","getElitePageLink","getNavigationLinkUrl","Link","to","CreateAlertLink","dialog","useDialogState","isVisible","useState","createAlertModule","useAsyncModule","createAlertAsyncModule","shouldLoadModule","CreateAlert","_window$gtag","_window","gtag","call","event_category","ctrlKey","metaKey","preventDefault","show","Dialog","state","Spinner","SaveToPortfolioLink","saveToPortfolioModule","saveToPortfolioAsyncModule","SaveToPortfolio","email","QuoteNavigation","hasShortInterest","dataset","shortinterest","isFund","isfund","QuoteView","ChartDetail","QuoteSubview","ComparePerf","ShortInterest","Financials","ty","Dividends","Earnings","Traffic","Options","LatestFilings","redesignEnabled","hasRedesignEnabled","colorScaleClass","monthNames","arraysEqual","arr1","arr2","Chart","Component","constructor","_defineProperty","shouldComponentUpdate","nextProps","this","render","_tickerQuote$0$ticker","_tickerQuote$","tickerQuote","select","q","close","ChartElementType","PerfChart","fromDate","fromDay","toDate","toDay","overlays","quotePerf","ref","containerRef","opacity","ChartLayout","Table","months","rows","groupsCount","ceil","tdClasses","classnames","trs","g","splice","month","row","col","monthIndex","parseFloat","total","cellPadding","cellSpacing","border","getInitialTickers","tickersInput","FinvizQuoteTickers","join","Perf","_this","super","_fetch","convertLocalToNyTime","fromTimestamp","toTimestamp","fromToDayTimestamps","getFromToDayTimestamps","o","h","l","c","v","open","high","low","volume","clearCachedData","updateAttributes","forceUpdate","async","isRefetch","t","setState","loading","dailyQuoteOptions","dateFrom","dateTo","all","fetchData","fetchType","QuoteFetchType","Refetch","NewerData","options","updateQuoteData","m","getAll","concat","getSanitizedTicker","split","newState","tickersChanged","sort","_trackTickers","filter","target","formattedDate","formatDateToStringUS","now","year","padStart","fromMonth","toMonth","minDate","dateFns","years","maxDate","from","monthsToShow","quotesPerf","obj","perf","dateFromUnixTimestamp","cols","isNaN","onSubmit","_onSubmit","padding","onChange","display","DatePicker","newValue","_onDatePickerChange","readOnly","_onMonthChange","bind","option","componentDidMount","addEventListener","refetchQuotes","isInitial","is_initial","quote_tickers","componentWillUnmount","unbind","removeEventListener","ChartBox","FlowsChartDataKeys","AXIS_LABEL_OFFSET","tooltipValueFormatter","formatted","shortFormatDollar","Aum","RedGreenText","rightContent","FundFlowsChart","initData","routeData","parseRouteInitData","elementId","removeElement","dateStrToTimestamp","monthlyTicks","startingTimestamp","endingTimestamp","dayOfMonth","ticks","endingDate","initTimestamp","startDate","getMonthlyTicks","ChartWrapper","isHoverHighlight","ComposedChart","data","margin","domain","tickFormatter","YAxis","yAxisId","tickCount","orientation","dataMin","dataMax","absMax","abs","Tooltip","formatLabel","MonthShortDayNumYearFull","formatValue","TooltipRow","Flows","Line","Bar","radius","BarType","InsiderVolumeBar","newX","payload","isCenteredBar","saleAggregated","buyAggregated","Sale","Rectangle","background","BarInner","Buy","tooltipTitleFormatter","startOfMonth","endDate","endOfMonth","toLocaleString","startDay","tooltipDataFormatter","_","_fullTooltipPayload$","_fullTooltipPayload$2","fullTooltipPayload","insider","tradeCount","buyTransactionCount","saleTransactionCount","isZeroValue","valueToUse","defaultValue","InsiderTradingVolumeChart","_initData$data4","chartData","setChartData","hasInsiderTradingHistory","_initData$data","_initData$data2","getInstrument","shouldUseCache","_initData$data3","fetchQuoteData","barGap","barCategoryGap","xAxisId","hide","cursor","CursorBar","numberOfDatapoints","valueClass","shape","InstitutionalOwnershipType","getInvestorLink","investorId","Funds","isRedesignEnabled","commonTdClassName","InstitutionalOwnership","managersItems","hasManagersItems","fundsItems","hasFundsItems","_initData$managersOwn","_initData$fundsOwners","managersOwnership","fundsOwnership","institutionalOwnership","setInstitutionalOwnership","Managers","items","Heading","level","disabled","TableBody","percOwnership","TableRow","TableCell","hasPadding","align","TableAlign","Right","formatNumber","FORMAT_PERCENT","QuotePortal","context","elementIndex","QuotePrice","title","dateLabel","price","changeUsd","changePct","fractions","hasValue","formatDate","RedGreenMultiline","showPlusSign","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","useChartContextPrices","_chartModel$quote","first","listenOnEvents","quoteModel","prevClose","lastClose","lastTime","lastDate","afterClose","afterTime","ChartContextQuoteHeader","hasData","QuoteHeaderContent","ManualInitQuoteHeader","withCompleteLayoutModelInit","withQuotePolling","modelProperties","chart_layout","barsCount","fetchAndMapInitialQuote","isChange","isAfterChange","afterDate","afterhoursTitle","BarChart","createRef","renderChart","componentDidUpdate","_FinvizSettings","_prevData","svgRef","innerHTML","xAxisRotate","marginRight","totalWidth","totalHeight","d3","rangeRound","range","nice","yFormat","valueFormatter","tickFormat","svg","property","append","attr","xAxis","yAxis","tickSize","tickSizeOuter","selectAll","text","getHeight","_d$value","isOutside","enter","bandwidth","outside","DEFAULT_SETTINGS","StatementsSourceEnum","unknown","bars","transition","exit","EliteHoverAd","Icon","BarChartWrapper","hover","Ariakit","placement","showTimeout","portal","BarChartBig","DEFAULT_SOURCE","FactSet","_getDefaultSource","getValue","Reuters","StatementsComponent","pageRef","source","sheet","currency","_pageRef$current","_pageRef$current2","response","fetch","json","_renderSheetLink","paddingLeft","setValue","StatementsTable","isChartable","_data$Period","_FinvizSettings2","skipFirst","parsedData","parsed","parsedValue","replace","slice","parseData","yoyData","entries","values","reversedValues","reverse","_ref3","isValidValue","isValidPrevValue","yoyOnQoqChange","yoyOnQoqChangePct","change","prevQt","reversedYoyData","_ref4","_ref5","_ref6","_ref7","cellClass","adRowIndexStart","yoyGrowthLabel","rowIndex","hasYoYData","isHighlightRow","getIsHighlightRow","_yoyData$key$change$c","_yoyData$key","_yoyData$key$changePc","_yoyData$key2","_yoyData$key$yoyOnQoq","_yoyData$key3","_yoyData$key$yoyOnQoq2","_yoyData$key4","_yoyOnQoqChangePctVal","_yoyChangePctValue$to","changeIndex","yoyChangeValue","yoyChangePctValue","yoyOnQoqChangeValue","yoyOnQoqChangePctValue","formattedValue","quarterNumber","rowSpan","colSpan","shortFormatNumber","FinancialsTableContextProvider","cookieKey","hasRedesign","StaticChartHeader","isStockDetailUpdating","ChartTypesSelect","specificFunctionality","StockDetailTimeframeBar","chartIndex","isDateRangeAvailable","isLoadingOverride","isScrollIntoViewEnabled","Button","leftContent","convertData","endYear","FAChart","smallRoundPlaces","largeRoundPlaces","smallScale","largeScale","smallTitleSufix","largeTitleSufix","isLarge","rounded","FundamentalCharts","etfHoldingsAsyncModule","importFn","cacheKey","LoadingFallback","withNotificationContext","etfHoldingsModule","errorSeverity","ETFHoldingsComponent","ETFHoldings","PRICE_STATIC","querySelectorAll","PRICE_ROOTS","NAVIGATION_STATIC","NAVIGATION_ROOTS","STATIC_CHART_HEADER_ROOTS","FUNDAMENTAL_CHARTS_ROOTS","STATEMENTS_ROOTS","INSIDER_CHART_ROOTS","MANAGERS_AND_FUNDS_ROOTS","QuotePortalComponents","ETF_HOLDINGS_STATIC","querySelector","ETF_HOLDINGS_ROOTS","isETF","EtfHoldings","Statements","CORRELATION_LINKS_CONTAINER_SELECTOR","MULTITICKER_CHART_ELEMENT_SELECTOR","SET_SEARCH_EXT_SELECTOR","QuoteSharedWrapper","revealButtons","onToggleRatingsClick","ev","button","currentTarget","ratingsRowWithTable","previousElementSibling","rating","contains","isInitializedRef","setIsStockDetailUpdating","multiTickerElements","getElementsByClassName","correlationElements","abortController","AbortController","signal","then","virtualDOM","DOMParser","parseFromString","multiTickerHtmlElements","newMultiTickerHtmlElements","onload","src","correlationLinksTableCellHtmlElements","newCorrelationLinksTableCellHtmlElements","newsearchFunctionWrapperElement","setSearchExtArgument","quoteSearchExt","catch","err","Sentry","captureException","abort","useStockDetailUpdater"],"sourceRoot":""}