@octanejs/recharts 0.1.40 → 0.1.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{LICENSE → LICENSE.recharts} +3 -2
- package/README.md +12 -0
- package/package.json +10 -9
- package/src/animation/AnimatedItems.tsrx +36 -3
- package/src/animation/AnimationController.ts +17 -65
- package/src/animation/{AnimationControllerImpl.js → AnimationControllerImpl.ts} +19 -12
- package/src/animation/{AnimationHandle.js → AnimationHandle.ts} +82 -65
- package/src/animation/CSSTransitionAnimate.tsrx +3 -2
- package/src/animation/JavascriptAnimate.tsrx +18 -2
- package/src/animation/easing.ts +235 -0
- package/src/animation/{matchBy.js → matchBy.ts} +76 -120
- package/src/animation/timeoutController.ts +71 -0
- package/src/animation/useAnimationController.ts +4 -1
- package/src/animation/useAnimationStartSnapshot.ts +3 -3
- package/src/animation/util.ts +12 -0
- package/src/cartesian/Area.tsrx +33 -31
- package/src/cartesian/AreaRevealShape.tsrx +4 -3
- package/src/cartesian/Bar.ts +1 -0
- package/src/cartesian/Bar.tsrx +293 -39
- package/src/cartesian/BarStack.tsrx +31 -9
- package/src/cartesian/CartesianAxis.tsrx +154 -22
- package/src/cartesian/CartesianGrid.tsrx +5 -6
- package/src/cartesian/ErrorBar.tsrx +9 -8
- package/src/cartesian/Funnel.tsrx +40 -37
- package/src/cartesian/GraphicalItemClipPath.tsrx +11 -4
- package/src/cartesian/Line.ts +1 -0
- package/src/cartesian/Line.tsrx +206 -28
- package/src/cartesian/LineDrawShape.tsrx +23 -10
- package/src/cartesian/ReferenceLine.tsrx +8 -8
- package/src/cartesian/Scatter.tsrx +61 -66
- package/src/cartesian/XAxis.tsrx +78 -9
- package/src/cartesian/YAxis.tsrx +85 -12
- package/src/cartesian/getCartesianPosition.ts +265 -0
- package/src/cartesian/getEquidistantTicks.ts +144 -0
- package/src/cartesian/getTicks.ts +221 -0
- package/src/chart/AreaChart.tsrx +5 -1
- package/src/chart/BarChart.tsrx +8 -2
- package/src/chart/CartesianChart.tsrx +17 -4
- package/src/chart/CategoricalChart.tsrx +4 -1
- package/src/chart/ComposedChart.tsrx +5 -1
- package/src/chart/FunnelChart.tsrx +5 -1
- package/src/chart/LineChart.tsrx +8 -2
- package/src/chart/PieChart.tsrx +6 -2
- package/src/chart/PolarChart.tsrx +5 -4
- package/src/chart/RadarChart.tsrx +6 -2
- package/src/chart/RadialBarChart.tsrx +6 -2
- package/src/chart/RechartsWrapper.tsrx +57 -21
- package/src/chart/Sankey.tsrx +89 -91
- package/src/chart/ScatterChart.tsrx +5 -1
- package/src/chart/SunburstChart.tsrx +21 -14
- package/src/chart/types.ts +0 -1
- package/src/component/ActivePoints.tsrx +30 -5
- package/src/component/Cell.ts +19 -1
- package/src/component/Cursor.tsrx +11 -10
- package/src/component/DefaultLegendContent.tsrx +15 -10
- package/src/component/DefaultTooltipContent.tsrx +11 -9
- package/src/component/Dots.tsrx +37 -6
- package/src/component/Label.tsrx +99 -19
- package/src/component/LabelList.tsrx +54 -5
- package/src/component/Legend.tsrx +9 -5
- package/src/component/ResponsiveContainer.tsrx +13 -10
- package/src/component/Text.tsrx +95 -32
- package/src/component/Tooltip.tsrx +11 -10
- package/src/component/TooltipBoundingBox.tsrx +4 -5
- package/src/component/{responsiveContainerUtils.js → responsiveContainerUtils.ts} +59 -36
- package/src/container/ClipPathProvider.tsrx +6 -2
- package/src/container/Layer.tsrx +8 -1
- package/src/container/RootSurface.tsrx +15 -4
- package/src/container/Surface.tsrx +15 -1
- package/src/context/CellsContext.ts +6 -5
- package/src/context/ErrorBarContext.tsrx +23 -4
- package/src/context/RegisterGraphicalItemId.tsrx +10 -2
- package/src/context/accessibilityContext.ts +5 -0
- package/src/context/brushUpdateContext.ts +11 -0
- package/src/context/chartDataContext.ts +5 -4
- package/src/context/chartLayoutContext.ts +22 -8
- package/src/context/legendPayloadContext.tsrx +1 -1
- package/src/context/tooltipContext.ts +83 -0
- package/src/{hooks.js → hooks.ts} +88 -66
- package/src/index.ts +37 -37
- package/src/internal.ts +4 -20
- package/src/legacy-props.ts +129 -0
- package/src/polar/Pie.tsrx +91 -69
- package/src/polar/PolarAngleAxis.tsrx +47 -47
- package/src/polar/PolarGrid.tsrx +7 -6
- package/src/polar/PolarRadiusAxis.tsrx +29 -21
- package/src/polar/Radar.tsrx +26 -19
- package/src/polar/RadialBar.tsrx +59 -42
- package/src/polar/{defaultPolarAngleAxisProps.js → defaultPolarAngleAxisProps.ts} +6 -6
- package/src/polar/{defaultPolarRadiusAxisProps.js → defaultPolarRadiusAxisProps.ts} +5 -4
- package/src/shape/Cross.tsrx +14 -2
- package/src/shape/Curve.tsrx +111 -23
- package/src/shape/Dot.tsrx +12 -1
- package/src/shape/Polygon.tsrx +28 -6
- package/src/shape/Rectangle.tsrx +30 -3
- package/src/shape/Sector.tsrx +48 -6
- package/src/shape/Symbols.tsrx +24 -6
- package/src/shape/Trapezoid.tsrx +33 -3
- package/src/state/RechartsStoreProvider.tsrx +11 -2
- package/src/state/ReportChartProps.ts +2 -2
- package/src/state/ReportMainChartProps.ts +2 -1
- package/src/state/SetGraphicalItem.ts +6 -4
- package/src/state/SetLegendPayload.ts +7 -4
- package/src/state/SetTooltipEntrySettings.ts +5 -2
- package/src/state/brushSlice.ts +40 -0
- package/src/state/cartesianAxisSlice.ts +291 -0
- package/src/state/chartDataSlice.ts +87 -0
- package/src/state/errorBarSlice.ts +78 -0
- package/src/state/eventSettingsSlice.ts +30 -0
- package/src/state/{externalEventsMiddleware.js → externalEventsMiddleware.ts} +55 -34
- package/src/state/graphicalItemsSlice.ts +180 -0
- package/src/state/{keyboardEventsMiddleware.js → keyboardEventsMiddleware.ts} +72 -57
- package/src/state/layoutSlice.ts +50 -0
- package/src/state/legendSlice.ts +109 -0
- package/src/state/{mouseEventsMiddleware.js → mouseEventsMiddleware.ts} +45 -35
- package/src/state/optionsSlice.ts +65 -0
- package/src/state/polarAxisSlice.ts +42 -0
- package/src/state/polarOptionsSlice.ts +43 -0
- package/src/state/reduxDevtoolsJsonStringifyReplacer.ts +13 -0
- package/src/state/referenceElementsSlice.ts +100 -0
- package/src/state/renderedTicksSlice.ts +60 -0
- package/src/state/rootPropsSlice.ts +72 -0
- package/src/state/selectors/areaSelectors.ts +1 -2
- package/src/state/selectors/{arrayEqualityCheck.js → arrayEqualityCheck.ts} +4 -5
- package/src/state/selectors/axisSelectors.ts +2502 -0
- package/src/state/selectors/barSelectors.ts +373 -0
- package/src/state/selectors/barStackSelectors.ts +99 -0
- package/src/state/selectors/brushSelectors.ts +28 -0
- package/src/state/selectors/combiners/combineActiveLabel.ts +16 -0
- package/src/state/selectors/combiners/{combineActiveTooltipIndex.js → combineActiveTooltipIndex.ts} +45 -23
- package/src/state/selectors/combiners/combineAllBarPositions.ts +130 -0
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.ts +16 -0
- package/src/state/selectors/combiners/combineBarPosition.ts +23 -0
- package/src/state/selectors/combiners/combineBarSizeList.ts +79 -0
- package/src/state/selectors/combiners/{combineCheckedDomain.js → combineCheckedDomain.ts} +9 -6
- package/src/state/selectors/combiners/combineConfiguredScale.ts +100 -0
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.ts +46 -0
- package/src/state/selectors/combiners/{combineDisplayedStackedData.js → combineDisplayedStackedData.ts} +23 -19
- package/src/state/selectors/combiners/combineInverseScaleFunction.ts +16 -0
- package/src/state/selectors/combiners/{combineRealScaleType.js → combineRealScaleType.ts} +16 -8
- package/src/state/selectors/combiners/combineStackedData.ts +27 -0
- package/src/state/selectors/combiners/combineTooltipInteractionState.ts +86 -0
- package/src/state/selectors/combiners/combineTooltipPayload.ts +201 -0
- package/src/state/selectors/combiners/{combineTooltipPayloadConfigurations.js → combineTooltipPayloadConfigurations.ts} +17 -18
- package/src/state/selectors/containerSelectors.ts +12 -0
- package/src/state/selectors/{dataSelectors.js → dataSelectors.ts} +43 -41
- package/src/state/selectors/funnelSelectors.ts +5 -5
- package/src/state/selectors/graphicalItemSelectors.ts +22 -0
- package/src/state/selectors/legendSelectors.ts +25 -0
- package/src/state/selectors/lineSelectors.ts +159 -0
- package/src/state/selectors/numberDomainEqualityCheck.ts +15 -0
- package/src/state/selectors/pickAxisId.ts +6 -0
- package/src/state/selectors/pickAxisType.ts +4 -0
- package/src/state/selectors/pieSelectors.ts +14 -13
- package/src/state/selectors/polarAxisSelectors.ts +223 -0
- package/src/state/selectors/polarSelectors.ts +1 -1
- package/src/state/selectors/radarSelectors.ts +1 -1
- package/src/state/selectors/radialBarSelectors.ts +17 -16
- package/src/state/selectors/rootPropsSelectors.ts +26 -0
- package/src/state/selectors/scatterSelectors.ts +11 -10
- package/src/state/selectors/{selectActivePropsFromChartPointer.js → selectActivePropsFromChartPointer.ts} +11 -4
- package/src/state/selectors/selectAllAxes.ts +20 -0
- package/src/state/selectors/selectChartOffset.ts +17 -0
- package/src/state/selectors/selectChartOffsetInternal.ts +147 -0
- package/src/state/selectors/{selectPlotArea.js → selectPlotArea.ts} +4 -3
- package/src/state/selectors/selectTooltipAxisId.ts +6 -0
- package/src/state/selectors/{selectTooltipAxisType.js → selectTooltipAxisType.ts} +10 -4
- package/src/state/selectors/selectTooltipEventType.ts +39 -0
- package/src/state/selectors/selectTooltipPayloadSearcher.ts +6 -0
- package/src/state/selectors/selectTooltipSettings.ts +6 -0
- package/src/state/selectors/selectTooltipState.ts +5 -0
- package/src/state/selectors/selectors.ts +315 -0
- package/src/state/selectors/tooltipSelectors.ts +611 -0
- package/src/state/selectors/touchSelectors.ts +52 -0
- package/src/state/{store.js → store.ts} +46 -36
- package/src/state/tooltipSlice.ts +507 -0
- package/src/state/{touchEventsMiddleware.js → touchEventsMiddleware.ts} +54 -42
- package/src/state/types/AreaSettings.ts +15 -0
- package/src/state/types/BarSettings.ts +15 -0
- package/src/state/types/LineSettings.ts +10 -0
- package/src/state/types/PieSettings.ts +32 -0
- package/src/state/types/RadarSettings.ts +6 -0
- package/src/state/types/RadialBarSettings.ts +10 -0
- package/src/state/types/ScatterSettings.ts +13 -0
- package/src/state/types/StackedGraphicalItem.ts +34 -0
- package/src/state/zIndexSlice.ts +137 -0
- package/src/synchronisation/syncSelectors.ts +7 -0
- package/src/synchronisation/types.ts +42 -0
- package/src/synchronisation/useChartSynchronisation.tsrx +26 -11
- package/src/types.ts +55 -0
- package/src/util/ActiveShapeUtils.tsrx +34 -10
- package/src/util/BarUtils.tsrx +43 -3
- package/src/util/{CartesianUtils.js → CartesianUtils.ts} +22 -39
- package/src/util/ChartUtils.ts +759 -0
- package/src/util/{Constants.js → Constants.ts} +6 -6
- package/src/util/DOMUtils.ts +135 -0
- package/src/util/{DataUtils.js → DataUtils.ts} +120 -47
- package/src/util/Events.ts +22 -0
- package/src/util/FunnelUtils.tsrx +3 -3
- package/src/util/Global.ts +13 -0
- package/src/util/IfOverflow.ts +16 -0
- package/src/util/LRUCache.ts +42 -0
- package/src/util/{LogUtils.js → LogUtils.ts} +7 -12
- package/src/util/OctaneTypes.ts +51 -0
- package/src/util/PolarUtils.ts +132 -0
- package/src/util/RadialBarUtils.tsrx +3 -3
- package/src/util/ReduceCSSCalc.ts +186 -0
- package/src/util/ScatterUtils.tsrx +9 -7
- package/src/util/{TickUtils.js → TickUtils.ts} +30 -13
- package/src/util/{YAxisUtils.js → YAxisUtils.ts} +27 -17
- package/src/util/axisPropsAreEqual.ts +49 -0
- package/src/util/createEventProxy.ts +20 -0
- package/src/util/{excludeEventProps.js → excludeEventProps.ts} +8 -6
- package/src/util/getActiveCoordinate.ts +210 -0
- package/src/util/{getAxisTypeBasedOnLayout.js → getAxisTypeBasedOnLayout.ts} +7 -3
- package/src/util/getClassNameFromUnknown.ts +7 -0
- package/src/util/{getEveryNth.js → getEveryNth.ts} +5 -6
- package/src/util/getRadiusAndStrokeWidthFromDot.ts +31 -0
- package/src/util/{getRelativeCoordinate.js → getRelativeCoordinate.ts} +26 -9
- package/src/util/getSliced.ts +14 -0
- package/src/util/{isDomainSpecifiedByUser.js → isDomainSpecifiedByUser.ts} +46 -100
- package/src/util/isWellBehavedNumber.ts +8 -0
- package/src/util/payload/getUniqPayload.ts +1 -1
- package/src/util/{propsAreEqual.js → propsAreEqual.ts} +10 -8
- package/src/util/{resolveDefaultProps.js → resolveDefaultProps.ts} +35 -57
- package/src/util/round.ts +33 -0
- package/src/util/scale/CustomScaleDefinition.ts +82 -0
- package/src/util/scale/RechartsScale.ts +131 -0
- package/src/util/scale/{createCategoricalInverse.js → createCategoricalInverse.ts} +24 -29
- package/src/util/scale/{getNiceTickValues.js → getNiceTickValues.ts} +125 -146
- package/src/util/scale/index.ts +2 -0
- package/src/util/scale/util/{arithmetic.js → arithmetic.ts} +12 -8
- package/src/util/stacks/getStackSeriesIdentifier.ts +21 -0
- package/src/util/stacks/stackTypes.ts +58 -0
- package/src/util/{svgPropertiesNoEvents.js → svgPropertiesNoEvents.ts} +52 -27
- package/src/util/tooltip/translate.ts +2 -1
- package/src/util/typedDataKey.ts +49 -0
- package/src/util/types.ts +1265 -7
- package/src/util/{useUniqueId.js → useUniqueId.ts} +9 -5
- package/src/zIndex/{DefaultZIndexes.js → DefaultZIndexes.ts} +13 -4
- package/src/zIndex/ZIndexLayer.tsrx +13 -4
- package/src/zIndex/ZIndexPortal.tsrx +14 -4
- package/src/zIndex/{getZIndexFromUnknown.js → getZIndexFromUnknown.ts} +3 -3
- package/src/zIndex/{zIndexSelectors.js → zIndexSelectors.ts} +17 -11
- package/src/animation/easing.js +0 -193
- package/src/animation/timeoutController.js +0 -49
- package/src/animation/util.js +0 -11
- package/src/cartesian/Area.tsrx.d.ts +0 -340
- package/src/cartesian/Bar.tsrx.d.ts +0 -4
- package/src/cartesian/BarStack.tsrx.d.ts +0 -6
- package/src/cartesian/CartesianAxis.tsrx.d.ts +0 -3
- package/src/cartesian/CartesianGrid.tsrx.d.ts +0 -219
- package/src/cartesian/ErrorBar.tsrx.d.ts +0 -131
- package/src/cartesian/Funnel.tsrx.d.ts +0 -274
- package/src/cartesian/Line.tsrx.d.ts +0 -4
- package/src/cartesian/LineDrawShape.tsrx.d.ts +0 -2
- package/src/cartesian/ReferenceLine.tsrx.d.ts +0 -178
- package/src/cartesian/Scatter.tsrx.d.ts +0 -351
- package/src/cartesian/XAxis.tsrx.d.ts +0 -3
- package/src/cartesian/YAxis.tsrx.d.ts +0 -3
- package/src/cartesian/ZAxis.tsrx.d.ts +0 -102
- package/src/cartesian/getCartesianPosition.js +0 -277
- package/src/cartesian/getEquidistantTicks.js +0 -133
- package/src/cartesian/getTicks.js +0 -280
- package/src/chart/AreaChart.tsrx.d.ts +0 -12
- package/src/chart/BarChart.tsrx.d.ts +0 -2
- package/src/chart/CartesianChart.tsrx.d.ts +0 -10
- package/src/chart/ComposedChart.tsrx.d.ts +0 -12
- package/src/chart/FunnelChart.tsrx.d.ts +0 -12
- package/src/chart/LineChart.tsrx.d.ts +0 -2
- package/src/chart/PieChart.tsrx.d.ts +0 -31
- package/src/chart/RadarChart.tsrx.d.ts +0 -31
- package/src/chart/RadialBarChart.tsrx.d.ts +0 -31
- package/src/chart/Sankey.tsrx.d.ts +0 -253
- package/src/chart/ScatterChart.tsrx.d.ts +0 -12
- package/src/chart/SunburstChart.tsrx.d.ts +0 -146
- package/src/component/DefaultLegendContent.tsrx.d.ts +0 -125
- package/src/component/DefaultTooltipContent.tsrx.d.ts +0 -87
- package/src/component/Label.tsrx.d.ts +0 -12
- package/src/component/LabelList.tsrx.d.ts +0 -8
- package/src/component/Legend.tsrx.d.ts +0 -88
- package/src/component/ResponsiveContainer.tsrx.d.ts +0 -81
- package/src/component/Text.tsrx.d.ts +0 -9
- package/src/component/Tooltip.tsrx.d.ts +0 -246
- package/src/container/Layer.tsrx.d.ts +0 -6
- package/src/container/Surface.tsrx.d.ts +0 -12
- package/src/context/accessibilityContext.js +0 -10
- package/src/context/tooltipContext.js +0 -55
- package/src/index.d.ts +0 -281
- package/src/polar/Pie.tsrx.d.ts +0 -436
- package/src/polar/PolarAngleAxis.tsrx.d.ts +0 -215
- package/src/polar/PolarGrid.tsrx.d.ts +0 -117
- package/src/polar/PolarRadiusAxis.tsrx.d.ts +0 -209
- package/src/polar/Radar.tsrx.d.ts +0 -215
- package/src/polar/RadialBar.tsrx.d.ts +0 -340
- package/src/shape/Cross.tsrx.d.ts +0 -12
- package/src/shape/Curve.tsrx.d.ts +0 -42
- package/src/shape/Dot.tsrx.d.ts +0 -9
- package/src/shape/Polygon.tsrx.d.ts +0 -13
- package/src/shape/Rectangle.tsrx.d.ts +0 -31
- package/src/shape/Sector.tsrx.d.ts +0 -29
- package/src/shape/Symbols.tsrx.d.ts +0 -15
- package/src/shape/Trapezoid.tsrx.d.ts +0 -29
- package/src/state/brushSlice.js +0 -36
- package/src/state/cartesianAxisSlice.js +0 -256
- package/src/state/chartDataSlice.js +0 -67
- package/src/state/errorBarSlice.js +0 -53
- package/src/state/eventSettingsSlice.js +0 -25
- package/src/state/graphicalItemsSlice.js +0 -91
- package/src/state/layoutSlice.js +0 -57
- package/src/state/legendSlice.js +0 -83
- package/src/state/optionsSlice.js +0 -45
- package/src/state/polarAxisSlice.js +0 -33
- package/src/state/polarOptionsSlice.js +0 -26
- package/src/state/reduxDevtoolsJsonStringifyReplacer.js +0 -14
- package/src/state/referenceElementsSlice.js +0 -51
- package/src/state/renderedTicksSlice.js +0 -41
- package/src/state/rootPropsSlice.js +0 -48
- package/src/state/selectors/axisSelectors.js +0 -2113
- package/src/state/selectors/barSelectors.js +0 -263
- package/src/state/selectors/barStackSelectors.js +0 -65
- package/src/state/selectors/brushSelectors.js +0 -21
- package/src/state/selectors/combiners/combineActiveLabel.js +0 -18
- package/src/state/selectors/combiners/combineAllBarPositions.js +0 -169
- package/src/state/selectors/combiners/combineAxisRangeWithReverse.js +0 -11
- package/src/state/selectors/combiners/combineBarPosition.js +0 -17
- package/src/state/selectors/combiners/combineBarSizeList.js +0 -115
- package/src/state/selectors/combiners/combineConfiguredScale.js +0 -46
- package/src/state/selectors/combiners/combineCoordinateForDefaultIndex.js +0 -48
- package/src/state/selectors/combiners/combineInverseScaleFunction.js +0 -12
- package/src/state/selectors/combiners/combineStackedData.js +0 -22
- package/src/state/selectors/combiners/combineTooltipInteractionState.js +0 -121
- package/src/state/selectors/combiners/combineTooltipPayload.js +0 -248
- package/src/state/selectors/containerSelectors.js +0 -6
- package/src/state/selectors/graphicalItemSelectors.js +0 -25
- package/src/state/selectors/legendSelectors.js +0 -18
- package/src/state/selectors/lineSelectors.js +0 -106
- package/src/state/selectors/numberDomainEqualityCheck.js +0 -11
- package/src/state/selectors/pickAxisId.js +0 -3
- package/src/state/selectors/pickAxisType.js +0 -3
- package/src/state/selectors/polarAxisSelectors.js +0 -237
- package/src/state/selectors/rootPropsSelectors.js +0 -13
- package/src/state/selectors/selectAllAxes.js +0 -15
- package/src/state/selectors/selectChartOffset.js +0 -12
- package/src/state/selectors/selectChartOffsetInternal.js +0 -174
- package/src/state/selectors/selectTooltipAxisId.js +0 -3
- package/src/state/selectors/selectTooltipEventType.js +0 -27
- package/src/state/selectors/selectTooltipPayloadSearcher.js +0 -3
- package/src/state/selectors/selectTooltipSettings.js +0 -3
- package/src/state/selectors/selectTooltipState.js +0 -3
- package/src/state/selectors/selectors.js +0 -222
- package/src/state/selectors/tooltipSelectors.js +0 -471
- package/src/state/selectors/touchSelectors.js +0 -31
- package/src/state/tooltipSlice.js +0 -237
- package/src/state/types/StackedGraphicalItem.js +0 -18
- package/src/state/zIndexSlice.js +0 -167
- package/src/synchronisation/syncSelectors.js +0 -5
- package/src/util/ChartUtils.js +0 -630
- package/src/util/DOMUtils.js +0 -180
- package/src/util/Events.js +0 -7
- package/src/util/Global.js +0 -13
- package/src/util/LRUCache.js +0 -58
- package/src/util/PolarUtils.js +0 -190
- package/src/util/ReduceCSSCalc.js +0 -260
- package/src/util/axisPropsAreEqual.js +0 -63
- package/src/util/createEventProxy.js +0 -18
- package/src/util/getActiveCoordinate.js +0 -253
- package/src/util/getClassNameFromUnknown.js +0 -8
- package/src/util/getRadiusAndStrokeWidthFromDot.js +0 -28
- package/src/util/getSliced.js +0 -11
- package/src/util/isWellBehavedNumber.js +0 -8
- package/src/util/round.js +0 -39
- package/src/util/scale/RechartsScale.js +0 -68
- package/src/util/scale/index.js +0 -3
- package/src/util/stacks/getStackSeriesIdentifier.js +0 -10
- package/src/zIndex/ZIndexLayer.tsrx.d.ts +0 -2
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import {
|
|
3
|
+
TooltipEntrySettings,
|
|
4
|
+
TooltipIndex,
|
|
5
|
+
TooltipPayload,
|
|
6
|
+
TooltipPayloadConfiguration,
|
|
7
|
+
TooltipPayloadEntry,
|
|
8
|
+
TooltipPayloadSearcher,
|
|
9
|
+
} from '../../tooltipSlice';
|
|
10
|
+
import { ChartData, ChartDataState } from '../../chartDataSlice';
|
|
11
|
+
import { DataKey, TooltipEventType } from '../../../util/types';
|
|
12
|
+
import { findEntryInArray } from '../../../util/DataUtils';
|
|
13
|
+
import { getTooltipEntry, getValueByDataKey } from '../../../util/ChartUtils';
|
|
14
|
+
import { getSliced } from '../../../util/getSliced';
|
|
15
|
+
import { ActiveLabel } from '../../../synchronisation/types';
|
|
16
|
+
|
|
17
|
+
type TooltipPayloadItemLike = {
|
|
18
|
+
name: TooltipEntrySettings['name'];
|
|
19
|
+
unit: TooltipEntrySettings['unit'];
|
|
20
|
+
dataKey: DataKey<any> | undefined;
|
|
21
|
+
payload: unknown;
|
|
22
|
+
color: string | undefined;
|
|
23
|
+
fill: string | undefined;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
function parseName(value: unknown): TooltipEntrySettings['name'] {
|
|
27
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function parseUnit(value: unknown): TooltipEntrySettings['unit'] {
|
|
34
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function parseDataKey(value: unknown): DataKey<any> | undefined {
|
|
41
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
if (typeof value === 'function') {
|
|
45
|
+
return (obj) => value(obj);
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function parseColor(value: unknown): string | undefined {
|
|
51
|
+
if (typeof value === 'string') {
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function parseTooltipPayloadItem(item: unknown): TooltipPayloadItemLike | undefined {
|
|
58
|
+
if (item == null || typeof item !== 'object') {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const name = 'name' in item ? parseName(item.name) : undefined;
|
|
63
|
+
const unit = 'unit' in item ? parseUnit(item.unit) : undefined;
|
|
64
|
+
const dataKey = 'dataKey' in item ? parseDataKey(item.dataKey) : undefined;
|
|
65
|
+
const payload = 'payload' in item ? item.payload : undefined;
|
|
66
|
+
const color = 'color' in item ? parseColor(item.color) : undefined;
|
|
67
|
+
const fill = 'fill' in item ? parseColor(item.fill) : undefined;
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
name,
|
|
71
|
+
unit,
|
|
72
|
+
dataKey,
|
|
73
|
+
payload,
|
|
74
|
+
color,
|
|
75
|
+
fill,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function selectFinalData(
|
|
80
|
+
dataDefinedOnItem: unknown,
|
|
81
|
+
dataDefinedOnChart: ChartData | undefined,
|
|
82
|
+
): unknown {
|
|
83
|
+
/*
|
|
84
|
+
* If a payload has data specified directly from the graphical item, prefer that.
|
|
85
|
+
* Otherwise, fill in data from the chart level, using the same index.
|
|
86
|
+
*/
|
|
87
|
+
if (dataDefinedOnItem != null) {
|
|
88
|
+
return dataDefinedOnItem;
|
|
89
|
+
}
|
|
90
|
+
return dataDefinedOnChart;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export const combineTooltipPayload = (
|
|
94
|
+
tooltipPayloadConfigurations: ReadonlyArray<TooltipPayloadConfiguration>,
|
|
95
|
+
activeIndex: TooltipIndex,
|
|
96
|
+
chartDataState: ChartDataState,
|
|
97
|
+
tooltipAxisDataKey: DataKey<any> | undefined,
|
|
98
|
+
activeLabel: ActiveLabel,
|
|
99
|
+
tooltipPayloadSearcher: TooltipPayloadSearcher | undefined,
|
|
100
|
+
tooltipEventType: TooltipEventType | undefined,
|
|
101
|
+
): TooltipPayload | undefined => {
|
|
102
|
+
if (activeIndex == null || tooltipPayloadSearcher == null) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
const { chartData, computedData, dataStartIndex, dataEndIndex } = chartDataState;
|
|
106
|
+
|
|
107
|
+
const init: Array<TooltipPayloadEntry> = [];
|
|
108
|
+
|
|
109
|
+
return tooltipPayloadConfigurations.reduce(
|
|
110
|
+
(agg, { dataDefinedOnItem, settings }): Array<TooltipPayloadEntry> => {
|
|
111
|
+
const finalData = selectFinalData(dataDefinedOnItem, chartData);
|
|
112
|
+
|
|
113
|
+
const sliced = Array.isArray(finalData)
|
|
114
|
+
? getSliced(finalData, dataStartIndex, dataEndIndex)
|
|
115
|
+
: finalData;
|
|
116
|
+
|
|
117
|
+
const finalDataKey: DataKey<any> | undefined = settings?.dataKey ?? tooltipAxisDataKey;
|
|
118
|
+
// BaseAxisProps does not support nameKey but it could!
|
|
119
|
+
const finalNameKey: DataKey<any> | undefined = settings?.nameKey; // ?? tooltipAxis?.nameKey;
|
|
120
|
+
let tooltipPayload: unknown;
|
|
121
|
+
if (
|
|
122
|
+
tooltipAxisDataKey &&
|
|
123
|
+
Array.isArray(sliced) &&
|
|
124
|
+
/*
|
|
125
|
+
* findEntryInArray won't work for Scatter because Scatter provides an array of arrays
|
|
126
|
+
* as tooltip payloads and findEntryInArray is not prepared to handle that.
|
|
127
|
+
* Sad but also ScatterChart only allows 'item' tooltipEventType
|
|
128
|
+
* and also this is only a problem if there are multiple Scatters and each has its own data array
|
|
129
|
+
* so let's fix that some other time.
|
|
130
|
+
*/
|
|
131
|
+
!Array.isArray(sliced[0]) &&
|
|
132
|
+
/*
|
|
133
|
+
* If the tooltipEventType is 'axis', we should search for the dataKey in the sliced data
|
|
134
|
+
* because thanks to allowDuplicatedCategory=false, the order of elements in the array
|
|
135
|
+
* no longer matches the order of elements in the original data
|
|
136
|
+
* and so we need to search by the active dataKey + label rather than by index.
|
|
137
|
+
*
|
|
138
|
+
* The same happens if multiple graphical items are present in the chart
|
|
139
|
+
* and each of them has its own data array. Those arrays get concatenated
|
|
140
|
+
* and again the tooltip index no longer matches the original data.
|
|
141
|
+
*
|
|
142
|
+
* On the other hand the tooltipEventType 'item' should always search by index
|
|
143
|
+
* because we get the index from interacting over the individual elements
|
|
144
|
+
* which is always accurate, irrespective of the allowDuplicatedCategory setting.
|
|
145
|
+
*/
|
|
146
|
+
tooltipEventType === 'axis'
|
|
147
|
+
) {
|
|
148
|
+
tooltipPayload = findEntryInArray(sliced, tooltipAxisDataKey, activeLabel);
|
|
149
|
+
} else {
|
|
150
|
+
/*
|
|
151
|
+
* This is a problem because it assumes that the index is pointing to the displayed data
|
|
152
|
+
* which it isn't because the index is pointing to the tooltip ticks array.
|
|
153
|
+
* The above approach (with findEntryInArray) is the correct one, but it only works
|
|
154
|
+
* if the axis dataKey is defined explicitly, and if the data is an array of objects.
|
|
155
|
+
*/
|
|
156
|
+
tooltipPayload = tooltipPayloadSearcher(sliced, activeIndex, computedData, finalNameKey);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (Array.isArray(tooltipPayload)) {
|
|
160
|
+
tooltipPayload.forEach((item) => {
|
|
161
|
+
const parsedItem = parseTooltipPayloadItem(item);
|
|
162
|
+
const itemName = parsedItem?.name;
|
|
163
|
+
const itemDataKey = parsedItem?.dataKey;
|
|
164
|
+
const itemPayload = parsedItem?.payload;
|
|
165
|
+
const newSettings: TooltipEntrySettings = {
|
|
166
|
+
...settings,
|
|
167
|
+
name: itemName,
|
|
168
|
+
unit: parsedItem?.unit,
|
|
169
|
+
// Preserve item-level color/fill from graphical items.
|
|
170
|
+
color: parsedItem?.color ?? settings?.color,
|
|
171
|
+
fill: parsedItem?.fill ?? settings?.fill,
|
|
172
|
+
};
|
|
173
|
+
agg.push(
|
|
174
|
+
getTooltipEntry({
|
|
175
|
+
tooltipEntrySettings: newSettings,
|
|
176
|
+
dataKey: itemDataKey,
|
|
177
|
+
payload: itemPayload,
|
|
178
|
+
value: getValueByDataKey(itemPayload, itemDataKey),
|
|
179
|
+
name: itemName == null ? undefined : String(itemName),
|
|
180
|
+
}),
|
|
181
|
+
);
|
|
182
|
+
});
|
|
183
|
+
} else {
|
|
184
|
+
// I am not quite sure why these two branches (Array vs Array of Arrays) have to behave differently - I imagine we should unify these. 3.x breaking change?
|
|
185
|
+
agg.push(
|
|
186
|
+
getTooltipEntry({
|
|
187
|
+
tooltipEntrySettings: settings,
|
|
188
|
+
dataKey: finalDataKey,
|
|
189
|
+
payload: tooltipPayload,
|
|
190
|
+
// getValueByDataKey does not validate the output type
|
|
191
|
+
value: getValueByDataKey(tooltipPayload, finalDataKey),
|
|
192
|
+
// getValueByDataKey does not validate the output type
|
|
193
|
+
name: getValueByDataKey(tooltipPayload, finalNameKey) ?? settings?.name,
|
|
194
|
+
}),
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
return agg;
|
|
198
|
+
},
|
|
199
|
+
init,
|
|
200
|
+
);
|
|
201
|
+
};
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
//
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { TooltipIndex, TooltipPayloadConfiguration, TooltipState } from '../../tooltipSlice';
|
|
3
|
+
import { TooltipEventType } from '../../../util/types';
|
|
4
|
+
import { TooltipTrigger } from '../../../chart/types';
|
|
5
|
+
import { GraphicalItemId } from '../../graphicalItemsSlice';
|
|
6
|
+
|
|
7
|
+
export const combineTooltipPayloadConfigurations = (
|
|
8
|
+
tooltipState: TooltipState,
|
|
9
|
+
tooltipEventType: TooltipEventType | undefined,
|
|
10
|
+
trigger: TooltipTrigger,
|
|
11
|
+
defaultIndex: TooltipIndex | undefined,
|
|
12
|
+
): ReadonlyArray<TooltipPayloadConfiguration> => {
|
|
9
13
|
// if tooltip reacts to axis interaction, then we display all items at the same time.
|
|
10
14
|
if (tooltipEventType === 'axis') {
|
|
11
15
|
return tooltipState.tooltipItemPayloads;
|
|
@@ -18,7 +22,7 @@ export var combineTooltipPayloadConfigurations = (
|
|
|
18
22
|
// No point filtering if the payload is empty
|
|
19
23
|
return [];
|
|
20
24
|
}
|
|
21
|
-
|
|
25
|
+
let filterByGraphicalItemId: GraphicalItemId | undefined;
|
|
22
26
|
if (trigger === 'hover') {
|
|
23
27
|
filterByGraphicalItemId = tooltipState.itemInteraction.hover.graphicalItemId;
|
|
24
28
|
} else {
|
|
@@ -42,18 +46,13 @@ export var combineTooltipPayloadConfigurations = (
|
|
|
42
46
|
* In that case let's display the first item in the tooltip; after all, this is `item` interaction case,
|
|
43
47
|
* so we should display only one item at a time instead of all.
|
|
44
48
|
*/
|
|
45
|
-
|
|
49
|
+
const firstItemPayload = tooltipState.tooltipItemPayloads[0];
|
|
46
50
|
if (firstItemPayload != null) {
|
|
47
51
|
return [firstItemPayload];
|
|
48
52
|
}
|
|
49
53
|
return [];
|
|
50
54
|
}
|
|
51
|
-
return tooltipState.tooltipItemPayloads.filter(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
((_tpc$settings = tpc.settings) === null || _tpc$settings === void 0
|
|
55
|
-
? void 0
|
|
56
|
-
: _tpc$settings.graphicalItemId) === filterByGraphicalItemId
|
|
57
|
-
);
|
|
58
|
-
});
|
|
55
|
+
return tooltipState.tooltipItemPayloads.filter(
|
|
56
|
+
(tpc) => tpc.settings?.graphicalItemId === filterByGraphicalItemId,
|
|
57
|
+
);
|
|
59
58
|
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { RechartsRootState } from '../store';
|
|
3
|
+
import { Margin } from '../../util/types';
|
|
4
|
+
|
|
5
|
+
export const selectChartWidth = (state: RechartsRootState): number => state.layout.width;
|
|
6
|
+
|
|
7
|
+
export const selectChartHeight = (state: RechartsRootState): number => state.layout.height;
|
|
8
|
+
|
|
9
|
+
export const selectContainerScale: (state: RechartsRootState) => number = (state) =>
|
|
10
|
+
state.layout.scale;
|
|
11
|
+
|
|
12
|
+
export const selectMargin = (state: RechartsRootState): Margin => state.layout.margin;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Do not edit — update by re-vendoring when the recharts devDependency moves.
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
3
2
|
import { createSelector } from 'reselect';
|
|
3
|
+
import { RechartsRootState } from '../store';
|
|
4
|
+
import { ChartData, ChartDataState } from '../chartDataSlice';
|
|
5
|
+
|
|
4
6
|
/**
|
|
5
7
|
* This selector always returns the data with the indexes set by a Brush.
|
|
6
8
|
* Trouble is, that might or might not be what you want.
|
|
@@ -13,37 +15,42 @@ import { createSelector } from 'reselect';
|
|
|
13
15
|
* @param state RechartsRootState
|
|
14
16
|
* @returns data defined on the chart root element, such as BarChart or ScatterChart
|
|
15
17
|
*/
|
|
16
|
-
export
|
|
18
|
+
export const selectChartDataWithIndexes = (state: RechartsRootState): ChartDataState =>
|
|
19
|
+
state.chartData;
|
|
17
20
|
|
|
18
21
|
/**
|
|
19
22
|
* This selector will always return the full range of data, ignoring the indexes set by a Brush.
|
|
20
23
|
* Useful for when you want to render the full range of data, even if a Brush is active.
|
|
21
24
|
* For example: in the Brush panorama, in Legend, in Tooltip.
|
|
22
25
|
*/
|
|
23
|
-
export
|
|
24
|
-
[selectChartDataWithIndexes],
|
|
25
|
-
|
|
26
|
-
var dataEndIndex = dataState.chartData != null ? dataState.chartData.length - 1 : 0;
|
|
26
|
+
export const selectChartDataAndAlwaysIgnoreIndexes: (state: RechartsRootState) => ChartDataState =
|
|
27
|
+
createSelector([selectChartDataWithIndexes], (dataState: ChartDataState) => {
|
|
28
|
+
const dataEndIndex = dataState.chartData != null ? dataState.chartData.length - 1 : 0;
|
|
27
29
|
return {
|
|
28
30
|
chartData: dataState.chartData,
|
|
29
31
|
computedData: dataState.computedData,
|
|
30
32
|
dataEndIndex,
|
|
31
33
|
dataStartIndex: 0,
|
|
32
34
|
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export
|
|
36
|
-
state,
|
|
37
|
-
_unused1,
|
|
38
|
-
_unused2,
|
|
39
|
-
isPanorama,
|
|
40
|
-
) => {
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
export const selectChartDataWithIndexesIfNotInPanoramaPosition4 = (
|
|
38
|
+
state: RechartsRootState,
|
|
39
|
+
_unused1: unknown,
|
|
40
|
+
_unused2: unknown,
|
|
41
|
+
isPanorama: boolean,
|
|
42
|
+
): ChartDataState => {
|
|
41
43
|
if (isPanorama) {
|
|
42
44
|
return selectChartDataAndAlwaysIgnoreIndexes(state);
|
|
43
45
|
}
|
|
44
46
|
return selectChartDataWithIndexes(state);
|
|
45
47
|
};
|
|
46
|
-
|
|
48
|
+
|
|
49
|
+
export const selectChartDataWithIndexesIfNotInPanoramaPosition3 = (
|
|
50
|
+
state: RechartsRootState,
|
|
51
|
+
_unused1: unknown,
|
|
52
|
+
isPanorama: boolean,
|
|
53
|
+
): ChartDataState => {
|
|
47
54
|
if (isPanorama) {
|
|
48
55
|
return selectChartDataAndAlwaysIgnoreIndexes(state);
|
|
49
56
|
}
|
|
@@ -58,40 +65,35 @@ export var selectChartDataWithIndexesIfNotInPanoramaPosition3 = (state, _unused1
|
|
|
58
65
|
* Used when a selector needs chart-level data but must avoid extra recomputes when the
|
|
59
66
|
* data content has not actually changed.
|
|
60
67
|
*/
|
|
61
|
-
export
|
|
68
|
+
export const selectChartDataSliceIfNotInPanorama: (
|
|
69
|
+
state: RechartsRootState,
|
|
70
|
+
_unused1: unknown,
|
|
71
|
+
_unused2: unknown,
|
|
72
|
+
isPanorama: boolean,
|
|
73
|
+
) => ChartData = createSelector(
|
|
62
74
|
[selectChartDataWithIndexesIfNotInPanoramaPosition4],
|
|
63
|
-
(
|
|
64
|
-
|
|
65
|
-
dataStartIndex = _ref.dataStartIndex,
|
|
66
|
-
dataEndIndex = _ref.dataEndIndex;
|
|
67
|
-
return chartData != null ? chartData.slice(dataStartIndex, dataEndIndex + 1) : [];
|
|
68
|
-
},
|
|
75
|
+
({ chartData, dataStartIndex, dataEndIndex }: ChartDataState): ChartData =>
|
|
76
|
+
chartData != null ? chartData.slice(dataStartIndex, dataEndIndex + 1) : [],
|
|
69
77
|
);
|
|
70
78
|
|
|
71
79
|
/**
|
|
72
80
|
* Returns the chart-level data slice (ignoring Brush indexes), memoized by content.
|
|
73
81
|
* Used in tooltip and polar selectors that always need the full data range.
|
|
74
82
|
*/
|
|
75
|
-
export
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return chartData != null ? chartData.slice(dataStartIndex, dataEndIndex + 1) : [];
|
|
82
|
-
},
|
|
83
|
-
);
|
|
83
|
+
export const selectChartDataSliceIgnoringIndexes: (state: RechartsRootState) => ChartData =
|
|
84
|
+
createSelector(
|
|
85
|
+
[selectChartDataAndAlwaysIgnoreIndexes],
|
|
86
|
+
({ chartData, dataStartIndex, dataEndIndex }: ChartDataState): ChartData =>
|
|
87
|
+
chartData != null ? chartData.slice(dataStartIndex, dataEndIndex + 1) : [],
|
|
88
|
+
);
|
|
84
89
|
|
|
85
90
|
/**
|
|
86
91
|
* Returns the chart-level data slice (with Brush indexes applied), memoized by content.
|
|
87
92
|
* Used in tooltip selectors.
|
|
88
93
|
*/
|
|
89
|
-
export
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return chartData != null ? chartData.slice(dataStartIndex, dataEndIndex + 1) : [];
|
|
96
|
-
},
|
|
97
|
-
);
|
|
94
|
+
export const selectChartDataSliceWithIndexes: (state: RechartsRootState) => ChartData =
|
|
95
|
+
createSelector(
|
|
96
|
+
[selectChartDataWithIndexes],
|
|
97
|
+
({ chartData, dataStartIndex, dataEndIndex }: ChartDataState): ChartData =>
|
|
98
|
+
chartData != null ? chartData.slice(dataStartIndex, dataEndIndex + 1) : [],
|
|
99
|
+
);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import type { RegisteredCell } from '../../context/CellsContext';
|
|
1
2
|
import { createSelector } from 'reselect';
|
|
2
|
-
|
|
3
|
-
import { computeFunnelTrapezoids, FunnelTrapezoidItem } from '../../cartesian/Funnel';
|
|
3
|
+
|
|
4
|
+
import { computeFunnelTrapezoids, FunnelTrapezoidItem } from '../../cartesian/Funnel.tsrx';
|
|
4
5
|
import { ChartData } from '../chartDataSlice';
|
|
5
6
|
import { RechartsRootState } from '../store';
|
|
6
7
|
import { selectChartOffsetInternal } from './selectChartOffsetInternal';
|
|
7
8
|
import { selectChartDataAndAlwaysIgnoreIndexes } from './dataSelectors';
|
|
8
9
|
import { ChartOffsetInternal, DataKey, TooltipType } from '../../util/types';
|
|
9
|
-
import { CellProps } from '../..';
|
|
10
10
|
import { GraphicalItemId } from '../graphicalItemsSlice';
|
|
11
11
|
|
|
12
12
|
export type ResolvedFunnelSettings = {
|
|
@@ -17,7 +17,7 @@ export type ResolvedFunnelSettings = {
|
|
|
17
17
|
lastShapeType?: 'triangle' | 'rectangle';
|
|
18
18
|
reversed?: boolean;
|
|
19
19
|
customWidth?: string | number;
|
|
20
|
-
cells: ReadonlyArray<
|
|
20
|
+
cells: ReadonlyArray<RegisteredCell> | undefined;
|
|
21
21
|
presentationProps: Record<string, any> | null;
|
|
22
22
|
id: GraphicalItemId;
|
|
23
23
|
};
|
|
@@ -63,7 +63,7 @@ export const selectFunnelTrapezoids: (
|
|
|
63
63
|
...(cells && cells[index] && cells[index].props),
|
|
64
64
|
}));
|
|
65
65
|
} else if (cells && cells.length) {
|
|
66
|
-
displayedData = cells.map((cell:
|
|
66
|
+
displayedData = cells.map((cell: RegisteredCell) => ({
|
|
67
67
|
...presentationProps,
|
|
68
68
|
...cell.props,
|
|
69
69
|
}));
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { RechartsRootState } from '../store';
|
|
3
|
+
import { GraphicalItemId } from '../graphicalItemsSlice';
|
|
4
|
+
import { AxisId, defaultAxisId } from '../cartesianAxisSlice';
|
|
5
|
+
|
|
6
|
+
export function selectXAxisIdFromGraphicalItemId(
|
|
7
|
+
state: RechartsRootState,
|
|
8
|
+
id: GraphicalItemId,
|
|
9
|
+
): AxisId {
|
|
10
|
+
return (
|
|
11
|
+
state.graphicalItems.cartesianItems.find((item) => item.id === id)?.xAxisId ?? defaultAxisId
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function selectYAxisIdFromGraphicalItemId(
|
|
16
|
+
state: RechartsRootState,
|
|
17
|
+
id: GraphicalItemId,
|
|
18
|
+
): AxisId {
|
|
19
|
+
return (
|
|
20
|
+
state.graphicalItems.cartesianItems.find((item) => item.id === id)?.yAxisId ?? defaultAxisId
|
|
21
|
+
);
|
|
22
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { createSelector } from 'reselect';
|
|
3
|
+
import { sortBy } from 'es-toolkit/compat';
|
|
4
|
+
import { RechartsRootState } from '../store';
|
|
5
|
+
import { LegendSettings } from '../legendSlice';
|
|
6
|
+
import { LegendPayload } from '../../component/DefaultLegendContent.tsrx';
|
|
7
|
+
import { Size } from '../../util/types';
|
|
8
|
+
|
|
9
|
+
export const selectLegendSettings = (state: RechartsRootState): LegendSettings =>
|
|
10
|
+
state.legend.settings;
|
|
11
|
+
|
|
12
|
+
export const selectLegendSize = (state: RechartsRootState): Size => state.legend.size;
|
|
13
|
+
|
|
14
|
+
const selectAllLegendPayload2DArray = (
|
|
15
|
+
state: RechartsRootState,
|
|
16
|
+
): ReadonlyArray<ReadonlyArray<LegendPayload>> => state.legend.payload;
|
|
17
|
+
|
|
18
|
+
export const selectLegendPayload: (state: RechartsRootState) => ReadonlyArray<LegendPayload> =
|
|
19
|
+
createSelector(
|
|
20
|
+
[selectAllLegendPayload2DArray, selectLegendSettings],
|
|
21
|
+
(payloads, { itemSorter }) => {
|
|
22
|
+
const flat = payloads.flat(1);
|
|
23
|
+
return itemSorter ? sortBy(flat, itemSorter) : flat;
|
|
24
|
+
},
|
|
25
|
+
);
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { createSelector } from 'reselect';
|
|
3
|
+
import { computeLinePoints, LinePointItem } from '../../cartesian/Line.tsrx';
|
|
4
|
+
import { RechartsRootState } from '../store';
|
|
5
|
+
import { AxisId } from '../cartesianAxisSlice';
|
|
6
|
+
import { selectChartDataWithIndexesIfNotInPanoramaPosition4 } from './dataSelectors';
|
|
7
|
+
import { selectChartLayout } from '../../context/chartLayoutContext';
|
|
8
|
+
import {
|
|
9
|
+
selectAxisWithScale,
|
|
10
|
+
selectTicksOfGraphicalItem,
|
|
11
|
+
selectUnfilteredCartesianItems,
|
|
12
|
+
} from './axisSelectors';
|
|
13
|
+
import { getBandSizeOfAxis, isCategoricalAxis } from '../../util/ChartUtils';
|
|
14
|
+
import { ChartData } from '../chartDataSlice';
|
|
15
|
+
import { CartesianGraphicalItemSettings, GraphicalItemId } from '../graphicalItemsSlice';
|
|
16
|
+
import { LineSettings } from '../types/LineSettings';
|
|
17
|
+
|
|
18
|
+
const selectXAxisWithScale = (
|
|
19
|
+
state: RechartsRootState,
|
|
20
|
+
xAxisId: AxisId,
|
|
21
|
+
_yAxisId: AxisId,
|
|
22
|
+
isPanorama: boolean,
|
|
23
|
+
) => selectAxisWithScale(state, 'xAxis', xAxisId, isPanorama);
|
|
24
|
+
|
|
25
|
+
const selectXAxisTicks = (
|
|
26
|
+
state: RechartsRootState,
|
|
27
|
+
xAxisId: AxisId,
|
|
28
|
+
_yAxisId: AxisId,
|
|
29
|
+
isPanorama: boolean,
|
|
30
|
+
) => selectTicksOfGraphicalItem(state, 'xAxis', xAxisId, isPanorama);
|
|
31
|
+
|
|
32
|
+
const selectYAxisWithScale = (
|
|
33
|
+
state: RechartsRootState,
|
|
34
|
+
_xAxisId: AxisId,
|
|
35
|
+
yAxisId: AxisId,
|
|
36
|
+
isPanorama: boolean,
|
|
37
|
+
) => selectAxisWithScale(state, 'yAxis', yAxisId, isPanorama);
|
|
38
|
+
|
|
39
|
+
const selectYAxisTicks = (
|
|
40
|
+
state: RechartsRootState,
|
|
41
|
+
_xAxisId: AxisId,
|
|
42
|
+
yAxisId: AxisId,
|
|
43
|
+
isPanorama: boolean,
|
|
44
|
+
) => selectTicksOfGraphicalItem(state, 'yAxis', yAxisId, isPanorama);
|
|
45
|
+
|
|
46
|
+
const selectBandSize = createSelector(
|
|
47
|
+
[
|
|
48
|
+
selectChartLayout,
|
|
49
|
+
selectXAxisWithScale,
|
|
50
|
+
selectYAxisWithScale,
|
|
51
|
+
selectXAxisTicks,
|
|
52
|
+
selectYAxisTicks,
|
|
53
|
+
],
|
|
54
|
+
(layout, xAxis, yAxis, xAxisTicks, yAxisTicks) => {
|
|
55
|
+
if (isCategoricalAxis(layout, 'xAxis')) {
|
|
56
|
+
return getBandSizeOfAxis(xAxis, xAxisTicks, false);
|
|
57
|
+
}
|
|
58
|
+
return getBandSizeOfAxis(yAxis, yAxisTicks, false);
|
|
59
|
+
},
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const pickLineId = (
|
|
63
|
+
_state: RechartsRootState,
|
|
64
|
+
_xAxisId: AxisId,
|
|
65
|
+
_yAxisId: AxisId,
|
|
66
|
+
_isPanorama: boolean,
|
|
67
|
+
id: GraphicalItemId,
|
|
68
|
+
) => id;
|
|
69
|
+
|
|
70
|
+
function isLineSettings(item: CartesianGraphicalItemSettings): item is LineSettings {
|
|
71
|
+
return item.type === 'line';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/*
|
|
75
|
+
* There is a race condition problem because we read some data from props and some from the state.
|
|
76
|
+
* The state is updated through a dispatch and is one render behind,
|
|
77
|
+
* and so we have this weird one tick render where the displayedData in one selector have the old dataKey
|
|
78
|
+
* but the new dataKey in another selector.
|
|
79
|
+
*
|
|
80
|
+
* So here instead of reading the dataKey from the props, we always read it from the state.
|
|
81
|
+
*/
|
|
82
|
+
const selectSynchronisedLineSettings: (
|
|
83
|
+
state: RechartsRootState,
|
|
84
|
+
xAxisId: AxisId,
|
|
85
|
+
yAxisId: AxisId,
|
|
86
|
+
isPanorama: boolean,
|
|
87
|
+
id: GraphicalItemId,
|
|
88
|
+
) => LineSettings | undefined = createSelector(
|
|
89
|
+
[selectUnfilteredCartesianItems, pickLineId],
|
|
90
|
+
(graphicalItems, id: GraphicalItemId): LineSettings | undefined =>
|
|
91
|
+
graphicalItems.filter(isLineSettings).find((x) => x.id === id),
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
export const selectLinePoints: (
|
|
95
|
+
state: RechartsRootState,
|
|
96
|
+
xAxisId: AxisId,
|
|
97
|
+
yAxisId: AxisId,
|
|
98
|
+
isPanorama: boolean,
|
|
99
|
+
id: GraphicalItemId,
|
|
100
|
+
) => ReadonlyArray<LinePointItem> | undefined = createSelector(
|
|
101
|
+
[
|
|
102
|
+
selectChartLayout,
|
|
103
|
+
selectXAxisWithScale,
|
|
104
|
+
selectYAxisWithScale,
|
|
105
|
+
selectXAxisTicks,
|
|
106
|
+
selectYAxisTicks,
|
|
107
|
+
selectSynchronisedLineSettings,
|
|
108
|
+
selectBandSize,
|
|
109
|
+
selectChartDataWithIndexesIfNotInPanoramaPosition4,
|
|
110
|
+
],
|
|
111
|
+
(
|
|
112
|
+
layout,
|
|
113
|
+
xAxis,
|
|
114
|
+
yAxis,
|
|
115
|
+
xAxisTicks,
|
|
116
|
+
yAxisTicks,
|
|
117
|
+
lineSettings,
|
|
118
|
+
bandSize,
|
|
119
|
+
{ chartData, dataStartIndex, dataEndIndex },
|
|
120
|
+
): ReadonlyArray<LinePointItem> | undefined => {
|
|
121
|
+
if (
|
|
122
|
+
lineSettings == null ||
|
|
123
|
+
xAxis == null ||
|
|
124
|
+
yAxis == null ||
|
|
125
|
+
xAxisTicks == null ||
|
|
126
|
+
yAxisTicks == null ||
|
|
127
|
+
xAxisTicks.length === 0 ||
|
|
128
|
+
yAxisTicks.length === 0 ||
|
|
129
|
+
bandSize == null ||
|
|
130
|
+
(layout !== 'horizontal' && layout !== 'vertical')
|
|
131
|
+
) {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const { dataKey, data } = lineSettings;
|
|
136
|
+
let displayedData: ChartData | undefined;
|
|
137
|
+
|
|
138
|
+
if (data != null && data.length > 0) {
|
|
139
|
+
displayedData = data;
|
|
140
|
+
} else {
|
|
141
|
+
displayedData = chartData?.slice(dataStartIndex, dataEndIndex + 1);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (displayedData == null) {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return computeLinePoints({
|
|
149
|
+
layout,
|
|
150
|
+
xAxis,
|
|
151
|
+
yAxis,
|
|
152
|
+
xAxisTicks,
|
|
153
|
+
yAxisTicks,
|
|
154
|
+
dataKey,
|
|
155
|
+
bandSize,
|
|
156
|
+
displayedData,
|
|
157
|
+
});
|
|
158
|
+
},
|
|
159
|
+
);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { NumberDomain } from '../../util/types';
|
|
3
|
+
|
|
4
|
+
export const numberDomainEqualityCheck = (
|
|
5
|
+
a: NumberDomain | undefined,
|
|
6
|
+
b: NumberDomain | undefined,
|
|
7
|
+
): boolean => {
|
|
8
|
+
if (a === b) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
if (a == null || b == null) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
return a[0] === b[0] && a[1] === b[1];
|
|
15
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Adapted from recharts@3.9.2, commit b3451050c027a23957ffa50a2665c9119df21e47.
|
|
2
|
+
import { RechartsRootState } from '../store';
|
|
3
|
+
import { AxisId } from '../cartesianAxisSlice';
|
|
4
|
+
|
|
5
|
+
export const pickAxisId = (_state: RechartsRootState, _axisType: unknown, axisId: AxisId): AxisId =>
|
|
6
|
+
axisId;
|