{"version":3,"file":"quote.cb0f8b34.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/backtest/utils.tsx","webpack://@finviz/website/./js/app/quote/etf-holdings/async-modules.ts","webpack://@finviz/website/./js/app/quote/etf-holdings/index.tsx","webpack://@finviz/website/./js/app/quote/barChart.tsx","webpack://@finviz/website/./js/app/quote/fundamentalCharts.tsx","webpack://@finviz/website/./js/app/quote/quote.tsx","webpack://@finviz/website/./js/main/components/QuotePrice.tsx","webpack://@finviz/website/./js/app/quote/quote-header/constants.ts","webpack://@finviz/website/./js/app/quote/quote-header/hooks.ts","webpack://@finviz/website/./js/app/quote/quote-header/QuoteHeader.tsx","webpack://@finviz/website/./js/app/quote/chart-type-select/utils.ts","webpack://@finviz/website/./js/app/quote/chart-type-select/chart-type-select.tsx","webpack://@finviz/website/./js/app/quote/chart-type-select/use-chart-type.tsx","webpack://@finviz/website/./js/app/quote/quote-menu/quote-menu.tsx","webpack://@finviz/website/./js/app/shared/lazyTippy.tsx","webpack://@finviz/website/./js/app/quote/statements.tsx","webpack://@finviz/website/./js/app/quote/use-stock-detail-updater.tsx","webpack://@finviz/website/./js/app/quote/index.tsx","webpack://@finviz/website/./js/app/quote/quote-links/SaveToPortfolioLink.tsx","webpack://@finviz/website/./js/app/quote/quote-links/CreateAlertLink.tsx","webpack://@finviz/website/./js/app/quote/use-chart-layout-width-watch.ts","webpack://@finviz/website/./js/main/hooks/use-window-size.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/delayed.tsx","webpack://@finviz/website/./js/main/components/notification/hooks.ts","webpack://@finviz/website/./js/main/components/notification/notification-wrapper.tsx","webpack://@finviz/website/./js/main/components/notification/with-notification-context.tsx","webpack://@finviz/website/./js/main/components/notification/notification.tsx","webpack://@finviz/website/./js/main/hooks/use-check-non-idea-chart-missing-config.ts","webpack://@finviz/website/./js/main/modules/charts/util.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","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 '../../../main/components/notification'\r\nimport { Spinner } from '../../../main/components/spinner'\r\nimport { useAsyncModule } from '../../../main/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 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 // @ts-ignore\r\n _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 var margin = { top: title ? 20 : 10, right: this.props.marginRight || 60, bottom: xAxisRotate ? 70 : 20, left: 15 }\r\n const totalWidth = this.props.width || 440\r\n const totalHeight = this.props.height || 330\r\n var width = totalWidth - margin.left - margin.right\r\n var 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 var xAxis = d3.axisBottom(x)\r\n var yAxis = d3.axisRight(y).ticks(height > 200 ? 10 : 5)\r\n\r\n const makeYLines = () => d3.axisLeft(y)\r\n // @ts-ignore - 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 let 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 }\r\n}\r\n","import { round } from '../backtest/utils'\r\nimport BarChart, { Bar } from './barChart'\r\n\r\nfunction convertData(endYear: number, values: any[]) {\r\n return values\r\n .map((value, index) => ({\r\n name: endYear - index,\r\n value,\r\n }))\r\n .reverse() as unknown as Bar[]\r\n}\r\n\r\ninterface FAChartProps {\r\n id: string\r\n largeRoundPlaces: number\r\n largeScale: number\r\n largeTitleSufix: string\r\n smallRoundPlaces: number\r\n smallScale: number\r\n smallTitleSufix: string\r\n title: string\r\n}\r\n\r\nfunction FAChart({\r\n id,\r\n title,\r\n smallRoundPlaces,\r\n largeRoundPlaces,\r\n smallScale,\r\n largeScale,\r\n smallTitleSufix,\r\n largeTitleSufix,\r\n}: FAChartProps) {\r\n const data: number[] = FinvizFA[id]\r\n\r\n const min = Math.min(...data)\r\n const max = Math.max(...data)\r\n const range = max > -min ? max : -min\r\n\r\n const isLarge = Math.abs(range) >= 1000\r\n\r\n const scale = isLarge ? largeScale : smallScale\r\n const values = data.map((value) =>\r\n value == null ? null : round(scale * value, isLarge ? largeRoundPlaces : smallRoundPlaces)\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 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","/* global FinvizQuoteTickers */\r\nimport classnames from 'classnames'\r\nimport * as dateFns from 'date-fns'\r\nimport React, { ChangeEvent, Component, FormEvent } from 'react'\r\nimport { BrowserRouter } from 'react-router-dom'\r\n\r\nimport { DatePicker } from '../../main/components/date-picker'\r\nimport { SpecificChartFunctionality } from '../../main/constants'\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 '../charts-lib'\r\nimport { decodeQueryString } from '../queryString'\r\nimport { getStaticChartConfig } from '../shared/chartLayoutConfig'\r\nimport { getSanitizedTicker } from '../shared/ticker-sanitizer'\r\nimport { formatDateToStringUS } from '../shared/utils'\r\n\r\nconst redesignEnabled = !!FinvizSettings.hasRedesignEnabled\r\n\r\nvar 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\nvar monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nvar arraysEqual = function (arr1: unknown[], arr2: unknown[]) {\r\n if (arr1.length !== arr2.length) {\r\n return false\r\n }\r\n for (var 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 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 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\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 var { months, rows } = this.props,\r\n groupsCount = Math.ceil(months.length / 12)\r\n rows = rows.slice()\r\n const tdClasses = classnames('text-center', {\r\n 'body-table-nw font-bold': !redesignEnabled,\r\n })\r\n\r\n var 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\nexport class Perf extends Component {\r\n containerRef = React.createRef()\r\n\r\n constructor(props: any) {\r\n super(props)\r\n var 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 (var year = startYear; year <= now.getFullYear(); year++) {\r\n for (var 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 tickersInput: FinvizQuoteTickers.join(','),\r\n tickers: FinvizQuoteTickers,\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 var from = new Date(this.state.fromMonth.value)\r\n var to = new Date(this.state.toMonth.value)\r\n var 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 var quotes = Quote.select((q: any) => q.timeframe === 'm')\r\n var quotesPerf = quotes.map((q: any) => {\r\n var 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 var date = Utils.dateFromUnixTimestamp(d)\r\n var 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 var months = monthsToShow.map(\r\n (month) => monthNames[new Date(month).getMonth()] + ' ' + new Date(month).getFullYear().toString().substring(2)\r\n )\r\n var rows = quotesPerf.map((quote: any) => {\r\n var cols: string[] = []\r\n var total = 1\r\n monthsToShow.forEach((month) => {\r\n var 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\r\n componentWillUnmount() {\r\n Quote.unbind('refetch newerData', this.updateQuoteData)\r\n document.removeEventListener('quoteFetchEvent', this.refetchQuotes)\r\n }\r\n\r\n updateQuoteData = () => {\r\n const { fromDay, toDay } = this.state\r\n\r\n if (!fromDay || !toDay) {\r\n return\r\n }\r\n\r\n const dailyQuotes = Quote.select((q: any) => q.timeframe === 'd')\r\n const fromDate = new Date(fromDay + ' 00:00')\r\n const toDate = new Date(toDay + ' 23:59')\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 const date = Utils.dateFromUnixTimestamp(q.date[i])\r\n if (fromDate <= date && date <= toDate) {\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 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 { t } = decodeQueryString<{ t: string; p?: TIMEFRAME }>()\r\n if (isRefetch) {\r\n this.setState({ loading: true })\r\n }\r\n\r\n Quote.all().forEach(async (quote) => {\r\n if (quote.ticker === t && quote.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({ fetchType: isRefetch ? QuoteFetchType.Refetch : QuoteFetchType.NewerData })\r\n this.updateQuoteData()\r\n } else {\r\n quote.destroy()\r\n }\r\n })\r\n\r\n if (isRefetch) {\r\n var d = tickers.map((ticker) => ({ ticker: ticker, timeframe: TIMEFRAME.d, instrument: Instrument.Stock }))\r\n var m = tickers.map((ticker) => ({ ticker: ticker, timeframe: TIMEFRAME.m, instrument: Instrument.Stock }))\r\n await Quote.getAll(d.concat(m))\r\n\r\n this.setState(\r\n {\r\n loading: false,\r\n },\r\n () => {\r\n this.containerRef.current?.style.removeProperty('min-height')\r\n }\r\n )\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 this.setState({ tickers, tickersInput }, () => {\r\n this._fetch(tickers)\r\n })\r\n }\r\n\r\n _onMonthChange = (type: string, e: ChangeEvent) => {\r\n var 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 var formattedDate = formatDateToStringUS(new Date(date))\r\n\r\n var 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 _hideDatePicker = (type: string) => {\r\n var state: any = {}\r\n state[type + 'DatePickerOpen'] = false\r\n this.setState(state)\r\n }\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { formatDate } from '../../app/header/utils'\r\nimport { formatNumber } from '../util'\r\nimport { RedGreenMultiline, RedGreenText } from './RedGreenText'\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","export const QUOTE_HEADER_ROOT = 'js-quote-header-prices'\r\nexport const STATIC_PRICE_SELECTOR = '.js-is-static-price'\r\n","import * as React from 'react'\r\n\r\nimport { useModelState } from '../../charts-lib'\r\nimport { QUOTE_HEADER_ROOT, STATIC_PRICE_SELECTOR } from './constants'\r\n\r\nfunction toggleStaticheader(isReactHeader: boolean) {\r\n if (isReactHeader) {\r\n document.querySelector(STATIC_PRICE_SELECTOR)?.classList.add('hidden')\r\n document.getElementById(QUOTE_HEADER_ROOT)?.classList.remove('hidden')\r\n } else {\r\n document.querySelector(STATIC_PRICE_SELECTOR)?.classList.remove('hidden')\r\n document.getElementById(QUOTE_HEADER_ROOT)?.classList.add('hidden')\r\n }\r\n}\r\n\r\nexport function useReplaceStaticHeader(isLoaded: boolean) {\r\n React.useEffect(() => {\r\n toggleStaticheader(isLoaded)\r\n }, [isLoaded])\r\n}\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 { QuotePrice } from '../../../main/components/QuotePrice'\r\nimport { Quote, useChartLayoutGlobalModelAsync, withCompleteLayoutModelInit, withQuotePolling } from '../../charts-lib'\r\nimport { formatDate, getDate } from '../../header/utils'\r\nimport { HeaderPricesContext, useChartContextPrices, useReplaceStaticHeader } from './hooks'\r\n\r\nexport function ChartContextQuoteHeader() {\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const data = useChartContextPrices(chartLayoutModel)\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 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: { maxBars: 0 },\r\n })\r\n\r\n chart.updateAttributes({ quote })\r\n }\r\n\r\n fetchAndMapInitialQuote()\r\n }, [chartLayoutModel, config.charts])\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 /**\r\n * Replace static HTML with our react component\r\n */\r\n useReplaceStaticHeader(!!data)\r\n\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 { SelectItem } from '../../../main/components'\r\nimport { IconNameType } from '../../../main/components/icon'\r\n\r\nexport enum QuoteNodeChartTypes {\r\n candlesticksimple = 'candlesticksimple',\r\n candlestick = 'candlestick',\r\n line = 'line',\r\n ohlc = 'ohlc',\r\n heikinashi = 'heikinashi',\r\n hollowcandlestick = 'hollowcandlestick',\r\n}\r\n\r\nexport enum QuoteUrlChartTypes {\r\n cs = 'cs',\r\n c = 'c',\r\n l = 'l',\r\n o = 'o',\r\n ha = 'ha',\r\n hc = 'hc',\r\n}\r\n\r\nexport const QuoteShortToLongType = {\r\n [QuoteUrlChartTypes.cs]: QuoteNodeChartTypes.candlesticksimple,\r\n [QuoteUrlChartTypes.c]: QuoteNodeChartTypes.candlestick,\r\n [QuoteUrlChartTypes.l]: QuoteNodeChartTypes.line,\r\n [QuoteUrlChartTypes.o]: QuoteNodeChartTypes.ohlc,\r\n [QuoteUrlChartTypes.ha]: QuoteNodeChartTypes.heikinashi,\r\n [QuoteUrlChartTypes.hc]: QuoteNodeChartTypes.hollowcandlestick,\r\n} as const\r\n\r\nexport const QuoteLongToShortType = {\r\n [QuoteNodeChartTypes.candlesticksimple]: QuoteUrlChartTypes.cs,\r\n [QuoteNodeChartTypes.candlestick]: QuoteUrlChartTypes.c,\r\n [QuoteNodeChartTypes.line]: QuoteUrlChartTypes.l,\r\n [QuoteNodeChartTypes.ohlc]: QuoteUrlChartTypes.o,\r\n [QuoteNodeChartTypes.heikinashi]: QuoteUrlChartTypes.ha,\r\n [QuoteNodeChartTypes.hollowcandlestick]: QuoteUrlChartTypes.hc,\r\n} as const\r\n\r\nexport const FREE_TYPES = ['candlesticksimple', 'candlestick', 'line']\r\n\r\nexport const DEFAULT_TYPES = [\r\n { icon: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle' },\r\n { icon: 'lineChartType', value: QuoteNodeChartTypes.line, label: 'Line' },\r\n { icon: 'ohlcChartType', value: QuoteNodeChartTypes.ohlc, label: 'OHLC' },\r\n { icon: 'candleBarHollow', value: QuoteNodeChartTypes.hollowcandlestick, label: 'Hollow Candle' },\r\n { icon: 'candleBarHeikinAshi', value: QuoteNodeChartTypes.heikinashi, label: 'Heikin Ashi' },\r\n]\r\n\r\nexport type TypeBaseOption = SelectItem & {\r\n icon: IconNameType\r\n href: string\r\n}\r\n","import { Select } from '../../../main/components'\r\nimport { Icon } from '../../../main/components/icon'\r\nimport { useChartTypes } from './use-chart-type'\r\n\r\nconst hasRedesign = FinvizSettings.hasRedesignEnabled\r\n\r\nexport function ChartTypesSelect({ isPremium }: { isPremium: boolean }) {\r\n const { chartTypes, currentType, setSelectedChartTypeOverwrite } = useChartTypes({ isPremium })\r\n\r\n return (\r\n : undefined}\r\n rounding={hasRedesign ? undefined : 'none'}\r\n onChange={({ value }) => setSelectedChartTypeOverwrite(value)}\r\n items={chartTypes}\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, encodeQueryString } from '../../queryString'\r\nimport {\r\n DEFAULT_TYPES,\r\n FREE_TYPES,\r\n QuoteLongToShortType,\r\n QuoteNodeChartTypes,\r\n QuoteShortToLongType,\r\n QuoteUrlChartTypes,\r\n TypeBaseOption,\r\n} from './utils'\r\n\r\nexport function useChartTypes({ isPremium }: { isPremium: boolean }) {\r\n const location = useLocation()\r\n const { b, t, ta, ty, p = 'd', r } = decodeQueryString(location.search)\r\n const taInt = ta ? Number.parseInt(ta) : 1\r\n const [selectedChartTypeOverwrite, setSelectedChartTypeOverwrite] = React.useState()\r\n\r\n const generateRouterPath = React.useCallback(\r\n (type: QuoteNodeChartTypes) => {\r\n if (isPremium || FREE_TYPES.includes(type)) {\r\n return `/quote.ashx?${encodeQueryString({\r\n b,\r\n t,\r\n r,\r\n ty:\r\n type === QuoteNodeChartTypes.candlesticksimple\r\n ? QuoteLongToShortType.candlestick\r\n : QuoteLongToShortType[type],\r\n ta: type === QuoteNodeChartTypes.candlestick ? '1' : '0',\r\n p,\r\n })}`\r\n }\r\n return `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: 'quote-chart-type-select',\r\n })}`\r\n },\r\n [isPremium, b, t, r, p]\r\n )\r\n\r\n const chartTypes = React.useMemo(\r\n () =>\r\n (\r\n [\r\n !isPremium ? { icon: 'candleBarBasic', value: 'candlesticksimple', label: 'Candle - simple' } : null,\r\n ...DEFAULT_TYPES.map((type) =>\r\n !isPremium && type.value === 'candlestick' ? { ...type, label: 'Candle - advanced' } : type\r\n ),\r\n ].filter(Boolean) as TypeBaseOption[]\r\n ).map((item) => ({\r\n ...item,\r\n href: generateRouterPath(item.value as QuoteNodeChartTypes),\r\n reloadDocument: !isPremium,\r\n })),\r\n [generateRouterPath, isPremium]\r\n )\r\n\r\n const currentType = React.useMemo(\r\n () =>\r\n chartTypes.find((type) => {\r\n if (selectedChartTypeOverwrite) {\r\n return type.value === selectedChartTypeOverwrite\r\n }\r\n\r\n const defaultType =\r\n ((ty as QuoteUrlChartTypes | undefined) && QuoteShortToLongType[ty as QuoteUrlChartTypes]) ??\r\n (FinvizQuoteTypeCurrent as QuoteNodeChartTypes)\r\n\r\n return !isPremium && defaultType === QuoteNodeChartTypes.candlestick && taInt === 0\r\n ? type.value === QuoteNodeChartTypes.candlesticksimple\r\n : type.value === defaultType\r\n }),\r\n [chartTypes, selectedChartTypeOverwrite, ty, isPremium, taInt]\r\n )\r\n\r\n return { currentType, chartTypes, setSelectedChartTypeOverwrite }\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { StockDetailTimeframeBar } from '../../../app/charts-lib'\r\nimport { Button } from '../../../main/components/button'\r\nimport { NotificationWrapper } from '../../../main/components/notification'\r\nimport { decodeQueryString } from '../../queryString'\r\nimport { ChartTypesSelect } from '../chart-type-select'\r\n\r\ninterface Props {\r\n index: number\r\n isInteractiveChart: boolean\r\n isStockDetailUpdating: boolean\r\n}\r\n\r\nconst hasRedesign = FinvizSettings.hasRedesignEnabled\r\n\r\nexport function QuoteMenu({ index, isInteractiveChart, isStockDetailUpdating }: Props) {\r\n const { t, ty, p } = decodeQueryString()\r\n const urlTickers = t.split(',')\r\n const isPremium = FinvizSettings.hasUserPremium\r\n\r\n return (\r\n \r\n
\r\n {ty !== 'p' && ty !== 'oc' && (\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 {ty !== 'p' && ty !== 'oc' ? (\r\n \r\n Share\r\n \r\n ) : null}\r\n
\r\n
\r\n )\r\n}\r\n","import Tippy, { TippyProps } from '@tippyjs/react/headless'\r\nimport { useState } from 'react'\r\n\r\n// https://gist.github.com/atomiks/520f4b0c7b537202a23a3059d4eec908\r\nexport default function LazyTippy(props: TippyProps) {\r\n const [mounted, setMounted] = useState(false)\r\n\r\n const lazyPlugin = {\r\n fn: () => ({\r\n onShow: () => setMounted(true),\r\n onHidden: () => setMounted(false),\r\n }),\r\n }\r\n\r\n const computedProps = { ...props }\r\n\r\n computedProps.plugins = [lazyPlugin, ...(props.plugins || [])]\r\n\r\n if (props.render) {\r\n computedProps.render = (...args) => (mounted ? props.render?.(...args) : '')\r\n } else {\r\n computedProps.content = mounted ? props.content : ''\r\n }\r\n\r\n return \r\n}\r\n","import classnames from 'classnames'\r\nimport * as d3 from 'd3'\r\nimport * as React from 'react'\r\nimport { Component, RefObject, createRef } from 'react'\r\n\r\nimport { Icon } from '../../main/components/icon'\r\nimport { getValue, setValue } from '../../main/services/local-storage'\r\nimport { decodeQueryString } from '../queryString'\r\nimport { AdTag, getInvestingChannelPage } from '../shared/components/Ads'\r\nimport LazyTippy from '../shared/lazyTippy'\r\nimport BarChartBig from './barChart'\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 let 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 x.value !== null)}\r\n render={(attrs) => (\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\n \r\n )\r\n }\r\n}\r\n\r\ninterface StatementsState {\r\n source: 'F' | 'R'\r\n sheet: string\r\n timeframe: string\r\n currency: string | null\r\n data: Record | null\r\n}\r\n\r\nconst DEFAULT_SOURCE = 'F'\r\n\r\nclass Statements extends Component {\r\n declare pageRef: ReturnType\r\n\r\n state: StatementsState = {\r\n source: this._getDefaultSource(),\r\n sheet: 'I',\r\n timeframe: 'A',\r\n currency: null,\r\n data: null,\r\n }\r\n\r\n componentDidMount() {\r\n this._fetch()\r\n this.pageRef = getInvestingChannelPage()\r\n this.pageRef.create()\r\n }\r\n\r\n componentWillUnmount() {\r\n this.pageRef?.destroy()\r\n }\r\n\r\n render() {\r\n const { data } = this.state\r\n\r\n if (data === null) {\r\n // || (data && data.error)) {\r\n return null\r\n }\r\n\r\n const hasData = !data.error\r\n const hasRedesignEnabled = FinvizSettings?.hasRedesignEnabled\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 = e.target.value === 'R' ? 'R' : 'F'\r\n this.setState(\r\n {\r\n source: source,\r\n },\r\n () => {\r\n this._fetch()\r\n }\r\n )\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 {this._renderSheetLink('I', 'income statement')} | {this._renderSheetLink('B', 'balance sheet')} |{' '}\r\n {this._renderSheetLink('C', 'cash flow')}\r\n \r\n \r\n \r\n {this._renderTimeframeLink('A', 'annual')} | {this._renderTimeframeLink('Q', 'quarterly')}\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\n _renderSheetLink(id: string, text: string) {\r\n const { sheet } = this.state\r\n return (\r\n {\r\n e.preventDefault()\r\n this.setState(\r\n {\r\n sheet: id,\r\n },\r\n () => {\r\n this._fetch()\r\n }\r\n )\r\n }}\r\n >\r\n {text}\r\n \r\n )\r\n }\r\n\r\n _renderTimeframeLink(id: string, text: string) {\r\n const { timeframe } = this.state\r\n return (\r\n {\r\n e.preventDefault()\r\n this.setState(\r\n {\r\n timeframe: id,\r\n },\r\n () => {\r\n this._fetch()\r\n }\r\n )\r\n }}\r\n >\r\n {text}\r\n \r\n )\r\n }\r\n\r\n async _fetch() {\r\n const { source, sheet, timeframe } = this.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 this.setState({\r\n currency: json.currency,\r\n data: json.error ? json : json.data,\r\n })\r\n } catch {}\r\n }\r\n\r\n _getDefaultSource(): 'F' | 'R' {\r\n if (!FinvizSettings.hasUserPremium) {\r\n return DEFAULT_SOURCE\r\n }\r\n\r\n return getValue('statements-source', DEFAULT_SOURCE) === 'R' ? 'R' : 'F'\r\n }\r\n}\r\n\r\nfunction StatementsTable({ data, currency }: StatementsState) {\r\n if (!data) return null\r\n\r\n function parseData(data: Record, skipFirst: boolean) {\r\n let 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\n function isChartable(label: string) {\r\n switch (label) {\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\n function isHighlightRow(label: string) {\r\n switch (label) {\r\n case 'Period End Date':\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 return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n const hasRedesignEnabled = FinvizSettings?.hasRedesignEnabled\r\n const cellClass = hasRedesignEnabled ? '' : 'snapshot-td2'\r\n\r\n const skipFirst = data['Period End Date'][0] === 'TTM'\r\n const parsedData = parseData(data, skipFirst)\r\n const adRowIndexStart = !hasRedesignEnabled && data['Period Length'] ? 2 : 1\r\n\r\n return (\r\n <>\r\n \r\n \r\n {Object.keys(data).map((key, rowIndex) => (\r\n \r\n {key}\r\n \r\n {isChartable(key) && }\r\n \r\n {data[key].map((value, index) => {\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 && key !== 'Period End Date') ||\r\n (key !== 'Period End Date' && key !== 'Period Length'))\r\n ) {\r\n return null\r\n }\r\n }\r\n\r\n return (\r\n \r\n {value}\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\n )\r\n}\r\n\r\nexport default Statements\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { decodeQueryString } from '../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 { CHART_ELEMENT_ID } from 'finviz-charts/app/constants/common'\r\nimport React, { Suspense } from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport ReactDOMClient from 'react-dom/client'\r\nimport { BrowserRouter } from 'react-router-dom'\r\n\r\nimport { NotificationWrapper } from '../../main/components/notification'\r\nimport { SpecificChartFunctionality, TIMEFRAME } from '../../main/constants'\r\nimport { useCheckNonIdeaChartMissingConfig } from '../../main/hooks/use-check-non-idea-chart-missing-config'\r\nimport { initIdeaQuotes } from '../../main/modules/charts/util'\r\nimport { ChartLayoutWithGlobalState, FREE_DATE_RANGES, Quote, Theme } from '../charts-lib'\r\nimport { decodeQueryString } from '../queryString'\r\nimport { getInitChartConfig } from '../shared/getInitChartConfig'\r\nimport { ready } from '../shared/ready'\r\nimport ETFHoldings from './etf-holdings'\r\nimport FundamentalCharts from './fundamentalCharts'\r\nimport { Perf } from './quote'\r\nimport { ChartContextQuoteHeader, ManualInitQuoteHeader } from './quote-header'\r\nimport { QUOTE_HEADER_ROOT } from './quote-header/constants'\r\nimport CreateAlertLink from './quote-links/CreateAlertLink'\r\nimport SaveToPortfolioLink from './quote-links/SaveToPortfolioLink'\r\nimport { QuoteMenu } from './quote-menu'\r\nimport Statements from './statements'\r\nimport { getChartLayoutSizeConfig, useChartLayoutWidthWatch } from './use-chart-layout-width-watch'\r\nimport { useStockDetailUpdater } from './use-stock-detail-updater'\r\n\r\nif (FinvizSettings.hasUserPremium || FinvizSettings.hasRedesignEnabled) {\r\n import(/* webpackChunkName: \"recent_quotes\" */ '../shared/recent_quotes').then(({ RenderRecentQuotes }) => {\r\n RenderRecentQuotes()\r\n })\r\n}\r\n\r\nconst QuoteMenuPortal = ({ isStockDetailUpdating }: { isStockDetailUpdating: boolean }) => {\r\n const quoteMenuElements = document.getElementsByClassName('quote-menu')\r\n const quoteMenuHtmlElements = Array.from(quoteMenuElements).filter((el) => el instanceof HTMLElement) as HTMLElement[]\r\n\r\n if (quoteMenuHtmlElements.length > 0) {\r\n return (\r\n <>\r\n {quoteMenuHtmlElements.map((quoteMenuElement: HTMLElement, quoteMenuIndex: number) => {\r\n const menuIndex = quoteMenuIndex + 1\r\n return ReactDOM.createPortal(\r\n ,\r\n quoteMenuElement\r\n )\r\n })}\r\n \r\n )\r\n }\r\n return null\r\n}\r\n\r\nconst MENU_LINKS = [\r\n {\r\n selector: 'js-save-to-portfolio-link',\r\n LinkComponent: SaveToPortfolioLink,\r\n },\r\n {\r\n selector: 'js-create-alert-link',\r\n LinkComponent: CreateAlertLink,\r\n },\r\n]\r\n\r\nconst RenderMenuLinks = () => {\r\n MENU_LINKS.forEach(({ selector, LinkComponent }) => {\r\n const linkElements = document.getElementsByClassName(selector)\r\n const linkHtmlElements = Array.from(linkElements).filter((el) => el instanceof HTMLElement) as HTMLElement[]\r\n\r\n linkHtmlElements.forEach((linkElement, index) => {\r\n const root = ReactDOMClient.createRoot(linkElement)\r\n root.render()\r\n })\r\n })\r\n}\r\n\r\nconst ChartLayoutPortal = () => {\r\n useChartLayoutWidthWatch()\r\n const chartEl = document.getElementById(CHART_ELEMENT_ID)\r\n const chartConfig = window.globalChartConfig\r\n const theme = FinvizSettings.hasDarkTheme ? Theme.dark : Theme.light\r\n\r\n if (chartEl && chartConfig) {\r\n const { p = FinvizSettings.defaultPeriod as TIMEFRAME } = decodeQueryString<{ p?: TIMEFRAME }>()\r\n return ReactDOM.createPortal(\r\n ({\r\n ...chart,\r\n dateRange:\r\n FinvizSettings.hasUserPremium || FREE_DATE_RANGES.includes(chart.dateRange ?? '')\r\n ? chart.dateRange\r\n : null,\r\n })),\r\n theme,\r\n }}\r\n parentElement={chartEl}\r\n />,\r\n chartEl\r\n )\r\n }\r\n return null\r\n}\r\n\r\nenum QuotePageType {\r\n StockDetail = 'stockDetail',\r\n Idea = 'idea',\r\n Perf = 'perf',\r\n Options = 'options',\r\n}\r\n\r\nfunction getQuotePageType() {\r\n const { ty, i } = decodeQueryString()\r\n\r\n if (ty === 'p') {\r\n return QuotePageType.Perf\r\n }\r\n if (ty === 'oc') {\r\n return QuotePageType.Options\r\n }\r\n if (i) {\r\n return QuotePageType.Idea\r\n }\r\n\r\n return QuotePageType.StockDetail\r\n}\r\n\r\nfunction getQuoteHeaderElement() {\r\n const quotePageType = getQuotePageType()\r\n\r\n if ([QuotePageType.StockDetail, QuotePageType.Idea].includes(quotePageType)) {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const config = window.globalChartConfig\r\n if (config) {\r\n return \r\n }\r\n\r\n return null\r\n}\r\n\r\nconst ReactComponentsContainer = () => {\r\n const { isStockDetailUpdating } = useStockDetailUpdater()\r\n const quotePageType = getQuotePageType()\r\n const isPerfQuotePage = quotePageType === QuotePageType.Perf\r\n const isOptionsQuotePage = quotePageType === QuotePageType.Options\r\n const hasConfig = window.globalChartConfig\r\n\r\n useCheckNonIdeaChartMissingConfig()\r\n\r\n return (\r\n \r\n {hasConfig || isPerfQuotePage || isOptionsQuotePage ? (\r\n \r\n \r\n \r\n ) : null}\r\n {hasConfig && !isOptionsQuotePage && !isPerfQuotePage && (\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nready(() => {\r\n const statementsEl = document.getElementById('statements')\r\n if (statementsEl && window['fetch']) {\r\n const root = ReactDOMClient.createRoot(statementsEl)\r\n root.render()\r\n }\r\n\r\n const etfHoldingsEl = document.getElementById('js-etf-holdings')\r\n if (etfHoldingsEl) {\r\n const root = ReactDOMClient.createRoot(etfHoldingsEl)\r\n root.render(\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const faEl = document.getElementById('js-quote-fa')\r\n if (faEl) {\r\n const root = ReactDOMClient.createRoot(faEl)\r\n root.render()\r\n }\r\n\r\n const reactRootElement = document.getElementById('react-root')\r\n const quoteHeaderRoot = document.getElementById(QUOTE_HEADER_ROOT)\r\n\r\n if (FinvizSettings.quoteData) {\r\n Quote.create(FinvizSettings.quoteData)\r\n }\r\n\r\n if (window.globalChartConfig && !window.globalChartConfig.idea) {\r\n window.globalChartConfig = getInitChartConfig()\r\n }\r\n\r\n if (reactRootElement) {\r\n if (window.globalChartConfig?.ideaQuotes) {\r\n initIdeaQuotes(window.globalChartConfig.ideaQuotes, window.globalChartConfig)\r\n }\r\n\r\n const root = ReactDOMClient.createRoot(reactRootElement)\r\n\r\n root.render(\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n if (quoteHeaderRoot) {\r\n const quoteHeaderElement = getQuoteHeaderElement()\r\n if (quoteHeaderElement) {\r\n const root = ReactDOMClient.createRoot(quoteHeaderRoot)\r\n root.render(quoteHeaderElement)\r\n }\r\n }\r\n\r\n RenderMenuLinks()\r\n\r\n if (document.getElementById('app') && window['FinvizQuoteTickers']) {\r\n const appEl = document.getElementById('app')\r\n const root = ReactDOMClient.createRoot(appEl!)\r\n root.render()\r\n }\r\n})\r\n\r\nconst revealRatingButtonsCollection = document.getElementsByClassName('js-reveal-ratings-button')\r\nconst revealRatingButtons = Array.from(revealRatingButtonsCollection) as HTMLButtonElement[]\r\nrevealRatingButtons.forEach((revealRatingButton) => {\r\n revealRatingButton.onclick = (e) => {\r\n e.preventDefault()\r\n const ratingsRowWithTable = revealRatingButton.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 revealRatingButton.classList.add('hidden')\r\n window.gtag && window.gtag('event', 'click', { event_category: 'reveal-ratings' })\r\n }\r\n})\r\n","import React from 'react'\r\n\r\nimport { Dialog, useDialogState } from '../../../main/components/dialog'\r\nimport { Spinner } from '../../../main/components/spinner'\r\nimport { useAsyncModule } from '../../../main/services/async-modules-utils'\r\nimport { decodeQueryString } from '../../queryString'\r\nimport { saveToPortfolioAsyncModule } from '../save-to-portfolio/async-modules'\r\n\r\ntype SaveToPortfolioLinkProps = {\r\n index: number\r\n}\r\n\r\nexport default function SaveToPortfolioLink({ index }: SaveToPortfolioLinkProps) {\r\n const { t } = decodeQueryString()\r\n const urlTicker = t.split(',')[index]\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 {\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 Save 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 React from 'react'\r\n\r\nimport { Dialog, useDialogState } from '../../../main/components/dialog'\r\nimport { Spinner } from '../../../main/components/spinner'\r\nimport { useAsyncModule } from '../../../main/services/async-modules-utils'\r\nimport { decodeQueryString } from '../../queryString'\r\nimport { createAlertAsyncModule } from '../create-alert/async-modules'\r\n\r\ntype CreateAlertLinkProps = {\r\n index: number\r\n}\r\n\r\nexport default function CreateAlertLink({ index }: CreateAlertLinkProps) {\r\n const { t } = decodeQueryString()\r\n const urlTicker = t.split(',')[index]\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 {\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 >\r\n Create 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 { isForexFuturesCryptoPage } from 'finviz-charts/app/utils/chart'\r\nimport * as React from 'react'\r\n\r\nimport { TIMEFRAME } from '../../main/constants'\r\nimport { useWindowSize } from '../../main/hooks/use-window-size'\r\nimport { getIntradayChartConfig, useChartLayoutGlobalModelAsync, useModelState } from '../charts-lib'\r\n\r\nexport function getChartLayoutSizeConfig(\r\n layoutConfig: Pick<\r\n typeof window.globalChartConfig,\r\n 'idea' | 'barWidth' | 'barMargin' | 'charts' | 'specificChartFunctionality'\r\n >,\r\n p = TIMEFRAME.d\r\n) {\r\n const { clientWidth } = document.body\r\n const { premarket, aftermarket, dateRange } = layoutConfig.charts[0]\r\n const maxChartWidth = clientWidth - 40 // 40px left right chart padding = (19px * 2 for margin left/right) + (1px * 2 for border)\r\n let width = 990\r\n let barWidth = 3\r\n let barMargin = 1\r\n let timeframeMinutes = 0\r\n const isForexFuturesCrypto =\r\n layoutConfig.specificChartFunctionality && isForexFuturesCryptoPage(layoutConfig.specificChartFunctionality)\r\n\r\n switch (p) {\r\n case TIMEFRAME.i1:\r\n timeframeMinutes = 1\r\n barWidth = 1\r\n if (premarket || aftermarket || clientWidth < 1650) {\r\n barMargin = 0\r\n }\r\n break\r\n case TIMEFRAME.i2:\r\n timeframeMinutes = 2\r\n break\r\n case TIMEFRAME.i3:\r\n timeframeMinutes = 3\r\n if (premarket && aftermarket && clientWidth <= 1505) {\r\n barWidth = 2\r\n }\r\n break\r\n case TIMEFRAME.i5:\r\n timeframeMinutes = 5\r\n barWidth = 5\r\n barMargin = clientWidth >= 1100 ? 2 : 1\r\n break\r\n case TIMEFRAME.i10:\r\n width = 1058 // 39bars per day * 5days * 5px per bar + 35px left offset + 48px right offset\r\n barMargin = 0\r\n break\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n width = 1019\r\n break\r\n case TIMEFRAME.h:\r\n width = 1008\r\n break\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n width = 1020\r\n break\r\n case TIMEFRAME.d:\r\n width = 1282\r\n break\r\n case TIMEFRAME.w:\r\n case TIMEFRAME.m:\r\n width = 994\r\n break\r\n }\r\n\r\n switch (p) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n const commonProps = {\r\n timeframeMinutes,\r\n barWidthWithMargin: barWidth + 2 + barMargin,\r\n hasAftermarket: aftermarket,\r\n hasPremarket: premarket,\r\n }\r\n width = getIntradayChartConfig({\r\n ...commonProps,\r\n maxWidth: maxChartWidth,\r\n canCropChart: !dateRange,\r\n }).chartWidthWithOffset\r\n break\r\n }\r\n\r\n // If FFC chart use DAILY type width\r\n if (isForexFuturesCrypto) width = 1282\r\n\r\n // If chart is wider than available space in vieport override width\r\n if (maxChartWidth <= width) {\r\n width = Math.max(994, maxChartWidth)\r\n if (p === TIMEFRAME.d) {\r\n barWidth = 2\r\n barMargin = 0\r\n width = 991\r\n }\r\n }\r\n\r\n // If idea chart or FFC chart use bar configs from layout\r\n if (layoutConfig.idea || isForexFuturesCrypto) {\r\n barWidth = layoutConfig.barWidth\r\n barMargin = layoutConfig.barMargin\r\n }\r\n\r\n return {\r\n width,\r\n barWidth,\r\n barMargin,\r\n }\r\n}\r\n\r\nexport function useChartLayoutWidthWatch() {\r\n const { innerWidth } = useWindowSize()\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const unwatchedFirstChart = React.useMemo(() => chartLayoutModel?.charts().all()[0] ?? null, [chartLayoutModel])\r\n const chartModel = useModelState(unwatchedFirstChart, { watchProperties: ['quote'] })\r\n const quote = useModelState(chartModel?.quote() ?? null, { watchProperties: ['ticker', 'timeframe', 'isFetching'] })\r\n const ideaId = chartLayoutModel?.idea?.id\r\n\r\n React.useEffect(() => {\r\n const settings = !ideaId ? chartLayoutModel?.settings : null\r\n const timeframe = quote?.timeframe\r\n if (chartLayoutModel && timeframe && settings) {\r\n const { width, barWidth, barMargin } = getChartLayoutSizeConfig(chartLayoutModel.toConfig(), timeframe)\r\n const newSettings = JSON.parse(JSON.stringify(settings))\r\n newSettings.ChartSettings.center.barWidth = barWidth\r\n newSettings.IndicatorSettings.center.barWidth = barWidth\r\n newSettings.ChartSettings.center.barMargin = barMargin\r\n newSettings.IndicatorSettings.center.barMargin = barMargin\r\n chartLayoutModel.updateAttributes({ width, settings: newSettings })\r\n }\r\n // We don't want to trigger this effect on any chartLayoutModel change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [quote?.premarket, quote?.aftermarket, quote?.timeframe, ideaId, innerWidth])\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\ninterface Props {\r\n throttleWaitInMs?: number\r\n isWatching?: boolean\r\n}\r\n\r\nexport function useWindowSize({ throttleWaitInMs = 300, isWatching = true }: Props = {}) {\r\n const [size, setSize] = React.useState({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isWatching) return\r\n\r\n const handleResize = throttle(() => {\r\n setSize({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n }, throttleWaitInMs)\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n handleResize.cancel()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [throttleWaitInMs, isWatching])\r\n\r\n return size\r\n}\r\n","import { SpecificChartFunctionality } from '../../main/constants'\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 { Utils, convertTa } from '../charts-lib'\r\n\r\nexport function getInitChartConfig() {\r\n window.globalChartConfig.scrollable = false\r\n if (FinvizSettings.hasUserPremium) {\r\n window.globalChartConfig.scrollable = window.globalChartConfig.editable || !Utils.isMobile()\r\n }\r\n\r\n if (FinvizSettings.TA) {\r\n const COTs = FinvizSettings.COTs\r\n convertTa.mergeChartAndTAConfig(window.globalChartConfig, FinvizSettings.TA, COTs ? { COTs } : undefined)\r\n }\r\n\r\n return window.globalChartConfig\r\n}\r\n","import * as React from 'react'\r\n\r\nexport interface DelayedProps {\r\n /**\r\n * The delay in milliseconds before the component is rendered.\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n /**\r\n * Delay in milliseconds before rendering timeout state.\r\n */\r\n timeout?: number\r\n\r\n /**\r\n * Throw on timeout (suspense)\r\n */\r\n throwOnTimeout?: boolean\r\n\r\n /**\r\n * Component visible during the delay.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n delayComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when timeout is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n timeoutComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when delay is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function Delayed({\r\n delay = 300,\r\n timeout = 0,\r\n throwOnTimeout = false,\r\n delayComponent,\r\n timeoutComponent,\r\n children,\r\n}: DelayedProps) {\r\n const [visible, setVisible] = React.useState(false)\r\n const [hasTimedOut, setHasTimedOut] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const visibilityTimeout = window.setTimeout(() => setVisible(true), delay)\r\n\r\n let failedTimeout: number\r\n if (timeout > 0) {\r\n failedTimeout = window.setTimeout(() => {\r\n setHasTimedOut(true)\r\n if (throwOnTimeout) throw new Error()\r\n }, timeout)\r\n }\r\n\r\n return () => {\r\n clearTimeout(visibilityTimeout)\r\n clearTimeout(failedTimeout)\r\n }\r\n }, [delay, timeout, throwOnTimeout])\r\n\r\n if (!visible) return <>{delayComponent}\r\n\r\n if (hasTimedOut) {\r\n return <>{timeoutComponent}\r\n }\r\n\r\n return <>{children}\r\n}\r\n","import * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType\r\n\r\nexport enum NotificationPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight,\r\n}\r\n\r\nexport interface NotificationOptions {\r\n position?: NotificationPosition\r\n inline?: boolean\r\n}\r\n\r\nexport const NotificationContext = React.createContext<{\r\n show: (element: JSX.Element, options?: NotificationOptions) => void\r\n hide: () => void\r\n}>({\r\n show: () => {},\r\n hide: () => {},\r\n})\r\n\r\nexport function useNotification() {\r\n return React.useContext(NotificationContext)\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getVisualViewport, useVisualViewport } from '../../hooks/useVisualViewport'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const [notification, setNotification] = React.useState(null)\r\n const { viewport, setViewport } = useVisualViewport({ enabled: !!notification })\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getVisualViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n setIsOpen(true)\r\n },\r\n hide: () => setIsOpen(false),\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Ariakit.Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {isOpen && (\r\n \r\n \r\n {notification?.element}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n /**\r\n * Default button text\r\n * @default Close\r\n */\r\n closeText?: string\r\n\r\n /**\r\n * Custom buttons. Overrides `closeText`\r\n */\r\n actions?: JSX.Element\r\n\r\n /**\r\n * When set, the notification will automatically close\r\n */\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification({\r\n className,\r\n closeText = 'Close',\r\n actions,\r\n timeoutInMs,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: number\r\n if (timeoutInMs) {\r\n timeoutId = window.setTimeout(() => {\r\n notification.hide()\r\n }, timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, timeoutInMs])\r\n\r\n return (\r\n \r\n
{children}
\r\n
\r\n {actions ?? (\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\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"],"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","etfHoldingsAsyncModule","importFn","cacheKey","LoadingFallback","_jsx","className","children","Array","from","map","_","index","Spinner","withNotificationContext","etfHoldingsModule","useAsyncModule","shouldLoadModule","errorSeverity","ETFHoldingsComponent","ETFHoldings","BarChart","Component","constructor","_defineProperty","createRef","componentDidMount","this","renderChart","componentDidUpdate","_FinvizSettings","data","title","props","_prevData","svgRef","current","innerHTML","xAxisRotate","margin","marginRight","totalWidth","width","totalHeight","height","x","d3","domain","d","name","rangeRound","padding","value","y","range","abs","nice","yFormat","valueFormatter","tickFormat","svg","property","append","attr","xAxis","yAxis","ticks","call","tickSize","tickSizeOuter","selectAll","style","text","getHeight","_d$value","isOutside","enter","bandwidth","FinvizSettings","hasRedesignEnabled","outside","hasDarkTheme","render","ref","convertData","endYear","values","reverse","FAChart","_ref","id","smallRoundPlaces","largeRoundPlaces","smallScale","largeScale","smallTitleSufix","largeTitleSufix","FinvizFA","isLarge","scale","year","FundamentalCharts","_jsxs","_Fragment","align","redesignEnabled","colorScaleClass","monthNames","Chart","shouldComponentUpdate","nextProps","arr1","arr2","i","arraysEqual","tickers","_tickerQuote$0$ticker","_tickerQuote$","theme","Theme","dark","light","tickerQuote","Quote","select","q","close","includes","ticker","chartConfig","getStaticChartConfig","timeframe","TIMEFRAME","paneElements","type","ChartElementType","PerfChart","fromDate","fromDay","toDate","toDay","overlays","refreshData","specificChartFunctionality","SpecificChartFunctionality","quotePerf","BrowserRouter","ChartLayout","config","Table","months","rows","groupsCount","ceil","slice","tdClasses","classnames","trs","g","push","splice","month","forEach","row","col","monthIndex","parseFloat","concat","total","cellPadding","cellSpacing","border","Perf","_this","super","React","_fetch","state","dailyQuotes","o","h","l","c","v","date","Utils","dateFromUnixTimestamp","open","high","low","volume","updateAttributes","forceUpdate","async","isRefetch","t","decodeQueryString","setState","loading","all","quote","fetchData","fetchType","QuoteFetchType","Refetch","NewerData","updateQuoteData","destroy","instrument","Instrument","Stock","m","getAll","_this$containerRef$cu","containerRef","removeProperty","e","preventDefault","tickersInput","getSanitizedTicker","split","filter","target","formattedDate","formatDateToStringUS","now","getFullYear","getMonth","toString","padStart","label","substring","FinvizQuoteTickers","join","fromMonth","toMonth","minDate","dateFns","years","maxDate","minHeight","to","monthsToShow","quotesPerf","obj","perf","cols","isNaN","onSubmit","_onSubmit","marginBottom","onChange","position","top","right","fontSize","display","DatePicker","newValue","_onDatePickerChange","readOnly","_onMonthChange","bind","fontWeight","option","document","addEventListener","refetchQuotes","componentWillUnmount","unbind","removeEventListener","QuotePrice","dateLabel","price","changeUsd","changePct","fractions","hasValue","isFinite","formatDate","formatNumber","defaultValue","RedGreenMultiline","RedGreenText","showPlusSign","rightContent","QUOTE_HEADER_ROOT","STATIC_PRICE_SELECTOR","useReplaceStaticHeader","isLoaded","_document$querySelect","_document$getElementB","_document$querySelect2","_document$getElementB2","querySelector","classList","add","getElementById","remove","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","useChartContextPrices","chartLayoutModel","_chartModel$quote","chartModel","useModelState","charts","first","watchProperties","listenOnEvents","quoteModel","prevClose","lastClose","lastTime","lastDate","afterClose","afterTime","ChartContextQuoteHeader","useChartLayoutGlobalModelAsync","QuoteHeaderContent","ManualInitQuoteHeader","withCompleteLayoutModelInit","withQuotePolling","modelProperties","assign","chart_layout","panes","create","chart","get","options","maxBars","fetchAndMapInitialQuote","_ref2","isChange","isAfterChange","getDate","afterDate","afterhoursTitle","QuoteNodeChartTypes","QuoteUrlChartTypes","QuoteShortToLongType","cs","candlesticksimple","candlestick","line","ohlc","ha","heikinashi","hc","hollowcandlestick","QuoteLongToShortType","FREE_TYPES","DEFAULT_TYPES","icon","hasRedesign","ChartTypesSelect","isPremium","chartTypes","currentType","setSelectedChartTypeOverwrite","location","useLocation","b","ta","ty","p","r","search","taInt","parseInt","selectedChartTypeOverwrite","generateRouterPath","encodeQueryString","utm_source","utm_medium","utm_campaign","Boolean","item","href","reloadDocument","find","defaultType","FinvizQuoteTypeCurrent","useChartTypes","Select","size","leftContent","Icon","rounding","items","QuoteMenu","isInteractiveChart","isStockDetailUpdating","urlTickers","hasUserPremium","NotificationWrapper","StockDetailTimeframeBar","isDateRangeAvailable","isLoadingOverride","isScrollIntoViewEnabled","Button","LazyTippy","mounted","setMounted","useState","lazyPlugin","fn","onShow","onHidden","computedProps","plugins","_props$render","_len","args","_key","content","Tippy","unknown","bars","transition","exit","EliteHoverAd","BarChartWrapper","hover","placement","interactive","disabled","some","attrs","BarChartBig","Statements","source","_getDefaultSource","sheet","currency","pageRef","getInvestingChannelPage","_this$pageRef","hasData","error","paddingLeft","setValue","_renderSheetLink","_renderTimeframeLink","StatementsTable","onClick","response","fetch","json","getValue","_FinvizSettings2","isChartable","isHighlightRow","cellClass","skipFirst","parsedData","parsed","keys","key","parsedValue","replace","parseData","adRowIndexStart","rowIndex","rowSpan","colSpan","AdTag","CORRELATION_LINKS_CONTAINER_SELECTOR","MULTITICKER_CHART_ELEMENT_SELECTOR","then","RenderRecentQuotes","QuoteMenuPortal","quoteMenuElements","getElementsByClassName","quoteMenuHtmlElements","el","HTMLElement","quoteMenuElement","quoteMenuIndex","menuIndex","ReactDOM","MENU_LINKS","selector","LinkComponent","urlTicker","dialog","useDialogState","isVisible","saveToPortfolioModule","saveToPortfolioAsyncModule","SaveToPortfolio","_window$gtag","_window","window","gtag","event_category","ctrlKey","metaKey","show","Dialog","createAlertModule","createAlertAsyncModule","CreateAlert","ChartLayoutPortal","useChartLayoutWidthWatch","chartEl","CHART_ELEMENT_ID","globalChartConfig","defaultPeriod","ChartLayoutWithGlobalState","getChartLayoutSizeConfig","quotePage","_chart$dateRange","dateRange","FREE_DATE_RANGES","parentElement","QuotePageType","getQuotePageType","Options","Idea","StockDetail","ReactComponentsContainer","isInitializedRef","setIsStockDetailUpdating","multiTickerElements","correlationElements","abortController","AbortController","pathname","signal","virtualDOM","DOMParser","parseFromString","multiTickerHtmlElements","newMultiTickerHtmlElements","element","onload","src","correlationLinksTableCellHtmlElements","newCorrelationLinksTableCellHtmlElements","newsearchFunctionWrapperElement","dataset","setSearchExtArgument","quoteSearchExt","catch","err","Sentry","captureException","abort","useStockDetailUpdater","quotePageType","isPerfQuotePage","isOptionsQuotePage","hasConfig","useCheckNonIdeaChartMissingConfig","Suspense","fallback","ready","statementsEl","ReactDOMClient","etfHoldingsEl","faEl","reactRootElement","quoteHeaderRoot","quoteData","idea","getInitChartConfig","_window$globalChartCo","ideaQuotes","initIdeaQuotes","quoteHeaderElement","getQuoteHeaderElement","_ref3","linkElements","linkElement","appEl","revealRatingButtonsCollection","revealRatingButton","onclick","ratingsRowWithTable","previousElementSibling","querySelectorAll","rating","contains","layoutConfig","clientWidth","body","premarket","aftermarket","maxChartWidth","barWidth","barMargin","timeframeMinutes","isForexFuturesCrypto","isForexFuturesCryptoPage","i1","i2","i3","i5","i10","i15","i30","h2","h4","w","commonProps","barWidthWithMargin","hasAftermarket","hasPremarket","getIntradayChartConfig","maxWidth","canCropChart","chartWidthWithOffset","_chartLayoutModel$ide","innerWidth","throttleWaitInMs","isWatching","setSize","innerHeight","handleResize","throttle","cancel","useWindowSize","unwatchedFirstChart","_chartLayoutModel$cha","ideaId","settings","toConfig","newSettings","JSON","parse","stringify","ChartSettings","center","IndicatorSettings","default","colorsOverride","colors","getCustomColorsFromCookies","layout","LayoutType","scrollable","editable","ScaleType","Linear","leftOffset","stretch","elements","getParsedCookies","IC_PUBLISHER_ID","AdTagName","tagDefinition","IC_TickerInContent","placements","IC_MapsLeftRail","IC_Statements","IC_Groups","hasInvestingChannelAds","tracking","InvestingChannel","page","_window$InvestingChan","InvestingChannelQueue","_window$FINVIZ_IC_UAT","_window$InvestingChan2","UAT","Run","console","_window$InvestingChan3","_page","useInvestingChannelAds","deps","tagName","tagProps","placementName","isMobile","TA","COTs","convertTa","Delayed","delay","timeout","throwOnTimeout","delayComponent","timeoutComponent","visible","setVisible","hasTimedOut","setHasTimedOut","visibilityTimeout","setTimeout","failedTimeout","Error","clearTimeout","NotificationPosition","NotificationContext","hide","useNotification","isOpen","setIsOpen","notification","setNotification","viewport","setViewport","useVisualViewport","enabled","context","getVisualViewport","visualViewport","positionClass","_notification$options","BottomLeft","TopLeft","TopRight","BottomRight","WrapperComponent","inline","Ariakit","Provider","role","unmountOnHide","onClose","modal","backdrop","focusable","hideOnEscape","hideOnInteractOutside","autoFocusOnShow","autoFocusOnHide","transform","left","willChange","WrappedComponent","_WrappedComponent$dis","displayName","WithNotificationContext","notificationContext","Notification","closeText","actions","timeoutInMs","timeoutId","as","isIdeaNotFoundPage","reload","PADDING","getChartsDimensions","chartElementId","_box$width","_box$height","containerElement","box","getBoundingClientRect","getChartConfig","chartsDimensions","FinvizChartsSettings","ideaChart","editors","newCharts","alignChartsToRight","periods","ranges","taConfig","getInstrumentForTicker","hasChartEvents","quotes","hasPatterns","hasOwnProperty","drawMinutesPerDay","marketStartMinutes","premarketLengthMinutes","aftermarketLengthMinutes","ideaID"],"sourceRoot":""}