{"version":3,"file":"revenue.e76b5b55.js","mappings":"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","sources":["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","webpack://@finviz/website/../node_modules/recharts/es6/chart/LineChart.js"],"sourcesContent":["import { FinancialsRowDataType } from '../../components/financials-table/types'\r\n\r\nexport { getColor, 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});","/**\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});"],"names":["getSumData","data","absolute","arguments","length","undefined","reduce","sumObj","revenue","values","forEach","_ref","year","value","Math","abs","RevenueTableFooter","columns","settings","setSettings","useFinancialsTableContext","_jsxs","TableFooter","children","chartView","View","bars","_jsx","TableCell","hasLeading","className","Checkbox","checked","isShowAll","color","ColorVariant","gray","label","size","onChange","map","column","align","classNames","shortFormatNumber","id","RevenueTableHead","unit","sort","onSortChange","TableHead","TableHeader","TableAlign","Left","_sort$column","TableHeaderSortable","isActive","direction","onClick","shouldRemoveOrder","SortDirection","Descending","handleChangeSort","name","getCategoryLabel","category","toUpperCase","substring","WidgetHeader","Heading","level","RevenueDataEnum","COOKIE_KEY","DEFAULT_SETTINGS","yoyChange","yoyChangePct","sharePct","SEGMENT_COLORS","Object","keys","filter","c","default","getColumns","yearKeys","commonClassName","Right","getValueForSort","_data$values$find$val","_data$values$find","find","renderColumn","revenueColValue","subColumns","revenueColSubValue","RedGreenText","rightContent","defaultValue","_revenueColSubValue$v","_revenueColSubValue$v2","toFixed","mapData","revenuesArray","entries","revenues","_ref2","key","isSelected","annualData","fiscal_year","a","b","Number","parseInt","subData","index","yoyData","getYoYData","absSumRow","sharePctData","acc","isNaN","getSharePctData","_ref3","change","_ref4","changePct","_ref5","Boolean","CategoryWidget","_ref6","revenueData","setRevenueData","React","_ref7","useTableColumns","sortedData","changeSort","useTableSort","_ref8","defaultSort","FinancialsWidget","header","onVisibilityChange","item","tableHead","tableFooter","LineStackedBarChart","WidgetSettingsSection","toggleSetting","ChipSwitch","ChipSwitchButton","active","isYoyChange","isYoyChangePct","isSharePct","leftContent","lines","RevenueComponent","useCachedLoaderData","categoryAreasCounts","getAreasCounts","useFinancialsTablePersistScrollPosition","dataKeys","_document$getElementB","document","getElementById","style","removeProperty","hasData","_Fragment","QuoteStickySubMenu","QuoteFinancialsTabMenu","val","Revenue","FinancialsTableContextProvider","defaultSettings","cookieKey","BarChart","chartName","GraphicalChild","defaultTooltipEventType","validateTooltipEventTypes","axisComponents","axisType","AxisComp","formatAxisMap","LineChart"],"sourceRoot":""}