solid-recharts 1.0.0 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. package/package.json +4 -6
  2. package/src/animation/AnimatedItems.tsx +4 -2
  3. package/src/animation/CSSTransitionAnimate.tsx +39 -41
  4. package/src/animation/JavascriptAnimate.tsx +41 -45
  5. package/src/cartesian/Area.tsx +4 -4
  6. package/src/cartesian/AreaRevealShape.tsx +1 -1
  7. package/src/cartesian/Bar.tsx +21 -33
  8. package/src/cartesian/BarStack.tsx +5 -5
  9. package/src/cartesian/Brush.tsx +15 -19
  10. package/src/cartesian/CartesianAxis.tsx +4 -4
  11. package/src/cartesian/CartesianGrid.tsx +5 -5
  12. package/src/cartesian/ErrorBar.tsx +7 -9
  13. package/src/cartesian/Funnel.tsx +3 -3
  14. package/src/cartesian/GraphicalItemClipPath.tsx +1 -1
  15. package/src/cartesian/Line.tsx +16 -18
  16. package/src/cartesian/LineDrawShape.tsx +13 -14
  17. package/src/cartesian/ReferenceArea.tsx +4 -4
  18. package/src/cartesian/ReferenceDot.tsx +4 -4
  19. package/src/cartesian/ReferenceLine.tsx +4 -4
  20. package/src/cartesian/RenderedTicksReporter.tsx +17 -19
  21. package/src/cartesian/Scatter.tsx +3 -3
  22. package/src/cartesian/XAxis.tsx +1 -1
  23. package/src/cartesian/YAxis.tsx +33 -35
  24. package/src/cartesian/ZAxis.tsx +2 -3
  25. package/src/chart/AreaChart.tsx +1 -1
  26. package/src/chart/BarChart.tsx +1 -1
  27. package/src/chart/CartesianChart.tsx +3 -4
  28. package/src/chart/CategoricalChart.tsx +5 -5
  29. package/src/chart/ComposedChart.tsx +1 -1
  30. package/src/chart/FunnelChart.tsx +1 -1
  31. package/src/chart/LineChart.tsx +1 -1
  32. package/src/chart/PieChart.tsx +3 -4
  33. package/src/chart/PolarChart.tsx +3 -4
  34. package/src/chart/RadarChart.tsx +3 -4
  35. package/src/chart/RadialBarChart.tsx +3 -7
  36. package/src/chart/RechartsWrapper.tsx +24 -14
  37. package/src/chart/Sankey.tsx +6 -9
  38. package/src/chart/ScatterChart.tsx +1 -1
  39. package/src/chart/SunburstChart.tsx +4 -5
  40. package/src/chart/Treemap.tsx +4 -5
  41. package/src/component/ActivePoints.tsx +6 -6
  42. package/src/component/Cell.tsx +5 -23
  43. package/src/component/Cursor.tsx +3 -3
  44. package/src/component/DefaultLegendContent.tsx +6 -8
  45. package/src/component/DefaultTooltipContent.tsx +10 -14
  46. package/src/component/Dots.tsx +5 -5
  47. package/src/component/Label.tsx +10 -13
  48. package/src/component/LabelList.tsx +7 -12
  49. package/src/component/Legend.tsx +21 -26
  50. package/src/component/ResponsiveContainer.tsx +49 -52
  51. package/src/component/Text.tsx +5 -5
  52. package/src/component/Tooltip.tsx +18 -21
  53. package/src/component/TooltipBoundingBox.tsx +16 -18
  54. package/src/component/responsiveContainerUtils.ts +1 -1
  55. package/src/container/ClipPathProvider.tsx +3 -3
  56. package/src/container/Layer.tsx +5 -5
  57. package/src/container/RootSurface.tsx +1 -1
  58. package/src/container/Surface.tsx +6 -5
  59. package/src/context/ErrorBarContext.tsx +2 -2
  60. package/src/context/PanoramaContext.tsx +2 -2
  61. package/src/context/RegisterGraphicalItemId.tsx +2 -4
  62. package/src/context/chartDataContext.tsx +23 -26
  63. package/src/context/chartLayoutContext.tsx +12 -16
  64. package/src/polar/Pie.tsx +12 -13
  65. package/src/polar/PolarAngleAxis.tsx +3 -3
  66. package/src/polar/PolarGrid.tsx +5 -5
  67. package/src/polar/PolarRadiusAxis.tsx +3 -3
  68. package/src/polar/Radar.tsx +3 -3
  69. package/src/polar/RadialBar.tsx +3 -3
  70. package/src/shape/Cross.tsx +5 -5
  71. package/src/shape/Curve.tsx +7 -6
  72. package/src/shape/Dot.tsx +4 -4
  73. package/src/shape/Polygon.tsx +5 -5
  74. package/src/shape/Rectangle.tsx +20 -22
  75. package/src/shape/Sector.tsx +5 -5
  76. package/src/shape/Symbols.tsx +5 -5
  77. package/src/shape/Trapezoid.tsx +27 -29
  78. package/src/state/RechartsStoreProvider.tsx +3 -5
  79. package/src/state/ReportChartProps.tsx +6 -8
  80. package/src/state/ReportEventSettings.tsx +6 -8
  81. package/src/state/ReportMainChartProps.tsx +9 -11
  82. package/src/state/ReportPolarOptions.tsx +13 -15
  83. package/src/state/SetLegendPayload.ts +1 -1
  84. package/src/state/SetTooltipEntrySettings.tsx +1 -1
  85. package/src/state/brushSlice.ts +8 -10
  86. package/src/state/cartesianAxisSlice.ts +38 -46
  87. package/src/state/chartDataSlice.ts +23 -29
  88. package/src/state/errorBarSlice.ts +16 -22
  89. package/src/state/eventSettingsSlice.ts +9 -11
  90. package/src/state/graphicalItemsSlice.ts +13 -17
  91. package/src/state/layoutSlice.ts +19 -27
  92. package/src/state/legendSlice.ts +18 -24
  93. package/src/state/optionsSlice.ts +6 -8
  94. package/src/state/polarAxisSlice.ts +13 -21
  95. package/src/state/polarOptionsSlice.ts +14 -16
  96. package/src/state/referenceElementsSlice.ts +19 -25
  97. package/src/state/registerInStore.ts +13 -15
  98. package/src/state/renderedTicksSlice.ts +7 -11
  99. package/src/state/rootPropsSlice.ts +14 -16
  100. package/src/state/tooltipSlice.ts +95 -115
  101. package/src/state/unregisterOnCleanup.ts +20 -5
  102. package/src/state/zIndexSlice.ts +42 -50
  103. package/src/synchronisation/useChartSynchronisation.tsx +217 -213
  104. package/src/util/ActiveShapeUtils.tsx +2 -2
  105. package/src/util/BarUtils.tsx +3 -5
  106. package/src/util/FunnelUtils.tsx +1 -1
  107. package/src/util/RadialBarUtils.tsx +3 -4
  108. package/src/util/createCartesianCharts.tsx +1 -1
  109. package/src/util/createPolarCharts.tsx +1 -1
  110. package/src/util/svgPropertiesAndEvents.ts +1 -1
  111. package/src/util/tooltip/translate.ts +2 -2
  112. package/src/util/types.ts +2 -2
  113. package/src/zIndex/ZIndexLayer.tsx +68 -39
  114. package/src/zIndex/ZIndexPortal.tsx +25 -29
  115. package/test/_data.ts +408 -0
  116. package/test/animation/AnimationController.typed.spec.ts +53 -0
  117. package/test/animation/AnimationControllerImpl.spec.ts +271 -0
  118. package/test/animation/CSSTransitionAnimate.timing.spec.tsx +473 -0
  119. package/test/animation/JavascriptAnimate.spec.tsx +62 -0
  120. package/test/animation/RechartsAnimation.spec.ts +636 -0
  121. package/test/animation/easing.spec.ts +218 -0
  122. package/test/animation/legacyAnimationLengthChange.spec.tsx +803 -0
  123. package/test/animation/matchBy.spec.ts +467 -0
  124. package/test/animation/mockAnimationController.ts +40 -0
  125. package/test/animation/mockControllerAnimationManager.ts +143 -0
  126. package/test/animation/mockTimeoutController.ts +114 -0
  127. package/test/animation/timeoutController.spec.ts +138 -0
  128. package/test/animation/useAnimationStartSnapshot.spec.ts +147 -0
  129. package/test/animation/util.spec.ts +28 -0
  130. package/test/cartesian/Area.animation.spec.tsx +363 -0
  131. package/test/cartesian/Area.range.spec.tsx +54 -0
  132. package/test/cartesian/Area.spec.tsx +1202 -0
  133. package/test/cartesian/Area.stacked.render.spec.tsx +69 -0
  134. package/test/cartesian/Area.typed.spec.tsx +209 -0
  135. package/test/cartesian/Axis.integration.spec.tsx +158 -0
  136. package/test/cartesian/Bar/Bar.csstransition.spec.tsx +299 -0
  137. package/test/cartesian/Bar/Bar.spec.tsx +2314 -0
  138. package/test/cartesian/Bar/Bar.typed.spec.tsx +192 -0
  139. package/test/cartesian/Bar.animation.spec.tsx +426 -0
  140. package/test/cartesian/Bar.stackDomain.spec.tsx +66 -0
  141. package/test/cartesian/Bar.stacked.render.spec.tsx +53 -0
  142. package/test/cartesian/Bar.truncateByDomain.spec.tsx +237 -0
  143. package/test/cartesian/Bar.zeroDimensionFiltering.spec.tsx +336 -0
  144. package/test/cartesian/BarStack.spec.tsx +91 -0
  145. package/test/cartesian/Brush.keyboard.spec.tsx +88 -0
  146. package/test/cartesian/Brush.panorama.spec.tsx +41 -0
  147. package/test/cartesian/Brush.props.spec.tsx +63 -0
  148. package/test/cartesian/Brush.render.spec.tsx +117 -0
  149. package/test/cartesian/Brush.spec.tsx +522 -0
  150. package/test/cartesian/Brush.stacked.spec.tsx +221 -0
  151. package/test/cartesian/CartesianAxis.render.spec.tsx +50 -0
  152. package/test/cartesian/CartesianAxis.spec.tsx +396 -0
  153. package/test/cartesian/CartesianGrid.render.spec.tsx +39 -0
  154. package/test/cartesian/CartesianGrid.spec.tsx +2103 -0
  155. package/test/cartesian/ErrorBar.render.spec.tsx +69 -0
  156. package/test/cartesian/ErrorBar.spec.tsx +2414 -0
  157. package/test/cartesian/Funnel.animation.spec.tsx +241 -0
  158. package/test/cartesian/Funnel.spec.tsx +226 -0
  159. package/test/cartesian/Funnel.typed.spec.tsx +221 -0
  160. package/test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx +627 -0
  161. package/test/cartesian/GraphicalItemClipPath.spec.tsx +427 -0
  162. package/test/cartesian/Line.animation.spec.tsx +643 -0
  163. package/test/cartesian/Line.sparseAnimationPath.spec.tsx +98 -0
  164. package/test/cartesian/Line.spec.tsx +471 -0
  165. package/test/cartesian/Line.typed.spec.tsx +152 -0
  166. package/test/cartesian/ReferenceArea.render.spec.tsx +63 -0
  167. package/test/cartesian/ReferenceArea.spec.tsx +663 -0
  168. package/test/cartesian/ReferenceArea.typed.spec.tsx +74 -0
  169. package/test/cartesian/ReferenceDot.render.spec.tsx +55 -0
  170. package/test/cartesian/ReferenceDot.spec.tsx +462 -0
  171. package/test/cartesian/ReferenceDot.typed.spec.tsx +76 -0
  172. package/test/cartesian/ReferenceLine/ReferenceLine.panorama.spec.tsx +184 -0
  173. package/test/cartesian/ReferenceLine/ReferenceLine.spec.tsx +744 -0
  174. package/test/cartesian/ReferenceLine/ReferenceLine.typed.spec.tsx +74 -0
  175. package/test/cartesian/ReferenceLine/getEndPoints.spec.ts +399 -0
  176. package/test/cartesian/ReferenceLine.render.spec.tsx +134 -0
  177. package/test/cartesian/Scatter.animation.spec.tsx +381 -0
  178. package/test/cartesian/Scatter.render.spec.tsx +61 -0
  179. package/test/cartesian/Scatter.spec.tsx +406 -0
  180. package/test/cartesian/Scatter.typed.spec.tsx +153 -0
  181. package/test/cartesian/XAxis/XAxis.barSize.spec.tsx +336 -0
  182. package/test/cartesian/XAxis/XAxis.brush.spec.tsx +266 -0
  183. package/test/cartesian/XAxis/XAxis.categorydomain.spec.tsx +872 -0
  184. package/test/cartesian/XAxis/XAxis.dataKey.spec.tsx +86 -0
  185. package/test/cartesian/XAxis/XAxis.datatypes.spec.tsx +127 -0
  186. package/test/cartesian/XAxis/XAxis.hide.spec.tsx +106 -0
  187. package/test/cartesian/XAxis/XAxis.multiaxis.spec.tsx +336 -0
  188. package/test/cartesian/XAxis/XAxis.numberdomain.spec.tsx +1466 -0
  189. package/test/cartesian/XAxis/XAxis.padding.spec.tsx +758 -0
  190. package/test/cartesian/XAxis/XAxis.padding_clip.spec.tsx +65 -0
  191. package/test/cartesian/XAxis/XAxis.state.spec.tsx +355 -0
  192. package/test/cartesian/XAxis/XAxis.tick.spec.tsx +493 -0
  193. package/test/cartesian/XAxis/XAxis.timescale.spec.tsx +233 -0
  194. package/test/cartesian/XAxis/XAxis.type.spec.tsx +107 -0
  195. package/test/cartesian/XAxis/XAxis.typed.spec.tsx +102 -0
  196. package/test/cartesian/XAxis/XAxis.vertical.spec.tsx +265 -0
  197. package/test/cartesian/XAxis.tickFormatter.spec.tsx +54 -0
  198. package/test/cartesian/YAxis/YAxis.7362.derivedDomain.spec.tsx +230 -0
  199. package/test/cartesian/YAxis/YAxis.7362.spec.tsx +104 -0
  200. package/test/cartesian/YAxis/YAxis.interval-zero.spec.tsx +88 -0
  201. package/test/cartesian/YAxis/YAxis.label.spec.tsx +219 -0
  202. package/test/cartesian/YAxis/YAxis.spec.tsx +1595 -0
  203. package/test/cartesian/YAxis/YAxis.tick.spec.tsx +428 -0
  204. package/test/cartesian/YAxis/YAxis.tickFormatter.spec.tsx +54 -0
  205. package/test/cartesian/YAxis/YAxis.ticks.spec.tsx +263 -0
  206. package/test/cartesian/YAxis/YAxis.type.spec.tsx +107 -0
  207. package/test/cartesian/YAxis/YAxis.typed.spec.tsx +102 -0
  208. package/test/cartesian/ZAxis.spec.tsx +300 -0
  209. package/test/cartesian/ZAxis.typed.spec.tsx +33 -0
  210. package/test/cartesian/__snapshots__/Brush.spec.tsx.snap +5 -0
  211. package/test/cartesian/axisLineAndStroke.spec.tsx +72 -0
  212. package/test/cartesian/getCartesianPosition.spec.ts +907 -0
  213. package/test/cartesian/getEquidistantTicks.spec.ts +88 -0
  214. package/test/cartesian/getTicks.spec.ts +378 -0
  215. package/test/cartesian/miscFeatureGaps.spec.tsx +89 -0
  216. package/test/cartesian/useAnimatedLineLength.spec.ts +168 -0
  217. package/test/chart/AccessibilityLayer.spec.tsx +569 -0
  218. package/test/chart/AccessibilityScans.spec.tsx +286 -0
  219. package/test/chart/AreaChart.spec.tsx +409 -0
  220. package/test/chart/AreaChart.stacked.spec.tsx +1407 -0
  221. package/test/chart/AreaChart.typed.spec.tsx +39 -0
  222. package/test/chart/BarChart.spec.tsx +3719 -0
  223. package/test/chart/BarChart.typed.spec.tsx +60 -0
  224. package/test/chart/CategoricalChart.spec.tsx +255 -0
  225. package/test/chart/ComposedChart.spec.tsx +199 -0
  226. package/test/chart/ComposedChart.typed.spec.tsx +39 -0
  227. package/test/chart/FunnelChart.spec.tsx +215 -0
  228. package/test/chart/FunnelChart.typed.spec.tsx +39 -0
  229. package/test/chart/LineChart.multiseries.spec.tsx +50 -0
  230. package/test/chart/LineChart.smoke.spec.tsx +50 -0
  231. package/test/chart/LineChart.spec.tsx +930 -0
  232. package/test/chart/LineChart.typed.spec.tsx +39 -0
  233. package/test/chart/NicheChartTooltip.spec.tsx +81 -0
  234. package/test/chart/PieChart.spec.tsx +793 -0
  235. package/test/chart/PieChart.typed.spec.tsx +39 -0
  236. package/test/chart/RadarChart.spec.tsx +530 -0
  237. package/test/chart/RadarChart.typed.spec.tsx +39 -0
  238. package/test/chart/RadialBarChart.5966.spec.tsx +48 -0
  239. package/test/chart/RadialBarChart.spec.tsx +679 -0
  240. package/test/chart/RadialBarChart.typed.spec.tsx +39 -0
  241. package/test/chart/RechartsWrapper.spec.tsx +83 -0
  242. package/test/chart/Sankey.content.spec.tsx +46 -0
  243. package/test/chart/Sankey.spec.tsx +952 -0
  244. package/test/chart/Sankey.typed.spec.tsx +29 -0
  245. package/test/chart/ScatterChart.spec.tsx +2613 -0
  246. package/test/chart/ScatterChart.typed.spec.tsx +39 -0
  247. package/test/chart/SunburstChart.spec.tsx +146 -0
  248. package/test/chart/Treemap.animation.spec.tsx +52 -0
  249. package/test/chart/Treemap.spec.tsx +1003 -0
  250. package/test/chart/Treemap.typed.spec.tsx +26 -0
  251. package/test/chart/chartEvents.spec.tsx +127 -0
  252. package/test/chart/responsive.spec.tsx +620 -0
  253. package/test/component/Cell.render.spec.tsx +155 -0
  254. package/test/component/Cell.spec.tsx +12 -0
  255. package/test/component/Cursor.spec.tsx +186 -0
  256. package/test/component/DefaultTooltipContent.spec.tsx +102 -0
  257. package/test/component/Label.render.spec.tsx +63 -0
  258. package/test/component/Label.spec.tsx +686 -0
  259. package/test/component/Label.typed.spec.tsx +46 -0
  260. package/test/component/LabelList.spec.tsx +188 -0
  261. package/test/component/Legend.itemSorter.spec.tsx +704 -0
  262. package/test/component/Legend.render.spec.tsx +92 -0
  263. package/test/component/Legend.spec.tsx +2213 -0
  264. package/test/component/Legend.typed.spec.tsx +22 -0
  265. package/test/component/ResponsiveContainer.spec.tsx +523 -0
  266. package/test/component/ResponsiveContainerDataTest.spec.tsx +51 -0
  267. package/test/component/Text.spec.tsx +415 -0
  268. package/test/component/Text.typed.spec.tsx +46 -0
  269. package/test/component/Tooltip/ActiveDot.spec.tsx +370 -0
  270. package/test/component/Tooltip/Tooltip.animation.spec.tsx +209 -0
  271. package/test/component/Tooltip/Tooltip.content.spec.tsx +128 -0
  272. package/test/component/Tooltip/Tooltip.formatter.spec.tsx +152 -0
  273. package/test/component/Tooltip/Tooltip.includeHidden.spec.tsx +79 -0
  274. package/test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx +165 -0
  275. package/test/component/Tooltip/Tooltip.offset.spec.tsx +113 -0
  276. package/test/component/Tooltip/Tooltip.state.spec.tsx +74 -0
  277. package/test/component/Tooltip/Tooltip.sync.spec.tsx +639 -0
  278. package/test/component/Tooltip/defaultIndex.spec.tsx +227 -0
  279. package/test/component/Tooltip/graphicalItem.formatter.spec.tsx +138 -0
  280. package/test/component/Tooltip/itemSorter.spec.tsx +2815 -0
  281. package/test/component/Tooltip/tooltipEventType.spec.tsx +344 -0
  282. package/test/component/Tooltip/tooltipMouseHoverSelectors.ts +41 -0
  283. package/test/component/Tooltip/tooltipTestHelpers.tsx +162 -0
  284. package/test/component/Tooltip.defaultIndex.spec.tsx +48 -0
  285. package/test/component/Tooltip.hover.spec.tsx +61 -0
  286. package/test/component/Tooltip.item.spec.tsx +54 -0
  287. package/test/component/Tooltip.keyboard.spec.tsx +51 -0
  288. package/test/component/Tooltip.payload.spec.tsx +1716 -0
  289. package/test/component/Tooltip.touch.spec.tsx +39 -0
  290. package/test/component/Tooltip.visibility.spec.tsx +1889 -0
  291. package/test/component/TooltipBoundingBox.spec.tsx +89 -0
  292. package/test/component/responsiveContainerUtils.spec.ts +205 -0
  293. package/test/container/ClipPath.spec.tsx +602 -0
  294. package/test/container/chartDimensions.spec.tsx +368 -0
  295. package/test/context/chartLayoutContext.spec.tsx +378 -0
  296. package/test/helper/ExpectAxisDomain.tsx +27 -0
  297. package/test/helper/assertNotNull.ts +6 -0
  298. package/test/helper/assertZIndexLayerOrder.ts +19 -0
  299. package/test/helper/createSelectorTestCase.tsx +176 -0
  300. package/test/helper/expectAnimatedPieAngles.ts +100 -0
  301. package/test/helper/expectAnimatedPiePaths.ts +78 -0
  302. package/test/helper/expectAreaCurve.ts +15 -0
  303. package/test/helper/expectAxisTicks.ts +48 -0
  304. package/test/helper/expectBars.ts +54 -0
  305. package/test/helper/expectFunctionReturning.ts +58 -0
  306. package/test/helper/expectLabel.ts +32 -0
  307. package/test/helper/expectLastCalledWith.ts +48 -0
  308. package/test/helper/expectLine.ts +20 -0
  309. package/test/helper/expectPieSectors.ts +80 -0
  310. package/test/helper/expectScale.ts +37 -0
  311. package/test/helper/expectScatterPoints.ts +52 -0
  312. package/test/helper/expectStackGroups.ts +144 -0
  313. package/test/helper/mockAxes.ts +22 -0
  314. package/test/helper/mockGetBoundingClientRect.ts +66 -0
  315. package/test/helper/mockHTMLElementProperty.ts +19 -0
  316. package/test/helper/mockTouchingElement.ts +27 -0
  317. package/test/helper/offsetHelpers.ts +19 -0
  318. package/test/helper/parameterizedTestCases.tsx +99 -0
  319. package/test/helper/produceState.ts +32 -0
  320. package/test/helper/selectorTestHelpers.tsx +63 -0
  321. package/test/helper/trim.spec.ts +35 -0
  322. package/test/helper/trim.ts +11 -0
  323. package/test/hooks/useActiveTooltipDataPoints.spec.tsx +358 -0
  324. package/test/hooks/useAxisDomain.spec.tsx +361 -0
  325. package/test/hooks/useAxisScale.spec.tsx +283 -0
  326. package/test/hooks/useAxisTicks.spec.tsx +130 -0
  327. package/test/hooks/useOffset.spec.tsx +248 -0
  328. package/test/hooks/useTooltipStateHooks.spec.tsx +109 -0
  329. package/test/polar/Pie/Pie-TwoLevelPieChart.spec.tsx +135 -0
  330. package/test/polar/Pie/Pie.spec.tsx +784 -0
  331. package/test/polar/Pie/Pie.typed.spec.tsx +78 -0
  332. package/test/polar/Pie.animation.spec.tsx +529 -0
  333. package/test/polar/PieWithLegend.animation.spec.tsx +142 -0
  334. package/test/polar/PolarAngleAxis/PolarAngleAxis.events.spec.tsx +76 -0
  335. package/test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx +2079 -0
  336. package/test/polar/PolarAngleAxis/PolarAngleAxis.typed.spec.tsx +102 -0
  337. package/test/polar/PolarAngleAxis.render.spec.tsx +79 -0
  338. package/test/polar/PolarGrid.render.spec.tsx +75 -0
  339. package/test/polar/PolarGrid.spec.tsx +918 -0
  340. package/test/polar/PolarLegendPerRow.render.spec.tsx +85 -0
  341. package/test/polar/PolarRadiusAxis.events.spec.tsx +65 -0
  342. package/test/polar/PolarRadiusAxis.render.spec.tsx +52 -0
  343. package/test/polar/PolarRadiusAxis.spec.tsx +991 -0
  344. package/test/polar/PolarRadiusAxis.typed.spec.tsx +84 -0
  345. package/test/polar/PolarTooltipLegend.render.spec.tsx +80 -0
  346. package/test/polar/Radar.animation.spec.tsx +570 -0
  347. package/test/polar/Radar.render.spec.tsx +71 -0
  348. package/test/polar/Radar.spec.tsx +265 -0
  349. package/test/polar/Radar.typed.spec.tsx +119 -0
  350. package/test/polar/RadialBar/RadialBar.spec.tsx +1521 -0
  351. package/test/polar/RadialBar/RadialBar.typed.spec.tsx +132 -0
  352. package/test/polar/RadialBar.animation.spec.tsx +375 -0
  353. package/test/polar/RadialBar.render.spec.tsx +66 -0
  354. package/test/polar/RadialBar.stacked.spec.tsx +57 -0
  355. package/test/setup.ts +84 -0
  356. package/test/shape/ActiveShape.spec.tsx +181 -0
  357. package/test/shape/Cross.spec.tsx +60 -0
  358. package/test/shape/Cross.typed.spec.tsx +26 -0
  359. package/test/shape/Curve.spec.tsx +368 -0
  360. package/test/shape/Curve.typed.spec.tsx +69 -0
  361. package/test/shape/Dot.spec.tsx +73 -0
  362. package/test/shape/Dot.typed.spec.tsx +30 -0
  363. package/test/shape/Polygon.spec.tsx +357 -0
  364. package/test/shape/Polygon.typed.spec.tsx +28 -0
  365. package/test/shape/Rectangle.animation.spec.tsx +451 -0
  366. package/test/shape/Rectangle.spec.tsx +68 -0
  367. package/test/shape/Rectangle.typed.spec.tsx +24 -0
  368. package/test/shape/Sector.spec.tsx +76 -0
  369. package/test/shape/Sector.typed.spec.tsx +24 -0
  370. package/test/shape/Symbols.spec.tsx +43 -0
  371. package/test/shape/Symbols.typed.spec.tsx +24 -0
  372. package/test/shape/Trapezoid.spec.tsx +50 -0
  373. package/test/shape/Trapezoid.typed.spec.tsx +24 -0
  374. package/test/shape/__snapshots__/Cross.spec.tsx.snap +62 -0
  375. package/test/shape/__snapshots__/Curve.spec.tsx.snap +460 -0
  376. package/test/shape/__snapshots__/Polygon.spec.tsx.snap +58 -0
  377. package/test/shape/__snapshots__/Rectangle.spec.tsx.snap +117 -0
  378. package/test/shape/__snapshots__/Sector.spec.tsx.snap +71 -0
  379. package/test/shape/__snapshots__/Trapezoid.spec.tsx.snap +64 -0
  380. package/test/state/chartDataSlice.spec.ts +53 -0
  381. package/test/state/createCollectionActions.spec.ts +87 -0
  382. package/test/state/createSelector.spec.ts +158 -0
  383. package/test/state/externalEventsMiddleware.spec.ts +178 -0
  384. package/test/state/graphicalItemsSlice.spec.ts +92 -0
  385. package/test/state/hooks.spec.tsx +68 -0
  386. package/test/state/legendSlice.spec.ts +44 -0
  387. package/test/state/mouseEventsMiddleware.spec.ts +75 -0
  388. package/test/state/optionsSlice.spec.ts +19 -0
  389. package/test/state/referenceElementsSlice.spec.ts +84 -0
  390. package/test/state/registerInStore.spec.tsx +101 -0
  391. package/test/state/selectors/areaSelectors.spec.tsx +77 -0
  392. package/test/state/selectors/axisSelectors.spec.tsx +1418 -0
  393. package/test/state/selectors/barStackSelectors.spec.tsx +752 -0
  394. package/test/state/selectors/brushSelectors.spec.tsx +30 -0
  395. package/test/state/selectors/cartesianAxisSlice.spec.ts +96 -0
  396. package/test/state/selectors/combineNiceTicks.spec.ts +207 -0
  397. package/test/state/selectors/combiners/combineActiveTooltipIndex.spec.ts +61 -0
  398. package/test/state/selectors/combiners/combineAllBarPositions.spec.ts +39 -0
  399. package/test/state/selectors/combiners/combineConfiguredScale.spec.ts +56 -0
  400. package/test/state/selectors/combiners/combineDisplayedStackedData.spec.ts +123 -0
  401. package/test/state/selectors/combiners/combineRealScaleType.spec.ts +80 -0
  402. package/test/state/selectors/containerSelectors.spec.tsx +168 -0
  403. package/test/state/selectors/dataSelectors.spec.tsx +136 -0
  404. package/test/state/selectors/legendSelectors.spec.tsx +113 -0
  405. package/test/state/selectors/lineSelectors.spec.tsx +60 -0
  406. package/test/state/selectors/pieSelectors.spec.tsx +72 -0
  407. package/test/state/selectors/radarSelectors.spec.tsx +496 -0
  408. package/test/state/selectors/rootPropsSelectors.spec.tsx +169 -0
  409. package/test/state/selectors/scatterSelectors.spec.tsx +47 -0
  410. package/test/state/selectors/selectActiveTooltipIndex.spec.tsx +234 -0
  411. package/test/state/selectors/selectAllAxes.spec.tsx +18 -0
  412. package/test/state/selectors/selectAxisDomain.spec.tsx +21 -0
  413. package/test/state/selectors/selectAxisDomainIncludingNiceTicks.spec.tsx +19 -0
  414. package/test/state/selectors/selectAxisRangeWithReverse.spec.tsx +22 -0
  415. package/test/state/selectors/selectAxisScale.spec.tsx +91 -0
  416. package/test/state/selectors/selectBarRectangles.stackOffset.spec.tsx +503 -0
  417. package/test/state/selectors/selectBaseAxis.spec.tsx +56 -0
  418. package/test/state/selectors/selectCartesianItemsSettings.spec.tsx +57 -0
  419. package/test/state/selectors/selectChartOffset.spec.tsx +26 -0
  420. package/test/state/selectors/selectDisplayedData.spec.tsx +282 -0
  421. package/test/state/selectors/selectIsTooltipActive.spec.tsx +231 -0
  422. package/test/state/selectors/selectNumericalDomain.spec.tsx +21 -0
  423. package/test/state/selectors/selectRealScaleType.spec.tsx +19 -0
  424. package/test/state/selectors/selectStackGroups.spec.tsx +322 -0
  425. package/test/state/selectors/selectXAxisPosition.spec.tsx +22 -0
  426. package/test/state/selectors/selectYAxisPosition.spec.tsx +22 -0
  427. package/test/state/selectors/selectorMemoization.spec.tsx +136 -0
  428. package/test/state/selectors/selectors.spec.tsx +1613 -0
  429. package/test/state/throttling.spec.ts +200 -0
  430. package/test/state/zIndexSlice.spec.ts +85 -0
  431. package/test/synchronisation/useChartSynchronisation.spec.tsx +225 -0
  432. package/test/util/BarUtils.spec.ts +39 -0
  433. package/test/util/CartesianUtils/CartesianUtils.spec.ts +261 -0
  434. package/test/util/CartesianUtils/rectWithPoints.spec.ts +48 -0
  435. package/test/util/ChartUtils/ChartUtils.spec.ts +491 -0
  436. package/test/util/ChartUtils/appendOffsetOfLegend.spec.ts +136 -0
  437. package/test/util/ChartUtils/appendOffsetOfLegend.spec.tsx +133 -0
  438. package/test/util/ChartUtils/getCateCoordinateOfLine.spec.ts +97 -0
  439. package/test/util/ChartUtils/getStackedData.spec.ts +416 -0
  440. package/test/util/ChartUtils/truncateByDomain.spec.ts +70 -0
  441. package/test/util/DataUtils.spec.ts +385 -0
  442. package/test/util/DomUtils.spec.tsx +117 -0
  443. package/test/util/FunnelUtils.spec.tsx +70 -0
  444. package/test/util/Global.spec.ts +11 -0
  445. package/test/util/LRUCache.spec.ts +81 -0
  446. package/test/util/LogUtils.spec.ts +45 -0
  447. package/test/util/PolarUtils.spec.ts +66 -0
  448. package/test/util/ReduceCssCalcPrototype.spec.ts +141 -0
  449. package/test/util/ShallowEqual.spec.ts +102 -0
  450. package/test/util/TickUtils.spec.ts +29 -0
  451. package/test/util/createChartHelpers.spec.tsx +210 -0
  452. package/test/util/cursor/getCursorPoints.spec.ts +136 -0
  453. package/test/util/cursor/getCursorRectangle.spec.ts +50 -0
  454. package/test/util/cursor/getRadialCursorPoints.spec.ts +36 -0
  455. package/test/util/errorValue.spec.ts +69 -0
  456. package/test/util/getEveryNth.spec.ts +39 -0
  457. package/test/util/getRadiusAndStrokeWidthFromDot.spec.ts +51 -0
  458. package/test/util/getRelativeCoordinate.spec.ts +250 -0
  459. package/test/util/getSliced.spec.ts +45 -0
  460. package/test/util/isDomainSpecifiedByUser.spec.ts +207 -0
  461. package/test/util/isWellBehavedNumber.spec.ts +54 -0
  462. package/test/util/payload/getUniqPayload.spec.ts +56 -0
  463. package/test/util/propsAreEqual.spec.ts +75 -0
  464. package/test/util/round.spec.ts +112 -0
  465. package/test/util/scale/arithmetic.spec.ts +61 -0
  466. package/test/util/scale/createCategoricalInverse.spec.ts +84 -0
  467. package/test/util/scale/getNiceTickValues.spec.ts +421 -0
  468. package/test/util/scale/getTickValuesFixedDomain.spec.ts +155 -0
  469. package/test/util/svgPropertiesAndEvents.spec.tsx +206 -0
  470. package/test/util/svgPropertiesNoEvents.spec.tsx +228 -0
  471. package/test/util/tooltip/translate.spec.ts +396 -0
  472. package/test/util/useAnimationId.spec.tsx +59 -0
  473. package/test/util/useElementOffset.spec.tsx +173 -0
  474. package/test/util/usePrefersReducedMotion.spec.ts +54 -0
  475. package/test/util/useUniqueId.spec.ts +99 -0
  476. package/test/utils/diagnostics-allowlist.ts +18 -0
  477. package/test/utils/diagnostics.ts +58 -0
  478. package/test/zIndex/AllZIndexPortals.spec.tsx +83 -0
  479. package/test/zIndex/DefaultZIndexes.spec.ts +80 -0
  480. package/test/zIndex/DynamicZIndex.spec.tsx +102 -0
  481. package/test/zIndex/ZIndexLayer.portalOwner.spec.tsx +125 -0
  482. package/test/zIndex/componentZIndex.spec.tsx +255 -0
  483. package/test/zIndex/getZIndexFromUnknown.spec.ts +51 -0
  484. package/test/zIndex/multiChartZIndexIsolation.spec.tsx +90 -0
  485. package/test/zIndex/zIndexSelectors.spec.ts +172 -0
  486. package/test-results/.last-run.json +4 -0
  487. package/tsconfig.json +11 -0
  488. package/src/util/DirectPortal.tsx +0 -107
@@ -0,0 +1,1613 @@
1
+ // Ported from recharts 3.8.1 test/state/selectors/selectors.spec.tsx
2
+ // (commit 7a23854). Solid deviations: upstream's Redux dispatch cases use the
3
+ // Solid-native store actions; tooltip selector exports live in tooltipSelectors.
4
+ import { createEffect, flush } from "solid-js";
5
+ import { describe, expect, it, test, vi } from "vitest";
6
+ import { render } from "@solidjs/testing-library";
7
+ import { RechartsStoreProvider } from "../../../src/state/RechartsStoreProvider";
8
+ import { createRechartsStore, type RechartsRootState } from "../../../src/state/store";
9
+ import { arrayTooltipSearcher } from "../../../src/state/optionsSlice";
10
+ import { useTooltipEventType } from "../../../src/state/selectors/selectTooltipEventType";
11
+ import {
12
+ selectActiveCoordinate,
13
+ selectActiveIndex,
14
+ selectActivePropsFromChartPointer,
15
+ selectIsTooltipActive,
16
+ selectTooltipPayload,
17
+ selectTooltipPayloadConfigurations,
18
+ } from "../../../src/state/selectors/tooltipSelectors";
19
+ import { selectTooltipState } from "../../../src/state/selectors/selectTooltipState";
20
+ import { combineTooltipPayload } from "../../../src/state/selectors/combiners/combineTooltipPayload";
21
+ import { useAppSelector } from "../../../src/state/hooks";
22
+ import type {
23
+ TooltipIndex,
24
+ TooltipPayload,
25
+ TooltipPayloadConfiguration,
26
+ TooltipPayloadEntry,
27
+ } from "../../../src/state/tooltipSlice";
28
+ import { ChartDataState, initialChartDataState } from "../../../src/state/chartDataSlice";
29
+ import { noop } from "../../../src/util/DataUtils";
30
+ import type {
31
+ Coordinate,
32
+ PolarCoordinate,
33
+ RelativePointer,
34
+ TooltipEventType,
35
+ } from "../../../src/util/types";
36
+ import type { TooltipTrigger } from "../../../src/chart/types";
37
+ import { produceState } from "../../helper/produceState";
38
+ import {
39
+ Area,
40
+ BarChart,
41
+ ComposedChart,
42
+ Line,
43
+ LineChart,
44
+ Pie,
45
+ PieChart,
46
+ Scatter,
47
+ } from "../../../src";
48
+ import { PageData, pageData } from "../../_data";
49
+ import { mockGetBoundingClientRect } from "../../helper/mockGetBoundingClientRect";
50
+ import { expectLastCalledWith } from "../../helper/expectLastCalledWith";
51
+ import { useAppSelectorWithStableTest } from "../../helper/selectorTestHelpers";
52
+
53
+ // preloadedState used by selectTooltipPayload cases (mirrors recharts).
54
+ const preloadedTooltipState: Partial<RechartsRootState> = {
55
+ options: {
56
+ tooltipPayloadSearcher: arrayTooltipSearcher,
57
+ chartName: "",
58
+ eventEmitter: undefined,
59
+ defaultTooltipEventType: "axis",
60
+ },
61
+ };
62
+ const tooltipActiveCoordinate: Coordinate = { x: 100, y: 200 };
63
+ const activeCoordinate: Coordinate = { x: 100, y: 200 };
64
+
65
+ const allTooltipEventTypes: ReadonlyArray<TooltipEventType> = ["axis", "item"];
66
+
67
+ const exampleTooltipPayloadConfiguration1: TooltipPayloadConfiguration = {
68
+ settings: {
69
+ fill: "fill",
70
+ name: "name is ignored in Scatter in recharts 2.x",
71
+ color: "color",
72
+ dataKey: "dataKey1",
73
+ nameKey: "nameKey1",
74
+ graphicalItemId: "graphicalItemId1",
75
+ },
76
+ dataDefinedOnItem: [
77
+ [
78
+ {
79
+ name: "stature",
80
+ unit: "cm",
81
+ value: 100,
82
+ payload: { x: 100, y: 200, z: 200 },
83
+ dataKey: "x",
84
+ },
85
+ { name: "weight", unit: "kg", value: 200, payload: { x: 100, y: 200, z: 200 }, dataKey: "y" },
86
+ ],
87
+ ],
88
+ getPosition: noop,
89
+ };
90
+ const exampleTooltipPayloadConfiguration2: TooltipPayloadConfiguration = {
91
+ settings: {
92
+ fill: "fill 2",
93
+ name: "name 2",
94
+ color: "color 2",
95
+ dataKey: "dataKey2",
96
+ nameKey: "nameKey2",
97
+ graphicalItemId: "graphicalItemId2",
98
+ },
99
+ dataDefinedOnItem: [
100
+ [
101
+ { name: "height", unit: "cm", value: 100, payload: { x: 100, y: 200, z: 200 }, dataKey: "x" },
102
+ { name: "width", unit: "m", value: 4, payload: { x: 10, y: 20, z: 20 }, dataKey: "y" },
103
+ ],
104
+ ],
105
+ getPosition: noop,
106
+ };
107
+
108
+ type TestCaseTooltipCombination = {
109
+ tooltipEventType: TooltipEventType;
110
+ trigger: TooltipTrigger;
111
+ };
112
+
113
+ const allTooltipCombinations: ReadonlyArray<TestCaseTooltipCombination> = [
114
+ { tooltipEventType: "axis", trigger: "hover" },
115
+ { tooltipEventType: "axis", trigger: "click" },
116
+ { tooltipEventType: "item", trigger: "hover" },
117
+ { tooltipEventType: "item", trigger: "click" },
118
+ ];
119
+
120
+ describe("useTooltipEventType", () => {
121
+ type TooltipEventTypeTestScenario = {
122
+ testName: string;
123
+ shared: undefined | boolean;
124
+ defaultTooltipEventType: TooltipEventType;
125
+ validateTooltipEventTypes: ReadonlyArray<TooltipEventType>;
126
+ expected: TooltipEventType;
127
+ };
128
+
129
+ const testCases: ReadonlyArray<TooltipEventTypeTestScenario> = [
130
+ {
131
+ testName: "default case",
132
+ shared: undefined,
133
+ defaultTooltipEventType: "item",
134
+ validateTooltipEventTypes: [],
135
+ expected: "item",
136
+ },
137
+ {
138
+ testName: "shared and axis type is allowed",
139
+ shared: true,
140
+ defaultTooltipEventType: "item",
141
+ validateTooltipEventTypes: ["axis", "item"],
142
+ expected: "axis",
143
+ },
144
+ {
145
+ testName: "shared but axis type is not allowed",
146
+ shared: true,
147
+ defaultTooltipEventType: "item",
148
+ validateTooltipEventTypes: ["item"],
149
+ expected: "item",
150
+ },
151
+ {
152
+ testName: "not shared and item type is allowed",
153
+ shared: false,
154
+ defaultTooltipEventType: "axis",
155
+ validateTooltipEventTypes: ["axis", "item"],
156
+ expected: "item",
157
+ },
158
+ {
159
+ testName: "not shared but item type is not allowed",
160
+ shared: false,
161
+ defaultTooltipEventType: "axis",
162
+ validateTooltipEventTypes: ["axis"],
163
+ expected: "axis",
164
+ },
165
+ ];
166
+
167
+ it("should return undefined when outside of store context", () => {
168
+ const spy = vi.fn();
169
+ const Comp = (): null => {
170
+ const eventType = useTooltipEventType(undefined);
171
+ createEffect(
172
+ () => eventType(),
173
+ (value) => spy(value),
174
+ );
175
+ return null;
176
+ };
177
+ render(() => <Comp />);
178
+ flush();
179
+ expect(spy).toHaveBeenCalledWith(undefined);
180
+ });
181
+
182
+ test.each(testCases)(
183
+ "$testName should return $expected",
184
+ ({ shared, defaultTooltipEventType, validateTooltipEventTypes, expected }) => {
185
+ const spy = vi.fn();
186
+ const Comp = (): null => {
187
+ const eventType = useTooltipEventType(shared);
188
+ createEffect(
189
+ () => eventType(),
190
+ (value) => spy(value),
191
+ );
192
+ return null;
193
+ };
194
+ const preloadedState: Partial<RechartsRootState> = {
195
+ options: {
196
+ defaultTooltipEventType,
197
+ validateTooltipEventTypes,
198
+ tooltipPayloadSearcher: arrayTooltipSearcher,
199
+ chartName: "",
200
+ eventEmitter: undefined,
201
+ },
202
+ };
203
+ render(() => (
204
+ <RechartsStoreProvider preloadedState={preloadedState}>
205
+ <Comp />
206
+ </RechartsStoreProvider>
207
+ ));
208
+ flush();
209
+ expect(spy).toHaveBeenCalledWith(expected);
210
+ },
211
+ );
212
+ });
213
+
214
+ describe("selectActiveCoordinate", () => {
215
+ it.each(allTooltipCombinations)(
216
+ "should return undefined for initial state for $tooltipEventType $trigger",
217
+ ({ tooltipEventType, trigger }) => {
218
+ const store = createRechartsStore();
219
+ const actual = selectActiveCoordinate(store.state, tooltipEventType, trigger, undefined);
220
+ expect(actual).toEqual(undefined);
221
+ },
222
+ );
223
+
224
+ it("should return coordinate after setMouseOverAxisIndex", () => {
225
+ const store = createRechartsStore();
226
+ store.actions.tooltip.setMouseOverAxisIndex({
227
+ activeCoordinate: { x: 3, y: 4 },
228
+ activeDataKey: "uv",
229
+ activeIndex: "1",
230
+ });
231
+ flush();
232
+ const actual = selectActiveCoordinate(store.state, "axis", "hover", undefined);
233
+ expect(actual).toEqual({ x: 3, y: 4 });
234
+ });
235
+
236
+ it("should return coordinate after setMouseClickAxisIndex", () => {
237
+ const store = createRechartsStore();
238
+ store.actions.tooltip.setMouseClickAxisIndex({
239
+ activeCoordinate: { x: 7, y: 8 },
240
+ activeDataKey: "uv",
241
+ activeIndex: "2",
242
+ });
243
+ flush();
244
+ const actual = selectActiveCoordinate(store.state, "axis", "click", undefined);
245
+ expect(actual).toEqual({ x: 7, y: 8 });
246
+ });
247
+
248
+ it("should return coordinate after setSyncInteraction", () => {
249
+ const store = createRechartsStore();
250
+ store.actions.tooltip.setSyncInteraction({
251
+ active: true,
252
+ coordinate: { x: 5, y: 6 },
253
+ dataKey: "uv",
254
+ index: "1",
255
+ label: "Page B",
256
+ sourceViewBox: { x: 0, y: 0, width: 100, height: 100 },
257
+ graphicalItemId: undefined,
258
+ });
259
+ flush();
260
+ const actual = selectActiveCoordinate(store.state, "axis", "hover", undefined);
261
+ expect(actual).toEqual({ x: 5, y: 6 });
262
+ });
263
+
264
+ it("should return coordinates when mouseOverAxisIndex is fired and stop returning them after mouseLeaveChart", () => {
265
+ const store = createRechartsStore(preloadedTooltipState);
266
+
267
+ const initialState = createRechartsStore().state;
268
+ const expected: Coordinate | PolarCoordinate | undefined = { x: 100, y: 150 };
269
+ expect(selectActiveCoordinate(initialState, "axis", "hover", undefined)).toBe(undefined);
270
+
271
+ store.actions.tooltip.setMouseOverAxisIndex({
272
+ activeIndex: "1",
273
+ activeCoordinate: expected,
274
+ activeDataKey: undefined,
275
+ });
276
+ flush();
277
+
278
+ expect(selectActiveCoordinate(store.state, "axis", "hover", undefined)).toEqual(expected);
279
+
280
+ store.actions.tooltip.mouseLeaveChart();
281
+ flush();
282
+
283
+ expect(selectActiveCoordinate(store.state, "axis", "hover", undefined)).toEqual({
284
+ x: 100,
285
+ y: 150,
286
+ });
287
+ // the selector stops returning the coordinates but they should still be present in store for the next animation
288
+ expect(store.state.tooltip.axisInteraction.hover.coordinate).toEqual(expected);
289
+ });
290
+
291
+ it("should return coordinates when mouseClickAxisIndex is fired and keep them after mouseLeaveChart", () => {
292
+ const store = createRechartsStore(preloadedTooltipState);
293
+
294
+ const initialState = createRechartsStore().state;
295
+ const expected: Coordinate | PolarCoordinate | undefined = { x: 100, y: 150 };
296
+ expect(selectActiveCoordinate(initialState, "axis", "click", undefined)).toBe(undefined);
297
+
298
+ store.actions.tooltip.setMouseClickAxisIndex({
299
+ activeIndex: "1",
300
+ activeCoordinate: expected,
301
+ activeDataKey: undefined,
302
+ });
303
+ flush();
304
+
305
+ expect(selectActiveCoordinate(store.state, "axis", "click", undefined)).toEqual(expected);
306
+
307
+ store.actions.tooltip.mouseLeaveChart();
308
+ flush();
309
+
310
+ expect(selectActiveCoordinate(store.state, "axis", "click", undefined)).toEqual(expected);
311
+ });
312
+
313
+ it("should return coordinates when mouseOverItemIndex is fired and keep them after mouseLeaveItem", () => {
314
+ const store = createRechartsStore(preloadedTooltipState);
315
+
316
+ const initialState = createRechartsStore().state;
317
+ const expected: Coordinate | PolarCoordinate | undefined = { x: 100, y: 150 };
318
+ expect(selectActiveCoordinate(initialState, "item", "hover", undefined)).toBe(undefined);
319
+
320
+ store.actions.tooltip.setActiveMouseOverItemIndex({
321
+ activeIndex: "1",
322
+ activeCoordinate: expected,
323
+ activeDataKey: undefined,
324
+ activeGraphicalItemId: "id-1",
325
+ });
326
+ flush();
327
+
328
+ expect(selectActiveCoordinate(store.state, "item", "hover", undefined)).toEqual(expected);
329
+
330
+ // neither of these reset the coordinates and the selector does NOT stop returning them
331
+ store.actions.tooltip.mouseLeaveItem();
332
+ store.actions.tooltip.mouseLeaveChart();
333
+ flush();
334
+
335
+ expect(selectActiveCoordinate(store.state, "item", "hover", undefined)).toEqual({
336
+ x: 100,
337
+ y: 150,
338
+ });
339
+ // the selector stops returning the coordinates but they should still be present in store for the next animation
340
+ expect(store.state.tooltip.itemInteraction.hover.coordinate).toEqual(expected);
341
+ });
342
+
343
+ it("should return coordinates when mouseClickItemIndex is fired and keep them after mouseLeaveItem", () => {
344
+ const store = createRechartsStore(preloadedTooltipState);
345
+
346
+ const initialState = createRechartsStore().state;
347
+ const expected: Coordinate | PolarCoordinate | undefined = {
348
+ x: 100,
349
+ y: 150,
350
+ };
351
+ expect(selectActiveCoordinate(initialState, "item", "click", undefined)).toBe(undefined);
352
+
353
+ store.actions.tooltip.setActiveClickItemIndex({
354
+ activeIndex: "1",
355
+ activeCoordinate: expected,
356
+ activeDataKey: undefined,
357
+ activeGraphicalItemId: "id-1",
358
+ });
359
+ flush();
360
+
361
+ expect(selectActiveCoordinate(store.state, "item", "click", undefined)).toEqual(expected);
362
+
363
+ // neither of these should reset coordinate
364
+ store.actions.tooltip.mouseLeaveItem();
365
+ store.actions.tooltip.mouseLeaveChart();
366
+ flush();
367
+
368
+ expect(selectActiveCoordinate(store.state, "item", "click", undefined)).toEqual(expected);
369
+ });
370
+ });
371
+
372
+ describe("selectIsTooltipActive", () => {
373
+ it.each(allTooltipCombinations)(
374
+ "should return false for initial state for $tooltipEventType $trigger",
375
+ ({ tooltipEventType, trigger }) => {
376
+ const store = createRechartsStore();
377
+ const actual = selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined);
378
+ expect(actual).toEqual({
379
+ activeIndex: null,
380
+ isActive: false,
381
+ });
382
+ },
383
+ );
384
+
385
+ it("should return true after setMouseOverAxisIndex", () => {
386
+ const store = createRechartsStore();
387
+ store.actions.tooltip.setMouseOverAxisIndex({
388
+ activeCoordinate: { x: 0, y: 0 },
389
+ activeDataKey: "uv",
390
+ activeIndex: "1",
391
+ });
392
+ flush();
393
+ const actual = selectIsTooltipActive(store.state, "axis", "hover", undefined);
394
+ expect(actual).toEqual({
395
+ activeIndex: "1",
396
+ isActive: true,
397
+ });
398
+ });
399
+
400
+ it("should return true after setSyncInteraction", () => {
401
+ const store = createRechartsStore();
402
+ store.actions.tooltip.setSyncInteraction({
403
+ active: true,
404
+ dataKey: "uv",
405
+ index: "1",
406
+ label: "Page B",
407
+ coordinate: { x: 0, y: 0 },
408
+ sourceViewBox: { x: 0, y: 0, width: 100, height: 100 },
409
+ graphicalItemId: undefined,
410
+ });
411
+ flush();
412
+ const actual = selectIsTooltipActive(store.state, "axis", "hover", undefined);
413
+ expect(actual).toEqual({
414
+ activeIndex: "1",
415
+ isActive: true,
416
+ });
417
+ });
418
+
419
+ describe.each(allTooltipCombinations)(
420
+ "tooltipEventType: $tooltipEventType tooltipTrigger: $trigger",
421
+ ({ tooltipEventType, trigger }) => {
422
+ it("should return true if a defaultIndex has been set", () => {
423
+ const store = createRechartsStore();
424
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, "1")).toEqual({
425
+ isActive: true,
426
+ activeIndex: "1",
427
+ });
428
+ });
429
+ },
430
+ );
431
+
432
+ describe("trigger: hover", () => {
433
+ const trigger = "hover";
434
+
435
+ describe.each(allTooltipEventTypes)("tooltipEventType: %s", (tooltipEventType) => {
436
+ it("should return false if user is clicking on a graphical item", () => {
437
+ // in browser, this is difficult to reproduce - one usually has to mouse over first before clicking
438
+ const store = createRechartsStore();
439
+ store.actions.tooltip.setActiveClickItemIndex({
440
+ activeIndex: "1",
441
+ activeDataKey: "dataKey1",
442
+ activeCoordinate,
443
+ activeGraphicalItemId: "foo",
444
+ });
445
+ flush();
446
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
447
+ isActive: false,
448
+ activeIndex: null,
449
+ });
450
+ });
451
+
452
+ it("should return false if user is clicking on an axis", () => {
453
+ // in browser, this is difficult to reproduce - one usually has to mouse over first before clicking
454
+ const store = createRechartsStore();
455
+ store.actions.tooltip.setMouseClickAxisIndex({
456
+ activeIndex: "1",
457
+ activeDataKey: "dataKey1",
458
+ activeCoordinate,
459
+ });
460
+ flush();
461
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
462
+ isActive: false,
463
+ activeIndex: null,
464
+ });
465
+ });
466
+ });
467
+
468
+ describe("tooltipEventType: item", () => {
469
+ const tooltipEventType = "item";
470
+ it("should return true if user is hovering over a graphical item but not axis", () => {
471
+ const store = createRechartsStore();
472
+ store.actions.tooltip.setMouseOverAxisIndex({
473
+ activeIndex: "1",
474
+ activeDataKey: undefined,
475
+ activeCoordinate,
476
+ });
477
+ flush();
478
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
479
+ isActive: false,
480
+ activeIndex: null,
481
+ });
482
+ store.actions.tooltip.setActiveMouseOverItemIndex({
483
+ activeIndex: "1",
484
+ activeDataKey: "dataKey1",
485
+ activeCoordinate,
486
+ activeGraphicalItemId: "foo",
487
+ });
488
+ flush();
489
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
490
+ isActive: true,
491
+ activeIndex: "1",
492
+ });
493
+ store.actions.tooltip.mouseLeaveItem();
494
+ flush();
495
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
496
+ isActive: false,
497
+ activeIndex: null,
498
+ });
499
+ });
500
+
501
+ it("should return false after mouse leaves the chart element", () => {
502
+ const store = createRechartsStore();
503
+ store.actions.tooltip.setActiveMouseOverItemIndex({
504
+ activeIndex: "1",
505
+ activeDataKey: "dataKey1",
506
+ activeCoordinate,
507
+ activeGraphicalItemId: "id-1",
508
+ });
509
+ flush();
510
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
511
+ isActive: true,
512
+ activeIndex: "1",
513
+ });
514
+ store.actions.tooltip.mouseLeaveChart();
515
+ flush();
516
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
517
+ isActive: false,
518
+ activeIndex: null,
519
+ });
520
+ });
521
+ });
522
+
523
+ describe("tooltipEventType: axis", () => {
524
+ const tooltipEventType = "axis";
525
+ it(`should return true if user is hovering over an axis,
526
+ and then continue returning true when user hovers over and then leaves a graphical item`, () => {
527
+ const store = createRechartsStore();
528
+ store.actions.tooltip.setActiveMouseOverItemIndex({
529
+ activeIndex: "1",
530
+ activeDataKey: "dataKey1",
531
+ activeCoordinate,
532
+ activeGraphicalItemId: "foo",
533
+ });
534
+ flush();
535
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
536
+ isActive: false,
537
+ activeIndex: null,
538
+ });
539
+ store.actions.tooltip.setMouseOverAxisIndex({
540
+ activeIndex: "1",
541
+ activeDataKey: undefined,
542
+ activeCoordinate,
543
+ });
544
+ flush();
545
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
546
+ isActive: true,
547
+ activeIndex: "1",
548
+ });
549
+ store.actions.tooltip.setActiveMouseOverItemIndex({
550
+ activeIndex: "1",
551
+ activeDataKey: "dataKey1",
552
+ activeCoordinate,
553
+ activeGraphicalItemId: "foo",
554
+ });
555
+ flush();
556
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
557
+ isActive: true,
558
+ activeIndex: "1",
559
+ });
560
+ store.actions.tooltip.mouseLeaveItem();
561
+ flush();
562
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
563
+ isActive: true,
564
+ activeIndex: "1",
565
+ });
566
+ });
567
+
568
+ it.todo("should return false after mouse leaves the chart element");
569
+ });
570
+ });
571
+
572
+ describe("trigger: click", () => {
573
+ const trigger = "click";
574
+
575
+ describe.each(allTooltipEventTypes)("tooltipEventType: %s", (tooltipEventType) => {
576
+ it("should return false if user is hovering over a graphical item", () => {
577
+ const store = createRechartsStore();
578
+ store.actions.tooltip.setActiveMouseOverItemIndex({
579
+ activeIndex: "1",
580
+ activeDataKey: "dataKey1",
581
+ activeCoordinate,
582
+ activeGraphicalItemId: "foo",
583
+ });
584
+ flush();
585
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
586
+ isActive: false,
587
+ activeIndex: null,
588
+ });
589
+ });
590
+
591
+ it("should return false if user is hovering over an axis", () => {
592
+ const store = createRechartsStore();
593
+ store.actions.tooltip.setMouseOverAxisIndex({
594
+ activeIndex: null,
595
+ activeDataKey: undefined,
596
+ activeCoordinate,
597
+ });
598
+ flush();
599
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
600
+ isActive: false,
601
+ activeIndex: null,
602
+ });
603
+ });
604
+ });
605
+
606
+ describe("tooltipEventType: item", () => {
607
+ const tooltipEventType = "item";
608
+ it(`should return true if user is clicking a graphical item and continue returning true forever,
609
+ because recharts does not allow ever turning off a tooltip that was triggered by a click`, () => {
610
+ const store = createRechartsStore();
611
+ store.actions.tooltip.setActiveClickItemIndex({
612
+ activeIndex: "1",
613
+ activeDataKey: "dataKey1",
614
+ activeCoordinate,
615
+ activeGraphicalItemId: "foo",
616
+ });
617
+ flush();
618
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
619
+ isActive: true,
620
+ activeIndex: "1",
621
+ });
622
+ store.actions.tooltip.setActiveClickItemIndex({
623
+ activeIndex: "2",
624
+ activeDataKey: undefined,
625
+ activeCoordinate,
626
+ activeGraphicalItemId: "bar",
627
+ });
628
+ flush();
629
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
630
+ isActive: true,
631
+ activeIndex: "2",
632
+ });
633
+ store.actions.tooltip.mouseLeaveItem();
634
+ flush();
635
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
636
+ isActive: true,
637
+ activeIndex: "2",
638
+ });
639
+ store.actions.tooltip.setMouseClickAxisIndex({
640
+ activeIndex: "1",
641
+ activeDataKey: undefined,
642
+ activeCoordinate,
643
+ });
644
+ flush();
645
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
646
+ isActive: true,
647
+ activeIndex: "2",
648
+ });
649
+ });
650
+
651
+ it("should return false if user is clicking on an axis", () => {
652
+ const store = createRechartsStore();
653
+ store.actions.tooltip.setMouseClickAxisIndex({
654
+ activeIndex: "1",
655
+ activeDataKey: "dataKey1",
656
+ activeCoordinate,
657
+ });
658
+ flush();
659
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
660
+ isActive: false,
661
+ activeIndex: null,
662
+ });
663
+ });
664
+ });
665
+
666
+ describe("tooltipEventType: axis", () => {
667
+ const tooltipEventType = "axis";
668
+ it("should return true if user is clicking on an axis, and continue returning true forever", () => {
669
+ const store = createRechartsStore();
670
+ store.actions.tooltip.setMouseClickAxisIndex({
671
+ activeIndex: "1",
672
+ activeDataKey: "dataKey1",
673
+ activeCoordinate,
674
+ });
675
+ flush();
676
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
677
+ isActive: true,
678
+ activeIndex: "1",
679
+ });
680
+ store.actions.tooltip.setMouseClickAxisIndex({
681
+ activeIndex: "2",
682
+ activeDataKey: undefined,
683
+ activeCoordinate,
684
+ });
685
+ flush();
686
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
687
+ isActive: true,
688
+ activeIndex: "2",
689
+ });
690
+ store.actions.tooltip.mouseLeaveItem();
691
+ flush();
692
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
693
+ isActive: true,
694
+ activeIndex: "2",
695
+ });
696
+ store.actions.tooltip.setActiveClickItemIndex({
697
+ activeIndex: "1",
698
+ activeDataKey: "dataKey1",
699
+ activeCoordinate,
700
+ activeGraphicalItemId: "id-1",
701
+ });
702
+ flush();
703
+ expect(selectIsTooltipActive(store.state, tooltipEventType, trigger, undefined)).toEqual({
704
+ isActive: true,
705
+ activeIndex: "2",
706
+ });
707
+ });
708
+ });
709
+ });
710
+ });
711
+
712
+ describe("selectActiveIndexFromChartPointer", () => {
713
+ const exampleChartPointer: RelativePointer = {
714
+ relativeX: 10,
715
+ relativeY: 10,
716
+ };
717
+
718
+ it("should return active props after mouse hover", () => {
719
+ const tooltipActiveSpy = vi.fn();
720
+ mockGetBoundingClientRect({ width: 100, height: 100 });
721
+ const Comp = (): null => {
722
+ const props = useAppSelectorWithStableTest((state) =>
723
+ selectActivePropsFromChartPointer(state, exampleChartPointer),
724
+ );
725
+ createEffect(
726
+ () => props(),
727
+ (value) => tooltipActiveSpy(value),
728
+ );
729
+ return null;
730
+ };
731
+ render(() => (
732
+ <LineChart data={pageData} width={100} height={100}>
733
+ <Line dataKey="pv" />
734
+ <Comp />
735
+ </LineChart>
736
+ ));
737
+ flush();
738
+
739
+ expect(tooltipActiveSpy).toHaveBeenLastCalledWith({
740
+ activeCoordinate: {
741
+ x: 5,
742
+ y: 10,
743
+ },
744
+ activeIndex: "0",
745
+ });
746
+ });
747
+ });
748
+
749
+ describe("selectTooltipState.tooltipItemPayloads", () => {
750
+ it("should return undefined when called outside of store context", () => {
751
+ const spy = vi.fn();
752
+ const Comp = (): null => {
753
+ const payload = useAppSelectorWithStableTest(selectTooltipState);
754
+ createEffect(
755
+ () => payload(),
756
+ (value) => spy(value),
757
+ );
758
+ return null;
759
+ };
760
+ render(() => <Comp />);
761
+ flush();
762
+ expect(spy).toHaveBeenCalledWith(undefined);
763
+ });
764
+
765
+ it("should return empty array for initial state", () => {
766
+ const store = createRechartsStore();
767
+ expect(selectTooltipState(store.state).tooltipItemPayloads).toEqual([]);
768
+ });
769
+
770
+ it("should return empty array in an empty chart", () => {
771
+ const spy = vi.fn();
772
+ const Comp = (): null => {
773
+ const tooltipState = useAppSelectorWithStableTest(selectTooltipState);
774
+ createEffect(
775
+ () => tooltipState()?.tooltipItemPayloads.map((tp) => tp.dataDefinedOnItem),
776
+ (value) => spy(value),
777
+ );
778
+ return null;
779
+ };
780
+ render(() => (
781
+ <BarChart data={PageData} width={100} height={100}>
782
+ <Comp />
783
+ </BarChart>
784
+ ));
785
+ flush();
786
+ expectLastCalledWith(spy, []);
787
+ });
788
+
789
+ it("should return all tooltip payloads defined on graphical items in ComposedChart", () => {
790
+ const spy = vi.fn();
791
+ const Comp = (): null => {
792
+ const tooltipState = useAppSelectorWithStableTest(selectTooltipState);
793
+ createEffect(
794
+ () => tooltipState()?.tooltipItemPayloads.map((tp) => tp.dataDefinedOnItem),
795
+ (value) => spy(value),
796
+ );
797
+ return null;
798
+ };
799
+ const data1 = [{ x: 1 }, { x: 2 }, { x: 3 }];
800
+ const data2 = [{ x: 10 }, { x: 20 }, { x: 30 }];
801
+ render(() => (
802
+ <ComposedChart data={PageData} width={100} height={100}>
803
+ <Area dataKey="x" data={data1} />
804
+ <Area dataKey="x" data={data2} />
805
+ <Line data={[4, 5, 6]} />
806
+ <Line data={[40, 50, 60]} />
807
+ <Scatter data={[{ x: 7 }, { x: 8 }, { x: 9 }]} dataKey="x" />
808
+ <Scatter data={[{ y: 70 }, { y: 80 }, { y: 90 }]} dataKey="y" />
809
+ <Comp />
810
+ </ComposedChart>
811
+ ));
812
+ flush();
813
+ // two of these elements will send the data as defined; Scatter decides to pre-chew it
814
+ expectLastCalledWith(spy, [
815
+ data1,
816
+ data2,
817
+ [4, 5, 6],
818
+ [40, 50, 60],
819
+ [
820
+ [
821
+ {
822
+ dataKey: "x",
823
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
824
+ name: undefined,
825
+ payload: {
826
+ x: 7,
827
+ },
828
+ type: undefined,
829
+ unit: "",
830
+ value: 7,
831
+ },
832
+ {
833
+ dataKey: "x",
834
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
835
+ name: undefined,
836
+ payload: {
837
+ x: 7,
838
+ },
839
+ type: undefined,
840
+ unit: "",
841
+ value: 7,
842
+ },
843
+ ],
844
+ [
845
+ {
846
+ dataKey: "x",
847
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
848
+ name: undefined,
849
+ payload: {
850
+ x: 8,
851
+ },
852
+ type: undefined,
853
+ unit: "",
854
+ value: 8,
855
+ },
856
+ {
857
+ dataKey: "x",
858
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
859
+ name: undefined,
860
+ payload: {
861
+ x: 8,
862
+ },
863
+ type: undefined,
864
+ unit: "",
865
+ value: 8,
866
+ },
867
+ ],
868
+ [
869
+ {
870
+ dataKey: "x",
871
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
872
+ name: undefined,
873
+ payload: {
874
+ x: 9,
875
+ },
876
+ type: undefined,
877
+ unit: "",
878
+ value: 9,
879
+ },
880
+ {
881
+ dataKey: "x",
882
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
883
+ name: undefined,
884
+ payload: {
885
+ x: 9,
886
+ },
887
+ type: undefined,
888
+ unit: "",
889
+ value: 9,
890
+ },
891
+ ],
892
+ ],
893
+ [
894
+ [
895
+ {
896
+ dataKey: "y",
897
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
898
+ name: undefined,
899
+ payload: {
900
+ y: 70,
901
+ },
902
+ type: undefined,
903
+ unit: "",
904
+ value: 70,
905
+ },
906
+ {
907
+ dataKey: "y",
908
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
909
+ name: undefined,
910
+ payload: {
911
+ y: 70,
912
+ },
913
+ type: undefined,
914
+ unit: "",
915
+ value: 70,
916
+ },
917
+ ],
918
+ [
919
+ {
920
+ dataKey: "y",
921
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
922
+ name: undefined,
923
+ payload: {
924
+ y: 80,
925
+ },
926
+ type: undefined,
927
+ unit: "",
928
+ value: 80,
929
+ },
930
+ {
931
+ dataKey: "y",
932
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
933
+ name: undefined,
934
+ payload: {
935
+ y: 80,
936
+ },
937
+ type: undefined,
938
+ unit: "",
939
+ value: 80,
940
+ },
941
+ ],
942
+ [
943
+ {
944
+ dataKey: "y",
945
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
946
+ name: undefined,
947
+ payload: {
948
+ y: 90,
949
+ },
950
+ type: undefined,
951
+ unit: "",
952
+ value: 90,
953
+ },
954
+ {
955
+ dataKey: "y",
956
+ graphicalItemId: expect.stringMatching(/^recharts-scatter-.+/),
957
+ name: undefined,
958
+ payload: {
959
+ y: 90,
960
+ },
961
+ type: undefined,
962
+ unit: "",
963
+ value: 90,
964
+ },
965
+ ],
966
+ ],
967
+ ]);
968
+ });
969
+
970
+ it("should return all payloads in PieChart", () => {
971
+ const spy = vi.fn();
972
+ const Comp = (): null => {
973
+ const tooltipState = useAppSelectorWithStableTest(selectTooltipState);
974
+ createEffect(
975
+ () => tooltipState()?.tooltipItemPayloads.map((tp) => tp.dataDefinedOnItem),
976
+ (value) => spy(value),
977
+ );
978
+ return null;
979
+ };
980
+ render(() => (
981
+ <PieChart width={100} height={100}>
982
+ <Comp />
983
+ <Pie data={[{ x: 1 }, { x: 2 }, { x: 3 }]} dataKey="x" id="pie-1" />
984
+ <Pie data={[{ y: 10 }, { y: 20 }, { y: 30 }]} dataKey="y" id="pie-2" />
985
+ </PieChart>
986
+ ));
987
+ flush();
988
+ expectLastCalledWith(spy, [
989
+ [
990
+ [
991
+ {
992
+ color: "#808080",
993
+ dataKey: "x",
994
+ fill: "#808080",
995
+ name: 0,
996
+ payload: { x: 1 },
997
+ type: undefined,
998
+ value: 1,
999
+ graphicalItemId: "pie-1",
1000
+ },
1001
+ ],
1002
+ [
1003
+ {
1004
+ color: "#808080",
1005
+ dataKey: "x",
1006
+ fill: "#808080",
1007
+ name: 1,
1008
+ payload: { x: 2 },
1009
+ type: undefined,
1010
+ value: 2,
1011
+ graphicalItemId: "pie-1",
1012
+ },
1013
+ ],
1014
+ [
1015
+ {
1016
+ color: "#808080",
1017
+ dataKey: "x",
1018
+ fill: "#808080",
1019
+ name: 2,
1020
+ payload: { x: 3 },
1021
+ type: undefined,
1022
+ value: 3,
1023
+ graphicalItemId: "pie-1",
1024
+ },
1025
+ ],
1026
+ ],
1027
+ [
1028
+ [
1029
+ {
1030
+ color: "#808080",
1031
+ dataKey: "y",
1032
+ fill: "#808080",
1033
+ name: 0,
1034
+ payload: { y: 10 },
1035
+ type: undefined,
1036
+ value: 10,
1037
+ graphicalItemId: "pie-2",
1038
+ },
1039
+ ],
1040
+ [
1041
+ {
1042
+ color: "#808080",
1043
+ dataKey: "y",
1044
+ fill: "#808080",
1045
+ name: 1,
1046
+ payload: { y: 20 },
1047
+ type: undefined,
1048
+ value: 20,
1049
+ graphicalItemId: "pie-2",
1050
+ },
1051
+ ],
1052
+ [
1053
+ {
1054
+ color: "#808080",
1055
+ dataKey: "y",
1056
+ fill: "#808080",
1057
+ name: 2,
1058
+ payload: { y: 30 },
1059
+ type: undefined,
1060
+ value: 30,
1061
+ graphicalItemId: "pie-2",
1062
+ },
1063
+ ],
1064
+ ],
1065
+ ]);
1066
+ });
1067
+ });
1068
+
1069
+ describe("selectActiveIndex", () => {
1070
+ it.each(allTooltipCombinations)(
1071
+ "should return null for initial state for $tooltipEventType $trigger",
1072
+ ({ tooltipEventType, trigger }) => {
1073
+ const store = createRechartsStore();
1074
+ const actual = selectActiveIndex(store.state, tooltipEventType, trigger, undefined);
1075
+ expect(actual).toEqual(null);
1076
+ },
1077
+ );
1078
+
1079
+ it("should return index after setMouseOverAxisIndex", () => {
1080
+ const store = createRechartsStore();
1081
+ store.actions.tooltip.setMouseOverAxisIndex({
1082
+ activeCoordinate: { x: 0, y: 0 },
1083
+ activeDataKey: "uv",
1084
+ activeIndex: "1",
1085
+ });
1086
+ flush();
1087
+ const actual = selectActiveIndex(store.state, "axis", "hover", undefined);
1088
+ expect(actual).toEqual("1");
1089
+ });
1090
+
1091
+ it("should return index after setSyncInteraction", () => {
1092
+ const store = createRechartsStore();
1093
+ store.actions.tooltip.setSyncInteraction({
1094
+ active: true,
1095
+ dataKey: "uv",
1096
+ index: "2",
1097
+ label: "Page B",
1098
+ coordinate: { x: 0, y: 0 },
1099
+ sourceViewBox: { x: 0, y: 0, width: 100, height: 100 },
1100
+ graphicalItemId: undefined,
1101
+ });
1102
+ flush();
1103
+ const actual = selectActiveIndex(store.state, "axis", "hover", undefined);
1104
+ expect(actual).toEqual("2");
1105
+ });
1106
+
1107
+ it("should return null for initial state", () => {
1108
+ const initialState = createRechartsStore().state;
1109
+ const expected: TooltipIndex = null;
1110
+ expect(selectActiveIndex(initialState, "axis", "hover", undefined)).toBe(expected);
1111
+ expect(selectActiveIndex(initialState, "axis", "click", undefined)).toBe(expected);
1112
+ expect(selectActiveIndex(initialState, "item", "hover", undefined)).toBe(expected);
1113
+ expect(selectActiveIndex(initialState, "item", "click", undefined)).toBe(expected);
1114
+ });
1115
+
1116
+ it("should return defaultIndex if it is defined", () => {
1117
+ const initialState = createRechartsStore().state;
1118
+ const expected: TooltipIndex = "7";
1119
+ expect(selectActiveIndex(initialState, "axis", "hover", "7")).toBe(expected);
1120
+ expect(selectActiveIndex(initialState, "axis", "click", "7")).toBe(expected);
1121
+ expect(selectActiveIndex(initialState, "item", "hover", "7")).toBe(expected);
1122
+ expect(selectActiveIndex(initialState, "item", "click", "7")).toBe(expected);
1123
+ });
1124
+
1125
+ it("should ignore defaultIndex if item hover index is set and active", () => {
1126
+ const state = produceState((draft) => {
1127
+ draft.tooltip.itemInteraction.hover.active = true;
1128
+ draft.tooltip.itemInteraction.hover.index = "7";
1129
+ });
1130
+ expect(selectActiveIndex(state, "axis", "hover", "8")).toBe("8" satisfies TooltipIndex);
1131
+ expect(selectActiveIndex(state, "axis", "click", "8")).toBe("8" satisfies TooltipIndex);
1132
+ expect(selectActiveIndex(state, "item", "hover", "8")).toBe("7" satisfies TooltipIndex);
1133
+ expect(selectActiveIndex(state, "item", "click", "8")).toBe("8" satisfies TooltipIndex);
1134
+ });
1135
+
1136
+ it("should return item hover index", () => {
1137
+ const state = produceState((draft) => {
1138
+ draft.tooltip.itemInteraction.hover.active = true;
1139
+ draft.tooltip.itemInteraction.hover.index = "7";
1140
+ });
1141
+ const expected: TooltipIndex = "7";
1142
+ expect(selectActiveIndex(state, "item", "hover", "9")).toBe(expected);
1143
+ });
1144
+
1145
+ it("should return item click index", () => {
1146
+ const state = produceState((draft) => {
1147
+ draft.tooltip.itemInteraction.click.active = true;
1148
+ draft.tooltip.itemInteraction.click.index = "7";
1149
+ });
1150
+ const expected: TooltipIndex = "7";
1151
+ expect(selectActiveIndex(state, "item", "click", "11")).toBe(expected);
1152
+ });
1153
+
1154
+ it("should return axis hover index", () => {
1155
+ const state = produceState((draft) => {
1156
+ draft.tooltip.axisInteraction.hover.active = true;
1157
+ draft.tooltip.axisInteraction.hover.index = "7";
1158
+ });
1159
+ const expected: TooltipIndex = "7";
1160
+ expect(selectActiveIndex(state, "axis", "hover", "13")).toBe(expected);
1161
+ });
1162
+
1163
+ it("should return axis click index", () => {
1164
+ const state = produceState((draft) => {
1165
+ draft.tooltip.axisInteraction.click.active = true;
1166
+ draft.tooltip.axisInteraction.click.index = "7";
1167
+ });
1168
+ const expected: TooltipIndex = "7";
1169
+ expect(selectActiveIndex(state, "axis", "click", "17")).toBe(expected);
1170
+ });
1171
+ });
1172
+
1173
+ describe("selectTooltipPayload", () => {
1174
+ it.each(allTooltipCombinations)(
1175
+ "should return undefined when outside of store context for $tooltipEventType $trigger",
1176
+ ({ tooltipEventType, trigger }) => {
1177
+ const spy = vi.fn();
1178
+ const Comp = (): null => {
1179
+ const payload = useAppSelector((state) =>
1180
+ selectTooltipPayload(state, tooltipEventType, trigger, undefined),
1181
+ );
1182
+ createEffect(
1183
+ () => payload(),
1184
+ (value) => spy(value),
1185
+ );
1186
+ return null;
1187
+ };
1188
+ render(() => <Comp />);
1189
+ flush();
1190
+ expect(spy).toHaveBeenCalledWith(undefined);
1191
+ },
1192
+ );
1193
+
1194
+ it.each(allTooltipCombinations)(
1195
+ "initial state should return undefined for $tooltipEventType $trigger",
1196
+ ({ tooltipEventType, trigger }) => {
1197
+ const store = createRechartsStore();
1198
+ expect(selectTooltipPayload(store.state, tooltipEventType, trigger, undefined)).toEqual(
1199
+ undefined,
1200
+ );
1201
+ },
1202
+ );
1203
+
1204
+ it("should return settings and data from axis hover, if activeIndex is set for the item", () => {
1205
+ const store = createRechartsStore(preloadedTooltipState);
1206
+ const tooltipSettings1: TooltipPayloadConfiguration = {
1207
+ getPosition: noop,
1208
+ settings: { nameKey: "y", graphicalItemId: "graphicalItemId1" },
1209
+ dataDefinedOnItem: undefined,
1210
+ };
1211
+ const expectedEntry1: TooltipPayloadEntry = {
1212
+ payload: undefined,
1213
+ dataKey: undefined,
1214
+ name: undefined,
1215
+ nameKey: "y",
1216
+ value: undefined,
1217
+ graphicalItemId: "graphicalItemId1",
1218
+ };
1219
+ const tooltipSettings2: TooltipPayloadConfiguration = {
1220
+ getPosition: noop,
1221
+ settings: {
1222
+ stroke: "red",
1223
+ fill: "green",
1224
+ dataKey: "x",
1225
+ nameKey: "y",
1226
+ name: "foo",
1227
+ unit: "bar",
1228
+ graphicalItemId: "graphicalItemId2",
1229
+ },
1230
+ dataDefinedOnItem: [
1231
+ { x: 8, y: 9 },
1232
+ { x: 10, y: 11 },
1233
+ ],
1234
+ };
1235
+ const expectedEntry2: TooltipPayloadEntry = {
1236
+ name: 11,
1237
+ dataKey: "x",
1238
+ nameKey: "y",
1239
+ stroke: "red",
1240
+ fill: "green",
1241
+ payload: { x: 10, y: 11 },
1242
+ value: 10,
1243
+ unit: "bar",
1244
+ graphicalItemId: "graphicalItemId2",
1245
+ };
1246
+ store.actions.tooltip.addTooltipEntrySettings(tooltipSettings1);
1247
+ store.actions.tooltip.addTooltipEntrySettings(tooltipSettings2);
1248
+ flush();
1249
+ expect(selectTooltipPayload(store.state, "axis", "hover", undefined)).toEqual(undefined);
1250
+ store.actions.tooltip.setMouseOverAxisIndex({
1251
+ activeIndex: "1",
1252
+ activeDataKey: undefined,
1253
+ activeCoordinate: tooltipActiveCoordinate,
1254
+ });
1255
+ flush();
1256
+ expect(selectTooltipPayload(store.state, "axis", "hover", undefined)).toEqual([
1257
+ expectedEntry1,
1258
+ expectedEntry2,
1259
+ ]);
1260
+ });
1261
+
1262
+ it("should return settings and data if defaultIndex is provided", () => {
1263
+ const store = createRechartsStore(preloadedTooltipState);
1264
+ const tooltipSettings1: TooltipPayloadConfiguration = {
1265
+ getPosition: noop,
1266
+ settings: { nameKey: "y", graphicalItemId: "graphicalItemId1" },
1267
+ dataDefinedOnItem: undefined,
1268
+ };
1269
+ const expectedEntry1: TooltipPayloadEntry = {
1270
+ payload: undefined,
1271
+ dataKey: undefined,
1272
+ name: undefined,
1273
+ nameKey: "y",
1274
+ value: undefined,
1275
+ graphicalItemId: "graphicalItemId1",
1276
+ };
1277
+ const tooltipSettings2: TooltipPayloadConfiguration = {
1278
+ getPosition: noop,
1279
+ settings: {
1280
+ stroke: "red",
1281
+ fill: "green",
1282
+ dataKey: "x",
1283
+ nameKey: "y",
1284
+ name: "foo",
1285
+ unit: "bar",
1286
+ graphicalItemId: "graphicalItemId2",
1287
+ },
1288
+ dataDefinedOnItem: [
1289
+ { x: 8, y: 9 },
1290
+ { x: 10, y: 11 },
1291
+ ],
1292
+ };
1293
+ const expectedEntry2: TooltipPayloadEntry = {
1294
+ name: 11,
1295
+ dataKey: "x",
1296
+ nameKey: "y",
1297
+ stroke: "red",
1298
+ fill: "green",
1299
+ payload: { x: 10, y: 11 },
1300
+ value: 10,
1301
+ unit: "bar",
1302
+ graphicalItemId: "graphicalItemId2",
1303
+ };
1304
+ store.actions.tooltip.addTooltipEntrySettings(tooltipSettings1);
1305
+ store.actions.tooltip.addTooltipEntrySettings(tooltipSettings2);
1306
+ flush();
1307
+ expect(selectTooltipPayload(store.state, "axis", "hover", "1")).toEqual([
1308
+ expectedEntry1,
1309
+ expectedEntry2,
1310
+ ]);
1311
+ });
1312
+
1313
+ it("should fill in chartData, if it is not defined on the item for item hover", () => {
1314
+ const store = createRechartsStore(preloadedTooltipState);
1315
+ const tooltipSettings: TooltipPayloadConfiguration = {
1316
+ getPosition: noop,
1317
+ settings: {
1318
+ stroke: "red",
1319
+ fill: "green",
1320
+ dataKey: "y",
1321
+ nameKey: "x",
1322
+ name: "foo",
1323
+ unit: "bar",
1324
+ graphicalItemId: "graphicalItemId1",
1325
+ },
1326
+ dataDefinedOnItem: undefined,
1327
+ };
1328
+ store.actions.tooltip.addTooltipEntrySettings(tooltipSettings);
1329
+ store.actions.chartData.setChartData([
1330
+ { x: 1, y: 2 },
1331
+ { x: 3, y: 4 },
1332
+ ]);
1333
+ store.actions.tooltip.setActiveMouseOverItemIndex({
1334
+ activeIndex: "0",
1335
+ activeDataKey: "y",
1336
+ activeCoordinate: tooltipActiveCoordinate,
1337
+ activeGraphicalItemId: tooltipSettings.settings.graphicalItemId,
1338
+ });
1339
+ flush();
1340
+ const expectedEntry: TooltipPayloadEntry = {
1341
+ name: 1,
1342
+ dataKey: "y",
1343
+ nameKey: "x",
1344
+ stroke: "red",
1345
+ fill: "green",
1346
+ payload: { x: 1, y: 2 },
1347
+ value: 2,
1348
+ unit: "bar",
1349
+ graphicalItemId: "graphicalItemId1",
1350
+ };
1351
+ expect(selectTooltipPayload(store.state, "item", "hover", undefined)).toEqual([expectedEntry]);
1352
+ });
1353
+
1354
+ it("should return sliced data if set by Brush for item hover", () => {
1355
+ const store = createRechartsStore(preloadedTooltipState);
1356
+ const tooltipSettings: TooltipPayloadConfiguration = {
1357
+ getPosition: noop,
1358
+ settings: {
1359
+ stroke: "red",
1360
+ fill: "green",
1361
+ dataKey: "y",
1362
+ nameKey: "x",
1363
+ name: "foo",
1364
+ graphicalItemId: "graphicalItemId3",
1365
+ },
1366
+ dataDefinedOnItem: [
1367
+ { x: 1, y: 2 },
1368
+ { x: 3, y: 4 },
1369
+ ],
1370
+ };
1371
+ store.actions.tooltip.addTooltipEntrySettings(tooltipSettings);
1372
+ store.actions.chartData.setChartData([
1373
+ { x: 1, y: 2 },
1374
+ { x: 3, y: 4 },
1375
+ ]);
1376
+ flush();
1377
+ expect(selectTooltipPayload(store.state, "item", "hover", undefined)).toEqual(undefined);
1378
+ store.actions.tooltip.setActiveMouseOverItemIndex({
1379
+ activeIndex: "0",
1380
+ activeDataKey: "y",
1381
+ activeCoordinate: tooltipActiveCoordinate,
1382
+ activeGraphicalItemId: tooltipSettings.settings.graphicalItemId,
1383
+ });
1384
+ store.actions.chartData.setDataStartEndIndexes({ startIndex: 1, endIndex: 10 });
1385
+ flush();
1386
+ const expectedEntry: TooltipPayloadEntry = {
1387
+ name: 3,
1388
+ dataKey: "y",
1389
+ nameKey: "x",
1390
+ stroke: "red",
1391
+ fill: "green",
1392
+ payload: { x: 3, y: 4 },
1393
+ value: 4,
1394
+ graphicalItemId: "graphicalItemId3",
1395
+ };
1396
+ expect(selectTooltipPayload(store.state, "item", "hover", undefined)).toEqual([expectedEntry]);
1397
+ });
1398
+
1399
+ it("should return array of payloads for Scatter because Scatter naturally does its own special thing", () => {
1400
+ const chartDataState: ChartDataState = initialChartDataState;
1401
+ const actual: TooltipPayload | undefined = combineTooltipPayload(
1402
+ [exampleTooltipPayloadConfiguration1],
1403
+ "0",
1404
+ chartDataState,
1405
+ undefined,
1406
+ undefined,
1407
+ arrayTooltipSearcher,
1408
+ "item",
1409
+ );
1410
+ const expectedEntry1: TooltipPayloadEntry = {
1411
+ name: "stature",
1412
+ color: "color",
1413
+ fill: "fill",
1414
+ unit: "cm",
1415
+ value: 100,
1416
+ payload: { x: 100, y: 200, z: 200 },
1417
+ dataKey: "x",
1418
+ nameKey: "nameKey1",
1419
+ graphicalItemId: "graphicalItemId1",
1420
+ };
1421
+ const expectedEntry2: TooltipPayloadEntry = {
1422
+ name: "weight",
1423
+ color: "color",
1424
+ fill: "fill",
1425
+ unit: "kg",
1426
+ value: 200,
1427
+ payload: { x: 100, y: 200, z: 200 },
1428
+ dataKey: "y",
1429
+ nameKey: "nameKey1",
1430
+ graphicalItemId: "graphicalItemId1",
1431
+ };
1432
+ expect(actual).toEqual([expectedEntry1, expectedEntry2]);
1433
+ });
1434
+
1435
+ it("should use dataKey from tooltipAxis, if item dataKey is undefined", () => {
1436
+ const tooltipPayloadConfiguration: TooltipPayloadConfiguration = {
1437
+ settings: { nameKey: undefined, graphicalItemId: "graphicalItemId1" },
1438
+ dataDefinedOnItem: [],
1439
+ getPosition: noop,
1440
+ };
1441
+ const chartDataState: ChartDataState = initialChartDataState;
1442
+ const actual: TooltipPayload | undefined = combineTooltipPayload(
1443
+ [tooltipPayloadConfiguration],
1444
+ "0",
1445
+ chartDataState,
1446
+ "dataKeyOnAxis",
1447
+ undefined,
1448
+ arrayTooltipSearcher,
1449
+ "axis",
1450
+ );
1451
+ const expected: TooltipPayloadEntry = {
1452
+ dataKey: "dataKeyOnAxis",
1453
+ payload: undefined,
1454
+ value: undefined,
1455
+ graphicalItemId: "graphicalItemId1",
1456
+ };
1457
+ expect(actual).toEqual([expected]);
1458
+ });
1459
+ });
1460
+
1461
+ describe("selectTooltipPayloadConfigurations", () => {
1462
+ let exampleStore: ReturnType<typeof createRechartsStore>;
1463
+
1464
+ beforeEach(() => {
1465
+ exampleStore = createRechartsStore();
1466
+ exampleStore.actions.tooltip.addTooltipEntrySettings(exampleTooltipPayloadConfiguration1);
1467
+ exampleStore.actions.tooltip.addTooltipEntrySettings(exampleTooltipPayloadConfiguration2);
1468
+ flush();
1469
+ });
1470
+
1471
+ describe.each(allTooltipCombinations)(
1472
+ "tooltipEventType: $tooltipEventType tooltipTrigger: $trigger",
1473
+ ({ tooltipEventType, trigger }) => {
1474
+ it("should return undefined when outside of store context", () => {
1475
+ const spy = vi.fn();
1476
+ const Comp = (): null => {
1477
+ const result = useAppSelector((state) =>
1478
+ selectTooltipPayloadConfigurations(state, tooltipEventType, trigger, undefined),
1479
+ );
1480
+ createEffect(
1481
+ () => result(),
1482
+ (value) => spy(value),
1483
+ );
1484
+ return null;
1485
+ };
1486
+ render(() => <Comp />);
1487
+ flush();
1488
+ expect(spy).toHaveBeenCalledWith(undefined);
1489
+ });
1490
+
1491
+ it("should return empty array from empty state", () => {
1492
+ const store = createRechartsStore();
1493
+ expect(
1494
+ selectTooltipPayloadConfigurations(store.state, tooltipEventType, trigger, undefined),
1495
+ ).toEqual([]);
1496
+ });
1497
+ },
1498
+ );
1499
+
1500
+ describe.each<TooltipTrigger>(["hover", "click"])(
1501
+ 'tooltipEventType: "axis" tooltipTrigger: %s',
1502
+ (trigger) => {
1503
+ it("should return unfiltered configurations with tooltipEventType: axis", () => {
1504
+ const expected: ReadonlyArray<TooltipPayloadConfiguration> = [
1505
+ exampleTooltipPayloadConfiguration1,
1506
+ exampleTooltipPayloadConfiguration2,
1507
+ ];
1508
+ expect(
1509
+ selectTooltipPayloadConfigurations(exampleStore.state, "axis", trigger, undefined),
1510
+ ).toEqual(expected);
1511
+ });
1512
+ },
1513
+ );
1514
+
1515
+ it("should filter by dataKey with tooltipEventType: item and trigger: hover", () => {
1516
+ exampleStore.actions.tooltip.setActiveMouseOverItemIndex({
1517
+ activeIndex: "1",
1518
+ activeDataKey: "dataKey1",
1519
+ activeCoordinate: undefined,
1520
+ activeGraphicalItemId: exampleTooltipPayloadConfiguration1.settings.graphicalItemId,
1521
+ });
1522
+ flush();
1523
+ expect(
1524
+ selectTooltipPayloadConfigurations(exampleStore.state, "item", "hover", undefined),
1525
+ ).toEqual([exampleTooltipPayloadConfiguration1]);
1526
+ exampleStore.actions.tooltip.setActiveMouseOverItemIndex({
1527
+ activeIndex: "1",
1528
+ activeDataKey: "dataKey2",
1529
+ activeCoordinate: undefined,
1530
+ activeGraphicalItemId: exampleTooltipPayloadConfiguration2.settings.graphicalItemId,
1531
+ });
1532
+ flush();
1533
+ expect(
1534
+ selectTooltipPayloadConfigurations(exampleStore.state, "item", "hover", undefined),
1535
+ ).toEqual([exampleTooltipPayloadConfiguration2]);
1536
+ });
1537
+
1538
+ it("should return nothing if the tooltipEventType is hover but the only interactions are clicks", () => {
1539
+ exampleStore.actions.tooltip.setActiveClickItemIndex({
1540
+ activeIndex: "1",
1541
+ activeDataKey: "dataKey1",
1542
+ activeGraphicalItemId: "foo",
1543
+ activeCoordinate: undefined,
1544
+ });
1545
+ flush();
1546
+ expect(
1547
+ selectTooltipPayloadConfigurations(exampleStore.state, "item", "hover", undefined),
1548
+ ).toEqual([]);
1549
+ exampleStore.actions.tooltip.setMouseClickAxisIndex({
1550
+ activeIndex: "1",
1551
+ activeDataKey: "dataKey2",
1552
+ });
1553
+ flush();
1554
+ expect(
1555
+ selectTooltipPayloadConfigurations(exampleStore.state, "item", "hover", undefined),
1556
+ ).toEqual([]);
1557
+ });
1558
+
1559
+ it("should return nothing if the tooltipEventType is click but the only interactions are hovers", () => {
1560
+ exampleStore.actions.tooltip.setActiveMouseOverItemIndex({
1561
+ activeIndex: "1",
1562
+ activeDataKey: "dataKey1",
1563
+ activeCoordinate: undefined,
1564
+ activeGraphicalItemId: "foo",
1565
+ });
1566
+ flush();
1567
+ expect(
1568
+ selectTooltipPayloadConfigurations(exampleStore.state, "item", "click", undefined),
1569
+ ).toEqual([]);
1570
+ exampleStore.actions.tooltip.setMouseOverAxisIndex({
1571
+ activeIndex: "1",
1572
+ activeDataKey: "dataKey2",
1573
+ });
1574
+ flush();
1575
+ expect(
1576
+ selectTooltipPayloadConfigurations(exampleStore.state, "item", "click", undefined),
1577
+ ).toEqual([]);
1578
+ });
1579
+
1580
+ describe("with defaultIndex", () => {
1581
+ it("should return the first configuration if the tooltipEventType is item and the defaultIndex is set, before user started interacting with the chart", () => {
1582
+ expect(selectTooltipPayloadConfigurations(exampleStore.state, "item", "hover", "1")).toEqual([
1583
+ exampleTooltipPayloadConfiguration1,
1584
+ ]);
1585
+ });
1586
+
1587
+ it("should return configuration that matches the dataKey after user has started interacting", () => {
1588
+ exampleStore.actions.tooltip.setActiveMouseOverItemIndex({
1589
+ activeIndex: "1",
1590
+ activeDataKey: "dataKey2",
1591
+ activeCoordinate: undefined,
1592
+ activeGraphicalItemId: exampleTooltipPayloadConfiguration2.settings.graphicalItemId,
1593
+ });
1594
+ flush();
1595
+ expect(selectTooltipPayloadConfigurations(exampleStore.state, "item", "hover", "1")).toEqual([
1596
+ exampleTooltipPayloadConfiguration2,
1597
+ ]);
1598
+ });
1599
+
1600
+ it("should return empty array if user interacted with a an item that is not represented in the tooltip payloads", () => {
1601
+ exampleStore.actions.tooltip.setActiveMouseOverItemIndex({
1602
+ activeIndex: "1",
1603
+ activeGraphicalItemId: "id-notPresentInPayloads",
1604
+ activeCoordinate: undefined,
1605
+ activeDataKey: "dataKey-notPresentInPayloads",
1606
+ });
1607
+ flush();
1608
+ expect(selectTooltipPayloadConfigurations(exampleStore.state, "item", "hover", "1")).toEqual(
1609
+ [],
1610
+ );
1611
+ });
1612
+ });
1613
+ });