@octanejs/recharts 0.1.40 → 0.1.42
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/internal.ts +4 -20
- 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,14 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
3
|
-
import {
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import type { NativeEvent } from '../util/OctaneTypes';
|
|
3
|
+
import {
|
|
4
|
+
createAction,
|
|
5
|
+
createListenerMiddleware,
|
|
6
|
+
ListenerEffectAPI,
|
|
7
|
+
PayloadAction,
|
|
8
|
+
} from '@reduxjs/toolkit';
|
|
9
|
+
|
|
10
|
+
import { CategoricalChartFunc } from '../chart/types';
|
|
11
|
+
import { MouseHandlerDataParam } from '../synchronisation/types';
|
|
4
12
|
import {
|
|
5
13
|
selectActiveLabel,
|
|
6
14
|
selectActiveTooltipCoordinate,
|
|
@@ -8,9 +16,17 @@ import {
|
|
|
8
16
|
selectActiveTooltipIndex,
|
|
9
17
|
selectIsTooltipActive,
|
|
10
18
|
} from './selectors/tooltipSelectors';
|
|
19
|
+
import { AppDispatch, RechartsRootState } from './store';
|
|
11
20
|
import { createEventProxy } from '../util/createEventProxy';
|
|
12
|
-
|
|
13
|
-
|
|
21
|
+
|
|
22
|
+
type ExternalEventActionPayload<E = NativeEvent> = {
|
|
23
|
+
reactEvent: E;
|
|
24
|
+
handler: CategoricalChartFunc<E> | undefined;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const externalEventAction = createAction<ExternalEventActionPayload<any>>('externalEvent');
|
|
28
|
+
|
|
29
|
+
export const externalEventsMiddleware = createListenerMiddleware<RechartsRootState>();
|
|
14
30
|
|
|
15
31
|
/*
|
|
16
32
|
* We need a Map keyed by event type because this middleware handles MULTIPLE different event types
|
|
@@ -19,35 +35,38 @@ export var externalEventsMiddleware = createListenerMiddleware();
|
|
|
19
35
|
* For example, a click event and a mousemove event can happen in quick succession and both should be processed.
|
|
20
36
|
* This is different from mouseMoveMiddleware which only handles one event type and uses a single rafId.
|
|
21
37
|
*/
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
38
|
+
const rafIdMap = new Map<string, number>();
|
|
39
|
+
const timeoutIdMap = new Map<string, ReturnType<typeof setTimeout>>();
|
|
40
|
+
const latestEventMap = new Map<string, ExternalEventActionPayload>();
|
|
41
|
+
|
|
25
42
|
externalEventsMiddleware.startListening({
|
|
26
43
|
actionCreator: externalEventAction,
|
|
27
|
-
effect: (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
44
|
+
effect: (
|
|
45
|
+
action: PayloadAction<ExternalEventActionPayload>,
|
|
46
|
+
listenerApi: ListenerEffectAPI<RechartsRootState, AppDispatch>,
|
|
47
|
+
) => {
|
|
48
|
+
const { handler, reactEvent } = action.payload;
|
|
31
49
|
if (handler == null) {
|
|
32
50
|
return;
|
|
33
51
|
}
|
|
34
|
-
|
|
35
|
-
|
|
52
|
+
|
|
53
|
+
const eventType = reactEvent.type;
|
|
54
|
+
const eventProxy = createEventProxy(reactEvent);
|
|
55
|
+
|
|
36
56
|
latestEventMap.set(eventType, {
|
|
37
57
|
handler,
|
|
38
58
|
reactEvent: eventProxy,
|
|
39
59
|
});
|
|
40
60
|
|
|
41
61
|
// Cancel any pending execution for this event type
|
|
42
|
-
|
|
62
|
+
const existingRafId = rafIdMap.get(eventType);
|
|
43
63
|
if (existingRafId !== undefined) {
|
|
44
64
|
cancelAnimationFrame(existingRafId);
|
|
45
65
|
rafIdMap.delete(eventType);
|
|
46
66
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
throttledEvents = _state$eventSettings.throttledEvents;
|
|
67
|
+
|
|
68
|
+
const state = listenerApi.getState();
|
|
69
|
+
const { throttleDelay, throttledEvents } = state.eventSettings;
|
|
51
70
|
|
|
52
71
|
/*
|
|
53
72
|
* reactEvent.type gives us the event type as a string, e.g., 'click', 'mousemove', etc.
|
|
@@ -58,31 +77,30 @@ externalEventsMiddleware.startListening({
|
|
|
58
77
|
* with a string argument.
|
|
59
78
|
* To satisfy TypeScript, we need to explicitly typecast throttledEvents here.
|
|
60
79
|
*/
|
|
61
|
-
|
|
80
|
+
const eventListAsString: 'all' | ReadonlyArray<string> | undefined = throttledEvents;
|
|
62
81
|
|
|
63
82
|
// Check if this event type should be throttled
|
|
64
83
|
// throttledEvents can be 'all' or an array of event names
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
? void 0
|
|
69
|
-
: eventListAsString.includes(eventType));
|
|
70
|
-
var existingTimeoutId = timeoutIdMap.get(eventType);
|
|
84
|
+
const isThrottled = eventListAsString === 'all' || eventListAsString?.includes(eventType);
|
|
85
|
+
|
|
86
|
+
const existingTimeoutId = timeoutIdMap.get(eventType);
|
|
71
87
|
if (existingTimeoutId !== undefined && (typeof throttleDelay !== 'number' || !isThrottled)) {
|
|
72
88
|
clearTimeout(existingTimeoutId);
|
|
73
89
|
timeoutIdMap.delete(eventType);
|
|
74
90
|
}
|
|
75
|
-
|
|
76
|
-
|
|
91
|
+
|
|
92
|
+
const callback = () => {
|
|
93
|
+
const latestAction = latestEventMap.get(eventType);
|
|
94
|
+
|
|
77
95
|
try {
|
|
78
96
|
if (!latestAction) {
|
|
79
97
|
// This happens if the event was consumed by the leading edge and no new event came in
|
|
80
98
|
return;
|
|
81
99
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
100
|
+
|
|
101
|
+
const { handler: latestHandler, reactEvent: latestEvent } = latestAction;
|
|
102
|
+
const currentState: RechartsRootState = listenerApi.getState();
|
|
103
|
+
const nextState: MouseHandlerDataParam = {
|
|
86
104
|
activeCoordinate: selectActiveTooltipCoordinate(currentState),
|
|
87
105
|
activeDataKey: selectActiveTooltipDataKey(currentState),
|
|
88
106
|
activeIndex: selectActiveTooltipIndex(currentState),
|
|
@@ -90,6 +108,7 @@ externalEventsMiddleware.startListening({
|
|
|
90
108
|
activeTooltipIndex: selectActiveTooltipIndex(currentState),
|
|
91
109
|
isTooltipActive: selectIsTooltipActive(currentState),
|
|
92
110
|
};
|
|
111
|
+
|
|
93
112
|
if (latestHandler) {
|
|
94
113
|
latestHandler(nextState, latestEvent);
|
|
95
114
|
}
|
|
@@ -99,13 +118,15 @@ externalEventsMiddleware.startListening({
|
|
|
99
118
|
latestEventMap.delete(eventType);
|
|
100
119
|
}
|
|
101
120
|
};
|
|
121
|
+
|
|
102
122
|
if (!isThrottled) {
|
|
103
123
|
// Execute immediately
|
|
104
124
|
callback();
|
|
105
125
|
return;
|
|
106
126
|
}
|
|
127
|
+
|
|
107
128
|
if (throttleDelay === 'raf') {
|
|
108
|
-
|
|
129
|
+
const rafId = requestAnimationFrame(callback);
|
|
109
130
|
rafIdMap.set(eventType, rafId);
|
|
110
131
|
} else if (typeof throttleDelay === 'number') {
|
|
111
132
|
if (!timeoutIdMap.has(eventType)) {
|
|
@@ -116,7 +137,7 @@ externalEventsMiddleware.startListening({
|
|
|
116
137
|
callback();
|
|
117
138
|
|
|
118
139
|
// Start cooldown
|
|
119
|
-
|
|
140
|
+
const timeoutId = setTimeout(callback, throttleDelay);
|
|
120
141
|
timeoutIdMap.set(eventType, timeoutId);
|
|
121
142
|
}
|
|
122
143
|
} else {
|
|
@@ -0,0 +1,180 @@
|
|
|
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 { ChartData } from './chartDataSlice';
|
|
5
|
+
import { AxisId } from './cartesianAxisSlice';
|
|
6
|
+
import { DataKey } from '../util/types';
|
|
7
|
+
import { LineSettings } from './types/LineSettings';
|
|
8
|
+
import { ScatterSettings } from './types/ScatterSettings';
|
|
9
|
+
import { AreaSettings } from './types/AreaSettings';
|
|
10
|
+
import { BarSettings } from './types/BarSettings';
|
|
11
|
+
import { RadialBarSettings } from './types/RadialBarSettings';
|
|
12
|
+
import { PieSettings } from './types/PieSettings';
|
|
13
|
+
import { RadarSettings } from './types/RadarSettings';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Unique ID of the graphical item.
|
|
17
|
+
* This is used to identify the graphical item in the state and in the React tree.
|
|
18
|
+
* This is required for every graphical item - it's either provided by the user or generated automatically.
|
|
19
|
+
*/
|
|
20
|
+
export type GraphicalItemId = string;
|
|
21
|
+
|
|
22
|
+
export interface GraphicalItemSettings {
|
|
23
|
+
/**
|
|
24
|
+
* Unique ID of the graphical item.
|
|
25
|
+
* This is used to identify the graphical item in the state and in the React tree.
|
|
26
|
+
* This is required for every graphical item - it's either provided by the user or generated automatically.
|
|
27
|
+
*/
|
|
28
|
+
id: GraphicalItemId;
|
|
29
|
+
/**
|
|
30
|
+
* If the given graphical item has its own data array, it will appear here.
|
|
31
|
+
* If this is undefined, the data will be taken from the chart root prop.
|
|
32
|
+
*/
|
|
33
|
+
data: ChartData | undefined;
|
|
34
|
+
dataKey: DataKey<any> | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Why not just stop pushing the graphical items to state when they are hidden?
|
|
37
|
+
* Well some components decide to continue showing them anyway.
|
|
38
|
+
* Legend for example will keep showing a record for hidden graphical items.
|
|
39
|
+
* Stacks for example will ignore them.
|
|
40
|
+
*/
|
|
41
|
+
hide: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface BaseCartesianGraphicalItemSettings extends GraphicalItemSettings {
|
|
45
|
+
/**
|
|
46
|
+
* Each of the graphical items explicitly says which axis it uses;
|
|
47
|
+
* this property is optional for users but every graphical item must have a default,
|
|
48
|
+
* and it is required here.
|
|
49
|
+
*/
|
|
50
|
+
xAxisId: AxisId;
|
|
51
|
+
yAxisId: AxisId;
|
|
52
|
+
zAxisId: AxisId;
|
|
53
|
+
/**
|
|
54
|
+
* Graphical items that are inside Brush panorama should not interact with the main area graphical items
|
|
55
|
+
* and vice versa.
|
|
56
|
+
*/
|
|
57
|
+
isPanorama: boolean;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export type CartesianGraphicalItemSettings =
|
|
61
|
+
AreaSettings | BarSettings | LineSettings | ScatterSettings;
|
|
62
|
+
|
|
63
|
+
export interface BasePolarGraphicalItemSettings extends GraphicalItemSettings {
|
|
64
|
+
angleAxisId: AxisId;
|
|
65
|
+
radiusAxisId: AxisId;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type PolarGraphicalItemSettings = PieSettings | RadarSettings | RadialBarSettings;
|
|
69
|
+
|
|
70
|
+
export type GraphicalItemsState = {
|
|
71
|
+
/**
|
|
72
|
+
* This is an array of all cartesian graphical items and their settings.
|
|
73
|
+
* Graphical item is a visual representation of data on the chart.
|
|
74
|
+
* Some examples are: Line, Bar.
|
|
75
|
+
*
|
|
76
|
+
* The order is arbitrary; do not expect that indexes here will be the same as indexes elsewhere.
|
|
77
|
+
*/
|
|
78
|
+
cartesianItems: ReadonlyArray<CartesianGraphicalItemSettings>;
|
|
79
|
+
/**
|
|
80
|
+
* This is an array of all polar graphical items and their settings.
|
|
81
|
+
* Graphical item is a visual representation of data on the chart.
|
|
82
|
+
* Some examples are: Pie, Radar, RadialBar
|
|
83
|
+
*
|
|
84
|
+
* The order is arbitrary; do not expect that indexes here will be the same as indexes elsewhere.
|
|
85
|
+
*/
|
|
86
|
+
polarItems: ReadonlyArray<PolarGraphicalItemSettings>;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const initialState: GraphicalItemsState = {
|
|
90
|
+
cartesianItems: [],
|
|
91
|
+
polarItems: [],
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
type ReplacePayload<T> = {
|
|
95
|
+
prev: T;
|
|
96
|
+
next: T;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// Registered props may contain native DOM refs. The private callback boundary
|
|
100
|
+
// avoids RTK's prepared-action validator recursively comparing raw DOM-backed
|
|
101
|
+
// settings with Draft<Settings>. Every access still uses the exact known draft;
|
|
102
|
+
// the exported reducer state and action payloads remain fully typed.
|
|
103
|
+
const graphicalItemsSlice = createSlice({
|
|
104
|
+
name: 'graphicalItems',
|
|
105
|
+
initialState,
|
|
106
|
+
reducers: {
|
|
107
|
+
addCartesianGraphicalItem: {
|
|
108
|
+
reducer(state: unknown, action: PayloadAction<CartesianGraphicalItemSettings>) {
|
|
109
|
+
(state as Draft<GraphicalItemsState>).cartesianItems.push(castDraft(action.payload));
|
|
110
|
+
},
|
|
111
|
+
prepare: prepareAutoBatched<CartesianGraphicalItemSettings>(),
|
|
112
|
+
},
|
|
113
|
+
replaceCartesianGraphicalItem: {
|
|
114
|
+
reducer(
|
|
115
|
+
state: unknown,
|
|
116
|
+
action: PayloadAction<ReplacePayload<CartesianGraphicalItemSettings>>,
|
|
117
|
+
) {
|
|
118
|
+
const { prev, next } = action.payload;
|
|
119
|
+
const index = current(state as Draft<GraphicalItemsState>).cartesianItems.indexOf(
|
|
120
|
+
castDraft(prev),
|
|
121
|
+
);
|
|
122
|
+
if (index > -1) {
|
|
123
|
+
(state as Draft<GraphicalItemsState>).cartesianItems[index] = castDraft(next);
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
prepare: prepareAutoBatched<ReplacePayload<CartesianGraphicalItemSettings>>(),
|
|
127
|
+
},
|
|
128
|
+
removeCartesianGraphicalItem: {
|
|
129
|
+
reducer(state: unknown, action: PayloadAction<CartesianGraphicalItemSettings>) {
|
|
130
|
+
const index = current(state as Draft<GraphicalItemsState>).cartesianItems.indexOf(
|
|
131
|
+
castDraft(action.payload),
|
|
132
|
+
);
|
|
133
|
+
if (index > -1) {
|
|
134
|
+
(state as Draft<GraphicalItemsState>).cartesianItems.splice(index, 1);
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
prepare: prepareAutoBatched<CartesianGraphicalItemSettings>(),
|
|
138
|
+
},
|
|
139
|
+
addPolarGraphicalItem: {
|
|
140
|
+
reducer(state: unknown, action: PayloadAction<PolarGraphicalItemSettings>) {
|
|
141
|
+
(state as Draft<GraphicalItemsState>).polarItems.push(castDraft(action.payload));
|
|
142
|
+
},
|
|
143
|
+
prepare: prepareAutoBatched<PolarGraphicalItemSettings>(),
|
|
144
|
+
},
|
|
145
|
+
removePolarGraphicalItem: {
|
|
146
|
+
reducer(state: unknown, action: PayloadAction<PolarGraphicalItemSettings>) {
|
|
147
|
+
const index = current(state as Draft<GraphicalItemsState>).polarItems.indexOf(
|
|
148
|
+
castDraft(action.payload),
|
|
149
|
+
);
|
|
150
|
+
if (index > -1) {
|
|
151
|
+
(state as Draft<GraphicalItemsState>).polarItems.splice(index, 1);
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
prepare: prepareAutoBatched<PolarGraphicalItemSettings>(),
|
|
155
|
+
},
|
|
156
|
+
replacePolarGraphicalItem: {
|
|
157
|
+
reducer(state: unknown, action: PayloadAction<ReplacePayload<PolarGraphicalItemSettings>>) {
|
|
158
|
+
const { prev, next } = action.payload;
|
|
159
|
+
const index = current(state as Draft<GraphicalItemsState>).polarItems.indexOf(
|
|
160
|
+
castDraft(prev),
|
|
161
|
+
);
|
|
162
|
+
if (index > -1) {
|
|
163
|
+
(state as Draft<GraphicalItemsState>).polarItems[index] = castDraft(next);
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
prepare: prepareAutoBatched<ReplacePayload<PolarGraphicalItemSettings>>(),
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
export const {
|
|
172
|
+
addCartesianGraphicalItem,
|
|
173
|
+
replaceCartesianGraphicalItem,
|
|
174
|
+
removeCartesianGraphicalItem,
|
|
175
|
+
addPolarGraphicalItem,
|
|
176
|
+
removePolarGraphicalItem,
|
|
177
|
+
replacePolarGraphicalItem,
|
|
178
|
+
} = graphicalItemsSlice.actions;
|
|
179
|
+
|
|
180
|
+
export const graphicalItemsReducer = graphicalItemsSlice.reducer;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { createAction, createListenerMiddleware, ListenerEffectAPI } from '@reduxjs/toolkit';
|
|
3
|
+
import { setKeyboardInteraction, TooltipInteractionState } from './tooltipSlice';
|
|
4
|
+
import { AppDispatch, RechartsRootState } from './store';
|
|
5
5
|
import {
|
|
6
6
|
selectTooltipAxisDomain,
|
|
7
7
|
selectTooltipAxisTicks,
|
|
@@ -11,55 +11,64 @@ import { selectCoordinateForDefaultIndex } from './selectors/selectors';
|
|
|
11
11
|
import { selectChartDirection, selectTooltipAxisDataKey } from './selectors/axisSelectors';
|
|
12
12
|
import { combineActiveTooltipIndex } from './selectors/combiners/combineActiveTooltipIndex';
|
|
13
13
|
import { selectTooltipEventType } from './selectors/selectTooltipEventType';
|
|
14
|
-
|
|
15
|
-
export
|
|
16
|
-
export
|
|
17
|
-
export
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
|
|
15
|
+
export const keyDownAction = createAction<KeyboardEvent['key']>('keyDown');
|
|
16
|
+
export const focusAction = createAction('focus');
|
|
17
|
+
export const blurAction = createAction('blur');
|
|
18
|
+
|
|
19
|
+
export const keyboardEventsMiddleware = createListenerMiddleware<RechartsRootState>();
|
|
20
|
+
|
|
21
|
+
let rafId: number | null = null;
|
|
22
|
+
let timeoutId: ReturnType<typeof setTimeout> | null = null;
|
|
23
|
+
let latestKeyboardActionPayload: KeyboardEvent['key'] | null = null;
|
|
24
|
+
|
|
21
25
|
keyboardEventsMiddleware.startListening({
|
|
22
26
|
actionCreator: keyDownAction,
|
|
23
|
-
effect: (
|
|
27
|
+
effect: (
|
|
28
|
+
action: ReturnType<typeof keyDownAction>,
|
|
29
|
+
listenerApi: ListenerEffectAPI<RechartsRootState, AppDispatch>,
|
|
30
|
+
) => {
|
|
24
31
|
latestKeyboardActionPayload = action.payload;
|
|
32
|
+
|
|
25
33
|
if (rafId !== null) {
|
|
26
34
|
cancelAnimationFrame(rafId);
|
|
27
35
|
rafId = null;
|
|
28
36
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
37
|
+
|
|
38
|
+
const state: RechartsRootState = listenerApi.getState();
|
|
39
|
+
const { throttleDelay, throttledEvents } = state.eventSettings;
|
|
40
|
+
const isThrottled = throttledEvents === 'all' || throttledEvents.includes('keydown');
|
|
41
|
+
|
|
34
42
|
if (timeoutId !== null && (typeof throttleDelay !== 'number' || !isThrottled)) {
|
|
35
43
|
clearTimeout(timeoutId);
|
|
36
44
|
timeoutId = null;
|
|
37
45
|
}
|
|
38
|
-
|
|
46
|
+
|
|
47
|
+
const callback = () => {
|
|
39
48
|
try {
|
|
40
|
-
|
|
41
|
-
|
|
49
|
+
const currentState = listenerApi.getState();
|
|
50
|
+
const accessibilityLayerIsActive = currentState.rootProps.accessibilityLayer !== false;
|
|
42
51
|
if (!accessibilityLayerIsActive) {
|
|
43
52
|
return;
|
|
44
53
|
}
|
|
45
|
-
|
|
46
|
-
|
|
54
|
+
const { keyboardInteraction } = currentState.tooltip;
|
|
55
|
+
const key = latestKeyboardActionPayload;
|
|
47
56
|
if (key !== 'ArrowRight' && key !== 'ArrowLeft' && key !== 'Enter') {
|
|
48
57
|
return;
|
|
49
58
|
}
|
|
50
59
|
|
|
51
60
|
// TODO this is lacking index for charts that do not support numeric indexes
|
|
52
|
-
|
|
61
|
+
const resolvedIndex = combineActiveTooltipIndex(
|
|
53
62
|
keyboardInteraction,
|
|
54
63
|
selectTooltipDisplayedData(currentState),
|
|
55
64
|
selectTooltipAxisDataKey(currentState),
|
|
56
65
|
selectTooltipAxisDomain(currentState),
|
|
57
66
|
);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
67
|
+
const currentIndex = resolvedIndex == null ? -1 : Number(resolvedIndex);
|
|
68
|
+
const isOutsideDomain = !Number.isFinite(currentIndex) || currentIndex < 0;
|
|
69
|
+
const tooltipTicks = selectTooltipAxisTicks(currentState);
|
|
70
|
+
const displayedData = selectTooltipDisplayedData(currentState);
|
|
71
|
+
const tooltipEventType = selectTooltipEventType(
|
|
63
72
|
currentState,
|
|
64
73
|
currentState.tooltip.settings.shared,
|
|
65
74
|
);
|
|
@@ -67,7 +76,7 @@ keyboardEventsMiddleware.startListening({
|
|
|
67
76
|
if (isOutsideDomain) {
|
|
68
77
|
return;
|
|
69
78
|
}
|
|
70
|
-
|
|
79
|
+
const coordinate = selectCoordinateForDefaultIndex(
|
|
71
80
|
currentState,
|
|
72
81
|
tooltipEventType,
|
|
73
82
|
'hover',
|
|
@@ -77,31 +86,33 @@ keyboardEventsMiddleware.startListening({
|
|
|
77
86
|
setKeyboardInteraction({
|
|
78
87
|
active: !keyboardInteraction.active,
|
|
79
88
|
activeIndex: keyboardInteraction.index,
|
|
80
|
-
activeCoordinate:
|
|
89
|
+
activeCoordinate: coordinate,
|
|
81
90
|
}),
|
|
82
91
|
);
|
|
83
92
|
return;
|
|
84
93
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
94
|
+
|
|
95
|
+
const direction = selectChartDirection(currentState);
|
|
96
|
+
const directionMultiplier = direction === 'left-to-right' ? 1 : -1;
|
|
97
|
+
const movement = key === 'ArrowRight' ? 1 : -1;
|
|
98
|
+
let nextIndex: number;
|
|
89
99
|
if (isOutsideDomain) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
100
|
+
const axisDataKey = selectTooltipAxisDataKey(currentState);
|
|
101
|
+
const domain = selectTooltipAxisDomain(currentState);
|
|
102
|
+
const effectiveMovement = movement * directionMultiplier;
|
|
93
103
|
|
|
94
104
|
// Build a minimal TooltipInteractionState for the candidate-index check.
|
|
95
|
-
|
|
105
|
+
const mkInteraction = (i: number): TooltipInteractionState => ({
|
|
96
106
|
active: false,
|
|
97
107
|
index: String(i),
|
|
98
108
|
dataKey: undefined,
|
|
99
109
|
graphicalItemId: undefined,
|
|
100
110
|
coordinate: undefined,
|
|
101
111
|
});
|
|
112
|
+
|
|
102
113
|
nextIndex = -1;
|
|
103
114
|
if (effectiveMovement > 0) {
|
|
104
|
-
for (
|
|
115
|
+
for (let i = 0; i < displayedData.length; i++) {
|
|
105
116
|
if (
|
|
106
117
|
combineActiveTooltipIndex(mkInteraction(i), displayedData, axisDataKey, domain) !=
|
|
107
118
|
null
|
|
@@ -111,29 +122,28 @@ keyboardEventsMiddleware.startListening({
|
|
|
111
122
|
}
|
|
112
123
|
}
|
|
113
124
|
} else {
|
|
114
|
-
for (
|
|
125
|
+
for (let i = displayedData.length - 1; i >= 0; i--) {
|
|
115
126
|
if (
|
|
116
|
-
combineActiveTooltipIndex(mkInteraction(
|
|
127
|
+
combineActiveTooltipIndex(mkInteraction(i), displayedData, axisDataKey, domain) !=
|
|
117
128
|
null
|
|
118
129
|
) {
|
|
119
|
-
nextIndex =
|
|
130
|
+
nextIndex = i;
|
|
120
131
|
break;
|
|
121
132
|
}
|
|
122
133
|
}
|
|
123
134
|
}
|
|
135
|
+
|
|
124
136
|
if (nextIndex < 0) {
|
|
125
137
|
return;
|
|
126
138
|
}
|
|
127
139
|
} else {
|
|
128
140
|
nextIndex = currentIndex + movement * directionMultiplier;
|
|
129
|
-
|
|
130
|
-
(tooltipTicks === null || tooltipTicks === void 0 ? void 0 : tooltipTicks.length) ||
|
|
131
|
-
displayedData.length;
|
|
141
|
+
const dataLength = tooltipTicks?.length || displayedData.length;
|
|
132
142
|
if (dataLength === 0 || nextIndex >= dataLength || nextIndex < 0) {
|
|
133
143
|
return;
|
|
134
144
|
}
|
|
135
145
|
}
|
|
136
|
-
|
|
146
|
+
const coordinate = selectCoordinateForDefaultIndex(
|
|
137
147
|
currentState,
|
|
138
148
|
tooltipEventType,
|
|
139
149
|
'hover',
|
|
@@ -151,16 +161,19 @@ keyboardEventsMiddleware.startListening({
|
|
|
151
161
|
timeoutId = null;
|
|
152
162
|
}
|
|
153
163
|
};
|
|
164
|
+
|
|
154
165
|
if (!isThrottled) {
|
|
155
166
|
callback();
|
|
156
167
|
return;
|
|
157
168
|
}
|
|
169
|
+
|
|
158
170
|
if (throttleDelay === 'raf') {
|
|
159
171
|
rafId = requestAnimationFrame(callback);
|
|
160
172
|
} else if (typeof throttleDelay === 'number') {
|
|
161
173
|
if (timeoutId === null) {
|
|
162
174
|
callback();
|
|
163
175
|
latestKeyboardActionPayload = null;
|
|
176
|
+
|
|
164
177
|
timeoutId = setTimeout(() => {
|
|
165
178
|
if (latestKeyboardActionPayload) {
|
|
166
179
|
callback();
|
|
@@ -173,22 +186,23 @@ keyboardEventsMiddleware.startListening({
|
|
|
173
186
|
}
|
|
174
187
|
},
|
|
175
188
|
});
|
|
189
|
+
|
|
176
190
|
keyboardEventsMiddleware.startListening({
|
|
177
191
|
actionCreator: focusAction,
|
|
178
|
-
effect: (_action, listenerApi) => {
|
|
179
|
-
|
|
180
|
-
|
|
192
|
+
effect: (_action, listenerApi: ListenerEffectAPI<RechartsRootState, AppDispatch>) => {
|
|
193
|
+
const state: RechartsRootState = listenerApi.getState();
|
|
194
|
+
const accessibilityLayerIsActive = state.rootProps.accessibilityLayer !== false;
|
|
181
195
|
if (!accessibilityLayerIsActive) {
|
|
182
196
|
return;
|
|
183
197
|
}
|
|
184
|
-
|
|
198
|
+
const { keyboardInteraction } = state.tooltip;
|
|
185
199
|
if (keyboardInteraction.active) {
|
|
186
200
|
return;
|
|
187
201
|
}
|
|
188
202
|
if (keyboardInteraction.index == null) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
203
|
+
const nextIndex = '0';
|
|
204
|
+
const tooltipEventType = selectTooltipEventType(state, state.tooltip.settings.shared);
|
|
205
|
+
const coordinate = selectCoordinateForDefaultIndex(
|
|
192
206
|
state,
|
|
193
207
|
tooltipEventType,
|
|
194
208
|
'hover',
|
|
@@ -204,15 +218,16 @@ keyboardEventsMiddleware.startListening({
|
|
|
204
218
|
}
|
|
205
219
|
},
|
|
206
220
|
});
|
|
221
|
+
|
|
207
222
|
keyboardEventsMiddleware.startListening({
|
|
208
223
|
actionCreator: blurAction,
|
|
209
|
-
effect: (_action, listenerApi) => {
|
|
210
|
-
|
|
211
|
-
|
|
224
|
+
effect: (_action, listenerApi: ListenerEffectAPI<RechartsRootState, AppDispatch>) => {
|
|
225
|
+
const state: RechartsRootState = listenerApi.getState();
|
|
226
|
+
const accessibilityLayerIsActive = state.rootProps.accessibilityLayer !== false;
|
|
212
227
|
if (!accessibilityLayerIsActive) {
|
|
213
228
|
return;
|
|
214
229
|
}
|
|
215
|
-
|
|
230
|
+
const { keyboardInteraction } = state.tooltip;
|
|
216
231
|
if (keyboardInteraction.active) {
|
|
217
232
|
listenerApi.dispatch(
|
|
218
233
|
setKeyboardInteraction({
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
|
3
|
+
import { LayoutType, Margin, Size } from '../util/types';
|
|
4
|
+
|
|
5
|
+
type ChartLayoutState = {
|
|
6
|
+
layoutType: LayoutType;
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
margin: Margin;
|
|
10
|
+
/**
|
|
11
|
+
* How much is the chart zoomed in.
|
|
12
|
+
* Used for scaling the mouse coordinates to the chart coordinates.
|
|
13
|
+
*/
|
|
14
|
+
scale: number;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const initialState: ChartLayoutState = {
|
|
18
|
+
layoutType: 'horizontal',
|
|
19
|
+
width: 0,
|
|
20
|
+
height: 0,
|
|
21
|
+
margin: { top: 5, right: 5, bottom: 5, left: 5 },
|
|
22
|
+
scale: 1,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const chartLayoutSlice = createSlice({
|
|
26
|
+
name: 'chartLayout',
|
|
27
|
+
initialState,
|
|
28
|
+
reducers: {
|
|
29
|
+
setLayout(state, action: PayloadAction<LayoutType>) {
|
|
30
|
+
state.layoutType = action.payload;
|
|
31
|
+
},
|
|
32
|
+
setChartSize(state, action: PayloadAction<Size>) {
|
|
33
|
+
state.width = action.payload.width;
|
|
34
|
+
state.height = action.payload.height;
|
|
35
|
+
},
|
|
36
|
+
setMargin(state, action: PayloadAction<Partial<Margin>>) {
|
|
37
|
+
state.margin.top = action.payload.top ?? 0;
|
|
38
|
+
state.margin.right = action.payload.right ?? 0;
|
|
39
|
+
state.margin.bottom = action.payload.bottom ?? 0;
|
|
40
|
+
state.margin.left = action.payload.left ?? 0;
|
|
41
|
+
},
|
|
42
|
+
setScale(state, action: PayloadAction<number>) {
|
|
43
|
+
state.scale = action.payload;
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
export const { setMargin, setLayout, setChartSize, setScale } = chartLayoutSlice.actions;
|
|
49
|
+
|
|
50
|
+
export const chartLayoutReducer = chartLayoutSlice.reducer;
|