@octanejs/recharts 0.1.41 → 0.1.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{LICENSE → LICENSE.recharts} +3 -2
- package/README.md +12 -0
- package/package.json +10 -9
- package/src/animation/AnimatedItems.tsrx +36 -3
- package/src/animation/AnimationController.ts +17 -65
- package/src/animation/{AnimationControllerImpl.js → AnimationControllerImpl.ts} +19 -12
- package/src/animation/{AnimationHandle.js → AnimationHandle.ts} +82 -65
- package/src/animation/CSSTransitionAnimate.tsrx +3 -2
- package/src/animation/JavascriptAnimate.tsrx +18 -2
- package/src/animation/easing.ts +235 -0
- package/src/animation/{matchBy.js → matchBy.ts} +76 -120
- package/src/animation/timeoutController.ts +71 -0
- package/src/animation/useAnimationController.ts +4 -1
- package/src/animation/useAnimationStartSnapshot.ts +3 -3
- package/src/animation/util.ts +12 -0
- package/src/cartesian/Area.tsrx +33 -31
- package/src/cartesian/AreaRevealShape.tsrx +4 -3
- package/src/cartesian/Bar.ts +1 -0
- package/src/cartesian/Bar.tsrx +293 -39
- package/src/cartesian/BarStack.tsrx +31 -9
- package/src/cartesian/CartesianAxis.tsrx +154 -22
- package/src/cartesian/CartesianGrid.tsrx +5 -6
- package/src/cartesian/ErrorBar.tsrx +9 -8
- package/src/cartesian/Funnel.tsrx +40 -37
- package/src/cartesian/GraphicalItemClipPath.tsrx +11 -4
- package/src/cartesian/Line.ts +1 -0
- package/src/cartesian/Line.tsrx +206 -28
- package/src/cartesian/LineDrawShape.tsrx +23 -10
- package/src/cartesian/ReferenceLine.tsrx +8 -8
- package/src/cartesian/Scatter.tsrx +61 -66
- package/src/cartesian/XAxis.tsrx +78 -9
- package/src/cartesian/YAxis.tsrx +85 -12
- package/src/cartesian/getCartesianPosition.ts +265 -0
- package/src/cartesian/getEquidistantTicks.ts +144 -0
- package/src/cartesian/getTicks.ts +221 -0
- package/src/chart/AreaChart.tsrx +5 -1
- package/src/chart/BarChart.tsrx +8 -2
- package/src/chart/CartesianChart.tsrx +17 -4
- package/src/chart/CategoricalChart.tsrx +4 -1
- package/src/chart/ComposedChart.tsrx +5 -1
- package/src/chart/FunnelChart.tsrx +5 -1
- package/src/chart/LineChart.tsrx +8 -2
- package/src/chart/PieChart.tsrx +6 -2
- package/src/chart/PolarChart.tsrx +5 -4
- package/src/chart/RadarChart.tsrx +6 -2
- package/src/chart/RadialBarChart.tsrx +6 -2
- package/src/chart/RechartsWrapper.tsrx +57 -21
- package/src/chart/Sankey.tsrx +89 -91
- package/src/chart/ScatterChart.tsrx +5 -1
- package/src/chart/SunburstChart.tsrx +21 -14
- package/src/chart/types.ts +0 -1
- package/src/component/ActivePoints.tsrx +30 -5
- package/src/component/Cell.ts +19 -1
- package/src/component/Cursor.tsrx +11 -10
- package/src/component/DefaultLegendContent.tsrx +15 -10
- package/src/component/DefaultTooltipContent.tsrx +11 -9
- package/src/component/Dots.tsrx +37 -6
- package/src/component/Label.tsrx +99 -19
- package/src/component/LabelList.tsrx +54 -5
- package/src/component/Legend.tsrx +9 -5
- package/src/component/ResponsiveContainer.tsrx +13 -10
- package/src/component/Text.tsrx +95 -32
- package/src/component/Tooltip.tsrx +11 -10
- package/src/component/TooltipBoundingBox.tsrx +4 -5
- package/src/component/{responsiveContainerUtils.js → responsiveContainerUtils.ts} +59 -36
- package/src/container/ClipPathProvider.tsrx +6 -2
- package/src/container/Layer.tsrx +8 -1
- package/src/container/RootSurface.tsrx +15 -4
- package/src/container/Surface.tsrx +15 -1
- package/src/context/CellsContext.ts +6 -5
- package/src/context/ErrorBarContext.tsrx +23 -4
- package/src/context/RegisterGraphicalItemId.tsrx +10 -2
- package/src/context/accessibilityContext.ts +5 -0
- package/src/context/brushUpdateContext.ts +11 -0
- package/src/context/chartDataContext.ts +5 -4
- package/src/context/chartLayoutContext.ts +22 -8
- package/src/context/legendPayloadContext.tsrx +1 -1
- package/src/context/tooltipContext.ts +83 -0
- package/src/{hooks.js → hooks.ts} +88 -66
- package/src/index.ts +37 -37
- package/src/legacy-props.ts +129 -0
- package/src/polar/Pie.tsrx +91 -69
- package/src/polar/PolarAngleAxis.tsrx +47 -47
- package/src/polar/PolarGrid.tsrx +7 -6
- package/src/polar/PolarRadiusAxis.tsrx +29 -21
- package/src/polar/Radar.tsrx +26 -19
- package/src/polar/RadialBar.tsrx +59 -42
- package/src/polar/{defaultPolarAngleAxisProps.js → defaultPolarAngleAxisProps.ts} +6 -6
- package/src/polar/{defaultPolarRadiusAxisProps.js → defaultPolarRadiusAxisProps.ts} +5 -4
- package/src/shape/Cross.tsrx +14 -2
- package/src/shape/Curve.tsrx +111 -23
- package/src/shape/Dot.tsrx +12 -1
- package/src/shape/Polygon.tsrx +28 -6
- package/src/shape/Rectangle.tsrx +30 -3
- package/src/shape/Sector.tsrx +48 -6
- package/src/shape/Symbols.tsrx +24 -6
- package/src/shape/Trapezoid.tsrx +33 -3
- package/src/state/RechartsStoreProvider.tsrx +11 -2
- package/src/state/ReportChartProps.ts +2 -2
- package/src/state/ReportMainChartProps.ts +2 -1
- package/src/state/SetGraphicalItem.ts +6 -4
- package/src/state/SetLegendPayload.ts +7 -4
- package/src/state/SetTooltipEntrySettings.ts +5 -2
- package/src/state/brushSlice.ts +40 -0
- package/src/state/cartesianAxisSlice.ts +291 -0
- package/src/state/chartDataSlice.ts +87 -0
- package/src/state/errorBarSlice.ts +78 -0
- package/src/state/eventSettingsSlice.ts +30 -0
- package/src/state/{externalEventsMiddleware.js → externalEventsMiddleware.ts} +55 -34
- package/src/state/graphicalItemsSlice.ts +180 -0
- package/src/state/{keyboardEventsMiddleware.js → keyboardEventsMiddleware.ts} +72 -57
- package/src/state/layoutSlice.ts +50 -0
- package/src/state/legendSlice.ts +109 -0
- package/src/state/{mouseEventsMiddleware.js → mouseEventsMiddleware.ts} +45 -35
- package/src/state/optionsSlice.ts +65 -0
- package/src/state/polarAxisSlice.ts +42 -0
- package/src/state/polarOptionsSlice.ts +43 -0
- package/src/state/reduxDevtoolsJsonStringifyReplacer.ts +13 -0
- package/src/state/referenceElementsSlice.ts +100 -0
- package/src/state/renderedTicksSlice.ts +60 -0
- package/src/state/rootPropsSlice.ts +72 -0
- package/src/state/selectors/areaSelectors.ts +1 -2
- package/src/state/selectors/{arrayEqualityCheck.js → arrayEqualityCheck.ts} +4 -5
- package/src/state/selectors/axisSelectors.ts +2502 -0
- package/src/state/selectors/barSelectors.ts +373 -0
- package/src/state/selectors/barStackSelectors.ts +99 -0
- package/src/state/selectors/brushSelectors.ts +28 -0
- package/src/state/selectors/combiners/combineActiveLabel.ts +16 -0
- package/src/state/selectors/combiners/{combineActiveTooltipIndex.js → combineActiveTooltipIndex.ts} +45 -23
- package/src/state/selectors/combiners/combineAllBarPositions.ts +130 -0
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +16 -0
- package/src/state/selectors/combiners/combineBarPosition.ts +23 -0
- package/src/state/selectors/combiners/combineBarSizeList.ts +79 -0
- package/src/state/selectors/combiners/{combineCheckedDomain.js → combineCheckedDomain.ts} +9 -6
- package/src/state/selectors/combiners/combineConfiguredScale.ts +100 -0
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +46 -0
- package/src/state/selectors/combiners/{combineDisplayedStackedData.js → combineDisplayedStackedData.ts} +23 -19
- package/src/state/selectors/combiners/combineInverseScaleFunction.ts +16 -0
- package/src/state/selectors/combiners/{combineRealScaleType.js → combineRealScaleType.ts} +16 -8
- package/src/state/selectors/combiners/combineStackedData.ts +27 -0
- package/src/state/selectors/combiners/combineTooltipInteractionState.ts +86 -0
- package/src/state/selectors/combiners/combineTooltipPayload.ts +201 -0
- package/src/state/selectors/combiners/{combineTooltipPayloadConfigurations.js → combineTooltipPayloadConfigurations.ts} +17 -18
- package/src/state/selectors/containerSelectors.ts +12 -0
- package/src/state/selectors/{dataSelectors.js → dataSelectors.ts} +43 -41
- package/src/state/selectors/funnelSelectors.ts +5 -5
- package/src/state/selectors/graphicalItemSelectors.ts +22 -0
- package/src/state/selectors/legendSelectors.ts +25 -0
- package/src/state/selectors/lineSelectors.ts +159 -0
- package/src/state/selectors/numberDomainEqualityCheck.ts +15 -0
- package/src/state/selectors/pickAxisId.ts +6 -0
- package/src/state/selectors/pickAxisType.ts +4 -0
- package/src/state/selectors/pieSelectors.ts +14 -13
- package/src/state/selectors/polarAxisSelectors.ts +223 -0
- package/src/state/selectors/polarSelectors.ts +1 -1
- package/src/state/selectors/radarSelectors.ts +1 -1
- package/src/state/selectors/radialBarSelectors.ts +17 -16
- package/src/state/selectors/rootPropsSelectors.ts +26 -0
- package/src/state/selectors/scatterSelectors.ts +11 -10
- package/src/state/selectors/{selectActivePropsFromChartPointer.js → selectActivePropsFromChartPointer.ts} +11 -4
- package/src/state/selectors/selectAllAxes.ts +20 -0
- package/src/state/selectors/selectChartOffset.ts +17 -0
- package/src/state/selectors/selectChartOffsetInternal.ts +147 -0
- package/src/state/selectors/{selectPlotArea.js → selectPlotArea.ts} +4 -3
- package/src/state/selectors/selectTooltipAxisId.ts +6 -0
- package/src/state/selectors/{selectTooltipAxisType.js → selectTooltipAxisType.ts} +10 -4
- package/src/state/selectors/selectTooltipEventType.ts +39 -0
- package/src/state/selectors/selectTooltipPayloadSearcher.ts +6 -0
- package/src/state/selectors/selectTooltipSettings.ts +6 -0
- package/src/state/selectors/selectTooltipState.ts +5 -0
- package/src/state/selectors/selectors.ts +315 -0
- package/src/state/selectors/tooltipSelectors.ts +611 -0
- package/src/state/selectors/touchSelectors.ts +52 -0
- package/src/state/{store.js → store.ts} +46 -36
- package/src/state/tooltipSlice.ts +507 -0
- package/src/state/{touchEventsMiddleware.js → touchEventsMiddleware.ts} +54 -42
- package/src/state/types/AreaSettings.ts +15 -0
- package/src/state/types/BarSettings.ts +15 -0
- package/src/state/types/LineSettings.ts +10 -0
- package/src/state/types/PieSettings.ts +32 -0
- package/src/state/types/RadarSettings.ts +6 -0
- package/src/state/types/RadialBarSettings.ts +10 -0
- package/src/state/types/ScatterSettings.ts +13 -0
- package/src/state/types/StackedGraphicalItem.ts +34 -0
- package/src/state/zIndexSlice.ts +137 -0
- package/src/synchronisation/syncSelectors.ts +7 -0
- package/src/synchronisation/types.ts +42 -0
- package/src/synchronisation/useChartSynchronisation.tsrx +26 -11
- package/src/types.ts +55 -0
- package/src/util/ActiveShapeUtils.tsrx +34 -10
- package/src/util/BarUtils.tsrx +43 -3
- package/src/util/{CartesianUtils.js → CartesianUtils.ts} +22 -39
- package/src/util/ChartUtils.ts +759 -0
- package/src/util/{Constants.js → Constants.ts} +6 -6
- package/src/util/DOMUtils.ts +135 -0
- package/src/util/{DataUtils.js → DataUtils.ts} +120 -47
- package/src/util/Events.ts +22 -0
- package/src/util/FunnelUtils.tsrx +3 -3
- package/src/util/Global.ts +13 -0
- package/src/util/IfOverflow.ts +16 -0
- package/src/util/LRUCache.ts +42 -0
- package/src/util/{LogUtils.js → LogUtils.ts} +7 -12
- package/src/util/OctaneTypes.ts +51 -0
- package/src/util/PolarUtils.ts +132 -0
- package/src/util/RadialBarUtils.tsrx +3 -3
- package/src/util/ReduceCSSCalc.ts +186 -0
- package/src/util/ScatterUtils.tsrx +9 -7
- package/src/util/{TickUtils.js → TickUtils.ts} +30 -13
- package/src/util/{YAxisUtils.js → YAxisUtils.ts} +27 -17
- package/src/util/axisPropsAreEqual.ts +49 -0
- package/src/util/createEventProxy.ts +20 -0
- package/src/util/{excludeEventProps.js → excludeEventProps.ts} +8 -6
- package/src/util/getActiveCoordinate.ts +210 -0
- package/src/util/{getAxisTypeBasedOnLayout.js → getAxisTypeBasedOnLayout.ts} +7 -3
- package/src/util/getClassNameFromUnknown.ts +7 -0
- package/src/util/{getEveryNth.js → getEveryNth.ts} +5 -6
- package/src/util/getRadiusAndStrokeWidthFromDot.ts +31 -0
- package/src/util/{getRelativeCoordinate.js → getRelativeCoordinate.ts} +26 -9
- package/src/util/getSliced.ts +14 -0
- package/src/util/{isDomainSpecifiedByUser.js → isDomainSpecifiedByUser.ts} +46 -100
- package/src/util/isWellBehavedNumber.ts +8 -0
- package/src/util/payload/getUniqPayload.ts +1 -1
- package/src/util/{propsAreEqual.js → propsAreEqual.ts} +10 -8
- package/src/util/{resolveDefaultProps.js → resolveDefaultProps.ts} +35 -57
- package/src/util/round.ts +33 -0
- package/src/util/scale/CustomScaleDefinition.ts +82 -0
- package/src/util/scale/RechartsScale.ts +131 -0
- package/src/util/scale/{createCategoricalInverse.js → createCategoricalInverse.ts} +24 -29
- package/src/util/scale/{getNiceTickValues.js → getNiceTickValues.ts} +125 -146
- package/src/util/scale/index.ts +2 -0
- package/src/util/scale/util/{arithmetic.js → arithmetic.ts} +12 -8
- package/src/util/stacks/getStackSeriesIdentifier.ts +21 -0
- package/src/util/stacks/stackTypes.ts +58 -0
- package/src/util/{svgPropertiesNoEvents.js → svgPropertiesNoEvents.ts} +52 -27
- package/src/util/tooltip/translate.ts +2 -1
- package/src/util/typedDataKey.ts +49 -0
- package/src/util/types.ts +1265 -7
- package/src/util/{useUniqueId.js → useUniqueId.ts} +9 -5
- package/src/zIndex/{DefaultZIndexes.js → DefaultZIndexes.ts} +13 -4
- package/src/zIndex/ZIndexLayer.tsrx +13 -4
- package/src/zIndex/ZIndexPortal.tsrx +14 -4
- package/src/zIndex/{getZIndexFromUnknown.js → getZIndexFromUnknown.ts} +3 -3
- package/src/zIndex/{zIndexSelectors.js → zIndexSelectors.ts} +17 -11
- package/src/animation/easing.js +0 -193
- package/src/animation/timeoutController.js +0 -49
- package/src/animation/util.js +0 -11
- package/src/cartesian/Area.tsrx.d.ts +0 -340
- package/src/cartesian/Bar.tsrx.d.ts +0 -4
- package/src/cartesian/BarStack.tsrx.d.ts +0 -6
- package/src/cartesian/CartesianAxis.tsrx.d.ts +0 -3
- package/src/cartesian/CartesianGrid.tsrx.d.ts +0 -219
- package/src/cartesian/ErrorBar.tsrx.d.ts +0 -131
- package/src/cartesian/Funnel.tsrx.d.ts +0 -274
- package/src/cartesian/Line.tsrx.d.ts +0 -4
- package/src/cartesian/LineDrawShape.tsrx.d.ts +0 -2
- package/src/cartesian/ReferenceLine.tsrx.d.ts +0 -178
- package/src/cartesian/Scatter.tsrx.d.ts +0 -351
- package/src/cartesian/XAxis.tsrx.d.ts +0 -3
- package/src/cartesian/YAxis.tsrx.d.ts +0 -3
- package/src/cartesian/ZAxis.tsrx.d.ts +0 -102
- package/src/cartesian/getCartesianPosition.js +0 -277
- package/src/cartesian/getEquidistantTicks.js +0 -133
- package/src/cartesian/getTicks.js +0 -280
- package/src/chart/AreaChart.tsrx.d.ts +0 -12
- package/src/chart/BarChart.tsrx.d.ts +0 -2
- package/src/chart/CartesianChart.tsrx.d.ts +0 -10
- package/src/chart/ComposedChart.tsrx.d.ts +0 -12
- package/src/chart/FunnelChart.tsrx.d.ts +0 -12
- package/src/chart/LineChart.tsrx.d.ts +0 -2
- package/src/chart/PieChart.tsrx.d.ts +0 -31
- package/src/chart/RadarChart.tsrx.d.ts +0 -31
- package/src/chart/RadialBarChart.tsrx.d.ts +0 -31
- package/src/chart/Sankey.tsrx.d.ts +0 -253
- package/src/chart/ScatterChart.tsrx.d.ts +0 -12
- package/src/chart/SunburstChart.tsrx.d.ts +0 -146
- package/src/component/DefaultLegendContent.tsrx.d.ts +0 -125
- package/src/component/DefaultTooltipContent.tsrx.d.ts +0 -87
- package/src/component/Label.tsrx.d.ts +0 -12
- package/src/component/LabelList.tsrx.d.ts +0 -8
- package/src/component/Legend.tsrx.d.ts +0 -88
- package/src/component/ResponsiveContainer.tsrx.d.ts +0 -81
- package/src/component/Text.tsrx.d.ts +0 -9
- package/src/component/Tooltip.tsrx.d.ts +0 -246
- package/src/container/Layer.tsrx.d.ts +0 -6
- package/src/container/Surface.tsrx.d.ts +0 -12
- package/src/context/accessibilityContext.js +0 -10
- package/src/context/tooltipContext.js +0 -55
- package/src/index.d.ts +0 -281
- package/src/polar/Pie.tsrx.d.ts +0 -436
- package/src/polar/PolarAngleAxis.tsrx.d.ts +0 -215
- package/src/polar/PolarGrid.tsrx.d.ts +0 -117
- package/src/polar/PolarRadiusAxis.tsrx.d.ts +0 -209
- package/src/polar/Radar.tsrx.d.ts +0 -215
- package/src/polar/RadialBar.tsrx.d.ts +0 -340
- package/src/shape/Cross.tsrx.d.ts +0 -12
- package/src/shape/Curve.tsrx.d.ts +0 -42
- package/src/shape/Dot.tsrx.d.ts +0 -9
- package/src/shape/Polygon.tsrx.d.ts +0 -13
- package/src/shape/Rectangle.tsrx.d.ts +0 -31
- package/src/shape/Sector.tsrx.d.ts +0 -29
- package/src/shape/Symbols.tsrx.d.ts +0 -15
- package/src/shape/Trapezoid.tsrx.d.ts +0 -29
- package/src/state/brushSlice.js +0 -36
- package/src/state/cartesianAxisSlice.js +0 -256
- package/src/state/chartDataSlice.js +0 -67
- package/src/state/errorBarSlice.js +0 -53
- package/src/state/eventSettingsSlice.js +0 -25
- package/src/state/graphicalItemsSlice.js +0 -91
- package/src/state/layoutSlice.js +0 -57
- package/src/state/legendSlice.js +0 -83
- package/src/state/optionsSlice.js +0 -45
- package/src/state/polarAxisSlice.js +0 -33
- package/src/state/polarOptionsSlice.js +0 -26
- package/src/state/reduxDevtoolsJsonStringifyReplacer.js +0 -14
- package/src/state/referenceElementsSlice.js +0 -51
- package/src/state/renderedTicksSlice.js +0 -41
- package/src/state/rootPropsSlice.js +0 -48
- package/src/state/selectors/axisSelectors.js +0 -2113
- package/src/state/selectors/barSelectors.js +0 -263
- package/src/state/selectors/barStackSelectors.js +0 -65
- package/src/state/selectors/brushSelectors.js +0 -21
- package/src/state/selectors/combiners/combineActiveLabel.js +0 -18
- package/src/state/selectors/combiners/combineAllBarPositions.js +0 -169
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.js +0 -11
- package/src/state/selectors/combiners/combineBarPosition.js +0 -17
- package/src/state/selectors/combiners/combineBarSizeList.js +0 -115
- package/src/state/selectors/combiners/combineConfiguredScale.js +0 -46
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.js +0 -48
- package/src/state/selectors/combiners/combineInverseScaleFunction.js +0 -12
- package/src/state/selectors/combiners/combineStackedData.js +0 -22
- package/src/state/selectors/combiners/combineTooltipInteractionState.js +0 -121
- package/src/state/selectors/combiners/combineTooltipPayload.js +0 -248
- package/src/state/selectors/containerSelectors.js +0 -6
- package/src/state/selectors/graphicalItemSelectors.js +0 -25
- package/src/state/selectors/legendSelectors.js +0 -18
- package/src/state/selectors/lineSelectors.js +0 -106
- package/src/state/selectors/numberDomainEqualityCheck.js +0 -11
- package/src/state/selectors/pickAxisId.js +0 -3
- package/src/state/selectors/pickAxisType.js +0 -3
- package/src/state/selectors/polarAxisSelectors.js +0 -237
- package/src/state/selectors/rootPropsSelectors.js +0 -13
- package/src/state/selectors/selectAllAxes.js +0 -15
- package/src/state/selectors/selectChartOffset.js +0 -12
- package/src/state/selectors/selectChartOffsetInternal.js +0 -174
- package/src/state/selectors/selectTooltipAxisId.js +0 -3
- package/src/state/selectors/selectTooltipEventType.js +0 -27
- package/src/state/selectors/selectTooltipPayloadSearcher.js +0 -3
- package/src/state/selectors/selectTooltipSettings.js +0 -3
- package/src/state/selectors/selectTooltipState.js +0 -3
- package/src/state/selectors/selectors.js +0 -222
- package/src/state/selectors/tooltipSelectors.js +0 -471
- package/src/state/selectors/touchSelectors.js +0 -31
- package/src/state/tooltipSlice.js +0 -237
- package/src/state/types/StackedGraphicalItem.js +0 -18
- package/src/state/zIndexSlice.js +0 -167
- package/src/synchronisation/syncSelectors.js +0 -5
- package/src/util/ChartUtils.js +0 -630
- package/src/util/DOMUtils.js +0 -180
- package/src/util/Events.js +0 -7
- package/src/util/Global.js +0 -13
- package/src/util/LRUCache.js +0 -58
- package/src/util/PolarUtils.js +0 -190
- package/src/util/ReduceCSSCalc.js +0 -260
- package/src/util/axisPropsAreEqual.js +0 -63
- package/src/util/createEventProxy.js +0 -18
- package/src/util/getActiveCoordinate.js +0 -253
- package/src/util/getClassNameFromUnknown.js +0 -8
- package/src/util/getRadiusAndStrokeWidthFromDot.js +0 -28
- package/src/util/getSliced.js +0 -11
- package/src/util/isWellBehavedNumber.js +0 -8
- package/src/util/round.js +0 -39
- package/src/util/scale/RechartsScale.js +0 -68
- package/src/util/scale/index.js +0 -3
- package/src/util/stacks/getStackSeriesIdentifier.js +0 -10
- package/src/zIndex/ZIndexLayer.tsrx.d.ts +0 -2
|
@@ -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;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { createSlice, current, PayloadAction, prepareAutoBatched } from '@reduxjs/toolkit';
|
|
3
|
+
import { castDraft } from 'immer';
|
|
4
|
+
import { LayoutType, Size } from '../util/types';
|
|
5
|
+
import {
|
|
6
|
+
HorizontalAlignmentType,
|
|
7
|
+
LegendPayload,
|
|
8
|
+
VerticalAlignmentType,
|
|
9
|
+
} from '../component/DefaultLegendContent.tsrx';
|
|
10
|
+
import type { LegendItemSorter } from '../component/Legend.tsrx';
|
|
11
|
+
|
|
12
|
+
export type LegendSettings = {
|
|
13
|
+
layout: LayoutType;
|
|
14
|
+
align: HorizontalAlignmentType;
|
|
15
|
+
verticalAlign: VerticalAlignmentType;
|
|
16
|
+
itemSorter: LegendItemSorter | null;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The properties inside this state update independently of each other and quite often.
|
|
21
|
+
* When selecting, never select the whole state because you are going to get
|
|
22
|
+
* unnecessary re-renders. Select only the properties you need.
|
|
23
|
+
*
|
|
24
|
+
* This is why this state type is not exported - don't use it directly.
|
|
25
|
+
*/
|
|
26
|
+
type LegendState = {
|
|
27
|
+
settings: LegendSettings;
|
|
28
|
+
size: Size;
|
|
29
|
+
/**
|
|
30
|
+
* This is a 2D array of LegendPayloads. The first dimension is for each graphical item.
|
|
31
|
+
* Some items may have multiple legend items, so the second dimension is for each legend item.
|
|
32
|
+
*/
|
|
33
|
+
payload: ReadonlyArray<ReadonlyArray<LegendPayload>>;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const initialState: LegendState = {
|
|
37
|
+
settings: {
|
|
38
|
+
layout: 'horizontal',
|
|
39
|
+
align: 'center',
|
|
40
|
+
verticalAlign: 'bottom',
|
|
41
|
+
itemSorter: 'value',
|
|
42
|
+
},
|
|
43
|
+
size: {
|
|
44
|
+
width: 0,
|
|
45
|
+
height: 0,
|
|
46
|
+
},
|
|
47
|
+
payload: [],
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const legendSlice = createSlice({
|
|
51
|
+
name: 'legend',
|
|
52
|
+
initialState,
|
|
53
|
+
reducers: {
|
|
54
|
+
setLegendSize(state, action: PayloadAction<Size>) {
|
|
55
|
+
state.size.width = action.payload.width;
|
|
56
|
+
state.size.height = action.payload.height;
|
|
57
|
+
},
|
|
58
|
+
setLegendSettings(state, action: PayloadAction<LegendSettings>) {
|
|
59
|
+
state.settings.align = action.payload.align;
|
|
60
|
+
state.settings.layout = action.payload.layout;
|
|
61
|
+
state.settings.verticalAlign = action.payload.verticalAlign;
|
|
62
|
+
state.settings.itemSorter = action.payload.itemSorter;
|
|
63
|
+
},
|
|
64
|
+
addLegendPayload: {
|
|
65
|
+
reducer(state, action: PayloadAction<ReadonlyArray<LegendPayload>>) {
|
|
66
|
+
state.payload.push(castDraft(action.payload));
|
|
67
|
+
},
|
|
68
|
+
prepare: prepareAutoBatched<ReadonlyArray<LegendPayload>>(),
|
|
69
|
+
},
|
|
70
|
+
replaceLegendPayload: {
|
|
71
|
+
reducer(
|
|
72
|
+
state,
|
|
73
|
+
action: PayloadAction<{
|
|
74
|
+
prev: ReadonlyArray<LegendPayload>;
|
|
75
|
+
next: ReadonlyArray<LegendPayload>;
|
|
76
|
+
}>,
|
|
77
|
+
) {
|
|
78
|
+
const { prev, next } = action.payload;
|
|
79
|
+
const index = current(state).payload.indexOf(castDraft(prev));
|
|
80
|
+
if (index > -1) {
|
|
81
|
+
state.payload[index] = castDraft(next);
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
prepare: prepareAutoBatched<{
|
|
85
|
+
prev: ReadonlyArray<LegendPayload>;
|
|
86
|
+
next: ReadonlyArray<LegendPayload>;
|
|
87
|
+
}>(),
|
|
88
|
+
},
|
|
89
|
+
removeLegendPayload: {
|
|
90
|
+
reducer(state, action: PayloadAction<ReadonlyArray<LegendPayload>>) {
|
|
91
|
+
const index = current(state).payload.indexOf(castDraft(action.payload));
|
|
92
|
+
if (index > -1) {
|
|
93
|
+
state.payload.splice(index, 1);
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
prepare: prepareAutoBatched<ReadonlyArray<LegendPayload>>(),
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
export const {
|
|
102
|
+
setLegendSize,
|
|
103
|
+
setLegendSettings,
|
|
104
|
+
addLegendPayload,
|
|
105
|
+
replaceLegendPayload,
|
|
106
|
+
removeLegendPayload,
|
|
107
|
+
} = legendSlice.actions;
|
|
108
|
+
|
|
109
|
+
export const legendReducer = legendSlice.reducer;
|