{"version":3,"file":"quote.0b447ffa.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/backtest/utils.tsx","webpack://@finviz/website/./js/app/charts-lib.ts","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/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/draw.tsx","webpack://@finviz/website/./js/app/quote/fullscreen.tsx","webpack://@finviz/website/./js/app/quote/settings.tsx","webpack://@finviz/website/./js/app/quote/quote-menu/menu-links.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-chart-layout-width-watch.ts","webpack://@finviz/website/./js/app/quote/use-stock-detail-updater.tsx","webpack://@finviz/website/./js/app/quote/index.tsx","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/components/Ads.tsx","webpack://@finviz/website/./js/app/shared/hooks/use-on-settings-click.tsx","webpack://@finviz/website/./js/app/shared/ready.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/main/hooks/use-check-non-idea-chart-missing-config.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 React from 'react'\r\n\r\nexport enum SettingsTab {\r\n Chart = 'chart',\r\n Colors = 'colors',\r\n}\r\n\r\nexport type ChartLayoutProps = {\r\n config: object\r\n onRegisterChartLayoutModel?: (chartLayout: any) => void\r\n shouldResize?: boolean\r\n parentElement?: HTMLElement\r\n}\r\n\r\nexport type ChartLayoutHeaderProps = {\r\n model: any\r\n onSettingsOpen: () => void\r\n hasPublish: boolean\r\n}\r\n\r\ninterface ChartsLib {\r\n FREE_DATE_RANGES: string[]\r\n ChartLayout: React.FC\r\n ChartLayoutHeader: React.FC\r\n ChartLayoutWithGlobalState: React.FC\r\n\r\n ChartSettings: React.FC<{\r\n onClose: () => void\r\n onActiveSettingsTabChange?: (settingsComponent: SettingsTab) => void\r\n activeSettingsTab?: SettingsTab\r\n }>\r\n\r\n PreventClosingUnsavedChanges: React.FC<{\r\n onHide: () => void\r\n children: (props: { checkForUnsavedChangesAndClose: () => void }) => React.ReactElement\r\n }>\r\n\r\n useChartLayoutGlobalModel: () => {\r\n chartLayoutModel: any | null\r\n chartLayoutModelConfigSnapshot: Record | null\r\n lastGlobalRerender: number\r\n setChartLayoutModel: (chartLayoutModel: any) => void\r\n getChartLayoutModelConfig: (props: { fallback: Record }) => Record\r\n forceGlobalRerender: () => void\r\n generateNewLayoutModelConfigSnapshot: () => void\r\n }\r\n\r\n StockDetailTimeframeBar: React.FC<{\r\n isDateRangeAvailable: boolean\r\n isPremium: boolean\r\n isLoadingOverride?: boolean\r\n }>\r\n\r\n Quote: {\r\n create(quote: any): any\r\n select: (query: (quote: any) => boolean) => any\r\n deleteAll: () => void\r\n findByAttribute: (attribute: string, value: any) => any\r\n getAll: (tickersAndTimeframes: any) => any\r\n }\r\n\r\n Settings: {\r\n MarketSentiment: any\r\n Indicator: any\r\n Chart: any\r\n Thumb: any\r\n Element: any\r\n Colors: string[]\r\n updateColors: (type: string, name: string, theme: 'light' | 'dark', value: string) => void\r\n }\r\n\r\n Utils: {\r\n dateFromUnixTimestamp: (date: string) => Date\r\n }\r\n\r\n convertTa: {\r\n getPanes: (taConfig: any) => any\r\n }\r\n\r\n useModelState: (\r\n model: Model | null,\r\n options: { watchProperties?: Array; listenOnEvents?: string[] }\r\n ) => Model | null\r\n}\r\n\r\n// @ts-ignore\r\nconst chartsLib = (window.FLibs.Charts as ChartsLib) ?? {}\r\n\r\nexport const FREE_DATE_RANGES = chartsLib.FREE_DATE_RANGES\r\nexport const ChartLayout = chartsLib.ChartLayout\r\nexport const ChartLayoutWithGlobalState = chartsLib.ChartLayoutWithGlobalState\r\nexport const ChartLayoutHeader = chartsLib.ChartLayoutHeader\r\nexport const ChartSettings = chartsLib.ChartSettings\r\nexport const PreventClosingUnsavedChanges = chartsLib.PreventClosingUnsavedChanges\r\nexport const useChartLayoutGlobalModel = chartsLib.useChartLayoutGlobalModel\r\nexport const StockDetailTimeframeBar = chartsLib.StockDetailTimeframeBar\r\nexport const Quote = chartsLib.Quote\r\nexport const Settings = chartsLib.Settings\r\nexport const Utils = chartsLib.Utils\r\nexport const convertTa = chartsLib.convertTa\r\nexport const useModelState = chartsLib.useModelState\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) - 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\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) => (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 * as dateFns from 'date-fns'\r\nimport { ChangeEvent, Component, FormEvent } from 'react'\r\nimport ReactDOM from 'react-dom'\r\n\r\nimport { DatePicker } from '../../main/components/date-picker'\r\nimport { ChartLayout, Quote, Utils } from '../charts-lib'\r\nimport { getStaticChartConfig } from '../shared/chartLayoutConfig'\r\nimport { SpecificChartFunctionality } from '../shared/chartLayoutConfig'\r\nimport { ready } from '../shared/ready'\r\nimport { getSanitizedTicker } from '../shared/ticker-sanitizer'\r\nimport { formatDateToStringUS } from '../shared/utils'\r\n\r\nvar colorScale = function (value: number) {\r\n if (value < 0) {\r\n return '#aa0000'\r\n } else if (value > 0) {\r\n return '#008800'\r\n }\r\n return '#000'\r\n}\r\n\r\nready(function () {\r\n var monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\n var 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\n interface ChartProps {\r\n tickers: string[]\r\n fromDay: string\r\n toDay: string\r\n }\r\n\r\n class 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 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: 'd',\r\n paneElements: [\r\n {\r\n type: 'charts/perf_chart',\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 specificChartFunctionality: SpecificChartFunctionality.quotePage,\r\n })\r\n return (\r\n
\r\n \r\n
\r\n )\r\n }\r\n }\r\n\r\n interface 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\n class 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\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 \r\n {row.ticker}\r\n \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\n interface 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\n class Perf extends Component {\r\n constructor(props: any) {\r\n super(props)\r\n var now = new Date(),\r\n months = []\r\n for (var year = 2009; 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 minDate: formatDateToStringUS(dateFns.subYears(new Date(), 9)),\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
Loading...
\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 componentDidMount() {\r\n this._fetch(this.state.tickers, this.state.fromDay, this.state.toDay)\r\n }\r\n\r\n _fetch = async (tickers: string[], fromDay: string, toDay: string) => {\r\n this.setState({ loading: true })\r\n var d = tickers.map((ticker) => ({ ticker: ticker, timeframe: 'd', instrument: 'stock' }))\r\n var m = tickers.map((ticker) => ({ ticker: ticker, timeframe: 'm', instrument: 'stock' }))\r\n Quote.deleteAll()\r\n await Quote.getAll(d.concat(m))\r\n var dailyQuotes = Quote.select((q: any) => q.timeframe === 'd')\r\n var fromDate = new Date(fromDay + ' 00:00')\r\n var toDate = new Date(toDay + ' 23:59')\r\n dailyQuotes.forEach((q: any) => {\r\n var o = [],\r\n h = [],\r\n l = [],\r\n c = [],\r\n d = [],\r\n v = []\r\n for (var i = 0; i < q.close.length; i++) {\r\n var 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.open = o\r\n q.high = h\r\n q.low = l\r\n q.close = c\r\n q.date = d\r\n q.volume = v\r\n q.save()\r\n })\r\n\r\n this.setState({\r\n loading: false,\r\n })\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({\r\n tickers,\r\n tickersInput,\r\n })\r\n this._fetch(tickers, this.state.fromDay, this.state.toDay)\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\r\n if (type === 'from') {\r\n this._fetch(this.state.tickers, formattedDate, this.state.toDay)\r\n } else {\r\n this._fetch(this.state.tickers, this.state.fromDay, formattedDate)\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\r\n if (document.getElementById('chart') && window['FinvizQuoteTickers']) {\r\n ReactDOM.render(, document.getElementById('chart'))\r\n }\r\n})\r\n","import { IconNameType } from '../../../main/components/icon'\r\nimport { SelectItem } from '../../../main/components/select'\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 { iconName: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle' },\r\n { iconName: 'lineChartType', value: QuoteNodeChartTypes.line, label: 'Line' },\r\n { iconName: 'ohlcChartType', value: QuoteNodeChartTypes.ohlc, label: 'OHLC' },\r\n { iconName: 'candleBarHollow', value: QuoteNodeChartTypes.hollowcandlestick, label: 'Hollow Candle' },\r\n { iconName: 'candleBarHeikinAshi', value: QuoteNodeChartTypes.heikinashi, label: 'Heikin Ashi' },\r\n]\r\n\r\nexport type TypeBaseOption = SelectItem & {\r\n iconName: IconNameType\r\n href: string\r\n}\r\n","import * as React from 'react'\r\nimport { Link } from 'react-router-dom'\r\n\r\nimport { Select, SelectOption } from '../../../main/components/select'\r\nimport { useChartTypes } from './use-chart-type'\r\n\r\nconst SELECT_LIST_PROPS = { rounding: 'none' } as const\r\nconst buttonStyle: React.CSSProperties = { height: 28, border: '1px solid #f0f1f5', color: '#000' }\r\n\r\nconst isNativeMobileSelect = true // explicitly enable native select for mobile devices\r\n\r\nexport function ChartTypesSelect({ isPremium }: { isPremium: boolean }) {\r\n const { chartTypes, getCurrentType } = useChartTypes({ isPremium })\r\n const currentType = getCurrentType()\r\n\r\n return (\r\n item.value === currentType)?.iconName}\r\n rightContent=\"caretDown\"\r\n listProps={SELECT_LIST_PROPS}\r\n hasPopoverButtonWidthLimit={false}\r\n isNativeMobileSelect={isNativeMobileSelect}\r\n >\r\n {chartTypes.map((item) => (\r\n \r\n {item.label}\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, 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\r\n const getCurrentType = React.useCallback(() => {\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 ? QuoteNodeChartTypes.candlesticksimple\r\n : defaultType\r\n }, [isPremium, taInt, ty])\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 ? { iconName: '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 return { getCurrentType, chartTypes }\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { Button } from '../../main/components/button'\r\nimport { encodeQueryString } from '../queryString'\r\nimport { getIsDrawingEnabledOnQuotePage, setIsDrawingEnabledOnQuotePage } from '../shared/utils'\r\n\r\ninterface Props {\r\n isPremium: boolean\r\n}\r\n\r\nexport default function Draw({ isPremium }: Props) {\r\n const isDrawingEnabled = getIsDrawingEnabledOnQuotePage()\r\n return (\r\n {\r\n e.preventDefault()\r\n\r\n if (isPremium) {\r\n setIsDrawingEnabledOnQuotePage(!isDrawingEnabled)\r\n } else {\r\n document.location = `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: 'quote-draw-button',\r\n })}`\r\n }\r\n }}\r\n data-testid=\"quote-toggle-draw-btn\"\r\n >\r\n Draw\r\n \r\n )\r\n}\r\n","import { Button } from '../../main/components/button'\r\nimport { decodeQueryString } from '../queryString'\r\nimport { encodeQueryString } from '../queryString'\r\n\r\nfunction getTickersString(tickers: string[], tickersCount: number) {\r\n return Array.from({ length: Math.min(tickersCount, 6) })\r\n .map((_, index) => tickers[index] ?? tickers[tickers.length - 1])\r\n .join(',')\r\n}\r\n\r\nfunction getLayoutType(tickersCount: number) {\r\n switch (tickersCount) {\r\n case 0: // shouldn't happen\r\n case 1:\r\n return '1h1v'\r\n case 2:\r\n return '2h1v'\r\n case 3:\r\n return '3h1v'\r\n case 4:\r\n return '2h2v'\r\n case 5:\r\n default:\r\n // 6 and more\r\n return '3h2v'\r\n }\r\n}\r\n\r\ninterface Props {\r\n isPremium: boolean\r\n}\r\n\r\nexport function Fullscreen({ isPremium }: Props) {\r\n const { i, t, p = 'd', r } = decodeQueryString()\r\n const urlTickers = t.split(',')\r\n\r\n return (\r\n p).join(','),\r\n l: getLayoutType(urlTickers.length),\r\n r,\r\n })}`\r\n : `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: 'quote-fullscreen-button',\r\n })}`\r\n }\r\n target=\"_blank\"\r\n >\r\n Fullscreen\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Button } from '../../main/components/button'\r\nimport { getExtendedDialogState } from '../../main/components/dialog'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../../main/components/popover'\r\nimport { useElementMeasure } from '../../main/hooks/use-element-measure'\r\nimport { ChartSettings, PreventClosingUnsavedChanges, useChartLayoutGlobalModel, useModelState } from '../charts-lib'\r\nimport { useOnSettingsClick } from '../shared/hooks/use-on-settings-click'\r\n\r\ninterface Props {\r\n isPremium: boolean\r\n}\r\n\r\nconst BUTTON_POPOVER_GUTTER = 16\r\nconst CHART_POPOVER_SPACE_IN_PX = 16\r\nconst SETTINGS_POPOVER_ID = 'settings-popover'\r\n\r\nfunction getChartOffsetWhenSettingsIsOpen({\r\n settingsPopover,\r\n chartElement,\r\n}: {\r\n settingsPopover: HTMLElement\r\n chartElement: HTMLElement\r\n}) {\r\n const chartsDrawingToolsElement = document.getElementById('charts-drawing-tools') as HTMLDivElement | undefined\r\n const { ishorizontal } = chartsDrawingToolsElement?.dataset ?? {}\r\n const drawingToolsWidth = ishorizontal === '1' ? 0 : 95\r\n const settingsPopoverBoundingClientRect = settingsPopover.getBoundingClientRect()\r\n const chartElementBoundingClientRect = chartElement.getBoundingClientRect()\r\n const popoverLeftFromWindowRight = window.innerWidth - settingsPopoverBoundingClientRect.left\r\n const chartElementRightFromWindowRight = window.innerWidth - chartElementBoundingClientRect.right\r\n\r\n const chartOffset = chartElementRightFromWindowRight - popoverLeftFromWindowRight - CHART_POPOVER_SPACE_IN_PX\r\n if (Math.abs(chartOffset) + CHART_POPOVER_SPACE_IN_PX + drawingToolsWidth < chartElementBoundingClientRect.left) {\r\n return `${chartOffset}px`\r\n }\r\n return 0\r\n}\r\n\r\ntype PopoverStylesType = { body?: React.CSSProperties; wrapper?: React.CSSProperties }\r\n\r\nfunction Settings({ isPremium }: Props) {\r\n const { chartLayoutModel: unwatchedChartLayoutModel } = useChartLayoutGlobalModel()\r\n const chartLayoutModel = useModelState(unwatchedChartLayoutModel, { watchProperties: ['idea'] })\r\n const { setElementRef, elementHeight } = useElementMeasure()\r\n const [popoverStylesState, setPopoverStylesState] = React.useState(null)\r\n\r\n const settingsPopoverState = usePopoverState({ placement: 'bottom-end', unstable_offset: [0, BUTTON_POPOVER_GUTTER] })\r\n const { isFullyClosed } = getExtendedDialogState(settingsPopoverState)\r\n const chartElement = document.getElementById('chart')\r\n const popoverContentElement = document.getElementById(SETTINGS_POPOVER_ID)\r\n const settingsButton = settingsPopoverState.unstable_referenceRef.current\r\n const onSettingsClick = useOnSettingsClick({\r\n isPremium,\r\n page: 'quote',\r\n openSettingsCallback: settingsPopoverState.show,\r\n })\r\n\r\n const popoverStyles = React.useMemo(() => {\r\n let newPopoverStyles: PopoverStylesType = {}\r\n if (!settingsButton || !chartElement) {\r\n setPopoverStylesState(newPopoverStyles)\r\n return\r\n }\r\n const top = settingsButton.offsetTop + settingsButton.offsetHeight\r\n newPopoverStyles.body = {\r\n maxHeight: window.innerHeight - top - BUTTON_POPOVER_GUTTER * 2,\r\n position: 'sticky',\r\n top: -top,\r\n }\r\n if (!popoverContentElement) {\r\n setPopoverStylesState(newPopoverStyles)\r\n return\r\n }\r\n setElementRef(chartElement as HTMLDivElement)\r\n newPopoverStyles.wrapper = {\r\n height: popoverContentElement.offsetHeight < chartElement.clientHeight ? chartElement.clientHeight : 'auto',\r\n }\r\n setPopoverStylesState(newPopoverStyles)\r\n }, [chartElement, settingsButton, popoverContentElement, setElementRef, setPopoverStylesState])\r\n\r\n React.useEffect(() => {\r\n if (chartElement && popoverContentElement) {\r\n setPopoverStylesState((prevState) => ({\r\n ...prevState,\r\n wrapper: {\r\n height: popoverContentElement.offsetHeight < chartElement.clientHeight ? chartElement.clientHeight : 'auto',\r\n },\r\n }))\r\n }\r\n }, [elementHeight, popoverContentElement, chartElement])\r\n\r\n React.useEffect(() => {\r\n if (chartElement) {\r\n // transform = translateX even with 0 move element to new CSS stacking context and z-index don't work then what break's select hover,\r\n // unset fix that issue and do same thing as translateX(0)\r\n chartElement.style.transform = 'unset'\r\n chartElement.style.height = 'auto'\r\n if (settingsPopoverState.visible && popoverContentElement) {\r\n chartElement.style.transform = `translateX(${getChartOffsetWhenSettingsIsOpen({\r\n settingsPopover: popoverContentElement,\r\n chartElement,\r\n })})`\r\n }\r\n }\r\n }, [chartElement, settingsPopoverState.visible, popoverStyles, popoverContentElement])\r\n\r\n return (\r\n <>\r\n \r\n Settings\r\n \r\n \r\n {({ checkForUnsavedChangesAndClose }) => (\r\n \r\n {!isFullyClosed && }\r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default Settings\r\n","import * as React from 'react'\r\n\r\nimport { decodeQueryString, encodeQueryString } from '../../queryString'\r\nimport { getCookie } from '../../shared/cookie'\r\n\r\ninterface Props {\r\n index: number\r\n isPremium: boolean\r\n isScreener: boolean\r\n}\r\n\r\nexport function MenuLinks({ index, isPremium, isScreener }: Props) {\r\n const { b, t, ty, ta, p = 'd' } = decodeQueryString()\r\n const isUrlBack = !!b && Number.parseInt(b) > 0\r\n const isBackToScreenerUrl = isUrlBack && Number.parseInt(b) === 1\r\n const cookie = isUrlBack\r\n ? decodeURIComponent(getCookie(isBackToScreenerUrl ? 'screenerUrl' : 'insiderTradingUrl'))\r\n : null\r\n const backToLink =\r\n isScreener && isUrlBack && cookie ? (\r\n \r\n back to {isBackToScreenerUrl ? 'screener' : 'insider'}\r\n \r\n ) : null\r\n const urlTickers = t.split(',')\r\n const hasMoreTickers = !!t && urlTickers.length > 1\r\n const openInScreener =\r\n isScreener && hasMoreTickers ? (\r\n \r\n open in screener\r\n \r\n ) : null\r\n const publishChartLinkButton =\r\n ty !== 'p' ? (\r\n {\r\n event.preventDefault()\r\n }}\r\n className=\"tab-link js-publish-chart\"\r\n data-index={index}\r\n data-ticker={urlTickers[index]}\r\n data-timeframe={p}\r\n >\r\n publish chart\r\n \r\n ) : null\r\n const saveToPortfolioLink = (\r\n \r\n save to portfolio\r\n \r\n )\r\n const createAlertLink = (\r\n \r\n create alert\r\n \r\n )\r\n const backToChartLink =\r\n isPremium && ty === 'p' ? (\r\n \r\n back to chart\r\n \r\n ) : (\r\n \r\n compare perf.\r\n \r\n )\r\n\r\n const links = [\r\n backToLink,\r\n openInScreener,\r\n publishChartLinkButton,\r\n saveToPortfolioLink,\r\n createAlertLink,\r\n backToChartLink,\r\n ].filter(Boolean)\r\n\r\n return (\r\n
\r\n {links.map((link, index) => (\r\n \r\n {index > 0 ? | : null}\r\n
{link}
\r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { StockDetailTimeframeBar, useChartLayoutGlobalModel } from '../../../app/charts-lib'\r\nimport { NotificationWrapper } from '../../../main/components/notification'\r\nimport { decodeQueryString } from '../../queryString'\r\nimport { ChartTypesSelect } from '../chart-type-select'\r\nimport Draw from '../draw'\r\nimport { Fullscreen } from '../fullscreen'\r\nimport Settings from '../settings'\r\nimport { MenuLinks } from './menu-links'\r\n\r\ninterface Props {\r\n index: number\r\n isChartTAS: boolean\r\n isScreener: boolean\r\n isInteractiveChart: boolean\r\n isStockDetailUpdating: boolean\r\n}\r\n\r\nexport function QuoteMenu({ index, isChartTAS, isScreener, isInteractiveChart, isStockDetailUpdating }: Props) {\r\n const { chartLayoutModel } = useChartLayoutGlobalModel()\r\n\r\n const { ty, i } = decodeQueryString()\r\n const isPremium = FinvizSettings.hasUserPremium\r\n\r\n if (i && !chartLayoutModel?.idea) {\r\n return null\r\n }\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n {ty !== 'p' && (\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' && isChartTAS && (\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 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 { 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\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 sheet: string\r\n timeframe: string\r\n currency: string | null\r\n data: Record | null\r\n}\r\n\r\nclass Statements extends Component {\r\n declare pageRef: ReturnType\r\n\r\n state: StatementsState = {\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 { currency, data } = this.state\r\n\r\n if (data === null || (data && data.error)) {\r\n return null\r\n }\r\n\r\n const skipFirst = data['Period End Date'][0] === 'TTM'\r\n const parsedData = this._parseData(data, skipFirst)\r\n\r\n const adRowIndexStart = data['Period Length'] ? 2 : 1\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 {this._renderSheetLink('I', 'income statement')} | {this._renderSheetLink('B', 'balance sheet')} |{' '}\r\n {this._renderSheetLink('C', 'cash flow')}\r\n \r\n {this._renderTimeframeLink('A', 'annual')} | {this._renderTimeframeLink('Q', 'quarterly')}\r\n
\r\n \r\n \r\n {Object.keys(data).map((key, rowIndex) => (\r\n \r\n {key}\r\n \r\n {this._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 (index > 2 && key !== 'Period End Date' && key !== 'Period Length') {\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\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 _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 return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n _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 _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 (this._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 async _fetch() {\r\n const { 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}&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\r\nexport default Statements\r\n","import * as React from 'react'\r\n\r\nimport { TIMEFRAME } from '../../main/constants'\r\nimport { useChartLayoutGlobalModel, useModelState } from '../charts-lib'\r\n\r\nexport function getChartLayoutSizeConfig(\r\n p = TIMEFRAME.d,\r\n layoutConfig?: Pick\r\n) {\r\n let width = 990\r\n let barWidth = 3\r\n let barMargin = 1\r\n\r\n switch (p) {\r\n case TIMEFRAME.i1:\r\n width = 1523 + 90 * 3\r\n barWidth = 1\r\n barMargin = 0\r\n break\r\n case TIMEFRAME.i3:\r\n width = 1043 + (90 / 3) * 6\r\n break\r\n case TIMEFRAME.i5:\r\n width = 947 + (90 / 5) * 9\r\n barWidth = 5\r\n barMargin = 2\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 barWidth = 3\r\n barMargin = 0\r\n break\r\n case TIMEFRAME.i15:\r\n width = 865\r\n break\r\n case TIMEFRAME.i30:\r\n width = 865\r\n break\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n width = 924\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 if (document.documentElement.clientWidth <= width) {\r\n width = 994\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 (layoutConfig?.idea) {\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 { chartLayoutModel } = useChartLayoutGlobalModel()\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 (timeframe && settings) {\r\n const { width, barWidth, barMargin } = getChartLayoutSizeConfig(timeframe)\r\n settings.ChartSettings.center.barWidth = barWidth\r\n settings.IndicatorSettings.center.barWidth = barWidth\r\n settings.ChartSettings.center.barMargin = barMargin\r\n settings.IndicatorSettings.center.barMargin = barMargin\r\n\r\n chartLayoutModel.updateAttributes({ width, settings })\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?.timeframe, ideaId])\r\n}\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 window.SetSearchExt?.(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 React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport { BrowserRouter } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../main/constants'\r\nimport { useCheckNonIdeaChartMissingConfig } from '../../main/hooks/use-check-non-idea-chart-missing-config'\r\nimport { ChartLayoutWithGlobalState, FREE_DATE_RANGES } from '../charts-lib'\r\nimport { decodeQueryString } from '../queryString'\r\nimport { SpecificChartFunctionality } from '../shared/chartLayoutConfig'\r\nimport { ready } from '../shared/ready'\r\nimport FundamentalCharts from './fundamentalCharts'\r\nimport './quote'\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\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 { ischarttas, isscreener } = quoteMenuElement.dataset\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 ChartLayoutPortal = () => {\r\n useChartLayoutWidthWatch()\r\n const chartEl = document.getElementById('chart')\r\n const chartConfig = window.globalChartConfig\r\n\r\n if (chartEl && chartConfig) {\r\n const { p } = 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) ? chart.dateRange : null,\r\n })),\r\n }}\r\n parentElement={chartEl}\r\n />,\r\n chartEl\r\n )\r\n }\r\n return null\r\n}\r\n\r\nconst ReactComponentsContainer = () => {\r\n const { isStockDetailUpdating } = useStockDetailUpdater()\r\n const { ty } = decodeQueryString()\r\n const isPerfQuotePage = ty === 'p'\r\n const hasConfig = window.globalChartConfig\r\n\r\n useCheckNonIdeaChartMissingConfig()\r\n\r\n return (\r\n <>\r\n {hasConfig || isPerfQuotePage ? : null}\r\n {hasConfig && }\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 ReactDOM.render(, statementsEl)\r\n }\r\n\r\n const faEl = document.getElementById('js-quote-fa')\r\n if (faEl) {\r\n ReactDOM.render(, faEl)\r\n }\r\n\r\n const reactRootElement = document.getElementById('react-root')\r\n if (reactRootElement) {\r\n ReactDOM.render(\r\n \r\n \r\n ,\r\n reactRootElement\r\n )\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 tableElement = revealRatingButton.closest('.js-table-ratings')\r\n\r\n tableElement?.querySelectorAll('tr.hidden').forEach((rating) => {\r\n rating.classList.remove('hidden')\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 { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps {\r\n type: string\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n overlays: string[]\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n ticker: string\r\n timeframe: string\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: '1h1v',\r\n width: 800,\r\n height: 400,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n colors: getCustomColorsFromCookies(),\r\n charts: [\r\n {\r\n height: 400,\r\n timeframe,\r\n scale: 'linear',\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: 'stock',\r\n refreshData: false,\r\n stretch: true,\r\n panes: [\r\n {\r\n height: 400,\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 page = window.InvestingChannel?.UAT.Run(IC_PUBLISHER_ID)\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 * as React from 'react'\r\n\r\nimport { encodeQueryString } from '../../queryString'\r\n\r\ninterface IUseOnSettingsClick {\r\n openSettingsCallback: () => void\r\n isPremium: boolean\r\n page: string\r\n}\r\n\r\n/**\r\n * Hook which provides settings open handler function\r\n */\r\nexport function useOnSettingsClick({ openSettingsCallback, isPremium, page }: IUseOnSettingsClick) {\r\n const onSettingsClick = React.useCallback(\r\n (e: React.MouseEvent) => {\r\n e.preventDefault()\r\n if (isPremium) {\r\n openSettingsCallback()\r\n } else {\r\n document.location = `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: `${page}-settings-button`,\r\n })}`\r\n }\r\n },\r\n [isPremium, page, openSettingsCallback]\r\n )\r\n return onSettingsClick\r\n}\r\n","export function ready(fn: (ev?: Event) => any) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\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"],"names":["round","n","places","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","SettingsTab","chartsLib","window","FLibs","Charts","FREE_DATE_RANGES","ChartLayout","ChartLayoutWithGlobalState","ChartLayoutHeader","ChartSettings","PreventClosingUnsavedChanges","useChartLayoutGlobalModel","StockDetailTimeframeBar","Quote","Utils","Settings","convertTa","useModelState","BarChart","Component","createRef","componentDidMount","this","renderChart","componentDidUpdate","data","title","props","_prevData","svgRef","current","innerHTML","xAxisRotate","margin","marginRight","totalWidth","width","totalHeight","height","x","d3","domain","map","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","isOutside","enter","bandwidth","outside","render","ref","className","convertData","endYear","values","index","reverse","FAChart","id","smallRoundPlaces","largeRoundPlaces","smallScale","largeScale","smallTitleSufix","largeTitleSufix","FinvizFA","isLarge","scale","year","FundamentalCharts","align","colorScale","ready","monthNames","Chart","shouldComponentUpdate","nextProps","arr1","arr2","length","i","arraysEqual","tickers","tickerQuote","q","close","includes","ticker","chartConfig","getStaticChartConfig","timeframe","paneElements","type","fromDate","fromDay","toDate","toDay","overlays","specificChartFunctionality","SpecificChartFunctionality","config","Table","months","rows","groupsCount","ceil","slice","trs","g","push","splice","month","forEach","row","textAlign","col","monthIndex","color","parseFloat","total","cellPadding","cellSpacing","border","Perf","constructor","super","async","setState","loading","instrument","m","concat","dailyQuotes","o","h","l","c","v","date","open","high","low","volume","save","e","preventDefault","tickersInput","getSanitizedTicker","state","split","_fetch","filter","target","formattedDate","formatDateToStringUS","now","getFullYear","getMonth","toString","padStart","label","substring","FinvizQuoteTickers","join","fromMonth","toMonth","minDate","dateFns","maxDate","fontFamily","fontSize","from","to","monthsToShow","quotesPerf","obj","perf","quote","cols","isNaN","position","onSubmit","_onSubmit","marginBottom","onChange","top","right","display","DatePicker","newValue","_onDatePickerChange","readOnly","_onMonthChange","bind","fontWeight","option","document","getElementById","ReactDOM","QuoteNodeChartTypes","QuoteUrlChartTypes","QuoteShortToLongType","cs","candlesticksimple","candlestick","line","ohlc","ha","heikinashi","hc","hollowcandlestick","QuoteLongToShortType","FREE_TYPES","DEFAULT_TYPES","iconName","SELECT_LIST_PROPS","rounding","buttonStyle","ChartTypesSelect","isPremium","chartTypes","getCurrentType","location","useLocation","b","t","ta","ty","p","r","decodeQueryString","search","taInt","parseInt","React","defaultType","FinvizQuoteTypeCurrent","generateRouterPath","encodeQueryString","utm_source","utm_medium","utm_campaign","Boolean","item","href","reloadDocument","useChartTypes","currentType","Select","items","leftContent","find","rightContent","listProps","hasPopoverButtonWidthLimit","isNativeMobileSelect","SelectOption","as","Link","undefined","FinvizSettings","hasUserPremium","Draw","isDrawingEnabled","getIsDrawingEnabledOnQuotePage","Button","size","classnames","onClick","setIsDrawingEnabledOnQuotePage","getLayoutType","tickersCount","Fullscreen","urlTickers","Array","_","SETTINGS_POPOVER_ID","chartLayoutModel","unwatchedChartLayoutModel","watchProperties","setElementRef","elementHeight","useElementMeasure","popoverStylesState","setPopoverStylesState","settingsPopoverState","usePopoverState","placement","unstable_offset","isFullyClosed","getExtendedDialogState","chartElement","popoverContentElement","settingsButton","unstable_referenceRef","onSettingsClick","useOnSettingsClick","page","openSettingsCallback","show","popoverStyles","newPopoverStyles","offsetTop","offsetHeight","body","maxHeight","innerHeight","BUTTON_POPOVER_GUTTER","wrapper","clientHeight","prevState","transform","visible","settingsPopover","chartsDrawingToolsElement","ishorizontal","dataset","drawingToolsWidth","settingsPopoverBoundingClientRect","getBoundingClientRect","chartElementBoundingClientRect","popoverLeftFromWindowRight","innerWidth","left","chartOffset","getChartOffsetWhenSettingsIsOpen","PopoverTrigger","disabled","idea","onHide","hide","checkForUnsavedChangesAndClose","Popover","popoverWrapperStyle","focusOnHide","hideOnClickOutside","onOverlayClick","onClose","MenuLinks","isScreener","isUrlBack","isBackToScreenerUrl","cookie","decodeURIComponent","getCookie","backToLink","hasMoreTickers","links","event","tas","link","QuoteMenu","isChartTAS","isInteractiveChart","isStockDetailUpdating","NotificationWrapper","isDateRangeAvailable","isLoadingOverride","LazyTippy","mounted","setMounted","useState","lazyPlugin","fn","onShow","onHidden","computedProps","plugins","args","content","bars","transition","exit","remove","EliteHoverAd","src","alt","BarChartWrapper","hover","interactive","some","attrs","Statements","sheet","currency","pageRef","getInvestingChannelPage","create","componentWillUnmount","destroy","error","skipFirst","parsedData","_parseData","adRowIndexStart","_renderSheetLink","_renderTimeframeLink","keys","key","rowIndex","_isHighlightRow","_isChartable","rowSpan","colSpan","parsed","parsedValue","replace","response","fetch","json","getChartLayoutSizeConfig","TIMEFRAME","layoutConfig","barWidth","barMargin","documentElement","clientWidth","CORRELATION_LINKS_CONTAINER_SELECTOR","MULTITICKER_CHART_ELEMENT_SELECTOR","QuoteMenuPortal","quoteMenuElements","getElementsByClassName","quoteMenuHtmlElements","el","HTMLElement","quoteMenuElement","quoteMenuIndex","ischarttas","isscreener","ChartLayoutPortal","unwatchedFirstChart","charts","all","chartModel","ideaId","settings","center","IndicatorSettings","updateAttributes","useChartLayoutWidthWatch","chartEl","globalChartConfig","chart","dateRange","parentElement","ReactComponentsContainer","isInitializedRef","setIsStockDetailUpdating","multiTickerElements","correlationElements","abortController","AbortController","pathname","signal","then","virtualDOM","DOMParser","parseFromString","multiTickerHtmlElements","newMultiTickerHtmlElements","element","onload","correlationLinksTableCellHtmlElements","newCorrelationLinksTableCellHtmlElements","newsearchFunctionWrapperElement","setSearchExtArgument","SetSearchExt","catch","err","Sentry","captureException","abort","useStockDetailUpdater","isPerfQuotePage","hasConfig","useCheckNonIdeaChartMissingConfig","statementsEl","faEl","reactRootElement","BrowserRouter","revealRatingButtonsCollection","revealRatingButton","onclick","tableElement","closest","querySelectorAll","rating","classList","add","gtag","event_category","default","colorsOverride","layout","scrollable","editable","colors","getCustomColorsFromCookies","leftOffset","refreshData","stretch","panes","elements","JSON","parse","getParsedCookies","AdTagName","tagDefinition","IC_TickerInContent","placements","minHeight","IC_MapsLeftRail","IC_Statements","IC_Groups","hasInvestingChannelAds","tracking","InvestingChannelQueue","InvestingChannel","UAT","Run","console","useInvestingChannelAds","deps","AdTag","tagName","tagProps","placementName","readyState","addEventListener","AdsProvider","getAdsProvider","None","adsProvider","Freestar","trackPageView","query","freestarPageView","freestar","queue","trackPageview","isIdeaNotFoundPage","reload"],"sourceRoot":""}