{"version":3,"file":"6785.a89a3ccc.js","mappings":"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,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,MACLnsB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACHktB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHpe,EAAG,MACHqe,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH5E,EAAG,MACHkL,EAAG,MACHC,EAAG,MACHC,EAAG,MACHlmB,EAAG,KACHC,EAAG,MACHkmB,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,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,GAAI,CACF,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,EAAG,IACH,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACLnsB,EAAG,MACHC,EAAG,IACHsB,EAAG,KACHrF,EAAG,IACHM,EAAG,MACHktB,EAAG,MACHC,EAAG,MACHC,EAAG,MACHpe,EAAG,KACHqe,EAAG,KACHC,EAA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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/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/constants/constants.ts","webpack://@finviz/website/./js/app/maps/constants/generator.ts","webpack://@finviz/website/./js/app/maps/constants/settings.ts","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/layout-generator.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/maps/types.ts","webpack://@finviz/website/./js/app/maps/utils.ts","webpack://@finviz/website/./js/app/screener/utils.ts","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/isStockFastRefreshAvailable.ts","webpack://@finviz/website/./js/app/shared/tracking.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/delayed.tsx","webpack://@finviz/website/./js/main/components/icon/svg.tsx","webpack://@finviz/website/./js/main/components/loading.tsx","webpack://@finviz/website/./js/main/components/notification/hooks.ts","webpack://@finviz/website/./js/main/components/notification/notification-wrapper.tsx","webpack://@finviz/website/./js/main/components/notification/with-notification-context.tsx","webpack://@finviz/website/./js/main/components/notification/notification.tsx","webpack://@finviz/website/./js/main/hooks/use-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","webpack://@finviz/website/../node_modules/react-router-dom/dist/index.js","webpack://@finviz/website/../node_modules/react-share/es/FacebookIcon.js","webpack://@finviz/website/../node_modules/react-share/es/FacebookShareButton.js","webpack://@finviz/website/../node_modules/react-share/es/TwitterIcon.js","webpack://@finviz/website/../node_modules/react-share/es/TwitterShareButton.js","webpack://@finviz/website/../node_modules/react-share/es/hocs/createIcon.js","webpack://@finviz/website/../node_modules/react-share/es/ShareButton.js","webpack://@finviz/website/../node_modules/react-share/es/hocs/createShareButton.js","webpack://@finviz/website/../node_modules/react-share/es/utils/assert.js","webpack://@finviz/website/../node_modules/react-share/es/utils/objectToGetParams.js","webpack://@finviz/website/../node_modules/@tanstack/query-core/build/lib/mutationObserver.mjs","webpack://@finviz/website/../node_modules/@tanstack/react-query/build/lib/useMutation.mjs"],"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 classNames from 'classnames'\r\nimport Hammer from 'hammerjs'\r\nimport * as React from 'react'\r\n\r\nimport { isFirefoxDesktop } from '../../shared/isMobile'\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\ninterface CanvasState {\r\n zoom: number\r\n initialized: boolean\r\n type: MapTypeId\r\n dataHash: string\r\n width: number\r\n height: number\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: CanvasState = {\r\n zoom: 1,\r\n initialized: false,\r\n type: this.props.treemap.type,\r\n dataHash: this.props.treemap.dataHash,\r\n width: this.props.treemap.width,\r\n height: this.props.treemap.height,\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 animationFrameId: number | null = null\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 if (!this.state.initialized) return\r\n\r\n const { treemap } = this.props\r\n const { dataHash, type } = this.state\r\n\r\n // Nothing changed from outside, so we just render the current view\r\n if (\r\n // Data update\r\n treemap.dataHash === dataHash &&\r\n // Type update\r\n type === treemap.type &&\r\n // Window Resize\r\n treemap.width === this.state.width &&\r\n treemap.height === this.state.height\r\n ) {\r\n this.renderFromCache(this._canvasContext)\r\n this.renderHover(this._hoverContext)\r\n return\r\n }\r\n\r\n this._setCanvasSize(treemap.width, treemap.height)\r\n\r\n if (treemap.type === MapTypeId.World) {\r\n this._loadTreemapGeoBackground().then(() => this._updateCanvasCaches(treemap))\r\n } else {\r\n this._updateCanvasCaches(treemap)\r\n }\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 { initialized } = this.state\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(context: CanvasRenderingContext2D) {\r\n const { treemap } = this.props\r\n const { zoom } = this.state\r\n const [x, y] = treemap.zoom.translate()\r\n const nearestSize = treemap.zoom.getNearestSize(zoom)\r\n\r\n // Last resort if the cache doesn’t exist\r\n if (!this._cache[nearestSize]) this._createCache(nearestSize)\r\n\r\n context.save()\r\n context.drawImage(this._cache[nearestSize].canvas, ~~x, ~~y, ~~(treemap.width * zoom), ~~(treemap.height * zoom))\r\n context.restore()\r\n }\r\n\r\n _onChange() {\r\n const { treemap } = this.props\r\n\r\n this.setState({ zoom: treemap.zoom.scale() })\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', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\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', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\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 const zoomLevels = treemap.getZoomLevels()\r\n var render = () => {\r\n this._createCacheWithPriority(zoomLevels, zoomLevels[0], () => {\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 if (treemap.type === MapTypeId.World) {\r\n await this._loadTreemapGeoBackground()\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 return FinvizSettings.hasDarkTheme\r\n ? import('../assets/map_geo_small_dark@2x.png')\r\n : 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 async _loadTreemapGeoBackground() {\r\n try {\r\n const image = await this._getTreemapGeoBackground()\r\n this.worldBackground = await loadImage(image.default)\r\n } catch {}\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', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\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 _updateCanvasCaches(treemap: Treemap) {\r\n this._createCacheWithPriority(treemap.getZoomLevels(), treemap.zoom.getNearestSize(), () => {\r\n this.setState((prevState) => ({\r\n dataHash: treemap.dataHash,\r\n width: treemap.width,\r\n height: treemap.height,\r\n type: treemap.type,\r\n zoom: treemap.type !== prevState.type ? 1 : prevState.zoom,\r\n }))\r\n\r\n // Reset zoom if we’re changing map type\r\n if (this.state.type !== treemap.type) {\r\n mapActionCreators.setHoveredNode(treemap.mapNodeId, undefined)\r\n mapActionCreators.resetSparklineData()\r\n }\r\n\r\n this.renderFromCache(this._canvasContext)\r\n })\r\n }\r\n\r\n _createCacheWithPriority(zoomLevels: number[], currentZoom: number, callback?: () => void) {\r\n if (this.animationFrameId) window.cancelAnimationFrame(this.animationFrameId)\r\n\r\n const remainingLevels = zoomLevels.filter((level) => level !== currentZoom)\r\n this.animationFrameId = requestAnimationFrame(() => {\r\n this._createCache(currentZoom)\r\n callback?.()\r\n this._queueUpdateCache(remainingLevels)\r\n })\r\n }\r\n\r\n _queueUpdateCache(scales: number[], currentScale = 0) {\r\n if (!scales[currentScale]) return\r\n\r\n this.animationFrameId = requestAnimationFrame(() => {\r\n this._createCache(scales[currentScale])\r\n this._queueUpdateCache(scales, currentScale + 1)\r\n })\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.getNearestSize()\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 dataHash?: string\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 dataHash,\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 || !dataHash || 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 dataHash,\r\n zoomLevels: zoom === false ? [1] : undefined,\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 if (!dataHash || treemap.dataHash === dataHash) return\r\n\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 dataHash,\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, dataHash])\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 dataHash: treemap.dataHash,\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 { 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 dataHash: treemap.dataHash,\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 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 { MapSubtype, MapSubtypeId, MapType, MapTypeId, PerfData, ScaleId } from '../types'\r\n\r\nexport const EXPANDED_MAP_BODY_CLASSS = 'is-map-expanded'\r\nexport const FALLBACK_PERF_RESPONSE: PerfData = { nodes: {}, additional: {}, subtype: MapSubtypeId.DayPerf, hash: '' }\r\n\r\nexport const MAP_SUBTYPES_COMPANIES_BY_ID: Record = {\r\n [MapSubtypeId.DayPerf]: {\r\n id: MapSubtypeId.DayPerf,\r\n name: '1 Day Performance',\r\n scaleId: ScaleId.DayPerf,\r\n tooltip:\r\n \"Color indicates today's stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.WeekPerf]: {\r\n id: MapSubtypeId.WeekPerf,\r\n name: '1 Week Performance',\r\n scaleId: ScaleId.WeekPerf,\r\n tooltip:\r\n 'Color indicates weekly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.MonthPerf]: {\r\n id: MapSubtypeId.MonthPerf,\r\n name: '1 Month Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n 'Color indicates monthly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ThreeMonthPerf]: {\r\n id: MapSubtypeId.ThreeMonthPerf,\r\n name: '3 Months Performance',\r\n scaleId: ScaleId.ThreeMonthPerf,\r\n tooltip:\r\n 'Color indicates quarterly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.SixMonthPerf]: {\r\n id: MapSubtypeId.SixMonthPerf,\r\n name: '6 Months Performance',\r\n scaleId: ScaleId.SixMonthPerf,\r\n tooltip:\r\n 'Color indicates half-yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearPerf]: {\r\n id: MapSubtypeId.YearPerf,\r\n name: '1 Year Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearToDatePerf]: {\r\n id: MapSubtypeId.YearToDatePerf,\r\n name: 'Year To Date Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates year to date stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.RelativeVolume]: {\r\n id: MapSubtypeId.RelativeVolume,\r\n name: 'Relative Volume',\r\n scaleId: ScaleId.RelativeVolume,\r\n tooltip:\r\n \"Color indicates the stock's relative volume, ratio between today's and average volume. Values above 1.5 show strong volume, values below 0.5 indicate weak volume.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToEarnings]: {\r\n id: MapSubtypeId.PriceToEarnings,\r\n name: 'P/E',\r\n scaleId: ScaleId.PriceToEarnings,\r\n tooltip: \"Color indicates the stock's price-to-earnings ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ForwardPriceToEearnings]: {\r\n id: MapSubtypeId.ForwardPriceToEearnings,\r\n name: 'Forward P/E',\r\n scaleId: ScaleId.ForwardPriceToEearnings,\r\n tooltip: \"Color indicates the stock's forward price-to-earnings ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceEarningsToGrowth]: {\r\n id: MapSubtypeId.PriceEarningsToGrowth,\r\n name: 'PEG',\r\n scaleId: ScaleId.PriceEarningsToGrowth,\r\n tooltip: \"Color indicates the stock's price-to-earnings-to-growth ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToSellsRatio]: {\r\n id: MapSubtypeId.PriceToSellsRatio,\r\n name: 'P/S',\r\n scaleId: ScaleId.PriceToSellsRatio,\r\n tooltip: \"Color indicates the stock's price-to-sales ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.PriceToBookRatio]: {\r\n id: MapSubtypeId.PriceToBookRatio,\r\n name: 'P/B',\r\n scaleId: ScaleId.PriceToBookRatio,\r\n tooltip: \"Color indicates the stock's price-to-book ratio.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.DividendYield]: {\r\n id: MapSubtypeId.DividendYield,\r\n name: 'Dividend Yield',\r\n scaleId: ScaleId.DividendYield,\r\n tooltip: \"Color indicates the stock's dividend yield.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.EPSGrowth5y]: {\r\n id: MapSubtypeId.EPSGrowth5y,\r\n name: 'EPS Growth Past 5 Years',\r\n scaleId: ScaleId.EPSGrowth5y,\r\n tooltip: \"Color indicates the stock's annual earnings (EPS) growth over past 5 years.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.FloatShort]: {\r\n id: MapSubtypeId.FloatShort,\r\n name: 'Float Short',\r\n scaleId: ScaleId.FloatShort,\r\n tooltip: \"Color indicates percent of the stock's float sold short.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.AnalystRecommendation]: {\r\n id: MapSubtypeId.AnalystRecommendation,\r\n name: 'Analysts Recom.',\r\n scaleId: ScaleId.AnalystRecommendation,\r\n tooltip:\r\n \"Color indicates the analyst's recommendations for given stocks. The rating is based on a 1-5 scale, ranging from a strong-buy, to a strong-sell.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.EarningsPerf]: {\r\n id: MapSubtypeId.EarningsPerf,\r\n name: 'Earnings Day Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n \"Color indicates stock's performance on earnings day. Next day performance for earnings reported after market close.\",\r\n countIndustryPerf: false,\r\n countSectorPerf: false,\r\n },\r\n [MapSubtypeId.EarningsDate]: {\r\n id: MapSubtypeId.EarningsDate,\r\n name: 'Earnings Date',\r\n scaleId: ScaleId.EarningsDate,\r\n tooltip: \"Color indicates stock's earnings date.\",\r\n countIndustryPerf: false,\r\n countSectorPerf: false,\r\n },\r\n}\r\n\r\nexport const MAP_SUBTYPES_ETF_BY_ID = {\r\n [MapSubtypeId.DayPerf]: {\r\n id: MapSubtypeId.DayPerf,\r\n name: '1 Day Performance',\r\n scaleId: ScaleId.DayPerf,\r\n tooltip:\r\n \"Color indicates today's stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.WeekPerf]: {\r\n id: MapSubtypeId.WeekPerf,\r\n name: '1 Week Performance',\r\n scaleId: ScaleId.WeekPerf,\r\n tooltip:\r\n 'Color indicates weekly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.MonthPerf]: {\r\n id: MapSubtypeId.MonthPerf,\r\n name: '1 Month Performance',\r\n scaleId: ScaleId.MonthPerf,\r\n tooltip:\r\n 'Color indicates monthly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.ThreeMonthPerf]: {\r\n id: MapSubtypeId.ThreeMonthPerf,\r\n name: '3 Months Performance',\r\n scaleId: ScaleId.ThreeMonthPerf,\r\n tooltip:\r\n 'Color indicates quarterly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.SixMonthPerf]: {\r\n id: MapSubtypeId.SixMonthPerf,\r\n name: '6 Months Performance',\r\n scaleId: ScaleId.SixMonthPerf,\r\n tooltip:\r\n 'Color indicates half-yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearPerf]: {\r\n id: MapSubtypeId.YearPerf,\r\n name: '1 Year Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates yearly stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.YearToDatePerf]: {\r\n id: MapSubtypeId.YearToDatePerf,\r\n name: 'Year To Date Performance',\r\n scaleId: ScaleId.YearPerf,\r\n tooltip:\r\n 'Color indicates year to date stock performance in percent. Based on the color you can identify losers (red), neutral (black), and gainers (green).',\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n [MapSubtypeId.RelativeVolume]: {\r\n id: MapSubtypeId.RelativeVolume,\r\n name: 'Relative Volume',\r\n scaleId: ScaleId.RelativeVolume,\r\n tooltip:\r\n \"Color indicates the stock's relative volume, ratio between today's and average volume. Values above 1.5 show strong volume, values below 0.5 indicate weak volume.\",\r\n countIndustryPerf: true,\r\n countSectorPerf: true,\r\n },\r\n}\r\n\r\nexport const MAP_SUBTYPES_COMPANIES: MapSubtype[] = Object.values(MAP_SUBTYPES_COMPANIES_BY_ID)\r\n\r\nexport const MAP_SUBTYPES_ETF: MapSubtype[] = Object.values(MAP_SUBTYPES_ETF_BY_ID)\r\n\r\nexport const MAP_TYPES: MapType[] = [\r\n {\r\n name: 'S&P 500',\r\n pageTitle: 'S&P 500 Map',\r\n description:\r\n \"Standard and Poor's 500 index stocks categorized by sectors and industries. Size represents market cap.\",\r\n type: MapTypeId.Sector,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'World',\r\n pageTitle: 'World Map',\r\n description:\r\n 'Foreign ADR stocks listed on NYSE, NASDAQ, AMEX categorized by geo location. Size represents market cap.',\r\n type: MapTypeId.World,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'Full',\r\n pageTitle: 'Stock Market Map',\r\n description:\r\n 'All stocks listed on US stock exchanges, categorized by sectors and industries. Size represents market cap.',\r\n type: MapTypeId.SectorFull,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n },\r\n {\r\n name: 'Exchange Traded Funds',\r\n pageTitle: 'ETF Map - Exchange Traded Funds Map',\r\n nameShort: 'ETF',\r\n description: 'ETFs categorized by sectors and styles. Size represents 3-month average dollar volume, $1M minimum.',\r\n type: MapTypeId.ETF,\r\n subtypes: MAP_SUBTYPES_ETF,\r\n },\r\n]\r\n\r\nexport const MAP_TYPE_SCREENER = {\r\n name: 'Screener',\r\n pageTitle: 'Screener Map',\r\n description:\r\n 'All stocks listed on US stock exchanges, categorized by sectors and industries. Size represents market cap.',\r\n type: MapTypeId.Screener,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n}\r\n\r\nexport const MAP_TYPE_ETF_HOLDINGS_WIDGET = {\r\n name: 'ETF Holdings',\r\n pageTitle: '',\r\n description: '',\r\n type: MapTypeId.ETFHoldings,\r\n subtypes: MAP_SUBTYPES_COMPANIES,\r\n}\r\n","export type MapOrder = Record\r\n\r\nexport const MAP_MIN_WIDTH = 700\r\nexport const MAP_MIN_HEIGHT = 388\r\nexport const SECTOR_MIN_HEIGHT = 5\r\nexport const LEGEND_HEIGHT = 79\r\n\r\nexport const LARGE_MAP_HEIGHT_RATIO = 1.8\r\nexport const SMALL_MAP_GEO_HEIGHT_RATIO = 1.7\r\nexport const SMALL_MAP_HEIGHT_RATIO = 1.085 // old design ratio - 1.33\r\n\r\n// Minimal size of node to display header\r\nexport const LARGE_NODE_SIZE = {\r\n dx: 40,\r\n dy: 12,\r\n}\r\n\r\n// Don't display header if node height - header is smaller than this\r\nexport const LARGE_NODE_MIN_HEIGHT = 5\r\n\r\nexport const ORDER_SP500: MapOrder = {\r\n Technology: 10,\r\n Financial: 11,\r\n 'Communication Services': 9,\r\n Healthcare: 4,\r\n 'Consumer Cyclical': 6,\r\n 'Consumer Defensive': 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n\r\n // Industries\r\n 'Software - Infrastructure': 2,\r\n Semiconductors: 1,\r\n}\r\n\r\nexport const ORDER_SEC_ALL: MapOrder = {\r\n Financial: 10,\r\n Technology: 9,\r\n 'Communication Services': 8,\r\n 'Consumer Cyclical': 7,\r\n 'Consumer Defensive': 6,\r\n Healthcare: 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n\r\n // Industries\r\n 'Software - Infrastructure': 2,\r\n Semiconductors: 1,\r\n}\r\nexport const ORDER_ETF: MapOrder = {\r\n US: 11,\r\n 'US Sector': 10,\r\n 'US Large Cap': 9,\r\n 'US Mid Cap': 8,\r\n 'US Small Cap': 7,\r\n 'US Volatility': 6,\r\n Global: 5,\r\n International: 3,\r\n 'Fixed Income': 2,\r\n Commodity: 4,\r\n Strategy: 1,\r\n Forex: 0,\r\n}\r\n\r\nexport const ORDER_SCREENER: MapOrder = {\r\n Technology: 10,\r\n Financial: 9,\r\n 'Communication Services': 8,\r\n Healthcare: 7,\r\n 'Consumer Cyclical': 6,\r\n 'Consumer Defensive': 5,\r\n Industrials: 4,\r\n 'Real Estate': 3,\r\n Energy: 2,\r\n Utilities: 1,\r\n 'Basic Materials': 0,\r\n}\r\n\r\nexport const ORDER_SCREENER_ETF: MapOrder = {\r\n ...ORDER_SCREENER,\r\n Financial: 1000,\r\n}\r\n\r\nexport const ORDER_WORLD: MapOrder = {\r\n Ireland: 20,\r\n 'United Kingdom': 19,\r\n Spain: 18,\r\n France: 17,\r\n Belgium: 16,\r\n Netherlands: 15,\r\n Switzerland: 14,\r\n\r\n China: 21,\r\n Japan: 20,\r\n India: 19,\r\n 'Hong Kong': 18,\r\n 'South Korea': 15,\r\n Taiwan: 14,\r\n\r\n Colombia: 30,\r\n Chile: 29,\r\n Argentina: 28,\r\n}\r\n\r\nexport const WORLD_INDUSTRIES = [\r\n {\r\n x: 4,\r\n y: 0,\r\n dx: 240,\r\n dy: 226,\r\n name: 'Canada',\r\n countries: ['Canada'],\r\n },\r\n {\r\n x: 4,\r\n y: 230,\r\n dx: 240,\r\n dy: 135,\r\n name: 'Mexico',\r\n countries: ['Cayman Islands', 'Bermuda', 'Mexico'],\r\n },\r\n {\r\n x: 4,\r\n y: 375,\r\n dx: 240,\r\n dy: 170,\r\n name: 'South America',\r\n countries: ['Netherlands Antilles', 'Panama', 'Peru', 'Argentina', 'Colombia', 'Chile', 'Brazil'],\r\n },\r\n {\r\n x: 730,\r\n y: 380,\r\n dx: 108,\r\n dy: 80,\r\n name: 'South Africa',\r\n countries: ['South Africa'],\r\n },\r\n {\r\n x: 725,\r\n y: 180,\r\n dx: 108,\r\n dy: 81,\r\n name: 'Israel',\r\n countries: ['Israel'],\r\n },\r\n {\r\n x: 1055,\r\n y: 420,\r\n dx: 144,\r\n dy: 80,\r\n name: 'Australia',\r\n countries: ['Australia'],\r\n },\r\n {\r\n x: 871,\r\n y: 0,\r\n dx: 336,\r\n dy: 396,\r\n name: 'Asia',\r\n countries: [\r\n 'Malaysia',\r\n 'Russia',\r\n 'Philippines',\r\n 'Indonesia',\r\n 'Singapore',\r\n 'South Korea',\r\n 'Taiwan',\r\n 'India',\r\n 'Hong Kong',\r\n 'Japan',\r\n 'China',\r\n ],\r\n },\r\n {\r\n x: 324,\r\n y: 0,\r\n dx: 374,\r\n dy: 428,\r\n name: 'Europe',\r\n countries: [\r\n 'Cyprus',\r\n 'Channel Islands',\r\n 'Greece',\r\n 'Luxembourg',\r\n 'Germany',\r\n 'Belgium',\r\n 'Spain',\r\n 'France',\r\n 'Ireland',\r\n 'Switzerland',\r\n 'Netherlands',\r\n 'United Kingdom',\r\n ],\r\n },\r\n {\r\n x: 697,\r\n y: 75,\r\n dx: 144,\r\n dy: 51,\r\n name: 'Frozen',\r\n countries: ['Finland', 'Sweden', 'Norway', 'Denmark'],\r\n },\r\n {\r\n x: 542,\r\n y: 414,\r\n dx: 102,\r\n dy: 68,\r\n name: 'Italy',\r\n countries: ['Italy'],\r\n },\r\n]\r\n","import tailwindColors from '../../../../../config/colors'\r\nimport { ScaleId } from '../types'\r\n\r\nexport interface ISettings {\r\n padding: { top: number; right: number; bottom: number; left: number }\r\n background: string\r\n industry: ISettingsSection\r\n sector: ISettingsSection\r\n scaleFontSizes: Record\r\n fontSizePadding: Record\r\n fontSizePairs: Record\r\n}\r\n\r\nexport interface ISettingsSection {\r\n padding: { top: number; right: number; bottom: number; left: number }\r\n background: string | null\r\n border: string | null\r\n header: ISettingsSectionHeader\r\n hover?: ISettingsSectionHeader\r\n}\r\n\r\nexport interface ISettingsSectionHeader extends ISettingsSectionFont {\r\n background: string | null\r\n border: string | null\r\n height: number\r\n margin: { top: number; right: number; bottom: number; left: number }\r\n}\r\n\r\nexport interface ISettingsSectionFont {\r\n color: string\r\n fontSize: number\r\n fontWeight: 'bold' | 'normal'\r\n padding: { top: number; right: number; left: number }\r\n}\r\n\r\nexport const scaleMinMax: Record = {\r\n [ScaleId.DayPerf]: [-3, 3],\r\n _5: [-6, 6],\r\n _10: [-10, 10],\r\n _15: [-18, 18],\r\n _20: [-24, 24],\r\n _25: [-30, 30],\r\n _relvol: [0, 3],\r\n _pe: [0, 30],\r\n _fpe: [0, 30],\r\n _peg: [0, 3],\r\n _ps: [0, 5],\r\n _pb: [0, 5],\r\n _div: [0, 5],\r\n _eps5y: [-50, 50],\r\n _short: [0, 15],\r\n _rec: [5, 1],\r\n _earndate: [30, -30],\r\n // Portfolio — values are just placeholders, the real value is computed from data\r\n _portfolioPct: [-1, 1],\r\n _portfolioUsd: [-1, 1],\r\n}\r\n\r\nexport const scaleStepFormat: Record = {\r\n [ScaleId.DayPerf]: '%N%',\r\n _5: '%N%',\r\n _10: '%N%',\r\n _15: '%N%',\r\n _20: '%N%',\r\n _25: '%N%',\r\n _relvol: '%N',\r\n _pe: '%N',\r\n _fpe: '%N',\r\n _peg: '%N',\r\n _ps: '%N',\r\n _pb: '%N',\r\n _div: '%N%',\r\n _eps5y: '%N%',\r\n _short: '%N%',\r\n _rec: { 1: '%N Strong Buy', 2: '%N Buy', 3: '%N Hold', 4: '%N Sell', 5: '%N Strong Sell' },\r\n _earndate: {\r\n '-30': '%N Days',\r\n '-15': '%N Days',\r\n '-1': 'After Earnings',\r\n 1: 'Before Earnings',\r\n 15: '%N Days',\r\n 30: '%N Days',\r\n },\r\n _portfolioPct: '%N%',\r\n _portfolioUsd: '$%N',\r\n}\r\n\r\nexport const Settings: ISettings = {\r\n padding: { top: 0, right: 0, bottom: 1, left: 1 },\r\n background: tailwindColors.finviz['blue-gray'],\r\n sector: {\r\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\r\n background: null,\r\n border: null,\r\n header: {\r\n color: '#fff',\r\n background: null,\r\n border: null,\r\n height: 14.5,\r\n fontSize: 13,\r\n fontWeight: 'bold',\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n padding: { top: -1, right: 4, left: 4 },\r\n },\r\n },\r\n industry: {\r\n padding: { top: 0, right: 1, bottom: 1, left: 1 },\r\n background: null,\r\n border: null,\r\n header: {\r\n color: '#fff',\r\n background: null,\r\n border: tailwindColors.finviz['blue-gray'],\r\n height: 12,\r\n fontSize: 10,\r\n fontWeight: 'normal',\r\n margin: { top: 0, right: 0.5, bottom: 0, left: -0.5 },\r\n padding: { top: -0.5, right: 4, left: 4 },\r\n },\r\n hover: {\r\n color: '#6b5811',\r\n background: '#ffd614',\r\n border: '#ffd614',\r\n height: 12,\r\n fontSize: 10,\r\n fontWeight: 'normal',\r\n margin: { top: 0, right: 0, bottom: 0, left: 0 },\r\n padding: { top: -0.5, right: 3, left: 4 },\r\n },\r\n },\r\n scaleFontSizes: {\r\n 1: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8],\r\n 1.5: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n 2.25: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n 3: [36, 30, 24, 20, 18, 14, 13, 12, 11, 10, 9, 8, 6, 4],\r\n },\r\n fontSizePadding: {\r\n 36: 30,\r\n 30: 25,\r\n 24: 20,\r\n 20: 14,\r\n 18: 12,\r\n 14: 9,\r\n 13: 7,\r\n 12: 7,\r\n 11: 4,\r\n 10: 3,\r\n 9: 3,\r\n 8: 2.5,\r\n 6: 0,\r\n 4: 1,\r\n },\r\n fontSizePairs: {\r\n 36: [18, 14, 13, 12],\r\n 30: [14, 13, 12, 11, 10],\r\n 24: [14, 13, 12, 11, 10],\r\n 20: [12, 11, 10, 9, 8, 6],\r\n 18: [11, 10, 9, 8, 6],\r\n 14: [9, 8, 6, 4],\r\n 13: [9, 8, 6, 4],\r\n 12: [9, 8, 6, 4],\r\n 11: [8, 6, 4],\r\n 10: [10, 9, 8, 6, 4],\r\n 9: [9, 8, 6, 4],\r\n 8: [8, 6, 4],\r\n 6: [6, 4],\r\n 4: [4],\r\n },\r\n}\r\n\r\nexport const SettingsSmall: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\r\n background: '#343842',\r\n sector: {\r\n ...Settings.industry,\r\n padding: { top: 0.5, right: 0, bottom: 0, left: 2 },\r\n border: '#e0e0e0',\r\n header: {\r\n ...Settings.industry.header,\r\n margin: { top: 0, right: 0.5, bottom: 0, left: -1.5 },\r\n padding: { top: 0.5, right: 1, left: 1 },\r\n border: '#343842',\r\n fontSize: 9,\r\n },\r\n },\r\n industry: {\r\n ...Settings.industry,\r\n padding: { top: 0, right: 1, bottom: 1, left: 0 },\r\n header: {\r\n ...Settings.industry.header,\r\n height: 0,\r\n },\r\n },\r\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\r\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 2, 6: 0, 4: 0 },\r\n fontSizePairs: {\r\n 14: [9, 8, 6],\r\n 13: [9, 8, 6],\r\n 12: [6],\r\n 11: [6],\r\n 10: [6],\r\n 9: [6],\r\n 8: [6],\r\n 6: [6],\r\n },\r\n}\r\n\r\nexport const SettingsSmallDark: ISettings = {\r\n ...SettingsSmall,\r\n sector: {\r\n ...SettingsSmall.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n header: {\r\n ...SettingsSmall.sector.header,\r\n padding: { top: 0.5, right: 2, left: 2 },\r\n margin: { top: 0, right: 1.5, bottom: 0, left: -0.5 },\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n industry: {\r\n ...SettingsSmall.industry,\r\n header: {\r\n ...SettingsSmall.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsSmallGeo: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\r\n background: '#a7c4d3',\r\n industry: {\r\n ...Settings.industry,\r\n background: '#e0e0e0',\r\n header: {\r\n ...Settings.industry.header,\r\n height: 9,\r\n fontSize: 8,\r\n border: '#e0e0e0',\r\n margin: { top: -0.5, right: 0.5, bottom: 0, left: -0.5 },\r\n padding: { top: -1, right: 0, left: 1 },\r\n },\r\n },\r\n scaleFontSizes: { ...Settings.scaleFontSizes, 1: [14, 12, 11, 8, 6] },\r\n fontSizePadding: { 14: 5, 12: 2, 11: 2, 8: 1, 6: 0, 4: 0 },\r\n fontSizePairs: {\r\n 14: [9, 8, 6],\r\n 13: [9, 8, 6],\r\n 12: [6],\r\n 11: [6],\r\n 10: [6],\r\n 9: [6],\r\n 8: [6],\r\n 6: [6],\r\n },\r\n}\r\n\r\nexport const SettingsSmallGeoDark: ISettings = {\r\n ...SettingsSmallGeo,\r\n background: tailwindColors.gray[800],\r\n sector: {\r\n ...SettingsSmallGeo.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n },\r\n industry: {\r\n ...SettingsSmallGeo.industry,\r\n border: tailwindColors.gray[800],\r\n background: tailwindColors.gray[800],\r\n header: {\r\n ...SettingsSmallGeo.industry.header,\r\n border: tailwindColors.gray[800],\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsScreener: ISettings = {\r\n ...Settings,\r\n padding: { top: 0, right: 0, bottom: 0, left: 0 },\r\n sector: {\r\n ...Settings.sector,\r\n padding: { top: 0, right: 0, bottom: 0, left: 1 },\r\n background: '#363a46',\r\n border: '#d3d3d3',\r\n header: {\r\n ...Settings.sector.header,\r\n height: 20,\r\n padding: { top: 2.5, right: 4, left: 4 },\r\n },\r\n },\r\n industry: {\r\n ...Settings.industry,\r\n header: {\r\n ...Settings.industry.header,\r\n border: '#363a46',\r\n },\r\n },\r\n}\r\n\r\nexport const SettingsScreenerDark: ISettings = {\r\n ...SettingsScreener,\r\n sector: {\r\n ...SettingsScreener.sector,\r\n background: tailwindColors.gray[800],\r\n border: tailwindColors.gray[800],\r\n },\r\n industry: {\r\n ...SettingsScreener.industry,\r\n header: {\r\n ...SettingsScreener.industry.header,\r\n border: tailwindColors.gray[800],\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 initialPerf?: PerfData,\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 } else if (initialPerf) {\r\n queryClient.setQueryData(['mapPerf', type, subtype], initialPerf)\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 data = await fetchPerfData(type, subtype)\r\n\r\n return (\r\n data ??\r\n queryClient.getQueryData(['mapPerf', type, subtype]) ?? {\r\n ...FALLBACK_PERF_RESPONSE,\r\n version: dataVersion.current,\r\n }\r\n )\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 * as d3 from 'd3'\r\n\r\nimport * as constants from './constants/generator'\r\nimport { ISettings } from './constants/settings'\r\nimport { MapDataIndustry, MapDataNode, MapDataRoot, MapDataRow, MapDataSector, MapTypeId, NodeDepth } from './types'\r\n\r\nexport default class LayoutGenerator {\r\n width: number\r\n height: number\r\n settings: ISettings\r\n layout?: Array>\r\n sectors: MapDataSector[] = []\r\n industries: MapDataIndustry[] = []\r\n nodes: MapDataNode[] = []\r\n isSmall: boolean\r\n type: MapTypeId\r\n minSectorHeight: number\r\n\r\n static smallIndustryPadding = {\r\n top: 4,\r\n right: 1,\r\n bottom: 1,\r\n left: 1,\r\n }\r\n\r\n static smallIndustryGeoPadding = {\r\n top: 4,\r\n right: 1,\r\n bottom: 1,\r\n left: 1,\r\n }\r\n\r\n static getSizeRatio = (type: MapTypeId, isSmall: boolean) => {\r\n if (isSmall) {\r\n if (type === MapTypeId.World) {\r\n return constants.SMALL_MAP_GEO_HEIGHT_RATIO\r\n }\r\n return constants.SMALL_MAP_HEIGHT_RATIO\r\n }\r\n\r\n return constants.LARGE_MAP_HEIGHT_RATIO\r\n }\r\n\r\n static calculateHeight = (\r\n width: number,\r\n type: MapTypeId,\r\n isSmall: boolean,\r\n ratio = LayoutGenerator.getSizeRatio(type, isSmall)\r\n ) => ~~(width / ratio)\r\n\r\n static calculateWidth = (height: number, type: MapTypeId, isSmall: boolean) => {\r\n const ratio = LayoutGenerator.getSizeRatio(type, isSmall)\r\n\r\n return Math.round(height * ratio)\r\n }\r\n\r\n static isNodeHeaderVisible(node: any, settings: ISettings) {\r\n const deltaX = node.dx ?? Math.round(node.x1) - Math.round(node.x0)\r\n const deltaY = node.dy ?? Math.round(node.y1) - Math.round(node.y0)\r\n\r\n const isLargeNode = deltaX >= constants.LARGE_NODE_SIZE.dx && deltaY >= constants.LARGE_NODE_SIZE.dy\r\n const showHeader =\r\n deltaY - settings.industry.padding.top - settings.industry.header.height > constants.LARGE_NODE_MIN_HEIGHT\r\n\r\n return isLargeNode && showHeader\r\n }\r\n\r\n constructor(width: number, height: number, type: MapTypeId, settings: ISettings, isSmall: boolean = false) {\r\n this.width = width\r\n this.height = height\r\n this.settings = settings\r\n this.isSmall = isSmall\r\n this.type = type\r\n this.minSectorHeight = settings.sector.padding.top + settings.sector.header.height + constants.SECTOR_MIN_HEIGHT\r\n }\r\n\r\n getExportData() {\r\n let mapRoot: MapDataRoot\r\n if (this.type === MapTypeId.World) {\r\n mapRoot = this._rootsToRoot(this.industries)\r\n } else {\r\n mapRoot = this.layout?.find((node) => node.data.name === 'Root') as unknown as MapDataRoot\r\n }\r\n\r\n // Save some file size by filtering out small nodes on maps where hover is not a concern\r\n if (this.isSmall) {\r\n mapRoot.children = this.filterVisibleNodes(mapRoot.children)\r\n }\r\n\r\n const stringified = JSON.stringify(mapRoot, (key, value) => (key === 'parent' ? '[Circular]' : value))\r\n\r\n return JSON.parse(stringified)\r\n }\r\n\r\n getLayoutData() {\r\n return {\r\n nodes: this.nodes,\r\n sectors: this.sectors,\r\n industries: this.industries,\r\n }\r\n }\r\n\r\n filterVisibleNodes = (arr: T[]) =>\r\n arr.filter((node) => {\r\n const isVisible = this.isNodeVisible(node)\r\n if (isVisible && node.children?.length) {\r\n node.children = this.filterVisibleNodes(node.children)\r\n }\r\n return isVisible\r\n })\r\n\r\n isNodeVisible(d: MapDataRow) {\r\n if (!d.depth || d.depth < NodeDepth.Industry) return true\r\n\r\n return d.dx > 0 && d.dy > 0\r\n }\r\n\r\n getLayout(data: MapDataRoot, options: Record = {}) {\r\n this.nodes = []\r\n this.sectors = []\r\n this.industries = []\r\n\r\n switch (this.type) {\r\n case MapTypeId.Sector:\r\n this.layout = this._generateSP500(data).descendants()\r\n break\r\n case MapTypeId.SectorFull:\r\n this.layout = this._generateFull(data).descendants()\r\n break\r\n case MapTypeId.Portfolio:\r\n case MapTypeId.Screener:\r\n case MapTypeId.ETFHoldings:\r\n this.layout = this._generateScreener(data, options).descendants()\r\n break\r\n case MapTypeId.World:\r\n this.layout = this._generateWorld(data)\r\n break\r\n case MapTypeId.ETF:\r\n this.layout = this._generateETF(data).descendants()\r\n break\r\n }\r\n\r\n this.layout?.forEach((d: any) => {\r\n this._transformNode(d)\r\n\r\n if (!this.isNodeVisible(d)) return\r\n\r\n if (!d.children) {\r\n this.nodes.push(d)\r\n } else if (d.parent && !d.parent.parent) {\r\n this.sectors.push(d)\r\n } else if (d.parent && !!d.parent.parent && d.children) {\r\n this.industries.push(d)\r\n }\r\n })\r\n\r\n return this.getLayoutData()\r\n }\r\n\r\n _transformNode(d: d3.HierarchyRectangularNode) {\r\n Object.assign(d, {\r\n name: d.data.name,\r\n description: d.data.description,\r\n perf: d.data.perf,\r\n additional: d.data.additional,\r\n x: d.x0,\r\n y: d.y0,\r\n dx: d.x1 - d.x0,\r\n dy: d.y1 - d.y0,\r\n })\r\n }\r\n\r\n _rootsToRoot(roots: any) {\r\n return {\r\n name: 'Root',\r\n children: [\r\n {\r\n name: 'World',\r\n children: roots,\r\n },\r\n ],\r\n duplicateTickers: 0,\r\n } as MapDataRoot\r\n }\r\n\r\n _getPadding = (d: d3.HierarchyRectangularNode) => {\r\n // Root\r\n if (d.depth === NodeDepth.Root) {\r\n return [\r\n this.settings.padding.top,\r\n this.settings.padding.right,\r\n this.settings.padding.bottom,\r\n this.settings.padding.left,\r\n ]\r\n }\r\n\r\n // Industries\r\n if (d.depth === NodeDepth.Industry) {\r\n if (this.isSmall || LayoutGenerator.isNodeHeaderVisible(d, this.settings)) {\r\n return [\r\n this.settings.industry.padding.top + this.settings.industry.header.height,\r\n this.settings.industry.padding.right,\r\n this.settings.industry.padding.bottom,\r\n this.settings.industry.padding.left,\r\n ]\r\n }\r\n\r\n return [\r\n LayoutGenerator.smallIndustryPadding.top,\r\n LayoutGenerator.smallIndustryPadding.right,\r\n LayoutGenerator.smallIndustryPadding.bottom,\r\n LayoutGenerator.smallIndustryPadding.left,\r\n ]\r\n }\r\n\r\n // Sectors\r\n return [\r\n this.settings.sector.padding.top + this.settings.sector.header.height,\r\n this.settings.sector.padding.right,\r\n this.settings.sector.padding.bottom,\r\n this.settings.sector.padding.left,\r\n ]\r\n }\r\n\r\n _getPaddingGeo = (d: d3.HierarchyRectangularNode) => {\r\n // Root\r\n if (d.depth === NodeDepth.Root) {\r\n return [\r\n this.settings.padding.top,\r\n this.settings.padding.right,\r\n this.settings.padding.bottom,\r\n this.settings.padding.left,\r\n ]\r\n }\r\n\r\n // Industries\r\n if (d.depth === NodeDepth.Industry) {\r\n if (LayoutGenerator.isNodeHeaderVisible(d, this.settings)) {\r\n return [\r\n this.settings.industry.padding.top + this.settings.industry.header.height,\r\n this.settings.industry.padding.right,\r\n this.settings.industry.padding.bottom,\r\n this.settings.industry.padding.left,\r\n ]\r\n }\r\n\r\n return [\r\n LayoutGenerator.smallIndustryGeoPadding.top,\r\n LayoutGenerator.smallIndustryGeoPadding.right,\r\n LayoutGenerator.smallIndustryGeoPadding.bottom,\r\n LayoutGenerator.smallIndustryGeoPadding.left,\r\n ]\r\n }\r\n\r\n // Sectors\r\n return [\r\n this.settings.sector.padding.top + this.settings.sector.header.height,\r\n this.settings.sector.padding.right,\r\n this.settings.sector.padding.bottom,\r\n this.settings.sector.padding.left,\r\n ]\r\n }\r\n\r\n _getHierarchySort = <\r\n Datum extends { y0?: number; y1?: number; value?: number; data: { name: string }; depth?: number },\r\n >(\r\n a: Datum,\r\n b: Datum,\r\n order: constants.MapOrder\r\n ): number => {\r\n // Sort small sectors (works only when layout is recalculated)\r\n const heightB = b.y1! - b.y0!\r\n if (b.depth === NodeDepth.Sector && Number.isFinite(heightB) && heightB < this.minSectorHeight) {\r\n return b.value! - a.value!\r\n }\r\n\r\n if (order.hasOwnProperty(a.data.name) && order.hasOwnProperty(b.data.name)) {\r\n return order[b.data.name] - order[a.data.name]\r\n }\r\n return b.value! - a.value!\r\n }\r\n\r\n _getHierarchy = (data: MapDataRoot, order: constants.MapOrder) =>\r\n d3\r\n .hierarchy(data as unknown as MapDataNode)\r\n .sum((d) => d.value)\r\n .sort((a, b) => this._getHierarchySort(a, b, order))\r\n\r\n _getTreemap = (width: number, height: number) => {\r\n const paddingFn = this.type === MapTypeId.World ? this._getPaddingGeo : this._getPadding\r\n\r\n return d3\r\n .treemap()\r\n .size([width, height])\r\n .round(true)\r\n .tile(d3.treemapSquarify.ratio(1))\r\n .paddingTop((d) => paddingFn(d)[0])\r\n .paddingRight((d) => paddingFn(d)[1])\r\n .paddingBottom((d) => paddingFn(d)[2])\r\n .paddingLeft((d) => paddingFn(d)[3])\r\n }\r\n\r\n _getIndustriesRoots(data: MapDataRoot, industries: string[]) {\r\n return data.children[0].children.filter(function (d) {\r\n return industries.some((i) => i === d.name)\r\n })\r\n }\r\n\r\n _getSectorsRoots(data: MapDataRoot, sectors: string[]) {\r\n return data.children.filter(function (d) {\r\n return sectors.some((s) => s === d.name)\r\n })\r\n }\r\n\r\n _generateLayout(data: MapDataRoot, order: constants.MapOrder, recountSectors = false) {\r\n const treemapHeight = LayoutGenerator.calculateHeight(this.width, this.type, false)\r\n const treemap = this._getTreemap(this.width, treemapHeight)\r\n const hierarchy = this._getHierarchy(data, order)\r\n const recalculateHeight = this.height !== treemapHeight\r\n\r\n // Calculate the base layout\r\n let nodes = treemap(hierarchy)\r\n\r\n // Recalculate for custom height\r\n if (this.height !== treemapHeight) {\r\n treemap.tile(d3.treemapResquarify).size([this.width, this.height])\r\n }\r\n\r\n // Run layout again so that possible small sectors are reordered\r\n // This also applies the recalculateHeight option\r\n if (recountSectors || recalculateHeight) {\r\n nodes = treemap(nodes.sort((a, b) => this._getHierarchySort(a, b, order)))\r\n }\r\n\r\n return nodes\r\n }\r\n\r\n _generateSP500(data: MapDataRoot) {\r\n const nodes = this._generateLayout(data, constants.ORDER_SP500)\r\n\r\n // Switch financial and technology sector\r\n const financialSector = nodes.find((node) => node.data.name === 'Financial')!\r\n const technologySector = nodes.find((node) => node.data.name === 'Technology')!\r\n const financialHeight = financialSector.y1 - financialSector.y0\r\n const technologyHeight = technologySector.y1 - technologySector.y0\r\n\r\n financialSector.eachAfter((node) => {\r\n if (node.y1 - node.y0 < 1) return\r\n node.y0 += technologyHeight\r\n node.y1 += technologyHeight\r\n })\r\n\r\n technologySector.eachAfter((node) => {\r\n if (node.y1 - node.y0 < 1) return\r\n node.y0 -= financialHeight\r\n node.y1 -= financialHeight\r\n })\r\n\r\n return nodes\r\n }\r\n\r\n _generateFull(data: MapDataRoot) {\r\n const layout = this._generateLayout(data, constants.ORDER_SEC_ALL)\r\n\r\n // Swap Technology and financial sectors\r\n const technologySector = layout.find((node) => node.depth === NodeDepth.Sector && node.data.name === 'Technology')!\r\n const financialSector = layout.find((node) => node.depth === NodeDepth.Sector && node.data.name === 'Financial')!\r\n\r\n const financialHeight = financialSector.y1 - financialSector.y0\r\n technologySector.each((node) => {\r\n node.y0 -= financialHeight\r\n node.y1 -= financialHeight\r\n })\r\n\r\n const technologyHeight = technologySector.y1 - technologySector.y0\r\n financialSector.each((node) => {\r\n node.y0 += technologyHeight\r\n node.y1 += technologyHeight\r\n })\r\n\r\n return layout\r\n }\r\n\r\n _generateScreener(data: MapDataRoot, { showETF }: Record) {\r\n const order = showETF ? constants.ORDER_SCREENER_ETF : constants.ORDER_SCREENER\r\n\r\n return this._generateLayout(data, order, true)\r\n }\r\n\r\n _generateETF(data: MapDataRoot) {\r\n return this._generateLayout(data, constants.ORDER_ETF)\r\n }\r\n\r\n _generateWorld = (data: MapDataRoot) => {\r\n const originalWidth = 1211\r\n const ratio = this.width / originalWidth\r\n let nodes: Array> = []\r\n\r\n for (let industryIndex = 0; industryIndex < constants.WORLD_INDUSTRIES.length; industryIndex++) {\r\n const industry = constants.WORLD_INDUSTRIES[industryIndex]\r\n const industryX = Math.round(industry.x * ratio)\r\n const industryY = Math.round(industry.y * ratio)\r\n const industryWidth = Math.round(industry.dx * ratio)\r\n const industryHeight = Math.round(industry.dy * ratio)\r\n\r\n const countriesRoots = this._getIndustriesRoots(data, industry.countries)\r\n const root = this._rootsToRoot(countriesRoots)\r\n const hierarchy = this._getHierarchy(root, constants.ORDER_WORLD)\r\n const treemap = this._getTreemap(industryWidth, industryHeight)\r\n const treemapNodes = treemap(hierarchy)\r\n\r\n treemapNodes.each((d) => {\r\n d.x0 += industryX\r\n d.x1 += industryX\r\n d.y0 += industryY\r\n d.y1 += industryY\r\n })\r\n\r\n // SWITCH BRAZIL AND OTHERS\r\n if (industry.name === 'South America') {\r\n const brazil = treemapNodes.find((d) => d.data.name === 'Brazil')!\r\n const colombia = treemapNodes.find((d) => d.data.name === 'Colombia')!\r\n const brazilWidth = brazil.x1 - brazil.x0\r\n const colombiaWidth = colombia.x1 - colombia.x0\r\n\r\n treemapNodes.each((d) => {\r\n if ([d.parent?.data.name, d.data.name].includes('Brazil')) {\r\n d.x0 += colombiaWidth\r\n d.x1 += colombiaWidth\r\n } else {\r\n d.x0 -= brazilWidth\r\n d.x1 -= brazilWidth\r\n }\r\n })\r\n }\r\n\r\n nodes = nodes.concat(treemapNodes.descendants())\r\n }\r\n\r\n return nodes\r\n }\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 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(\r\n treemap: Treemap,\r\n props: { width: number; height: number; data: MapData; scale: Scale; dataHash: string }\r\n ) {\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({ type: ActionTypes.UPDATE_DATA, version: data.version })\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 _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 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 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\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 zoomLevels: number[]\r\n\r\n constructor(dimensions: Dimensions, zoomLevels: number[]) {\r\n this.translateExtent = [dimensions.width, dimensions.height]\r\n this.zoomLevels = zoomLevels\r\n\r\n this.behavior = d3\r\n .zoom()\r\n .extent([[0, 0], this.translateExtent])\r\n .scaleExtent([this.zoomLevels[0], this.zoomLevels[this.zoomLevels.length - 1]])\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 getNearestSize(currentZoom: number = this.scale()) {\r\n let nearestSize = this.zoomLevels[0]\r\n for (var i = 0, len = this.zoomLevels.length; i < len; i++) {\r\n const level = this.zoomLevels[i]\r\n if (level >= currentZoom) {\r\n nearestSize = level\r\n break\r\n }\r\n }\r\n\r\n return nearestSize\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 dataHash: string\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 dataHash: 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 this.dataHash = props.dataHash\r\n\r\n this.zoom = new Zoom({ width: this.width, height: this.height }, this.zoomLevels)\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; dataHash: string }) {\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.dataHash = props.dataHash\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 this.dataHash = data.hash\r\n\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.getNearestSize()\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 { ReactNode } from 'react'\r\n\r\nexport enum MapTypeId {\r\n Sector = 'sec',\r\n World = 'geo',\r\n SectorFull = 'sec_all',\r\n ETF = 'etf',\r\n Screener = 'screener',\r\n Portfolio = 'portfolio',\r\n ETFHoldings = 'etf_holdings',\r\n}\r\n\r\nexport enum MapSubtypeId {\r\n DayPerf = 'd1',\r\n WeekPerf = 'w1',\r\n MonthPerf = 'w4',\r\n ThreeMonthPerf = 'w13',\r\n SixMonthPerf = 'w26',\r\n YearPerf = 'w52',\r\n YearToDatePerf = 'ytd',\r\n RelativeVolume = 'relvol',\r\n PriceToEarnings = 'pe',\r\n ForwardPriceToEearnings = 'fpe',\r\n PriceEarningsToGrowth = 'peg',\r\n PriceToSellsRatio = 'ps',\r\n PriceToBookRatio = 'pb',\r\n DividendYield = 'div',\r\n EPSGrowth5y = 'eps5y',\r\n FloatShort = 'short',\r\n AnalystRecommendation = 'rec',\r\n EarningsPerf = 'earnperf',\r\n EarningsDate = 'earndate',\r\n // Portfolio\r\n PortfolioGainPct = 'portfolioGainPct',\r\n PortfolioGainUsd = 'portfolioGainUsd',\r\n PortfolioChangePct = 'portfolioChangePct',\r\n PortfolioChangeUsd = 'portfolioChangeUsd',\r\n}\r\n\r\nexport enum ScaleId {\r\n DayPerf = 'default',\r\n WeekPerf = '_5',\r\n MonthPerf = '_10',\r\n ThreeMonthPerf = '_15',\r\n SixMonthPerf = '_20',\r\n YearPerf = '_25',\r\n RelativeVolume = '_relvol',\r\n PriceToEarnings = '_pe',\r\n ForwardPriceToEearnings = '_fpe',\r\n PriceEarningsToGrowth = '_peg',\r\n PriceToSellsRatio = '_ps',\r\n PriceToBookRatio = '_pb',\r\n DividendYield = '_div',\r\n EPSGrowth5y = '_eps5y',\r\n FloatShort = '_short',\r\n AnalystRecommendation = '_rec',\r\n EarningsDate = '_earndate',\r\n // Portfolio\r\n PortfolioPct = '_portfolioPct',\r\n PortfolioUsd = '_portfolioUsd',\r\n}\r\n\r\nexport const enum NodeDepth {\r\n Root,\r\n Sector,\r\n Industry,\r\n Node,\r\n}\r\n\r\nexport interface MapDataRow {\r\n name: string\r\n perf?: number\r\n x: number\r\n y: number\r\n dx: number\r\n dy: number\r\n data: any\r\n depth: NodeDepth\r\n}\r\n\r\nexport interface MapDataRoot {\r\n name: string\r\n children: MapDataSector[]\r\n duplicateTickers: number\r\n hash: string\r\n}\r\n\r\nexport interface MapDataSector extends MapDataRow {\r\n children: MapDataIndustry[]\r\n parent: MapDataRoot\r\n}\r\n\r\nexport interface MapDataIndustry extends MapDataRow {\r\n children: MapDataNode[]\r\n parent: MapDataSector\r\n}\r\n\r\nexport interface MapDataNode extends MapDataRow {\r\n parent: MapDataIndustry\r\n additional?: string\r\n description: string\r\n perfText: string\r\n value: number\r\n}\r\n\r\nexport interface MapData {\r\n sectors: MapDataSector[]\r\n industries: MapDataIndustry[]\r\n nodes: MapDataNode[]\r\n}\r\n\r\nexport type PerfData = {\r\n nodes: Record | Array\r\n additional: Record\r\n subtype: MapSubtypeId\r\n version?: number\r\n hash: string\r\n}\r\n\r\nexport interface MapSubtype {\r\n id: MapSubtypeId\r\n name: string\r\n scaleId: ScaleId\r\n tooltip: string\r\n countIndustryPerf: boolean\r\n countSectorPerf: boolean\r\n}\r\n\r\nexport interface MapType {\r\n name: string\r\n pageTitle: string\r\n nameShort?: string\r\n description: string\r\n type: MapTypeId\r\n subtypes: MapSubtype[]\r\n}\r\n\r\nexport interface Scale {\r\n name: string\r\n tooltip: ReactNode\r\n id: ScaleId\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { ScreenerQuery, ScreenerView } from '../screener/utils'\r\nimport { isMobile } from '../shared/isMobile'\r\nimport { isStockFastRefreshAvailable } from '../shared/isStockFastRefreshAvailable'\r\nimport { EXPANDED_MAP_BODY_CLASSS } from './constants/constants'\r\nimport { LEGEND_HEIGHT, MAP_MIN_HEIGHT, MAP_MIN_WIDTH } from './constants/generator'\r\nimport { Settings, SettingsSmall, SettingsSmallGeo } from './constants/settings'\r\nimport LayoutGenerator from './layout-generator'\r\nimport type Treemap from './treemap'\r\nimport {\r\n MapDataIndustry,\r\n MapDataNode,\r\n MapDataRoot,\r\n MapDataRow,\r\n MapDataSector,\r\n MapSubtypeId,\r\n MapTypeId,\r\n PerfData,\r\n} from './types'\r\n\r\nexport function getOffset(e: MouseEvent | React.MouseEvent) {\r\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\r\n\r\n return {\r\n offsetX: e.clientX - rect.left,\r\n offsetY: e.clientY - rect.top,\r\n }\r\n}\r\n\r\nexport function getIsSmall() {\r\n const query = new URLSearchParams(window.location.search)\r\n return query.get('settings') === 'small'\r\n}\r\n\r\nexport function getSettingsForMapType(type: MapTypeId, isSmall?: boolean) {\r\n if (isSmall) {\r\n if (type === MapTypeId.World) {\r\n return SettingsSmallGeo\r\n }\r\n return SettingsSmall\r\n }\r\n\r\n return Settings\r\n}\r\n\r\ntype DataRow = MapDataRow | MapDataRoot\r\n/**\r\n * We strip parents when serializing data for precomputed JSONs\r\n * but we need to restore them so that we can get them in treemap\r\n */\r\nexport function restoreDataKeys(\r\n data: T[],\r\n perfData: PerfData,\r\n parent?: any\r\n): T[] {\r\n return data.map((row) => {\r\n const newRow = {\r\n ...row,\r\n parent,\r\n perf: (perfData.nodes as Record)[row.name],\r\n additional: perfData.additional[row.name],\r\n }\r\n\r\n newRow.children = row.children ? restoreDataKeys(row.children, perfData, newRow) : undefined\r\n\r\n return newRow\r\n })\r\n}\r\n\r\nexport function splitData(mapData: MapDataRoot) {\r\n let sectors: MapDataSector[] = []\r\n let industries: MapDataIndustry[] = []\r\n let nodes: MapDataNode[] = []\r\n\r\n mapData.children?.forEach((sector) => {\r\n sectors.push(sector)\r\n sector.children?.forEach((industry) => {\r\n industries.push(industry)\r\n industry.children?.forEach((company) => {\r\n if (!(company.dx < 1 || company.dy < 1)) {\r\n nodes.push(company)\r\n }\r\n })\r\n })\r\n })\r\n\r\n return { sectors, industries, nodes }\r\n}\r\n\r\nexport function getMapData(mapData: MapDataRoot, perfData: PerfData) {\r\n const [data] = restoreDataKeys([mapData], perfData)\r\n\r\n return splitData(data)\r\n}\r\n\r\nexport async function fetchBaseData(filename: string, cacheBuster: number) {\r\n // https://stackoverflow.com/questions/52635660/can-link-rel-preload-be-made-to-work-with-fetch\r\n const response = await fetch(`/maps/${filename}?rev=${cacheBuster}`, {\r\n method: 'GET',\r\n credentials: 'include',\r\n mode: 'no-cors',\r\n })\r\n\r\n return response.json()\r\n}\r\n\r\nfunction getSizeForExpandedMap(element: HTMLElement, wrapper: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n wrapper?.style.removeProperty('max-width')\r\n let size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n const elementHeight = Math.max(window.innerHeight - LEGEND_HEIGHT - 50, MAP_MIN_HEIGHT)\r\n\r\n // We don’t want the map to overflow the height\r\n if (size.height > elementHeight) {\r\n const newWidth = LayoutGenerator.calculateWidth(elementHeight, type, isSmall)\r\n size = {\r\n width: newWidth,\r\n height: LayoutGenerator.calculateHeight(newWidth, type, isSmall),\r\n }\r\n }\r\n\r\n if (wrapper) {\r\n wrapper.style.maxWidth = `${size.width}px`\r\n }\r\n\r\n return size\r\n}\r\n\r\nfunction getRatioSizeForWidth(width: number, type: MapTypeId, isSmall: boolean) {\r\n const mapWidth = Math.max(width, MAP_MIN_WIDTH)\r\n return {\r\n width: mapWidth,\r\n height: LayoutGenerator.calculateHeight(mapWidth, type, isSmall),\r\n }\r\n}\r\n\r\nfunction getSizeRatioBasedMap(element: HTMLElement, wrapper: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n // Remove maxWidth if exiting expanded mode\r\n if (wrapper?.style.maxWidth) {\r\n wrapper.style.removeProperty('max-width')\r\n }\r\n\r\n let size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n\r\n // Set height so that we know if scrollbars are visible\r\n element.style.height = `${size.height + LEGEND_HEIGHT}px`\r\n\r\n // Add a bit of padding if scrollbar is visible and map touches it\r\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\r\n const isMediumScreen =\r\n window.innerWidth > 1430 &&\r\n window.innerWidth < 1450 &&\r\n !document.body.classList.contains('is-screener') &&\r\n !document.body.classList.contains('is-portfolio')\r\n if (isMediumScreen && scrollbarWidth > 0) {\r\n size = getRatioSizeForWidth(element.clientWidth - 10, type, isSmall)\r\n\r\n // This means we would display a horizontal scrollbar, which we don’t want\r\n } else if (size.width !== element.clientWidth) {\r\n size = getRatioSizeForWidth(element.clientWidth, type, isSmall)\r\n }\r\n\r\n element.style.removeProperty('height')\r\n\r\n return size\r\n}\r\n\r\n/**\r\n * Calculate size of the treemap based on w/h ratio and scrollbars visibility\r\n */\r\nexport function getSize(element: HTMLElement | null, type: MapTypeId, isSmall: boolean) {\r\n const canvasWrapper = document.getElementById('canvas-wrapper')\r\n\r\n if (!element) {\r\n return { width: 1, height: 1 }\r\n }\r\n\r\n // Custom width using query param\r\n const query = new URLSearchParams(window.location.search)\r\n if (query.has('width')) {\r\n const width = Number(query.get('width'))\r\n const parsedRatio = query.has('ratio') ? parseFloat(query.get('ratio')!) : undefined\r\n const ratio = Number.isFinite(parsedRatio) ? parsedRatio : undefined\r\n return {\r\n width,\r\n height: LayoutGenerator.calculateHeight(width, type, isSmall, ratio),\r\n }\r\n }\r\n\r\n // Expanded map\r\n if (document.body.classList.contains(EXPANDED_MAP_BODY_CLASSS)) {\r\n return getSizeForExpandedMap(element, canvasWrapper, type, isSmall)\r\n }\r\n\r\n if (type === MapTypeId.ETFHoldings) {\r\n return { height: element.clientHeight, width: element.clientWidth }\r\n }\r\n\r\n return getSizeRatioBasedMap(element, canvasWrapper, type, isSmall)\r\n}\r\n\r\n/**\r\n * Get treemap zoom levels based on env\r\n */\r\nexport function getDefaultZoomLevels() {\r\n if (isMobile()) {\r\n return [1, 1.5]\r\n }\r\n\r\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\r\n return [1, 1.5, 2.25]\r\n }\r\n\r\n return [1, 1.5, 2.25, 3]\r\n}\r\n\r\nexport function parseInitDataAsPerf(data?: MapDataRoot): PerfData | undefined {\r\n if (!data) return\r\n\r\n const nodes: Record = {}\r\n const additional: Record = {}\r\n\r\n for (const sector of data.children) {\r\n for (const industry of sector.children) {\r\n for (const node of industry.children) {\r\n if (node.perf !== undefined) {\r\n nodes[node.name] = node.perf\r\n }\r\n if (node.additional !== undefined) {\r\n additional[node.name] = node.additional\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n nodes,\r\n additional,\r\n subtype: MapSubtypeId.DayPerf,\r\n version: 1,\r\n hash: data.hash,\r\n }\r\n}\r\n\r\nconst MAX_SPARKLINES = 120\r\nconst HOVER_TOP_ROW_HEIGHT = 100\r\nconst HOVER_BORDER_WIDTH = 4\r\nconst ROW_HEIGHT = 30\r\nconst ROW_HEIGHT_SMALL = 24\r\nconst ROW_HEIGHT_BREAKPOINT = 15\r\n\r\nexport function getVisibleTooltipTickers(node?: MapDataNode) {\r\n if (!node) return []\r\n\r\n const industryTickers = node.parent.children\r\n const isSmall = industryTickers.length > ROW_HEIGHT_BREAKPOINT\r\n const rowHeight = isSmall ? ROW_HEIGHT_SMALL : ROW_HEIGHT\r\n const visibleRows = Math.floor((window.innerHeight - HOVER_TOP_ROW_HEIGHT - 2 * HOVER_BORDER_WIDTH) / rowHeight)\r\n const visibleChildren = industryTickers\r\n .slice()\r\n .sort((a, b) => b.dx * b.dy - a.dx * a.dy)\r\n .slice(0, Math.min(visibleRows, MAX_SPARKLINES))\r\n .map((n) => n.name)\r\n\r\n return visibleChildren\r\n}\r\n\r\nexport function onNodeClick({\r\n treemap,\r\n node,\r\n industry,\r\n sector,\r\n}: {\r\n treemap: Treemap\r\n node?: MapDataNode\r\n industry?: MapDataIndustry\r\n sector?: MapDataSector\r\n}) {\r\n if (node) {\r\n window.open(`/quote.ashx?t=${node.name}`)\r\n return\r\n }\r\n\r\n const query = new URLSearchParams()\r\n query.set(ScreenerQuery.View, ScreenerView.Overview.toString())\r\n\r\n // Use ticker filter for ETFs\r\n if (treemap.type === MapTypeId.ETF) {\r\n let tickers: string[] = []\r\n if (industry) {\r\n tickers = industry.children.map((node) => node.name)\r\n } else if (sector) {\r\n tickers = sector.children.flatMap((industry) => industry.children.map((node) => node.name))\r\n }\r\n\r\n if (tickers.length) {\r\n query.set(ScreenerQuery.Tickers, tickers.join(','))\r\n window.open(`/screener.ashx?${query}`)\r\n }\r\n\r\n return\r\n }\r\n\r\n if (industry) {\r\n const id = industry.name.replace(/[^a-zA-Z]/g, '').toLowerCase()\r\n const filter = treemap.type === MapTypeId.World ? 'geo' : 'ind'\r\n\r\n query.set(ScreenerQuery.Filters, `${filter}_${id}`)\r\n window.open(`/screener.ashx?${query}`)\r\n } else if (sector) {\r\n const id = sector.name.replace(/[^a-zA-Z]/g, '').toLowerCase()\r\n\r\n query.set(ScreenerQuery.Filters, `sec_${id}`)\r\n window.open(`/screener.ashx?${query}`)\r\n }\r\n}\r\n\r\nenum MapsPollingIntervalInMs {\r\n Free = 180000,\r\n Elite = 3000,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport function getMapsRefreshInterval({\r\n base = MapsPollingIntervalInMs.Elite,\r\n reduced = MapsPollingIntervalInMs.EliteStocksReduced,\r\n free = MapsPollingIntervalInMs.Free,\r\n}: { base?: number; reduced?: number; free?: number } = {}) {\r\n const isPremium = FinvizSettings.hasUserPremium\r\n let customRefreshInterval = base\r\n if (!isPremium) {\r\n customRefreshInterval = free\r\n } else if (!isStockFastRefreshAvailable()) {\r\n customRefreshInterval = reduced\r\n }\r\n\r\n return customRefreshInterval\r\n}\r\n","export enum ScreenerQuery {\r\n View = 'v',\r\n Signal = 's',\r\n Order = 'o',\r\n Tickers = 't',\r\n Filters = 'f',\r\n FilterTab = 'ft',\r\n MapSubtype = 'st',\r\n}\r\n\r\nexport enum ScreenerFilter {\r\n MarketCap = 'cap',\r\n Index = 'idx',\r\n Sector = 'sec',\r\n Industry = 'ind',\r\n AverageVolume = 'sh_avgvol',\r\n}\r\n\r\nexport enum ScreenerAddtionalQuery {\r\n ShowEtf = 'show_etf',\r\n}\r\n\r\nexport enum ScreenerView {\r\n Overview = 11,\r\n Maps = 71,\r\n Bubbles = 72,\r\n}\r\n\r\nexport function eventListenerRegister(el: HTMLElement, eventName: string, handler: (...args: any[]) => any) {\r\n el.addEventListener(eventName, handler)\r\n\r\n return () => {\r\n el.removeEventListener(eventName, handler)\r\n }\r\n}\r\n\r\nexport function textContent(el: HTMLElement) {\r\n return el.textContent || el.innerText\r\n}\r\n\r\nexport function ScreenerGetOptionsList(select: HTMLSelectElement) {\r\n const options = select.getAttribute('data-selected')?.split('|') ?? [],\r\n result = []\r\n for (var i = 0, len = options.length; i < len; i++) {\r\n var option = options[i]\r\n for (var j = 0; j < select.children.length; j++) {\r\n var optionEl = select.children[j] as HTMLOptionElement\r\n if (optionEl.value === option) {\r\n result.push({\r\n key: option,\r\n value: textContent(optionEl),\r\n })\r\n }\r\n }\r\n }\r\n return result\r\n}\r\n\r\nexport function ScreenerRenderCustomModal(select: any) {\r\n const filter = select.getAttribute('data-filter')\r\n const customWrapper = document.getElementById('fsm_' + filter) as HTMLElement\r\n if (customWrapper) {\r\n select.style.display = 'none'\r\n customWrapper.style.display = 'block'\r\n const input = document.getElementById('fsmi_' + filter) as HTMLInputElement\r\n const options = ScreenerGetOptionsList(select)\r\n const arr = []\r\n for (let i = 0, len = options.length; i < len; i++) {\r\n arr.push(options[i].value)\r\n }\r\n input.value = arr.join(', ')\r\n }\r\n}\r\n\r\nconst DATE_REGEX = /^[0-9]{2}[-][0-9]{2}[-][0-9]{4}/\r\n\r\nexport function getIsOptionDateRange(option: string) {\r\n if (!option.includes('x')) return false\r\n\r\n const [from, to] = option.split('x')\r\n const [isValidFromDate, isValidToDate] = [from, to].map((value) => {\r\n if (DATE_REGEX.test(value)) {\r\n return !Number.isNaN(new Date(value.replace(/-/g, '/')).getTime())\r\n }\r\n return false\r\n })\r\n\r\n return isValidFromDate || isValidToDate\r\n}\r\n\r\nexport function getInitialDateFromSelectedValues(selectedValues: string[]) {\r\n const initialDate = selectedValues.find(getIsOptionDateRange)\r\n\r\n if (initialDate) {\r\n return initialDate.split('x').map((date) => (DATE_REGEX.test(date) ? date.replace(/-/g, '/') : undefined))\r\n }\r\n}\r\n\r\nexport function dateRangeToFilterString({ from, to }: { from?: string; to?: string }) {\r\n return from || to ? `${from ?? ''}x${to ?? ''}`.replace(/\\//g, '-') : null\r\n}\r\n\r\n/**\r\n * Creates link for given view & subview and ignores any additional query params\r\n */\r\nexport function getQueryForView(view?: ScreenerView, allowedParams: string[] = [], baseQuery = window.location.search) {\r\n const query = new URLSearchParams(baseQuery)\r\n const allowList = [...allowedParams, ...Object.values(ScreenerQuery)]\r\n\r\n /**\r\n * Seems like `query` is a live property, so we can’t use `query.forEach` to delete,\r\n * so we need to copy keys before looping.\r\n * https://stackoverflow.com/questions/60522437\r\n */\r\n const keys = Array.from(query.keys())\r\n\r\n keys.forEach((key) => {\r\n if (!allowList.includes(key)) {\r\n query.delete(key)\r\n }\r\n })\r\n\r\n const [, originalView, settings = 0] = query.get(ScreenerQuery.View)?.match(/(\\d{2})(\\d)/) ?? []\r\n\r\n if (view ?? originalView) {\r\n query.set(ScreenerQuery.View, `${view ?? originalView}${settings}`)\r\n }\r\n\r\n return query\r\n}\r\n\r\n/**\r\n * Parse screener `f` query param to object\r\n */\r\nexport function parseScreenerFilters(baseQuery = window.location.search) {\r\n const query = new URLSearchParams(baseQuery)\r\n const filtersString = query.get(ScreenerQuery.Filters)\r\n\r\n if (!filtersString) return {}\r\n\r\n return Object.fromEntries(\r\n filtersString.split(',').map((f) => {\r\n const lastUnderscore = f.lastIndexOf('_')\r\n const key = f.substring(0, lastUnderscore)\r\n const value = f.substring(lastUnderscore + 1)\r\n return [key, value.split('|')]\r\n })\r\n )\r\n}\r\n\r\n/**\r\n * Stringify screener `f` query param\r\n */\r\nexport function stringifyScreenerFilters(filters: Record) {\r\n return Object.entries(filters)\r\n .filter(([, value]) => String(value).length > 0)\r\n .map(([key, value]) => `${key}_${value.join('|')}`)\r\n .join(',')\r\n}\r\n\r\nexport function rangesToFilter(\r\n ranges: {\r\n from: string\r\n to: string\r\n }[],\r\n rangeSuffixes?: string[],\r\n delimiter = 'x',\r\n rangeDelimiter = 'to'\r\n) {\r\n return ranges.reduce((filter, range, index) => {\r\n const { from, to } = range\r\n const rangeStr = from || to ? `${from}${rangeDelimiter}${to}${rangeSuffixes?.[index] ?? ''}` : ''\r\n\r\n let currentFilter = filter\r\n if (index > 0) currentFilter += delimiter\r\n return currentFilter + rangeStr\r\n }, '')\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 DialogDismiss,\r\n DialogFooter,\r\n DialogHeader,\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 disabled?: boolean\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 props.onShareClick()\r\n dialogState.show()\r\n }}\r\n >\r\n Share map\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\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 try sharing the map again and if the problem persists, please contact support.\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 { isFirefoxDesktop } from './isMobile'\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', isFirefoxDesktop() ? { willReadFrequently: true } : undefined)!\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","import { getDate } from '../header/utils'\r\n\r\n// Keep in sync with the original in charts repo in app/constants/common.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\n/*\r\n * Keep in sync with the original (Utils static method) in charts repo in app/utils.ts\r\n * See line 15, we use getDate instead of convertLocalToNyTime\r\n */\r\nexport function isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = getDate()\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","import 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 const showArrow = rightContent === undefined && hasValue && value !== 0\r\n\r\n return (\r\n 0,\r\n 'text-negative': hasValue && value < 0,\r\n })}\r\n >\r\n {children}\r\n \r\n {showArrow ? (\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 hasLeading?: 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 hasLeading = 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 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 * as React from 'react'\r\n\r\nexport interface DelayedProps {\r\n /**\r\n * The delay in milliseconds before the component is rendered.\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n /**\r\n * Delay in milliseconds before rendering timeout state.\r\n */\r\n timeout?: number\r\n\r\n /**\r\n * Throw on timeout (suspense)\r\n */\r\n throwOnTimeout?: boolean\r\n\r\n /**\r\n * Component visible during the delay.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n delayComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when timeout is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n timeoutComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when delay is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function Delayed({\r\n delay = 300,\r\n timeout = 0,\r\n throwOnTimeout = false,\r\n delayComponent,\r\n timeoutComponent,\r\n children,\r\n}: DelayedProps) {\r\n const [visible, setVisible] = React.useState(false)\r\n const [hasTimedOut, setHasTimedOut] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const visibilityTimeout = window.setTimeout(() => setVisible(true), delay)\r\n\r\n let failedTimeout: number\r\n if (timeout > 0) {\r\n failedTimeout = window.setTimeout(() => {\r\n setHasTimedOut(true)\r\n if (throwOnTimeout) throw new Error()\r\n }, timeout)\r\n }\r\n\r\n return () => {\r\n clearTimeout(visibilityTimeout)\r\n clearTimeout(failedTimeout)\r\n }\r\n }, [delay, timeout, throwOnTimeout])\r\n\r\n if (!visible) return <>{delayComponent}\r\n\r\n if (hasTimedOut) {\r\n return <>{timeoutComponent}\r\n }\r\n\r\n return <>{children}\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nexport type SVGProps = React.SVGProps\r\n\r\nexport function SVG({ className, width = 16, height = width, ...props }: SVGProps) {\r\n return (\r\n \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\nexport type NotificationContextType = ReturnType\r\n\r\nexport enum NotificationPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight,\r\n}\r\n\r\nexport interface NotificationOptions {\r\n position?: NotificationPosition\r\n inline?: boolean\r\n}\r\n\r\nexport const NotificationContext = React.createContext<{\r\n show: (element: JSX.Element, options?: NotificationOptions) => void\r\n hide: () => void\r\n}>({\r\n show: () => {},\r\n hide: () => {},\r\n})\r\n\r\nexport function useNotification() {\r\n return React.useContext(NotificationContext)\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getVisualViewport, useVisualViewport } from '../../hooks/useVisualViewport'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const [notification, setNotification] = React.useState(null)\r\n const { viewport, setViewport } = useVisualViewport({ enabled: !!notification })\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getVisualViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n setIsOpen(true)\r\n },\r\n hide: () => setIsOpen(false),\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Ariakit.Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {isOpen && (\r\n \r\n \r\n {notification?.element}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n /**\r\n * Default button text\r\n * @default Close\r\n */\r\n closeText?: string\r\n\r\n /**\r\n * Custom buttons. Overrides `closeText`\r\n */\r\n actions?: JSX.Element\r\n\r\n /**\r\n * When set, the notification will automatically close\r\n */\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification({\r\n className,\r\n closeText = 'Close',\r\n actions,\r\n timeoutInMs,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: number\r\n if (timeoutInMs) {\r\n timeoutId = window.setTimeout(() => {\r\n notification.hide()\r\n }, timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, timeoutInMs])\r\n\r\n return (\r\n \r\n
    {children}
    \r\n
    \r\n {actions ?? (\r\n \r\n )}\r\n
    \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\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 case RowKind.Trade:\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\nimport { getSymbolType } from '../utils'\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 totalValue = 100000.0\r\n): Promise {\r\n const tickers: string[] = []\r\n let numberOfTransactions = 0\r\n\r\n rows.forEach((row) => {\r\n const ticker = getSanitizedTicker(row.ticker.trim(), false, [PORTFOLIO_CASH_SYMBOL])\r\n\r\n if (getSymbolType(ticker) === PortfolioSymbolType.Stock) numberOfTransactions += row.transactions.length\r\n tickers.push(ticker.length ? ticker : QUOTE_INVALID_TICKER_REQUEST)\r\n })\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 PortfolioTableView,\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: PortfolioTableView\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: PortfolioTableView.Ticker,\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 isPortfolioSubtype = subtype.startsWith('portfolio')\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 = isPortfolioSubtype ? subtypePerf : 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 dataHash: `${groupByIndustry}-${size}-${subtype}-${\r\n isPortfolioSubtype || !perfData ? new Date().getTime() : perfData.hash\r\n }`,\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) as PortfolioTableView) ?? 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 id = 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","/**\n * React Router DOM v6.16.0\n *\n * Copyright (c) Remix Software Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.md file in the root directory of this source tree.\n *\n * @license MIT\n */\nimport * as React from 'react';\nimport { UNSAFE_mapRouteProperties, Router, UNSAFE_NavigationContext, useHref, useResolvedPath, useLocation, UNSAFE_DataRouterStateContext, useNavigate, createPath, UNSAFE_useRouteId, UNSAFE_RouteContext, useMatches, useNavigation, unstable_useBlocker, UNSAFE_DataRouterContext } from 'react-router';\nexport { AbortedDeferredError, Await, MemoryRouter, Navigate, NavigationType, Outlet, Route, Router, RouterProvider, Routes, UNSAFE_DataRouterContext, UNSAFE_DataRouterStateContext, UNSAFE_LocationContext, UNSAFE_NavigationContext, UNSAFE_RouteContext, UNSAFE_useRouteId, createMemoryRouter, createPath, createRoutesFromChildren, createRoutesFromElements, defer, generatePath, isRouteErrorResponse, json, matchPath, matchRoutes, parsePath, redirect, redirectDocument, renderMatches, resolvePath, unstable_useBlocker, useActionData, useAsyncError, useAsyncValue, useHref, useInRouterContext, useLoaderData, useLocation, useMatch, useMatches, useNavigate, useNavigation, useNavigationType, useOutlet, useOutletContext, useParams, useResolvedPath, useRevalidator, useRouteError, useRouteLoaderData, useRoutes } from 'react-router';\nimport { stripBasename, UNSAFE_warning, createRouter, createBrowserHistory, createHashHistory, UNSAFE_ErrorResponseImpl, UNSAFE_invariant, joinPaths } from '@remix-run/router';\n\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\n\nconst defaultMethod = \"get\";\nconst defaultEncType = \"application/x-www-form-urlencoded\";\nfunction isHtmlElement(object) {\n return object != null && typeof object.tagName === \"string\";\n}\nfunction isButtonElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\nfunction isFormElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\nfunction isInputElement(object) {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\nfunction isModifiedEvent(event) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\nfunction shouldProcessLinkClick(event, target) {\n return event.button === 0 && (\n // Ignore everything but left clicks\n !target || target === \"_self\") &&\n // Let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event) // Ignore clicks with modifier keys\n ;\n}\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n * let searchParams = new URLSearchParams([\n * ['sort', 'name'],\n * ['sort', 'price']\n * ]);\n *\n * you can do:\n *\n * let searchParams = createSearchParams({\n * sort: ['name', 'price']\n * });\n */\nfunction createSearchParams(init) {\n if (init === void 0) {\n init = \"\";\n }\n return new URLSearchParams(typeof init === \"string\" || Array.isArray(init) || init instanceof URLSearchParams ? init : Object.keys(init).reduce((memo, key) => {\n let value = init[key];\n return memo.concat(Array.isArray(value) ? value.map(v => [key, v]) : [[key, value]]);\n }, []));\n}\nfunction getSearchParamsForLocation(locationSearch, defaultSearchParams) {\n let searchParams = createSearchParams(locationSearch);\n if (defaultSearchParams) {\n // Use `defaultSearchParams.forEach(...)` here instead of iterating of\n // `defaultSearchParams.keys()` to work-around a bug in Firefox related to\n // web extensions. Relevant Bugzilla tickets:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1414602\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1023984\n defaultSearchParams.forEach((_, key) => {\n if (!searchParams.has(key)) {\n defaultSearchParams.getAll(key).forEach(value => {\n searchParams.append(key, value);\n });\n }\n });\n }\n return searchParams;\n}\n// One-time check for submitter support\nlet _formDataSupportsSubmitter = null;\nfunction isFormDataSubmitterSupported() {\n if (_formDataSupportsSubmitter === null) {\n try {\n new FormData(document.createElement(\"form\"),\n // @ts-expect-error if FormData supports the submitter parameter, this will throw\n 0);\n _formDataSupportsSubmitter = false;\n } catch (e) {\n _formDataSupportsSubmitter = true;\n }\n }\n return _formDataSupportsSubmitter;\n}\nconst supportedFormEncTypes = new Set([\"application/x-www-form-urlencoded\", \"multipart/form-data\", \"text/plain\"]);\nfunction getFormEncType(encType) {\n if (encType != null && !supportedFormEncTypes.has(encType)) {\n process.env.NODE_ENV !== \"production\" ? UNSAFE_warning(false, \"\\\"\" + encType + \"\\\" is not a valid `encType` for `
    `/`` \" + (\"and will default to \\\"\" + defaultEncType + \"\\\"\")) : void 0;\n return null;\n }\n return encType;\n}\nfunction getFormSubmissionInfo(target, basename) {\n let method;\n let action;\n let encType;\n let formData;\n let body;\n if (isFormElement(target)) {\n // When grabbing the action from the element, it will have had the basename\n // prefixed to ensure non-JS scenarios work, so strip it since we'll\n // re-prefix in the router\n let attr = target.getAttribute(\"action\");\n action = attr ? stripBasename(attr, basename) : null;\n method = target.getAttribute(\"method\") || defaultMethod;\n encType = getFormEncType(target.getAttribute(\"enctype\")) || defaultEncType;\n formData = new FormData(target);\n } else if (isButtonElement(target) || isInputElement(target) && (target.type === \"submit\" || target.type === \"image\")) {\n let form = target.form;\n if (form == null) {\n throw new Error(\"Cannot submit a