{"version":3,"file":"revenue.b0689cde.js","mappings":"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","sources":["webpack://@finviz/website/./js/main/components/SubMenu/SubMenu.tsx","webpack://@finviz/website/./js/main/components/SubMenu/SubMenuTabs.tsx","webpack://@finviz/website/./js/main/components/chart/ManualGrid.tsx","webpack://@finviz/website/./js/main/components/financials-table/constants.ts","webpack://@finviz/website/./js/main/components/financials-table/useFinancialsTablePersistScrollPosition.ts","webpack://@finviz/website/./js/main/components/line-stacked-bar-chart/ChartTooltip.tsx","webpack://@finviz/website/./js/main/components/line-stacked-bar-chart/constants.ts","webpack://@finviz/website/./js/main/components/line-stacked-bar-chart/utils.ts","webpack://@finviz/website/./js/main/components/line-stacked-bar-chart/BarChart.tsx","webpack://@finviz/website/./js/main/components/line-stacked-bar-chart/EmptyDataOverlayWrapper.tsx","webpack://@finviz/website/../node_modules/recharts/es6/chart/LineChart.js","webpack://@finviz/website/./js/main/components/line-stacked-bar-chart/LineChart.tsx","webpack://@finviz/website/./js/main/components/line-stacked-bar-chart/XAxis.tsx","webpack://@finviz/website/./js/main/components/line-stacked-bar-chart/LineStackedBarChart.tsx","webpack://@finviz/website/./js/main/components/line-stacked-bar-chart/types.ts","webpack://@finviz/website/./js/main/modules/quote/components/QuoteFinancialsTabMenu.tsx","webpack://@finviz/website/./js/main/modules/quote/components/QuoteStickySubMenu.tsx","webpack://@finviz/website/./js/main/modules/revenue/utils.ts","webpack://@finviz/website/./js/main/modules/revenue/RevenueTableFooter.tsx","webpack://@finviz/website/./js/main/modules/revenue/RevenueTableHead.tsx","webpack://@finviz/website/./js/main/modules/revenue/WidgetHeader.tsx","webpack://@finviz/website/./js/main/modules/revenue/types.ts","webpack://@finviz/website/./js/main/modules/revenue/constants.ts","webpack://@finviz/website/./js/main/modules/revenue/useTableColumns.tsx","webpack://@finviz/website/./js/main/modules/revenue/CategoryWidget.tsx","webpack://@finviz/website/./js/main/modules/revenue/WidgetSettingsSection.tsx","webpack://@finviz/website/./js/main/modules/revenue/index.tsx","webpack://@finviz/website/../node_modules/recharts/es6/chart/BarChart.js"],"sourcesContent":["import classNames from 'classnames'\r\nimport { isRedesignEnabled } from 'finviz-charts/app/utils'\r\nimport * as React from 'react'\r\n\r\ninterface Props extends React.HTMLProps {\r\n leftContent?: React.ReactNode\r\n middleContent?: React.ReactNode\r\n rightContent?: React.ReactNode\r\n}\r\n\r\nexport function SubMenu({ leftContent, middleContent, rightContent, ...props }: Props) {\r\n return (\r\n
\r\n
\r\n \r\n {leftContent}\r\n
\r\n {middleContent &&
{middleContent}
}\r\n
{rightContent}
\r\n
\r\n \r\n )\r\n}\r\n","import { Link } from 'react-router-dom'\r\n\r\nimport { Button, ButtonSizeType } from '../button'\r\n\r\ninterface Props {\r\n items: Array<{ label: string; href: string; isActive: boolean; reloadDocument?: boolean }>\r\n size?: ButtonSizeType\r\n}\r\n\r\nexport function SubMenuTabs({ items, size = 'medium' }: Props) {\r\n return (\r\n
\r\n {items.map(({ label, href, isActive, reloadDocument }) => (\r\n \r\n {label}\r\n \r\n ))}\r\n
\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface ManualGridProps extends React.HTMLProps {\r\n numberOfLines?: number\r\n visibleLeftAxes?: number\r\n estimateAreaWidth?: number\r\n rightOffset?: number\r\n}\r\n\r\nfunction ManualGridComponent(\r\n {\r\n numberOfLines = 5,\r\n visibleLeftAxes = 0,\r\n rightOffset = 32,\r\n estimateAreaWidth,\r\n children,\r\n ...props\r\n }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n const lines = Array.from({ length: numberOfLines })\r\n\r\n return (\r\n
\r\n \r\n {lines.map((_, index) => (\r\n
\r\n ))}\r\n {!!estimateAreaWidth && (\r\n \r\n )}\r\n
\r\n\r\n {children}\r\n
\r\n )\r\n}\r\n\r\nexport const ManualGrid = React.forwardRef(ManualGridComponent)\r\n","export const TABLE_ROW_HIGHT = 24\r\n","import React from 'react'\r\n\r\nimport { usePrevious } from '../../hooks/use-previous'\r\nimport { useFinancialsTableContext } from './FinancialsTableContext'\r\nimport { TABLE_ROW_HIGHT } from './constants'\r\n\r\ninterface Props {\r\n categoryAreasCounts: number[]\r\n dataKeys: string[]\r\n}\r\n\r\nexport function useFinancialsTablePersistScrollPosition({ categoryAreasCounts, dataKeys }: Props) {\r\n const { settings, scrollInfo } = useFinancialsTableContext()\r\n const previousSettings = usePrevious(settings)\r\n\r\n React.useLayoutEffect(() => {\r\n const widgetSettingsSectionElement = document.getElementById('js-widget-settings-section')\r\n if (!previousSettings || !scrollInfo || !widgetSettingsSectionElement) return\r\n\r\n const financialsTables = document.getElementsByClassName('js-financials-widget')\r\n const widgetSettingsSectionElementTopPosition = widgetSettingsSectionElement.getBoundingClientRect().top\r\n let index = 0\r\n let lastAbsDiffInPx: number | null = null\r\n\r\n Array.from(financialsTables).forEach((financialTableElement, i) => {\r\n const { top } = financialTableElement.getBoundingClientRect()\r\n const absDiffInPx = Math.abs(top - widgetSettingsSectionElementTopPosition)\r\n if (lastAbsDiffInPx === null || absDiffInPx < lastAbsDiffInPx) {\r\n lastAbsDiffInPx = absDiffInPx\r\n index = i\r\n }\r\n })\r\n\r\n let areas = 0\r\n for (let i = 0; i < index; i++) {\r\n areas += categoryAreasCounts[i]\r\n }\r\n\r\n let sign = 0\r\n dataKeys.forEach((dataKey) => {\r\n if (settings[dataKey] !== previousSettings[dataKey]) {\r\n sign = settings[dataKey] ? 1 : -1\r\n }\r\n })\r\n\r\n const shift = areas * TABLE_ROW_HIGHT * sign\r\n window.scrollTo(window.scrollX, scrollInfo.yPosition + shift)\r\n\r\n // effect should run only when scroll info is changed = user toggled data settings\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [scrollInfo])\r\n}\r\n","import * as React from 'react'\r\nimport { NameType, Payload, ValueType } from 'recharts/types/component/DefaultTooltipContent'\r\n\r\nimport { shortFormatNumber } from '../../util'\r\nimport { TooltipInner, TooltipRow } from '../chart/Tooltip'\r\nimport { ChartItemColorType } from '../chart/constants'\r\nimport { LineChartTooltipSort } from './types'\r\n\r\ntype ChartTooltipProps = {\r\n activeKey?: string | null\r\n payload?: Payload[] | undefined\r\n isReversed?: boolean\r\n payloadSort?: keyof typeof LineChartTooltipSort\r\n valueFormatter?: (data: ValueType) => string\r\n}\r\nexport default function ChartTooltip({\r\n payload,\r\n payloadSort = 'default',\r\n isReversed = false,\r\n valueFormatter,\r\n}: ChartTooltipProps) {\r\n const items = React.useMemo(() => {\r\n if (!payload || payload.length === 0) return []\r\n\r\n if (LineChartTooltipSort[payloadSort] === LineChartTooltipSort.value) {\r\n return [...payload].sort((a, b) => Number(b.value ?? 0) - Number(a.value ?? 0))\r\n }\r\n return isReversed ? [...payload].reverse() : payload\r\n }, [payload, payloadSort, isReversed])\r\n\r\n const formatter = React.useCallback(\r\n (value: ValueType) => valueFormatter?.(value) ?? shortFormatNumber(value as number),\r\n [valueFormatter]\r\n )\r\n\r\n if (items.length === 0) return null\r\n\r\n return (\r\n \r\n {items.map((area) => (\r\n \r\n ))}\r\n \r\n )\r\n}\r\n","import colors from '../../../../../config/colors'\r\n\r\nexport const CHART_HEIGHT = 250\r\nexport const LABELS_WIDTH = 28\r\nexport const BAR_CHART_LABELS_MARGIN = 22\r\nexport const LINE_CHART_LABELS_MARGIN = 57\r\nexport const BAR_WIDTH = 72\r\nexport const BAR_GAP = 16\r\nexport const EXTRA_WIDTH = 44\r\nexport const BAR_CHART_MARGINS = { top: 0, right: 0, bottom: 0, left: 0 }\r\nexport const LINE_CHART_MARGINS = { top: 5, right: 35, bottom: 5, left: 55 }\r\nexport const TICK_STYLE = { fontSize: 10, fontWeight: 500, textAnchor: 'end' }\r\nexport const TOOLTIP_WRAPPER_STYLE = { outline: 'none', zIndex: 10 }\r\nexport const CURSOR_STYLE = { fill: FinvizSettings.hasDarkTheme ? colors.gray[700] : colors.gray[50], opacity: 0.65 }\r\nexport const TRANSPARENT_CURSOR = { opacity: 0 }\r\n","import { shortFormatNumber } from '../../util'\r\nimport { FinancialsRowDataType } from '../financials-table/types'\r\nimport { ChartData, View } from './types'\r\n\r\nexport function tickFormatter(value: any) {\r\n return shortFormatNumber(value, { fractions: 0 })\r\n}\r\n\r\nexport function getChartDataItemKey(item: Pick) {\r\n return item.id || item.label\r\n}\r\n\r\nexport function getChartData(data: FinancialsRowDataType[], yearKeys: string[], chartView: View) {\r\n /*\r\n * Bar chart renders segments from the bottom up, so the sorting of visible areas is correct here\r\n * assuming it's sorted by column values\r\n * */\r\n const visibleAreas = data.filter((item) => item.isSelected).map((item) => ({ ...item, color: item.color }))\r\n /*\r\n * Line chart has reverse order because we need to render lines from the end so they don't cover main lines\r\n * you can think about it as visibleAreas index === zIndex on the chart\r\n * */\r\n if (chartView === View.lines) visibleAreas.reverse()\r\n\r\n const chartData = yearKeys.map((year) => {\r\n const stackedBar = { year, topKey: '', bottomKey: '', total: 0 } as ChartData\r\n\r\n visibleAreas.forEach((item) => {\r\n const valueKey = getChartDataItemKey(item)\r\n const value = item.values.find((v) => v.year === year)?.value ?? null\r\n stackedBar[valueKey] = value\r\n stackedBar.total += value ?? 0\r\n\r\n if (item.isSelected && value !== 0) {\r\n // top key is the key of latest area which is visible and have some positive value\r\n // bottom key is the key of latest area which is visible and have some negative value\r\n stackedBar[value && value > 0 ? 'topKey' : 'bottomKey'] = valueKey\r\n }\r\n })\r\n\r\n return stackedBar\r\n })\r\n\r\n return { chartData, visibleAreas }\r\n}\r\n","import * as React from 'react'\r\nimport { Cell, BarChart as RechartsBarChart, ResponsiveContainer } from 'recharts'\r\n\r\nimport { Bar } from '../chart/Bar'\r\nimport { ChartContext } from '../chart/ChartWrapper'\r\nimport { CursorBar } from '../chart/Cursor'\r\nimport { Tooltip } from '../chart/Tooltip'\r\nimport { YAxis } from '../chart/YAxis'\r\nimport { ChartItemColorType } from '../chart/constants'\r\nimport ChartTooltip from './ChartTooltip'\r\nimport {\r\n BAR_CHART_LABELS_MARGIN,\r\n BAR_CHART_MARGINS,\r\n BAR_GAP,\r\n BAR_WIDTH,\r\n CHART_HEIGHT,\r\n EXTRA_WIDTH,\r\n LABELS_WIDTH,\r\n} from './constants'\r\nimport { ChartProps } from './types'\r\nimport { getChartDataItemKey, tickFormatter } from './utils'\r\n\r\nexport default function BarChart({ chartData, visibleAreas, columnsCount, isFullWidth }: ChartProps) {\r\n const chartWidth = columnsCount * BAR_WIDTH + (columnsCount - 1) * BAR_GAP + EXTRA_WIDTH\r\n const ChartWrapper = isFullWidth ? ResponsiveContainer : React.Fragment\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n } content={} />\r\n {/* Don't change the order of mapped items here, see getChartData */}\r\n {visibleAreas.map((area) => {\r\n const itemKey = getChartDataItemKey(area)\r\n return (\r\n \r\n {chartData.map((row, index) => (\r\n \r\n ))}\r\n \r\n )\r\n })}\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Heading } from '../typography'\r\nimport { LineStackedBarChartProps } from './types'\r\n\r\ninterface Props extends Pick {\r\n className: string\r\n children: React.ReactNode\r\n}\r\n\r\nexport function EmptyDataOverlayWrapper({ className, children, emptyMessage, isEmpty = false }: Props) {\r\n return (\r\n
\r\n
{children}
\r\n\r\n {isEmpty && (\r\n
\r\n {!!emptyMessage && (\r\n
\r\n \r\n {emptyMessage}\r\n \r\n
\r\n )}\r\n
\r\n )}\r\n
\r\n )\r\n}\r\n","/**\n * @fileOverview Line Chart\n */\nimport { generateCategoricalChart } from './generateCategoricalChart';\nimport { Line } from '../cartesian/Line';\nimport { XAxis } from '../cartesian/XAxis';\nimport { YAxis } from '../cartesian/YAxis';\nimport { formatAxisMap } from '../util/CartesianUtils';\nexport var LineChart = generateCategoricalChart({\n chartName: 'LineChart',\n GraphicalChild: Line,\n axisComponents: [{\n axisType: 'xAxis',\n AxisComp: XAxis\n }, {\n axisType: 'yAxis',\n AxisComp: YAxis\n }],\n formatAxisMap: formatAxisMap\n});","import classNames from 'classnames'\r\nimport React from 'react'\r\nimport { LineChart as RechartsLineChart, ResponsiveContainer } from 'recharts'\r\n\r\nimport { ChartContext } from '../chart/ChartWrapper'\r\nimport { Line } from '../chart/Line'\r\nimport { LineDot } from '../chart/LineDot'\r\nimport { Tooltip } from '../chart/Tooltip'\r\nimport { YAxis } from '../chart/YAxis'\r\nimport { ChartItemColorType } from '../chart/constants'\r\nimport ChartTooltip from './ChartTooltip'\r\nimport {\r\n BAR_GAP,\r\n BAR_WIDTH,\r\n CHART_HEIGHT,\r\n EXTRA_WIDTH,\r\n LABELS_WIDTH,\r\n LINE_CHART_LABELS_MARGIN,\r\n LINE_CHART_MARGINS,\r\n} from './constants'\r\nimport { ChartProps, LineChartTooltipSort } from './types'\r\nimport { getChartDataItemKey, tickFormatter } from './utils'\r\n\r\ninterface Props extends ChartProps {\r\n tooltipSort?: keyof typeof LineChartTooltipSort\r\n}\r\n\r\nexport default function LineChart({\r\n chartData,\r\n visibleAreas,\r\n columnsCount,\r\n barWidth = BAR_WIDTH,\r\n tooltipSort,\r\n showTotal,\r\n isFullWidth,\r\n}: Props) {\r\n const chartWidth = columnsCount * barWidth + (columnsCount - 1) * BAR_GAP + EXTRA_WIDTH\r\n const ChartWrapper = isFullWidth ? ResponsiveContainer : React.Fragment\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n } />\r\n {showTotal && } dataKey=\"total\" color=\"gray\" />}\r\n {visibleAreas.map((area) => {\r\n const itemKey = getChartDataItemKey(area)\r\n return (\r\n }\r\n activeDot={\r\n \r\n }\r\n />\r\n )\r\n })}\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { MONTHS } from '../../constants'\r\nimport { LABELS_WIDTH, LINE_CHART_MARGINS } from './constants'\r\nimport { LineStackedBarChartProps, View } from './types'\r\n\r\ninterface Props extends Pick {\r\n barWidth: number\r\n}\r\n\r\nexport function XAxis({ barWidth, yearKeys, chartView }: Props) {\r\n const rightOffset = chartView === View.lines ? LINE_CHART_MARGINS.right - barWidth / 2 : 0\r\n return (\r\n \r\n {yearKeys.map((value) => {\r\n const year = value.substring(0, 4)\r\n const month = Number.parseInt(value.substring(4, 6))\r\n\r\n return (\r\n \r\n {month === 1 ? year.substring(2, 4) : MONTHS[month - 1]}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { ManualGrid } from '../chart/ManualGrid'\r\nimport BarChart from './BarChart'\r\nimport { EmptyDataOverlayWrapper } from './EmptyDataOverlayWrapper'\r\nimport LineChart from './LineChart'\r\nimport { XAxis } from './XAxis'\r\nimport { CHART_HEIGHT, LABELS_WIDTH } from './constants'\r\nimport { LineStackedBarChartProps, View } from './types'\r\nimport { getChartData } from './utils'\r\n\r\nexport function LineStackedBarChart({\r\n data,\r\n yearKeys,\r\n chartView,\r\n lineChartTooltipSort,\r\n emptyMessage,\r\n isEmpty,\r\n isFullWidth = false,\r\n hasXAxis = false,\r\n isShowAll = false,\r\n isInView = true,\r\n hasBeenInView = true,\r\n}: LineStackedBarChartProps) {\r\n const wrapperRef = React.useRef(null)\r\n const [barWidth, setBarWidth] = React.useState(0)\r\n const { chartData, visibleAreas } = React.useMemo(\r\n () => (hasBeenInView ? getChartData(data, yearKeys, chartView) : { chartData: [], visibleAreas: [] }),\r\n [data, yearKeys, hasBeenInView, chartView]\r\n )\r\n\r\n const columnsCount = yearKeys.length\r\n\r\n React.useEffect(() => {\r\n const wrapperWidth = wrapperRef.current?.clientWidth ?? 0\r\n setBarWidth((wrapperWidth - LABELS_WIDTH) / columnsCount)\r\n }, [columnsCount])\r\n\r\n return (\r\n \r\n \r\n {isInView && chartView === View.bars && (\r\n \r\n )}\r\n {isInView && chartView === View.lines && (\r\n \r\n )}\r\n\r\n {hasXAxis && }\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { ColorVariant } from '../checkbox'\r\nimport { FinancialsRowDataType } from '../financials-table/types'\r\n\r\nexport enum View {\r\n bars,\r\n lines,\r\n}\r\n\r\nexport interface ChartProps {\r\n chartData: ChartData[]\r\n showTotal?: boolean\r\n visibleAreas: Array<\r\n Pick & {\r\n color: ColorVariant\r\n }\r\n >\r\n columnsCount: number\r\n barWidth?: number\r\n isFullWidth?: boolean\r\n}\r\n\r\nexport type ChartData = {\r\n year: string\r\n topKey: string\r\n bottomKey: string\r\n total: number\r\n} & Record\r\n\r\nexport enum LineChartTooltipSort {\r\n default = 'default',\r\n value = 'value',\r\n}\r\n\r\nexport type LineStackedBarChartProps = {\r\n data: FinancialsRowDataType[]\r\n yearKeys: string[]\r\n chartView: View\r\n isShowAll?: boolean\r\n isFullWidth?: boolean\r\n hasXAxis?: boolean\r\n isInView?: boolean\r\n hasBeenInView?: boolean\r\n lineChartTooltipSort?: keyof typeof LineChartTooltipSort\r\n emptyMessage?: React.ReactNode\r\n isEmpty?: boolean\r\n}\r\n","import { decodeQueryString, encodeQueryString } from '../../../../app/queryString'\r\nimport { SubMenuTabs } from '../../../components/SubMenu/SubMenuTabs'\r\nimport { QuoteSubview } from '../types'\r\n\r\nexport const FINANCIALS_SECTION_LABELS = {\r\n [QuoteSubview.Revenue]: 'Revenue',\r\n [QuoteSubview.Dividends]: 'Dividends',\r\n [QuoteSubview.Earnings]: 'Earnings',\r\n [QuoteSubview.Forecast]: 'Forecast',\r\n}\r\n\r\nconst FINANCIAL_MENU_TABS: Array = [\r\n QuoteSubview.Dividends,\r\n QuoteSubview.Earnings,\r\n QuoteSubview.Revenue,\r\n QuoteSubview.Forecast,\r\n]\r\n\r\nfunction getFinancialMenuTabs() {\r\n const searchParams = decodeQueryString()\r\n\r\n return FINANCIAL_MENU_TABS.map((value) => ({\r\n label: FINANCIALS_SECTION_LABELS[value],\r\n href: `/quote.ashx?${encodeQueryString({ ...searchParams, ty: value })}`,\r\n isActive: searchParams.ty === value,\r\n reloadDocument: true,\r\n }))\r\n}\r\n\r\nexport function QuoteFinancialsTabMenu() {\r\n return \r\n}\r\n","import * as React from 'react'\r\n\r\nimport { SubMenu } from '../../../components/SubMenu/SubMenu'\r\n\r\ninterface Props {\r\n leftContent?: React.ReactNode\r\n rightContent?: React.ReactNode\r\n}\r\n\r\nexport function QuoteStickySubMenu({ leftContent, rightContent }: Props) {\r\n return \r\n}\r\n","import { FinancialsRowDataType } from '../../components/financials-table/types'\r\n\r\nexport { tickFormatter } from '../../components/line-stacked-bar-chart'\r\n\r\nexport function getSumData>(data: T[], absolute = false) {\r\n return data.reduce>((sumObj, revenue) => {\r\n revenue.values.forEach(({ year, value }) => {\r\n if (!sumObj[year]) {\r\n sumObj[year] = 0\r\n }\r\n\r\n sumObj[year] += absolute ? Math.abs(value ?? 0) : (value ?? 0)\r\n })\r\n\r\n return sumObj\r\n }, {})\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TableCell, TableFooter } from '../../components/Table'\r\nimport { Checkbox, ColorVariant } from '../../components/checkbox'\r\nimport { useFinancialsTableContext } from '../../components/financials-table'\r\nimport { FinancialsRowDataType } from '../../components/financials-table/types'\r\nimport { View } from '../../components/line-stacked-bar-chart'\r\nimport { shortFormatNumber } from '../../util'\r\nimport { RevenueColumnsType, RevenueSettings } from './types'\r\nimport { getSumData } from './utils'\r\n\r\ntype Props = {\r\n columns: RevenueColumnsType['columns']\r\n data: FinancialsRowDataType[]\r\n}\r\n\r\nexport function RevenueTableFooter({ columns, data }: Props) {\r\n const { settings, setSettings } = useFinancialsTableContext()\r\n\r\n return (\r\n \r\n {settings.chartView === View.bars ? (\r\n \r\n Total\r\n \r\n ) : (\r\n \r\n \r\n setSettings({\r\n ...settings,\r\n isShowAll: !settings.isShowAll,\r\n })\r\n }\r\n />\r\n \r\n )}\r\n {columns.map((column) => (\r\n \r\n {shortFormatNumber(getSumData(data)[column.id])}\r\n \r\n ))}\r\n \r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TableAlign, TableHead, TableHeader, TableHeaderSortable } from '../../components/Table'\r\nimport { FinancialsColumnDefinition, FinancialsRowDataType } from '../../components/financials-table/types'\r\nimport { SortByShape } from '../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../types'\r\nimport { RevenueColumnsType } from './types'\r\n\r\ntype Props = {\r\n columns: RevenueColumnsType['columns']\r\n unit: string\r\n sort: SortByShape>\r\n onSortChange: (column: FinancialsColumnDefinition) => void\r\n}\r\n\r\nexport function RevenueTableHead({ columns, unit, sort, onSortChange }: Props) {\r\n const handleChangeSort = (column: FinancialsColumnDefinition) => {\r\n const shouldRemoveOrder = sort.direction === SortDirection.Descending && column === sort.column\r\n if (shouldRemoveOrder) {\r\n onSortChange('order' as unknown as FinancialsColumnDefinition)\r\n } else {\r\n onSortChange(column)\r\n }\r\n }\r\n\r\n return (\r\n \r\n \r\n Currency: {unit}\r\n \r\n {columns.map((column) => (\r\n handleChangeSort(column)}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n )\r\n}\r\n","import { Heading } from '../../components/typography'\r\n\r\nfunction getCategoryLabel(category: string) {\r\n switch (category) {\r\n case 'products_and_services':\r\n return 'Products and Services'\r\n\r\n default:\r\n return category[0].toUpperCase() + category.substring(1)\r\n }\r\n}\r\n\r\ntype WidgetHeaderProps = {\r\n category: string\r\n}\r\n\r\nexport default function WidgetHeader({ category }: WidgetHeaderProps) {\r\n return (\r\n \r\n Revenue by {getCategoryLabel(category)}\r\n \r\n )\r\n}\r\n","import { FinancialsColumnDefinition, FinancialsRowDataType } from '../../components/financials-table/types'\r\nimport { View } from '../../components/line-stacked-bar-chart'\r\n\r\nexport enum Category {\r\n products_and_services = 'products_and_services',\r\n regions = 'regions',\r\n segment = 'segment',\r\n subsegment = 'subsegment',\r\n additional = 'additional',\r\n}\r\n\r\nexport type CategoryData = {\r\n revenues: Record>\r\n unit: string\r\n}\r\n\r\nexport type RevenueData = Record, CategoryData>\r\n\r\nexport type RevenueColumnsType = {\r\n columns: FinancialsColumnDefinition[]\r\n subColumns: Record[]>\r\n}\r\n\r\n// I kept the values with bool prefix because users may already have cookis with this keys\r\nexport enum RevenueDataEnum {\r\n yoyChange = 'isYoyChange',\r\n yoyChangePct = 'isYoyChangePct',\r\n sharePct = 'isSharePct',\r\n}\r\n\r\nexport type RevenueSettings = {\r\n isShowAll: boolean\r\n chartView: View\r\n} & Record\r\n","import { ColorVariant } from '../../components'\r\nimport { FinancialsTableSettingsType } from '../../components/financials-table'\r\nimport { View } from '../../components/line-stacked-bar-chart'\r\nimport { RevenueDataEnum } from './types'\r\n\r\nexport const COOKIE_KEY = 'revenueSettings'\r\n\r\nexport const DEFAULT_SETTINGS: FinancialsTableSettingsType = {\r\n [RevenueDataEnum.yoyChange]: false,\r\n [RevenueDataEnum.yoyChangePct]: false,\r\n [RevenueDataEnum.sharePct]: false,\r\n isShowAll: false,\r\n chartView: View.bars,\r\n}\r\n\r\nexport const SEGMENT_COLORS = Object.keys(ColorVariant).filter(\r\n (c) => c !== ColorVariant.gray && c !== ColorVariant.default\r\n) as ColorVariant[]\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { RedGreenText } from '../../components/RedGreenText'\r\nimport { TableAlign } from '../../components/Table'\r\nimport { shortFormatNumber } from '../../util'\r\nimport { RevenueColumnsType, RevenueDataEnum } from './types'\r\n\r\nconst getColumns = (yearKeys: string[]) => {\r\n const commonClassName = 'w-22 last:w-29.5 px-4 last:pr-11'\r\n\r\n const columns: RevenueColumnsType['columns'] = yearKeys.map((year) => ({\r\n id: year,\r\n name: year,\r\n align: TableAlign.Right,\r\n className: commonClassName,\r\n getValueForSort: (data) => data.values.find((value) => value.year === year)?.value ?? null,\r\n renderColumn: (data) => {\r\n const revenueColValue = data.values.find((value) => value.year === year)\r\n if (!revenueColValue?.value) return \r\n return shortFormatNumber(revenueColValue.value)\r\n },\r\n }))\r\n\r\n const subColumns: RevenueColumnsType['subColumns'] = {\r\n [RevenueDataEnum.yoyChange]: yearKeys.map((year) => ({\r\n id: year,\r\n name: year,\r\n align: TableAlign.Right,\r\n className: commonClassName,\r\n renderColumn: (data) => {\r\n const revenueColSubValue = data.values.find((value) => value.year === year)\r\n return (\r\n \r\n {shortFormatNumber(revenueColSubValue?.value, { defaultValue: '—' })}\r\n \r\n )\r\n },\r\n })),\r\n [RevenueDataEnum.yoyChangePct]: yearKeys.map((year) => ({\r\n id: year,\r\n name: year,\r\n align: TableAlign.Right,\r\n className: commonClassName,\r\n renderColumn: (data) => {\r\n const revenueColSubValue = data.values.find((value) => value.year === year)\r\n return (\r\n \r\n {revenueColSubValue?.value?.toFixed(2) ?? '—'}\r\n \r\n )\r\n },\r\n })),\r\n [RevenueDataEnum.sharePct]: yearKeys.map((year) => ({\r\n id: year,\r\n name: year,\r\n align: TableAlign.Right,\r\n className: classNames(commonClassName, 'text-muted-2'),\r\n renderColumn: (data) => {\r\n const revenueColSubValue = data.values.find((value) => value.year === year)\r\n if (typeof revenueColSubValue?.value !== 'number') return '-'\r\n\r\n return `${revenueColSubValue.value.toFixed(2)}%`\r\n },\r\n })),\r\n }\r\n return { columns, subColumns }\r\n}\r\n\r\nexport function useTableColumns(yearKeys: string[]) {\r\n return React.useMemo(() => getColumns(yearKeys), [yearKeys])\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { useTableSort } from '../../components/Table'\r\nimport { FinancialsWidget, getYoYData, useFinancialsTableContext } from '../../components/financials-table'\r\nimport {\r\n FinancialsRowDataType,\r\n FinancialsRowValue,\r\n FinancialsSubRowDataType,\r\n} from '../../components/financials-table/types'\r\nimport { LineStackedBarChart } from '../../components/line-stacked-bar-chart'\r\nimport { RevenueTableFooter } from './RevenueTableFooter'\r\nimport { RevenueTableHead } from './RevenueTableHead'\r\nimport WidgetHeader from './WidgetHeader'\r\nimport { SEGMENT_COLORS } from './constants'\r\nimport { CategoryData, RevenueDataEnum, RevenueSettings } from './types'\r\nimport { useTableColumns } from './useTableColumns'\r\nimport { getSumData } from './utils'\r\n\r\nfunction getSharePctData(data: T[], absSumRow: Record) {\r\n return data.reduce>((acc, { year, value }) => {\r\n const sharePct = absSumRow[year] > 0 ? (100 / absSumRow[year]) * Math.abs(value ?? 0) : null\r\n return {\r\n ...acc,\r\n [year]: sharePct === null || isNaN(sharePct) ? null : sharePct,\r\n }\r\n }, {})\r\n}\r\n\r\nfunction mapData(data: CategoryData) {\r\n const revenuesArray: FinancialsRowDataType[] = Object.entries(data.revenues)\r\n .map(([key, revenues]) => ({\r\n id: key,\r\n label: key,\r\n isSelected: true,\r\n color: SEGMENT_COLORS[0],\r\n values: revenues\r\n .map((annualData) => ({\r\n year: annualData.fiscal_year,\r\n value: annualData.value,\r\n }))\r\n .sort((a, b) => Number.parseInt(a.year) - Number.parseInt(b.year)),\r\n subData: [],\r\n }))\r\n .sort((a, b) => b.values[b.values.length - 1].value - a.values[a.values.length - 1].value)\r\n\r\n return revenuesArray.map((revenue, index) => {\r\n const yoyData = getYoYData(revenue.values)\r\n const absSumRow = getSumData(revenuesArray, true)\r\n const sharePctData = getSharePctData(revenue.values, absSumRow)\r\n\r\n return {\r\n ...revenue,\r\n color: SEGMENT_COLORS[index % SEGMENT_COLORS.length],\r\n subData: [\r\n {\r\n id: RevenueDataEnum.yoyChange,\r\n label: 'YoY Growth',\r\n values: revenue.values.map(({ year }) => ({ year, value: yoyData.change[year] })),\r\n },\r\n {\r\n id: RevenueDataEnum.yoyChangePct,\r\n label: 'YoY Growth %',\r\n values: revenue.values.map(({ year }) => ({ year, value: yoyData.changePct[year] })),\r\n },\r\n {\r\n id: RevenueDataEnum.sharePct,\r\n label: 'Share %',\r\n values: revenue.values.map(({ year }) => ({ year, value: sharePctData[year] })),\r\n },\r\n ].filter(Boolean) as FinancialsSubRowDataType[],\r\n }\r\n })\r\n}\r\n\r\ntype CategoryWidgetProps = {\r\n category: string\r\n data: CategoryData\r\n}\r\n\r\nexport default function CategoryWidget({ category, data }: CategoryWidgetProps) {\r\n const { settings } = useFinancialsTableContext()\r\n const [revenueData, setRevenueData] = React.useState(() => mapData(data))\r\n const yearKeys = React.useMemo(\r\n () => revenueData[0].values.map(({ year }) => year).sort((a, b) => Number.parseInt(a) - Number.parseInt(b)),\r\n [revenueData]\r\n )\r\n const { columns, subColumns } = useTableColumns(yearKeys)\r\n\r\n const {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n } = useTableSort({\r\n data: revenueData.map((revenue) => ({\r\n ...revenue,\r\n subData: revenue.subData.filter(({ id }) => settings[id as RevenueDataEnum]),\r\n })),\r\n columns,\r\n defaultSort: { column: columns[columns.length - 1], direction: -1 },\r\n })\r\n\r\n const onVisibilityChange = (id: string, isSelected: boolean) => {\r\n setRevenueData(\r\n revenueData.map((item) =>\r\n item.id === id\r\n ? {\r\n ...item,\r\n isSelected,\r\n }\r\n : item\r\n )\r\n )\r\n }\r\n\r\n return (\r\n }\r\n columns={columns}\r\n subColumns={subColumns}\r\n onVisibilityChange={onVisibilityChange}\r\n tableHead={}\r\n tableFooter={}\r\n >\r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { ChipSwitch, ChipSwitchButton } from '../../components/ChipSwitch'\r\nimport { useFinancialsTableContext } from '../../components/financials-table'\r\nimport { View } from '../../components/line-stacked-bar-chart'\r\nimport { RevenueDataEnum, RevenueSettings } from './types'\r\n\r\nexport default function WidgetSettingsSection() {\r\n const { settings, setSettings } = useFinancialsTableContext()\r\n\r\n const toggleSetting = (key: keyof RevenueSettings, value: RevenueSettings[typeof key]) => {\r\n setSettings({\r\n ...settings,\r\n [key]: value,\r\n })\r\n }\r\n\r\n return (\r\n
\r\n \r\n {\r\n toggleSetting(RevenueDataEnum.yoyChange, !settings.isYoyChange)\r\n }}\r\n >\r\n YoY Growth\r\n \r\n {\r\n toggleSetting(RevenueDataEnum.yoyChangePct, !settings.isYoyChangePct)\r\n }}\r\n >\r\n YoY Growth %\r\n \r\n {\r\n toggleSetting(RevenueDataEnum.sharePct, !settings.isSharePct)\r\n }}\r\n >\r\n Share %\r\n \r\n \r\n\r\n \r\n {\r\n toggleSetting('chartView', View.bars)\r\n }}\r\n />\r\n {\r\n toggleSetting('chartView', View.lines)\r\n }}\r\n />\r\n \r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { FinancialsTableContextProvider } from '../../components/financials-table'\r\nimport { useFinancialsTablePersistScrollPosition } from '../../components/financials-table/useFinancialsTablePersistScrollPosition'\r\nimport { useCachedLoaderData } from '../../hooks/useCachedLoaderData'\r\nimport { QuoteFinancialsTabMenu } from '../quote/components/QuoteFinancialsTabMenu'\r\nimport { QuoteStickySubMenu } from '../quote/components/QuoteStickySubMenu'\r\nimport CategoryWidget from './CategoryWidget'\r\nimport WidgetSettingsSection from './WidgetSettingsSection'\r\nimport { COOKIE_KEY, DEFAULT_SETTINGS } from './constants'\r\nimport { RevenueData, RevenueDataEnum } from './types'\r\n\r\nfunction getAreasCounts(data: RevenueData | null) {\r\n if (!data) return []\r\n\r\n return Object.keys(data).map((key) => {\r\n const category = data[key as keyof RevenueData]\r\n return Object.keys(category.revenues).length\r\n })\r\n}\r\n\r\nfunction RevenueComponent() {\r\n const { data } = useCachedLoaderData()\r\n const categoryAreasCounts = React.useMemo(() => getAreasCounts(data), [data])\r\n\r\n useFinancialsTablePersistScrollPosition({\r\n categoryAreasCounts,\r\n dataKeys: [RevenueDataEnum.yoyChange, RevenueDataEnum.yoyChangePct, RevenueDataEnum.sharePct],\r\n })\r\n\r\n React.useEffect(() => {\r\n // Remove min-height from react root element which is set on BE because of CLS\r\n document.getElementById('root')?.style.removeProperty('min-height')\r\n }, [])\r\n\r\n const hasData = !!data && Object.keys(data).length > 0\r\n\r\n return (\r\n <>\r\n }\r\n rightContent={hasData ? : undefined}\r\n />\r\n\r\n {hasData ? (\r\n
\r\n {Object.entries(data).map(([key, val]) => (\r\n \r\n ))}\r\n
\r\n ) : (\r\n
\r\n Revenue is not available for this stock.\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\nexport default function Revenue() {\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n","/**\n * @fileOverview Bar Chart\n */\nimport { generateCategoricalChart } from './generateCategoricalChart';\nimport { Bar } from '../cartesian/Bar';\nimport { XAxis } from '../cartesian/XAxis';\nimport { YAxis } from '../cartesian/YAxis';\nimport { formatAxisMap } from '../util/CartesianUtils';\nexport var BarChart = generateCategoricalChart({\n chartName: 'BarChart',\n GraphicalChild: Bar,\n defaultTooltipEventType: 'axis',\n validateTooltipEventTypes: ['axis', 'item'],\n axisComponents: [{\n axisType: 'xAxis',\n AxisComp: XAxis\n }, {\n axisType: 'yAxis',\n AxisComp: YAxis\n }],\n formatAxisMap: formatAxisMap\n});"],"names":["SubMenu","_ref","leftContent","middleContent","rightContent","props","_jsx","className","classNames","children","_jsxs","isRedesignEnabled","SubMenuTabs","items","size","map","_ref2","label","href","isActive","reloadDocument","Button","as","Link","to","theme","rounding","active","ManualGridComponent","ref","numberOfLines","visibleLeftAxes","rightOffset","estimateAreaWidth","lines","Array","from","length","style","right","_","index","width","ManualGrid","React","TABLE_ROW_HIGHT","useFinancialsTablePersistScrollPosition","categoryAreasCounts","dataKeys","settings","scrollInfo","useFinancialsTableContext","previousSettings","usePrevious","widgetSettingsSectionElement","document","getElementById","financialsTables","getElementsByClassName","widgetSettingsSectionElementTopPosition","getBoundingClientRect","top","lastAbsDiffInPx","forEach","financialTableElement","i","absDiffInPx","Math","abs","areas","sign","dataKey","shift","window","scrollTo","scrollX","yPosition","ChartTooltip","payload","payloadSort","isReversed","valueFormatter","LineChartTooltipSort","value","sort","a","b","_b$value","_a$value","Number","reverse","formatter","_valueFormatter","shortFormatNumber","TooltipInner","formatValue","area","TooltipRow","name","indicator","color","labelClass","valueClass","CHART_HEIGHT","LABELS_WIDTH","BAR_CHART_LABELS_MARGIN","LINE_CHART_LABELS_MARGIN","BAR_WIDTH","BAR_GAP","EXTRA_WIDTH","BAR_CHART_MARGINS","bottom","left","LINE_CHART_MARGINS","FinvizSettings","hasDarkTheme","colors","tickFormatter","fractions","getChartDataItemKey","item","id","BarChart","chartData","visibleAreas","columnsCount","isFullWidth","chartWidth","ChartWrapper","ResponsiveContainer","ChartContext","height","RechartsBarChart","data","margin","barCategoryGap","stackOffset","YAxis","orientation","textAnchor","tickMargin","interval","Tooltip","cursor","CursorBar","numberOfDatapoints","content","itemKey","Bar","stackId","shape","undefined","fill","row","Cell","radius","topKey","bottomKey","includes","EmptyDataOverlayWrapper","emptyMessage","isEmpty","classnames","relative","Heading","level","LineChart","generateCategoricalChart","chartName","GraphicalChild","Line","axisComponents","axisType","AxisComp","XAxis","formatAxisMap","barWidth","tooltipSort","showTotal","RechartsLineChart","activeDot","LineDot","stroke","strokeWidth","isHighlighted","dot","yearKeys","chartView","View","paddingLeft","paddingRight","year","substring","month","parseInt","MONTHS","LineStackedBarChart","lineChartTooltipSort","hasXAxis","isShowAll","isInView","hasBeenInView","wrapperRef","setBarWidth","filter","isSelected","stackedBar","total","_item$values$find$val","_item$values$find","valueKey","values","find","v","getChartData","_wrapperRef$current$c","_wrapperRef$current","wrapperWidth","current","clientWidth","bars","FINANCIALS_SECTION_LABELS","QuoteSubview","Revenue","Dividends","Earnings","Forecast","FINANCIAL_MENU_TABS","getFinancialMenuTabs","searchParams","decodeQueryString","encodeQueryString","ty","QuoteFinancialsTabMenu","QuoteStickySubMenu","getSumData","absolute","arguments","reduce","sumObj","revenue","RevenueTableFooter","columns","setSettings","TableFooter","TableCell","hasLeading","Checkbox","checked","ColorVariant","gray","onChange","column","align","RevenueTableHead","unit","onSortChange","TableHead","TableHeader","TableAlign","Left","_sort$column","TableHeaderSortable","direction","onClick","shouldRemoveOrder","SortDirection","Descending","handleChangeSort","getCategoryLabel","category","toUpperCase","WidgetHeader","RevenueDataEnum","COOKIE_KEY","DEFAULT_SETTINGS","yoyChange","yoyChangePct","sharePct","SEGMENT_COLORS","Object","keys","c","default","getColumns","commonClassName","Right","getValueForSort","_data$values$find$val","_data$values$find","renderColumn","revenueColValue","subColumns","revenueColSubValue","RedGreenText","defaultValue","_revenueColSubValue$v","_revenueColSubValue$v2","toFixed","mapData","revenuesArray","entries","revenues","key","annualData","fiscal_year","subData","yoyData","getYoYData","absSumRow","sharePctData","acc","isNaN","getSharePctData","_ref3","change","_ref4","changePct","_ref5","Boolean","CategoryWidget","_ref6","revenueData","setRevenueData","_ref7","useTableColumns","sortedData","changeSort","useTableSort","_ref8","defaultSort","FinancialsWidget","header","onVisibilityChange","tableHead","tableFooter","WidgetSettingsSection","toggleSetting","ChipSwitch","ChipSwitchButton","isYoyChange","isYoyChangePct","isSharePct","RevenueComponent","useCachedLoaderData","getAreasCounts","_document$getElementB","removeProperty","hasData","_Fragment","val","FinancialsTableContextProvider","defaultSettings","cookieKey","defaultTooltipEventType","validateTooltipEventTypes"],"sourceRoot":""}