{"version":3,"file":"6785.6d164492.js","mappings":"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ACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,KACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,GACLppB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACH6sB,EAAG,MACHC,EAAG,KACHC,EAAG,MACH/d,EAAG,MACHge,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,MACH7lB,EAAG,KACHC,EAAG,MACH6lB,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,IACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,EAAG,CACD,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,KACL9rB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACH6sB,EAAG,MACHC,EAAG,MACHC,EAAG,MACH/d,EAAG,MACHge,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,MACH7lB,EAAG,KACHC,EAAG,MACH6lB,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,EAAG,CACD,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,IACL9rB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACH6sB,EAAG,MACHC,EAAG,KACHC,EAAG,MACH/d,EAAG,MACHge,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,MACH7lB,EAAG,KACHC,EAAG,MACH6lB,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,EACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OAEL,EAAG,CACD,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,IAAK,MACL,IAAK,KACL,IAAK,MACL,IAAK,MACL,IAAK,MACL9rB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACH6sB,EAAG,MACHC,EAAG,MACHC,EAAG,MACH/d,EAAG,MACHge,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,MACH7lB,EAAG,KACHC,EAAG,MACH6lB,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,KACL9rB,EAAG,MACHC,EAAG,IACHsB,EAAG,KACHrF,EAAG,IACHM,EAAG,MACH6sB,EAAG,MACHC,EAAG,MACHC,EAAG,MACH/d,EAAG,KACHge,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,IACHC,EAAG,MACHrG,EAAG,KACH3E,EAAG,KACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,KACH7lB,EAAG,IACHC,EAAG,MACH6lB,EAAG,MACHC,EAAG,IACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,IACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,KACHC,EAAG,IACHC,EAAG,OACHC,EAAG,KACHC,EAAG,MACHC,EAAG,MAEL,GAAI,CACF,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,MACL9rB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,KACH6sB,EAAG,MACHC,EAAG,MACHC,EAAG,MACH/d,EAAG,MACHge,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,MACHrG,EAAG,MACH3E,EAAG,MACHiL,EAAG,MACHC,EAAG,MACHC,EAAG,MACH7lB,EAAG,KACHC,EAAG,MACH6lB,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,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACHC,EAAG,OACHC,EAAG,MACHC,EAAG,IACHC,EAAG,OAEL,GAAI,CACF,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,IACL9rB,EAAG,MACHC,EAAG,KACHsB,EAAG,MACHrF,EAAG,KACHM,EAAG,MACH6sB,EAAG,MACHC,EAAG,KACHC,EAAG,MACH/d,EAAG,MACHge,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,OACHC,EAAG,MACHC,EAAG,MACHC,EAAG,MACHC,EAAG,KACH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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 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 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),\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, 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)\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, 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)\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])\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}\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)\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])\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. Stock 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_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) {\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).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) {\r\n return this._generateLayout(data, constants.ORDER_SCREENER, 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 isRounded?: boolean\r\n}\r\n\r\nexport const TableRow = React.forwardRef(\r\n (\r\n { isFirst, isLast, isHoverable = true, isRounded = false, ...props }: TableRowProps,\r\n ref: React.ForwardedRef\r\n ) => (\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\r\n// Keep in sync with PortfolioSizeEnum in Website/App_Code/User.cs & config/types/globals.d.ts\r\nexport enum PortfolioSizeEnum {\r\n Default = 'default',\r\n Compact = 'compact',\r\n}\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 allTransactions = 0\r\n let nonWatchTransactions = 0\r\n\r\n const computed = data.reduce((prev, current) => {\r\n allTransactions += current.transactions.length || 1\r\n nonWatchTransactions += current.transactions.length\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: nonWatchTransactions,\r\n allTransactions,\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