@octanejs/recharts 0.1.41 → 0.1.43
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.
- package/{LICENSE → LICENSE.recharts} +3 -2
- package/README.md +12 -0
- package/package.json +10 -9
- package/src/animation/AnimatedItems.tsrx +36 -3
- package/src/animation/AnimationController.ts +17 -65
- package/src/animation/{AnimationControllerImpl.js → AnimationControllerImpl.ts} +19 -12
- package/src/animation/{AnimationHandle.js → AnimationHandle.ts} +82 -65
- package/src/animation/CSSTransitionAnimate.tsrx +3 -2
- package/src/animation/JavascriptAnimate.tsrx +18 -2
- package/src/animation/easing.ts +235 -0
- package/src/animation/{matchBy.js → matchBy.ts} +76 -120
- package/src/animation/timeoutController.ts +71 -0
- package/src/animation/useAnimationController.ts +4 -1
- package/src/animation/useAnimationStartSnapshot.ts +3 -3
- package/src/animation/util.ts +12 -0
- package/src/cartesian/Area.tsrx +33 -31
- package/src/cartesian/AreaRevealShape.tsrx +4 -3
- package/src/cartesian/Bar.ts +1 -0
- package/src/cartesian/Bar.tsrx +293 -39
- package/src/cartesian/BarStack.tsrx +31 -9
- package/src/cartesian/CartesianAxis.tsrx +154 -22
- package/src/cartesian/CartesianGrid.tsrx +5 -6
- package/src/cartesian/ErrorBar.tsrx +9 -8
- package/src/cartesian/Funnel.tsrx +40 -37
- package/src/cartesian/GraphicalItemClipPath.tsrx +11 -4
- package/src/cartesian/Line.ts +1 -0
- package/src/cartesian/Line.tsrx +206 -28
- package/src/cartesian/LineDrawShape.tsrx +23 -10
- package/src/cartesian/ReferenceLine.tsrx +8 -8
- package/src/cartesian/Scatter.tsrx +61 -66
- package/src/cartesian/XAxis.tsrx +78 -9
- package/src/cartesian/YAxis.tsrx +85 -12
- package/src/cartesian/getCartesianPosition.ts +265 -0
- package/src/cartesian/getEquidistantTicks.ts +144 -0
- package/src/cartesian/getTicks.ts +221 -0
- package/src/chart/AreaChart.tsrx +5 -1
- package/src/chart/BarChart.tsrx +8 -2
- package/src/chart/CartesianChart.tsrx +17 -4
- package/src/chart/CategoricalChart.tsrx +4 -1
- package/src/chart/ComposedChart.tsrx +5 -1
- package/src/chart/FunnelChart.tsrx +5 -1
- package/src/chart/LineChart.tsrx +8 -2
- package/src/chart/PieChart.tsrx +6 -2
- package/src/chart/PolarChart.tsrx +5 -4
- package/src/chart/RadarChart.tsrx +6 -2
- package/src/chart/RadialBarChart.tsrx +6 -2
- package/src/chart/RechartsWrapper.tsrx +57 -21
- package/src/chart/Sankey.tsrx +89 -91
- package/src/chart/ScatterChart.tsrx +5 -1
- package/src/chart/SunburstChart.tsrx +21 -14
- package/src/chart/types.ts +0 -1
- package/src/component/ActivePoints.tsrx +30 -5
- package/src/component/Cell.ts +19 -1
- package/src/component/Cursor.tsrx +11 -10
- package/src/component/DefaultLegendContent.tsrx +15 -10
- package/src/component/DefaultTooltipContent.tsrx +11 -9
- package/src/component/Dots.tsrx +37 -6
- package/src/component/Label.tsrx +99 -19
- package/src/component/LabelList.tsrx +54 -5
- package/src/component/Legend.tsrx +9 -5
- package/src/component/ResponsiveContainer.tsrx +13 -10
- package/src/component/Text.tsrx +95 -32
- package/src/component/Tooltip.tsrx +11 -10
- package/src/component/TooltipBoundingBox.tsrx +4 -5
- package/src/component/{responsiveContainerUtils.js → responsiveContainerUtils.ts} +59 -36
- package/src/container/ClipPathProvider.tsrx +6 -2
- package/src/container/Layer.tsrx +8 -1
- package/src/container/RootSurface.tsrx +15 -4
- package/src/container/Surface.tsrx +15 -1
- package/src/context/CellsContext.ts +6 -5
- package/src/context/ErrorBarContext.tsrx +23 -4
- package/src/context/RegisterGraphicalItemId.tsrx +10 -2
- package/src/context/accessibilityContext.ts +5 -0
- package/src/context/brushUpdateContext.ts +11 -0
- package/src/context/chartDataContext.ts +5 -4
- package/src/context/chartLayoutContext.ts +22 -8
- package/src/context/legendPayloadContext.tsrx +1 -1
- package/src/context/tooltipContext.ts +83 -0
- package/src/{hooks.js → hooks.ts} +88 -66
- package/src/index.ts +37 -37
- package/src/legacy-props.ts +129 -0
- package/src/polar/Pie.tsrx +91 -69
- package/src/polar/PolarAngleAxis.tsrx +47 -47
- package/src/polar/PolarGrid.tsrx +7 -6
- package/src/polar/PolarRadiusAxis.tsrx +29 -21
- package/src/polar/Radar.tsrx +26 -19
- package/src/polar/RadialBar.tsrx +59 -42
- package/src/polar/{defaultPolarAngleAxisProps.js → defaultPolarAngleAxisProps.ts} +6 -6
- package/src/polar/{defaultPolarRadiusAxisProps.js → defaultPolarRadiusAxisProps.ts} +5 -4
- package/src/shape/Cross.tsrx +14 -2
- package/src/shape/Curve.tsrx +111 -23
- package/src/shape/Dot.tsrx +12 -1
- package/src/shape/Polygon.tsrx +28 -6
- package/src/shape/Rectangle.tsrx +30 -3
- package/src/shape/Sector.tsrx +48 -6
- package/src/shape/Symbols.tsrx +24 -6
- package/src/shape/Trapezoid.tsrx +33 -3
- package/src/state/RechartsStoreProvider.tsrx +11 -2
- package/src/state/ReportChartProps.ts +2 -2
- package/src/state/ReportMainChartProps.ts +2 -1
- package/src/state/SetGraphicalItem.ts +6 -4
- package/src/state/SetLegendPayload.ts +7 -4
- package/src/state/SetTooltipEntrySettings.ts +5 -2
- package/src/state/brushSlice.ts +40 -0
- package/src/state/cartesianAxisSlice.ts +291 -0
- package/src/state/chartDataSlice.ts +87 -0
- package/src/state/errorBarSlice.ts +78 -0
- package/src/state/eventSettingsSlice.ts +30 -0
- package/src/state/{externalEventsMiddleware.js → externalEventsMiddleware.ts} +55 -34
- package/src/state/graphicalItemsSlice.ts +180 -0
- package/src/state/{keyboardEventsMiddleware.js → keyboardEventsMiddleware.ts} +72 -57
- package/src/state/layoutSlice.ts +50 -0
- package/src/state/legendSlice.ts +109 -0
- package/src/state/{mouseEventsMiddleware.js → mouseEventsMiddleware.ts} +45 -35
- package/src/state/optionsSlice.ts +65 -0
- package/src/state/polarAxisSlice.ts +42 -0
- package/src/state/polarOptionsSlice.ts +43 -0
- package/src/state/reduxDevtoolsJsonStringifyReplacer.ts +13 -0
- package/src/state/referenceElementsSlice.ts +100 -0
- package/src/state/renderedTicksSlice.ts +60 -0
- package/src/state/rootPropsSlice.ts +72 -0
- package/src/state/selectors/areaSelectors.ts +1 -2
- package/src/state/selectors/{arrayEqualityCheck.js → arrayEqualityCheck.ts} +4 -5
- package/src/state/selectors/axisSelectors.ts +2502 -0
- package/src/state/selectors/barSelectors.ts +373 -0
- package/src/state/selectors/barStackSelectors.ts +99 -0
- package/src/state/selectors/brushSelectors.ts +28 -0
- package/src/state/selectors/combiners/combineActiveLabel.ts +16 -0
- package/src/state/selectors/combiners/{combineActiveTooltipIndex.js → combineActiveTooltipIndex.ts} +45 -23
- package/src/state/selectors/combiners/combineAllBarPositions.ts +130 -0
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +16 -0
- package/src/state/selectors/combiners/combineBarPosition.ts +23 -0
- package/src/state/selectors/combiners/combineBarSizeList.ts +79 -0
- package/src/state/selectors/combiners/{combineCheckedDomain.js → combineCheckedDomain.ts} +9 -6
- package/src/state/selectors/combiners/combineConfiguredScale.ts +100 -0
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +46 -0
- package/src/state/selectors/combiners/{combineDisplayedStackedData.js → combineDisplayedStackedData.ts} +23 -19
- package/src/state/selectors/combiners/combineInverseScaleFunction.ts +16 -0
- package/src/state/selectors/combiners/{combineRealScaleType.js → combineRealScaleType.ts} +16 -8
- package/src/state/selectors/combiners/combineStackedData.ts +27 -0
- package/src/state/selectors/combiners/combineTooltipInteractionState.ts +86 -0
- package/src/state/selectors/combiners/combineTooltipPayload.ts +201 -0
- package/src/state/selectors/combiners/{combineTooltipPayloadConfigurations.js → combineTooltipPayloadConfigurations.ts} +17 -18
- package/src/state/selectors/containerSelectors.ts +12 -0
- package/src/state/selectors/{dataSelectors.js → dataSelectors.ts} +43 -41
- package/src/state/selectors/funnelSelectors.ts +5 -5
- package/src/state/selectors/graphicalItemSelectors.ts +22 -0
- package/src/state/selectors/legendSelectors.ts +25 -0
- package/src/state/selectors/lineSelectors.ts +159 -0
- package/src/state/selectors/numberDomainEqualityCheck.ts +15 -0
- package/src/state/selectors/pickAxisId.ts +6 -0
- package/src/state/selectors/pickAxisType.ts +4 -0
- package/src/state/selectors/pieSelectors.ts +14 -13
- package/src/state/selectors/polarAxisSelectors.ts +223 -0
- package/src/state/selectors/polarSelectors.ts +1 -1
- package/src/state/selectors/radarSelectors.ts +1 -1
- package/src/state/selectors/radialBarSelectors.ts +17 -16
- package/src/state/selectors/rootPropsSelectors.ts +26 -0
- package/src/state/selectors/scatterSelectors.ts +11 -10
- package/src/state/selectors/{selectActivePropsFromChartPointer.js → selectActivePropsFromChartPointer.ts} +11 -4
- package/src/state/selectors/selectAllAxes.ts +20 -0
- package/src/state/selectors/selectChartOffset.ts +17 -0
- package/src/state/selectors/selectChartOffsetInternal.ts +147 -0
- package/src/state/selectors/{selectPlotArea.js → selectPlotArea.ts} +4 -3
- package/src/state/selectors/selectTooltipAxisId.ts +6 -0
- package/src/state/selectors/{selectTooltipAxisType.js → selectTooltipAxisType.ts} +10 -4
- package/src/state/selectors/selectTooltipEventType.ts +39 -0
- package/src/state/selectors/selectTooltipPayloadSearcher.ts +6 -0
- package/src/state/selectors/selectTooltipSettings.ts +6 -0
- package/src/state/selectors/selectTooltipState.ts +5 -0
- package/src/state/selectors/selectors.ts +315 -0
- package/src/state/selectors/tooltipSelectors.ts +611 -0
- package/src/state/selectors/touchSelectors.ts +52 -0
- package/src/state/{store.js → store.ts} +46 -36
- package/src/state/tooltipSlice.ts +507 -0
- package/src/state/{touchEventsMiddleware.js → touchEventsMiddleware.ts} +54 -42
- package/src/state/types/AreaSettings.ts +15 -0
- package/src/state/types/BarSettings.ts +15 -0
- package/src/state/types/LineSettings.ts +10 -0
- package/src/state/types/PieSettings.ts +32 -0
- package/src/state/types/RadarSettings.ts +6 -0
- package/src/state/types/RadialBarSettings.ts +10 -0
- package/src/state/types/ScatterSettings.ts +13 -0
- package/src/state/types/StackedGraphicalItem.ts +34 -0
- package/src/state/zIndexSlice.ts +137 -0
- package/src/synchronisation/syncSelectors.ts +7 -0
- package/src/synchronisation/types.ts +42 -0
- package/src/synchronisation/useChartSynchronisation.tsrx +26 -11
- package/src/types.ts +55 -0
- package/src/util/ActiveShapeUtils.tsrx +34 -10
- package/src/util/BarUtils.tsrx +43 -3
- package/src/util/{CartesianUtils.js → CartesianUtils.ts} +22 -39
- package/src/util/ChartUtils.ts +759 -0
- package/src/util/{Constants.js → Constants.ts} +6 -6
- package/src/util/DOMUtils.ts +135 -0
- package/src/util/{DataUtils.js → DataUtils.ts} +120 -47
- package/src/util/Events.ts +22 -0
- package/src/util/FunnelUtils.tsrx +3 -3
- package/src/util/Global.ts +13 -0
- package/src/util/IfOverflow.ts +16 -0
- package/src/util/LRUCache.ts +42 -0
- package/src/util/{LogUtils.js → LogUtils.ts} +7 -12
- package/src/util/OctaneTypes.ts +51 -0
- package/src/util/PolarUtils.ts +132 -0
- package/src/util/RadialBarUtils.tsrx +3 -3
- package/src/util/ReduceCSSCalc.ts +186 -0
- package/src/util/ScatterUtils.tsrx +9 -7
- package/src/util/{TickUtils.js → TickUtils.ts} +30 -13
- package/src/util/{YAxisUtils.js → YAxisUtils.ts} +27 -17
- package/src/util/axisPropsAreEqual.ts +49 -0
- package/src/util/createEventProxy.ts +20 -0
- package/src/util/{excludeEventProps.js → excludeEventProps.ts} +8 -6
- package/src/util/getActiveCoordinate.ts +210 -0
- package/src/util/{getAxisTypeBasedOnLayout.js → getAxisTypeBasedOnLayout.ts} +7 -3
- package/src/util/getClassNameFromUnknown.ts +7 -0
- package/src/util/{getEveryNth.js → getEveryNth.ts} +5 -6
- package/src/util/getRadiusAndStrokeWidthFromDot.ts +31 -0
- package/src/util/{getRelativeCoordinate.js → getRelativeCoordinate.ts} +26 -9
- package/src/util/getSliced.ts +14 -0
- package/src/util/{isDomainSpecifiedByUser.js → isDomainSpecifiedByUser.ts} +46 -100
- package/src/util/isWellBehavedNumber.ts +8 -0
- package/src/util/payload/getUniqPayload.ts +1 -1
- package/src/util/{propsAreEqual.js → propsAreEqual.ts} +10 -8
- package/src/util/{resolveDefaultProps.js → resolveDefaultProps.ts} +35 -57
- package/src/util/round.ts +33 -0
- package/src/util/scale/CustomScaleDefinition.ts +82 -0
- package/src/util/scale/RechartsScale.ts +131 -0
- package/src/util/scale/{createCategoricalInverse.js → createCategoricalInverse.ts} +24 -29
- package/src/util/scale/{getNiceTickValues.js → getNiceTickValues.ts} +125 -146
- package/src/util/scale/index.ts +2 -0
- package/src/util/scale/util/{arithmetic.js → arithmetic.ts} +12 -8
- package/src/util/stacks/getStackSeriesIdentifier.ts +21 -0
- package/src/util/stacks/stackTypes.ts +58 -0
- package/src/util/{svgPropertiesNoEvents.js → svgPropertiesNoEvents.ts} +52 -27
- package/src/util/tooltip/translate.ts +2 -1
- package/src/util/typedDataKey.ts +49 -0
- package/src/util/types.ts +1265 -7
- package/src/util/{useUniqueId.js → useUniqueId.ts} +9 -5
- package/src/zIndex/{DefaultZIndexes.js → DefaultZIndexes.ts} +13 -4
- package/src/zIndex/ZIndexLayer.tsrx +13 -4
- package/src/zIndex/ZIndexPortal.tsrx +14 -4
- package/src/zIndex/{getZIndexFromUnknown.js → getZIndexFromUnknown.ts} +3 -3
- package/src/zIndex/{zIndexSelectors.js → zIndexSelectors.ts} +17 -11
- package/src/animation/easing.js +0 -193
- package/src/animation/timeoutController.js +0 -49
- package/src/animation/util.js +0 -11
- package/src/cartesian/Area.tsrx.d.ts +0 -340
- package/src/cartesian/Bar.tsrx.d.ts +0 -4
- package/src/cartesian/BarStack.tsrx.d.ts +0 -6
- package/src/cartesian/CartesianAxis.tsrx.d.ts +0 -3
- package/src/cartesian/CartesianGrid.tsrx.d.ts +0 -219
- package/src/cartesian/ErrorBar.tsrx.d.ts +0 -131
- package/src/cartesian/Funnel.tsrx.d.ts +0 -274
- package/src/cartesian/Line.tsrx.d.ts +0 -4
- package/src/cartesian/LineDrawShape.tsrx.d.ts +0 -2
- package/src/cartesian/ReferenceLine.tsrx.d.ts +0 -178
- package/src/cartesian/Scatter.tsrx.d.ts +0 -351
- package/src/cartesian/XAxis.tsrx.d.ts +0 -3
- package/src/cartesian/YAxis.tsrx.d.ts +0 -3
- package/src/cartesian/ZAxis.tsrx.d.ts +0 -102
- package/src/cartesian/getCartesianPosition.js +0 -277
- package/src/cartesian/getEquidistantTicks.js +0 -133
- package/src/cartesian/getTicks.js +0 -280
- package/src/chart/AreaChart.tsrx.d.ts +0 -12
- package/src/chart/BarChart.tsrx.d.ts +0 -2
- package/src/chart/CartesianChart.tsrx.d.ts +0 -10
- package/src/chart/ComposedChart.tsrx.d.ts +0 -12
- package/src/chart/FunnelChart.tsrx.d.ts +0 -12
- package/src/chart/LineChart.tsrx.d.ts +0 -2
- package/src/chart/PieChart.tsrx.d.ts +0 -31
- package/src/chart/RadarChart.tsrx.d.ts +0 -31
- package/src/chart/RadialBarChart.tsrx.d.ts +0 -31
- package/src/chart/Sankey.tsrx.d.ts +0 -253
- package/src/chart/ScatterChart.tsrx.d.ts +0 -12
- package/src/chart/SunburstChart.tsrx.d.ts +0 -146
- package/src/component/DefaultLegendContent.tsrx.d.ts +0 -125
- package/src/component/DefaultTooltipContent.tsrx.d.ts +0 -87
- package/src/component/Label.tsrx.d.ts +0 -12
- package/src/component/LabelList.tsrx.d.ts +0 -8
- package/src/component/Legend.tsrx.d.ts +0 -88
- package/src/component/ResponsiveContainer.tsrx.d.ts +0 -81
- package/src/component/Text.tsrx.d.ts +0 -9
- package/src/component/Tooltip.tsrx.d.ts +0 -246
- package/src/container/Layer.tsrx.d.ts +0 -6
- package/src/container/Surface.tsrx.d.ts +0 -12
- package/src/context/accessibilityContext.js +0 -10
- package/src/context/tooltipContext.js +0 -55
- package/src/index.d.ts +0 -281
- package/src/polar/Pie.tsrx.d.ts +0 -436
- package/src/polar/PolarAngleAxis.tsrx.d.ts +0 -215
- package/src/polar/PolarGrid.tsrx.d.ts +0 -117
- package/src/polar/PolarRadiusAxis.tsrx.d.ts +0 -209
- package/src/polar/Radar.tsrx.d.ts +0 -215
- package/src/polar/RadialBar.tsrx.d.ts +0 -340
- package/src/shape/Cross.tsrx.d.ts +0 -12
- package/src/shape/Curve.tsrx.d.ts +0 -42
- package/src/shape/Dot.tsrx.d.ts +0 -9
- package/src/shape/Polygon.tsrx.d.ts +0 -13
- package/src/shape/Rectangle.tsrx.d.ts +0 -31
- package/src/shape/Sector.tsrx.d.ts +0 -29
- package/src/shape/Symbols.tsrx.d.ts +0 -15
- package/src/shape/Trapezoid.tsrx.d.ts +0 -29
- package/src/state/brushSlice.js +0 -36
- package/src/state/cartesianAxisSlice.js +0 -256
- package/src/state/chartDataSlice.js +0 -67
- package/src/state/errorBarSlice.js +0 -53
- package/src/state/eventSettingsSlice.js +0 -25
- package/src/state/graphicalItemsSlice.js +0 -91
- package/src/state/layoutSlice.js +0 -57
- package/src/state/legendSlice.js +0 -83
- package/src/state/optionsSlice.js +0 -45
- package/src/state/polarAxisSlice.js +0 -33
- package/src/state/polarOptionsSlice.js +0 -26
- package/src/state/reduxDevtoolsJsonStringifyReplacer.js +0 -14
- package/src/state/referenceElementsSlice.js +0 -51
- package/src/state/renderedTicksSlice.js +0 -41
- package/src/state/rootPropsSlice.js +0 -48
- package/src/state/selectors/axisSelectors.js +0 -2113
- package/src/state/selectors/barSelectors.js +0 -263
- package/src/state/selectors/barStackSelectors.js +0 -65
- package/src/state/selectors/brushSelectors.js +0 -21
- package/src/state/selectors/combiners/combineActiveLabel.js +0 -18
- package/src/state/selectors/combiners/combineAllBarPositions.js +0 -169
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.js +0 -11
- package/src/state/selectors/combiners/combineBarPosition.js +0 -17
- package/src/state/selectors/combiners/combineBarSizeList.js +0 -115
- package/src/state/selectors/combiners/combineConfiguredScale.js +0 -46
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.js +0 -48
- package/src/state/selectors/combiners/combineInverseScaleFunction.js +0 -12
- package/src/state/selectors/combiners/combineStackedData.js +0 -22
- package/src/state/selectors/combiners/combineTooltipInteractionState.js +0 -121
- package/src/state/selectors/combiners/combineTooltipPayload.js +0 -248
- package/src/state/selectors/containerSelectors.js +0 -6
- package/src/state/selectors/graphicalItemSelectors.js +0 -25
- package/src/state/selectors/legendSelectors.js +0 -18
- package/src/state/selectors/lineSelectors.js +0 -106
- package/src/state/selectors/numberDomainEqualityCheck.js +0 -11
- package/src/state/selectors/pickAxisId.js +0 -3
- package/src/state/selectors/pickAxisType.js +0 -3
- package/src/state/selectors/polarAxisSelectors.js +0 -237
- package/src/state/selectors/rootPropsSelectors.js +0 -13
- package/src/state/selectors/selectAllAxes.js +0 -15
- package/src/state/selectors/selectChartOffset.js +0 -12
- package/src/state/selectors/selectChartOffsetInternal.js +0 -174
- package/src/state/selectors/selectTooltipAxisId.js +0 -3
- package/src/state/selectors/selectTooltipEventType.js +0 -27
- package/src/state/selectors/selectTooltipPayloadSearcher.js +0 -3
- package/src/state/selectors/selectTooltipSettings.js +0 -3
- package/src/state/selectors/selectTooltipState.js +0 -3
- package/src/state/selectors/selectors.js +0 -222
- package/src/state/selectors/tooltipSelectors.js +0 -471
- package/src/state/selectors/touchSelectors.js +0 -31
- package/src/state/tooltipSlice.js +0 -237
- package/src/state/types/StackedGraphicalItem.js +0 -18
- package/src/state/zIndexSlice.js +0 -167
- package/src/synchronisation/syncSelectors.js +0 -5
- package/src/util/ChartUtils.js +0 -630
- package/src/util/DOMUtils.js +0 -180
- package/src/util/Events.js +0 -7
- package/src/util/Global.js +0 -13
- package/src/util/LRUCache.js +0 -58
- package/src/util/PolarUtils.js +0 -190
- package/src/util/ReduceCSSCalc.js +0 -260
- package/src/util/axisPropsAreEqual.js +0 -63
- package/src/util/createEventProxy.js +0 -18
- package/src/util/getActiveCoordinate.js +0 -253
- package/src/util/getClassNameFromUnknown.js +0 -8
- package/src/util/getRadiusAndStrokeWidthFromDot.js +0 -28
- package/src/util/getSliced.js +0 -11
- package/src/util/isWellBehavedNumber.js +0 -8
- package/src/util/round.js +0 -39
- package/src/util/scale/RechartsScale.js +0 -68
- package/src/util/scale/index.js +0 -3
- package/src/util/stacks/getStackSeriesIdentifier.js +0 -10
- package/src/zIndex/ZIndexLayer.tsrx.d.ts +0 -2
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import {
|
|
3
|
+
Action,
|
|
4
|
+
autoBatchEnhancer,
|
|
5
|
+
combineReducers,
|
|
6
|
+
configureStore,
|
|
7
|
+
Dispatch,
|
|
8
|
+
Store,
|
|
9
|
+
} from '@reduxjs/toolkit';
|
|
4
10
|
import { optionsReducer } from './optionsSlice';
|
|
5
11
|
import { tooltipReducer } from './tooltipSlice';
|
|
6
12
|
import { chartDataReducer } from './chartDataSlice';
|
|
@@ -23,7 +29,27 @@ import { Global } from '../util/Global';
|
|
|
23
29
|
import { zIndexReducer } from './zIndexSlice';
|
|
24
30
|
import { eventSettingsReducer } from './eventSettingsSlice';
|
|
25
31
|
import { renderedTicksReducer } from './renderedTicksSlice';
|
|
26
|
-
|
|
32
|
+
|
|
33
|
+
export type RechartsRootState = {
|
|
34
|
+
brush: ReturnType<typeof brushReducer>;
|
|
35
|
+
cartesianAxis: ReturnType<typeof cartesianAxisReducer>;
|
|
36
|
+
chartData: ReturnType<typeof chartDataReducer>;
|
|
37
|
+
errorBars: ReturnType<typeof errorBarReducer>;
|
|
38
|
+
eventSettings: ReturnType<typeof eventSettingsReducer>;
|
|
39
|
+
graphicalItems: ReturnType<typeof graphicalItemsReducer>;
|
|
40
|
+
layout: ReturnType<typeof chartLayoutReducer>;
|
|
41
|
+
legend: ReturnType<typeof legendReducer>;
|
|
42
|
+
options: ReturnType<typeof optionsReducer>;
|
|
43
|
+
polarAxis: ReturnType<typeof polarAxisReducer>;
|
|
44
|
+
polarOptions: ReturnType<typeof polarOptionsReducer>;
|
|
45
|
+
referenceElements: ReturnType<typeof referenceElementsReducer>;
|
|
46
|
+
renderedTicks: ReturnType<typeof renderedTicksReducer>;
|
|
47
|
+
rootProps: ReturnType<typeof rootPropsReducer>;
|
|
48
|
+
tooltip: ReturnType<typeof tooltipReducer>;
|
|
49
|
+
zIndex: ReturnType<typeof zIndexReducer>;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const rootReducer = combineReducers({
|
|
27
53
|
brush: brushReducer,
|
|
28
54
|
cartesianAxis: cartesianAxisReducer,
|
|
29
55
|
chartData: chartDataReducer,
|
|
@@ -41,51 +67,33 @@ var rootReducer = combineReducers({
|
|
|
41
67
|
tooltip: tooltipReducer,
|
|
42
68
|
zIndex: zIndexReducer,
|
|
43
69
|
});
|
|
44
|
-
|
|
45
|
-
|
|
70
|
+
|
|
71
|
+
export const createRechartsStore = (
|
|
72
|
+
preloadedState?: Partial<RechartsRootState>,
|
|
73
|
+
chartName: string = 'Chart',
|
|
74
|
+
): Store<RechartsRootState> => {
|
|
46
75
|
return configureStore({
|
|
47
76
|
reducer: rootReducer,
|
|
48
|
-
// redux-toolkit v1 types are unhappy with the preloadedState type. Remove the `as any` when bumping to v2
|
|
49
77
|
preloadedState: preloadedState,
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
var _process$env$NODE_ENV;
|
|
53
|
-
return getDefaultMiddleware({
|
|
78
|
+
middleware: (getDefaultMiddleware) =>
|
|
79
|
+
getDefaultMiddleware({
|
|
54
80
|
serializableCheck: false,
|
|
55
|
-
immutableCheck:
|
|
56
|
-
(_process$env$NODE_ENV = 'es6') !== null && _process$env$NODE_ENV !== void 0
|
|
57
|
-
? _process$env$NODE_ENV
|
|
58
|
-
: '',
|
|
59
|
-
),
|
|
81
|
+
immutableCheck: false,
|
|
60
82
|
}).concat([
|
|
61
83
|
mouseClickMiddleware.middleware,
|
|
62
84
|
mouseMoveMiddleware.middleware,
|
|
63
85
|
keyboardEventsMiddleware.middleware,
|
|
64
86
|
externalEventsMiddleware.middleware,
|
|
65
87
|
touchEventMiddleware.middleware,
|
|
66
|
-
])
|
|
67
|
-
},
|
|
68
|
-
/*
|
|
69
|
-
* I can't find out how to satisfy typescript here.
|
|
70
|
-
* We return `EnhancerArray<[StoreEnhancer<{}, {}>, StoreEnhancer]>` from this function,
|
|
71
|
-
* but the types say we should return `EnhancerArray<StoreEnhancer<{}, {}>`.
|
|
72
|
-
* Looks like it's badly inferred generics, but it won't allow me to provide the correct type manually either.
|
|
73
|
-
* So let's just ignore the error for now.
|
|
74
|
-
*/
|
|
75
|
-
// @ts-expect-error mismatched generics
|
|
88
|
+
]),
|
|
76
89
|
enhancers: (getDefaultEnhancers) => {
|
|
77
|
-
|
|
90
|
+
let enhancers: typeof getDefaultEnhancers | ReturnType<typeof getDefaultEnhancers> =
|
|
91
|
+
getDefaultEnhancers;
|
|
78
92
|
if (typeof getDefaultEnhancers === 'function') {
|
|
79
|
-
/*
|
|
80
|
-
* In RTK v2 this is always a function, but in v1 it is an array.
|
|
81
|
-
* Because we have @types/redux-toolkit v1 as a dependency, typescript is going to flag this as an error.
|
|
82
|
-
* We support both RTK v1 and v2, so we need to do this check.
|
|
83
|
-
* https://redux-toolkit.js.org/usage/migrating-rtk-2#configurestoreenhancers-must-be-a-callback
|
|
84
|
-
*/
|
|
85
|
-
// @ts-expect-error RTK v2 behaviour on RTK v1 types
|
|
86
93
|
enhancers = getDefaultEnhancers();
|
|
87
94
|
}
|
|
88
|
-
|
|
95
|
+
// RTK 2 supplies a callback; the retained legacy branch accepts its array.
|
|
96
|
+
return (enhancers as ReturnType<typeof getDefaultEnhancers>).concat(
|
|
89
97
|
autoBatchEnhancer({
|
|
90
98
|
type: 'raf',
|
|
91
99
|
}),
|
|
@@ -95,7 +103,9 @@ export var createRechartsStore = function createRechartsStore(preloadedState) {
|
|
|
95
103
|
serialize: {
|
|
96
104
|
replacer: reduxDevtoolsJsonStringifyReplacer,
|
|
97
105
|
},
|
|
98
|
-
name:
|
|
106
|
+
name: `recharts-${chartName}`,
|
|
99
107
|
},
|
|
100
108
|
});
|
|
101
109
|
};
|
|
110
|
+
|
|
111
|
+
export type AppDispatch = Dispatch<Action>;
|
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { createSlice, current, PayloadAction, prepareAutoBatched } from '@reduxjs/toolkit';
|
|
3
|
+
import { castDraft, type Draft } from 'immer';
|
|
4
|
+
import { TooltipTrigger } from '../chart/types';
|
|
5
|
+
import type { NameType, Payload, ValueType } from '../component/DefaultTooltipContent.tsrx';
|
|
6
|
+
import { CartesianViewBoxRequired, Coordinate, DataKey, PolarCoordinate } from '../util/types';
|
|
7
|
+
import { AxisId } from './cartesianAxisSlice';
|
|
8
|
+
import { GraphicalItemId } from './graphicalItemsSlice';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* One Tooltip can display multiple TooltipPayloadEntries at a time.
|
|
12
|
+
*/
|
|
13
|
+
export type TooltipPayloadEntry = Payload<ValueType, NameType>;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* So what happens is that the tooltip payload is decided based on the available data, and the dataKey.
|
|
17
|
+
* The dataKey can either be defined on the graphical element (like Line, or Bar)
|
|
18
|
+
* or on the tooltip itself.
|
|
19
|
+
*
|
|
20
|
+
* The data can be defined in the chart element, or in the graphical item.
|
|
21
|
+
*
|
|
22
|
+
* So this type is all the settings, other than the data + dataKey complications.
|
|
23
|
+
*/
|
|
24
|
+
export type TooltipEntrySettings = Omit<TooltipPayloadEntry, 'payload' | 'value'> & {
|
|
25
|
+
nameKey: DataKey<any> | undefined;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* This is what Tooltip renders.
|
|
30
|
+
*/
|
|
31
|
+
export type TooltipPayload = ReadonlyArray<TooltipPayloadEntry>;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* null means no active index
|
|
35
|
+
* string means: whichever index from the chart data it is.
|
|
36
|
+
* Different charts have different requirements on data shapes,
|
|
37
|
+
* and are also responsible for providing a function that will accept this index
|
|
38
|
+
* and return data.
|
|
39
|
+
*/
|
|
40
|
+
export type TooltipIndex = string | null;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Different items have different data shapes so the state has no opinion on what the data shape should be;
|
|
44
|
+
* the only requirement is that the chart also provides a searcher function
|
|
45
|
+
* that accepts the data, and a key, and returns whatever the payload in Tooltip should be.
|
|
46
|
+
*/
|
|
47
|
+
export type TooltipPayloadSearcher<T = unknown> = (
|
|
48
|
+
data: T,
|
|
49
|
+
index: TooltipIndex,
|
|
50
|
+
computedData?: unknown,
|
|
51
|
+
nameKey?: DataKey<any>,
|
|
52
|
+
) => T | undefined;
|
|
53
|
+
|
|
54
|
+
export type TooltipPayloadConfiguration = {
|
|
55
|
+
// This is the data that is the same for all tooltip payloads, regardless of activeIndex
|
|
56
|
+
settings: TooltipEntrySettings;
|
|
57
|
+
/**
|
|
58
|
+
* This is the data that the item has provided, all of it mixed together.
|
|
59
|
+
* Later as user is interacting with the chart, a redux selector will use this
|
|
60
|
+
* data + activeIndex, pass it to the TooltipPayloadSearcher, and render the result in a Tooltip.
|
|
61
|
+
*
|
|
62
|
+
* Because we have no controls over which data shape the graphical item provides,
|
|
63
|
+
* this is typed as unknown, and it is the responsibility of the selector
|
|
64
|
+
* to know what to do with it.
|
|
65
|
+
*
|
|
66
|
+
* We can't have better typing here because different graphical items
|
|
67
|
+
* may provide different data shapes. For example someone may decide to put Area element
|
|
68
|
+
* in a Sankey chart.
|
|
69
|
+
*/
|
|
70
|
+
dataDefinedOnItem: unknown;
|
|
71
|
+
/**
|
|
72
|
+
* Opportunity for the graphical item to define its own Tooltip coordinates
|
|
73
|
+
* instead of relying on the axes.
|
|
74
|
+
*
|
|
75
|
+
* If undefined, then Recharts will use mouse interaction coordinates, or the axis coordinates,
|
|
76
|
+
* with some defaults (like, top/left of the chart).
|
|
77
|
+
*
|
|
78
|
+
* Unlike the chart data which can be nested, the positions are expected to be flat array or record.
|
|
79
|
+
* They however should reuse the same tooltip index format as the chart data.
|
|
80
|
+
*/
|
|
81
|
+
getPosition: (tooltipIndex: NonNullable<TooltipIndex>) => Coordinate | undefined;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export type ActiveTooltipProps = {
|
|
85
|
+
activeIndex: TooltipIndex;
|
|
86
|
+
activeCoordinate: Coordinate | undefined;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* So this informs the "tooltip event type". Tooltip event type can be either "axis" or "item"
|
|
91
|
+
* and it is used for two things:
|
|
92
|
+
* 1. Sets the active area
|
|
93
|
+
* 2. Sets the background and cursor highlights
|
|
94
|
+
*
|
|
95
|
+
* Some charts only allow to have one type of tooltip event type, some allow both.
|
|
96
|
+
* Those charts that allow both will have one default, and the "shared" prop will be used to switch between them.
|
|
97
|
+
* Undefined means "use the chart default".
|
|
98
|
+
*
|
|
99
|
+
* Charts that only allow one tooltip event type, will ignore the shared prop.
|
|
100
|
+
*/
|
|
101
|
+
export type SharedTooltipSettings = boolean | undefined;
|
|
102
|
+
|
|
103
|
+
export type TooltipSettingsState = {
|
|
104
|
+
shared: SharedTooltipSettings;
|
|
105
|
+
trigger: TooltipTrigger;
|
|
106
|
+
axisId: AxisId;
|
|
107
|
+
/**
|
|
108
|
+
* The `active` prop, despite its name, does not mean "always active".
|
|
109
|
+
* It means "active after user interaction has ended".
|
|
110
|
+
* By default, the tooltip is only active while the user is hovering over the chart.
|
|
111
|
+
* With `active=true`, the tooltip will remain visible after mouse leave event.
|
|
112
|
+
*
|
|
113
|
+
* If you want to see the "active before user interaction" settings, see `defaultIndex`.
|
|
114
|
+
*
|
|
115
|
+
* Undefined means "depends on user interactions".
|
|
116
|
+
*/
|
|
117
|
+
active: boolean | undefined;
|
|
118
|
+
/**
|
|
119
|
+
* If you want to set the tooltip to be active before user interaction, you can set this property.
|
|
120
|
+
*/
|
|
121
|
+
defaultIndex: TooltipIndex | undefined;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* A generic state for user interaction with the chart.
|
|
126
|
+
* User interaction can come through multiple channels: mouse events, keyboard events, or hardcoded in props, or synchronised from other charts.
|
|
127
|
+
*
|
|
128
|
+
* Each of the interaction states is represented as TooltipInteractionState,
|
|
129
|
+
* and then the selectors and Tooltip will decide which of the interaction states to use.
|
|
130
|
+
*/
|
|
131
|
+
export type TooltipInteractionState = {
|
|
132
|
+
/**
|
|
133
|
+
* If user interaction is in progress or not.
|
|
134
|
+
* Why is this its own property? Why is this not computed from the index?
|
|
135
|
+
* Certainly if index !== -1 then the tooltip is active, right?
|
|
136
|
+
* Well not so fast. Recharts allows Tooltips can be set to `active=true`
|
|
137
|
+
* which means the tooltip remains displayed after the user stops interacting.
|
|
138
|
+
* - This implies that we cannot set index to <empty value> after interaction ends,
|
|
139
|
+
* because the chart must remember the last position just in case the `active` prop on Tooltip is set to true.
|
|
140
|
+
*/
|
|
141
|
+
active: boolean;
|
|
142
|
+
/**
|
|
143
|
+
* This is the current data index that is set for the chart.
|
|
144
|
+
* This can come from mouse events, keyboard events, or hardcoded in props
|
|
145
|
+
* in property `defaultIndex` on Tooltip.
|
|
146
|
+
*/
|
|
147
|
+
index: TooltipIndex | undefined;
|
|
148
|
+
/**
|
|
149
|
+
* DataKey filter.
|
|
150
|
+
*
|
|
151
|
+
* In case of multiple graphical items, this is the dataKey that is set for the item.
|
|
152
|
+
* Very useful for `Tooltip.shared=false`, where activeIndex can display multiple values,
|
|
153
|
+
* but we only want to display one of them.
|
|
154
|
+
*
|
|
155
|
+
* If we want to interact with all the graphical items, then this is undefined.
|
|
156
|
+
* This is the case for eventTooltipType === 'axis' for example.
|
|
157
|
+
*/
|
|
158
|
+
dataKey: DataKey<any> | undefined;
|
|
159
|
+
/**
|
|
160
|
+
* GraphicalItemId filter.
|
|
161
|
+
*
|
|
162
|
+
* In case of multiple graphical items with the same dataKey (e.g., multiple Pie charts),
|
|
163
|
+
* this identifies which specific graphical item is being interacted with.
|
|
164
|
+
* This is more reliable than coordinate matching for distinguishing between items.
|
|
165
|
+
*/
|
|
166
|
+
graphicalItemId: string | undefined;
|
|
167
|
+
/**
|
|
168
|
+
* The Coordinate where user last interacted with the chart. This needs saved so we can continue to render the tooltip at that point.
|
|
169
|
+
* This is undefined on several occasions:
|
|
170
|
+
* - before the user started interacting with the chart,
|
|
171
|
+
* - when the chart is controlled programmatically through `defaultIndex` prop
|
|
172
|
+
* - when the chart is controlled using keyboard interactions
|
|
173
|
+
*/
|
|
174
|
+
coordinate: Coordinate | PolarCoordinate | undefined;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
export type TooltipSyncState = TooltipInteractionState & {
|
|
178
|
+
/**
|
|
179
|
+
* Tooltip synchronization is a feature that allows multiple charts to share the same interaction state.
|
|
180
|
+
* This comes with one specialty - the syncMethod. `syncMethod=value` allows the user to synchronise charts
|
|
181
|
+
* based on the active label (which is rendered as the title of the Tooltip).
|
|
182
|
+
* To allow that, we need the label to be stored in the sync state.
|
|
183
|
+
*/
|
|
184
|
+
label: string | undefined;
|
|
185
|
+
/**
|
|
186
|
+
* ViewBox of the chart that sent the sync event.
|
|
187
|
+
* Used to scale coordinates between charts of different sizes so tooltips
|
|
188
|
+
* show up in the right place on all synchronized charts.
|
|
189
|
+
*/
|
|
190
|
+
sourceViewBox: CartesianViewBoxRequired | undefined;
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
export const noInteraction: TooltipInteractionState = {
|
|
194
|
+
active: false,
|
|
195
|
+
index: null,
|
|
196
|
+
dataKey: undefined,
|
|
197
|
+
graphicalItemId: undefined,
|
|
198
|
+
coordinate: undefined,
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* The tooltip interaction state stores:
|
|
203
|
+
*
|
|
204
|
+
* - Which graphical item is user interacting with at the moment,
|
|
205
|
+
* - which axis (or, which part of chart background) is user interacting with at the moment
|
|
206
|
+
* - The data that individual graphical items wish to be displayed in case the tooltip gets activated
|
|
207
|
+
*/
|
|
208
|
+
export type TooltipState = {
|
|
209
|
+
/**
|
|
210
|
+
* This is the state of interactions with individual graphical items.
|
|
211
|
+
*/
|
|
212
|
+
itemInteraction: {
|
|
213
|
+
click: TooltipInteractionState;
|
|
214
|
+
/**
|
|
215
|
+
* Why is hover activation separate from click activation? Because they are independent:
|
|
216
|
+
* If a click is set, then mouseLeave should not clear it.
|
|
217
|
+
* - the opposite is technically true too - but it's difficult to click on things without also hovering.
|
|
218
|
+
*/
|
|
219
|
+
hover: TooltipInteractionState;
|
|
220
|
+
};
|
|
221
|
+
/**
|
|
222
|
+
* This is the state of interaction with the bar background - which will get mapped
|
|
223
|
+
* to the axis index.
|
|
224
|
+
*
|
|
225
|
+
* Axis interaction is independent of item interaction so the state must also be independent.
|
|
226
|
+
*/
|
|
227
|
+
axisInteraction: {
|
|
228
|
+
click: TooltipInteractionState;
|
|
229
|
+
hover: TooltipInteractionState;
|
|
230
|
+
};
|
|
231
|
+
keyboardInteraction: TooltipInteractionState;
|
|
232
|
+
/**
|
|
233
|
+
* This part of the state is the information coming from other charts.
|
|
234
|
+
* If there are two charts with the same syncId, events from one chart will be transferred
|
|
235
|
+
* to other charts. So this is what the other charts are reporting.
|
|
236
|
+
*/
|
|
237
|
+
syncInteraction: TooltipSyncState;
|
|
238
|
+
/**
|
|
239
|
+
* One graphical item will have one configuration;
|
|
240
|
+
* hovering over multiple of them (for example with tooltipEventType===axis)
|
|
241
|
+
* may render multiple tooltip payloads.
|
|
242
|
+
*/
|
|
243
|
+
tooltipItemPayloads: ReadonlyArray<TooltipPayloadConfiguration>;
|
|
244
|
+
/**
|
|
245
|
+
* Tooltip props or other settings that need redux access.
|
|
246
|
+
* This assumes that there is always only one Tooltip. In case we want to start supporting multiple Tooltips,
|
|
247
|
+
* we have to change this to an array - and update all the places reading this state too.
|
|
248
|
+
*/
|
|
249
|
+
settings: TooltipSettingsState;
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
export const initialState: TooltipState = {
|
|
253
|
+
itemInteraction: {
|
|
254
|
+
click: noInteraction,
|
|
255
|
+
hover: noInteraction,
|
|
256
|
+
},
|
|
257
|
+
axisInteraction: {
|
|
258
|
+
click: noInteraction,
|
|
259
|
+
hover: noInteraction,
|
|
260
|
+
},
|
|
261
|
+
keyboardInteraction: noInteraction,
|
|
262
|
+
syncInteraction: {
|
|
263
|
+
active: false,
|
|
264
|
+
index: null,
|
|
265
|
+
dataKey: undefined,
|
|
266
|
+
label: undefined,
|
|
267
|
+
coordinate: undefined,
|
|
268
|
+
sourceViewBox: undefined,
|
|
269
|
+
graphicalItemId: undefined,
|
|
270
|
+
},
|
|
271
|
+
tooltipItemPayloads: [],
|
|
272
|
+
settings: {
|
|
273
|
+
shared: undefined,
|
|
274
|
+
trigger: 'hover',
|
|
275
|
+
axisId: 0,
|
|
276
|
+
active: false,
|
|
277
|
+
defaultIndex: undefined,
|
|
278
|
+
},
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* This is the event we get when user is interacting with a specific graphical item.
|
|
283
|
+
*/
|
|
284
|
+
export type GraphicalItemTooltipActionPayload = {
|
|
285
|
+
/**
|
|
286
|
+
* Every graphical item must report its own index.
|
|
287
|
+
*/
|
|
288
|
+
activeIndex: TooltipIndex;
|
|
289
|
+
/**
|
|
290
|
+
* A graphical item may or may not have a particular dataKey specified.
|
|
291
|
+
* This is undefined in case the user did not set a dataKey on the graphical item.
|
|
292
|
+
* In which case the dataKey is implied by the axes settings.
|
|
293
|
+
*/
|
|
294
|
+
activeDataKey: DataKey<any> | undefined;
|
|
295
|
+
/**
|
|
296
|
+
* This is the coordinate where Recharts think the tooltip should appear.
|
|
297
|
+
*
|
|
298
|
+
* Graphical items have a preference where to render the actual tooltip
|
|
299
|
+
* which is defined in the TooltipPayloadConfiguration.positions.
|
|
300
|
+
*
|
|
301
|
+
* This property is resolved by combining that preference with the actual user interaction coordinate.
|
|
302
|
+
* This is not the raw mouse coordinate! We don't store that currently in this slice.
|
|
303
|
+
*
|
|
304
|
+
* This can be undefined depending on the graphical item settings, and the tooltip searcher.
|
|
305
|
+
*/
|
|
306
|
+
activeCoordinate: Coordinate | undefined;
|
|
307
|
+
/**
|
|
308
|
+
* ID of the element user is interacting with.
|
|
309
|
+
* Cannot be undefined - each graphical item is responsible for generating its own ID
|
|
310
|
+
* in case user did not provide an explicit one.
|
|
311
|
+
*/
|
|
312
|
+
activeGraphicalItemId: GraphicalItemId;
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
export type AxisTooltipActionPayload = {
|
|
316
|
+
/**
|
|
317
|
+
* Each axis interaction must report the index of where the user is interacting.
|
|
318
|
+
*/
|
|
319
|
+
activeIndex: TooltipIndex;
|
|
320
|
+
/**
|
|
321
|
+
* DataKey filter. An axis may or may not have a particular dataKey specified.
|
|
322
|
+
* This is undefined in case the user did not set a dataKey on the axis.
|
|
323
|
+
* In which case the dataKey is implied by the graphical item settings.
|
|
324
|
+
*/
|
|
325
|
+
activeDataKey: DataKey<any> | undefined;
|
|
326
|
+
/**
|
|
327
|
+
This is the coordinate where Recharts think the tooltip should appear.
|
|
328
|
+
*
|
|
329
|
+
* Graphical items have a preference where to render the actual tooltip
|
|
330
|
+
* which is defined in the TooltipPayloadConfiguration.positions.
|
|
331
|
+
*
|
|
332
|
+
* This property is resolved by combining that preference with the actual user interaction coordinate.
|
|
333
|
+
* This is not the raw mouse coordinate! We don't store that currently in this slice.
|
|
334
|
+
*
|
|
335
|
+
* This can be undefined depending on the graphical item settings, and the tooltip searcher.
|
|
336
|
+
*/
|
|
337
|
+
activeCoordinate?: Coordinate;
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Keyboard interaction payload has no graphical item ID,
|
|
342
|
+
* and no dataKey, because keyboard interaction is always
|
|
343
|
+
* with the whole chart, not with a specific graphical item.
|
|
344
|
+
*/
|
|
345
|
+
export type KeyboardTooltipActionPayload = {
|
|
346
|
+
/**
|
|
347
|
+
* If true, means user is actively interacting with the chart using keyboard.
|
|
348
|
+
* If false, means user has stopped interacting with the chart using keyboard - perhaps focus has moved away, or ESC key was pressed.
|
|
349
|
+
*/
|
|
350
|
+
active: boolean;
|
|
351
|
+
/**
|
|
352
|
+
* Keyboard interaction index. The middleware is responsible for computing this index based on
|
|
353
|
+
* current index, key pressed, chart direction, etc.
|
|
354
|
+
* Each chart type may have different index types (string or number) and different idea on how to iterate them.
|
|
355
|
+
*/
|
|
356
|
+
activeIndex: TooltipIndex | undefined;
|
|
357
|
+
/**
|
|
358
|
+
This is the coordinate where Recharts think the tooltip should appear.
|
|
359
|
+
|
|
360
|
+
* Keyboard coordinate follows the same rules as defaultIndex coordinate.
|
|
361
|
+
* In an absence of mouse coordinates, the chart must compute where to render the tooltip
|
|
362
|
+
* based on the activeIndex and domain and range.
|
|
363
|
+
*/
|
|
364
|
+
activeCoordinate: Coordinate | undefined;
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
// Registered props may contain native DOM refs. The private callback boundary
|
|
368
|
+
// avoids RTK's prepared-action validator recursively comparing raw DOM-backed
|
|
369
|
+
// settings with Draft<Settings>. Every access still uses the exact known draft;
|
|
370
|
+
// the exported reducer state and action payloads remain fully typed.
|
|
371
|
+
const tooltipSlice = createSlice({
|
|
372
|
+
name: 'tooltip',
|
|
373
|
+
initialState,
|
|
374
|
+
reducers: {
|
|
375
|
+
addTooltipEntrySettings: {
|
|
376
|
+
reducer(state: unknown, action: PayloadAction<TooltipPayloadConfiguration>) {
|
|
377
|
+
(state as Draft<TooltipState>).tooltipItemPayloads.push(castDraft(action.payload));
|
|
378
|
+
},
|
|
379
|
+
prepare: prepareAutoBatched<TooltipPayloadConfiguration>(),
|
|
380
|
+
},
|
|
381
|
+
replaceTooltipEntrySettings: {
|
|
382
|
+
reducer(
|
|
383
|
+
state: unknown,
|
|
384
|
+
action: PayloadAction<{
|
|
385
|
+
prev: TooltipPayloadConfiguration;
|
|
386
|
+
next: TooltipPayloadConfiguration;
|
|
387
|
+
}>,
|
|
388
|
+
) {
|
|
389
|
+
const { prev, next } = action.payload;
|
|
390
|
+
const index = current(state as Draft<TooltipState>).tooltipItemPayloads.indexOf(
|
|
391
|
+
castDraft(prev),
|
|
392
|
+
);
|
|
393
|
+
if (index > -1) {
|
|
394
|
+
(state as Draft<TooltipState>).tooltipItemPayloads[index] = castDraft(next);
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
prepare: prepareAutoBatched<{
|
|
398
|
+
prev: TooltipPayloadConfiguration;
|
|
399
|
+
next: TooltipPayloadConfiguration;
|
|
400
|
+
}>(),
|
|
401
|
+
},
|
|
402
|
+
removeTooltipEntrySettings: {
|
|
403
|
+
reducer(state: unknown, action: PayloadAction<TooltipPayloadConfiguration>) {
|
|
404
|
+
const index = current(state as Draft<TooltipState>).tooltipItemPayloads.indexOf(
|
|
405
|
+
castDraft(action.payload),
|
|
406
|
+
);
|
|
407
|
+
if (index > -1) {
|
|
408
|
+
(state as Draft<TooltipState>).tooltipItemPayloads.splice(index, 1);
|
|
409
|
+
}
|
|
410
|
+
},
|
|
411
|
+
prepare: prepareAutoBatched<TooltipPayloadConfiguration>(),
|
|
412
|
+
},
|
|
413
|
+
setTooltipSettingsState(state: unknown, action: PayloadAction<TooltipSettingsState>) {
|
|
414
|
+
(state as Draft<TooltipState>).settings = action.payload;
|
|
415
|
+
},
|
|
416
|
+
setActiveMouseOverItemIndex(
|
|
417
|
+
state: unknown,
|
|
418
|
+
action: PayloadAction<GraphicalItemTooltipActionPayload>,
|
|
419
|
+
) {
|
|
420
|
+
(state as Draft<TooltipState>).syncInteraction.active = false;
|
|
421
|
+
(state as Draft<TooltipState>).syncInteraction.sourceViewBox = undefined;
|
|
422
|
+
(state as Draft<TooltipState>).keyboardInteraction.active = false;
|
|
423
|
+
(state as Draft<TooltipState>).itemInteraction.hover.active = true;
|
|
424
|
+
(state as Draft<TooltipState>).itemInteraction.hover.index = action.payload.activeIndex;
|
|
425
|
+
(state as Draft<TooltipState>).itemInteraction.hover.dataKey = action.payload.activeDataKey;
|
|
426
|
+
(state as Draft<TooltipState>).itemInteraction.hover.graphicalItemId =
|
|
427
|
+
action.payload.activeGraphicalItemId;
|
|
428
|
+
(state as Draft<TooltipState>).itemInteraction.hover.coordinate =
|
|
429
|
+
action.payload.activeCoordinate;
|
|
430
|
+
},
|
|
431
|
+
mouseLeaveChart(state: unknown) {
|
|
432
|
+
/*
|
|
433
|
+
* Clear only the active flags. Why?
|
|
434
|
+
* 1. Keep Coordinate to preserve animation - next time the Tooltip appears, we want to render it from
|
|
435
|
+
* the last place where it was when it disappeared.
|
|
436
|
+
* 2. We want to keep all the properties anyway just in case the tooltip has `active=true` prop
|
|
437
|
+
* and continues being visible even after the mouse has left the chart.
|
|
438
|
+
*/
|
|
439
|
+
(state as Draft<TooltipState>).itemInteraction.hover.active = false;
|
|
440
|
+
(state as Draft<TooltipState>).axisInteraction.hover.active = false;
|
|
441
|
+
},
|
|
442
|
+
mouseLeaveItem(state: unknown) {
|
|
443
|
+
(state as Draft<TooltipState>).itemInteraction.hover.active = false;
|
|
444
|
+
},
|
|
445
|
+
setActiveClickItemIndex(
|
|
446
|
+
state: unknown,
|
|
447
|
+
action: PayloadAction<GraphicalItemTooltipActionPayload>,
|
|
448
|
+
) {
|
|
449
|
+
(state as Draft<TooltipState>).syncInteraction.active = false;
|
|
450
|
+
(state as Draft<TooltipState>).syncInteraction.sourceViewBox = undefined;
|
|
451
|
+
(state as Draft<TooltipState>).itemInteraction.click.active = true;
|
|
452
|
+
(state as Draft<TooltipState>).keyboardInteraction.active = false;
|
|
453
|
+
(state as Draft<TooltipState>).itemInteraction.click.index = action.payload.activeIndex;
|
|
454
|
+
(state as Draft<TooltipState>).itemInteraction.click.dataKey = action.payload.activeDataKey;
|
|
455
|
+
(state as Draft<TooltipState>).itemInteraction.click.graphicalItemId =
|
|
456
|
+
action.payload.activeGraphicalItemId;
|
|
457
|
+
(state as Draft<TooltipState>).itemInteraction.click.coordinate =
|
|
458
|
+
action.payload.activeCoordinate;
|
|
459
|
+
},
|
|
460
|
+
setMouseOverAxisIndex(state: unknown, action: PayloadAction<AxisTooltipActionPayload>) {
|
|
461
|
+
(state as Draft<TooltipState>).syncInteraction.active = false;
|
|
462
|
+
(state as Draft<TooltipState>).syncInteraction.sourceViewBox = undefined;
|
|
463
|
+
(state as Draft<TooltipState>).axisInteraction.hover.active = true;
|
|
464
|
+
(state as Draft<TooltipState>).keyboardInteraction.active = false;
|
|
465
|
+
(state as Draft<TooltipState>).axisInteraction.hover.index = action.payload.activeIndex;
|
|
466
|
+
(state as Draft<TooltipState>).axisInteraction.hover.dataKey = action.payload.activeDataKey;
|
|
467
|
+
(state as Draft<TooltipState>).axisInteraction.hover.coordinate =
|
|
468
|
+
action.payload.activeCoordinate;
|
|
469
|
+
},
|
|
470
|
+
setMouseClickAxisIndex(state: unknown, action: PayloadAction<AxisTooltipActionPayload>) {
|
|
471
|
+
(state as Draft<TooltipState>).syncInteraction.active = false;
|
|
472
|
+
(state as Draft<TooltipState>).syncInteraction.sourceViewBox = undefined;
|
|
473
|
+
(state as Draft<TooltipState>).keyboardInteraction.active = false;
|
|
474
|
+
(state as Draft<TooltipState>).axisInteraction.click.active = true;
|
|
475
|
+
(state as Draft<TooltipState>).axisInteraction.click.index = action.payload.activeIndex;
|
|
476
|
+
(state as Draft<TooltipState>).axisInteraction.click.dataKey = action.payload.activeDataKey;
|
|
477
|
+
(state as Draft<TooltipState>).axisInteraction.click.coordinate =
|
|
478
|
+
action.payload.activeCoordinate;
|
|
479
|
+
},
|
|
480
|
+
setSyncInteraction(state: unknown, action: PayloadAction<TooltipSyncState>) {
|
|
481
|
+
(state as Draft<TooltipState>).syncInteraction = action.payload;
|
|
482
|
+
},
|
|
483
|
+
setKeyboardInteraction(state: unknown, action: PayloadAction<KeyboardTooltipActionPayload>) {
|
|
484
|
+
(state as Draft<TooltipState>).keyboardInteraction.active = action.payload.active;
|
|
485
|
+
(state as Draft<TooltipState>).keyboardInteraction.index = action.payload.activeIndex;
|
|
486
|
+
(state as Draft<TooltipState>).keyboardInteraction.coordinate =
|
|
487
|
+
action.payload.activeCoordinate;
|
|
488
|
+
},
|
|
489
|
+
},
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
export const {
|
|
493
|
+
addTooltipEntrySettings,
|
|
494
|
+
replaceTooltipEntrySettings,
|
|
495
|
+
removeTooltipEntrySettings,
|
|
496
|
+
setTooltipSettingsState,
|
|
497
|
+
setActiveMouseOverItemIndex,
|
|
498
|
+
mouseLeaveItem,
|
|
499
|
+
mouseLeaveChart,
|
|
500
|
+
setActiveClickItemIndex,
|
|
501
|
+
setMouseOverAxisIndex,
|
|
502
|
+
setMouseClickAxisIndex,
|
|
503
|
+
setSyncInteraction,
|
|
504
|
+
setKeyboardInteraction,
|
|
505
|
+
} = tooltipSlice.actions;
|
|
506
|
+
|
|
507
|
+
export const tooltipReducer = tooltipSlice.reducer;
|