@octanejs/recharts 0.1.41 → 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/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
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { createSlice, PayloadAction, prepareAutoBatched } from '@reduxjs/toolkit';
|
|
3
|
+
import { castDraft, type Draft } from 'immer';
|
|
4
|
+
import {
|
|
5
|
+
AxisDomain,
|
|
6
|
+
AxisInterval,
|
|
7
|
+
AxisTick,
|
|
8
|
+
DataKey,
|
|
9
|
+
EvaluatedAxisDomainType,
|
|
10
|
+
ScaleType,
|
|
11
|
+
TickProp,
|
|
12
|
+
} from '../util/types';
|
|
13
|
+
import { TickFormatter } from '../cartesian/CartesianAxis.tsrx';
|
|
14
|
+
import type { AxisRange } from './selectors/axisSelectors';
|
|
15
|
+
import { CustomScaleDefinition } from '../util/scale/CustomScaleDefinition';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @inline
|
|
19
|
+
*/
|
|
20
|
+
export type AxisId = string | number;
|
|
21
|
+
export const defaultAxisId: AxisId = 0;
|
|
22
|
+
export type XAxisPadding = { left?: number; right?: number } | 'gap' | 'no-gap';
|
|
23
|
+
export type YAxisPadding = { top?: number; bottom?: number } | 'gap' | 'no-gap';
|
|
24
|
+
|
|
25
|
+
export type XAxisOrientation = 'top' | 'bottom';
|
|
26
|
+
export type YAxisOrientation = 'left' | 'right';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Properties shared in X, Y, and Z axes.
|
|
30
|
+
* User defined axis settings, coming from props.
|
|
31
|
+
*/
|
|
32
|
+
export type BaseCartesianAxis = {
|
|
33
|
+
id: AxisId;
|
|
34
|
+
scale:
|
|
35
|
+
| ScaleType
|
|
36
|
+
| CustomScaleDefinition
|
|
37
|
+
| CustomScaleDefinition<string>
|
|
38
|
+
| CustomScaleDefinition<number>
|
|
39
|
+
| CustomScaleDefinition<Date>;
|
|
40
|
+
/**
|
|
41
|
+
* Before creating this object, evaluate the domain type based on the chart layout so that we have the 'auto' resolved.
|
|
42
|
+
*/
|
|
43
|
+
type: EvaluatedAxisDomainType;
|
|
44
|
+
/**
|
|
45
|
+
* The axis functionality is severely restricted without a dataKey
|
|
46
|
+
* - but there is still something left, and the prop is optional
|
|
47
|
+
* so this can also be undefined even in real charts.
|
|
48
|
+
* There are no defaults.
|
|
49
|
+
*/
|
|
50
|
+
dataKey: DataKey<any> | undefined;
|
|
51
|
+
unit: string | undefined;
|
|
52
|
+
name: string | undefined;
|
|
53
|
+
allowDuplicatedCategory: boolean;
|
|
54
|
+
allowDataOverflow: boolean;
|
|
55
|
+
reversed: boolean;
|
|
56
|
+
includeHidden: boolean;
|
|
57
|
+
domain: AxisDomain | undefined;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Controls how Recharts calculates "nice" tick values for numerical axes.
|
|
62
|
+
*
|
|
63
|
+
* - `'none'`: Recharts does not apply any tick-rounding algorithm; tick positions are
|
|
64
|
+
* determined entirely by d3, evenly spaced but not rounded to human-friendly numbers.
|
|
65
|
+
* There is no domain-extension logic applied in this mode.
|
|
66
|
+
*
|
|
67
|
+
* - `'auto'` *(default)*: Recharts automatically decides whether and how to apply tick
|
|
68
|
+
* niceties based on the domain definition. When the domain contains an `'auto'` keyword,
|
|
69
|
+
* Recharts uses the `'adaptive'` algorithm and may extend the domain slightly to
|
|
70
|
+
* produce clean tick labels. Otherwise, it applies the same algorithm while keeping
|
|
71
|
+
* ticks within the fixed domain. This mirrors the default behavior from Recharts v2.
|
|
72
|
+
*
|
|
73
|
+
* - `'adaptive'`: Always applies the space-efficient algorithm (`getAdaptiveStep`),
|
|
74
|
+
* which fills the available range as densely as possible while still rounding steps
|
|
75
|
+
* to reasonable numbers (e.g. 10, 20, 25). May produce less "round-looking" labels
|
|
76
|
+
* than `'snap125'`, but wastes less space. The domain-extension logic still applies
|
|
77
|
+
* when the domain contains an `'auto'` keyword.
|
|
78
|
+
*
|
|
79
|
+
* - `'snap125'`: Always applies the round-numbers algorithm (`getSnap125Step`), which
|
|
80
|
+
* snaps step sizes to values from the set {1, 2, 2.5, 5} × 10ⁿ. Produces very
|
|
81
|
+
* human-friendly labels (e.g. 0, 5, 10, 15, 20) but may leave blank space at the
|
|
82
|
+
* edges of the chart. The domain-extension logic still applies when the domain
|
|
83
|
+
* contains an `'auto'` keyword.
|
|
84
|
+
*
|
|
85
|
+
* @see {@link https://recharts.github.io/guide/axisTicks/}
|
|
86
|
+
* @inline
|
|
87
|
+
*/
|
|
88
|
+
export type NiceTicksAlgorithm = 'none' | 'auto' | 'adaptive' | 'snap125';
|
|
89
|
+
|
|
90
|
+
export type TicksSettings = {
|
|
91
|
+
allowDecimals: boolean;
|
|
92
|
+
/**
|
|
93
|
+
* We pass the suggested number of ticks to d3 https://d3js.org/d3-scale/linear#linear_ticks
|
|
94
|
+
* This number is a suggestion. d3 tries to accommodate it, but it might return more or less ticks than requested:
|
|
95
|
+
* > The specified count is only a hint; the scale may return more or fewer values depending on the domain.
|
|
96
|
+
*
|
|
97
|
+
* If undefined, then d3 decides the number of ticks on its own. The default in d3 is 10,
|
|
98
|
+
* but it can vary based on the domain size and other factors.
|
|
99
|
+
*/
|
|
100
|
+
tickCount: number | undefined;
|
|
101
|
+
/**
|
|
102
|
+
* Ticks can be any type when the axis is the type of category
|
|
103
|
+
* Ticks must be numbers when the axis is the type of number
|
|
104
|
+
*/
|
|
105
|
+
ticks: ReadonlyArray<AxisTick> | undefined;
|
|
106
|
+
tick: TickProp<any>;
|
|
107
|
+
/**
|
|
108
|
+
* Controls how Recharts calculates "nice" tick values for this axis.
|
|
109
|
+
* See {@link NiceTicksAlgorithm} for a full description of each option.
|
|
110
|
+
*
|
|
111
|
+
* @defaultValue 'auto'
|
|
112
|
+
*/
|
|
113
|
+
niceTicks: NiceTicksAlgorithm;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* These are the external props, visible for users as they set them using our public API.
|
|
118
|
+
* There is all sorts of internal computed things based on these, but they will come through selectors.
|
|
119
|
+
*
|
|
120
|
+
* Properties shared between X and Y axes
|
|
121
|
+
*/
|
|
122
|
+
export type CartesianAxisSettings = BaseCartesianAxis &
|
|
123
|
+
TicksSettings & {
|
|
124
|
+
interval: AxisInterval;
|
|
125
|
+
mirror: boolean;
|
|
126
|
+
minTickGap: number;
|
|
127
|
+
angle: number;
|
|
128
|
+
hide: boolean;
|
|
129
|
+
tickFormatter: TickFormatter | undefined;
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export type XAxisSettings = CartesianAxisSettings & {
|
|
133
|
+
padding: XAxisPadding;
|
|
134
|
+
height: number;
|
|
135
|
+
orientation: XAxisOrientation;
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
export type YAxisWidth = number | 'auto';
|
|
139
|
+
|
|
140
|
+
export type YAxisSettings = CartesianAxisSettings & {
|
|
141
|
+
padding: YAxisPadding;
|
|
142
|
+
width: YAxisWidth;
|
|
143
|
+
orientation: YAxisOrientation;
|
|
144
|
+
widthHistory?: number[];
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Z axis is special because it's never displayed. It controls the size of Scatter dots,
|
|
149
|
+
* but it never displays ticks anywhere.
|
|
150
|
+
*/
|
|
151
|
+
export type ZAxisSettings = BaseCartesianAxis & {
|
|
152
|
+
range: AxisRange;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
type AxisMapState = {
|
|
156
|
+
xAxis: Record<AxisId, XAxisSettings>;
|
|
157
|
+
yAxis: Record<AxisId, YAxisSettings>;
|
|
158
|
+
zAxis: Record<AxisId, ZAxisSettings>;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
const initialState: AxisMapState = {
|
|
162
|
+
xAxis: {},
|
|
163
|
+
yAxis: {},
|
|
164
|
+
zAxis: {},
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* This is the slice where each individual Axis element pushes its own configuration.
|
|
169
|
+
* Prefer to use this one instead of axisSlice.
|
|
170
|
+
*/
|
|
171
|
+
// Registered props may contain native DOM refs. The private callback boundary
|
|
172
|
+
// avoids RTK's prepared-action validator recursively comparing raw DOM-backed
|
|
173
|
+
// settings with Draft<Settings>. Every access still uses the exact known draft;
|
|
174
|
+
// the exported reducer state and action payloads remain fully typed.
|
|
175
|
+
const cartesianAxisSlice = createSlice({
|
|
176
|
+
name: 'cartesianAxis',
|
|
177
|
+
initialState,
|
|
178
|
+
reducers: {
|
|
179
|
+
addXAxis: {
|
|
180
|
+
reducer(state: unknown, action: PayloadAction<XAxisSettings>) {
|
|
181
|
+
(state as Draft<AxisMapState>).xAxis[action.payload.id] = castDraft(action.payload);
|
|
182
|
+
},
|
|
183
|
+
prepare: prepareAutoBatched<XAxisSettings>(),
|
|
184
|
+
},
|
|
185
|
+
replaceXAxis: {
|
|
186
|
+
reducer(state: unknown, action: PayloadAction<{ prev: XAxisSettings; next: XAxisSettings }>) {
|
|
187
|
+
const { prev, next } = action.payload;
|
|
188
|
+
if ((state as Draft<AxisMapState>).xAxis[prev.id] !== undefined) {
|
|
189
|
+
if (prev.id !== next.id) {
|
|
190
|
+
delete (state as Draft<AxisMapState>).xAxis[prev.id];
|
|
191
|
+
}
|
|
192
|
+
(state as Draft<AxisMapState>).xAxis[next.id] = castDraft(next);
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
prepare: prepareAutoBatched<{ prev: XAxisSettings; next: XAxisSettings }>(),
|
|
196
|
+
},
|
|
197
|
+
removeXAxis: {
|
|
198
|
+
reducer(state: unknown, action: PayloadAction<XAxisSettings>) {
|
|
199
|
+
delete (state as Draft<AxisMapState>).xAxis[action.payload.id];
|
|
200
|
+
},
|
|
201
|
+
prepare: prepareAutoBatched<XAxisSettings>(),
|
|
202
|
+
},
|
|
203
|
+
addYAxis: {
|
|
204
|
+
reducer(state: unknown, action: PayloadAction<YAxisSettings>) {
|
|
205
|
+
(state as Draft<AxisMapState>).yAxis[action.payload.id] = castDraft(action.payload);
|
|
206
|
+
},
|
|
207
|
+
prepare: prepareAutoBatched<YAxisSettings>(),
|
|
208
|
+
},
|
|
209
|
+
replaceYAxis: {
|
|
210
|
+
reducer(state: unknown, action: PayloadAction<{ prev: YAxisSettings; next: YAxisSettings }>) {
|
|
211
|
+
const { prev, next } = action.payload;
|
|
212
|
+
if ((state as Draft<AxisMapState>).yAxis[prev.id] !== undefined) {
|
|
213
|
+
if (prev.id !== next.id) {
|
|
214
|
+
delete (state as Draft<AxisMapState>).yAxis[prev.id];
|
|
215
|
+
}
|
|
216
|
+
(state as Draft<AxisMapState>).yAxis[next.id] = castDraft(next);
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
prepare: prepareAutoBatched<{ prev: YAxisSettings; next: YAxisSettings }>(),
|
|
220
|
+
},
|
|
221
|
+
removeYAxis: {
|
|
222
|
+
reducer(state: unknown, action: PayloadAction<YAxisSettings>) {
|
|
223
|
+
delete (state as Draft<AxisMapState>).yAxis[action.payload.id];
|
|
224
|
+
},
|
|
225
|
+
prepare: prepareAutoBatched<YAxisSettings>(),
|
|
226
|
+
},
|
|
227
|
+
addZAxis: {
|
|
228
|
+
reducer(state: unknown, action: PayloadAction<ZAxisSettings>) {
|
|
229
|
+
(state as Draft<AxisMapState>).zAxis[action.payload.id] = castDraft(action.payload);
|
|
230
|
+
},
|
|
231
|
+
prepare: prepareAutoBatched<ZAxisSettings>(),
|
|
232
|
+
},
|
|
233
|
+
replaceZAxis: {
|
|
234
|
+
reducer(state: unknown, action: PayloadAction<{ prev: ZAxisSettings; next: ZAxisSettings }>) {
|
|
235
|
+
const { prev, next } = action.payload;
|
|
236
|
+
if ((state as Draft<AxisMapState>).zAxis[prev.id] !== undefined) {
|
|
237
|
+
if (prev.id !== next.id) {
|
|
238
|
+
delete (state as Draft<AxisMapState>).zAxis[prev.id];
|
|
239
|
+
}
|
|
240
|
+
(state as Draft<AxisMapState>).zAxis[next.id] = castDraft(next);
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
prepare: prepareAutoBatched<{ prev: ZAxisSettings; next: ZAxisSettings }>(),
|
|
244
|
+
},
|
|
245
|
+
removeZAxis: {
|
|
246
|
+
reducer(state: unknown, action: PayloadAction<ZAxisSettings>) {
|
|
247
|
+
delete (state as Draft<AxisMapState>).zAxis[action.payload.id];
|
|
248
|
+
},
|
|
249
|
+
prepare: prepareAutoBatched<ZAxisSettings>(),
|
|
250
|
+
},
|
|
251
|
+
updateYAxisWidth(state: unknown, action: PayloadAction<{ id: AxisId; width: number }>) {
|
|
252
|
+
const { id, width } = action.payload;
|
|
253
|
+
const axis = (state as Draft<AxisMapState>).yAxis[id];
|
|
254
|
+
if (axis) {
|
|
255
|
+
const history = axis.widthHistory || [];
|
|
256
|
+
// An oscillation is detected when the new width is the same as the width before the last one.
|
|
257
|
+
// This is a simple A -> B -> A pattern. If the next width is B, and the difference is less than 1 pixel, we ignore it.
|
|
258
|
+
if (
|
|
259
|
+
history.length === 3 &&
|
|
260
|
+
history[0] === history[2] &&
|
|
261
|
+
width === history[1] &&
|
|
262
|
+
width !== axis.width &&
|
|
263
|
+
Math.abs(width - (history[0] ?? 0)) <= 1
|
|
264
|
+
) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const newHistory = [...history, width].slice(-3);
|
|
268
|
+
(state as Draft<AxisMapState>).yAxis[id] = {
|
|
269
|
+
...axis,
|
|
270
|
+
width,
|
|
271
|
+
widthHistory: newHistory,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
export const {
|
|
279
|
+
addXAxis,
|
|
280
|
+
replaceXAxis,
|
|
281
|
+
removeXAxis,
|
|
282
|
+
addYAxis,
|
|
283
|
+
replaceYAxis,
|
|
284
|
+
removeYAxis,
|
|
285
|
+
addZAxis,
|
|
286
|
+
replaceZAxis,
|
|
287
|
+
removeZAxis,
|
|
288
|
+
updateYAxisWidth,
|
|
289
|
+
} = cartesianAxisSlice.actions;
|
|
290
|
+
|
|
291
|
+
export const cartesianAxisReducer = cartesianAxisSlice.reducer;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { PayloadAction, createSlice } from '@reduxjs/toolkit';
|
|
3
|
+
import { castDraft } from 'immer';
|
|
4
|
+
import { BrushStartEndIndex } from '../context/brushUpdateContext';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* This is the data that's coming through main chart `data` prop
|
|
8
|
+
* Recharts is very flexible in what it accepts so the type is very flexible too.
|
|
9
|
+
* This will typically be an object, and various components will provide various `dataKey`
|
|
10
|
+
* that dictates how to pull data from that object.
|
|
11
|
+
*
|
|
12
|
+
* TL;DR: before dataKey
|
|
13
|
+
*
|
|
14
|
+
* @inline
|
|
15
|
+
*/
|
|
16
|
+
export type ChartData<DataPointType = unknown> = ReadonlyArray<DataPointType>;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* So this is the same unknown type as ChartData but this is after the dataKey has been applied.
|
|
20
|
+
* We still don't know what the type is - that depends on what exactly it was before the dataKey application,
|
|
21
|
+
* and the dataKey can return whatever anyway - but let's keep it separate as a form of documentation.
|
|
22
|
+
*
|
|
23
|
+
* TL;DR: ChartData after dataKey.
|
|
24
|
+
*/
|
|
25
|
+
export type AppliedChartData = ReadonlyArray<{ value: unknown }>;
|
|
26
|
+
|
|
27
|
+
export type ChartDataState = {
|
|
28
|
+
chartData: ChartData | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* store a copy of chart data after it has been processed by each chart's specific
|
|
31
|
+
* compute functions. TODO: add other charts besides Sankey
|
|
32
|
+
*/
|
|
33
|
+
computedData: unknown | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Using Brush, users can choose where they want to zoom in.
|
|
36
|
+
* This is zero-based index of the starting data point.
|
|
37
|
+
*/
|
|
38
|
+
dataStartIndex: number;
|
|
39
|
+
/**
|
|
40
|
+
* Using Brush, users can choose where they want to zoom in.
|
|
41
|
+
* This is zero-based index of the last data point.
|
|
42
|
+
*/
|
|
43
|
+
dataEndIndex: number;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const initialChartDataState: ChartDataState = {
|
|
47
|
+
chartData: undefined,
|
|
48
|
+
computedData: undefined,
|
|
49
|
+
dataStartIndex: 0,
|
|
50
|
+
dataEndIndex: 0,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
type BrushStartEndIndexActionPayload = Partial<BrushStartEndIndex>;
|
|
54
|
+
|
|
55
|
+
const chartDataSlice = createSlice({
|
|
56
|
+
name: 'chartData',
|
|
57
|
+
initialState: initialChartDataState,
|
|
58
|
+
reducers: {
|
|
59
|
+
setChartData(state, action: PayloadAction<ChartData | undefined>) {
|
|
60
|
+
state.chartData = castDraft(action.payload);
|
|
61
|
+
if (action.payload == null) {
|
|
62
|
+
state.dataStartIndex = 0;
|
|
63
|
+
state.dataEndIndex = 0;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (action.payload.length > 0 && state.dataEndIndex !== action.payload.length - 1) {
|
|
67
|
+
state.dataEndIndex = action.payload.length - 1;
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
setComputedData(state, action: PayloadAction<unknown | undefined>) {
|
|
71
|
+
state.computedData = action.payload;
|
|
72
|
+
},
|
|
73
|
+
setDataStartEndIndexes(state, action: PayloadAction<BrushStartEndIndexActionPayload>) {
|
|
74
|
+
const { startIndex, endIndex } = action.payload;
|
|
75
|
+
if (startIndex != null) {
|
|
76
|
+
state.dataStartIndex = startIndex;
|
|
77
|
+
}
|
|
78
|
+
if (endIndex != null) {
|
|
79
|
+
state.dataEndIndex = endIndex;
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
export const { setChartData, setDataStartEndIndexes, setComputedData } = chartDataSlice.actions;
|
|
86
|
+
|
|
87
|
+
export const chartDataReducer = chartDataSlice.reducer;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
|
3
|
+
import { ErrorBarDirection } from '../cartesian/ErrorBar.tsrx';
|
|
4
|
+
import { DataKey } from '../util/types';
|
|
5
|
+
import { GraphicalItemId } from './graphicalItemsSlice';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* ErrorBars have lot more settings but all the others are scoped to the component itself.
|
|
9
|
+
* Only some of them required to be reported to the global store because XAxis and YAxis need to know
|
|
10
|
+
* if the error bar is contributing to extending the axis domain.
|
|
11
|
+
*/
|
|
12
|
+
export type ErrorBarsSettings = {
|
|
13
|
+
/**
|
|
14
|
+
* The direction is only used in Scatter chart, and decided based on ChartLayout in other charts.
|
|
15
|
+
*/
|
|
16
|
+
direction: ErrorBarDirection;
|
|
17
|
+
/**
|
|
18
|
+
* The dataKey decides which property from the data will each individual ErrorBar use.
|
|
19
|
+
* If it so happens that the ErrorBar data are bigger than the axis domain,
|
|
20
|
+
* the error bar data will stretch the axis domain.
|
|
21
|
+
*/
|
|
22
|
+
dataKey: DataKey<any>;
|
|
23
|
+
/*
|
|
24
|
+
* ErrorBar props say that it has explicit xAxis and yAxis props,
|
|
25
|
+
* but actually it always inherits the xAxis and yAxis defined on the parent graphical item.
|
|
26
|
+
*/
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type ErrorBarsState = Record<GraphicalItemId, ReadonlyArray<ErrorBarsSettings>>;
|
|
30
|
+
|
|
31
|
+
const initialState: ErrorBarsState = {};
|
|
32
|
+
|
|
33
|
+
const errorBarSlice = createSlice({
|
|
34
|
+
name: 'errorBars',
|
|
35
|
+
initialState,
|
|
36
|
+
reducers: {
|
|
37
|
+
addErrorBar: (
|
|
38
|
+
state,
|
|
39
|
+
action: PayloadAction<{ itemId: GraphicalItemId; errorBar: ErrorBarsSettings }>,
|
|
40
|
+
) => {
|
|
41
|
+
const { itemId, errorBar } = action.payload;
|
|
42
|
+
if (!state[itemId]) {
|
|
43
|
+
state[itemId] = [];
|
|
44
|
+
}
|
|
45
|
+
state[itemId].push(errorBar);
|
|
46
|
+
},
|
|
47
|
+
replaceErrorBar: (
|
|
48
|
+
state,
|
|
49
|
+
action: PayloadAction<{
|
|
50
|
+
itemId: GraphicalItemId;
|
|
51
|
+
prev: ErrorBarsSettings;
|
|
52
|
+
next: ErrorBarsSettings;
|
|
53
|
+
}>,
|
|
54
|
+
) => {
|
|
55
|
+
const { itemId, prev, next } = action.payload;
|
|
56
|
+
if (state[itemId]) {
|
|
57
|
+
state[itemId] = state[itemId].map((e) =>
|
|
58
|
+
e.dataKey === prev.dataKey && e.direction === prev.direction ? next : e,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
removeErrorBar: (
|
|
63
|
+
state,
|
|
64
|
+
action: PayloadAction<{ itemId: GraphicalItemId; errorBar: ErrorBarsSettings }>,
|
|
65
|
+
) => {
|
|
66
|
+
const { itemId, errorBar } = action.payload;
|
|
67
|
+
if (state[itemId]) {
|
|
68
|
+
state[itemId] = state[itemId].filter(
|
|
69
|
+
(e) => e.dataKey !== errorBar.dataKey || e.direction !== errorBar.direction,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
export const { addErrorBar, replaceErrorBar, removeErrorBar } = errorBarSlice.actions;
|
|
77
|
+
|
|
78
|
+
export const errorBarReducer = errorBarSlice.reducer;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
|
|
3
|
+
import { castDraft } from 'immer';
|
|
4
|
+
import { EventThrottlingProps } from '../util/types';
|
|
5
|
+
|
|
6
|
+
export type EventSettingsState = Required<EventThrottlingProps>;
|
|
7
|
+
|
|
8
|
+
export const initialEventSettingsState: EventSettingsState = {
|
|
9
|
+
throttleDelay: 'raf',
|
|
10
|
+
throttledEvents: ['mousemove', 'touchmove', 'pointermove', 'scroll', 'wheel'],
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const eventSettingsSlice = createSlice({
|
|
14
|
+
name: 'eventSettings',
|
|
15
|
+
initialState: initialEventSettingsState,
|
|
16
|
+
reducers: {
|
|
17
|
+
setEventSettings: (state, action: PayloadAction<EventThrottlingProps>) => {
|
|
18
|
+
if (action.payload.throttleDelay != null) {
|
|
19
|
+
state.throttleDelay = action.payload.throttleDelay;
|
|
20
|
+
}
|
|
21
|
+
if (action.payload.throttledEvents != null) {
|
|
22
|
+
state.throttledEvents = castDraft(action.payload.throttledEvents);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
export const { setEventSettings } = eventSettingsSlice.actions;
|
|
29
|
+
|
|
30
|
+
export const eventSettingsReducer = eventSettingsSlice.reducer;
|
|
@@ -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 {
|