{"version":3,"file":"map.fbcbc2e6.js","mappings":"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EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,KACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,GACLvhB,EAAG,MACHC,EAAG,KACHqB,EAAG,MACHrC,EAAG,KACHuC,EAAG,MACHggB,EAAG,MACHC,EAAG,KACHC,EAAG,MACHvb,EAAG,MACHwb,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHxK,EAAG,MACHyK,EAAG,MACHC,EAAG,MACHC,EAAG,MACH7d,EAAG,KACHC,EAAG,MACH6d,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,IACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,EAAG,CACD,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,KACLlkB,EAAG,MACHC,EAAG,KACHqB,EAAG,MACHrC,EAAG,KACHuC,EAAG,MACHggB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHvb,EAAG,MACHwb,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHxK,EAAG,MACHyK,EAAG,MACHC,EAAG,MACHC,EAAG,MACH7d,EAAG,KACHC,EAAG,MACH6d,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,EAAG,CACD,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,IACLlkB,EAAG,MACHC,EAAG,KACHqB,EAAG,MACHrC,EAAG,KACHuC,EAAG,MACHggB,EAAG,MACHC,EAAG,KACHC,EAAG,MACHvb,EAAG,MACHwb,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHxK,EAAG,MACHyK,EAAG,MACHC,EAAG,MACHC,EAAG,MACH7d,EAAG,KACHC,EAAG,MACH6d,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,EACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,EAAG,CACD,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,MACLlkB,EAAG,MACHC,EAAG,KACHqB,EAAG,MACHrC,EAAG,KACHuC,EAAG,MACHggB,EAAG,MACHC,EAAG,MACHC,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OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,OACHC,EAAG,OACHC,EAAG,OACHC,EAAG,QAEL,GAAI,CACF,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,MACL,IAAK,IACLlkB,EAAG,MACHC,EAAG,KACHqB,EAAG,KACHrC,EAAG,KACHuC,EAAG,MACHggB,EAAG,KACHC,EAAG,MACHC,EAAG,MACHvb,EAAG,KACHwb,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHxK,EAAG,KACHyK,EAAG,MACHC,EAAG,MACHC,EAAG,MACH7d,EAAG,KACHC,EAAG,MACH6d,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,GAAI,CACF,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,EAAG,MACH,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,OACL,IAAK,IACLlkB,EAAG,OACHC,EAAG,MACHqB,EAAG,OACHrC,EAAG,MACHuC,EAAG,OACHggB,EAAG,MACHC,EAAG,MACHC,EAAG,OACHvb,EAAG,MACHwb,EAAG,MACHC,EAAG,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","sources":["webpack://@finviz/website/./js/app/maps/components/CanvasHover.tsx","webpack://@finviz/website/./js/app/maps/components/Canvas.tsx","webpack://@finviz/website/./js/app/maps/components/Legend.tsx","webpack://@finviz/website/./js/app/maps/components/Map.tsx","webpack://@finviz/website/./js/app/maps/components/MapContext.tsx","webpack://@finviz/website/./js/app/maps/components/MapSelect.tsx","webpack://@finviz/website/./js/app/maps/components/Search.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Expand.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Share.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Zoom.tsx","webpack://@finviz/website/./js/app/maps/components/Topbar/Topbar.tsx","webpack://@finviz/website/./js/app/maps/hooks/use-map-data.ts","webpack://@finviz/website/./js/app/maps/hooks/use-map-type.ts","webpack://@finviz/website/./js/app/maps/components/MapTypeList.tsx","webpack://@finviz/website/./js/app/maps/App.tsx","webpack://@finviz/website/./js/app/maps/treemap-canvas.tsx","webpack://@finviz/website/./js/app/maps/treemap-small.tsx","webpack://@finviz/website/./js/app/maps/services/api.ts","webpack://@finviz/website/./js/app/maps/store/action-creators.ts","webpack://@finviz/website/./js/app/maps/store/appDispatcher.ts","webpack://@finviz/website/./js/app/maps/store/constants.ts","webpack://@finviz/website/./js/app/maps/store/store.ts","webpack://@finviz/website/./js/app/maps/store/mapStore.ts","webpack://@finviz/website/./js/app/maps/constants/font.ts","webpack://@finviz/website/./js/app/maps/zoom.ts","webpack://@finviz/website/./js/app/maps/treemap.ts","webpack://@finviz/website/./js/app/shared/components/Ads.tsx","webpack://@finviz/website/./js/app/shared/components/QueryClientContext.tsx","webpack://@finviz/website/./js/app/shared/components/Share.tsx","webpack://@finviz/website/./js/app/shared/components/Sparkline.tsx","webpack://@finviz/website/./js/app/shared/drawShareMap.ts","webpack://@finviz/website/./js/app/shared/getTextFontFamily.ts","webpack://@finviz/website/./js/app/shared/loadImage.ts","webpack://@finviz/website/./js/app/shared/parseJSONFromScript.ts","webpack://@finviz/website/./js/app/shared/retinafy.ts","webpack://@finviz/website/./js/main/components/RedGreenText.tsx","webpack://@finviz/website/./js/main/components/Table/Table.tsx","webpack://@finviz/website/./js/main/components/Table/types.ts","webpack://@finviz/website/./js/main/components/Table/TableCell.tsx","webpack://@finviz/website/./js/main/components/Table/TableHeader.tsx","webpack://@finviz/website/./js/main/components/Table/TableRow.tsx","webpack://@finviz/website/./js/main/components/Table/hooks.ts","webpack://@finviz/website/./js/main/components/loading.tsx","webpack://@finviz/website/./js/main/hooks/use-sort-data.ts","webpack://@finviz/website/./js/main/modules/portfolio/constants/columns.tsx","webpack://@finviz/website/./js/main/modules/portfolio/constants/general.ts","webpack://@finviz/website/./js/main/modules/portfolio/services/api.ts","webpack://@finviz/website/./js/main/modules/portfolio/types.tsx","webpack://@finviz/website/./js/main/modules/portfolio/utils.ts","webpack://@finviz/website/../node_modules/prop-types/factoryWithThrowingShims.js","webpack://@finviz/website/../node_modules/prop-types/index.js","webpack://@finviz/website/../node_modules/prop-types/lib/ReactPropTypesSecret.js"],"sourcesContent":["import classnames from 'classnames'\r\nimport { Component } from 'react'\r\n\r\nimport '../../../../styles/map-hover.css'\r\nimport Sparkline from '../../shared/components/Sparkline'\r\nimport MapActions from '../store/action-creators'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapDataNode, MapTypeId } from '../types'\r\nimport { getVisibleTooltipTickers } from '../utils'\r\n\r\ninterface CanvasHoverProps {\r\n treemap: Treemap\r\n mapType: MapTypeId\r\n mapNodeId: string\r\n}\r\n\r\ninterface CanvasHoverState {\r\n visibleTickers: string[]\r\n activeNode?: MapDataNode\r\n sparklinesData: Record\r\n}\r\n\r\nclass CanvasHover extends Component {\r\n state: CanvasHoverState = { visibleTickers: [], activeNode: undefined, sparklinesData: {} }\r\n\r\n componentDidMount() {\r\n MapStore.addChangeListener(this._onChange)\r\n document.addEventListener('mousemove', this._onMouseMove)\r\n }\r\n\r\n componentWillUnmount() {\r\n MapActions.loadSparklinesCancel()\r\n MapStore.removeChangeListener(this._onChange)\r\n document.removeEventListener('mousemove', this._onMouseMove)\r\n }\r\n\r\n componentDidUpdate(_: CanvasHoverProps, prevState: CanvasHoverState) {\r\n const { activeNode, visibleTickers, sparklinesData } = this.state\r\n\r\n if (!activeNode || activeNode.name === prevState?.activeNode?.name) return\r\n\r\n if (!visibleTickers.includes(activeNode.name)) {\r\n visibleTickers.push(activeNode.name)\r\n }\r\n\r\n const tickersToLoad = visibleTickers.filter((ticker) => !sparklinesData[ticker])\r\n\r\n if (tickersToLoad.length) {\r\n MapActions.loadSparklineData(tickersToLoad, this.props.mapType)\r\n }\r\n }\r\n\r\n _onChange = () => {\r\n const activeNode = MapStore.getHoveredNode(this.props.mapNodeId)\r\n const sparklinesData = MapStore.getSparklines()\r\n\r\n this.setState({\r\n visibleTickers: getVisibleTooltipTickers(activeNode),\r\n activeNode,\r\n sparklinesData,\r\n })\r\n }\r\n\r\n _formatPerf = (d: MapDataNode) => {\r\n if (typeof d.additional !== 'undefined' && d.additional !== null) {\r\n return d.additional\r\n } else if (typeof d.perf !== 'undefined' && d.perf !== null) {\r\n return this.props.treemap.formatValue(d.perf.toFixed(2))\r\n } else {\r\n return 'N/A'\r\n }\r\n }\r\n\r\n render() {\r\n var d = MapStore.getHoveredNode(this.props.mapNodeId)\r\n if (!this.state.activeNode || !d) {\r\n return null\r\n }\r\n var hasSparkline =\r\n this.state.sparklinesData && this.state.sparklinesData[d.name] && this.state.sparklinesData[d.name].length > 0\r\n var price = hasSparkline\r\n ? this.state.sparklinesData[d.name][this.state.sparklinesData[d.name].length - 1].toFixed(2)\r\n : ''\r\n var colorScale = this.props.treemap.colorScale\r\n var type = this.props.treemap.type\r\n\r\n var children = d.parent.children\r\n .filter((node) => this.state.visibleTickers.includes(node.name))\r\n .sort((a, b) => b.dx * b.dy - a.dx * a.dy)\r\n\r\n var isSmall = children.length > 15\r\n var title = (type !== MapTypeId.World ? d.parent.parent.name + ' - ' : '') + d.parent.name\r\n return (\r\n
\r\n

{title}

\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {d.description}\r\n \r\n \r\n\r\n {children.length > 1 &&\r\n children.map((c) => {\r\n var hasSparkline =\r\n this.state.sparklinesData &&\r\n this.state.sparklinesData[c.name] &&\r\n this.state.sparklinesData[c.name].length > 0\r\n var data = hasSparkline ? this.state.sparklinesData[c.name] : []\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n })}\r\n \r\n
{d.data?.data?.nameOverride ?? d.name}\r\n {hasSparkline ? (\r\n \r\n ) : null}\r\n {price}{this._formatPerf(d)}
{c.data?.data?.nameOverride ?? c.name}\r\n {hasSparkline ? (\r\n \r\n ) : null}\r\n {hasSparkline ? data[data.length - 1].toFixed(2) : ''}\r\n {this._formatPerf(c)}\r\n
\r\n
\r\n )\r\n }\r\n\r\n _onMouseMove = (e: MouseEvent) => {\r\n if (!this.state.activeNode) {\r\n return\r\n }\r\n var marginLeft = 100\r\n var marginTop = 0\r\n var el = document.getElementById('hover')!\r\n var hoverWidth = el.scrollWidth\r\n var hoverHeight = el.scrollHeight\r\n var availWidth = document.documentElement.clientWidth\r\n var availHeight = document.documentElement.clientHeight\r\n if (e.clientX + hoverWidth + marginLeft * 1.5 < availWidth) {\r\n el.style.left = e.clientX + marginLeft + 'px'\r\n } else if (e.clientX - hoverWidth - marginLeft > 0) {\r\n el.style.left = e.clientX - marginLeft - hoverWidth + 'px'\r\n } else {\r\n marginLeft = 20\r\n if (e.clientX + hoverWidth + marginLeft < availWidth) {\r\n el.style.left = e.clientX + marginLeft + 'px'\r\n } else {\r\n el.style.left = e.clientX - marginLeft - hoverWidth + 'px'\r\n }\r\n }\r\n el.style.top =\r\n Math.max(0, e.clientY + marginTop - Math.max(0, e.clientY + marginTop + hoverHeight - availHeight)) + 'px'\r\n }\r\n}\r\n\r\nexport default CanvasHover\r\n","import Hammer from 'hammerjs'\r\nimport * as React from 'react'\r\n\r\nimport { loadImage } from '../../shared/loadImage'\r\nimport { retinafy } from '../../shared/retinafy'\r\nimport LayoutGenerator from '../layout-generator'\r\nimport MapActionCreators from '../store/action-creators'\r\nimport mapActionCreators from '../store/action-creators'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapDataIndustry, MapDataNode, MapDataSector, MapTypeId, NodeDepth } from '../types'\r\nimport { getOffset } from '../utils'\r\nimport CanvasHover from './CanvasHover'\r\nimport Legend from './Legend'\r\n\r\ninterface CanvasProps {\r\n alt?: string\r\n treemap: Treemap\r\n zoom?: boolean\r\n legend?: boolean\r\n zoomOnWheel?: boolean\r\n hover?: boolean\r\n onNodeClick?: (props: {\r\n event: React.MouseEvent\r\n treemap: Treemap\r\n node?: MapDataNode\r\n industry?: MapDataIndustry\r\n sector?: MapDataSector\r\n }) => void\r\n}\r\n\r\n// TODO presunt w, h, zoom, translate do stavu\r\nclass Canvas extends React.Component {\r\n static defaultProps = {\r\n zoom: true,\r\n legend: true,\r\n hover: true,\r\n zoomOnWheel: true,\r\n }\r\n\r\n state = {\r\n zoom: 1,\r\n dataTimestamp: MapStore.getDataTimestamp(),\r\n initialized: false,\r\n type: this.props.treemap.type,\r\n updateTimestamp: undefined,\r\n }\r\n\r\n _canvas = React.createRef()\r\n _hoverCanvas = React.createRef()\r\n\r\n // @ts-ignore\r\n _canvasContext: CanvasRenderingContext2D\r\n // @ts-ignore\r\n _hoverContext: CanvasRenderingContext2D\r\n\r\n _cache: Record = {}\r\n mouseDown: boolean = false\r\n lastPanX: number = 0\r\n lastPanY: number = 0\r\n\r\n // @ts-ignore\r\n worldBackground: HTMLImageElement\r\n\r\n constructor(props: CanvasProps) {\r\n super(props)\r\n\r\n this._cache = {}\r\n\r\n for (var event of [\r\n '_onChange',\r\n '_onMouseDown',\r\n '_onMouseMove',\r\n '_onMouseUp',\r\n '_onMouseLeave',\r\n '_onDoubleClick',\r\n '_onWheel',\r\n '_onPanStart',\r\n '_onPanMove',\r\n '_onPinch',\r\n '_getPublishCanvas',\r\n ]) {\r\n // @ts-ignore\r\n this[event] = this[event].bind(this)\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n MapStore.addChangeListener(this._onChange)\r\n mapActionCreators._setOnPublish(this._getPublishCanvas)\r\n\r\n this._initialize()\r\n }\r\n\r\n componentDidUpdate() {\r\n const { treemap } = this.props\r\n const { initialized, updateTimestamp, zoom, type } = this.state\r\n\r\n if (!initialized) return\r\n\r\n if (type !== treemap.type) {\r\n this.setState({ initialized: false, zoom: 1, type: treemap.type }, this._initialize)\r\n mapActionCreators.setHoveredNode(treemap.mapNodeId, undefined)\r\n mapActionCreators.resetSparklineData()\r\n return\r\n }\r\n\r\n // Resize & update cache\r\n if (treemap.updateTimestamp && treemap.updateTimestamp !== updateTimestamp) {\r\n this._setCanvasSize(treemap.width, treemap.height)\r\n treemap.getZoomLevels().forEach((zoomLevel: number) => {\r\n this._createCache(zoomLevel)\r\n })\r\n this.setState({ updateTimestamp: treemap.updateTimestamp })\r\n }\r\n\r\n // Redraw\r\n const [x, y] = treemap.zoom.translate()\r\n this.renderFromCache(this._canvasContext, zoom, treemap.width, treemap.height, x, y)\r\n this.renderHover(this._hoverContext)\r\n }\r\n\r\n componentWillUnmount() {\r\n // TODO remove hammer listener\r\n MapStore.removeChangeListener(this._onChange)\r\n this._hoverCanvas.current?.removeEventListener('wheel', this._onWheel)\r\n }\r\n\r\n render() {\r\n const { alt, treemap, legend, hover, zoom } = this.props\r\n\r\n return (\r\n
\r\n \r\n {alt}\r\n \r\n {(hover || zoom) && (\r\n \r\n )}\r\n {legend && }\r\n {hover && }\r\n
\r\n )\r\n }\r\n\r\n renderFromCache(\r\n context: CanvasRenderingContext2D,\r\n scale: number,\r\n width: number,\r\n height: number,\r\n tx: number,\r\n ty: number\r\n ) {\r\n const zoomLevels = this.props.treemap.getZoomLevels()\r\n\r\n let nearestSize: number = zoomLevels[0]\r\n for (var i = 0, len = zoomLevels.length; i < len; i++) {\r\n const level = zoomLevels[i]\r\n if (this._cache[level]?.canvas && level >= +scale.toFixed(2)) {\r\n nearestSize = level\r\n break\r\n }\r\n }\r\n\r\n context.save()\r\n context.drawImage(this._cache[nearestSize].canvas, ~~tx, ~~ty, ~~(width * scale), ~~(height * scale))\r\n context.restore()\r\n }\r\n\r\n _onChange() {\r\n const { treemap } = this.props\r\n const dataTimestamp = MapStore.getDataTimestamp()\r\n\r\n this.setState({ zoom: treemap.zoom.scale() })\r\n if (this.state.dataTimestamp !== dataTimestamp) {\r\n let scale = treemap.zoom.scale()\r\n let translate = treemap.zoom.translate()\r\n\r\n treemap.getZoomLevels().forEach((zoomLevel: number) => {\r\n this._createCache(zoomLevel)\r\n })\r\n\r\n treemap.zoom.scale(scale)\r\n treemap.zoom.translateAbs([translate[0], translate[1]])\r\n\r\n this.setState({ dataTimestamp })\r\n }\r\n }\r\n\r\n _onMouseDown() {\r\n this.mouseDown = true\r\n }\r\n\r\n _onMouseMove(e: React.MouseEvent) {\r\n if (this.mouseDown || !this.props.hover) return\r\n\r\n const { treemap } = this.props\r\n var { offsetX, offsetY } = getOffset(e)\r\n let nodeAtPosition = treemap.getNodeAtPosition(offsetX, offsetY)\r\n\r\n if (!nodeAtPosition) {\r\n const industryAtPosition = treemap.getIndustryAtPosition(offsetX, offsetY)\r\n nodeAtPosition = industryAtPosition?.children[0]\r\n }\r\n\r\n MapActionCreators.setHoveredNode(treemap.mapNodeId, nodeAtPosition)\r\n }\r\n\r\n _onMouseUp() {\r\n this.mouseDown = false\r\n }\r\n\r\n _onMouseLeave() {\r\n MapActionCreators.setHoveredNode(this.props.treemap.mapNodeId, undefined)\r\n }\r\n\r\n _onDoubleClick(e: React.MouseEvent) {\r\n const { treemap } = this.props\r\n const { offsetX, offsetY } = getOffset(e)\r\n const nodeAtPosition = treemap.getNodeAtPosition(offsetX, offsetY)\r\n const industryAtPosition = treemap.getIndustryAtPosition(offsetX, offsetY)\r\n const sectorAtPosition = treemap.getSectorAtPosition(offsetX, offsetY)\r\n this.props.onNodeClick?.({\r\n event: e,\r\n treemap,\r\n node: nodeAtPosition,\r\n industry: industryAtPosition,\r\n sector: sectorAtPosition,\r\n })\r\n }\r\n\r\n _onWheel(e: MouseEvent) {\r\n if (!this.props.zoom) return\r\n\r\n e.preventDefault()\r\n\r\n if (!this.state.initialized) {\r\n return\r\n }\r\n\r\n var { offsetX, offsetY } = getOffset(e)\r\n // @ts-ignore\r\n MapActionCreators.zoom(this.props.treemap, -e.deltaY, offsetX, offsetY)\r\n }\r\n\r\n _onPanStart(e: any) {\r\n if (!this.state.initialized) {\r\n return\r\n }\r\n\r\n this.lastPanX = e.pointers[0].clientX\r\n this.lastPanY = e.pointers[0].clientY\r\n }\r\n\r\n _onPanMove(e: any) {\r\n if (!this.state.initialized) {\r\n return\r\n }\r\n\r\n var movementX = this.lastPanX - e.pointers[0].clientX\r\n var movementY = this.lastPanY - e.pointers[0].clientY\r\n this.lastPanX = e.pointers[0].clientX\r\n this.lastPanY = e.pointers[0].clientY\r\n const { treemap } = this.props\r\n MapActionCreators.changeTranslate(treemap, movementX, movementY)\r\n }\r\n\r\n _onPinch(e: any) {\r\n if (!this.state.initialized || !this.props.zoom || e.pointers.length < 2) {\r\n return\r\n }\r\n\r\n var offsetX1 = e.pointers[0].clientX - e.target.offsetLeft - e.target.offsetParent.offsetLeft, // TODO fix scrolled\r\n offsetY1 = e.pointers[0].clientY - e.target.offsetTop - e.target.offsetParent.offsetTop,\r\n offsetX2 = e.pointers[1].clientX - e.target.offsetLeft - e.target.offsetParent.offsetLeft,\r\n offsetY2 = e.pointers[1].clientY - e.target.offsetTop - e.target.offsetParent.offsetTop,\r\n offsetX = (offsetX1 + offsetX2) / 2,\r\n offsetY = (offsetY1 + offsetY2) / 2\r\n var direction = e.scale >= 1 ? 1 : -1\r\n MapActionCreators.zoom(this.props.treemap, direction, offsetX, offsetY)\r\n }\r\n\r\n _setCanvasContexts() {\r\n const canvas = this._canvas.current!\r\n const canvasContext = canvas.getContext('2d')!\r\n this._canvasContext = canvasContext\r\n\r\n if (this.props.hover || this.props.zoom) {\r\n const hoverCanvas = this._hoverCanvas.current!\r\n const hoverContext = hoverCanvas.getContext('2d')!\r\n\r\n this._hoverContext = hoverContext\r\n }\r\n }\r\n\r\n _setCanvasSize(width: number, height: number) {\r\n retinafy(this._canvas.current, this._canvasContext, width, height)\r\n\r\n if (this.props.hover || this.props.zoom) {\r\n retinafy(this._hoverCanvas.current, this._hoverContext, width, height)\r\n }\r\n }\r\n\r\n async _initialize() {\r\n const { treemap, zoomOnWheel } = this.props\r\n\r\n this._setCanvasContexts()\r\n this._setCanvasSize(treemap.width, treemap.height)\r\n\r\n var renderLevel = (zoomLevelIndex: number) => {\r\n var zoomLevels = treemap.getZoomLevels()\r\n this._createCache(zoomLevels[zoomLevelIndex])\r\n\r\n if (zoomLevelIndex === 0) {\r\n const [x, y] = treemap.zoom.translate()\r\n this.renderFromCache(this._canvasContext, this.state.zoom, treemap.width, treemap.height, x, y)\r\n }\r\n\r\n if (zoomLevelIndex + 1 < zoomLevels.length) {\r\n setTimeout(() => {\r\n renderLevel(zoomLevelIndex + 1)\r\n }, 0)\r\n }\r\n\r\n if (zoomLevelIndex === zoomLevels.length - 1) {\r\n this.setState({ initialized: true })\r\n\r\n const hoverCanvas = this._hoverCanvas.current\r\n\r\n if (!hoverCanvas) return\r\n\r\n var hammertime = new Hammer(hoverCanvas)\r\n hammertime.get('pinch').set({ enable: true, threshold: 0.1 })\r\n hammertime.on('panstart', this._onPanStart)\r\n hammertime.on('panmove', this._onPanMove)\r\n hammertime.on('pinch', this._onPinch)\r\n\r\n if (zoomOnWheel) {\r\n hoverCanvas.addEventListener('wheel', this._onWheel, { passive: false })\r\n }\r\n }\r\n }\r\n\r\n var render = () => {\r\n setTimeout(() => {\r\n renderLevel(0)\r\n }, 0)\r\n }\r\n\r\n if (treemap.type === MapTypeId.World) {\r\n try {\r\n const image = await this._getTreemapGeoBackground()\r\n this.worldBackground = await loadImage(image.default)\r\n } catch {}\r\n render()\r\n } else {\r\n render()\r\n }\r\n }\r\n\r\n async _getTreemapGeoBackground() {\r\n if (this.props.treemap.getIsSmall()) {\r\n const isDark = document.documentElement.classList.contains('dark')\r\n return isDark ? import('../assets/map_geo_small_dark@2x.png') : import('../assets/map_geo_small@2x.png')\r\n }\r\n\r\n return import('../assets/map_geo.png')\r\n }\r\n\r\n _createCache(scale: number) {\r\n const { treemap } = this.props\r\n\r\n const oldScale = treemap.zoom.scale()\r\n const oldTranslate = treemap.zoom.translate()\r\n const width = ~~(treemap.width * scale)\r\n const height = ~~(treemap.height * scale)\r\n\r\n if (!this._cache[scale]) {\r\n const cacheCanvas = document.createElement('canvas')\r\n const cacheContext = cacheCanvas.getContext('2d')!\r\n\r\n this._cache[scale] = { canvas: cacheCanvas, context: cacheContext }\r\n }\r\n\r\n retinafy(this._cache[scale].canvas, this._cache[scale].context, width, height)\r\n\r\n treemap.zoom.scale(scale)\r\n treemap.zoom.translateAbs([0, 0])\r\n this.renderCanvas(this._cache[scale].context, treemap)\r\n treemap.zoom.scale(oldScale)\r\n treemap.zoom.translateAbs(oldTranslate)\r\n }\r\n\r\n renderHover(context: CanvasRenderingContext2D) {\r\n if (!this.props.hover) return\r\n\r\n const { treemap } = this.props\r\n const { hover } = treemap.settings.industry\r\n const hoveredNode = MapStore.getHoveredNode(treemap.mapNodeId)\r\n const industry = hoveredNode?.parent\r\n\r\n context.save()\r\n\r\n context.clearRect(0, 0, treemap.width, treemap.height)\r\n context.translate.apply(context, treemap.zoom.translate())\r\n context.scale(treemap.zoom.scale(), treemap.zoom.scale())\r\n\r\n if (!industry) {\r\n context.restore()\r\n return\r\n }\r\n\r\n const showIndustryHeader =\r\n LayoutGenerator.isNodeHeaderVisible(industry, treemap.settings) && industry.depth === NodeDepth.Industry\r\n let industryOffset =\r\n treemap.getIsSmall() || showIndustryHeader\r\n ? treemap.settings.industry.padding.top\r\n : LayoutGenerator.smallIndustryPadding.top\r\n\r\n if (industry.depth === NodeDepth.Sector) industryOffset = treemap.settings.sector.header.height\r\n\r\n if (showIndustryHeader && !treemap.getIsSmall()) {\r\n industryOffset += 1.5\r\n }\r\n\r\n // Outter border\r\n context.strokeStyle = hover?.border ?? 'transparent'\r\n context.lineWidth = 3\r\n context.strokeRect(industry.x - 0.5, industry.y - 0.5 + industryOffset, industry.dx, industry.dy - industryOffset)\r\n\r\n // Inner borders\r\n context.translate(0.5, 0.5)\r\n context.lineWidth = 1\r\n context.beginPath()\r\n for (let i = 0; i < industry.children.length; i++) {\r\n const node = industry.children[i]\r\n context.moveTo(node.x - 1, node.y - 1)\r\n context.lineTo(node.x + node.dx - 1, node.y - 1)\r\n context.lineTo(node.x + node.dx - 1, node.y + node.dy - 1)\r\n context.lineTo(node.x - 1, node.y + node.dy - 1)\r\n context.lineTo(node.x - 1, node.y - 1.5)\r\n }\r\n context.stroke()\r\n\r\n // Header and text\r\n if (!treemap.getIsSmall() && showIndustryHeader) {\r\n context.translate(-0.5, -0.5)\r\n treemap.renderIndustryHeader({\r\n node: industry,\r\n context,\r\n config: hover,\r\n parent: treemap.settings.industry,\r\n fill: hover?.background ?? treemap.settings.background,\r\n })\r\n treemap.renderNodeText({ node: industry, context, config: hover, parent: treemap.settings.industry })\r\n }\r\n\r\n context.restore()\r\n }\r\n\r\n renderCanvas(context: CanvasRenderingContext2D, treemap: Treemap) {\r\n context.save()\r\n\r\n const scale = treemap.zoom.scale()\r\n\r\n context.fillStyle = treemap.settings.background\r\n context.fillRect(0, 0, treemap.width * scale, treemap.height * scale)\r\n\r\n context.translate.apply(context, treemap.zoom.translate())\r\n context.scale(scale, scale)\r\n\r\n /* BACKGROUND */\r\n if (treemap.type === MapTypeId.World && this.worldBackground) {\r\n if (treemap.getIsSmall()) context.translate(0, 20)\r\n\r\n context.drawImage(\r\n this.worldBackground,\r\n 0,\r\n 0,\r\n this.worldBackground.naturalWidth,\r\n this.worldBackground.naturalHeight,\r\n 0,\r\n 20,\r\n treemap.width,\r\n treemap.width / (this.worldBackground.naturalWidth / this.worldBackground.naturalHeight)\r\n )\r\n }\r\n\r\n if (treemap.settings.sector.background) {\r\n context.fillStyle = treemap.settings.sector.background\r\n for (let index = 0; index < treemap.sectors.length; index++) {\r\n const node = treemap.sectors[index]\r\n context.fillRect(node.x, node.y, node.dx, node.dy)\r\n }\r\n }\r\n\r\n if (treemap.settings.industry.background) {\r\n context.fillStyle = treemap.settings.industry.background\r\n for (let index = 0; index < treemap.industries.length; index++) {\r\n const node = treemap.industries[index]\r\n context.fillRect(node.x, node.y + 3, node.dx - 1, node.dy - 4)\r\n }\r\n }\r\n\r\n /* STOCKS */\r\n for (let index = 0; index < treemap.nodes.length; index++) {\r\n const node = treemap.nodes[index]\r\n if (!node.parent) continue // Skip on root node\r\n treemap.renderStockNode(treemap.nodes[index], context)\r\n }\r\n\r\n /* INDUSTRIES */\r\n for (let index = 0; index < treemap.industries.length; index++) {\r\n const node = treemap.industries[index]\r\n const isLargeNode = LayoutGenerator.isNodeHeaderVisible(node, treemap.settings)\r\n const isGeoMap = treemap.type === MapTypeId.World\r\n const renderBackground = treemap.getIsSmall() ? isGeoMap : !isGeoMap\r\n\r\n if (!isLargeNode || (treemap.getIsSmall() && !isGeoMap)) continue\r\n\r\n if (Number.isFinite(node.perf) && renderBackground) {\r\n treemap.renderIndustryHeader({\r\n node,\r\n context,\r\n config: treemap.settings.industry.header,\r\n parent: treemap.settings.industry,\r\n fill: treemap.colorScale(node.perf),\r\n })\r\n }\r\n\r\n treemap.renderNodeText({\r\n node,\r\n context,\r\n config: treemap.settings.industry.header,\r\n parent: treemap.settings.industry,\r\n })\r\n }\r\n\r\n /* SECTORS */\r\n if (treemap.type !== MapTypeId.World) {\r\n for (let index = 0; index < treemap.sectors.length; index++) {\r\n const node = treemap.sectors[index]\r\n\r\n if (treemap.getIsSmall()) {\r\n treemap.renderIndustryHeader({\r\n node,\r\n context,\r\n config: treemap.settings.sector.header,\r\n parent: treemap.settings.sector,\r\n fill: treemap.settings.sector.header.background ?? treemap.colorScale(node.perf),\r\n })\r\n }\r\n\r\n treemap.renderNodeText({\r\n node,\r\n context,\r\n config: treemap.settings.sector.header,\r\n parent: treemap.settings.sector,\r\n })\r\n }\r\n }\r\n\r\n context.restore()\r\n\r\n if (treemap.settings.sector.border) {\r\n this.renderSectorBorders(context, treemap)\r\n }\r\n }\r\n\r\n renderSectorBorders(context: CanvasRenderingContext2D, treemap: Treemap) {\r\n const scale = treemap.zoom.scale()\r\n context.lineWidth = 2 * scale\r\n context.strokeStyle = treemap.settings.sector.border ?? 'transparent'\r\n\r\n context.beginPath()\r\n\r\n // Outside border\r\n context.moveTo(0, 0)\r\n context.lineTo(treemap.width * scale, 0)\r\n context.lineTo(treemap.width * scale, treemap.height * scale)\r\n context.lineTo(0, treemap.height * scale)\r\n context.lineTo(0, -1)\r\n\r\n for (let index = 0; index < treemap.sectors.length; index++) {\r\n const sector = treemap.sectors[index]\r\n\r\n context.strokeRect(sector.x * scale, sector.y * scale, sector.dx * scale, sector.dy * scale)\r\n }\r\n\r\n context.stroke()\r\n }\r\n\r\n _getPublishCanvas() {\r\n return this._cache[1].canvas\r\n }\r\n}\r\n\r\nexport default Canvas\r\n","import classnames from 'classnames'\r\n\r\nimport { scaleStepFormat } from '../constants/settings'\r\nimport MapStore from '../store/mapStore'\r\nimport Treemap from '../treemap'\r\nimport { MapTypeId } from '../types'\r\n\r\ninterface LegendProps {\r\n treemap: Treemap\r\n className?: string\r\n}\r\n\r\nfunction Legend(props: LegendProps) {\r\n const colorScale = props.treemap.colorScale\r\n\r\n if (!colorScale) {\r\n return null\r\n }\r\n\r\n var boxover =\r\n 'cssbody=[tooltip_bdy] cssheader=[tooltip_hdr] header=[' +\r\n props.treemap.scale.name +\r\n \"] body=[
\" +\r\n props.treemap.scale.tooltip +\r\n '
] offsety=[-70] delay=[500]'\r\n\r\n const [scaleMin, scaleMax] = props.treemap.getScaleMinMax()\r\n var steps = [scaleMin]\r\n var diff = scaleMax - scaleMin\r\n if (diff > 0) {\r\n var step = diff / 6\r\n for (var i = 1; i < 7; i++) {\r\n steps.push(Math.round((scaleMin + step * i) * 10) / 10)\r\n }\r\n }\r\n\r\n if (props.treemap.scale.id === '_rec') {\r\n steps = [5, 4, 3, 2, 1]\r\n } else if (props.treemap.scale.id === '_earndate') {\r\n steps = [-30, -15, -1, 1, 15, 30]\r\n }\r\n\r\n // TODO some widths\r\n var stepWidth = ['_rec', '_earndate'].indexOf(props.treemap.scale.id) !== -1 ? 100 : 50\r\n var format = scaleStepFormat[props.treemap.scale.id]\r\n return (\r\n
\r\n {![MapTypeId.Portfolio, MapTypeId.ETFHoldings].includes(props.treemap.type) && (\r\n
\r\n Use mouse wheel to zoom in and out. Drag zoomed map to pan it.\r\n
\r\n Double‑click a ticker to display detailed information in a new window.\r\n
\r\n {!MapStore.isWidget() &&\r\n 'Hover mouse cursor over a ticker to see its main competitors in a stacked view with a 3-month history graph.'}\r\n
\r\n )}\r\n
\r\n {steps.map((step, index) => (\r\n \r\n {props.treemap.formatValue(step.toString(), [scaleMin, scaleMax], format)}\r\n
\r\n ))}\r\n
\r\n \r\n )\r\n}\r\n\r\nexport default Legend\r\n","import classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nimport { Delayed } from '../../../main/components/delayed'\r\nimport { Spinner } from '../../../main/components/spinner'\r\nimport { ISettings } from '../constants/settings'\r\nimport LayoutGenerator from '../layout-generator'\r\nimport mapActionCreators from '../store/action-creators'\r\nimport Treemap from '../treemap'\r\nimport { MapDataRoot, MapSubtype, MapType } from '../types'\r\nimport * as mapUtils from '../utils'\r\nimport Canvas from './Canvas'\r\n\r\nconst MapContext = React.createContext<{\r\n treemap?: Treemap\r\n setTreemap: React.Dispatch>\r\n generator?: LayoutGenerator\r\n setGenerator: React.Dispatch>\r\n}>({ setTreemap: () => {}, setGenerator: () => {} })\r\n\r\nexport function useMapContext() {\r\n return React.useContext(MapContext)\r\n}\r\n\r\nexport function MapContextProvider(props: React.PropsWithChildren<{}>) {\r\n const [treemap, setTreemap] = React.useState()\r\n const [generator, setGenerator] = React.useState()\r\n\r\n return (\r\n {props.children}\r\n )\r\n}\r\n\r\ninterface MapProps {\r\n className?: string\r\n isLoadingData?: boolean\r\n isFetchingPerf?: boolean\r\n type: MapType\r\n subtype: MapSubtype\r\n data?: MapDataRoot\r\n settings?: ISettings\r\n showETF?: boolean\r\n onNodeClick?: React.ComponentProps['onNodeClick']\r\n zoom?: boolean\r\n zoomOnWheel?: boolean\r\n legend?: boolean\r\n hover?: boolean\r\n truncateNodeName?: boolean\r\n}\r\n\r\nexport function Map({\r\n className,\r\n isLoadingData,\r\n isFetchingPerf = isLoadingData,\r\n type,\r\n subtype,\r\n data,\r\n settings,\r\n showETF,\r\n onNodeClick,\r\n zoom,\r\n zoomOnWheel,\r\n legend,\r\n hover,\r\n truncateNodeName,\r\n}: MapProps) {\r\n const { setGenerator, treemap: prevTreemap, setTreemap } = useMapContext()\r\n const containerRef = React.useRef(null)\r\n\r\n /**\r\n * We can’t `useEffect` for generator/treemap, because we’d have to deal with stale references in\r\n * other effects. In order to ensure we always get the current values, we need to either `useRef`\r\n * them (and update props for both state and ref) or `useMemo` and wait for first render to happen.\r\n */\r\n const [hasRendered, setHasRendered] = React.useState(false)\r\n\r\n /**\r\n * Generator makes the layout, it should only change when the map type or settings change.\r\n */\r\n const generator = React.useMemo(() => {\r\n if (!hasRendered || !containerRef.current) return\r\n\r\n const isSmall = mapUtils.getIsSmall()\r\n const size = mapUtils.getSize(containerRef.current, type.type, isSmall)\r\n const mapSettings = settings ?? mapUtils.getSettingsForMapType(type.type, isSmall)\r\n const generator = new LayoutGenerator(size.width, size.height, type.type, mapSettings, isSmall)\r\n\r\n // This is used for updating the map base data using map-generator\r\n window.MAP_EXPORT = generator\r\n\r\n return generator\r\n }, [hasRendered, type.type, settings])\r\n\r\n /**\r\n * Treemap object is the logical representation of the map (whereas Canvas is graphical)\r\n * We want to hold to it for as long as we can and reuse it. That’s why we’re comparing\r\n * `prevTreemap` and returning the prev value if it equals.\r\n */\r\n const treemap = React.useMemo(() => {\r\n if (!generator || !data || prevTreemap?.type === type.type) return prevTreemap\r\n\r\n return new Treemap({\r\n data: generator.getLayout(data, { showETF }),\r\n width: generator.width,\r\n height: generator.height,\r\n settings: generator.settings,\r\n isSmall: generator.isSmall,\r\n scale: { id: subtype.scaleId, name: subtype.name, tooltip: subtype.tooltip },\r\n countIndustryPerf: subtype.countIndustryPerf,\r\n countSectorPerf: generator.isSmall && subtype.countSectorPerf,\r\n type: type.type,\r\n subtype: subtype.id,\r\n truncateNodeName,\r\n mapNodeId: prevTreemap?.mapNodeId,\r\n })\r\n // Can’t add `prevTreemap` because we’d end up in a loop\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [generator, data, type.type, showETF, subtype])\r\n\r\n /**\r\n * Update context values\r\n */\r\n React.useEffect(() => {\r\n setHasRendered(true)\r\n setGenerator(generator)\r\n setTreemap(treemap)\r\n }, [generator, setGenerator, setTreemap, treemap])\r\n\r\n /**\r\n * Handle data updates\r\n */\r\n const updateTimeoutRef = React.useRef()\r\n React.useEffect(() => {\r\n if (!treemap || !generator || !data || isFetchingPerf) return\r\n\r\n updateTimeoutRef.current = window.setTimeout(() => {\r\n const layout = generator.getLayout(data, { showETF })\r\n mapActionCreators.updateLayout(treemap, {\r\n width: generator.width,\r\n height: generator.height,\r\n data: layout,\r\n scale: { id: subtype.scaleId, name: subtype.name, tooltip: subtype.tooltip },\r\n })\r\n }, 100)\r\n\r\n return () => {\r\n if (updateTimeoutRef.current) window.clearTimeout(updateTimeoutRef.current)\r\n }\r\n }, [generator, treemap, data, isFetchingPerf, showETF, subtype])\r\n\r\n /**\r\n * Recalculate layout when the window size changes\r\n */\r\n React.useEffect(() => {\r\n const containerElement = containerRef.current\r\n\r\n if (!generator || !containerElement || !treemap || !data) return\r\n\r\n const resize = throttle(() => {\r\n const size = mapUtils.getSize(containerElement, generator.type, generator.isSmall)\r\n\r\n if (size.width === treemap.width && size.height === treemap.height) return\r\n\r\n treemap.zoom.scale(1)\r\n generator.width = size.width\r\n generator.height = size.height\r\n const layout = generator.getLayout(data, { showETF })\r\n mapActionCreators.updateLayout(treemap, {\r\n width: generator.width,\r\n height: generator.height,\r\n data: layout,\r\n scale: treemap.scale,\r\n })\r\n }, 100)\r\n\r\n window.addEventListener('resize', resize)\r\n\r\n return () => {\r\n window.removeEventListener('resize', resize)\r\n }\r\n }, [generator, treemap, data, showETF])\r\n\r\n return (\r\n
\r\n \r\n {(!treemap && !isLoadingData) || !treemap || isLoadingData ? (\r\n }>\r\n
\r\n \r\n
\r\n
\r\n ) : (\r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { BrowserRouter } from 'react-router-dom'\r\n\r\nimport { Loading } from '../../../main/components/loading'\r\nimport { QueryClientContext } from '../../shared/components/QueryClientContext'\r\nimport { MapContextProvider } from './Map'\r\n\r\nexport function MapContext(props: React.PropsWithChildren) {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n {props.children}\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 { BoxProps } from '../../../main/components/box'\r\nimport { ButtonHTMLProps, ButtonProps } from '../../../main/components/button'\r\nimport { Select, SelectOption, SelectProps } from '../../../main/components/select'\r\nimport { SelectItem } from '../../../main/components/select/types'\r\n\r\nexport enum MapSelectTheme {\r\n light,\r\n dark,\r\n}\r\n\r\ninterface MapSelectThemeReturn {\r\n label: React.HTMLProps\r\n button: ButtonProps & ButtonHTMLProps\r\n popover: BoxProps\r\n}\r\n\r\nfunction getMapSelectTheme(theme: MapSelectTheme): MapSelectThemeReturn | undefined {\r\n switch (theme) {\r\n case MapSelectTheme.dark:\r\n return {\r\n label: {\r\n className: 'text-gray-400',\r\n },\r\n button: {\r\n theme: 'transparent',\r\n rounding: 'none',\r\n className: 'bg-[#4a505f] border border-[#585f72] hover:bg-[#535a6b] hover:border-[#707990]',\r\n contentClass: 'truncate',\r\n rightContent: 'caretDown',\r\n },\r\n popover: {\r\n rounding: 'none',\r\n theme: 'none',\r\n className: 'overflow-y-auto max-h-80 bg-[#4a505f] border border-[#585f72]',\r\n },\r\n }\r\n\r\n case MapSelectTheme.light:\r\n return {\r\n label: { className: 'text-gray-500' },\r\n button: { rounding: 'none', rightContent: 'caretDown' },\r\n popover: { rounding: 'none', className: 'overflow-y-auto max-h-80' },\r\n }\r\n }\r\n}\r\n\r\ninterface MapSelectProps extends Omit, 'theme'> {\r\n /**\r\n * Theme for the map select\r\n *\r\n * @default dark\r\n */\r\n theme?: keyof typeof MapSelectTheme\r\n}\r\n\r\nexport function MapSelect, Name = never>({\r\n label,\r\n 'aria-label': ariaLabel,\r\n theme = 'dark',\r\n ...props\r\n}: MapSelectProps) {\r\n const selectTheme = React.useMemo(() => getMapSelectTheme(MapSelectTheme[theme]), [theme])\r\n\r\n return (\r\n {label}\r\n )\r\n }\r\n aria-label={ariaLabel ?? (typeof label === 'string' ? label : undefined)}\r\n className=\"w-full\"\r\n placeholder=\"Any\"\r\n listProps={selectTheme?.popover}\r\n {...selectTheme?.button}\r\n {...props}\r\n onChange={props.onChange}\r\n name={props.name}\r\n hasPopoverButtonWidthLimit={false}\r\n >\r\n {props.children ??\r\n props.items.map((subtype) => (\r\n \r\n {subtype.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\nimport { Button, ButtonHTMLProps, ButtonProps } from '../../../main/components/button'\r\nimport { Input, InputHTMLProps, InputProps } from '../../../main/components/input'\r\nimport MapActionCreators from '../store/action-creators'\r\nimport { MapDataNode } from '../types'\r\nimport { useMapContext } from './Map'\r\n\r\nfunction filterItems(stocks: MapDataNode[] = [], input: string) {\r\n return stocks\r\n .filter(function (stock) {\r\n return stock.name.indexOf(input) === 0 || (stock.description || '').toUpperCase().indexOf(input) === 0\r\n })\r\n .sort(function (a, b) {\r\n if (a.name === b.name) {\r\n return 0\r\n }\r\n return a.name < b.name ? -1 : 1\r\n })\r\n .slice(0, 10)\r\n}\r\n\r\nexport function useSearch() {\r\n const { treemap } = useMapContext()\r\n const [value, setValue] = React.useState('')\r\n const [results, setResults] = React.useState(filterItems(treemap?.nodes, ''))\r\n\r\n React.useEffect(() => {\r\n if (treemap) {\r\n setResults(filterItems(treemap.nodes, ''))\r\n setValue('')\r\n }\r\n }, [treemap])\r\n\r\n const onInputChange = React.useCallback(\r\n (event: React.ChangeEvent) => {\r\n const input = event.target.value.toUpperCase()\r\n setValue(input)\r\n setResults(filterItems(treemap?.nodes, input))\r\n },\r\n [treemap]\r\n )\r\n\r\n const onItemClick = React.useCallback(\r\n (node: MapDataNode) => {\r\n if (!treemap) return\r\n\r\n const cx = (node.x + node.x + node.dx) / 2,\r\n cy = (node.y + node.y + node.dy) / 2,\r\n diffX = cx - treemap.width / 2,\r\n diffY = cy - treemap.height / 2\r\n\r\n MapActionCreators.zoomAndTranslate(treemap, treemap.getLastZoomLevel(), cx + diffX, cy + diffY)\r\n MapActionCreators.setHoveredNode(treemap.mapNodeId, node)\r\n },\r\n [treemap]\r\n )\r\n\r\n const onResultMouseLeave = React.useCallback(() => {\r\n if (!treemap) return\r\n MapActionCreators.setHoveredNode(treemap.mapNodeId, undefined)\r\n }, [treemap])\r\n\r\n return {\r\n value,\r\n results,\r\n onInputChange,\r\n onItemClick,\r\n onResultMouseLeave,\r\n }\r\n}\r\n\r\nexport function SearchInput(props: InputProps & Omit) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ninterface SearchResultProps extends ButtonProps, Omit {\r\n result: MapDataNode\r\n onClick: (node: MapDataNode) => void\r\n onMouseLeave: (e: React.MouseEvent) => void\r\n}\r\n\r\nexport function SearchResult({ result, onClick, onMouseLeave, ...props }: Omit) {\r\n return (\r\n
  • \r\n onClick(result)}\r\n >\r\n {result.name}\r\n {result.description}\r\n \r\n
  • \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Button } from '../../../../main/components/button'\r\nimport { isIpad, isMobile } from '../../../shared/isMobile'\r\nimport { EXPANDED_MAP_BODY_CLASSS } from '../../constants/constants'\r\nimport mapActionCreators from '../../store/action-creators'\r\nimport { MapDataRoot } from '../../types'\r\nimport * as mapUtils from '../../utils'\r\nimport { useMapContext } from '../Map'\r\n\r\ninterface ExpandProps {\r\n data?: MapDataRoot\r\n className?: string\r\n layoutOptions?: Record\r\n}\r\n\r\nexport function Expand(props: ExpandProps) {\r\n const { treemap, generator } = useMapContext()\r\n\r\n const onExpand = React.useCallback(() => {\r\n if (!treemap || !generator || !props.data) return\r\n\r\n if (document.body.classList.contains(EXPANDED_MAP_BODY_CLASSS)) {\r\n document.body.classList.remove(EXPANDED_MAP_BODY_CLASSS)\r\n } else {\r\n window.gtag?.('event', 'map-expand', { event_category: 'maps' })\r\n document.body.classList.add(EXPANDED_MAP_BODY_CLASSS)\r\n }\r\n\r\n const containerElement = document.getElementById('body')\r\n const size = mapUtils.getSize(containerElement, treemap.type, treemap.isSmall)\r\n\r\n if (size.width === treemap.width && size.height === treemap.height) return\r\n\r\n treemap.zoom.scale(1)\r\n generator.width = size.width\r\n generator.height = size.height\r\n const layout = generator.getLayout(props.data, { showETF: props.layoutOptions?.showETF })\r\n mapActionCreators.updateLayout(treemap, {\r\n width: generator.width,\r\n height: generator.height,\r\n data: layout,\r\n scale: treemap.scale,\r\n })\r\n\r\n window.scrollTo(0, 0)\r\n }, [treemap, generator, props.data, props.layoutOptions])\r\n\r\n if (isMobile() && !isIpad()) return null\r\n\r\n return (\r\n \r\n )\r\n}\r\n","/* eslint-disable import/first */\r\nimport { useMutation } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\n\r\nimport { getFormattedDateString } from '../../../header/utils'\r\nimport { Share as ShareDialog } from '../../../shared/components/Share'\r\nimport { drawShareMap } from '../../../shared/drawShareMap'\r\nimport * as api from '../../services/api'\r\nimport mapStore from '../../store/mapStore'\r\nimport { MapSubtype, MapType } from '../../types'\r\nimport { useMapContext } from '../Map'\r\n\r\ninterface ShareMapProps {\r\n mapType: MapType\r\n subtype: MapSubtype\r\n className?: string\r\n}\r\n\r\nexport function Share(props: ShareMapProps) {\r\n const { treemap } = useMapContext()\r\n const uploadImage = useMutation(api.uploadMap)\r\n\r\n const onShareClick = React.useCallback(async () => {\r\n if (!treemap) return\r\n const canvas = mapStore.getPublishCanvas()\r\n const data = await drawShareMap(canvas, [props.mapType.name, props.subtype.name, getFormattedDateString()])\r\n\r\n if (data) {\r\n uploadImage.mutate({ type: treemap.type, subtype: treemap.subtype, data })\r\n }\r\n }, [props.mapType, props.subtype, treemap, uploadImage])\r\n\r\n if (!treemap) return null\r\n\r\n return \r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Button } from '../../../../main/components/button'\r\nimport { SVG } from '../../../../main/components/icon/svg'\r\nimport mapActionCreators from '../../store/action-creators'\r\nimport { useMapContext } from '../Map'\r\n\r\nexport function useZoomButtons() {\r\n const { treemap } = useMapContext()\r\n const zoomOut = React.useCallback(\r\n (ev: React.MouseEvent) => {\r\n if (!treemap) return\r\n ev.preventDefault()\r\n mapActionCreators.zoom(treemap, -1, treemap.width / 2, treemap.height / 2)\r\n },\r\n [treemap]\r\n )\r\n const zoomIn = React.useCallback(\r\n (ev: React.MouseEvent) => {\r\n if (!treemap) return\r\n ev.preventDefault()\r\n mapActionCreators.zoom(treemap, 1, treemap.width / 2, treemap.height / 2)\r\n },\r\n [treemap]\r\n )\r\n\r\n return { zoomIn, zoomOut }\r\n}\r\n\r\nexport function Zoom() {\r\n const handlers = useZoomButtons()\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\ninterface TopbarProps {\r\n className?: string\r\n navContent?: React.ReactNode\r\n mapControls?: React.ReactNode\r\n}\r\n\r\nexport function Topbar(props: React.PropsWithChildren) {\r\n return (\r\n
    \r\n {props.navContent && (\r\n
    \r\n {props.navContent}\r\n
    \r\n )}\r\n
    {props.children}
    \r\n {props.mapControls}\r\n
    \r\n )\r\n}\r\n","import { useQuery, useQueryClient } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\n\r\nimport { FALLBACK_PERF_RESPONSE } from '../constants/constants'\r\nimport * as api from '../services/api'\r\nimport { MapDataRoot, MapSubtypeId, MapTypeId, PerfData } from '../types'\r\nimport * as mapUtils from '../utils'\r\n\r\nexport type MapDataHookReturn = ReturnType\r\n\r\n/**\r\n * Hook which fetches map data and perf data from the api\r\n */\r\nexport function useMapData(\r\n type: MapTypeId,\r\n subtype: MapSubtypeId,\r\n cacheBuster: number,\r\n mapBaseData?: MapDataRoot,\r\n fetchBaseData = api.mapBaseData,\r\n fetchPerfData = api.mapPerf\r\n) {\r\n const queryClient = useQueryClient()\r\n const dataVersion = React.useRef()\r\n const prevType = React.useRef()\r\n\r\n React.useEffect(() => {\r\n if (mapBaseData) {\r\n const perfData = mapUtils.parseInitDataAsPerf(mapBaseData)\r\n queryClient.setQueryData(['mapPerf', type, subtype], perfData)\r\n prevType.current = type\r\n }\r\n // This effect only needs to run on mount, otherwise we’d be overriding the data\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n /**\r\n * Fetch base data and perf data for the map. We cannot use `useQueries` here,\r\n * because `keepPreviousData` doesn’t work as it creates new objects every time.\r\n */\r\n const baseDataQuery = useQuery({\r\n queryKey: ['mapBaseData', type, cacheBuster],\r\n queryFn: () => fetchBaseData(type, cacheBuster),\r\n initialData: !prevType.current ? mapBaseData : undefined,\r\n cacheTime: Infinity,\r\n staleTime: Infinity,\r\n })\r\n\r\n const perfDataQuery = useQuery({\r\n queryKey: ['mapPerf', type, subtype],\r\n queryFn: async () => {\r\n const prevPerf = queryClient.getQueryData(['mapPerf', type, subtype]) ?? {\r\n ...FALLBACK_PERF_RESPONSE,\r\n version: dataVersion.current,\r\n }\r\n const apiResponse = await fetchPerfData(type, subtype)\r\n return apiResponse ?? prevPerf\r\n },\r\n // Keep previous data if the map type hasn’t changed\r\n keepPreviousData: prevType.current === type,\r\n refetchInterval: () => mapUtils.getMapsRefreshInterval(),\r\n staleTime: 1000,\r\n onSuccess(data) {\r\n if (!dataVersion.current && data) {\r\n dataVersion.current = data.version\r\n }\r\n\r\n if (dataVersion.current !== data?.version) {\r\n window.location.reload()\r\n return\r\n }\r\n\r\n prevType.current = type\r\n },\r\n })\r\n\r\n const data = React.useMemo(() => {\r\n if (!perfDataQuery.data || !baseDataQuery.data) return undefined\r\n\r\n const [restoredData] = mapUtils.restoreDataKeys([baseDataQuery.data], perfDataQuery.data)\r\n\r\n return restoredData\r\n }, [baseDataQuery.data, perfDataQuery.data])\r\n\r\n return {\r\n data,\r\n baseDataQuery,\r\n perfDataQuery,\r\n }\r\n}\r\n","import { useLocation } from 'react-router-dom'\r\n\r\nimport { MAP_TYPES } from '../constants/constants'\r\n\r\n/**\r\n * Hook which gets the current map type and subtype from the URL\r\n */\r\nexport function useMapType() {\r\n const query = new URLSearchParams(useLocation().search)\r\n const typeFromQuery = query.get('t')\r\n const subtypeFromQuery = query.get('st')\r\n\r\n const type = MAP_TYPES.find((t) => t.type === typeFromQuery) ?? MAP_TYPES[0]\r\n const subtype = type.subtypes.find((subtype) => subtype.id === subtypeFromQuery) ?? type.subtypes[0]\r\n\r\n return { type, subtype }\r\n}\r\n","import classnames from 'classnames'\r\nimport { NavLink } from 'react-router-dom'\r\n\r\nimport { Delayed } from '../../../main/components/delayed'\r\nimport { Spinner } from '../../../main/components/spinner'\r\nimport * as tracking from '../../shared/tracking'\r\nimport { MAP_TYPES } from '../constants/constants'\r\nimport { MapSubtypeId, MapTypeId } from '../types'\r\n\r\ninterface MapTypeProps {\r\n activeType: MapTypeId\r\n activeSubtype: MapSubtypeId\r\n isLoading: boolean\r\n linkClassName?: string\r\n}\r\n\r\nexport function MapTypeList(props: MapTypeProps) {\r\n const linkClass = props.linkClassName ?? ''\r\n\r\n return (\r\n
      \r\n {MAP_TYPES.map((map) => {\r\n const isActiveTreemap = props.activeType === map.type\r\n const query = new URLSearchParams({ t: map.type })\r\n if (props.activeSubtype !== MapSubtypeId.DayPerf) {\r\n query.append('st', props.activeSubtype)\r\n }\r\n\r\n return (\r\n
    • \r\n \r\n classnames('text-xs leading-7', {\r\n [linkClass]: !isActiveTreemap,\r\n 'text-white font-bold': isActiveTreemap,\r\n })\r\n }\r\n onClick={() => {\r\n document.title = map.pageTitle\r\n tracking.trackPageView({ query: `t=${map.type}` })\r\n }}\r\n >\r\n \r\n {map.name}\r\n {isActiveTreemap && props.isLoading && (\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n
    • \r\n )\r\n })}\r\n
    \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { Button } from '../../main/components/button'\r\nimport { DefaultErrorBoundary } from '../../main/components/error-view'\r\nimport { Paragraph } from '../../main/components/typography'\r\nimport { AdTag, useInvestingChannelAds } from '../shared/components/Ads'\r\nimport * as tracking from '../shared/tracking'\r\nimport { Map, useMapContext } from './components/Map'\r\nimport { MapSelect } from './components/MapSelect'\r\nimport { MapTypeList } from './components/MapTypeList'\r\nimport { SearchInput, SearchResult, useSearch } from './components/Search'\r\nimport { Topbar } from './components/Topbar'\r\nimport { Expand } from './components/Topbar/Expand'\r\nimport { Share } from './components/Topbar/Share'\r\nimport { Zoom } from './components/Topbar/Zoom'\r\nimport { useMapData } from './hooks/use-map-data'\r\nimport { useMapType } from './hooks/use-map-type'\r\nimport { MapDataRoot, MapSubtypeId } from './types'\r\nimport * as mapUtils from './utils'\r\n\r\nconst linkClassName = 'text-link hover:text-white'\r\n\r\nexport interface MapInitProps {\r\n initData?: MapDataRoot\r\n cacheBuster: number\r\n generate?: boolean\r\n}\r\n\r\nfunction App(props: MapInitProps) {\r\n const { treemap } = useMapContext()\r\n const navigate = useNavigate()\r\n const { type, subtype } = useMapType()\r\n const mapData = useMapData(type.type, subtype.id, props.cacheBuster, props.initData)\r\n const search = useSearch()\r\n // Make sure all ads are refreshed on type/subtype change (page navigation)\r\n const hasInvestingChannelAds = useInvestingChannelAds([type, subtype])\r\n\r\n /**\r\n * Set new subtype to be false on perf data load so we don’t display loading state when fetching\r\n * new perf data for the same type\r\n */\r\n const [isNewSubtype, setIsNewSubtype] = React.useState(false)\r\n React.useEffect(() => {\r\n if (!mapData.perfDataQuery.isFetching) {\r\n setIsNewSubtype(false)\r\n }\r\n }, [mapData.perfDataQuery.isFetching])\r\n\r\n const isLoadingInitialBaseData = !mapData.baseDataQuery.isPreviousData && mapData.baseDataQuery.isLoading\r\n const isLoadingInitialPerf = !mapData.perfDataQuery.isPreviousData && mapData.perfDataQuery.isLoading\r\n const isInitialLoading = isLoadingInitialBaseData || isLoadingInitialPerf\r\n const isFetchingNewPerf = isNewSubtype && !mapData.perfDataQuery.isLoading && mapData.perfDataQuery.isFetching\r\n\r\n return (\r\n <>\r\n \r\n

    View

    \r\n \r\n \r\n \r\n }\r\n mapControls={\r\n <>\r\n
    \r\n \r\n \r\n
    \r\n \r\n \r\n }\r\n >\r\n \r\n {type.description}\r\n \r\n \r\n
    \r\n
    \r\n
    \r\n

    Map Filter

    \r\n \r\n
    \r\n ({ label: subtype.name, value: subtype.id }))}\r\n isLoading={isFetchingNewPerf}\r\n onChange={(item) => {\r\n const newSubtype = type.subtypes.find((subtype) => subtype.id === item.value)\r\n if (newSubtype) {\r\n const query = new URLSearchParams(window.location.search)\r\n if (newSubtype.id === MapSubtypeId.DayPerf) {\r\n query.delete('st')\r\n } else {\r\n query.set('st', newSubtype.id)\r\n }\r\n\r\n setIsNewSubtype(true)\r\n const stringQuery = query.toString()\r\n navigate({ pathname: window.location.pathname, search: stringQuery }, { replace: true })\r\n tracking.trackPageView({ query: stringQuery })\r\n }\r\n }}\r\n />\r\n
    \r\n
    \r\n\r\n
    \r\n \r\n
    \r\n
      \r\n {search.results.map((result) => (\r\n \r\n ))}\r\n
    \r\n\r\n {hasInvestingChannelAds && (\r\n
    \r\n \r\n \r\n
    \r\n )}\r\n
    \r\n\r\n \r\n
    \r\n \r\n {hasInvestingChannelAds && }\r\n
    \r\n
    \r\n
    \r\n\r\n
    \r\n
    \r\n \r\n )\r\n}\r\n\r\nexport default App\r\n","import * as ReactDOM from 'react-dom'\r\n\r\nimport App, { MapInitProps } from './App'\r\nimport { MapContext } from './components/MapContext'\r\n\r\nwindow['FinvizInitCanvas'] = async function initCanvas(props: MapInitProps) {\r\n const root = document.getElementById('root')\r\n\r\n ReactDOM.render(\r\n \r\n \r\n ,\r\n root\r\n )\r\n}\r\n","import ReactDOM from 'react-dom'\r\n\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport Canvas from './components/Canvas'\r\nimport { MAP_SUBTYPES_COMPANIES_BY_ID } from './constants/constants'\r\nimport { SettingsSmall, SettingsSmallDark, SettingsSmallGeo, SettingsSmallGeoDark } from './constants/settings'\r\nimport Treemap from './treemap'\r\nimport { MapSubtypeId, MapTypeId, PerfData } from './types'\r\nimport * as mapUtils from './utils'\r\n\r\nconst CANVAS_WIDTH = 400\r\nconst CANVAS_HEIGHT_GEO = 235\r\nconst CANVAS_HEIGHT = 300\r\nconst CANVAS_HEIGHT_NEW = 368\r\n\r\nasync function renderTreemaps(props: { perfDataSec: PerfData; perfDataGeo: PerfData; cacheBuster: number }) {\r\n let precomputedData\r\n try {\r\n precomputedData = await mapUtils.fetchBaseData(\r\n FinvizSettings.hasRedesignEnabled ? 'hp_redesign.json' : 'hp.json',\r\n props.cacheBuster\r\n )\r\n } catch {\r\n return\r\n }\r\n const isDark = document.documentElement.classList.contains('dark')\r\n\r\n if (props.perfDataSec) {\r\n const subtype = MAP_SUBTYPES_COMPANIES_BY_ID[MapSubtypeId.DayPerf]\r\n const scale = { id: subtype.scaleId, name: subtype.name, tooltip: subtype.tooltip }\r\n const initData = mapUtils.getMapData(precomputedData.sec, props.perfDataSec)\r\n const treemap = new Treemap({\r\n data: initData,\r\n scale,\r\n width: CANVAS_WIDTH,\r\n height: FinvizSettings.hasRedesignEnabled ? CANVAS_HEIGHT_NEW : CANVAS_HEIGHT,\r\n countIndustryPerf: false,\r\n countSectorPerf: true,\r\n settings: isDark ? SettingsSmallDark : SettingsSmall,\r\n type: MapTypeId.Sector,\r\n subtype: subtype.id,\r\n isSmall: true,\r\n zoomLevels: [1],\r\n version: props.perfDataSec.version,\r\n })\r\n\r\n window.FinvizIndexSecMap = treemap\r\n\r\n ReactDOM.render(\r\n ,\r\n document.getElementById('treemap-small')\r\n )\r\n }\r\n\r\n if (props.perfDataGeo) {\r\n const subtype = MAP_SUBTYPES_COMPANIES_BY_ID[MapSubtypeId.DayPerf]\r\n const scale = { id: subtype.scaleId, name: subtype.name, tooltip: subtype.tooltip }\r\n const initData = mapUtils.getMapData(precomputedData.geo, props.perfDataGeo)\r\n const treemap = new Treemap({\r\n data: initData,\r\n scale,\r\n width: CANVAS_WIDTH,\r\n height: CANVAS_HEIGHT_GEO,\r\n countIndustryPerf: true,\r\n countSectorPerf: false,\r\n settings: isDark ? SettingsSmallGeoDark : SettingsSmallGeo,\r\n type: MapTypeId.World,\r\n subtype: subtype.id,\r\n isSmall: true,\r\n zoomLevels: [1],\r\n version: props.perfDataGeo.version,\r\n })\r\n\r\n window.FinvizIndexGeoMap = treemap\r\n\r\n ReactDOM.render(\r\n ,\r\n document.getElementById('treemap-small-geo')\r\n )\r\n }\r\n}\r\n\r\nif (document.getElementById('map-data')) {\r\n const mapProps = parseJSONFromScript<{ perfDataSec: PerfData; perfDataGeo: PerfData; cacheBuster: number }>(\r\n 'map-data'\r\n )\r\n if (mapProps) renderTreemaps(mapProps)\r\n}\r\n","import { ContentType, apiRequest } from '../../../main/services/api'\r\nimport { MapDataRoot, MapSubtypeId, MapTypeId, PerfData } from '../types'\r\n\r\nexport function mapBaseData(type: MapTypeId, cacheBuster: number) {\r\n return apiRequest(`/maps/${type}.json`, { query: { rev: cacheBuster } }, true)\r\n}\r\n\r\nexport function mapPerf(type: MapTypeId, subtype: MapSubtypeId) {\r\n return apiRequest(`/api/map_perf.ashx`, { query: { t: type, st: subtype } })\r\n}\r\n\r\nexport function mapPerfScreener(query = window.location.search) {\r\n return apiRequest(`/api/map_perf_screener.ashx${query}`)\r\n}\r\n\r\nexport interface UploadMapResponse {\r\n imgUrl: string\r\n shareUrl: string\r\n}\r\n\r\nexport function uploadMap({ type, subtype, data }: { type: MapTypeId; subtype: MapSubtypeId; data: string }) {\r\n return apiRequest(`/publish_map_submit.ashx`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': ContentType.FormUrlEncoded,\r\n },\r\n body: new URLSearchParams({\r\n file: data.replace('data:image/png;base64,', ''),\r\n type,\r\n subtype,\r\n }),\r\n })\r\n}\r\n","import debounce from 'lodash.debounce'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../../main/services/api'\r\nimport { getDate } from '../../header/utils'\r\nimport Treemap from '../treemap'\r\nimport { MapData, MapDataNode, MapTypeId, PerfData, Scale } from '../types'\r\nimport { getVisibleTooltipTickers } from '../utils'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport mapStore from './mapStore'\r\n\r\nvar _targetScale = 1\r\nfunction zoomIn(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n _targetScale = scale\r\n animate()\r\n function animate() {\r\n treemap.zoom.scale(+(treemap.zoom.scale() + 0.05).toFixed(2), { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n if (treemap.zoom.scale() + 0.05 < _targetScale + 0.00001) {\r\n requestAnimationFrame(animate)\r\n }\r\n }\r\n}\r\n\r\nfunction zoomOut(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n _targetScale = scale\r\n animate()\r\n function animate() {\r\n treemap.zoom.scale(+(treemap.zoom.scale() - 0.05).toFixed(2), { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n if (treemap.zoom.scale() - 0.05 > _targetScale - 0.00001) {\r\n requestAnimationFrame(animate)\r\n }\r\n }\r\n}\r\n\r\nfunction updateVisibleSparklines(treemap: Treemap) {\r\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n if (hoveredNode) {\r\n const tickersToLoad = getVisibleTooltipTickers(hoveredNode)\r\n\r\n if (!tickersToLoad.includes(hoveredNode.name)) {\r\n tickersToLoad.push(hoveredNode.name)\r\n }\r\n\r\n if (tickersToLoad.length) {\r\n debouncedLoadSparklines(tickersToLoad, treemap.type)\r\n }\r\n }\r\n}\r\n\r\nlet _lastSparklinesRequest: CancelablePromise | null = null\r\nasync function loadSparklines(tickers: string[], mapType: string) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.LOAD_SPARKLINES_STARTED,\r\n })\r\n _lastSparklinesRequest?.cancel?.()\r\n _lastSparklinesRequest = apiRequest(\r\n '/api/map_sparklines.ashx',\r\n { query: { t: tickers.join(','), ty: mapType } },\r\n true\r\n )\r\n\r\n try {\r\n const data = await _lastSparklinesRequest\r\n AppDispatcher.handleServerAction({\r\n type: ActionTypes.LOAD_SPARKLINES_COMPLETED,\r\n data: data,\r\n })\r\n } catch (error) {\r\n AppDispatcher.handleServerAction({\r\n type: ActionTypes.LOAD_SPARKLINES_FAILED,\r\n error,\r\n })\r\n }\r\n}\r\n\r\nconst debouncedLoadSparklines = debounce(loadSparklines, 200, { trailing: true })\r\n\r\nconst actions = {\r\n setHoveredNode(mapNodeId: string, node: MapDataNode | undefined) {\r\n if (!node) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.RESET_SPARKLINE_DATA,\r\n })\r\n }\r\n\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_HOVERED_NODE,\r\n node,\r\n mapNodeId,\r\n })\r\n },\r\n\r\n loadSparklineData(tickers: string[], mapType: MapTypeId) {\r\n if (tickers) {\r\n debouncedLoadSparklines(tickers, mapType)\r\n }\r\n },\r\n\r\n loadSparklinesCancel() {\r\n _lastSparklinesRequest?.cancel?.()\r\n },\r\n\r\n resetSparklineData() {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.RESET_SPARKLINE_DATA,\r\n })\r\n },\r\n\r\n changeTranslate(treemap: Treemap, tx: number, ty: number) {\r\n treemap.zoom.translate([tx, ty])\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.CHANGE_TRANSLATE,\r\n })\r\n },\r\n\r\n zoom(treemap: Treemap, direction: number, offsetX: number, offsetY: number) {\r\n if (direction > 0) {\r\n const zoomLevel = treemap.getNextZoomLevel()\r\n if (zoomLevel !== treemap.zoom.scale()) {\r\n zoomIn(treemap, zoomLevel, offsetX, offsetY)\r\n }\r\n } else {\r\n const zoomLevel = treemap.getPreviousZoomLevel()\r\n if (zoomLevel !== treemap.zoom.scale()) {\r\n zoomOut(treemap, zoomLevel, offsetX, offsetY)\r\n }\r\n }\r\n },\r\n\r\n render() {\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n },\r\n\r\n zoomAndTranslate(treemap: Treemap, scale: number, tx: number, ty: number) {\r\n treemap.zoom.scale(1, { x: tx, y: ty })\r\n treemap.zoom.scale(scale, { x: tx, y: ty })\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n },\r\n\r\n updateLayout(treemap: Treemap, props: { width: number; height: number; data: MapData; scale: Scale }) {\r\n treemap.updateData(props)\r\n treemap.zoom.updateDimensions(props)\r\n AppDispatcher.handleViewAction({ type: ActionTypes.RENDER_TREEMAP })\r\n\r\n // Update hovered node if any\r\n const hoveredNode = mapStore.getHoveredNode(treemap.mapNodeId)\r\n if (hoveredNode) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_HOVERED_NODE,\r\n node: treemap.nodes.find((node) => node.name === hoveredNode.name),\r\n mapNodeId: treemap.mapNodeId,\r\n })\r\n updateVisibleSparklines(treemap)\r\n }\r\n },\r\n\r\n updatePerfData(treemap?: Treemap, data?: PerfData) {\r\n if (!treemap || !data) return\r\n\r\n treemap.updatePerf(data)\r\n AppDispatcher.handleServerAction({\r\n type: ActionTypes.UPDATE_DATA,\r\n version: data.version,\r\n timestamp: getDate(),\r\n })\r\n\r\n updateVisibleSparklines(treemap)\r\n },\r\n\r\n _setOnPublish(getPublishCanvas: () => HTMLCanvasElement) {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_PUBLISH_CANVAS,\r\n getPublishCanvas,\r\n })\r\n },\r\n\r\n setupWidget() {\r\n AppDispatcher.handleViewAction({\r\n type: ActionTypes.SET_WIDGET,\r\n isWidget: true,\r\n })\r\n },\r\n}\r\n\r\nexport default actions\r\n","import { Dispatcher } from 'flux'\r\n\r\nimport { PayloadSources } from './constants'\r\n\r\nclass AppDispatcher extends Dispatcher {\r\n handleServerAction(action: any) {\r\n var payload = {\r\n source: PayloadSources.SERVER_ACTION,\r\n action: action,\r\n }\r\n //console.log(action, payload);\r\n this.dispatch(payload)\r\n }\r\n\r\n handleViewAction(action: any) {\r\n var payload = {\r\n source: PayloadSources.VIEW_ACTION,\r\n action: action,\r\n }\r\n //console.log(action, payload);\r\n this.dispatch(payload)\r\n }\r\n}\r\n\r\nexport default new AppDispatcher()\r\n","import keyMirror from 'keymirror'\r\n\r\nconst ActionTypes = keyMirror({\r\n RENDER_TREEMAP: null,\r\n CHANGE_TRANSLATE: null,\r\n SET_HOVERED_NODE: null,\r\n\r\n LOAD_SPARKLINES_STARTED: null,\r\n LOAD_SPARKLINES_COMPLETED: null,\r\n LOAD_SPARKLINES_FAILED: null,\r\n RESET_SPARKLINE_DATA: null,\r\n\r\n INIT_STARTED: null,\r\n INIT_FAILED: null,\r\n\r\n UPDATE_DATA: null,\r\n\r\n SET_PUBLISH_CANVAS: null,\r\n\r\n SET_WIDGET: null,\r\n})\r\n\r\nconst PayloadSources = keyMirror({\r\n SERVER_ACTION: null,\r\n VIEW_ACTION: null,\r\n})\r\n\r\nexport { ActionTypes, PayloadSources }\r\n","import { EventEmitter } from 'events'\r\n\r\nclass Store extends EventEmitter {\r\n static CHANGE_EVENT = 'change'\r\n\r\n emitChange() {\r\n this.emit(Store.CHANGE_EVENT)\r\n }\r\n\r\n addChangeListener(callback: (...args: any[]) => void) {\r\n this.on(Store.CHANGE_EVENT, callback)\r\n }\r\n\r\n removeChangeListener(callback: (...args: any[]) => void) {\r\n this.removeListener(Store.CHANGE_EVENT, callback)\r\n }\r\n}\r\n\r\nexport default Store\r\n","import { MapDataNode } from '../types'\r\nimport AppDispatcher from './appDispatcher'\r\nimport { ActionTypes } from './constants'\r\nimport Store from './store'\r\n\r\nlet _hoveredNode: MapDataNode\r\nlet _mapNodeId: string\r\nlet _sparklinesData: Record = {}\r\nlet _dataVersion: number\r\nlet _dataTimestamp: Date\r\nlet _isWidget = false\r\nlet _getPublishCanvas: () => HTMLCanvasElement\r\n\r\nclass MapStore extends Store {\r\n getHoveredNode(mapNodeId: string) {\r\n if (mapNodeId === _mapNodeId) return _hoveredNode\r\n return undefined\r\n }\r\n\r\n getSparklines() {\r\n return _sparklinesData\r\n }\r\n\r\n getDataVersion() {\r\n return _dataVersion\r\n }\r\n\r\n getDataTimestamp() {\r\n return _dataTimestamp\r\n }\r\n\r\n isWidget() {\r\n return _isWidget\r\n }\r\n\r\n getPublishCanvas() {\r\n return _getPublishCanvas()\r\n }\r\n}\r\n\r\nvar mapStore = new MapStore()\r\n\r\n// @ts-ignore\r\nmapStore.dispatchToken = AppDispatcher.register(function (payload: any) {\r\n var action = payload.action\r\n\r\n switch (action.type) {\r\n case ActionTypes.RENDER_TREEMAP:\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_HOVERED_NODE:\r\n if (action.node !== _hoveredNode) {\r\n _hoveredNode = action.node\r\n _mapNodeId = action.mapNodeId\r\n mapStore.emitChange()\r\n }\r\n break\r\n\r\n case ActionTypes.CHANGE_TRANSLATE:\r\n // @ts-ignore\r\n _hoveredNode = undefined\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.LOAD_SPARKLINES_STARTED:\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.LOAD_SPARKLINES_COMPLETED:\r\n _sparklinesData = { ..._sparklinesData, ...action.data }\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.RESET_SPARKLINE_DATA:\r\n case ActionTypes.LOAD_SPARKLINES_FAILED:\r\n _sparklinesData = {}\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.UPDATE_DATA:\r\n _dataVersion = action.version\r\n _dataTimestamp = action.timestamp\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_PUBLISH_CANVAS:\r\n _getPublishCanvas = action.getPublishCanvas\r\n mapStore.emitChange()\r\n break\r\n\r\n case ActionTypes.SET_WIDGET:\r\n _isWidget = action.isWidget\r\n mapStore.emitChange()\r\n break\r\n }\r\n})\r\n\r\nexport default mapStore\r\n","// Based on Lato font with bold weight\r\nexport const fontSizesWidths: Record> = {\r\n 4: {\r\n 0: 2.32,\r\n 1: 2.32,\r\n 2: 2.32,\r\n 3: 2.32,\r\n 4: 2.32,\r\n 5: 2.32,\r\n 6: 2.32,\r\n 7: 2.32,\r\n 8: 2.32,\r\n 9: 2.32,\r\n ' ': 0.772,\r\n '+': 2.32,\r\n '-': 1.436,\r\n '%': 3.212,\r\n '.': 0.9,\r\n a: 2.094,\r\n b: 2.28,\r\n c: 1.908,\r\n d: 2.28,\r\n e: 2.138,\r\n f: 1.402,\r\n g: 2.07,\r\n h: 2.274,\r\n i: 1.084,\r\n j: 1.076,\r\n k: 2.206,\r\n l: 1.084,\r\n m: 3.368,\r\n n: 2.274,\r\n o: 2.274,\r\n p: 2.262,\r\n q: 2.28,\r\n r: 1.634,\r\n s: 1.748,\r\n t: 1.548,\r\n u: 2.274,\r\n v: 2.134,\r\n w: 3.164,\r\n x: 2.16,\r\n y: 2.134,\r\n z: 1.878,\r\n A: 2.84,\r\n B: 2.606,\r\n C: 2.682,\r\n D: 2.99,\r\n E: 2.29,\r\n F: 2.246,\r\n G: 2.892,\r\n H: 3.024,\r\n I: 1.256,\r\n J: 1.748,\r\n K: 2.792,\r\n L: 2.068,\r\n M: 3.72,\r\n N: 3.024,\r\n O: 3.198,\r\n P: 2.5,\r\n Q: 3.198,\r\n R: 2.62,\r\n S: 2.146,\r\n T: 2.38,\r\n U: 2.912,\r\n V: 2.84,\r\n W: 4.186,\r\n X: 2.716,\r\n Y: 2.618,\r\n Z: 2.468,\r\n },\r\n 6: {\r\n 0: 3.48,\r\n 1: 3.48,\r\n 2: 3.48,\r\n 3: 3.48,\r\n 4: 3.48,\r\n 5: 3.48,\r\n 6: 3.48,\r\n 7: 3.48,\r\n 8: 3.48,\r\n 9: 3.48,\r\n ' ': 1.158,\r\n '+': 3.48,\r\n '-': 2.154,\r\n '%': 4.818,\r\n '.': 1.35,\r\n a: 3.141,\r\n b: 3.42,\r\n c: 2.862,\r\n d: 3.42,\r\n e: 3.207,\r\n f: 2.103,\r\n g: 3.105,\r\n h: 3.411,\r\n i: 1.626,\r\n j: 1.614,\r\n k: 3.309,\r\n l: 1.626,\r\n m: 5.052,\r\n n: 3.411,\r\n o: 3.411,\r\n p: 3.393,\r\n q: 3.42,\r\n r: 2.451,\r\n s: 2.622,\r\n t: 2.322,\r\n u: 3.411,\r\n v: 3.201,\r\n w: 4.746,\r\n x: 3.24,\r\n y: 3.201,\r\n z: 2.817,\r\n A: 4.26,\r\n B: 3.909,\r\n C: 4.023,\r\n D: 4.485,\r\n E: 3.435,\r\n F: 3.369,\r\n G: 4.338,\r\n H: 4.536,\r\n I: 1.884,\r\n J: 2.622,\r\n K: 4.188,\r\n L: 3.102,\r\n M: 5.58,\r\n N: 4.536,\r\n O: 4.797,\r\n P: 3.75,\r\n Q: 4.797,\r\n R: 3.93,\r\n S: 3.219,\r\n T: 3.57,\r\n U: 4.368,\r\n V: 4.26,\r\n W: 6.279,\r\n X: 4.074,\r\n Y: 3.927,\r\n Z: 3.702,\r\n },\r\n 8: {\r\n 0: 4.64,\r\n 1: 4.64,\r\n 2: 4.64,\r\n 3: 4.64,\r\n 4: 4.64,\r\n 5: 4.64,\r\n 6: 4.64,\r\n 7: 4.64,\r\n 8: 4.64,\r\n 9: 4.64,\r\n ' ': 1.544,\r\n '+': 4.64,\r\n '-': 2.872,\r\n '%': 6.424,\r\n '.': 1.8,\r\n a: 4.188,\r\n b: 4.56,\r\n c: 3.816,\r\n d: 4.56,\r\n e: 4.276,\r\n f: 2.804,\r\n g: 4.14,\r\n h: 4.548,\r\n i: 2.168,\r\n j: 2.152,\r\n k: 4.412,\r\n l: 2.168,\r\n m: 6.736,\r\n n: 4.548,\r\n o: 4.548,\r\n p: 4.524,\r\n q: 4.56,\r\n r: 3.268,\r\n s: 3.496,\r\n t: 3.096,\r\n u: 4.548,\r\n v: 4.268,\r\n w: 6.328,\r\n x: 4.32,\r\n y: 4.268,\r\n z: 3.756,\r\n A: 5.68,\r\n B: 5.212,\r\n C: 5.364,\r\n D: 5.98,\r\n E: 4.58,\r\n F: 4.492,\r\n G: 5.784,\r\n H: 6.048,\r\n I: 2.512,\r\n J: 3.496,\r\n K: 5.584,\r\n L: 4.136,\r\n M: 7.44,\r\n N: 6.048,\r\n O: 6.396,\r\n P: 5,\r\n Q: 6.396,\r\n R: 5.24,\r\n S: 4.292,\r\n T: 4.76,\r\n U: 5.824,\r\n V: 5.68,\r\n W: 8.372,\r\n X: 5.432,\r\n Y: 5.236,\r\n Z: 4.936,\r\n },\r\n 9: {\r\n 0: 5.22,\r\n 1: 5.22,\r\n 2: 5.22,\r\n 3: 5.22,\r\n 4: 5.22,\r\n 5: 5.22,\r\n 6: 5.22,\r\n 7: 5.22,\r\n 8: 5.22,\r\n 9: 5.22,\r\n ' ': 1.737,\r\n '+': 5.22,\r\n '-': 3.231,\r\n '%': 7.227,\r\n '.': 2.025,\r\n a: 4.712,\r\n b: 5.13,\r\n c: 4.293,\r\n d: 5.13,\r\n e: 4.811,\r\n f: 3.155,\r\n g: 4.658,\r\n h: 5.117,\r\n i: 2.439,\r\n j: 2.421,\r\n k: 4.964,\r\n l: 2.439,\r\n m: 7.578,\r\n n: 5.117,\r\n o: 5.117,\r\n p: 5.09,\r\n q: 5.13,\r\n r: 3.677,\r\n s: 3.933,\r\n t: 3.483,\r\n u: 5.117,\r\n v: 4.802,\r\n w: 7.119,\r\n x: 4.86,\r\n y: 4.802,\r\n z: 4.226,\r\n A: 6.39,\r\n B: 5.864,\r\n C: 6.035,\r\n D: 6.728,\r\n E: 5.153,\r\n F: 5.054,\r\n G: 6.507,\r\n H: 6.804,\r\n I: 2.826,\r\n J: 3.933,\r\n K: 6.282,\r\n L: 4.653,\r\n M: 8.37,\r\n N: 6.804,\r\n O: 7.196,\r\n P: 5.625,\r\n Q: 7.196,\r\n R: 5.895,\r\n S: 4.829,\r\n T: 5.355,\r\n U: 6.552,\r\n V: 6.39,\r\n W: 9.419,\r\n X: 6.111,\r\n Y: 5.891,\r\n Z: 5.553,\r\n },\r\n 10: {\r\n 0: 5.8,\r\n 1: 5.8,\r\n 2: 5.8,\r\n 3: 5.8,\r\n 4: 5.8,\r\n 5: 5.8,\r\n 6: 5.8,\r\n 7: 5.8,\r\n 8: 5.8,\r\n 9: 5.8,\r\n ' ': 1.93,\r\n '+': 5.8,\r\n '-': 3.59,\r\n '%': 8.03,\r\n '.': 2.25,\r\n a: 5.235,\r\n b: 5.7,\r\n c: 4.77,\r\n d: 5.7,\r\n e: 5.345,\r\n f: 3.505,\r\n g: 5.175,\r\n h: 5.685,\r\n i: 2.71,\r\n j: 2.69,\r\n k: 5.515,\r\n l: 2.71,\r\n m: 8.42,\r\n n: 5.685,\r\n o: 5.685,\r\n p: 5.655,\r\n q: 5.7,\r\n r: 4.085,\r\n s: 4.37,\r\n t: 3.87,\r\n u: 5.685,\r\n v: 5.335,\r\n w: 7.91,\r\n x: 5.4,\r\n y: 5.335,\r\n z: 4.695,\r\n A: 7.1,\r\n B: 6.515,\r\n C: 6.705,\r\n D: 7.475,\r\n E: 5.725,\r\n F: 5.615,\r\n G: 7.23,\r\n H: 7.56,\r\n I: 3.14,\r\n J: 4.37,\r\n K: 6.98,\r\n L: 5.17,\r\n M: 9.3,\r\n N: 7.56,\r\n O: 7.995,\r\n P: 6.25,\r\n Q: 7.995,\r\n R: 6.55,\r\n S: 5.365,\r\n T: 5.95,\r\n U: 7.28,\r\n V: 7.1,\r\n W: 10.465,\r\n X: 6.79,\r\n Y: 6.545,\r\n Z: 6.17,\r\n },\r\n 11: {\r\n 0: 6.38,\r\n 1: 6.38,\r\n 2: 6.38,\r\n 3: 6.38,\r\n 4: 6.38,\r\n 5: 6.38,\r\n 6: 6.38,\r\n 7: 6.38,\r\n 8: 6.38,\r\n 9: 6.38,\r\n ' ': 2.123,\r\n '+': 6.38,\r\n '-': 3.949,\r\n '%': 8.833,\r\n '.': 2.475,\r\n a: 5.759,\r\n b: 6.27,\r\n c: 5.247,\r\n d: 6.27,\r\n e: 5.88,\r\n f: 3.856,\r\n g: 5.693,\r\n h: 6.254,\r\n i: 2.981,\r\n j: 2.959,\r\n k: 6.067,\r\n l: 2.981,\r\n m: 9.262,\r\n n: 6.254,\r\n o: 6.254,\r\n p: 6.221,\r\n q: 6.27,\r\n r: 4.494,\r\n s: 4.807,\r\n t: 4.257,\r\n u: 6.254,\r\n v: 5.869,\r\n w: 8.701,\r\n x: 5.94,\r\n y: 5.869,\r\n z: 5.165,\r\n A: 7.81,\r\n B: 7.167,\r\n C: 7.376,\r\n D: 8.223,\r\n E: 6.298,\r\n F: 6.177,\r\n G: 7.953,\r\n H: 8.316,\r\n I: 3.454,\r\n J: 4.807,\r\n K: 7.678,\r\n L: 5.687,\r\n M: 10.23,\r\n N: 8.316,\r\n O: 8.795,\r\n P: 6.875,\r\n Q: 8.795,\r\n R: 7.205,\r\n S: 5.902,\r\n T: 6.545,\r\n U: 8.008,\r\n V: 7.81,\r\n W: 11.512,\r\n X: 7.469,\r\n Y: 7.2,\r\n Z: 6.787,\r\n },\r\n 12: {\r\n 0: 6.96,\r\n 1: 6.96,\r\n 2: 6.96,\r\n 3: 6.96,\r\n 4: 6.96,\r\n 5: 6.96,\r\n 6: 6.96,\r\n 7: 6.96,\r\n 8: 6.96,\r\n 9: 6.96,\r\n ' ': 2.316,\r\n '+': 6.96,\r\n '-': 4.308,\r\n '%': 9.636,\r\n '.': 2.7,\r\n a: 6.282,\r\n b: 6.84,\r\n c: 5.724,\r\n d: 6.84,\r\n e: 6.414,\r\n f: 4.206,\r\n g: 6.21,\r\n h: 6.822,\r\n i: 3.252,\r\n j: 3.228,\r\n k: 6.618,\r\n l: 3.252,\r\n m: 10.104,\r\n n: 6.822,\r\n o: 6.822,\r\n p: 6.786,\r\n q: 6.84,\r\n r: 4.902,\r\n s: 5.244,\r\n t: 4.644,\r\n u: 6.822,\r\n v: 6.402,\r\n w: 9.492,\r\n x: 6.48,\r\n y: 6.402,\r\n z: 5.634,\r\n A: 8.52,\r\n B: 7.818,\r\n C: 8.046,\r\n D: 8.97,\r\n E: 6.87,\r\n F: 6.738,\r\n G: 8.676,\r\n H: 9.072,\r\n I: 3.768,\r\n J: 5.244,\r\n K: 8.376,\r\n L: 6.204,\r\n M: 11.16,\r\n N: 9.072,\r\n O: 9.594,\r\n P: 7.5,\r\n Q: 9.594,\r\n R: 7.86,\r\n S: 6.438,\r\n T: 7.14,\r\n U: 8.736,\r\n V: 8.52,\r\n W: 12.558,\r\n X: 8.148,\r\n Y: 7.854,\r\n Z: 7.404,\r\n },\r\n 13: {\r\n 0: 7.54,\r\n 1: 7.54,\r\n 2: 7.54,\r\n 3: 7.54,\r\n 4: 7.54,\r\n 5: 7.54,\r\n 6: 7.54,\r\n 7: 7.54,\r\n 8: 7.54,\r\n 9: 7.54,\r\n ' ': 2.509,\r\n '+': 7.54,\r\n '-': 4.667,\r\n '%': 10.439,\r\n '.': 2.925,\r\n a: 6.806,\r\n b: 7.41,\r\n c: 6.201,\r\n d: 7.41,\r\n e: 6.949,\r\n f: 4.557,\r\n g: 6.728,\r\n h: 7.391,\r\n i: 3.523,\r\n j: 3.497,\r\n k: 7.17,\r\n l: 3.523,\r\n m: 10.946,\r\n n: 7.391,\r\n o: 7.391,\r\n p: 7.352,\r\n q: 7.41,\r\n r: 5.311,\r\n s: 5.681,\r\n t: 5.031,\r\n u: 7.391,\r\n v: 6.936,\r\n w: 10.283,\r\n x: 7.02,\r\n y: 6.936,\r\n z: 6.104,\r\n A: 9.23,\r\n B: 8.47,\r\n C: 8.717,\r\n D: 9.718,\r\n E: 7.443,\r\n F: 7.3,\r\n G: 9.399,\r\n H: 9.828,\r\n I: 4.082,\r\n J: 5.681,\r\n K: 9.074,\r\n L: 6.721,\r\n M: 12.09,\r\n N: 9.828,\r\n O: 10.394,\r\n P: 8.125,\r\n Q: 10.394,\r\n R: 8.515,\r\n S: 6.975,\r\n T: 7.735,\r\n U: 9.464,\r\n V: 9.23,\r\n W: 13.605,\r\n X: 8.827,\r\n Y: 8.509,\r\n Z: 8.021,\r\n },\r\n 14: {\r\n 0: 8.12,\r\n 1: 8.12,\r\n 2: 8.12,\r\n 3: 8.12,\r\n 4: 8.12,\r\n 5: 8.12,\r\n 6: 8.12,\r\n 7: 8.12,\r\n 8: 8.12,\r\n 9: 8.12,\r\n ' ': 2.702,\r\n '+': 8.12,\r\n '-': 5.026,\r\n '%': 11.242,\r\n '.': 3.15,\r\n a: 7.329,\r\n b: 7.98,\r\n c: 6.678,\r\n d: 7.98,\r\n e: 7.483,\r\n f: 4.907,\r\n g: 7.245,\r\n h: 7.959,\r\n i: 3.794,\r\n j: 3.766,\r\n k: 7.721,\r\n l: 3.794,\r\n m: 11.788,\r\n n: 7.959,\r\n o: 7.959,\r\n p: 7.917,\r\n q: 7.98,\r\n r: 5.719,\r\n s: 6.118,\r\n t: 5.418,\r\n u: 7.959,\r\n v: 7.469,\r\n w: 11.074,\r\n x: 7.56,\r\n y: 7.469,\r\n z: 6.573,\r\n A: 9.94,\r\n B: 9.121,\r\n C: 9.387,\r\n D: 10.465,\r\n E: 8.015,\r\n F: 7.861,\r\n G: 10.122,\r\n H: 10.584,\r\n I: 4.396,\r\n J: 6.118,\r\n K: 9.772,\r\n L: 7.238,\r\n M: 13.02,\r\n N: 10.584,\r\n O: 11.193,\r\n P: 8.75,\r\n Q: 11.193,\r\n R: 9.17,\r\n S: 7.511,\r\n T: 8.33,\r\n U: 10.192,\r\n V: 9.94,\r\n W: 14.651,\r\n X: 9.506,\r\n Y: 9.163,\r\n Z: 8.638,\r\n },\r\n 18: {\r\n 0: 10.44,\r\n 1: 10.44,\r\n 2: 10.44,\r\n 3: 10.44,\r\n 4: 10.44,\r\n 5: 10.44,\r\n 6: 10.44,\r\n 7: 10.44,\r\n 8: 10.44,\r\n 9: 10.44,\r\n ' ': 3.474,\r\n '+': 10.44,\r\n '-': 6.462,\r\n '%': 14.454,\r\n '.': 4.05,\r\n a: 9.423,\r\n b: 10.26,\r\n c: 8.586,\r\n d: 10.26,\r\n e: 9.621,\r\n f: 6.309,\r\n g: 9.315,\r\n h: 10.233,\r\n i: 4.878,\r\n j: 4.842,\r\n k: 9.927,\r\n l: 4.878,\r\n m: 15.156,\r\n n: 10.233,\r\n o: 10.233,\r\n p: 10.179,\r\n q: 10.26,\r\n r: 7.353,\r\n s: 7.866,\r\n t: 6.966,\r\n u: 10.233,\r\n v: 9.603,\r\n w: 14.238,\r\n x: 9.72,\r\n y: 9.603,\r\n z: 8.451,\r\n A: 12.78,\r\n B: 11.727,\r\n C: 12.069,\r\n D: 13.455,\r\n E: 10.305,\r\n F: 10.107,\r\n G: 13.014,\r\n H: 13.608,\r\n I: 5.652,\r\n J: 7.866,\r\n K: 12.564,\r\n L: 9.306,\r\n M: 16.74,\r\n N: 13.608,\r\n O: 14.391,\r\n P: 11.25,\r\n Q: 14.391,\r\n R: 11.79,\r\n S: 9.657,\r\n T: 10.71,\r\n U: 13.104,\r\n V: 12.78,\r\n W: 18.837,\r\n X: 12.222,\r\n Y: 11.781,\r\n Z: 11.106,\r\n },\r\n 20: {\r\n 0: 11.6,\r\n 1: 11.6,\r\n 2: 11.6,\r\n 3: 11.6,\r\n 4: 11.6,\r\n 5: 11.6,\r\n 6: 11.6,\r\n 7: 11.6,\r\n 8: 11.6,\r\n 9: 11.6,\r\n ' ': 3.86,\r\n '+': 11.6,\r\n '-': 7.18,\r\n '%': 16.06,\r\n '.': 4.5,\r\n a: 10.47,\r\n b: 11.4,\r\n c: 9.54,\r\n d: 11.4,\r\n e: 10.69,\r\n f: 7.01,\r\n g: 10.35,\r\n h: 11.37,\r\n i: 5.42,\r\n j: 5.38,\r\n k: 11.03,\r\n l: 5.42,\r\n m: 16.84,\r\n n: 11.37,\r\n o: 11.37,\r\n p: 11.31,\r\n q: 11.4,\r\n r: 8.17,\r\n s: 8.74,\r\n t: 7.74,\r\n u: 11.37,\r\n v: 10.67,\r\n w: 15.82,\r\n x: 10.8,\r\n y: 10.67,\r\n z: 9.39,\r\n A: 14.2,\r\n B: 13.03,\r\n C: 13.41,\r\n D: 14.95,\r\n E: 11.45,\r\n F: 11.23,\r\n G: 14.46,\r\n H: 15.12,\r\n I: 6.28,\r\n J: 8.74,\r\n K: 13.96,\r\n L: 10.34,\r\n M: 18.6,\r\n N: 15.12,\r\n O: 15.99,\r\n P: 12.5,\r\n Q: 15.99,\r\n R: 13.1,\r\n S: 10.73,\r\n T: 11.9,\r\n U: 14.56,\r\n V: 14.2,\r\n W: 20.93,\r\n X: 13.58,\r\n Y: 13.09,\r\n Z: 12.34,\r\n },\r\n 24: {\r\n 0: 13.92,\r\n 1: 13.92,\r\n 2: 13.92,\r\n 3: 13.92,\r\n 4: 13.92,\r\n 5: 13.92,\r\n 6: 13.92,\r\n 7: 13.92,\r\n 8: 13.92,\r\n 9: 13.92,\r\n ' ': 4.632,\r\n '+': 13.92,\r\n '-': 8.616,\r\n '%': 19.272,\r\n '.': 5.4,\r\n a: 12.564,\r\n b: 13.68,\r\n c: 11.448,\r\n d: 13.68,\r\n e: 12.828,\r\n f: 8.412,\r\n g: 12.42,\r\n h: 13.644,\r\n i: 6.504,\r\n j: 6.456,\r\n k: 13.236,\r\n l: 6.504,\r\n m: 20.208,\r\n n: 13.644,\r\n o: 13.644,\r\n p: 13.572,\r\n q: 13.68,\r\n r: 9.804,\r\n s: 10.488,\r\n t: 9.288,\r\n u: 13.644,\r\n v: 12.804,\r\n w: 18.984,\r\n x: 12.96,\r\n y: 12.804,\r\n z: 11.268,\r\n A: 17.04,\r\n B: 15.636,\r\n C: 16.092,\r\n D: 17.94,\r\n E: 13.74,\r\n F: 13.476,\r\n G: 17.352,\r\n H: 18.144,\r\n I: 7.536,\r\n J: 10.488,\r\n K: 16.752,\r\n L: 12.408,\r\n M: 22.32,\r\n N: 18.144,\r\n O: 19.188,\r\n P: 15,\r\n Q: 19.188,\r\n R: 15.72,\r\n S: 12.876,\r\n T: 14.28,\r\n U: 17.472,\r\n V: 17.04,\r\n W: 25.116,\r\n X: 16.296,\r\n Y: 15.708,\r\n Z: 14.808,\r\n },\r\n 30: {\r\n 0: 17.4,\r\n 1: 17.4,\r\n 2: 17.4,\r\n 3: 17.4,\r\n 4: 17.4,\r\n 5: 17.4,\r\n 6: 17.4,\r\n 7: 17.4,\r\n 8: 17.4,\r\n 9: 17.4,\r\n ' ': 5.79,\r\n '+': 17.4,\r\n '-': 10.77,\r\n '%': 24.09,\r\n '.': 6.75,\r\n a: 15.705,\r\n b: 17.1,\r\n c: 14.31,\r\n d: 17.1,\r\n e: 16.035,\r\n f: 10.515,\r\n g: 15.525,\r\n h: 17.055,\r\n i: 8.13,\r\n j: 8.07,\r\n k: 16.545,\r\n l: 8.13,\r\n m: 25.26,\r\n n: 17.055,\r\n o: 17.055,\r\n p: 16.965,\r\n q: 17.1,\r\n r: 12.255,\r\n s: 13.11,\r\n t: 11.61,\r\n u: 17.055,\r\n v: 16.005,\r\n w: 23.73,\r\n x: 16.2,\r\n y: 16.005,\r\n z: 14.085,\r\n A: 21.3,\r\n B: 19.545,\r\n C: 20.115,\r\n D: 22.425,\r\n E: 17.175,\r\n F: 16.845,\r\n G: 21.69,\r\n H: 22.68,\r\n I: 9.42,\r\n J: 13.11,\r\n K: 20.94,\r\n L: 15.51,\r\n M: 27.9,\r\n N: 22.68,\r\n O: 23.985,\r\n P: 18.75,\r\n Q: 23.985,\r\n R: 19.65,\r\n S: 16.095,\r\n T: 17.85,\r\n U: 21.84,\r\n V: 21.3,\r\n W: 31.395,\r\n X: 20.37,\r\n Y: 19.635,\r\n Z: 18.51,\r\n },\r\n 36: {\r\n 0: 20.88,\r\n 1: 20.88,\r\n 2: 20.88,\r\n 3: 20.88,\r\n 4: 20.88,\r\n 5: 20.88,\r\n 6: 20.88,\r\n 7: 20.88,\r\n 8: 20.88,\r\n 9: 20.88,\r\n ' ': 6.948,\r\n '+': 20.88,\r\n '-': 12.924,\r\n '%': 28.908,\r\n '.': 8.1,\r\n a: 18.846,\r\n b: 20.52,\r\n c: 17.172,\r\n d: 20.52,\r\n e: 19.242,\r\n f: 12.618,\r\n g: 18.63,\r\n h: 20.466,\r\n i: 9.756,\r\n j: 9.684,\r\n k: 19.854,\r\n l: 9.756,\r\n m: 30.312,\r\n n: 20.466,\r\n o: 20.466,\r\n p: 20.358,\r\n q: 20.52,\r\n r: 14.706,\r\n s: 15.732,\r\n t: 13.932,\r\n u: 20.466,\r\n v: 19.206,\r\n w: 28.476,\r\n x: 19.44,\r\n y: 19.206,\r\n z: 16.902,\r\n A: 25.56,\r\n B: 23.454,\r\n C: 24.138,\r\n D: 26.91,\r\n E: 20.61,\r\n F: 20.214,\r\n G: 26.028,\r\n H: 27.216,\r\n I: 11.304,\r\n J: 15.732,\r\n K: 25.128,\r\n L: 18.612,\r\n M: 33.48,\r\n N: 27.216,\r\n O: 28.782,\r\n P: 22.5,\r\n Q: 28.782,\r\n R: 23.58,\r\n S: 19.314,\r\n T: 21.42,\r\n U: 26.208,\r\n V: 25.56,\r\n W: 37.674,\r\n X: 24.444,\r\n Y: 23.562,\r\n Z: 22.212,\r\n },\r\n}\r\n\r\nexport const fontSizeLineHeights: Record = {\r\n 4: 5,\r\n 6: 7,\r\n 8: 10,\r\n 9: 11,\r\n 10: 12,\r\n 11: 13,\r\n 12: 14,\r\n 13: 15,\r\n 14: 20,\r\n 18: 21,\r\n 20: 24,\r\n 24: 28,\r\n 30: 35,\r\n 36: 42,\r\n}\r\n","import * as d3 from 'd3'\r\n\r\ninterface Dimensions {\r\n width: number\r\n height: number\r\n}\r\n\r\ntype Extent = [min: number, max: number]\r\n\r\nexport class Zoom {\r\n zoomElement = document.createElement('canvas')\r\n zoomSelection = d3.select(this.zoomElement)\r\n behavior: d3.ZoomBehavior\r\n\r\n translateExtent: [width: number, height: number]\r\n zoomExtent: [min: number, max: number]\r\n\r\n constructor(dimensions: Dimensions, zoomExtent: Extent) {\r\n this.translateExtent = [dimensions.width, dimensions.height]\r\n this.zoomExtent = zoomExtent\r\n\r\n this.behavior = d3\r\n .zoom()\r\n .extent([[0, 0], this.translateExtent])\r\n .scaleExtent(zoomExtent)\r\n .translateExtent([[0, 0], this.translateExtent])\r\n .on('zoom', null)\r\n\r\n this.zoomSelection.call(this.behavior)\r\n }\r\n\r\n updateDimensions = (dimensions: Dimensions) => {\r\n this.translateExtent = [dimensions.width, dimensions.height]\r\n this.behavior.extent([[0, 0], this.translateExtent]).translateExtent([[0, 0], this.translateExtent])\r\n }\r\n\r\n getTransform = () => d3.zoomTransform(this.zoomElement)\r\n\r\n scale = (newZoom?: number, mapCenter?: { x: number; y: number }) => {\r\n if (typeof newZoom === 'number' && Number.isFinite(newZoom)) {\r\n if (mapCenter) {\r\n this.zoomSelection.call(this.behavior.scaleTo, newZoom, [mapCenter.x, mapCenter.y])\r\n } else {\r\n this.zoomSelection.call(this.behavior.scaleTo, newZoom)\r\n }\r\n return newZoom\r\n }\r\n\r\n return this.getTransform().k\r\n }\r\n\r\n translate = (args?: [x: number, y: number]): [x: number, y: number] => {\r\n const scale = this.scale()\r\n\r\n if (Array.isArray(args) && Number.isFinite(args[0]) && Number.isFinite(args[1])) {\r\n this.zoomSelection.call(this.behavior.translateBy, -(args[0] / scale), -(args[1] / scale))\r\n return [args[0], args[1]]\r\n }\r\n let t = this.getTransform()\r\n return [t.x, t.y]\r\n }\r\n\r\n translateAbs = ([x, y]: [x: number, y: number]) => {\r\n const scale = this.scale()\r\n this.zoomSelection.call(this.behavior.translateTo, -(x / scale), -(y / scale), [0, 0])\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport { PortfolioSymbolType } from '../../main/modules/portfolio/types'\r\nimport { getSymbolType } from '../../main/modules/portfolio/utils'\r\nimport { getUuid } from '../../main/util'\r\nimport { getTextFontFamily } from '../shared/getTextFontFamily'\r\nimport { gradientSmall, gradients } from '../shared/gradients'\r\nimport { fontSizeLineHeights, fontSizesWidths } from './constants/font'\r\nimport { ISettingsSection, scaleMinMax, scaleStepFormat } from './constants/settings'\r\nimport { ISettings, ISettingsSectionFont, ISettingsSectionHeader } from './constants/settings'\r\nimport LayoutGenerator from './layout-generator'\r\nimport {\r\n MapData,\r\n MapDataIndustry,\r\n MapDataNode,\r\n MapDataRow,\r\n MapDataSector,\r\n MapSubtypeId,\r\n MapTypeId,\r\n PerfData,\r\n Scale,\r\n ScaleId,\r\n} from './types'\r\nimport * as mapUtils from './utils'\r\nimport { Zoom } from './zoom'\r\n\r\nconst fontFamily = getTextFontFamily()\r\n\r\nclass Treemap {\r\n width: number\r\n height: number\r\n version?: number\r\n scale: Scale\r\n countIndustryPerf: boolean\r\n countSectorPerf?: boolean\r\n nodes: MapDataNode[] = []\r\n sectors: MapDataSector[] = []\r\n industries: MapDataIndustry[] = []\r\n zoom: Zoom\r\n colorScale: (n?: number) => string\r\n settings: ISettings\r\n type: MapTypeId\r\n subtype: MapSubtypeId\r\n isSmall: boolean\r\n zoomLevels: number[]\r\n updateTimestamp?: number\r\n mapNodeId: string\r\n truncateNodeName: boolean\r\n\r\n constructor({\r\n countIndustryPerf = false,\r\n countSectorPerf = false,\r\n subtype = MapSubtypeId.DayPerf,\r\n isSmall = false,\r\n zoomLevels = mapUtils.getDefaultZoomLevels(),\r\n truncateNodeName = false,\r\n ...props\r\n }: {\r\n data: MapData\r\n width: number\r\n height: number\r\n version?: number\r\n scale: Scale\r\n countIndustryPerf?: boolean\r\n countSectorPerf?: boolean\r\n settings: ISettings\r\n type: MapTypeId\r\n subtype?: MapSubtypeId\r\n isSmall?: boolean\r\n zoomLevels?: number[]\r\n truncateNodeName?: boolean\r\n mapNodeId?: string\r\n }) {\r\n this.width = props.width\r\n this.height = props.height\r\n this.version = props.version\r\n this.settings = props.settings\r\n this.type = props.type\r\n this.scale = props.scale\r\n this.nodes = props.data.nodes\r\n this.sectors = props.data.sectors\r\n this.industries = props.data.industries\r\n this.subtype = subtype\r\n this.zoomLevels = zoomLevels\r\n this.isSmall = isSmall\r\n this.countIndustryPerf = countIndustryPerf\r\n this.countSectorPerf = countSectorPerf\r\n this.truncateNodeName = truncateNodeName\r\n this.mapNodeId = props.mapNodeId ?? getUuid()\r\n\r\n this.zoom = new Zoom({ width: this.width, height: this.height }, [\r\n this.zoomLevels[0],\r\n this.zoomLevels[this.zoomLevels.length - 1],\r\n ])\r\n\r\n this.colorScale = this.getColorScale()\r\n\r\n if (this.countIndustryPerf) {\r\n this._updateIndustryPerf()\r\n }\r\n if (this.countSectorPerf) {\r\n this._updateSectorPerf()\r\n }\r\n }\r\n\r\n getIsSmall() {\r\n return this.isSmall\r\n }\r\n\r\n updateData(props: { width: number; height: number; data: MapData; scale: Scale }) {\r\n this.width = props.width\r\n this.height = props.height\r\n this.nodes = props.data.nodes\r\n this.sectors = props.data.sectors\r\n this.industries = props.data.industries\r\n this.scale = props.scale\r\n this.updateTimestamp = +new Date()\r\n\r\n if (this.countIndustryPerf) {\r\n this._updateIndustryPerf()\r\n }\r\n if (this.countSectorPerf) {\r\n this._updateSectorPerf()\r\n }\r\n\r\n this.colorScale = this.getColorScale()\r\n }\r\n\r\n getScaleMinMax() {\r\n switch (this.scale.id) {\r\n case ScaleId.PortfolioPct:\r\n case ScaleId.PortfolioUsd:\r\n if (this.nodes.length === 0) return [0, 0]\r\n // get min/max week perf\r\n const minValuePerf = Math.abs(d3.min(this.nodes, (node: MapDataNode) => node.data?.perfWeek ?? 0))\r\n const maxValuePerf = Math.abs(d3.max(this.nodes, (node: MapDataNode) => node.data?.perfWeek ?? 0))\r\n const perfMax = Math.max(minValuePerf, maxValuePerf)\r\n // get min/max all time perf\r\n const minValueNode = Math.abs(d3.min(this.nodes, (node: MapDataNode) => node.perf)!)\r\n const maxValueNode = Math.abs(d3.max(this.nodes, (node: MapDataNode) => node.perf)!)\r\n const valueMax = Math.max(minValueNode, maxValueNode)\r\n // Use the weekly perf as a buffer, compute number of digits and round nicely\r\n const valueToUse = this.scale.id === ScaleId.PortfolioPct ? valueMax + perfMax : valueMax * (1 + perfMax / 100)\r\n // Sanity check\r\n if (Number.isNaN(valueToUse)) return [0, 0]\r\n const numberOfDigits = Math.max(Math.floor(Math.log10(Math.abs(valueToUse))), 0) + 1\r\n const roundedBound = Math.ceil(valueToUse / numberOfDigits) * numberOfDigits\r\n\r\n return [-roundedBound, roundedBound]\r\n default:\r\n return scaleMinMax[this.scale.id]\r\n }\r\n }\r\n\r\n getColorScale() {\r\n const [minDomain, maxDomain] = this.getScaleMinMax()\r\n let gradient = gradients[this.scale.id]\r\n if (this.getIsSmall() && this.scale.id === ScaleId.DayPerf) {\r\n gradient = gradientSmall\r\n }\r\n const linearScale = d3\r\n .scaleLinear()\r\n .domain([minDomain, maxDomain])\r\n .range([0, gradient.colors.length - 1])\r\n return (d?: number) => {\r\n if (typeof d === 'undefined' || !Number.isFinite(d)) {\r\n return gradient.nullColor\r\n }\r\n const min = Math.min(minDomain, maxDomain)\r\n const max = Math.max(minDomain, maxDomain)\r\n const value = Math.max(Math.min(d, max), min)\r\n\r\n const i = Math.round(linearScale(value))\r\n\r\n return gradient.colors[i]\r\n }\r\n }\r\n\r\n getParentSector(node: MapDataNode | MapDataIndustry): string {\r\n if (node.parent && !!node.parent.parent) return this.getParentSector(node.parent as MapDataIndustry)\r\n\r\n return node.name\r\n }\r\n\r\n /*\r\n * data = {\r\n * nodes: {\"AAPL\": 1.5, \"MSFT\": -0.5}\r\n * industries: {...}\r\n * }\r\n */\r\n updatePerf(data: PerfData) {\r\n for (var i = 0; i < this.nodes.length; i++) {\r\n const nodeName = this.nodes[i].name\r\n\r\n if (Array.isArray(data.nodes)) {\r\n const parentSector = this.getParentSector(this.nodes[i])\r\n const updatedNode = data.nodes.find((node) => node.name === nodeName && node.data?.sector === parentSector)\r\n\r\n if (!updatedNode) continue\r\n\r\n this.nodes[i].perf = updatedNode.perf\r\n this.nodes[i].additional = updatedNode.additional\r\n } else {\r\n this.nodes[i].perf = data.nodes[nodeName]\r\n this.nodes[i].additional = data.additional[nodeName]\r\n }\r\n }\r\n\r\n if (this.countIndustryPerf) {\r\n this._updateIndustryPerf()\r\n } else {\r\n this._resetIndustryPerf()\r\n }\r\n\r\n if (this.countSectorPerf) {\r\n this._updateSectorPerf()\r\n }\r\n\r\n this.colorScale = this.getColorScale()\r\n }\r\n\r\n _resetIndustryPerf() {\r\n for (var i = 0; i < this.industries.length; i++) {\r\n this.industries[i].perf = undefined\r\n }\r\n }\r\n\r\n _updateIndustryPerf() {\r\n var industry, weightedPriceSum, marketCapSum, stock, marketCap, everyStockUndefined\r\n for (var i = 0; i < this.industries.length; i++) {\r\n industry = this.industries[i]\r\n weightedPriceSum = 0\r\n marketCapSum = 0\r\n everyStockUndefined = true\r\n for (var j = 0; j < industry.children.length; j++) {\r\n stock = industry.children[j]\r\n marketCap = stock.dx * stock.dy\r\n if (typeof stock.perf !== 'undefined' && stock.perf !== null) {\r\n weightedPriceSum += stock.perf * marketCap\r\n everyStockUndefined = false\r\n }\r\n marketCapSum += marketCap\r\n }\r\n if (!everyStockUndefined) {\r\n industry.perf = marketCapSum !== 0 ? weightedPriceSum / marketCapSum : 0\r\n }\r\n }\r\n }\r\n\r\n _updateSectorPerf() {\r\n var sector, industry, weightedPriceSum, marketCapSum, stock, marketCap\r\n for (var s = 0; s < this.sectors.length; s++) {\r\n sector = this.sectors[s]\r\n weightedPriceSum = 0\r\n marketCapSum = 0\r\n for (var i = 0; i < sector.children.length; i++) {\r\n industry = sector.children[i]\r\n for (var j = 0; j < industry.children.length; j++) {\r\n stock = industry.children[j]\r\n marketCap = stock.dx * stock.dy\r\n if (typeof stock.perf !== 'undefined' && stock.perf !== null) {\r\n weightedPriceSum += stock.perf * marketCap\r\n }\r\n marketCapSum += marketCap\r\n }\r\n }\r\n sector.perf = marketCapSum !== 0 ? weightedPriceSum / marketCapSum : 0\r\n }\r\n }\r\n\r\n _getNodeTopOffset(node: MapDataNode) {\r\n if (!this.isSmall && this.type === MapTypeId.World) return 0\r\n\r\n const isSmallSecMap = this.isSmall && this.type === MapTypeId.Sector\r\n // Industry\r\n let parent: MapDataRow = node.parent\r\n let leftPadding = this.settings.industry.padding.left\r\n let topPadding = this.settings.industry.padding.top + this.settings.industry.header.height\r\n\r\n if (isSmallSecMap) {\r\n // Sector\r\n parent = node.parent.parent\r\n leftPadding = this.settings.sector.padding.left\r\n topPadding = this.settings.sector.padding.top + this.settings.sector.header.height\r\n }\r\n\r\n const isFirstNodeInIndustry =\r\n Math.floor(parent.x + leftPadding) === node.x && Math.floor(parent.y + topPadding) === node.y\r\n const showIndustryHeader = LayoutGenerator.isNodeHeaderVisible(parent, this.settings)\r\n\r\n return isFirstNodeInIndustry && showIndustryHeader ? 6 : 0\r\n }\r\n\r\n getNodeText(node: MapDataNode) {\r\n let name = node.name\r\n const scale = this.zoom.scale()\r\n const fontSizes = this.settings.scaleFontSizes[scale]\r\n const nodeTopOffset = this._getNodeTopOffset(node)\r\n const nodeHeight = node.dy - nodeTopOffset\r\n\r\n let nodeNameFontSize = this.findMaxFontSizeForText(node.name, node.dx, nodeHeight, fontSizes)\r\n if (!nodeNameFontSize && this.truncateNodeName) {\r\n nodeNameFontSize = fontSizes[fontSizes.length - 1]\r\n name = this.getLongestText(\r\n name,\r\n nodeNameFontSize,\r\n Math.max(0, node.dx - this.settings.fontSizePadding[nodeNameFontSize] * 2)\r\n )\r\n } else if (!nodeNameFontSize) return null\r\n\r\n const nodeNameLineHeight = fontSizeLineHeights[nodeNameFontSize]\r\n const stepFormat = scaleStepFormat[this.scale.id]\r\n const format = stepFormat === '%N%' ? (node.dx > 32 ? stepFormat : '%N') : stepFormat\r\n\r\n let perfText = getSymbolType(node.name) === PortfolioSymbolType.Cash ? '' : node.additional ?? ''\r\n if (perfText.length === 0 && node.perf !== undefined && Number.isFinite(node.perf)) {\r\n perfText = this.formatValue(node.perf.toFixed(2), scaleMinMax[this.scale.id], format)\r\n }\r\n\r\n const fontPairs =\r\n this.settings.fontSizePairs[nodeNameFontSize]?.filter((allowedSize) => fontSizes.includes(allowedSize)) ?? []\r\n\r\n let perfFontSize\r\n let perfLineHeight = 0\r\n if (fontPairs.length) {\r\n perfFontSize =\r\n fontPairs && this.findMaxFontSizeForText(perfText, node.dx, nodeHeight - nodeNameLineHeight, fontPairs)\r\n perfLineHeight = perfFontSize ? fontSizeLineHeights[perfFontSize] : 0\r\n }\r\n\r\n const textHeight = nodeNameLineHeight + perfLineHeight\r\n\r\n return {\r\n topOffset: node.dy - textHeight <= nodeTopOffset ? nodeTopOffset : 0,\r\n fontSize: nodeNameFontSize,\r\n perfText,\r\n perfFontSize,\r\n name,\r\n }\r\n }\r\n\r\n findMaxFontSizeForText(text: string, width: number, height: number, fontSizes: number[]) {\r\n if (!text.length) return\r\n\r\n return fontSizes.find(\r\n (fontSize) =>\r\n this.getLongestText(text, fontSize, Math.max(0, width - this.settings.fontSizePadding[fontSize] * 2)) ===\r\n text && fontSizeLineHeights[fontSize] < height\r\n )\r\n }\r\n\r\n getLongestText(text: string, fontSize: number, maxWidth: number) {\r\n if (maxWidth === 0) return ''\r\n const widths = fontSizesWidths[fontSize]\r\n let i = 0\r\n let width = 0\r\n\r\n while (i < text.length) {\r\n width += widths[text[i]] ?? widths['W']\r\n if (width > maxWidth) break\r\n i++\r\n }\r\n\r\n return text.substring(0, i)\r\n }\r\n\r\n getZoomLevels() {\r\n return this.zoomLevels\r\n }\r\n\r\n getNextZoomLevel() {\r\n var actualZoomLevel = this.zoom.scale()\r\n if (this.zoomLevels[this.zoomLevels.length - 1] === actualZoomLevel) {\r\n return actualZoomLevel\r\n }\r\n for (var i = 0; i < this.zoomLevels.length; i++) {\r\n if (this.zoomLevels[i] > actualZoomLevel) {\r\n return this.zoomLevels[i]\r\n }\r\n }\r\n\r\n return this.zoomLevels[0]\r\n }\r\n\r\n getPreviousZoomLevel() {\r\n var actualZoomLevel = this.zoom.scale()\r\n if (this.zoomLevels[0] === actualZoomLevel) {\r\n return actualZoomLevel\r\n }\r\n for (var i = this.zoomLevels.length; i >= 0; i--) {\r\n if (this.zoomLevels[i] < actualZoomLevel) {\r\n return this.zoomLevels[i]\r\n }\r\n }\r\n\r\n return this.zoomLevels[0]\r\n }\r\n\r\n getLastZoomLevel() {\r\n return this.zoomLevels[this.zoomLevels.length - 1]\r\n }\r\n\r\n formatValue(\r\n value: string,\r\n [min, max]: [min: number, max: number] = scaleMinMax[this.scale.id],\r\n format: string = scaleStepFormat[this.scale.id]\r\n ) {\r\n let stepFormat = format\r\n if (typeof format !== 'string') {\r\n stepFormat = format[value]\r\n }\r\n\r\n if (!stepFormat) return value\r\n\r\n const floatValue = parseFloat(value)\r\n const absValue = value.replace(/^-/, '')\r\n const isPositiveScaleOnly = Math.min(min, max) >= 0 && Math.max(min, max) >= 0\r\n let formated = stepFormat?.replace('%N', absValue) ?? absValue\r\n\r\n // Some formats might not include number (eg. Before/After earnings)\r\n if (!stepFormat || !stepFormat.includes('%N')) return formated\r\n\r\n if (floatValue > 0 && !isPositiveScaleOnly) return `+${formated}`\r\n\r\n if (floatValue < 0) return `-${formated}`\r\n\r\n return formated\r\n }\r\n\r\n renderStockNode(node: MapDataNode, context: CanvasRenderingContext2D) {\r\n // Draw background\r\n context.fillStyle = this.colorScale(node.perf)\r\n context.fillRect(node.x, node.y, node.dx - 1, node.dy - 1)\r\n\r\n const nodeText = this.getNodeText(node)\r\n\r\n if (!nodeText) return\r\n\r\n context.save()\r\n\r\n // Set text properties\r\n context.textBaseline = 'middle'\r\n context.textAlign = 'center'\r\n context.fillStyle = 'rgba(0, 0, 0, 0.5)'\r\n\r\n const nodeY = node.y + nodeText.topOffset\r\n const nodeDY = node.dy - nodeText.topOffset\r\n const textX = node.x + node.dx / 2\r\n let nameY = nodeY + nodeDY / 2\r\n let perfTextY = nameY + nodeText.fontSize / 2\r\n const zoom = this.zoom.scale()\r\n const offset = zoom > 1 ? (1 / zoom) * 1.2 : 1\r\n if (nodeText.perfFontSize) {\r\n perfTextY = nameY + nodeText.fontSize / 2\r\n nameY -= nodeText.perfFontSize / 2\r\n context.font = 'bold ' + nodeText.perfFontSize + 'px ' + fontFamily\r\n context.fillText(nodeText.perfText, textX + offset, perfTextY + offset)\r\n }\r\n\r\n context.font = 'bold ' + nodeText.fontSize + 'px ' + fontFamily\r\n context.fillText(nodeText.name, textX + offset, nameY + offset)\r\n\r\n context.fillStyle = 'rgba(255, 255, 255, 1)'\r\n\r\n if (nodeText.perfFontSize) {\r\n context.font = 'bold ' + nodeText.perfFontSize + 'px ' + fontFamily\r\n context.fillText(nodeText.perfText, textX, perfTextY)\r\n }\r\n\r\n context.font = 'bold ' + nodeText.fontSize + 'px ' + fontFamily\r\n context.fillText(nodeText.name, textX, nameY)\r\n context.restore()\r\n }\r\n\r\n getSpacingWithDefaults(spacing?: { top: number; right: number; bottom?: number; left: number }) {\r\n return {\r\n top: spacing?.top ?? 0,\r\n right: spacing?.right ?? 0,\r\n bottom: spacing?.bottom ?? 0,\r\n left: spacing?.left ?? 0,\r\n }\r\n }\r\n\r\n renderIndustryHeader({\r\n node,\r\n context,\r\n config,\r\n fill,\r\n parent,\r\n }: {\r\n node: MapDataRow\r\n context: CanvasRenderingContext2D\r\n config?: ISettingsSectionHeader\r\n parent?: ISettingsSection\r\n fill: string\r\n }) {\r\n const parrentPadding = this.getSpacingWithDefaults(parent?.padding)\r\n const margin = this.getSpacingWithDefaults(config?.margin)\r\n const x = node.x + parrentPadding.left + margin.left\r\n const y = node.y + parrentPadding.top + margin.top\r\n const width = node.dx - parrentPadding.left - margin.left - parrentPadding.right - margin.right\r\n const height = y + (config?.height ?? 0)\r\n\r\n context.fillStyle = fill\r\n context.strokeStyle = config?.border ?? this.settings.background\r\n context.beginPath()\r\n context.moveTo(x, y)\r\n context.lineTo(x, height)\r\n\r\n context.lineTo(node.x + 6, height)\r\n context.lineTo(node.x + 11, height + 5)\r\n context.lineTo(node.x + 16, height)\r\n\r\n context.lineTo(x + width, height)\r\n context.lineTo(x + width, y)\r\n context.lineTo(x - 0.5, y)\r\n context.fill()\r\n context.stroke()\r\n }\r\n\r\n renderNodeText({\r\n node,\r\n context,\r\n config,\r\n parent,\r\n }: {\r\n node: MapDataRow\r\n context: CanvasRenderingContext2D\r\n config?: ISettingsSectionFont\r\n parent?: ISettingsSection\r\n }) {\r\n if (!config) return\r\n\r\n const parrentPadding = this.getSpacingWithDefaults(parent?.padding)\r\n const padding = this.getSpacingWithDefaults(config?.padding)\r\n\r\n context.textBaseline = 'alphabetic'\r\n context.textAlign = 'left'\r\n context.fillStyle = config.color\r\n context.font = `${config.fontWeight} ${config.fontSize}px ${fontFamily}`\r\n\r\n const text = this.getLongestText(\r\n node.name.toUpperCase(),\r\n config.fontSize,\r\n node.dx - parrentPadding.left - padding.left - parrentPadding.right - padding.right\r\n )\r\n context.fillText(\r\n text,\r\n node.x + parrentPadding.left + padding.left,\r\n node.y + parrentPadding.top + padding.top + config.fontSize\r\n )\r\n }\r\n\r\n getNodeAtPosition(x: number, y: number): MapDataNode | undefined {\r\n var scale = this.zoom.scale()\r\n var [tx, ty] = this.zoom.translate()\r\n for (var i = 0, len = this.nodes.length; i < len; i++) {\r\n var d = this.nodes[i]\r\n if (\r\n d.x * scale + tx < x &&\r\n x < (d.x + d.dx + 1) * scale + tx &&\r\n d.y * scale + ty < y &&\r\n y < (d.y + d.dy + 1) * scale + ty &&\r\n d.parent\r\n ) {\r\n return d\r\n }\r\n }\r\n }\r\n\r\n getSectorAtPosition(x: number, y: number): MapDataSector | undefined {\r\n var scale = this.zoom.scale()\r\n var [tx, ty] = this.zoom.translate()\r\n for (var i = 0, len = this.sectors.length; i < len; i++) {\r\n var d = this.sectors[i]\r\n if (\r\n d.x * scale + tx < x &&\r\n x < (d.x + d.dx + 1) * scale + tx &&\r\n d.y * scale + ty < y &&\r\n y < (d.y + d.dy + 1) * scale + ty &&\r\n d.parent\r\n ) {\r\n return d\r\n }\r\n }\r\n }\r\n\r\n getIndustryAtPosition(x: number, y: number): MapDataIndustry | undefined {\r\n var scale = this.zoom.scale()\r\n var [tx, ty] = this.zoom.translate()\r\n for (var i = 0, len = this.industries.length; i < len; i++) {\r\n var d = this.industries[i]\r\n if (\r\n d.x * scale + tx < x &&\r\n x < (d.x + d.dx + 1) * scale + tx &&\r\n d.y * scale + ty < y &&\r\n y < (d.y + d.dy + 1) * scale + ty &&\r\n d.parent\r\n ) {\r\n return d\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default Treemap\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 { DefaultOptions, MutationCache, QueryCache, QueryClient, QueryClientProvider } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\n\r\nimport { DefaultErrorBoundary } from '../../../main/components/error-view'\r\n\r\ninterface QueryClientConfig {\r\n queryCache?: QueryCache\r\n mutationCache?: MutationCache\r\n defaultOptions?: DefaultOptions\r\n}\r\n\r\ninterface QueryContextProps {\r\n queryOptions?: QueryClientConfig\r\n}\r\n\r\nexport function QueryClientContext({ children, queryOptions }: React.PropsWithChildren) {\r\n const client = React.useRef(\r\n new QueryClient({\r\n defaultOptions: {\r\n queries: {\r\n useErrorBoundary: true,\r\n refetchOnWindowFocus: false,\r\n ...queryOptions?.defaultOptions?.queries,\r\n },\r\n ...queryOptions?.defaultOptions,\r\n },\r\n ...queryOptions,\r\n })\r\n )\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport function withQueryClientContext(\r\n Component: React.ComponentType,\r\n config?: QueryClientConfig\r\n): React.ComponentType {\r\n const hocComponent = (props: Props & JSX.IntrinsicAttributes) => (\r\n \r\n \r\n \r\n )\r\n\r\n hocComponent.displayName = `withQueryClientContext(${Component.displayName ?? 'Component'})`\r\n\r\n return hocComponent\r\n}\r\n","/* eslint-disable import/first */\r\nimport { UseMutationResult } from '@tanstack/react-query'\r\nimport * as React from 'react'\r\nimport { FacebookIcon, FacebookShareButton, TwitterIcon, TwitterShareButton } from 'react-share'\r\n\r\nimport { Button } from '../../../main/components/button'\r\nimport { CopyToClipboard } from '../../../main/components/copy-to-clipboard'\r\nimport {\r\n Dialog,\r\n DialogBody,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogTrigger,\r\n useDialogState,\r\n} from '../../../main/components/dialog'\r\nimport { ErrorView } from '../../../main/components/error-view'\r\nimport { Loading } from '../../../main/components/loading'\r\nimport { Heading } from '../../../main/components/typography'\r\n\r\ninterface ShareResponse {\r\n imgUrl: string\r\n shareUrl: string\r\n}\r\n\r\ninterface ShareProps {\r\n state: UseMutationResult\r\n onShareClick: () => void\r\n className?: string\r\n}\r\n\r\nexport function Share(props: ShareProps) {\r\n const dialogState = useDialogState()\r\n\r\n return (\r\n <>\r\n \r\n Share map\r\n \r\n\r\n \r\n \r\n Share map\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 ShareDialogBodyProps {\r\n isError: boolean\r\n isLoading: boolean\r\n data?: ResponseType\r\n}\r\n\r\nfunction ShareDialogBody(props: ShareDialogBodyProps) {\r\n if (props.isLoading) {\r\n return (\r\n
    \r\n \r\n
    \r\n )\r\n }\r\n\r\n if (props.isError || !props.data) {\r\n return (\r\n
    \r\n \r\n There’s been an error sharing the map.\r\n
    \r\n Please close the dialog and try again.\r\n \r\n }\r\n />\r\n
    \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n {document.title}\r\n
    \r\n \r\n Copy and paste link in email, website, or forum\r\n \r\n }\r\n text={props.data.shareUrl}\r\n bottomLeftContent={\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n />\r\n
    \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as d3 from 'd3'\r\nimport PropTypes from 'prop-types'\r\nimport { Component } from 'react'\r\n\r\ninterface SparklineProps {\r\n className?: string\r\n data: number[]\r\n width: number\r\n height: number\r\n}\r\n\r\nclass Sparkline extends Component {\r\n static propTypes = {\r\n width: PropTypes.number.isRequired,\r\n height: PropTypes.number.isRequired,\r\n data: PropTypes.arrayOf(PropTypes.number).isRequired,\r\n }\r\n\r\n shouldComponentUpdate(nextProps: SparklineProps) {\r\n // eslint-disable-next-line eqeqeq\r\n return nextProps.data != this.props.data\r\n }\r\n\r\n render() {\r\n var data = this.props.data\r\n var x = d3.scaleLinear().range([0, this.props.width]).domain([0, data.length])\r\n\r\n var y = d3\r\n .scaleLinear()\r\n .range([this.props.height - 4, 0])\r\n .domain(d3.extent(data, (d) => d) as [number, number])\r\n\r\n var line = d3\r\n .line()\r\n .curve(d3.curveBasis)\r\n .x((d, i) => x(i))\r\n .y((d) => y(d))\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n\r\nexport default Sparkline\r\n","import logoBase64 from './assets/logo.png'\r\nimport { getTextFontFamily } from './getTextFontFamily'\r\nimport { loadImage } from './loadImage'\r\nimport { getScaleRatio } from './retinafy'\r\n\r\nexport async function drawShareMap(canvasEl: HTMLCanvasElement, text: string[]) {\r\n const fontFamily = getTextFontFamily()\r\n\r\n const ratio = getScaleRatio()\r\n const width = canvasEl.width / ratio\r\n const height = canvasEl.height / ratio\r\n\r\n const canvas = document.createElement('canvas')\r\n const context = canvas.getContext('2d')!\r\n canvas.width = width\r\n canvas.height = height + 22\r\n\r\n // Background\r\n context.fillStyle = '#fff'\r\n context.fillRect(0, 0, width, height)\r\n\r\n // Logo\r\n const logo = await loadImage(logoBase64)\r\n context.drawImage(logo, 2, 4)\r\n\r\n // Labels\r\n const label = text.map((t) => t.toUpperCase())\r\n let x = width\r\n const y = 11\r\n\r\n context.textBaseline = 'middle'\r\n context.textAlign = 'right'\r\n context.font = '9pt ' + fontFamily\r\n for (let i = label.length - 1; i >= 0; i--) {\r\n const text = label[i]\r\n let textWidth = context.measureText(text).width\r\n\r\n context.fillStyle = '#4c5261'\r\n context.fillText(text, x, y)\r\n\r\n if (i > 0) {\r\n const divider = ' • '\r\n context.fillStyle = '#5faaf4'\r\n context.fillText(divider, x - textWidth, y)\r\n textWidth = textWidth + context.measureText(divider).width\r\n }\r\n\r\n x = x - textWidth\r\n }\r\n\r\n context.drawImage(canvasEl, 0, 0, width * ratio, height * ratio, 0, 22, width, height)\r\n\r\n return canvas.toDataURL()\r\n}\r\n","export function getTextFontFamily() {\r\n return 'Lato'\r\n}\r\n","/**\r\n * Load image before we can render it in canvas\r\n */\r\nexport function loadImage(src: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n var image = new Image()\r\n\r\n image.onload = function () {\r\n resolve(image)\r\n }\r\n\r\n image.onerror = function () {\r\n reject()\r\n }\r\n\r\n image.src = src\r\n })\r\n}\r\n","export function parseJSONFromScript(id: string, doc: Document = document): T | null {\r\n const el = doc.getElementById(id)\r\n const isValidElement = el && el.tagName === 'SCRIPT' && el.getAttribute('type') === 'application/json'\r\n\r\n if (!isValidElement) {\r\n window.Sentry?.captureMessage('parseJSONFromScript', {\r\n extra: {\r\n el: el ? 'yes' : 'no',\r\n tagName: el?.tagName,\r\n type: el?.getAttribute('type'),\r\n },\r\n })\r\n }\r\n\r\n if (!isValidElement) return null\r\n\r\n try {\r\n return JSON.parse(el.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return null\r\n }\r\n}\r\n","export function getScaleRatio() {\r\n return window.devicePixelRatio ?? 1\r\n}\r\n\r\nexport function retinafy(\r\n canvas: HTMLCanvasElement | undefined | null,\r\n context: CanvasRenderingContext2D | undefined,\r\n width: number,\r\n height: number\r\n) {\r\n if (!canvas || !context) return\r\n\r\n const ratio = getScaleRatio()\r\n\r\n canvas.width = width * ratio\r\n canvas.height = height * ratio\r\n canvas.style.width = width + 'px'\r\n canvas.style.height = height + 'px'\r\n context.scale(ratio, ratio)\r\n\r\n return ratio\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\ninterface RedGreenTextProps {\r\n value?: number | null\r\n children: any\r\n rightContent?: React.ReactNode\r\n className?: string\r\n rightClass?: string\r\n}\r\n\r\n/**\r\n * Component which renders red/green text based on whether the value is positive or negative if value\r\n * is 0, it will not be colored and it will not display the guide triangle\r\n */\r\nexport function RedGreenText({ value, children, className, rightContent, rightClass }: RedGreenTextProps) {\r\n const hasValue = value && Number.isFinite(value)\r\n\r\n return (\r\n 0,\r\n 'text-red-500 dark:text-red-400': hasValue && value < 0,\r\n })}\r\n >\r\n {children}\r\n \r\n {rightContent === undefined && hasValue && value !== 0 ? (\r\n 0 ? 'arrowUpShort' : 'arrowDownShort'} className=\"block\" />\r\n ) : null}\r\n {rightContent}\r\n \r\n \r\n )\r\n}\r\n\r\n/**\r\n * Used to position multiple lines of RedGreen text, this component will make sure all numbers are\r\n * in line with their `rightContent`\r\n */\r\nexport function RedGreenMultiline({ className, children, ...props }: React.PropsWithChildren) {\r\n return (\r\n
    \r\n {React.Children.map(children, (child: React.ReactElement) => {\r\n if (React.isValidElement(child) && child.type === RedGreenText) {\r\n return React.cloneElement(child, {\r\n className: classnames(child.props.className, 'table-row'),\r\n rightClass: 'table-cell align-middle',\r\n })\r\n }\r\n\r\n return child\r\n })}\r\n
    \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport const Table = React.forwardRef(\r\n (props: React.PropsWithChildren>, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableHead(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n\r\ninterface TableBodyProps extends React.HTMLProps {\r\n spacing?: 'regular' | 'large' | 'none'\r\n}\r\n\r\nexport const TableBody = React.forwardRef(\r\n (\r\n { spacing = 'none', ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n ) => (\r\n \r\n )\r\n)\r\n\r\nexport function TableFooter(props: React.PropsWithChildren>) {\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n}\r\n","export enum TableAlign {\r\n Left,\r\n Center,\r\n Right,\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { TableAlign } from './types'\r\n\r\nexport interface TableCellProps extends React.HTMLProps {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n}\r\n\r\nexport function TableCell({\r\n isFirst,\r\n isLast,\r\n align = TableAlign.Left,\r\n hasPadding = true,\r\n className,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon } from '../icon'\r\nimport { PropsWithAs } from '../types'\r\nimport { TableAlign } from './types'\r\n\r\nconst TABLE_HEADER_DEFAULT_ELEMENT = 'th'\r\n\r\ninterface SortProps {\r\n isActive: boolean\r\n direction: 1 | -1\r\n}\r\n\r\nfunction TableSortIndicator({ isActive, direction, className }: Partial & { className?: string }) {\r\n return (\r\n \r\n )\r\n}\r\n\r\ninterface TableHeaderProps extends Omit, 'as'> {\r\n isActive?: boolean\r\n align?: TableAlign\r\n hasPadding?: boolean\r\n hasHover?: boolean\r\n}\r\n\r\nexport function TableHeader({\r\n as: asComponent,\r\n align,\r\n children,\r\n isActive,\r\n hasPadding = true,\r\n hasHover,\r\n ...props\r\n}: Omit, 'align'> & TableHeaderProps) {\r\n const componentToRender = asComponent ?? TABLE_HEADER_DEFAULT_ELEMENT\r\n\r\n return React.createElement(\r\n componentToRender,\r\n {\r\n ...props,\r\n className: classnames(\r\n props.className,\r\n 'whitespace-nowrap font-normal h-5.5 hover:first:rounded-l-md hover:last:rounded-r-md',\r\n {\r\n 'cursor-pointer hover:select-none hover:bg-gray-200/30 dark:hover:bg-gray-500/30':\r\n hasHover && !props.disabled,\r\n 'text-gray-500 dark:text-gray-300': props.disabled,\r\n 'text-gray-600 dark:text-gray-200': !isActive && !props.disabled,\r\n 'font-medium text-gray-800 dark:text-gray-50': isActive,\r\n 'text-left': align === TableAlign.Left,\r\n 'text-center': align === TableAlign.Center,\r\n 'text-right': align === TableAlign.Right,\r\n 'px-1': hasPadding,\r\n 'p-0': !hasPadding,\r\n }\r\n ),\r\n },\r\n children\r\n )\r\n}\r\n\r\nexport function TableHeaderSortable({\r\n direction,\r\n ...props\r\n}: Omit, 'align'> & Partial & TableHeaderProps) {\r\n const isDisabled = props.disabled === true\r\n\r\n return (\r\n \r\n \r\n {props.align === TableAlign.Right && (\r\n \r\n )}\r\n {props.children}\r\n {props.align !== TableAlign.Right && (\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\ninterface TableRowProps extends React.PropsWithChildren> {\r\n isFirst?: boolean\r\n isLast?: boolean\r\n isHoverable?: boolean\r\n}\r\n\r\nexport const TableRow = React.forwardRef(\r\n ({ isFirst, isLast, isHoverable = true, ...props }: TableRowProps, ref: React.ForwardedRef) => (\r\n \r\n )\r\n)\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape, isSortByShape, useSortData } from '../../hooks/use-sort-data'\r\nimport { SortableValue } from '../../types'\r\nimport { SortByColumnOptions } from '../../util'\r\n\r\nexport enum SortDirection {\r\n Ascending = 1,\r\n Descending = -1,\r\n}\r\n\r\nexport interface TableSort {\r\n column: ColumnType\r\n direction: SortDirection\r\n}\r\n\r\n/**\r\n * Default sort getter which either gets column matching by `defaultSortId` or returns the first column\r\n */\r\nexport function getDefaultSort(\r\n columns: ColumnType[],\r\n defaultSort?: DefaultSort\r\n): TableSort {\r\n if (defaultSort === null) return { column: null as ColumnType, direction: SortDirection.Ascending }\r\n if (defaultSort && typeof defaultSort === 'object') return defaultSort as unknown as TableSort\r\n\r\n const foundColumn = columns.find((column) => isSortByShape(column) && column.id === defaultSort)\r\n\r\n return {\r\n column: foundColumn ?? (defaultSort as unknown as ColumnType | undefined) ?? columns[0],\r\n direction: SortDirection.Ascending,\r\n }\r\n}\r\n\r\n/**\r\n * Get default sorting from url when persisting sort\r\n */\r\nexport function getDefaultSortFromUrl, OrderType extends string | null>(\r\n columns: ColumnType[],\r\n order?: OrderType,\r\n idKey: keyof ColumnType = 'id'\r\n): TableSort {\r\n if (order === null) return { column: null as unknown as ColumnType, direction: SortDirection.Ascending }\r\n\r\n const isDesc = order?.startsWith('-')\r\n const queryParam = isDesc ? order?.substring(1) : order\r\n const column = columns.find((column) => column[idKey] === queryParam)\r\n\r\n if (column) {\r\n return { column, direction: isDesc ? SortDirection.Descending : SortDirection.Ascending }\r\n } else {\r\n return { column: columns[0], direction: SortDirection.Ascending }\r\n }\r\n}\r\n\r\nexport function saveSortToUrl>(\r\n prev: URLSearchParams,\r\n urlPersistKey: string,\r\n newSort: ColumnType | null,\r\n idKey: keyof ColumnType = 'id',\r\n defaultSort: unknown = null\r\n) {\r\n const newParams = new URLSearchParams(prev)\r\n const previousOrder = newParams.get(urlPersistKey) ?? defaultSort\r\n const isDescOrder = previousOrder?.toString().startsWith('-')\r\n\r\n if (newSort === null) {\r\n newParams.delete(urlPersistKey)\r\n } else {\r\n newParams.set(urlPersistKey, `${!isDescOrder && previousOrder === newSort[idKey] ? '-' : ''}${newSort[idKey]}`)\r\n }\r\n\r\n return newParams\r\n}\r\n\r\ninterface UseTableSortProps<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n> {\r\n data: DataType[]\r\n columns: ColumnType[]\r\n\r\n /**\r\n * You can either provide id of the column or whole shape\r\n * defaultSort: { column: columns[0], direction: -1 }\r\n * If your ids are constants (or enums), you will get name suggestions\r\n */\r\n defaultSort?: DefaultSort\r\n\r\n /**\r\n * Custom value getter. By default these can be defined on every column using `getValueForSort`\r\n */\r\n valueGetter?: (column: ColumnType) => (row: DataType) => SortableValue\r\n\r\n /**\r\n * Additional options for sorting, including ignoring null values or sorting null as last\r\n */\r\n options?: SortByColumnOptions\r\n}\r\n\r\n/**\r\n * This hook has multiple\r\n */\r\nexport function useTableSort<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n SortType extends DefaultSort extends null ? ColumnType | null : ColumnType,\r\n>({ data, columns, defaultSort, valueGetter, options }: UseTableSortProps) {\r\n const [sort, setSort] = React.useState(getDefaultSort(columns, defaultSort) as TableSort)\r\n\r\n const changeSort = React.useCallback((newSort: SortType, direction?: SortDirection) => {\r\n setSort((prevSort) => {\r\n if (newSort && direction) {\r\n return { column: newSort, direction }\r\n }\r\n\r\n if (newSort && prevSort.column?.id === newSort.id) {\r\n return { ...prevSort, direction: prevSort.direction * -1 }\r\n }\r\n\r\n return { column: newSort, direction: SortDirection.Ascending }\r\n })\r\n }, [])\r\n\r\n const sortedData = useSortData({ data, direction: sort.direction, sortBy: sort.column, valueGetter, options })\r\n\r\n return {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n }\r\n}\r\n\r\ninterface UseTableSortWithUrlProps<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n> extends UseTableSortProps {\r\n /**\r\n * When set, the sorting will be persisted in the URL. Loading the\r\n *\r\n * @default undefined\r\n */\r\n urlPersistKey?: string\r\n\r\n /**\r\n * Key to get value of the URL sort from a column\r\n * @deafult \"id\"\r\n */\r\n idKey?: keyof ColumnType\r\n}\r\n\r\nexport function useTableSortWithUrl<\r\n IdType,\r\n DataType,\r\n ColumnType extends SortByShape,\r\n DefaultSort extends ColumnType['id'] | TableSort | null,\r\n SortType extends DefaultSort extends null ? ColumnType | null : ColumnType,\r\n>({\r\n data,\r\n columns,\r\n defaultSort,\r\n valueGetter,\r\n urlPersistKey,\r\n idKey = 'id',\r\n options,\r\n}: UseTableSortWithUrlProps) {\r\n const {\r\n data: sortedData,\r\n changeSort: changeSortState,\r\n sort,\r\n } = useTableSort({ data, columns, defaultSort, valueGetter, options })\r\n const [searchParams, setSearchParams] = useSearchParams()\r\n const defaultSortRef = React.useRef(\r\n urlPersistKey && typeof defaultSort === 'string'\r\n ? getDefaultSortFromUrl(columns, searchParams.get(urlPersistKey) ?? defaultSort, idKey)\r\n : getDefaultSort(columns, defaultSort)\r\n )\r\n\r\n const changeSort = React.useCallback(\r\n (newSort: SortType) => {\r\n if (urlPersistKey) {\r\n const defaultSort: ColumnType | null = defaultSortRef.current.column\r\n setSearchParams(\r\n (prev) =>\r\n saveSortToUrl(prev, urlPersistKey, newSort, idKey, defaultSort === null ? null : defaultSort[idKey]),\r\n {\r\n preventScrollReset: true,\r\n }\r\n )\r\n }\r\n\r\n changeSortState(newSort)\r\n },\r\n [idKey, setSearchParams, urlPersistKey, changeSortState]\r\n )\r\n\r\n /**\r\n * Update sort from url\r\n */\r\n React.useEffect(() => {\r\n if (!urlPersistKey) return\r\n\r\n const newSort = searchParams.get(urlPersistKey)\r\n if (newSort) {\r\n const sort = getDefaultSortFromUrl(columns, newSort, idKey)\r\n changeSortState(sort.column, sort.direction)\r\n }\r\n }, [columns, idKey, searchParams, urlPersistKey, changeSortState])\r\n\r\n return {\r\n data: sortedData,\r\n sort,\r\n changeSort,\r\n }\r\n}\r\n","import { link } from '../services/routing'\r\nimport { Delayed, DelayedProps } from './delayed'\r\nimport { ErrorView } from './error-view'\r\nimport { Spinner } from './spinner'\r\n\r\ntype LoadingProps = Pick\r\n\r\nexport function Loading({ delay, timeout, throwOnTimeout }: LoadingProps) {\r\n return (\r\n \r\n There’s been an error loading the application.\r\n
    \r\n Please make sure your internet connection is stable and refresh the page. If the error persists, please{' '}\r\n \r\n contact support\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\nexport function LoadingScreen(props: LoadingProps) {\r\n return (\r\n
    \r\n \r\n
    \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { SortDirectionValue, SortableValue } from '../types'\r\nimport { SortByColumnOptions, sortByColumn } from '../util'\r\n\r\nexport interface SortByShape {\r\n id: IdType\r\n\r\n /**\r\n * Provide value calculation for sort when value is computed in column renderer\r\n */\r\n getValueForSort?: (row: DataType) => SortableValue\r\n}\r\n\r\nexport function isSortByShape(sortBy?: unknown): sortBy is SortByShape {\r\n return sortBy?.hasOwnProperty?.('id') === true\r\n}\r\n\r\n/**\r\n * Default value getter which gets row data by `getValueForSort` defined on the column\r\n * If no sort value getter is provided, it falls back to getting data by column.id or returns the whole row\r\n */\r\nexport function getDefaultValueGetter(column: SortBy) {\r\n return (row: DataType): SortableValue => {\r\n let value = null\r\n\r\n if (isSortByShape(column)) {\r\n if (typeof column.getValueForSort === 'function') value = column.getValueForSort(row)\r\n else if (typeof row === 'object') value = row?.[column.id as keyof typeof row]\r\n } else {\r\n value = row\r\n }\r\n\r\n return (value as SortableValue) ?? null\r\n }\r\n}\r\n\r\nexport function useSortData({\r\n data,\r\n sortBy,\r\n direction,\r\n valueGetter = getDefaultValueGetter,\r\n options,\r\n}: {\r\n data: DataType[]\r\n sortBy?: SortBy | null\r\n direction: SortDirectionValue\r\n valueGetter?: (sortBy: SortBy) => (row: DataType) => SortableValue\r\n options?: SortByColumnOptions\r\n}) {\r\n return React.useMemo(() => {\r\n if (!sortBy) return [...data]\r\n\r\n return [...data].sort((a, b) =>\r\n sortByColumn({\r\n ...options,\r\n a,\r\n b,\r\n direction,\r\n valueGetter: valueGetter(sortBy),\r\n })\r\n )\r\n }, [data, options, direction, valueGetter, sortBy])\r\n}\r\n","import classNames from 'classnames'\r\nimport * as dateFns from 'date-fns'\r\n\r\nimport { RedGreenMultiline, RedGreenText } from '../../../components/RedGreenText'\r\nimport { TableAlign } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, PortfolioSymbolType, PortfolioTransaction, RowKind, TableColumnDefinition } from '../types'\r\nimport { PORTFOLIO_DATE_FORMAT_VIEW, TRANSACTION_LABEL } from './general'\r\n\r\nexport const columnMap: Record = Object.freeze({\r\n [ColumnId.Spacer]: {\r\n id: ColumnId.Spacer,\r\n urlSort: '',\r\n name: '',\r\n renderColumn: () => null,\r\n },\r\n [ColumnId.Ticker]: {\r\n id: ColumnId.Ticker,\r\n urlSort: 'ticker',\r\n name: 'Ticker',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Group:\r\n case RowKind.Trade:\r\n if (args.row.type === PortfolioSymbolType.Stock && !args.row.isDelisted) {\r\n return (\r\n ev.stopPropagation()}\r\n >\r\n {args.row.ticker}\r\n \r\n )\r\n }\r\n\r\n return {args.row.ticker}\r\n default:\r\n return {args.row.ticker}\r\n }\r\n },\r\n },\r\n [ColumnId.Company]: {\r\n id: ColumnId.Company,\r\n urlSort: 'company',\r\n name: 'Company',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return null\r\n case RowKind.Summary:\r\n return (\r\n \r\n Summary:{' '}\r\n \r\n {args.row.tickers} Ticker{args.row.tickers === 1 ? '' : 's'}\r\n \r\n / \r\n \r\n {args.row.transactions} Transaction{args.row.transactions === 1 ? '' : 's'}\r\n \r\n \r\n )\r\n default:\r\n return
    {args.row.company}
    \r\n }\r\n },\r\n },\r\n [ColumnId.CostAvg]: {\r\n id: ColumnId.CostAvg,\r\n urlSort: 'costavg',\r\n name: 'Avg. Cost',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Trade: {\r\n if (args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.costAvg)\r\n }\r\n default:\r\n return formatNumber(args.row.costAvg)\r\n }\r\n },\r\n },\r\n [ColumnId.LastClose]: {\r\n id: ColumnId.LastClose,\r\n urlSort: 'price',\r\n name: 'Price',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n default:\r\n return formatNumber(args.row.lastClose)\r\n }\r\n },\r\n },\r\n [ColumnId.LastChange]: {\r\n id: ColumnId.LastChange,\r\n urlSort: 'lastchange',\r\n name: 'Change $',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => (args.kind === RowKind.Group ? args.row.lastClose - args.row.prevClose : null),\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Summary:\r\n return null\r\n default:\r\n if (args.row.isDelisted) return '-'\r\n\r\n const lastChange = args.row.lastClose - args.row.prevClose\r\n return (\r\n \r\n {formatNumber(lastChange, {\r\n showPlusSign: true,\r\n fractions: args.row.lastClose < 1 ? 4 : 2,\r\n })}\r\n \r\n )\r\n }\r\n },\r\n },\r\n [ColumnId.LastChangePct]: {\r\n id: ColumnId.LastChangePct,\r\n urlSort: 'changepct',\r\n name: 'Change %',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return null\r\n default:\r\n return (\r\n \r\n {formatNumber(args.row.lastChangePct, { showPlusSign: true })}\r\n \r\n )\r\n }\r\n },\r\n },\r\n [ColumnId.LastVolume]: {\r\n id: ColumnId.LastVolume,\r\n urlSort: 'volume',\r\n name: 'Volume',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Group:\r\n case RowKind.Trade:\r\n return formatNumber(args.row.lastVolume, { fractions: 0 })\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Transaction]: {\r\n id: ColumnId.Transaction,\r\n urlSort: 'transaction',\r\n name: 'Transaction',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return TRANSACTION_LABEL[args.row.transaction]\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Date]: {\r\n id: ColumnId.Date,\r\n urlSort: 'date',\r\n name: 'Date',\r\n align: TableAlign.Left,\r\n renderColumn: (args) => {\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n case RowKind.Trade:\r\n return (\r\n \r\n {dateFns.format(new Date(args.row.date), PORTFOLIO_DATE_FORMAT_VIEW)}\r\n \r\n )\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.Shares]: {\r\n id: ColumnId.Shares,\r\n urlSort: 'shares',\r\n name: 'Shares',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Summary:\r\n return null\r\n case RowKind.Trade: {\r\n if (args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.shares, { fractions: 0 })\r\n }\r\n default:\r\n return formatNumber(args.row.shares, { fractions: 0 })\r\n }\r\n },\r\n },\r\n [ColumnId.Price]: {\r\n id: ColumnId.Price,\r\n urlSort: 'cost',\r\n name: 'Cost / Share',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n\r\n switch (args.kind) {\r\n case RowKind.Transaction:\r\n return formatNumber(args.row.price)\r\n default:\r\n return null\r\n }\r\n },\r\n },\r\n [ColumnId.ValuePaid]: {\r\n id: ColumnId.ValuePaid,\r\n urlSort: 'totalcost',\r\n name: 'Total Cost',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.valuePaid)\r\n },\r\n },\r\n [ColumnId.Amount]: {\r\n id: ColumnId.Amount,\r\n urlSort: 'amount',\r\n name: 'Amount',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.valuePaid,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Trade && args.kind !== RowKind.Transaction) return null\r\n return formatNumber(args.row.price)\r\n },\r\n },\r\n [ColumnId.ValueMarket]: {\r\n id: ColumnId.ValueMarket,\r\n urlSort: 'marketvalue',\r\n name: 'Market Value',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return formatNumber(args.row.valueMarket)\r\n },\r\n },\r\n [ColumnId.GainMarketUsd]: {\r\n id: ColumnId.GainMarketUsd,\r\n urlSort: 'gainusd',\r\n name: 'Total Gain $',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainMarketUsd)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainMarketPct]: {\r\n id: ColumnId.GainMarketPct,\r\n urlSort: 'gainpct',\r\n name: 'Total Gain %',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainMarketPct)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainMarketCombined]: {\r\n id: ColumnId.GainMarketCombined,\r\n urlSort: 'gainmarket',\r\n name: 'Total Gain',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.gainMarketPct,\r\n renderColumn: (args) => (\r\n \r\n {formatNumber(args.row.gainMarketUsd)}\r\n \r\n {formatNumber(args.row.gainMarketPct)}\r\n \r\n \r\n ),\r\n },\r\n [ColumnId.GainTodayUsd]: {\r\n id: ColumnId.GainTodayUsd,\r\n urlSort: 'changeusd',\r\n name: 'Today’s Gain $',\r\n align: TableAlign.Right,\r\n renderColumn: (args) => {\r\n if (args.kind !== RowKind.Summary && args.row.type === PortfolioSymbolType.Cash) return null\r\n if (args.kind === RowKind.Trade && args.row.transaction === PortfolioTransaction.Watch) return null\r\n return (\r\n \r\n {formatNumber(args.row.gainTodayUsd)}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.GainTodayCombined]: {\r\n id: ColumnId.GainTodayCombined,\r\n urlSort: 'gaintoday',\r\n name: 'Today’s Gain',\r\n align: TableAlign.Right,\r\n getValueForSort: (args) => args.row.lastChangePct,\r\n renderColumn: (args) => (\r\n \r\n {formatNumber(args.row.gainTodayUsd)}\r\n \r\n {formatNumber(args.row.lastChangePct)}\r\n \r\n \r\n ),\r\n },\r\n [ColumnId.Order]: {\r\n id: ColumnId.Order,\r\n urlSort: 'order',\r\n name: 'Order',\r\n align: TableAlign.Right,\r\n renderColumn: () => null,\r\n },\r\n})\r\n\r\nexport const columns = Object.values(columnMap)\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { PortfolioEntryTransaction, PortfolioSymbolType, PortfolioTransaction } from '../types'\r\n\r\nexport const PORTFOLIO_CASH_SYMBOL = '$CASH'\r\n\r\nexport const PORTFOLIO_DATE_FORMAT_VIEW = 'MM-dd-yyyy'\r\nexport const PORTFOLIO_DATE_FORMAT_DATA = \"yyyy-MM-dd'T00:00:00'\"\r\n\r\nexport const PORTFOLIO_REFRESH_INTERVAL_ELITE = 20 * 1000\r\nexport const PORTFOLIO_REFRESH_INTERVAL_FREE = 60 * 1000\r\n\r\nexport const TRANSACTION_LABEL: Record = {\r\n [PortfolioTransaction.Watch]: 'Watch',\r\n\r\n // Stock transactions\r\n [PortfolioTransaction.Buy]: 'Buy',\r\n [PortfolioTransaction.Short]: 'Short Sell',\r\n\r\n // Cash transactions\r\n [PortfolioTransaction.CashDeposit]: 'Cash Deposit',\r\n [PortfolioTransaction.CashWithdraw]: 'Cash Withdraw',\r\n [PortfolioTransaction.CashIncome]: 'Income',\r\n [PortfolioTransaction.CashFee]: 'Fee',\r\n}\r\n\r\nexport const STOCK_TRANSACTIONS = [PortfolioTransaction.Buy, PortfolioTransaction.Short]\r\n\r\nexport const CASH_TRANSACTIONS = [\r\n PortfolioTransaction.CashDeposit,\r\n PortfolioTransaction.CashWithdraw,\r\n PortfolioTransaction.CashIncome,\r\n PortfolioTransaction.CashFee,\r\n]\r\n\r\nexport const EMPTY_FORM_ENTRY = {\r\n ticker: '',\r\n date: `${dateFns.format(new Date(), PORTFOLIO_DATE_FORMAT_DATA)}`,\r\n shares: undefined,\r\n price: undefined,\r\n transaction: PortfolioTransaction.Buy,\r\n}\r\n\r\nexport const EMPTY_TRANSACTION: Omit = {\r\n ...EMPTY_FORM_ENTRY,\r\n shares: 0,\r\n price: 0,\r\n type: PortfolioSymbolType.Stock,\r\n valuePaid: null,\r\n valueMarket: null,\r\n valueMarketPrev: null,\r\n gainMarket: null,\r\n gainMarketPct: null,\r\n gainMarketUsd: null,\r\n gainTodayUsd: null,\r\n lastChangePct: null,\r\n}\r\n\r\nexport const PORTFOLIO_INPUT_NAME = 'portfolio_name'\r\nexport const PORTFOLIO_INPUT_EMPTY_ERROR = 'Please enter portfolio name.'\r\nexport const PORTFOLIO_INPUT_EXISTS_ERROR = 'Portfolio with that name already exists.'\r\nexport const TICKERS_INPUT_NAME = 'tickers'\r\nexport const TICKERS_INPUT_FORMAT_TIP = 'Separate multiple tickers by a comma, e.g.: AAPL, MSFT, GOOG.'\r\n","import { getSanitizedTicker } from '../../../../app/shared/ticker-sanitizer'\r\nimport { ContentType, apiRequest } from '../../../services/api'\r\nimport { PORTFOLIO_CASH_SYMBOL } from '../constants/general'\r\nimport {\r\n PortfolioDefinition,\r\n PortfolioEntryBase,\r\n PortfolioFormGroup,\r\n PortfolioInitData,\r\n PortfolioSymbolType,\r\n PortfolioTransaction,\r\n PortfolioTransactionWatch,\r\n} from '../types'\r\n\r\nexport const EMPTY_RESPONSE: PortfolioInitData = {\r\n limit: 0,\r\n selectedPortfolio: 0,\r\n limitTransactions: 0,\r\n portfolio: [],\r\n news: [],\r\n portfolios: [],\r\n}\r\n\r\nexport function portfolioData(portfolioId?: string | number | null) {\r\n return apiRequest('/api/portfolio_data.ashx', { query: { pid: portfolioId ?? '' } })\r\n}\r\n\r\nexport function deletePortfolio(portfolioId?: string | number) {\r\n return apiRequest('/request_portfolio_delete.ashx', { query: { pid: portfolioId } })\r\n}\r\n\r\nexport function portfolioEntry(\r\n query?: Record,\r\n method?: string,\r\n body?: Omit, 'type'>\r\n) {\r\n return apiRequest(\r\n '/api/portfolio_entry.ashx',\r\n {\r\n query,\r\n method,\r\n body: JSON.stringify(body),\r\n },\r\n true\r\n )\r\n}\r\n\r\nexport const QUOTE_INVALID_TICKER_REQUEST = '_UNKNOWN'\r\nexport const QUOTE_INVALID_TICKER_RESPONSE = 'NA'\r\nexport const QUOTE_TICKER_DELIMITER = ','\r\n\r\nexport function quoteData(tickers: string[]) {\r\n return apiRequest('request_quote.ashx', {\r\n query: { t: tickers.filter((ticker) => ticker.length).join(',') },\r\n headers: { 'Content-Type': ContentType.Html },\r\n })\r\n}\r\n\r\nexport async function validateTickers(tickers: string[]) {\r\n const response = await apiRequest<{ tickers: string; specialSymbols: Record }>(\r\n '/portfolio_tickers.ashx',\r\n {\r\n query: { json: true },\r\n },\r\n true\r\n )\r\n\r\n const parsedTickers = response?.tickers.split('|') ?? []\r\n const specialTickers = Object.keys(response?.specialSymbols ?? [])\r\n\r\n return tickers.map((ticker) => [...specialTickers, ...parsedTickers].includes(ticker))\r\n}\r\n\r\nexport async function recalculatePortfolio(\r\n rows: PortfolioFormGroup[],\r\n numberOfTransactions: number,\r\n totalValue = 100000.0\r\n): Promise {\r\n const tickers = Object.values(rows).map((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim(), false, [PORTFOLIO_CASH_SYMBOL])\r\n return ticker.length ? ticker : QUOTE_INVALID_TICKER_REQUEST\r\n })\r\n const pricePerColumn = totalValue / numberOfTransactions\r\n\r\n const response = await quoteData(tickers)\r\n const prices = response?.split(QUOTE_TICKER_DELIMITER)\r\n\r\n if (prices?.length !== tickers.length) {\r\n window.Sentry?.captureMessage('Invalid recalculated data', {\r\n extra: {\r\n requestTickers: tickers,\r\n requestTickersLength: tickers.length,\r\n responseLength: prices?.length,\r\n },\r\n })\r\n\r\n return []\r\n }\r\n\r\n const tickerPrices = Object.fromEntries(\r\n prices.map((price, index) => {\r\n const tickerPrice = price === QUOTE_INVALID_TICKER_RESPONSE ? NaN : parseFloat(price)\r\n\r\n return [tickers[index], isNaN(tickerPrice) ? NaN : tickerPrice]\r\n })\r\n )\r\n\r\n return rows.map((row) => ({\r\n id: row.id,\r\n ticker: row.ticker,\r\n transactions: row.transactions.map((transaction) => {\r\n const price = tickerPrices[row.ticker]\r\n const shares = Math.round((pricePerColumn / price) * 10000) / 10000\r\n\r\n const calculatedPrice = isNaN(price) ? transaction.price : price\r\n const calculatedShares = isNaN(shares) ? transaction.shares : shares\r\n\r\n return {\r\n ...transaction,\r\n transaction:\r\n transaction.transaction === PortfolioTransaction.Watch ? PortfolioTransaction.Buy : transaction.transaction,\r\n price: transaction.type === PortfolioSymbolType.Cash ? 0 : calculatedPrice,\r\n shares: transaction.type === PortfolioSymbolType.Cash ? 0 : calculatedShares,\r\n }\r\n }),\r\n }))\r\n}\r\n\r\nexport function submitForm(data: URLSearchParams) {\r\n return apiRequest('/portfolio_submit.ashx', {\r\n method: 'POST',\r\n body: data.toString(),\r\n headers: { 'Content-Type': ContentType.FormUrlEncoded },\r\n })\r\n}\r\n\r\nexport type TickersApiResponse = {\r\n portfolioId: number\r\n message?: string\r\n portfolioEntries: Record>\r\n}\r\n\r\nexport enum ErrorSource {\r\n Portfolio,\r\n Tickers,\r\n}\r\n\r\nexport type TickersApiErrorResponse = {\r\n source: ErrorSource\r\n message: string\r\n isNotification?: boolean\r\n}\r\n\r\nexport function portfolioTickers({\r\n tickers,\r\n portfolioName,\r\n portfolioId,\r\n}: {\r\n tickers: string\r\n portfolioName?: string\r\n portfolioId?: number\r\n}) {\r\n const query = Object.assign(\r\n { tickers },\r\n typeof portfolioName !== 'undefined' && { portfolio_name: portfolioName },\r\n typeof portfolioId !== 'undefined' && { pid: portfolioId }\r\n )\r\n\r\n return apiRequest(\r\n '/api/portfolio_tickers.ashx',\r\n {\r\n method: 'POST',\r\n query,\r\n },\r\n true\r\n )\r\n}\r\n\r\nexport function submitEditForm(data: string | URLSearchParams) {\r\n return apiRequest('/portfolio_submit.ashx', {\r\n method: 'POST',\r\n body: data.toString(),\r\n headers: { 'Content-Type': ContentType.FormUrlEncoded },\r\n })\r\n}\r\n\r\nexport function reorderPortfolios(body: PortfolioDefinition[]) {\r\n return apiRequest('/api/portfolio_reorder.ashx', {\r\n method: 'PUT',\r\n body: JSON.stringify(body),\r\n })\r\n}\r\n","import { TableAlign } from '../../components/Table'\r\nimport { SortByShape } from '../../hooks/use-sort-data'\r\nimport { NullableNumbers } from '../../types'\r\n\r\nexport enum PortfolioQuery {\r\n View = 'v',\r\n TableView = 'tv',\r\n PortfolioId = 'pid',\r\n Order = 'o',\r\n Tickers = 't',\r\n Map = 'map',\r\n Size = 'mapSize',\r\n Subtype = 'subtype',\r\n Group = 'group',\r\n}\r\n\r\nexport enum PortfolioMapSizeKey {\r\n MarketValue = 'market',\r\n Gain = 'gain',\r\n}\r\n\r\nexport enum PortfolioView {\r\n View = '1',\r\n Edit = '2',\r\n}\r\n\r\nexport enum PortfolioTableView {\r\n Ticker = '1',\r\n Trade = '2',\r\n}\r\n\r\nexport const PortfolioTableViewLabels = {\r\n [PortfolioTableView.Ticker]: 'Tickers',\r\n [PortfolioTableView.Trade]: 'Trades',\r\n}\r\n\r\nexport enum PortfolioSymbolType {\r\n Stock = 'stock',\r\n Cash = 'cash',\r\n}\r\n\r\nexport enum PortfolioTransaction {\r\n Watch = 0,\r\n\r\n // Stock transactions\r\n Buy = 1,\r\n Short = 2,\r\n\r\n // Cash transactions\r\n CashDeposit = 200,\r\n CashWithdraw = 201,\r\n CashIncome = 202,\r\n CashFee = 203,\r\n}\r\n\r\nexport enum NumberOfShares {\r\n None = 0,\r\n /**\r\n * The usage of this is technically incorrect. The value for `PositiveNumber` is 1.\r\n * But we don’t care in this context, because we only want to differentiate betwen zero/non-zero values,\r\n * which helps us get correct types.\r\n *\r\n * # Don’t compare `entry.shares === NumberOfShares.PositiveNumber`\r\n */\r\n PositiveNumber = 1,\r\n}\r\n\r\nexport interface PortfolioEntryBase {\r\n id: number\r\n ticker: string\r\n date: string\r\n transaction: PortfolioTransaction\r\n shares: number\r\n price: number\r\n type: PortfolioSymbolType\r\n}\r\n\r\n/**\r\n * Base type which lists all common properties\r\n */\r\nexport interface PortfolioEntryComputed {\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketPrev: number\r\n gainMarket: number\r\n gainMarketPct: number\r\n gainMarketUsd: number\r\n gainTodayUsd: number\r\n lastChangePct: number\r\n}\r\n\r\n/**\r\n * Transaction with > 0 shares\r\n */\r\nexport interface PortfolioTransactionStake extends PortfolioEntryBase, PortfolioEntryComputed {\r\n shares: NumberOfShares.PositiveNumber\r\n}\r\n\r\n/**\r\n * Transaction with 0 shares\r\n */\r\nexport interface PortfolioTransactionWatch\r\n extends Omit,\r\n NullableNumbers {\r\n shares: NumberOfShares.None\r\n transaction: PortfolioTransaction\r\n}\r\n\r\nexport type PortfolioEntryTransaction = PortfolioTransactionStake | PortfolioTransactionWatch\r\n\r\nexport type PortfolioActionType = PortfolioEntryTransaction & { isNotification?: boolean; message?: string }\r\n\r\n/**\r\n * Top level portfolio entry\r\n */\r\nexport interface PortfolioGroup extends PortfolioEntryComputed {\r\n ticker: string\r\n shares: number\r\n industry: string\r\n country: string\r\n company: string\r\n marketCap: number\r\n prevClose: number\r\n lastClose: number\r\n lastVolume: number\r\n perfWeek: number\r\n costAvg: number\r\n transactions: PortfolioEntryTransaction[]\r\n order: number\r\n id: number\r\n date: string\r\n type: PortfolioSymbolType\r\n isDelisted?: true\r\n}\r\n\r\nexport type PortfolioTrade = Omit & PortfolioEntryTransaction\r\n\r\nexport type PortfolioMapEntry = Omit & PortfolioTransactionStake\r\n\r\n/**\r\n * Summary row for the whole portfolio\r\n */\r\nexport interface PortfolioSummary {\r\n tickers: number\r\n transactions: number\r\n shares: number\r\n lastChangePct: number\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketStocks: number\r\n valueMarketStocksPrev: number\r\n gainMarketUsd: number\r\n gainMarketPct: number\r\n gainTodayUsd: number\r\n}\r\n\r\nexport interface PortfolioDefinition {\r\n id: number\r\n name: string\r\n order: number\r\n}\r\n\r\nexport interface PortfolioInitData {\r\n limit: number\r\n limitTransactions: number\r\n selectedPortfolio: number\r\n portfolios: PortfolioDefinition[]\r\n portfolio: PortfolioGroup[]\r\n news: string[]\r\n version?: number\r\n}\r\n\r\nexport interface PortfolioFormEntry\r\n extends Pick,\r\n Partial> {\r\n uuid: string\r\n}\r\n\r\nexport interface PortfolioFormGroup extends Pick {\r\n id: string\r\n transactions: PortfolioFormEntry[]\r\n}\r\n\r\nexport enum ColumnId {\r\n Spacer = 'spacer',\r\n Ticker = 'ticker',\r\n Company = 'company',\r\n LastClose = 'lastClose',\r\n CostAvg = 'costAvg',\r\n LastChange = 'lastChange',\r\n LastChangePct = 'lastChangePct',\r\n LastVolume = 'lastVolume',\r\n Transaction = 'transaction',\r\n Date = 'date',\r\n Shares = 'shares',\r\n Price = 'price',\r\n ValuePaid = 'valuePaid',\r\n Amount = 'amount',\r\n ValueMarket = 'valueMarket',\r\n GainMarketUsd = 'gainMarketUsd',\r\n GainMarketPct = 'gainMarketPct',\r\n GainMarketCombined = 'gainMarketCombined',\r\n GainTodayUsd = 'gainTodayUsd',\r\n GainTodayCombined = 'gainTodayCombined',\r\n Order = 'order',\r\n}\r\n\r\nexport enum RowKind {\r\n Group, // A group of transactions\r\n Transaction, // A transaction made inside ticker\r\n Summary, // Portfolio summary\r\n Watchlist, // Charts portfolio watchlist table\r\n Trade,\r\n}\r\n\r\ninterface GroupProps {\r\n kind: RowKind.Group\r\n row: PortfolioGroup\r\n}\r\ninterface TradeProps {\r\n kind: RowKind.Trade\r\n row: PortfolioTrade\r\n}\r\n\r\ninterface TransactionProps {\r\n kind: RowKind.Transaction\r\n row: PortfolioEntryTransaction\r\n}\r\n\r\ninterface SummaryProps {\r\n kind: RowKind.Summary\r\n row: PortfolioSummary\r\n}\r\n\r\ninterface WatchlistProps {\r\n index: number\r\n kind: RowKind.Watchlist\r\n row: PortfolioGroup\r\n}\r\n\r\nexport interface TableColumnDefinition<\r\n PropsType = GroupProps | TradeProps | TransactionProps | SummaryProps | WatchlistProps,\r\n> extends SortByShape {\r\n urlSort: string\r\n name: string\r\n align?: TableAlign\r\n\r\n /**\r\n * Get the value of the column and render it\r\n */\r\n renderColumn: (props: PropsType) => React.ReactNode\r\n}\r\n\r\nexport enum ActionKind {\r\n AddTickers,\r\n RemoveTicker,\r\n AddTransaction,\r\n EditTransaction,\r\n RemoveTransaction,\r\n ReorderTickers,\r\n PortfoliosReorder,\r\n}\r\n\r\nexport interface Action {\r\n kind: ActionKind\r\n payload: PayloadType\r\n}\r\n\r\nexport type AddTickersError = {\r\n tickers?: string\r\n}\r\n\r\nexport interface CreatePortfolioErrors extends AddTickersError {\r\n portfolioName?: string\r\n}\r\n\r\nexport interface CreatePortfolioData {\r\n tickers: string\r\n portfolioName: string\r\n}\r\n\r\nexport type FormErrors = Partial>\r\n\r\nexport interface PortfolioBulkEditErrors {\r\n portfolioName: boolean\r\n rows: Record\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { MapDataNode, MapDataRoot, MapSubtypeId, PerfData } from '../../../app/maps/types'\r\nimport { getMapsRefreshInterval } from '../../../app/maps/utils'\r\nimport { getSanitizedTicker } from '../../../app/shared/ticker-sanitizer'\r\nimport { parseInitData } from '../../../app/shared/utils'\r\nimport * as storage from '../../services/local-storage'\r\nimport { formatNumber, getUuid } from '../../util'\r\nimport { columnMap } from './constants/columns'\r\nimport {\r\n CASH_TRANSACTIONS,\r\n EMPTY_FORM_ENTRY,\r\n PORTFOLIO_CASH_SYMBOL,\r\n PORTFOLIO_DATE_FORMAT_DATA,\r\n PORTFOLIO_DATE_FORMAT_VIEW,\r\n PORTFOLIO_REFRESH_INTERVAL_ELITE,\r\n PORTFOLIO_REFRESH_INTERVAL_FREE,\r\n STOCK_TRANSACTIONS,\r\n} from './constants/general'\r\nimport * as api from './services/api'\r\nimport {\r\n ColumnId,\r\n FormErrors,\r\n PortfolioEntryBase,\r\n PortfolioEntryTransaction,\r\n PortfolioFormEntry,\r\n PortfolioFormGroup,\r\n PortfolioGroup,\r\n PortfolioInitData,\r\n PortfolioMapEntry,\r\n PortfolioMapSizeKey,\r\n PortfolioQuery,\r\n PortfolioSummary,\r\n PortfolioSymbolType,\r\n PortfolioTransaction,\r\n PortfolioTransactionStake,\r\n PortfolioView,\r\n} from './types'\r\n\r\nexport enum PortfolioDataKey {\r\n Cash = 'cash',\r\n LongGainers = 'longGainers',\r\n LongLosers = 'longLosers',\r\n ShortGainers = 'shortGainers',\r\n ShortLosers = 'shortLosers',\r\n}\r\n\r\nconst industryLabelKey = 'description'\r\n\r\nconst groupPrefix = {\r\n long: 'Long',\r\n short: 'Short',\r\n}\r\n\r\nconst groupLabel = {\r\n gainers: 'Gainers',\r\n losers: 'Losers',\r\n}\r\n\r\nexport const LOCAL_STORAGE_KEY = 'portfolio-map'\r\n\r\ntype PortfolioMapData = { [key in PortfolioDataKey]: MapDataNode[] }\r\n\r\nexport interface PortfolioSavedSettings {\r\n tableView: '1' | '2'\r\n showMap: boolean\r\n showIndustries: boolean\r\n subtype: MapSubtypeId\r\n tableOrder: string\r\n}\r\n\r\nexport const DEFAULT_SETTINGS: PortfolioSavedSettings = {\r\n tableView: '1',\r\n showMap: true,\r\n showIndustries: true,\r\n subtype: MapSubtypeId.PortfolioGainPct,\r\n tableOrder: columnMap[ColumnId.Order].urlSort,\r\n}\r\n\r\n/**\r\n * Map param in query/local storage is string but we need a boolean\r\n */\r\nexport function parseBoolFromValue(value?: string | null) {\r\n try {\r\n if (value) {\r\n return Boolean(JSON.parse(value))\r\n }\r\n } catch {\r\n return false\r\n }\r\n}\r\n\r\nexport function getMapSettingFromLocalStorage() {\r\n const savedSettings = storage.getValue(LOCAL_STORAGE_KEY, DEFAULT_SETTINGS)\r\n\r\n return { ...DEFAULT_SETTINGS, ...savedSettings }\r\n}\r\n\r\nexport function saveMapSettingToLocalStorage(\r\n key: keyof PortfolioSavedSettings,\r\n value: PortfolioSavedSettings[typeof key]\r\n) {\r\n storage.setValue(\r\n LOCAL_STORAGE_KEY,\r\n (prevState) => {\r\n const itemToStore = { ...prevState, [key]: value }\r\n // TODO: remove - temporary code to remove removed property from settings\r\n if ('customTickersOrder' in itemToStore) delete itemToStore.customTickersOrder\r\n return itemToStore\r\n },\r\n DEFAULT_SETTINGS\r\n )\r\n}\r\n\r\nconst SUMMARY_DEFAULT: PortfolioSummary = {\r\n tickers: 0,\r\n transactions: 0,\r\n shares: 0,\r\n lastChangePct: 0,\r\n valuePaid: 0,\r\n valueMarket: 0,\r\n valueMarketStocks: 0,\r\n valueMarketStocksPrev: 0,\r\n gainMarketUsd: 0,\r\n gainMarketPct: 0,\r\n gainTodayUsd: 0,\r\n}\r\n\r\nexport function getSummary(data: PortfolioGroup[]) {\r\n let transactions = 0\r\n\r\n const computed = data.reduce((prev, current) => {\r\n transactions += current.transactions.length || 1\r\n\r\n if (current.isDelisted) return prev\r\n\r\n const valueMarket = prev.valueMarket + current.valueMarket\r\n const valueMarketStocks =\r\n prev.valueMarketStocks + (current.type === PortfolioSymbolType.Cash ? 0 : current.valueMarket)\r\n const valueMarketStocksPrev =\r\n prev.valueMarketStocksPrev + (current.type === PortfolioSymbolType.Cash ? 0 : current.valueMarketPrev)\r\n const valuePaid = prev.valuePaid + current.valuePaid\r\n const lastChangePct = valueMarketStocksPrev <= 0 ? 0 : (valueMarketStocks / valueMarketStocksPrev - 1) * 100\r\n const gainMarketPct = valuePaid <= 0 ? 0 : (valueMarketStocks / valuePaid - 1) * 100\r\n\r\n return {\r\n ...prev,\r\n valueMarket: valueMarket,\r\n valueMarketStocks,\r\n valueMarketStocksPrev,\r\n lastChangePct,\r\n gainMarketPct,\r\n shares: prev.shares + current.shares,\r\n valuePaid: prev.valuePaid + current.valuePaid,\r\n gainMarketUsd: prev.gainMarketUsd + current.gainMarketUsd,\r\n gainTodayUsd: prev.gainTodayUsd + current.gainTodayUsd,\r\n }\r\n }, SUMMARY_DEFAULT)\r\n\r\n return {\r\n ...computed,\r\n transactions,\r\n tickers: data.length,\r\n }\r\n}\r\n\r\nfunction isMapTransaction(entry: PortfolioEntryTransaction): entry is PortfolioTransactionStake {\r\n return entry.shares > 0 || entry.type === PortfolioSymbolType.Cash\r\n}\r\n\r\n/**\r\n * Goes through all the items and merges them together so that we don’t end up\r\n * with multiple map tiles with same ticker & transaction\r\n */\r\nexport function flattenAndDedupe(data: PortfolioGroup[]) {\r\n const result: PortfolioMapEntry[] = []\r\n\r\n data.forEach((group) => {\r\n group.transactions.forEach((entry) => {\r\n if (!isMapTransaction(entry)) return\r\n\r\n const previouslyAdded = result.findIndex(\r\n (prev) =>\r\n prev.ticker === entry.ticker &&\r\n (entry.type === PortfolioSymbolType.Cash ? true : prev.transaction === entry.transaction)\r\n )\r\n\r\n if (previouslyAdded < 0) {\r\n const newEntry = { ...group, ...entry, transactions: undefined }\r\n delete newEntry.transactions\r\n result.push(newEntry)\r\n } else {\r\n const prevEntry = result[previouslyAdded]\r\n const valueMarket = prevEntry.valueMarket + entry.valueMarket\r\n const valuePaid = prevEntry.valuePaid + entry.valuePaid\r\n\r\n result[previouslyAdded] = {\r\n ...prevEntry,\r\n valuePaid,\r\n valueMarket,\r\n shares: prevEntry.shares + entry.shares,\r\n valueMarketPrev: prevEntry.valueMarketPrev + entry.valueMarketPrev,\r\n gainMarketUsd: prevEntry.gainMarketUsd + entry.gainMarketUsd,\r\n gainMarketPct: (valueMarket / valuePaid - 1) * 100,\r\n gainTodayUsd: prevEntry.gainTodayUsd + entry.gainTodayUsd,\r\n }\r\n }\r\n })\r\n })\r\n\r\n return Object.values(result)\r\n}\r\n\r\n/**\r\n * Checks if item is loser/gainer and returns the appropriate flag\r\n */\r\nfunction getEntryGroup(type: PortfolioSymbolType, gain: number, transaction: PortfolioTransaction) {\r\n if (type === PortfolioSymbolType.Cash) return PortfolioDataKey.Cash\r\n\r\n switch (transaction) {\r\n case PortfolioTransaction.Short: {\r\n return gain > 0 ? PortfolioDataKey.ShortGainers : PortfolioDataKey.ShortLosers\r\n }\r\n\r\n default:\r\n case PortfolioTransaction.Buy: {\r\n return gain >= 0 ? PortfolioDataKey.LongGainers : PortfolioDataKey.LongLosers\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates industry node with children\r\n */\r\nexport function getIndustries(industries: Record) {\r\n return Object.keys(industries).map((industry) => ({\r\n name: industry,\r\n children: industries[industry],\r\n }))\r\n}\r\n\r\n/**\r\n * Group items by key\r\n * @see https://stackoverflow.com/a/47385953\r\n */\r\nexport function groupByKey(list: Item[], key: keyof Item) {\r\n return list.reduce>((hash, obj) => {\r\n if (obj[key] === undefined) return hash\r\n return Object.assign(hash, { [obj[key] as string]: (hash[obj[key] as string] || []).concat(obj) })\r\n }, {})\r\n}\r\n\r\n/**\r\n * Creates long/short gainers/losers group with all the children, optionally grouping them by industry\r\n */\r\nfunction createGroup(key: PortfolioDataKey, data: PortfolioMapData, groupByIndustry = true) {\r\n let groupName = ''\r\n switch (key) {\r\n case PortfolioDataKey.Cash:\r\n groupName = 'Other'\r\n break\r\n default:\r\n const isLong = [PortfolioDataKey.LongGainers, PortfolioDataKey.LongLosers].includes(key)\r\n const isGainer = [PortfolioDataKey.LongGainers, PortfolioDataKey.ShortGainers].includes(key)\r\n const longPrefix = data.shortGainers.length || data.shortLosers.length ? `${groupPrefix.long}: ` : ''\r\n const shortPrefix = data.longGainers.length || data.longLosers.length ? `${groupPrefix.short}: ` : ''\r\n groupName = `${isLong ? longPrefix : shortPrefix}${isGainer ? groupLabel.gainers : groupLabel.losers}`\r\n break\r\n }\r\n\r\n if (groupByIndustry) {\r\n let children: Array<{ name: string; children: MapDataNode[] }> = []\r\n if (key === PortfolioDataKey.Cash && data[key].length) children = [{ name: 'Cash', children: data[key] }]\r\n else children = getIndustries(groupByKey(data[key], industryLabelKey))\r\n return { name: groupName, children }\r\n }\r\n\r\n return { name: groupName, children: data[key] }\r\n}\r\n\r\nexport function getPerfText(node: PortfolioMapEntry, subtype: MapSubtypeId) {\r\n switch (subtype) {\r\n case MapSubtypeId.PortfolioGainPct:\r\n return node.gainMarketPct\r\n case MapSubtypeId.PortfolioGainUsd:\r\n return node.gainMarketUsd\r\n case MapSubtypeId.PortfolioChangePct:\r\n return node.lastChangePct\r\n case MapSubtypeId.PortfolioChangeUsd:\r\n return node.gainTodayUsd\r\n }\r\n}\r\n\r\nfunction getPerfForTicker | any[]>(\r\n ticker: string,\r\n list?: ListType,\r\n group?: PortfolioDataKey\r\n) {\r\n if (Array.isArray(list)) {\r\n return list.find((item) => item.name === ticker && item.data?.group === group)?.perf\r\n }\r\n\r\n return list?.[ticker]\r\n}\r\n\r\n/**\r\n * Returns data for the map. This data is deduped and split into gainers/losers & industries\r\n */\r\nexport function getMapData({\r\n data,\r\n perfData,\r\n size,\r\n subtype,\r\n groupByIndustry,\r\n}: {\r\n data?: PortfolioGroup[]\r\n perfData?: PerfData\r\n size: PortfolioMapSizeKey\r\n subtype: MapSubtypeId\r\n groupByIndustry?: boolean\r\n}) {\r\n if (!data) return { hasData: false }\r\n\r\n const dedupedData = flattenAndDedupe(data)\r\n\r\n const parsedData = dedupedData.reduce(\r\n (prev: PortfolioMapData, current) => {\r\n const group = getEntryGroup(current.type, current.gainMarketPct / 100, current.transaction)\r\n // The map can’t display negative values so we need to Math.abs\r\n let value = Math.abs(size === PortfolioMapSizeKey.MarketValue ? current.valueMarket : current.gainMarketUsd)\r\n if (!Number.isFinite(value)) value = 0\r\n\r\n const subtypePerf = getPerfText(current, subtype)\r\n const perfText = subtype.startsWith('portfolio')\r\n ? subtypePerf\r\n : getPerfForTicker(current.ticker, perfData?.nodes, group)\r\n\r\n const entry = {\r\n name: current.ticker,\r\n value,\r\n perf: current.type === PortfolioSymbolType.Cash ? null : perfText ?? subtypePerf,\r\n additional:\r\n current.type === PortfolioSymbolType.Cash\r\n ? formatNumber(current.valueMarket)\r\n : getPerfForTicker(current.ticker, perfData?.additional, group),\r\n description: current.industry,\r\n data: { perfWeek: current.perfWeek, group },\r\n } as MapDataNode\r\n\r\n if (value > 0) {\r\n return { ...prev, [group]: [...prev[group], entry] }\r\n }\r\n\r\n return prev\r\n },\r\n {\r\n [PortfolioDataKey.Cash]: [],\r\n [PortfolioDataKey.LongGainers]: [],\r\n [PortfolioDataKey.LongLosers]: [],\r\n [PortfolioDataKey.ShortGainers]: [],\r\n [PortfolioDataKey.ShortLosers]: [],\r\n }\r\n )\r\n\r\n return {\r\n hasData: Object.values(parsedData).some((arr) => arr.length > 0),\r\n data: {\r\n name: 'Portfolio',\r\n children: Object.keys(parsedData)\r\n .map((key) => createGroup(key as PortfolioDataKey, parsedData, groupByIndustry))\r\n .filter((category) => category.children.length),\r\n } as MapDataRoot,\r\n }\r\n}\r\n\r\nexport function parsePortfolioQuery(params: URLSearchParams, defaultPortfolioId: number) {\r\n const currentPortfolio = Number.parseInt(params.get(PortfolioQuery.PortfolioId) ?? '')\r\n const portfolioId =\r\n Number.isFinite(currentPortfolio) && currentPortfolio !== 0 ? currentPortfolio : defaultPortfolioId\r\n\r\n return {\r\n portfolioId,\r\n params: Object.fromEntries(params.entries()) as Record, // Re-export the original query as key/val\r\n view: params.get(PortfolioQuery.View) ?? PortfolioView.View,\r\n tableView: params.get(PortfolioQuery.TableView) ?? undefined,\r\n map: parseBoolFromValue(params.get(PortfolioQuery.Map)) ?? getMapSettingFromLocalStorage().showMap,\r\n size: (params.get(PortfolioQuery.Size) ?? PortfolioMapSizeKey.MarketValue) as PortfolioMapSizeKey,\r\n subtype: (params.get(PortfolioQuery.Subtype) ?? getMapSettingFromLocalStorage().subtype) as MapSubtypeId,\r\n group: params.get(PortfolioQuery.Group)?.toUpperCase().split(',') ?? [],\r\n tickers: params.get(PortfolioQuery.Tickers)?.split(',') ?? [],\r\n }\r\n}\r\n\r\nexport function getColumnsByKeys(keys: ColumnId[]) {\r\n return keys.map((key) => columnMap[key])\r\n}\r\n\r\nexport function getFormattedDate(format = PORTFOLIO_DATE_FORMAT_DATA) {\r\n return `${dateFns.format(new Date(), format)}`\r\n}\r\n\r\nexport function validateEditRow(\r\n state: Partial,\r\n dateFormat = PORTFOLIO_DATE_FORMAT_DATA,\r\n checkFormat = true\r\n) {\r\n const formErrors: FormErrors = {}\r\n\r\n if (state.ticker !== undefined && state.ticker.trim().length === 0) {\r\n formErrors.ticker = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (!state.date || !dateFns.isValid(parseInputAsDate({ input: state.date, format: dateFormat, checkFormat })))\r\n ) {\r\n formErrors.date = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (state.shares === undefined || isNaN(state.shares) || state.shares < 0)\r\n ) {\r\n formErrors.shares = true\r\n }\r\n\r\n if (\r\n state.transaction !== PortfolioTransaction.Watch &&\r\n (state.price === undefined || isNaN(state.price) || state.price <= 0)\r\n ) {\r\n formErrors.price = true\r\n }\r\n\r\n return { isValid: Object.keys(formErrors).length === 0, errors: formErrors }\r\n}\r\n\r\nexport function parseInputAsDate({\r\n input,\r\n format = PORTFOLIO_DATE_FORMAT_VIEW,\r\n checkFormat = true,\r\n}: {\r\n input: Date | string\r\n format?: string\r\n checkFormat?: boolean\r\n}) {\r\n if (checkFormat && typeof input === 'string' && input.length !== format.length) {\r\n return new Date('Invalid Date')\r\n }\r\n if (input instanceof Date && dateFns.isValid(input)) return input\r\n\r\n return dateFns.parse(input.toString(), format, new Date())\r\n}\r\n\r\nexport const FORM_ENTRY_KEYS = Object.keys(EMPTY_FORM_ENTRY)\r\n\r\nfunction appendRowToFormData(serializer: URLSearchParams, row: Partial, index: number) {\r\n FORM_ENTRY_KEYS.forEach((key) => serializer.append(`${key}${index}`, `${row[key as keyof PortfolioEntryBase] ?? ''}`))\r\n}\r\n\r\nexport function getBulkEditData(\r\n data: Array,\r\n options: { resetCash?: boolean } = {}\r\n): Record {\r\n return data.reduce(\r\n (acc, row) => {\r\n const existingId = (row as PortfolioFormGroup).id\r\n const id = existingId ? `${existingId}` : getUuid()\r\n const transactions =\r\n row.transactions.length === 0 || (options.resetCash && getSymbolType(row.ticker) === PortfolioSymbolType.Cash)\r\n ? [getNewTransaction(row.ticker, PortfolioTransaction.Watch)]\r\n : row.transactions.map((transaction) => ({\r\n ...transaction,\r\n uuid: transaction.id ? `${transaction.id}` : getUuid(),\r\n }))\r\n return {\r\n ...acc,\r\n [id]: { ...row, id, transactions },\r\n }\r\n },\r\n {} as Record\r\n )\r\n}\r\n\r\nexport function serializeFormData<\r\n EntryType extends { ticker: string; transactions?: Array> },\r\n>(entries: EntryType[]) {\r\n const serializer = new URLSearchParams()\r\n entries\r\n .flatMap((entry) => {\r\n if (!entry.transactions || entry.transactions?.length === 0) {\r\n return getNewTransaction(entry.ticker, PortfolioTransaction.Watch)\r\n }\r\n\r\n return entry.transactions\r\n })\r\n .forEach((entry, index) => {\r\n if (entry.ticker.length) appendRowToFormData(serializer, entry, index)\r\n })\r\n\r\n return serializer\r\n}\r\n\r\nexport async function validateFormData(data: PortfolioFormGroup[], validateFields = true) {\r\n if (data.length === 0) return { isValid: true, errors: {} }\r\n\r\n let isValid = true\r\n const errors: Record = {}\r\n\r\n try {\r\n const tickers = data.map((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim(), false, [PORTFOLIO_CASH_SYMBOL])\r\n return ticker.length ? ticker : api.QUOTE_INVALID_TICKER_REQUEST\r\n })\r\n const validatedTickers = await api.validateTickers(tickers)\r\n\r\n isValid = tickers.length === validatedTickers.length\r\n\r\n // Validate fields\r\n if (validateFields) {\r\n data.forEach((row, index) => {\r\n const validationResult = row.transactions.map((transaction) =>\r\n validateEditRow(transaction, PORTFOLIO_DATE_FORMAT_DATA, false)\r\n )\r\n\r\n const hasInvalidEntries = validationResult.some((result) => !result.isValid)\r\n const isInvalidTicker = validatedTickers[index] !== true\r\n\r\n if (hasInvalidEntries || isInvalidTicker) {\r\n isValid = false\r\n }\r\n\r\n errors[row.id] = validationResult.map((result) => ({ ...result.errors, ticker: isInvalidTicker }))\r\n })\r\n }\r\n } catch {\r\n return {\r\n isValid: false,\r\n errors: {},\r\n }\r\n }\r\n\r\n return { isValid, errors }\r\n}\r\n\r\nexport function getNumberValue(value?: number) {\r\n if (value === undefined || isNaN(value)) return NaN\r\n return value\r\n}\r\n\r\nexport function getNewTransaction(ticker: string, transaction = PortfolioTransaction.Buy): PortfolioFormEntry {\r\n const symbolType = getSymbolType(ticker)\r\n const allowedTransactions = getTransactionsForSymbolType(symbolType)\r\n\r\n return {\r\n ...EMPTY_FORM_ENTRY,\r\n uuid: getUuid() as string,\r\n ticker,\r\n type: getSymbolType(ticker),\r\n date: getFormattedDate(PORTFOLIO_DATE_FORMAT_DATA),\r\n transaction: [PortfolioTransaction.Watch, ...allowedTransactions].includes(transaction)\r\n ? transaction\r\n : allowedTransactions[0],\r\n shares: transaction === PortfolioTransaction.Watch || symbolType === PortfolioSymbolType.Cash ? 0 : undefined,\r\n price: transaction === PortfolioTransaction.Watch ? 0 : undefined,\r\n }\r\n}\r\n\r\nexport function getPortfolioInitData() {\r\n let returnData = { isInitData: false, initData: api.EMPTY_RESPONSE }\r\n const initDataElement = document.getElementById('portfolio-init-data')\r\n if (initDataElement) {\r\n const initData = parseInitData('portfolio-init-data')\r\n initDataElement.remove()\r\n returnData = { isInitData: !!initData, initData: initData ?? api.EMPTY_RESPONSE }\r\n }\r\n return returnData\r\n}\r\n\r\nconst EMPTY_TRANSACTION = { transaction: PortfolioTransaction.Watch, index: 0, price: 0 }\r\n\r\nexport function getTradesStructureData(portfolioData: PortfolioGroup[]) {\r\n return portfolioData\r\n .flatMap((ticker) => {\r\n const transactions = [...ticker.transactions]\r\n if (transactions.length === 0) {\r\n transactions.push(EMPTY_TRANSACTION as unknown as PortfolioEntryTransaction)\r\n }\r\n return transactions.map((transaction) => {\r\n const obj = { ...ticker } as Omit & {\r\n transactions?: PortfolioEntryTransaction[]\r\n }\r\n delete obj.transactions\r\n return { ...obj, ...transaction }\r\n })\r\n })\r\n .sort((a, b) => a.id - b.id)\r\n}\r\n\r\nexport function getSymbolType(symbol?: string) {\r\n if (symbol?.toUpperCase() === PORTFOLIO_CASH_SYMBOL) return PortfolioSymbolType.Cash\r\n\r\n return PortfolioSymbolType.Stock\r\n}\r\n\r\nexport function isStockTransaction(transaction: PortfolioTransaction) {\r\n return STOCK_TRANSACTIONS.includes(transaction)\r\n}\r\n\r\nexport function isCashTransaction(transaction: PortfolioTransaction) {\r\n return CASH_TRANSACTIONS.includes(transaction)\r\n}\r\n\r\nexport function getTransactionsForSymbolType(symbolType: PortfolioSymbolType) {\r\n switch (symbolType) {\r\n case PortfolioSymbolType.Cash:\r\n return CASH_TRANSACTIONS\r\n default:\r\n return STOCK_TRANSACTIONS\r\n }\r\n}\r\n\r\nexport function getPortfolioRefreshInterval() {\r\n return getMapsRefreshInterval({\r\n base: PORTFOLIO_REFRESH_INTERVAL_ELITE,\r\n free: PORTFOLIO_REFRESH_INTERVAL_FREE,\r\n })\r\n}\r\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n"],"names":["CanvasHover","Component","state","visibleTickers","activeNode","undefined","sparklinesData","componentDidMount","MapStore","this","_onChange","document","addEventListener","_onMouseMove","componentWillUnmount","MapActions","removeEventListener","componentDidUpdate","_","prevState","name","includes","push","tickersToLoad","filter","ticker","length","props","mapType","mapNodeId","setState","getVisibleTooltipTickers","_formatPerf","d","additional","perf","treemap","formatValue","toFixed","render","hasSparkline","price","colorScale","type","children","parent","node","sort","a","b","dx","dy","isSmall","title","MapTypeId","_jsxs","id","_jsx","className","style","backgroundColor","data","nameOverride","Sparkline","width","height","classnames","description","colSpan","map","c","color","e","marginLeft","el","getElementById","hoverWidth","scrollWidth","hoverHeight","scrollHeight","availWidth","documentElement","clientWidth","availHeight","clientHeight","clientX","left","top","Math","max","clientY","Canvas","React","static","zoom","legend","hover","zoomOnWheel","dataTimestamp","initialized","updateTimestamp","_canvas","_hoverCanvas","_canvasContext","_hoverContext","_cache","mouseDown","lastPanX","lastPanY","worldBackground","constructor","event","super","bind","mapActionCreators","_getPublishCanvas","_initialize","_setCanvasSize","getZoomLevels","forEach","zoomLevel","_createCache","x","y","translate","renderFromCache","renderHover","current","_onWheel","alt","ref","onMouseDown","_onMouseDown","onMouseMove","onMouseUp","_onMouseUp","onMouseLeave","_onMouseLeave","onDoubleClick","_onDoubleClick","Legend","scale","context","tx","ty","zoomLevels","nearestSize","i","len","level","canvas","save","drawImage","restore","translateAbs","offsetX","offsetY","getOffset","nodeAtPosition","getNodeAtPosition","getIndustryAtPosition","MapActionCreators","industryAtPosition","sectorAtPosition","getSectorAtPosition","onNodeClick","industry","sector","preventDefault","deltaY","_onPanStart","pointers","_onPanMove","movementX","movementY","_onPinch","offsetX1","target","offsetLeft","offsetParent","offsetY1","offsetTop","direction","_setCanvasContexts","canvasContext","getContext","hoverContext","retinafy","async","renderLevel","zoomLevelIndex","setTimeout","hoverCanvas","hammertime","Hammer","get","set","enable","threshold","on","passive","image","_getTreemapGeoBackground","loadImage","default","getIsSmall","classList","contains","oldScale","oldTranslate","cacheCanvas","createElement","cacheContext","renderCanvas","settings","clearRect","apply","showIndustryHeader","LayoutGenerator","depth","NodeDepth","industryOffset","padding","header","strokeStyle","border","lineWidth","strokeRect","beginPath","moveTo","lineTo","stroke","renderIndustryHeader","config","fill","background","renderNodeText","fillStyle","fillRect","naturalWidth","naturalHeight","index","sectors","industries","nodes","renderStockNode","isLargeNode","isGeoMap","renderBackground","Number","isFinite","renderSectorBorders","boxover","tooltip","scaleMin","scaleMax","getScaleMinMax","steps","diff","step","round","stepWidth","indexOf","format","scaleStepFormat","minWidth","textShadow","toString","MapContext","setTreemap","setGenerator","useMapContext","MapContextProvider","generator","Provider","value","Map","_ref","isLoadingData","isFetchingPerf","subtype","showETF","truncateNodeName","prevTreemap","containerRef","hasRendered","setHasRendered","mapUtils","size","mapSettings","window","MAP_EXPORT","Treemap","getLayout","scaleId","countIndustryPerf","countSectorPerf","updateTimeoutRef","layout","clearTimeout","containerElement","resize","throttle","Delayed","delayComponent","Spinner","QueryClientContext","fallback","Loading","BrowserRouter","MapSelectTheme","MapSelect","label","ariaLabel","theme","selectTheme","dark","button","rounding","contentClass","rightContent","popover","light","getMapSelectTheme","Select","placeholder","listProps","onChange","hasPopoverButtonWidthLimit","items","SelectOption","filterItems","stocks","arguments","input","stock","toUpperCase","slice","useSearch","setValue","results","setResults","onInputChange","onItemClick","cx","cy","diffX","diffY","getLastZoomLevel","onResultMouseLeave","SearchInput","Input","leftContent","SearchResult","result","onClick","Button","Expand","onExpand","body","EXPANDED_MAP_BODY_CLASSS","remove","gtag","event_category","add","layoutOptions","scrollTo","isMobile","isIpad","Share","uploadImage","useMutation","api","onShareClick","mapStore","drawShareMap","getFormattedDateString","mutate","ShareDialog","useZoomButtons","zoomOut","ev","zoomIn","Zoom","handlers","_Fragment","SVG","Topbar","navContent","mapControls","useMapData","cacheBuster","mapBaseData","fetchBaseData","fetchPerfData","queryClient","useQueryClient","dataVersion","prevType","perfData","setQueryData","baseDataQuery","useQuery","queryKey","queryFn","initialData","cacheTime","Infinity","staleTime","perfDataQuery","prevPerf","getQueryData","FALLBACK_PERF_RESPONSE","version","keepPreviousData","refetchInterval","onSuccess","location","reload","restoredData","useMapType","query","URLSearchParams","useLocation","search","typeFromQuery","subtypeFromQuery","MAP_TYPES","t","subtypes","find","MapTypeList","linkClass","linkClassName","isActiveTreemap","activeType","activeSubtype","MapSubtypeId","append","NavLink","to","pageTitle","tracking","isLoading","navigate","useNavigate","mapData","initData","hasInvestingChannelAds","useInvestingChannelAds","isNewSubtype","setIsNewSubtype","isFetching","isLoadingInitialBaseData","isPreviousData","isLoadingInitialPerf","isInitialLoading","isFetchingNewPerf","as","href","Paragraph","buttonContent","item","newSubtype","delete","stringQuery","pathname","replace","inputClass","AdTag","position","ErrorBoundary","resetKeys","FallbackComponent","DefaultErrorBoundary","root","ReactDOM","App","mapProps","parseJSONFromScript","precomputedData","FinvizSettings","hasRedesignEnabled","isDark","perfDataSec","MAP_SUBTYPES_COMPANIES_BY_ID","sec","SettingsSmallDark","SettingsSmall","FinvizIndexSecMap","perfDataGeo","geo","SettingsSmallGeoDark","SettingsSmallGeo","FinvizIndexGeoMap","renderTreemaps","apiRequest","rev","mapPerf","st","mapPerfScreener","uploadMap","method","headers","ContentType","file","_targetScale","updateVisibleSparklines","hoveredNode","debouncedLoadSparklines","_lastSparklinesRequest","debounce","tickers","AppDispatcher","ActionTypes","cancel","join","error","trailing","setHoveredNode","loadSparklineData","loadSparklinesCancel","resetSparklineData","changeTranslate","getNextZoomLevel","animate","requestAnimationFrame","getPreviousZoomLevel","zoomAndTranslate","updateLayout","updateData","updateDimensions","updatePerfData","updatePerf","timestamp","getDate","_setOnPublish","getPublishCanvas","setupWidget","isWidget","Dispatcher","handleServerAction","action","payload","source","PayloadSources","dispatch","handleViewAction","keyMirror","RENDER_TREEMAP","CHANGE_TRANSLATE","SET_HOVERED_NODE","LOAD_SPARKLINES_STARTED","LOAD_SPARKLINES_COMPLETED","LOAD_SPARKLINES_FAILED","RESET_SPARKLINE_DATA","INIT_STARTED","INIT_FAILED","UPDATE_DATA","SET_PUBLISH_CANVAS","SET_WIDGET","SERVER_ACTION","VIEW_ACTION","Store","EventEmitter","emitChange","emit","CHANGE_EVENT","addChangeListener","callback","removeChangeListener","removeListener","_hoveredNode","_mapNodeId","_dataVersion","_dataTimestamp","_sparklinesData","_isWidget","getHoveredNode","getSparklines","getDataVersion","getDataTimestamp","dispatchToken","fontSizesWidths","f","g","h","j","k","l","m","n","o","p","q","r","s","u","v","w","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","fontSizeLineHeights","zoomElement","zoomSelection","d3","behavior","translateExtent","zoomExtent","dimensions","extent","scaleExtent","call","getTransform","newZoom","mapCenter","scaleTo","args","Array","isArray","translateBy","translateTo","fontFamily","getTextFontFamily","getUuid","getColorScale","_updateIndustryPerf","_updateSectorPerf","Date","ScaleId","minValuePerf","abs","perfWeek","maxValuePerf","perfMax","minValueNode","maxValueNode","valueMax","valueToUse","isNaN","numberOfDigits","floor","log10","roundedBound","ceil","scaleMinMax","minDomain","maxDomain","gradient","gradients","gradientSmall","linearScale","domain","range","colors","nullColor","min","getParentSector","nodeName","parentSector","updatedNode","_resetIndustryPerf","weightedPriceSum","marketCapSum","marketCap","everyStockUndefined","_getNodeTopOffset","isSmallSecMap","leftPadding","topPadding","isFirstNodeInIndustry","getNodeText","fontSizes","scaleFontSizes","nodeTopOffset","nodeHeight","nodeNameFontSize","findMaxFontSizeForText","getLongestText","fontSizePadding","nodeNameLineHeight","stepFormat","perfText","getSymbolType","PortfolioSymbolType","fontPairs","fontSizePairs","allowedSize","perfFontSize","perfLineHeight","textHeight","topOffset","fontSize","text","maxWidth","widths","substring","actualZoomLevel","floatValue","parseFloat","absValue","isPositiveScaleOnly","formated","nodeText","textBaseline","textAlign","nodeY","nodeDY","textX","nameY","perfTextY","offset","font","fillText","getSpacingWithDefaults","spacing","right","bottom","_ref2","parrentPadding","margin","_ref3","fontWeight","AdTagName","tagDefinition","IC_TickerInContent","placements","minHeight","IC_MapsLeftRail","IC_Statements","IC_Groups","getInvestingChannelPage","page","create","InvestingChannelQueue","InvestingChannel","UAT","Run","console","destroy","deps","tagName","tagProps","placementName","queryOptions","client","QueryClient","defaultOptions","queries","useErrorBoundary","refetchOnWindowFocus","QueryClientProvider","withQueryClientContext","hocComponent","displayName","dialogState","useDialogState","DialogTrigger","Dialog","DialogHeader","onCloseClick","hide","DialogBody","ShareDialogBody","isError","DialogFooter","ErrorView","showRefresh","message","src","imgUrl","CopyToClipboard","Heading","shareUrl","bottomLeftContent","FacebookShareButton","url","FacebookIcon","TwitterShareButton","via","TwitterIcon","PropTypes","isRequired","shouldComponentUpdate","nextProps","line","curve","transform","canvasEl","ratio","getScaleRatio","logo","logoBase64","textWidth","measureText","divider","toDataURL","Promise","resolve","reject","Image","onload","onerror","doc","isValidElement","getAttribute","Sentry","captureMessage","extra","JSON","parse","textContent","captureException","devicePixelRatio","RedGreenText","rightClass","hasValue","Icon","RedGreenMultiline","child","Table","TableHead","TableBody","TableFooter","TableAlign","TableCell","isFirst","isLast","align","Left","hasPadding","Center","Right","TableSortIndicator","isActive","invisible","TableHeader","asComponent","hasHover","componentToRender","disabled","TableHeaderSortable","isDisabled","TableRow","isHoverable","SortDirection","getDefaultSort","columns","defaultSort","column","Ascending","isSortByShape","getDefaultSortFromUrl","order","idKey","isDesc","startsWith","queryParam","Descending","useTableSort","valueGetter","options","setSort","changeSort","newSort","prevSort","useSortData","sortBy","useTableSortWithUrl","urlPersistKey","sortedData","changeSortState","searchParams","setSearchParams","useSearchParams","defaultSortRef","prev","newParams","previousOrder","isDescOrder","saveSortToUrl","preventScrollReset","delay","timeout","throwOnTimeout","timeoutComponent","showContact","link","LoadingScreen","hasOwnProperty","getDefaultValueGetter","row","getValueForSort","sortByColumn","columnMap","Object","freeze","ColumnId","urlSort","renderColumn","kind","RowKind","isDelisted","stopPropagation","transactions","company","transaction","PortfolioTransaction","formatNumber","costAvg","lastClose","prevClose","lastChange","showPlusSign","fractions","lastChangePct","lastVolume","TRANSACTION_LABEL","classNames","dateFns","date","PORTFOLIO_DATE_FORMAT_VIEW","shares","valuePaid","valueMarket","gainMarketUsd","gainMarketPct","gainTodayUsd","values","PORTFOLIO_CASH_SYMBOL","PORTFOLIO_DATE_FORMAT_DATA","PORTFOLIO_REFRESH_INTERVAL_ELITE","PORTFOLIO_REFRESH_INTERVAL_FREE","STOCK_TRANSACTIONS","CASH_TRANSACTIONS","EMPTY_FORM_ENTRY","EMPTY_TRANSACTION","valueMarketPrev","gainMarket","PORTFOLIO_INPUT_NAME","PORTFOLIO_INPUT_EMPTY_ERROR","PORTFOLIO_INPUT_EXISTS_ERROR","TICKERS_INPUT_NAME","TICKERS_INPUT_FORMAT_TIP","EMPTY_RESPONSE","limit","selectedPortfolio","limitTransactions","portfolio","news","portfolios","portfolioData","portfolioId","pid","deletePortfolio","portfolioEntry","stringify","QUOTE_INVALID_TICKER_REQUEST","QUOTE_INVALID_TICKER_RESPONSE","quoteData","validateTickers","response","json","parsedTickers","split","specialTickers","keys","specialSymbols","recalculatePortfolio","rows","numberOfTransactions","totalValue","getSanitizedTicker","trim","pricePerColumn","prices","requestTickers","requestTickersLength","responseLength","tickerPrices","fromEntries","tickerPrice","NaN","calculatedPrice","calculatedShares","submitForm","ErrorSource","portfolioTickers","portfolioName","assign","portfolio_name","submitEditForm","reorderPortfolios","PortfolioQuery","PortfolioMapSizeKey","PortfolioView","PortfolioTableView","PortfolioTableViewLabels","Ticker","Trade","ActionKind","PortfolioDataKey","industryLabelKey","groupPrefix","groupLabel","LOCAL_STORAGE_KEY","DEFAULT_SETTINGS","tableView","showMap","showIndustries","tableOrder","parseBoolFromValue","Boolean","getMapSettingFromLocalStorage","savedSettings","storage","saveMapSettingToLocalStorage","key","itemToStore","customTickersOrder","SUMMARY_DEFAULT","valueMarketStocks","valueMarketStocksPrev","getSummary","reduce","flattenAndDedupe","group","entry","isMapTransaction","previouslyAdded","findIndex","newEntry","prevEntry","getIndustries","groupByKey","list","hash","obj","concat","getPerfForTicker","getMapData","groupByIndustry","hasData","parsedData","gain","Cash","ShortGainers","ShortLosers","LongGainers","LongLosers","getEntryGroup","subtypePerf","getPerfText","some","arr","groupName","isLong","isGainer","longPrefix","shortGainers","shortLosers","shortPrefix","longGainers","longLosers","createGroup","category","parsePortfolioQuery","params","defaultPortfolioId","currentPortfolio","parseInt","entries","view","getColumnsByKeys","getFormattedDate","validateEditRow","dateFormat","checkFormat","formErrors","parseInputAsDate","isValid","errors","FORM_ENTRY_KEYS","getBulkEditData","acc","existingId","resetCash","getNewTransaction","uuid","serializeFormData","serializer","flatMap","appendRowToFormData","validateFormData","validateFields","validatedTickers","validationResult","hasInvalidEntries","isInvalidTicker","getNumberValue","symbolType","allowedTransactions","getTransactionsForSymbolType","getPortfolioInitData","returnData","isInitData","initDataElement","parseInitData","getTradesStructureData","symbol","getPortfolioRefreshInterval","getMapsRefreshInterval","base","free","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","module","exports","shim","propName","componentName","propFullName","secret","err","Error","getShim","ReactPropTypes","array","bigint","bool","func","number","object","string","any","arrayOf","element","elementType","instanceOf","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes"],"sourceRoot":""}