@octanejs/recharts 0.1.16 → 0.1.18

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.
Files changed (88) hide show
  1. package/package.json +4 -4
  2. package/src/animation/CSSTransitionAnimate.tsrx +142 -0
  3. package/src/cartesian/Area.tsrx +1096 -0
  4. package/src/cartesian/Area.tsrx.d.ts +340 -0
  5. package/src/cartesian/AreaRevealShape.tsrx +202 -0
  6. package/src/cartesian/CartesianGrid.tsrx +643 -0
  7. package/src/cartesian/CartesianGrid.tsrx.d.ts +219 -0
  8. package/src/cartesian/ErrorBar.tsrx +322 -0
  9. package/src/cartesian/ErrorBar.tsrx.d.ts +131 -0
  10. package/src/cartesian/Funnel.tsrx +833 -0
  11. package/src/cartesian/Funnel.tsrx.d.ts +274 -0
  12. package/src/cartesian/ReferenceLine.tsrx +452 -0
  13. package/src/cartesian/ReferenceLine.tsrx.d.ts +178 -0
  14. package/src/cartesian/Scatter.tsrx +1076 -0
  15. package/src/cartesian/Scatter.tsrx.d.ts +351 -0
  16. package/src/cartesian/ZAxis.tsrx +148 -0
  17. package/src/cartesian/ZAxis.tsrx.d.ts +102 -0
  18. package/src/chart/AreaChart.tsrx +22 -0
  19. package/src/chart/AreaChart.tsrx.d.ts +12 -0
  20. package/src/chart/ComposedChart.tsrx +22 -0
  21. package/src/chart/ComposedChart.tsrx.d.ts +12 -0
  22. package/src/chart/FunnelChart.tsrx +22 -0
  23. package/src/chart/FunnelChart.tsrx.d.ts +12 -0
  24. package/src/chart/PieChart.tsrx +31 -0
  25. package/src/chart/PieChart.tsrx.d.ts +31 -0
  26. package/src/chart/PolarChart.tsrx +121 -0
  27. package/src/chart/RadarChart.tsrx +53 -0
  28. package/src/chart/RadarChart.tsrx.d.ts +31 -0
  29. package/src/chart/RadialBarChart.tsrx +31 -0
  30. package/src/chart/RadialBarChart.tsrx.d.ts +31 -0
  31. package/src/chart/Sankey.tsrx +1542 -0
  32. package/src/chart/Sankey.tsrx.d.ts +253 -0
  33. package/src/chart/ScatterChart.tsrx +22 -0
  34. package/src/chart/ScatterChart.tsrx.d.ts +12 -0
  35. package/src/chart/SunburstChart.tsrx +495 -0
  36. package/src/chart/SunburstChart.tsrx.d.ts +146 -0
  37. package/src/chart/types.ts +19 -0
  38. package/src/component/Cursor.tsrx +157 -0
  39. package/src/component/DefaultLegendContent.tsrx +288 -0
  40. package/src/component/DefaultLegendContent.tsrx.d.ts +125 -0
  41. package/src/component/DefaultTooltipContent.tsrx +215 -0
  42. package/src/component/DefaultTooltipContent.tsrx.d.ts +87 -0
  43. package/src/component/Legend.tsrx +302 -0
  44. package/src/component/Legend.tsrx.d.ts +88 -0
  45. package/src/component/ResponsiveContainer.ts +1 -22
  46. package/src/component/ResponsiveContainer.tsrx +171 -0
  47. package/src/component/ResponsiveContainer.tsrx.d.ts +81 -0
  48. package/src/component/Tooltip.tsrx +425 -0
  49. package/src/component/Tooltip.tsrx.d.ts +246 -0
  50. package/src/component/TooltipBoundingBox.tsrx +135 -0
  51. package/src/context/CellsContext.ts +12 -0
  52. package/src/context/legendPayloadContext.tsrx +11 -0
  53. package/src/context/useTooltipAxis.ts +20 -0
  54. package/src/index.d.ts +236 -0
  55. package/src/index.ts +67 -0
  56. package/src/polar/Pie.tsrx +1224 -0
  57. package/src/polar/Pie.tsrx.d.ts +436 -0
  58. package/src/polar/PolarAngleAxis.tsrx +554 -0
  59. package/src/polar/PolarAngleAxis.tsrx.d.ts +215 -0
  60. package/src/polar/PolarGrid.tsrx +317 -0
  61. package/src/polar/PolarGrid.tsrx.d.ts +117 -0
  62. package/src/polar/PolarRadiusAxis.tsrx +463 -0
  63. package/src/polar/PolarRadiusAxis.tsrx.d.ts +209 -0
  64. package/src/polar/Radar.tsrx +696 -0
  65. package/src/polar/Radar.tsrx.d.ts +215 -0
  66. package/src/polar/RadialBar.tsrx +887 -0
  67. package/src/polar/RadialBar.tsrx.d.ts +340 -0
  68. package/src/state/ReportPolarOptions.tsrx +11 -0
  69. package/src/state/selectors/areaSelectors.ts +257 -0
  70. package/src/state/selectors/funnelSelectors.ts +86 -0
  71. package/src/state/selectors/pieSelectors.ts +134 -0
  72. package/src/state/selectors/polarGridSelectors.ts +43 -0
  73. package/src/state/selectors/polarScaleSelectors.ts +159 -0
  74. package/src/state/selectors/polarSelectors.ts +198 -0
  75. package/src/state/selectors/radarSelectors.ts +228 -0
  76. package/src/state/selectors/radialBarSelectors.ts +511 -0
  77. package/src/state/selectors/scatterSelectors.ts +168 -0
  78. package/src/util/FunnelUtils.tsrx +19 -0
  79. package/src/util/RadialBarUtils.tsrx +29 -0
  80. package/src/util/ScatterUtils.tsrx +34 -0
  81. package/src/util/cursor/getCursorPoints.ts +45 -0
  82. package/src/util/cursor/getCursorRectangle.ts +28 -0
  83. package/src/util/cursor/getRadialCursorPoints.ts +31 -0
  84. package/src/util/payload/getUniqPayload.ts +28 -0
  85. package/src/util/scale/CartesianScaleHelper.ts +71 -0
  86. package/src/util/tooltip/translate.ts +168 -0
  87. package/src/util/types.ts +3 -0
  88. package/src/util/useElementOffset.ts +147 -0
@@ -0,0 +1,511 @@
1
+ import { createSelector } from 'reselect';
2
+ import { ReactElement } from 'octane';
3
+ import { Series } from 'victory-vendor/d3-shape';
4
+ import { computeRadialBarDataItems, RadialBarDataItem } from '../../polar/RadialBar';
5
+ import { selectChartDataAndAlwaysIgnoreIndexes, selectChartDataWithIndexes } from './dataSelectors';
6
+ import { RechartsRootState } from '../store';
7
+ import { ChartDataState } from '../chartDataSlice';
8
+ import { AxisId } from '../cartesianAxisSlice';
9
+ import { LayoutType, LegendType, PolarViewBoxRequired, TickItem } from '../../util/types';
10
+ import {
11
+ selectPolarAxisScale,
12
+ selectPolarAxisTicks,
13
+ selectPolarGraphicalItemAxisTicks,
14
+ } from './polarScaleSelectors';
15
+ import { BaseAxisWithScale, combineStackGroups, selectTooltipAxis } from './axisSelectors';
16
+ import { selectAngleAxis, selectPolarViewBox, selectRadiusAxis } from './polarAxisSelectors';
17
+ import { selectChartLayout } from '../../context/chartLayoutContext';
18
+ import {
19
+ BarPositionPosition,
20
+ getBandSizeOfAxis,
21
+ getBaseValueOfBar,
22
+ isCategoricalAxis,
23
+ } from '../../util/ChartUtils';
24
+ import { BarWithPosition, SizeList } from './barSelectors';
25
+ import {
26
+ selectBarCategoryGap,
27
+ selectBarGap,
28
+ selectReverseStackOrder,
29
+ selectRootBarSize,
30
+ selectRootMaxBarSize,
31
+ selectStackOffsetType,
32
+ } from './rootPropsSelectors';
33
+ import { PolarGraphicalItemSettings } from '../graphicalItemsSlice';
34
+ import {
35
+ PolarAxisType,
36
+ selectPolarItemsSettings,
37
+ selectUnfilteredPolarItems,
38
+ } from './polarSelectors';
39
+ import { AngleAxisSettings, RadiusAxisSettings } from '../polarAxisSlice';
40
+ import { LegendPayload } from '../../component/DefaultLegendContent';
41
+ import { isNullish } from '../../util/DataUtils';
42
+
43
+ import type {
44
+ AllStackGroups,
45
+ StackDataPoint,
46
+ StackSeries,
47
+ StackSeriesIdentifier,
48
+ } from '../../util/stacks/stackTypes';
49
+ import {
50
+ combineDisplayedStackedData,
51
+ DisplayedStackedData,
52
+ } from './combiners/combineDisplayedStackedData';
53
+ import type { RadialBarSettings } from '../types/RadialBarSettings';
54
+ import { DefinitelyStackedGraphicalItem, isStacked } from '../types/StackedGraphicalItem';
55
+ import { combineBarSizeList } from './combiners/combineBarSizeList';
56
+ import { combineAllBarPositions } from './combiners/combineAllBarPositions';
57
+ import { combineStackedData } from './combiners/combineStackedData';
58
+ import { RechartsScale } from '../../util/scale/RechartsScale';
59
+ import { combineBarPosition } from './combiners/combineBarPosition';
60
+
61
+ const selectRadiusAxisForRadialBar = (
62
+ state: RechartsRootState,
63
+ radiusAxisId: AxisId,
64
+ ): RadiusAxisSettings => selectRadiusAxis(state, radiusAxisId);
65
+
66
+ const selectRadiusAxisScaleForRadar = (
67
+ state: RechartsRootState,
68
+ radiusAxisId: AxisId,
69
+ ): RechartsScale | undefined => selectPolarAxisScale(state, 'radiusAxis', radiusAxisId);
70
+
71
+ export const selectRadiusAxisWithScale: (
72
+ state: RechartsRootState,
73
+ radiusAxisId: AxisId,
74
+ ) => BaseAxisWithScale | undefined = createSelector(
75
+ [selectRadiusAxisForRadialBar, selectRadiusAxisScaleForRadar],
76
+ (axis: RadiusAxisSettings, scale: RechartsScale | undefined): BaseAxisWithScale | undefined => {
77
+ if (axis == null || scale == null) {
78
+ return undefined;
79
+ }
80
+ return { ...axis, scale };
81
+ },
82
+ );
83
+
84
+ export const selectRadiusAxisTicks = (
85
+ state: RechartsRootState,
86
+ radiusAxisId: AxisId,
87
+ ): ReadonlyArray<TickItem> | undefined => {
88
+ return selectPolarGraphicalItemAxisTicks(state, 'radiusAxis', radiusAxisId, false);
89
+ };
90
+
91
+ const selectAngleAxisForRadialBar = (
92
+ state: RechartsRootState,
93
+ _radiusAxisId: AxisId,
94
+ angleAxisId: AxisId,
95
+ ): AngleAxisSettings => selectAngleAxis(state, angleAxisId);
96
+
97
+ const selectAngleAxisScaleForRadialBar = (
98
+ state: RechartsRootState,
99
+ _radiusAxisId: AxisId,
100
+ angleAxisId: AxisId,
101
+ ): RechartsScale | undefined => selectPolarAxisScale(state, 'angleAxis', angleAxisId);
102
+
103
+ export const selectAngleAxisWithScale: (
104
+ state: RechartsRootState,
105
+ _radiusAxisId: AxisId,
106
+ angleAxisId: AxisId,
107
+ ) => BaseAxisWithScale | undefined = createSelector(
108
+ [selectAngleAxisForRadialBar, selectAngleAxisScaleForRadialBar],
109
+ (axis: AngleAxisSettings, scale: RechartsScale | undefined): BaseAxisWithScale | undefined => {
110
+ if (axis == null || scale == null) {
111
+ return undefined;
112
+ }
113
+ return { ...axis, scale };
114
+ },
115
+ );
116
+
117
+ const selectAngleAxisTicks = (
118
+ state: RechartsRootState,
119
+ _radiusAxisId: AxisId,
120
+ angleAxisId: AxisId,
121
+ ): ReadonlyArray<TickItem> | undefined => {
122
+ // here we can hardcode isPanorama to false because radialBar does not support panorama mode
123
+ return selectPolarAxisTicks(state, 'angleAxis', angleAxisId, false);
124
+ };
125
+
126
+ const pickRadialBarSettings = (
127
+ _state: RechartsRootState,
128
+ _radiusAxisId: AxisId,
129
+ _angleAxisId: AxisId,
130
+ radialBarSettings: RadialBarSettings,
131
+ ): RadialBarSettings => radialBarSettings;
132
+
133
+ const selectSynchronisedRadialBarSettings: (
134
+ state: RechartsRootState,
135
+ _radiusAxisId: AxisId,
136
+ _angleAxisId: AxisId,
137
+ radialBarSettings: RadialBarSettings,
138
+ ) => RadialBarSettings | undefined = createSelector(
139
+ [selectUnfilteredPolarItems, pickRadialBarSettings],
140
+ (graphicalItems, radialBarSettingsFromProps) => {
141
+ if (
142
+ graphicalItems.some(
143
+ (pgis) =>
144
+ pgis.type === 'radialBar' &&
145
+ radialBarSettingsFromProps.dataKey === pgis.dataKey &&
146
+ radialBarSettingsFromProps.stackId === pgis.stackId,
147
+ )
148
+ ) {
149
+ return radialBarSettingsFromProps;
150
+ }
151
+ return undefined;
152
+ },
153
+ );
154
+
155
+ export const selectBandSizeOfPolarAxis: (
156
+ state: RechartsRootState,
157
+ radiusAxisId: AxisId,
158
+ angleAxisId: AxisId,
159
+ ) => number | undefined = createSelector(
160
+ [
161
+ selectChartLayout,
162
+ selectRadiusAxisWithScale,
163
+ selectRadiusAxisTicks,
164
+ selectAngleAxisWithScale,
165
+ selectAngleAxisTicks,
166
+ ],
167
+ (
168
+ layout: LayoutType,
169
+ radiusAxis: BaseAxisWithScale | undefined,
170
+ radiusAxisTicks: ReadonlyArray<TickItem> | undefined,
171
+ angleAxis: BaseAxisWithScale | undefined,
172
+ angleAxisTicks: ReadonlyArray<TickItem> | undefined,
173
+ ) => {
174
+ if (isCategoricalAxis(layout, 'radiusAxis')) {
175
+ return getBandSizeOfAxis(radiusAxis, radiusAxisTicks, false);
176
+ }
177
+ return getBandSizeOfAxis(angleAxis, angleAxisTicks, false);
178
+ },
179
+ );
180
+
181
+ export const selectBaseValue: (
182
+ state: RechartsRootState,
183
+ radiusAxisId: AxisId,
184
+ angleAxisId: AxisId,
185
+ ) => number | unknown = createSelector(
186
+ [selectAngleAxisWithScale, selectRadiusAxisWithScale, selectChartLayout],
187
+ (angleAxis, radiusAxis, layout) => {
188
+ const numericAxis = layout === 'radial' ? angleAxis : radiusAxis;
189
+ if (numericAxis == null || numericAxis.scale == null) {
190
+ return undefined;
191
+ }
192
+ return getBaseValueOfBar({ numericAxis });
193
+ },
194
+ );
195
+
196
+ const pickCells = (
197
+ _state: RechartsRootState,
198
+ _radiusAxisId: AxisId,
199
+ _angleAxisId: AxisId,
200
+ _radialBarSettings: RadialBarSettings,
201
+ cells: ReadonlyArray<ReactElement> | undefined,
202
+ ) => cells;
203
+
204
+ const pickAngleAxisId = (
205
+ _state: RechartsRootState,
206
+ _radiusAxisId: AxisId,
207
+ angleAxisId: AxisId,
208
+ _radialBarSettings: RadialBarSettings,
209
+ _cells: ReadonlyArray<ReactElement> | undefined,
210
+ ): AxisId => angleAxisId;
211
+
212
+ const pickRadiusAxisId = (
213
+ _state: RechartsRootState,
214
+ radiusAxisId: AxisId,
215
+ _angleAxisId: AxisId,
216
+ _radialBarSettings: RadialBarSettings,
217
+ _cells: ReadonlyArray<ReactElement> | undefined,
218
+ ): AxisId => radiusAxisId;
219
+
220
+ export const pickMaxBarSize = (
221
+ _state: RechartsRootState,
222
+ _radiusAxisId: AxisId,
223
+ _angleAxisId: AxisId,
224
+ radialBarSettings: RadialBarSettings,
225
+ _cells: ReadonlyArray<ReactElement> | undefined,
226
+ ): number | undefined => radialBarSettings.maxBarSize;
227
+
228
+ const isRadialBar = (item: PolarGraphicalItemSettings): item is RadialBarSettings =>
229
+ item.type === 'radialBar';
230
+
231
+ const selectAllVisibleRadialBars: (
232
+ state: RechartsRootState,
233
+ radiusAxisId: AxisId,
234
+ angleAxisId: AxisId,
235
+ radialBarSettings: RadialBarSettings,
236
+ cells: ReadonlyArray<ReactElement> | undefined,
237
+ ) => ReadonlyArray<RadialBarSettings> = createSelector(
238
+ [selectChartLayout, selectUnfilteredPolarItems, pickAngleAxisId, pickRadiusAxisId],
239
+ (
240
+ layout: LayoutType,
241
+ allItems: ReadonlyArray<PolarGraphicalItemSettings>,
242
+ angleAxisId: AxisId,
243
+ radiusAxisId: AxisId,
244
+ ): ReadonlyArray<RadialBarSettings> => {
245
+ return allItems
246
+ .filter((i) => {
247
+ if (layout === 'centric') {
248
+ return i.angleAxisId === angleAxisId;
249
+ }
250
+ return i.radiusAxisId === radiusAxisId;
251
+ })
252
+ .filter((i) => i.hide === false)
253
+ .filter(isRadialBar);
254
+ },
255
+ );
256
+
257
+ /**
258
+ * The generator never returned the totalSize which means that barSize in polar chart can not support percent values.
259
+ * We can add that if we want to I suppose.
260
+ * @returns undefined - but it should be a total size of numerical axis in polar chart
261
+ */
262
+ const selectPolarBarAxisSize = (): undefined => undefined;
263
+
264
+ export const selectPolarBarSizeList: (
265
+ state: RechartsRootState,
266
+ radiusAxisId: AxisId,
267
+ angleAxisId: AxisId,
268
+ radialBarSettings: RadialBarSettings,
269
+ cells: ReadonlyArray<ReactElement> | undefined,
270
+ ) => SizeList = createSelector(
271
+ [selectAllVisibleRadialBars, selectRootBarSize, selectPolarBarAxisSize],
272
+ combineBarSizeList,
273
+ );
274
+
275
+ export const selectPolarBarBandSize: (
276
+ state: RechartsRootState,
277
+ radiusAxisId: AxisId,
278
+ angleAxisId: AxisId,
279
+ radialBarSettings: RadialBarSettings,
280
+ cells: ReadonlyArray<ReactElement> | undefined,
281
+ ) => number = createSelector(
282
+ [
283
+ selectChartLayout,
284
+ selectRootMaxBarSize,
285
+ selectAngleAxisWithScale,
286
+ selectAngleAxisTicks,
287
+ selectRadiusAxisWithScale,
288
+ selectRadiusAxisTicks,
289
+ pickMaxBarSize,
290
+ ],
291
+ (
292
+ layout: LayoutType,
293
+ globalMaxBarSize: number | undefined,
294
+ angleAxis: BaseAxisWithScale | undefined,
295
+ angleAxisTicks: ReadonlyArray<TickItem> | undefined,
296
+ radiusAxis: BaseAxisWithScale | undefined,
297
+ radiusAxisTicks: ReadonlyArray<TickItem> | undefined,
298
+ childMaxBarSize: number | undefined,
299
+ ): number => {
300
+ const maxBarSize: number | undefined = isNullish(childMaxBarSize)
301
+ ? globalMaxBarSize
302
+ : childMaxBarSize;
303
+ if (layout === 'centric') {
304
+ return getBandSizeOfAxis(angleAxis, angleAxisTicks, true) ?? maxBarSize ?? 0;
305
+ }
306
+ return getBandSizeOfAxis(radiusAxis, radiusAxisTicks, true) ?? maxBarSize ?? 0;
307
+ },
308
+ );
309
+
310
+ export const selectAllPolarBarPositions: (
311
+ state: RechartsRootState,
312
+ radiusAxisId: AxisId,
313
+ angleAxisId: AxisId,
314
+ radialBarSettings: RadialBarSettings,
315
+ cells: ReadonlyArray<ReactElement> | undefined,
316
+ ) => ReadonlyArray<BarWithPosition> | undefined = createSelector(
317
+ [
318
+ selectPolarBarSizeList,
319
+ selectRootMaxBarSize,
320
+ selectBarGap,
321
+ selectBarCategoryGap,
322
+ selectPolarBarBandSize,
323
+ selectBandSizeOfPolarAxis,
324
+ pickMaxBarSize,
325
+ ],
326
+ combineAllBarPositions,
327
+ );
328
+
329
+ export const selectPolarBarPosition: (
330
+ state: RechartsRootState,
331
+ radiusAxisId: AxisId,
332
+ angleAxisId: AxisId,
333
+ radialBarSettings: RadialBarSettings,
334
+ cells: ReadonlyArray<ReactElement> | undefined,
335
+ ) => BarPositionPosition | undefined = createSelector(
336
+ [selectAllPolarBarPositions, selectSynchronisedRadialBarSettings],
337
+ combineBarPosition,
338
+ );
339
+
340
+ const selectStackedRadialBars: (
341
+ state: RechartsRootState,
342
+ axisType: PolarAxisType,
343
+ polarAxisId: AxisId,
344
+ ) => ReadonlyArray<DefinitelyStackedGraphicalItem> = createSelector(
345
+ [selectPolarItemsSettings],
346
+ (
347
+ allPolarItems: ReadonlyArray<PolarGraphicalItemSettings>,
348
+ ): ReadonlyArray<DefinitelyStackedGraphicalItem> =>
349
+ allPolarItems.filter(isRadialBar).filter(isStacked),
350
+ );
351
+
352
+ const selectPolarCombinedStackedData: (
353
+ state: RechartsRootState,
354
+ axisType: PolarAxisType,
355
+ polarAxisId: AxisId,
356
+ ) => DisplayedStackedData = createSelector(
357
+ [selectStackedRadialBars, selectChartDataAndAlwaysIgnoreIndexes, selectTooltipAxis],
358
+ combineDisplayedStackedData,
359
+ );
360
+
361
+ const selectStackGroups: (
362
+ state: RechartsRootState,
363
+ axisType: PolarAxisType,
364
+ polarAxisId: AxisId,
365
+ ) => AllStackGroups | undefined = createSelector(
366
+ [
367
+ selectPolarCombinedStackedData,
368
+ selectStackedRadialBars,
369
+ selectStackOffsetType,
370
+ selectReverseStackOrder,
371
+ ],
372
+ combineStackGroups,
373
+ );
374
+
375
+ const selectRadialBarStackGroups: (
376
+ state: RechartsRootState,
377
+ radiusAxisId: AxisId,
378
+ angleAxisId: AxisId,
379
+ radialBarSettings: RadialBarSettings,
380
+ cells: ReadonlyArray<ReactElement> | undefined,
381
+ ) => AllStackGroups | undefined = (state, radiusAxisId, angleAxisId) => {
382
+ const layout = selectChartLayout(state);
383
+ if (layout === 'centric') {
384
+ return selectStackGroups(state, 'radiusAxis', radiusAxisId);
385
+ }
386
+ return selectStackGroups(state, 'angleAxis', angleAxisId);
387
+ };
388
+
389
+ const selectPolarStackedData: (
390
+ state: RechartsRootState,
391
+ radiusAxisId: AxisId,
392
+ angleAxisId: AxisId,
393
+ radialBarSettings: RadialBarSettings,
394
+ cells: ReadonlyArray<ReactElement> | undefined,
395
+ ) => StackSeries | undefined = createSelector(
396
+ [selectRadialBarStackGroups, selectSynchronisedRadialBarSettings],
397
+ combineStackedData,
398
+ );
399
+
400
+ export const selectRadialBarSectors: (
401
+ state: RechartsRootState,
402
+ radiusAxisId: AxisId,
403
+ angleAxisId: AxisId,
404
+ radialBarSettings: RadialBarSettings,
405
+ cells: ReadonlyArray<ReactElement> | undefined,
406
+ ) => ReadonlyArray<RadialBarDataItem> = createSelector(
407
+ [
408
+ selectAngleAxisWithScale,
409
+ selectAngleAxisTicks,
410
+ selectRadiusAxisWithScale,
411
+ selectRadiusAxisTicks,
412
+ selectChartDataWithIndexes,
413
+ selectSynchronisedRadialBarSettings,
414
+ selectBandSizeOfPolarAxis,
415
+ selectChartLayout,
416
+ selectBaseValue,
417
+ selectPolarViewBox,
418
+ pickCells,
419
+ selectPolarBarPosition,
420
+ selectPolarStackedData,
421
+ ],
422
+ (
423
+ angleAxis: BaseAxisWithScale | undefined,
424
+ angleAxisTicks: ReadonlyArray<TickItem> | undefined,
425
+ radiusAxis: BaseAxisWithScale | undefined,
426
+ radiusAxisTicks: ReadonlyArray<TickItem> | undefined,
427
+ { chartData, dataStartIndex, dataEndIndex }: ChartDataState,
428
+ radialBarSettings: RadialBarSettings | undefined,
429
+ bandSize: number | undefined,
430
+ layout: LayoutType,
431
+ baseValue: number | unknown,
432
+ polarViewBox: PolarViewBoxRequired | undefined,
433
+ cells: ReadonlyArray<ReactElement> | undefined,
434
+ pos: BarPositionPosition | undefined,
435
+ stackedData: Series<StackDataPoint, StackSeriesIdentifier> | undefined,
436
+ ): ReadonlyArray<RadialBarDataItem> => {
437
+ if (
438
+ radialBarSettings == null ||
439
+ radiusAxis == null ||
440
+ angleAxis == null ||
441
+ chartData == null ||
442
+ bandSize == null ||
443
+ pos == null ||
444
+ (layout !== 'centric' && layout !== 'radial') ||
445
+ radiusAxisTicks == null ||
446
+ polarViewBox == null
447
+ ) {
448
+ return [];
449
+ }
450
+ const { dataKey, minPointSize } = radialBarSettings;
451
+ const { cx, cy, startAngle, endAngle } = polarViewBox;
452
+ const displayedData = chartData.slice(dataStartIndex, dataEndIndex + 1);
453
+ const numericAxis = layout === 'centric' ? radiusAxis : angleAxis;
454
+ const stackedDomain: ReadonlyArray<unknown> | null = stackedData
455
+ ? numericAxis.scale.domain()
456
+ : null;
457
+ return computeRadialBarDataItems({
458
+ angleAxis,
459
+ angleAxisTicks,
460
+ bandSize,
461
+ baseValue,
462
+ cells,
463
+ cx,
464
+ cy,
465
+ dataKey,
466
+ dataStartIndex,
467
+ displayedData,
468
+ endAngle,
469
+ layout,
470
+ minPointSize,
471
+ pos,
472
+ radiusAxis,
473
+ radiusAxisTicks,
474
+ stackedData,
475
+ stackedDomain,
476
+ startAngle,
477
+ });
478
+ },
479
+ );
480
+
481
+ export const selectRadialBarLegendPayload: (
482
+ state: RechartsRootState,
483
+ legendType: LegendType | undefined,
484
+ ) => ReadonlyArray<LegendPayload> = createSelector(
485
+ [selectChartDataAndAlwaysIgnoreIndexes, (_s: RechartsRootState, l: LegendType | undefined) => l],
486
+ (
487
+ { chartData, dataStartIndex, dataEndIndex }: ChartDataState,
488
+ legendType: LegendType | undefined,
489
+ ): ReadonlyArray<LegendPayload> => {
490
+ if (chartData == null) {
491
+ return [];
492
+ }
493
+ const displayedData = chartData.slice(dataStartIndex, dataEndIndex + 1);
494
+
495
+ if (displayedData.length === 0) {
496
+ return [];
497
+ }
498
+
499
+ return displayedData.map((entry): LegendPayload => {
500
+ return {
501
+ type: legendType,
502
+ // @ts-expect-error we need a better typing for our data inputs
503
+ value: entry.name,
504
+ // @ts-expect-error we need a better typing for our data inputs
505
+ color: entry.fill,
506
+ // @ts-expect-error Legend payload.payload says it wants objects but our data can be unknown
507
+ payload: entry,
508
+ };
509
+ });
510
+ },
511
+ );
@@ -0,0 +1,168 @@
1
+ import { createSelector } from 'reselect';
2
+ import { ReactElement } from 'octane';
3
+ import { computeScatterPoints, ScatterPointItem } from '../../cartesian/Scatter';
4
+ import { RechartsRootState } from '../store';
5
+ import { AxisId } from '../cartesianAxisSlice';
6
+ import { selectChartDataWithIndexesIfNotInPanoramaPosition4 } from './dataSelectors';
7
+ import { ChartData, ChartDataState } from '../chartDataSlice';
8
+ import {
9
+ BaseAxisWithScale,
10
+ selectAxisWithScale,
11
+ selectTicksOfGraphicalItem,
12
+ selectUnfilteredCartesianItems,
13
+ selectZAxisWithScale,
14
+ ZAxisWithScale,
15
+ } from './axisSelectors';
16
+ import type { ScatterSettings } from '../types/ScatterSettings';
17
+ import { GraphicalItemId } from '../graphicalItemsSlice';
18
+ import { TickItem } from '../../util/types';
19
+
20
+ const selectXAxisWithScale = (
21
+ state: RechartsRootState,
22
+ xAxisId: AxisId,
23
+ _yAxisId: AxisId,
24
+ _zAxisId: AxisId,
25
+ _id: GraphicalItemId,
26
+ _cells: ReadonlyArray<ReactElement> | undefined,
27
+ isPanorama: boolean,
28
+ ) => selectAxisWithScale(state, 'xAxis', xAxisId, isPanorama);
29
+
30
+ const selectXAxisTicks = (
31
+ state: RechartsRootState,
32
+ xAxisId: AxisId,
33
+ _yAxisId: AxisId,
34
+ _zAxisId: AxisId,
35
+ _id: GraphicalItemId,
36
+ _cells: ReadonlyArray<ReactElement> | undefined,
37
+ isPanorama: boolean,
38
+ ) => selectTicksOfGraphicalItem(state, 'xAxis', xAxisId, isPanorama);
39
+
40
+ const selectYAxisWithScale = (
41
+ state: RechartsRootState,
42
+ _xAxisId: AxisId,
43
+ yAxisId: AxisId,
44
+ _zAxisId: AxisId,
45
+ _id: GraphicalItemId,
46
+ _cells: ReadonlyArray<ReactElement> | undefined,
47
+ isPanorama: boolean,
48
+ ) => selectAxisWithScale(state, 'yAxis', yAxisId, isPanorama);
49
+
50
+ const selectYAxisTicks = (
51
+ state: RechartsRootState,
52
+ _xAxisId: AxisId,
53
+ yAxisId: AxisId,
54
+ _zAxisId: AxisId,
55
+ _id: GraphicalItemId,
56
+ _cells: ReadonlyArray<ReactElement> | undefined,
57
+ isPanorama: boolean,
58
+ ) => selectTicksOfGraphicalItem(state, 'yAxis', yAxisId, isPanorama);
59
+
60
+ const selectZAxis = (
61
+ state: RechartsRootState,
62
+ _xAxisId: AxisId,
63
+ _yAxisId: AxisId,
64
+ zAxisId: AxisId,
65
+ ): ZAxisWithScale | undefined => selectZAxisWithScale(state, 'zAxis', zAxisId, false);
66
+
67
+ const pickScatterId = (
68
+ _state: RechartsRootState,
69
+ _xAxisId: AxisId,
70
+ _yAxisId: AxisId,
71
+ _zAxisId: AxisId,
72
+ id: GraphicalItemId,
73
+ ) => id;
74
+
75
+ const pickCells = (
76
+ _state: RechartsRootState,
77
+ _xAxisId: AxisId,
78
+ _yAxisId: AxisId,
79
+ _zAxisId: AxisId,
80
+ _id: GraphicalItemId,
81
+ cells: ReadonlyArray<ReactElement> | undefined,
82
+ ): ReadonlyArray<ReactElement> | undefined => cells;
83
+
84
+ const scatterChartDataSelector = (
85
+ state: RechartsRootState,
86
+ _xAxisId: AxisId,
87
+ _yAxisId: AxisId,
88
+ _zAxisId: AxisId,
89
+ _id: GraphicalItemId,
90
+ _cells: ReadonlyArray<ReactElement> | undefined,
91
+ isPanorama: boolean,
92
+ ): ChartDataState =>
93
+ selectChartDataWithIndexesIfNotInPanoramaPosition4(state, undefined, undefined, isPanorama);
94
+
95
+ const selectSynchronisedScatterSettings: (
96
+ state: RechartsRootState,
97
+ xAxisId: AxisId,
98
+ yAxisId: AxisId,
99
+ _zAxisId: AxisId,
100
+ id: GraphicalItemId,
101
+ ) => ScatterSettings | undefined = createSelector(
102
+ [selectUnfilteredCartesianItems, pickScatterId],
103
+ (graphicalItems, id) => {
104
+ return graphicalItems.filter((item) => item.type === 'scatter').find((item) => item.id === id);
105
+ },
106
+ );
107
+
108
+ export const selectScatterPoints: (
109
+ state: RechartsRootState,
110
+ xAxisId: AxisId,
111
+ yAxisId: AxisId,
112
+ zAxisId: AxisId,
113
+ id: GraphicalItemId,
114
+ cells: ReadonlyArray<ReactElement> | undefined,
115
+ isPanorama: boolean,
116
+ ) => ReadonlyArray<ScatterPointItem> | undefined = createSelector(
117
+ [
118
+ scatterChartDataSelector,
119
+ selectXAxisWithScale,
120
+ selectXAxisTicks,
121
+ selectYAxisWithScale,
122
+ selectYAxisTicks,
123
+ selectZAxis,
124
+ selectSynchronisedScatterSettings,
125
+ pickCells,
126
+ ],
127
+ (
128
+ { chartData, dataStartIndex, dataEndIndex }: ChartDataState,
129
+ xAxis: BaseAxisWithScale | undefined,
130
+ xAxisTicks: ReadonlyArray<TickItem> | undefined,
131
+ yAxis: BaseAxisWithScale | undefined,
132
+ yAxisTicks: ReadonlyArray<TickItem> | undefined,
133
+ zAxis: ZAxisWithScale | undefined,
134
+ scatterSettings: ScatterSettings | undefined,
135
+ cells,
136
+ ): ReadonlyArray<ScatterPointItem> | undefined => {
137
+ if (scatterSettings == null) {
138
+ return undefined;
139
+ }
140
+ let displayedData: ChartData | undefined;
141
+ if (scatterSettings?.data != null && scatterSettings.data.length > 0) {
142
+ displayedData = scatterSettings.data;
143
+ } else {
144
+ displayedData = chartData?.slice(dataStartIndex, dataEndIndex + 1);
145
+ }
146
+ if (
147
+ displayedData == null ||
148
+ xAxis == null ||
149
+ yAxis == null ||
150
+ xAxisTicks == null ||
151
+ yAxisTicks == null ||
152
+ xAxisTicks?.length === 0 ||
153
+ yAxisTicks?.length === 0
154
+ ) {
155
+ return undefined;
156
+ }
157
+ return computeScatterPoints({
158
+ displayedData,
159
+ xAxis,
160
+ yAxis,
161
+ zAxis,
162
+ scatterSettings,
163
+ xAxisTicks,
164
+ yAxisTicks,
165
+ cells,
166
+ });
167
+ },
168
+ );
@@ -0,0 +1,19 @@
1
+ import * as React from 'octane';
2
+ import { Props as FunnelProps, FunnelTrapezoidItem } from '../cartesian/Funnel';
3
+ import { Trapezoid } from '../shape/Trapezoid';
4
+ import { ShapeAnimationProps } from './types';
5
+ import { Shape } from './ActiveShapeUtils';
6
+
7
+ export const defaultFunnelShape = Trapezoid;
8
+
9
+ export type FunnelTrapezoidProps =
10
+ {
11
+ option: Exclude<FunnelProps['shape'], undefined> | FunnelProps['activeShape'];
12
+ isActive: boolean;
13
+ } & ShapeAnimationProps & FunnelTrapezoidItem;
14
+
15
+ type FunnelTrapezoidShapeProps = Omit<FunnelTrapezoidProps, 'option'>;
16
+
17
+ export function FunnelTrapezoid({ option, ...shapeProps }: FunnelTrapezoidProps) {
18
+ return <Shape option={option} DefaultShape={defaultFunnelShape} shapeProps={shapeProps} />;
19
+ }