@cdc/chart 4.25.5-1 → 4.25.6

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 (40) hide show
  1. package/LICENSE +201 -0
  2. package/dist/cdcchart.js +32848 -27824
  3. package/index.html +130 -130
  4. package/package.json +2 -2
  5. package/src/CdcChartComponent.tsx +66 -26
  6. package/src/_stories/Chart.stories.tsx +99 -93
  7. package/src/_stories/ChartPrefixSuffix.stories.tsx +29 -32
  8. package/src/_stories/_mock/pie_calculated_area.json +417 -0
  9. package/src/components/BarChart/components/BarChart.Horizontal.tsx +4 -13
  10. package/src/components/BarChart/components/BarChart.StackedVertical.tsx +3 -14
  11. package/src/components/BarChart/components/BarChart.Vertical.tsx +2 -8
  12. package/src/components/Brush/BrushChart.tsx +73 -0
  13. package/src/components/Brush/BrushController..tsx +39 -0
  14. package/src/components/DeviationBar.jsx +0 -1
  15. package/src/components/EditorPanel/EditorPanel.tsx +232 -147
  16. package/src/components/EditorPanel/components/Panels/Panel.General.tsx +2 -2
  17. package/src/components/EditorPanel/components/Panels/Panel.Series.tsx +3 -2
  18. package/src/components/EditorPanel/components/Panels/Panel.Visual.tsx +2 -1
  19. package/src/components/EditorPanel/components/Panels/panelVisual.styles.css +8 -0
  20. package/src/components/EditorPanel/useEditorPermissions.ts +7 -4
  21. package/src/components/HoverLine/HoverLine.tsx +74 -0
  22. package/src/components/Legend/Legend.Suppression.tsx +47 -3
  23. package/src/components/Legend/helpers/index.ts +1 -1
  24. package/src/components/LineChart/index.tsx +3 -6
  25. package/src/components/LinearChart.tsx +161 -132
  26. package/src/components/PieChart/PieChart.tsx +58 -13
  27. package/src/data/initial-state.js +8 -5
  28. package/src/helpers/getNewRuntime.ts +35 -0
  29. package/src/helpers/getPiePercent.ts +22 -0
  30. package/src/helpers/getTransformedData.ts +22 -0
  31. package/src/helpers/tests/getNewRuntime.test.ts +82 -0
  32. package/src/helpers/tests/getPiePercent.test.ts +38 -0
  33. package/src/hooks/useRightAxis.ts +1 -1
  34. package/src/hooks/useScales.ts +8 -3
  35. package/src/hooks/useTooltip.tsx +24 -10
  36. package/src/store/chart.actions.ts +2 -6
  37. package/src/store/chart.reducer.ts +23 -23
  38. package/src/types/ChartConfig.ts +6 -3
  39. package/src/types/ChartContext.ts +0 -2
  40. package/src/components/ZoomBrush.tsx +0 -251
@@ -0,0 +1,417 @@
1
+ {
2
+ "annotations": [],
3
+ "type": "chart",
4
+ "debugSvg": false,
5
+ "chartMessage": {
6
+ "noData": "No Data Available"
7
+ },
8
+ "title": "",
9
+ "showTitle": false,
10
+ "showDownloadMediaButton": false,
11
+ "theme": "theme-blue",
12
+ "animate": false,
13
+ "fontSize": "medium",
14
+ "lineDatapointStyle": "hover",
15
+ "lineDatapointColor": "Same as Line",
16
+ "barHasBorder": "false",
17
+ "isLollipopChart": false,
18
+ "lollipopShape": "circle",
19
+ "lollipopColorStyle": "two-tone",
20
+ "visualizationSubType": "regular",
21
+ "barStyle": "flat",
22
+ "roundingStyle": "standard",
23
+ "tipRounding": "top",
24
+ "isResponsiveTicks": true,
25
+ "general": {
26
+ "annotationDropdownText": "Annotations",
27
+ "showMissingDataLabel": false,
28
+ "showSuppressedSymbol": true,
29
+ "showZeroValueData": false,
30
+ "hideNullValue": true
31
+ },
32
+ "padding": {
33
+ "left": 5,
34
+ "right": 5
35
+ },
36
+ "preliminaryData": [],
37
+ "yAxis": {
38
+ "hideAxis": false,
39
+ "displayNumbersOnBar": false,
40
+ "hideLabel": false,
41
+ "hideTicks": false,
42
+ "size": "75",
43
+ "gridLines": false,
44
+ "enablePadding": false,
45
+ "min": "0.1",
46
+ "max": "3",
47
+ "labelColor": "#333",
48
+ "tickLabelColor": "#333",
49
+ "tickColor": "#333",
50
+ "rightHideAxis": true,
51
+ "rightAxisSize": 0,
52
+ "rightLabel": "",
53
+ "rightLabelOffsetSize": 0,
54
+ "rightAxisLabelColor": "#333",
55
+ "rightAxisTickLabelColor": "#333",
56
+ "rightAxisTickColor": "#333",
57
+ "numTicks": "6",
58
+ "axisPadding": 0,
59
+ "scalePadding": 10,
60
+ "tickRotation": 0,
61
+ "anchors": [],
62
+ "shoMissingDataLabel": true,
63
+ "showMissingDataLine": true,
64
+ "categories": [],
65
+ "label": "Reported cases per 100,000 Population",
66
+ "type": "linear",
67
+ "dataKey": "Hispanic"
68
+ },
69
+ "boxplot": {
70
+ "plots": [],
71
+ "borders": "true",
72
+ "plotOutlierValues": false,
73
+ "plotNonOutlierValues": true,
74
+ "labels": {
75
+ "q1": "Lower Quartile",
76
+ "q2": "q2",
77
+ "q3": "Upper Quartile",
78
+ "q4": "q4",
79
+ "minimum": "Minimum",
80
+ "maximum": "Maximum",
81
+ "mean": "Mean",
82
+ "median": "Median",
83
+ "sd": "Standard Deviation",
84
+ "iqr": "Interquartile Range",
85
+ "count": "Count",
86
+ "outliers": "Outliers",
87
+ "values": "Values",
88
+ "lowerBounds": "Lower Bounds",
89
+ "upperBounds": "Upper Bounds"
90
+ }
91
+ },
92
+ "topAxis": {
93
+ "hasLine": false
94
+ },
95
+ "isLegendValue": false,
96
+ "barThickness": 0.35,
97
+ "barHeight": 25,
98
+ "barSpace": 15,
99
+ "heights": {
100
+ "vertical": 300,
101
+ "horizontal": 750
102
+ },
103
+ "xAxis": {
104
+ "sortDates": false,
105
+ "anchors": [],
106
+ "type": "categorical",
107
+ "showTargetLabel": true,
108
+ "targetLabel": "Target",
109
+ "hideAxis": false,
110
+ "hideLabel": false,
111
+ "hideTicks": false,
112
+ "size": 75,
113
+ "tickRotation": 0,
114
+ "min": "",
115
+ "max": "",
116
+ "labelColor": "#333",
117
+ "tickLabelColor": "#333",
118
+ "tickColor": "#333",
119
+ "numTicks": "",
120
+ "labelOffset": 0,
121
+ "axisPadding": 200,
122
+ "target": 0,
123
+ "maxTickRotation": 0,
124
+ "padding": 5,
125
+ "showYearsOnce": false,
126
+ "sortByRecentDate": false,
127
+ "dataKey": "Year",
128
+ "label": "Year",
129
+ "manual": true,
130
+ "axisBBox": 63.41333770751953,
131
+ "tickWidthMax": 39
132
+ },
133
+ "table": {
134
+ "label": "Data Table",
135
+ "expanded": true,
136
+ "limitHeight": false,
137
+ "height": "",
138
+ "caption": "",
139
+ "showDownloadUrl": false,
140
+ "showDataTableLink": true,
141
+ "showDownloadLinkBelow": true,
142
+ "indexLabel": "",
143
+ "download": true,
144
+ "showVertical": false,
145
+ "dateDisplayFormat": "",
146
+ "showMissingDataLabel": true,
147
+ "showSuppressedSymbol": true,
148
+ "show": true
149
+ },
150
+ "orientation": "vertical",
151
+ "color": "pinkpurple",
152
+ "columns": {},
153
+ "legend": {
154
+ "hide": false,
155
+ "behavior": "isolate",
156
+ "axisAlign": true,
157
+ "singleRow": true,
158
+ "colorCode": "",
159
+ "reverseLabelOrder": false,
160
+ "description": "",
161
+ "dynamicLegend": false,
162
+ "dynamicLegendDefaultText": "Show All",
163
+ "dynamicLegendItemLimit": 5,
164
+ "dynamicLegendItemLimitMessage": "Dynamic Legend Item Limit Hit.",
165
+ "dynamicLegendChartMessage": "Select Options from the Legend",
166
+ "label": "",
167
+ "lineMode": false,
168
+ "verticalSorted": false,
169
+ "highlightOnHover": false,
170
+ "hideSuppressedLabels": false,
171
+ "hideSuppressionLink": false,
172
+ "seriesHighlight": [],
173
+ "style": "boxes",
174
+ "subStyle": "linear blocks",
175
+ "groupBy": "",
176
+ "shape": "circle",
177
+ "tickRotation": "",
178
+ "order": "dataColumn",
179
+ "hideBorder": {
180
+ "side": false,
181
+ "topBottom": true
182
+ },
183
+ "position": "right",
184
+ "orderedValues": [],
185
+ "unified": true
186
+ },
187
+ "brush": {
188
+ "height": 25,
189
+ "active": false
190
+ },
191
+ "exclusions": {
192
+ "active": false,
193
+ "keys": []
194
+ },
195
+ "palette": "qualitative-bold",
196
+ "isPaletteReversed": false,
197
+ "twoColor": {
198
+ "palette": "monochrome-1",
199
+ "isPaletteReversed": false
200
+ },
201
+ "labels": false,
202
+ "dataFormat": {
203
+ "commas": false,
204
+ "prefix": "",
205
+ "suffix": "",
206
+ "abbreviated": false,
207
+ "bottomSuffix": "",
208
+ "bottomPrefix": "",
209
+ "bottomAbbreviated": false,
210
+ "roundTo": "1",
211
+ "showPiePercent": true
212
+ },
213
+ "confidenceKeys": {},
214
+ "visual": {
215
+ "border": true,
216
+ "accent": true,
217
+ "background": true,
218
+ "verticalHoverLine": false,
219
+ "horizontalHoverLine": false,
220
+ "lineDatapointSymbol": "none",
221
+ "maximumShapeAmount": 7
222
+ },
223
+ "useLogScale": false,
224
+ "filterBehavior": "Filter Change",
225
+ "highlightedBarValues": [],
226
+ "series": [
227
+ {
228
+ "dataKey": "American Indian/Alaska Native",
229
+ "type": "Line",
230
+ "axis": "Left",
231
+ "tooltip": true
232
+ },
233
+ {
234
+ "dataKey": "Asian/Pacific Islander",
235
+ "type": "Line",
236
+ "axis": "Left",
237
+ "tooltip": true
238
+ },
239
+ {
240
+ "dataKey": "Black, non-Hispanic",
241
+ "type": "Line",
242
+ "axis": "Left",
243
+ "tooltip": true
244
+ },
245
+ {
246
+ "dataKey": "White, non-Hispanic",
247
+ "type": "Line",
248
+ "axis": "Left",
249
+ "tooltip": true
250
+ },
251
+ {
252
+ "dataKey": "Hispanic",
253
+ "type": "Line",
254
+ "axis": "Left",
255
+ "tooltip": true
256
+ }
257
+ ],
258
+ "tooltips": {
259
+ "opacity": 90,
260
+ "singleSeries": false,
261
+ "dateDisplayFormat": ""
262
+ },
263
+ "forestPlot": {
264
+ "startAt": 0,
265
+ "colors": {
266
+ "line": "",
267
+ "shape": ""
268
+ },
269
+ "lineOfNoEffect": {
270
+ "show": true
271
+ },
272
+ "type": "",
273
+ "pooledResult": {
274
+ "diamondHeight": 5,
275
+ "column": ""
276
+ },
277
+ "estimateField": "",
278
+ "estimateRadius": "",
279
+ "shape": "square",
280
+ "rowHeight": 20,
281
+ "description": {
282
+ "show": true,
283
+ "text": "description",
284
+ "location": 0
285
+ },
286
+ "result": {
287
+ "show": true,
288
+ "text": "result",
289
+ "location": 100
290
+ },
291
+ "radius": {
292
+ "min": 2,
293
+ "max": 10,
294
+ "scalingColumn": ""
295
+ },
296
+ "regression": {
297
+ "lower": 0,
298
+ "upper": 0,
299
+ "estimateField": 0
300
+ },
301
+ "leftWidthOffset": 0,
302
+ "rightWidthOffset": 0,
303
+ "showZeroLine": false,
304
+ "leftLabel": "",
305
+ "rightLabel": ""
306
+ },
307
+ "area": {
308
+ "isStacked": false
309
+ },
310
+ "sankey": {
311
+ "title": {
312
+ "defaultColor": "black"
313
+ },
314
+ "iterations": 1,
315
+ "rxValue": 0.9,
316
+ "overallSize": {
317
+ "width": 900,
318
+ "height": 700
319
+ },
320
+ "margin": {
321
+ "margin_y": 25,
322
+ "margin_x": 0
323
+ },
324
+ "nodeSize": {
325
+ "nodeWidth": 26,
326
+ "nodeHeight": 40
327
+ },
328
+ "nodePadding": 55,
329
+ "nodeFontColor": "black",
330
+ "nodeColor": {
331
+ "default": "#ff8500",
332
+ "inactive": "#808080"
333
+ },
334
+ "linkColor": {
335
+ "default": "#ffc900",
336
+ "inactive": "#D3D3D3"
337
+ },
338
+ "opacity": {
339
+ "nodeOpacityDefault": 1,
340
+ "nodeOpacityInactive": 0.1,
341
+ "LinkOpacityDefault": 1,
342
+ "LinkOpacityInactive": 0.1
343
+ },
344
+ "storyNodeFontColor": "#006778",
345
+ "storyNodeText": [],
346
+ "nodeValueStyle": {
347
+ "textBefore": "(",
348
+ "textAfter": ")"
349
+ },
350
+ "data": []
351
+ },
352
+ "errors": [],
353
+ "currentViewport": "lg",
354
+ "id": 4,
355
+ "category": "Charts",
356
+ "label": "Line",
357
+ "subType": "Line",
358
+ "icon": {
359
+ "key": null,
360
+ "ref": null,
361
+ "props": {},
362
+ "_owner": null
363
+ },
364
+ "content": "Present one or more data trends over time.",
365
+ "visualizationType": "Pie",
366
+ "datasets": {},
367
+ "activeVizButtonID": 4,
368
+ "data": [
369
+ {
370
+ "Year": "2007",
371
+ "American Indian/Alaska Native": "1.4",
372
+ "Asian/Pacific Islander": "0.9",
373
+ "Black, non-Hispanic": "2.3",
374
+ "White, non-Hispanic": "1",
375
+ "Hispanic": "50"
376
+ },
377
+ {
378
+ "Year": "2008",
379
+ "American Indian/Alaska Native": "1.8",
380
+ "Asian/Pacific Islander": "0.8",
381
+ "Black, non-Hispanic": "2.2",
382
+ "White, non-Hispanic": "0.9",
383
+ "Hispanic": "40"
384
+ }
385
+ ],
386
+ "dataFileName": "chart_data 2-6.csv",
387
+ "dataFileSourceType": "file",
388
+ "dataDescription": {
389
+ "horizontal": false,
390
+ "series": false
391
+ },
392
+ "version": "4.25.6",
393
+ "dynamicMarginTop": 0,
394
+ "formattedData": [
395
+ {
396
+ "Year": "2007",
397
+ "American Indian/Alaska Native": "1.4",
398
+ "Asian/Pacific Islander": "0.9",
399
+ "Black, non-Hispanic": "2.3",
400
+ "White, non-Hispanic": "1",
401
+ "Hispanic": "50"
402
+ },
403
+ {
404
+ "Year": "2008",
405
+ "American Indian/Alaska Native": "1.8",
406
+ "Asian/Pacific Islander": "0.8",
407
+ "Black, non-Hispanic": "2.2",
408
+ "White, non-Hispanic": "0.9",
409
+ "Hispanic": "40"
410
+ }
411
+ ],
412
+ "filters": [],
413
+ "migrations": {
414
+ "addColorMigration": true
415
+ },
416
+ "allowLineToBarGraph": "__​undefined__"
417
+ }
@@ -59,11 +59,7 @@ export const BarChartHorizontal = () => {
59
59
 
60
60
  const { HighLightedBarUtils } = useHighlightedBars(config)
61
61
 
62
- const hasConfidenceInterval =
63
- config.confidenceKeys.upper &&
64
- config.confidenceKeys.lower &&
65
- config.confidenceKeys.upper !== '' &&
66
- config.confidenceKeys.lower !== ''
62
+ const hasConfidenceInterval = Object.keys(config.confidenceKeys).length > 0
67
63
 
68
64
  const _data = getBarData(config, data, hasConfidenceInterval)
69
65
 
@@ -232,8 +228,6 @@ export const BarChartHorizontal = () => {
232
228
  const d = datum[config.confidenceKeys[position]]
233
229
  return xScale(d)
234
230
  })
235
- const labelX = bar.y
236
- const overlapWithCI = hasConfidenceInterval && labelX >= lowerPos && labelX <= upperPos
237
231
 
238
232
  return (
239
233
  <Group display={hideGroup} key={`${barGroup.index}--${index}`}>
@@ -267,6 +261,7 @@ export const BarChartHorizontal = () => {
267
261
  display: displayBar ? 'block' : 'none'
268
262
  }
269
263
  })}
264
+
270
265
  {config.preliminaryData?.map((pd, index) => {
271
266
  // check if user selected column
272
267
  const selectedSuppressionColumn = !pd.column || pd.column === bar.key
@@ -311,12 +306,8 @@ export const BarChartHorizontal = () => {
311
306
  display={displayBar ? 'block' : 'none'}
312
307
  x={bar.y}
313
308
  opacity={transparentBar ? 0.5 : 1}
314
- y={
315
- hasConfidenceInterval && overlapWithCI
316
- ? config.barHeight * bar.index
317
- : config.barHeight / 2 + config.barHeight * bar.index
318
- }
319
- fill={hasConfidenceInterval && overlapWithCI ? '#000' : labelColor}
309
+ y={config.barHeight / 2 + config.barHeight * bar.index}
310
+ fill={labelColor}
320
311
  dx={textPadding}
321
312
  verticalAnchor='middle'
322
313
  textAnchor={textAnchor}
@@ -21,24 +21,13 @@ const BarChartStackedVertical = () => {
21
21
  onMouseOverBar,
22
22
  barStackedSeriesKeys
23
23
  } = barChart
24
- const {
25
- transformedData,
26
- colorScale,
27
- seriesHighlight,
28
- config,
29
- formatNumber,
30
- formatDate,
31
- parseDate,
32
- setSharedFilter,
33
- brushConfig
34
- } = useContext(ConfigContext)
24
+ const { transformedData, colorScale, seriesHighlight, config, formatNumber, formatDate, parseDate, setSharedFilter } =
25
+ useContext(ConfigContext)
35
26
 
36
27
  const { orientation } = config
37
28
 
38
29
  let data = transformedData
39
- if (brushConfig.data.length) {
40
- data = brushConfig.data
41
- }
30
+
42
31
  const isDateAxisType = config.runtime.xAxis.type === 'date-time' || config.runtime.xAxis.type === 'date'
43
32
  const isDateTimeScaleAxisType = config.runtime.xAxis.type === 'date-time'
44
33
 
@@ -52,8 +52,7 @@ export const BarChartVertical = () => {
52
52
  parseDate,
53
53
  seriesHighlight,
54
54
  setSharedFilter,
55
- transformedData,
56
- brushConfig
55
+ transformedData
57
56
  } = useContext<ChartContext>(ConfigContext)
58
57
 
59
58
  const { HighLightedBarUtils } = useHighlightedBars(config)
@@ -67,10 +66,6 @@ export const BarChartVertical = () => {
67
66
  if (isSuppressionActive) {
68
67
  data = tableData
69
68
  }
70
- // if brush active use brush data (filtered|excluded) not cleaned
71
- if (brushConfig.data.length) {
72
- data = brushConfig.data
73
- }
74
69
 
75
70
  const hasConfidenceInterval =
76
71
  config.confidenceKeys.upper &&
@@ -292,6 +287,7 @@ export const BarChartVertical = () => {
292
287
  cursor: dashboardConfig ? 'pointer' : 'default'
293
288
  }
294
289
  })}
290
+
295
291
  {config.preliminaryData.map((pd, index) => {
296
292
  // check if user selected column
297
293
  const selectedSuppressionColumn = !pd.column || pd.column === bar.key
@@ -335,7 +331,6 @@ export const BarChartVertical = () => {
335
331
  </Text>
336
332
  )
337
333
  })}
338
-
339
334
  <Text // prettier-ignore
340
335
  display={displayBar ? 'block' : 'none'}
341
336
  opacity={transparentBar ? 0.5 : 1}
@@ -357,7 +352,6 @@ export const BarChartVertical = () => {
357
352
  >
358
353
  {absentDataLabel}
359
354
  </Text>
360
-
361
355
  {config.isLollipopChart && config.lollipopShape === 'circle' && (
362
356
  <circle
363
357
  display={displaylollipopShape}
@@ -0,0 +1,73 @@
1
+ import React, { FC, useContext, useEffect, useRef, useState } from 'react'
2
+ import { Brush } from '@visx/brush'
3
+ import { Group } from '@visx/group'
4
+ import { scaleBand, scaleLinear } from '@visx/scale'
5
+ import ConfigContext from '../../ConfigContext'
6
+ import { Text } from '@visx/text'
7
+ import { APP_FONT_SIZE } from '@cdc/core/helpers/constants'
8
+ import { getTextWidth } from '@cdc/core/helpers/getTextWidth'
9
+ import { isDateScale } from '@cdc/core/helpers/cove/date'
10
+ export interface ZoomBrushProps {
11
+ xMax: number
12
+ yMax: number
13
+ brushPosition: { start: { x: number }; end: { x: number } }
14
+ onBrushChange: (bounds: any) => void
15
+ brushKey: number
16
+ }
17
+
18
+ const ZoomBrush: FC<ZoomBrushProps> = ({ xMax, yMax, brushPosition, onBrushChange, brushKey }) => {
19
+ const { tableData, config, parseDate, dashboardConfig } = useContext(ConfigContext)
20
+ const brushRef = useRef(null)
21
+ const dataKey = config.xAxis.dataKey
22
+ const borderRadius = 15
23
+ const mappedDates: string[] = tableData.map(row => row[dataKey])
24
+ const brushheight = 25
25
+ const DASHBOARD_MARGIN = 50
26
+ const BRUSH_HEIGHT_MULTIPLIER = 1.5
27
+
28
+ const xScale = scaleBand<string>({
29
+ domain: mappedDates,
30
+ range: [0, xMax],
31
+ paddingInner: 0.1,
32
+ paddingOuter: 0.1
33
+ })
34
+ const yScale = scaleLinear({ domain: [0, yMax], range: [0, yMax] })
35
+
36
+ const calculateGroupTop = (): number => {
37
+ if (dashboardConfig?.type === 'dashboard') {
38
+ return Number(yMax) + config.xAxis.axisBBox + brushheight * BRUSH_HEIGHT_MULTIPLIER + DASHBOARD_MARGIN
39
+ } else {
40
+ return Number(yMax) + config.xAxis.axisBBox + brushheight * BRUSH_HEIGHT_MULTIPLIER
41
+ }
42
+ }
43
+
44
+ const style = {
45
+ fill: '#474747',
46
+ stroke: 'blue',
47
+ strokeOpacity: 0,
48
+ rx: borderRadius
49
+ }
50
+
51
+ return (
52
+ <Group left={config.yAxis.size} top={calculateGroupTop()}>
53
+ <rect fill='#949494' width={xMax} height={25} rx={borderRadius} pointerEvents='none' />
54
+ <Brush
55
+ innerRef={brushRef}
56
+ key={brushKey}
57
+ xScale={xScale}
58
+ yScale={yScale}
59
+ width={xMax}
60
+ height={25}
61
+ brushDirection='horizontal'
62
+ handleSize={8}
63
+ resizeTriggerAreas={['left', 'right']}
64
+ initialBrushPosition={brushPosition}
65
+ selectedBoxStyle={style}
66
+ onChange={onBrushChange}
67
+ disableDraggingOverlay={true}
68
+ />
69
+ </Group>
70
+ )
71
+ }
72
+
73
+ export default ZoomBrush
@@ -0,0 +1,39 @@
1
+ import { useState, useEffect, useContext } from 'react'
2
+ import ConfigContext, { ChartDispatchContext } from '../../ConfigContext'
3
+ import ZoomBrush from './BrushChart'
4
+ const BrushController = ({ yMax, xMax }) => {
5
+ const { tableData, config, parseDate, dashboardConfig } = useContext(ConfigContext)
6
+ const dataKey = config.xAxis.dataKey
7
+ const [brushKey, setBrushKey] = useState(0)
8
+ const dispatch = useContext(ChartDispatchContext)
9
+ const sharedFilters = dashboardConfig?.dashboard?.sharedFilters ?? []
10
+ const isDashboardFilters = sharedFilters?.length > 0
11
+ const [brushPosition, setBrushPosition] = useState({
12
+ start: { x: 0 },
13
+ end: { x: xMax }
14
+ })
15
+
16
+ const handleBrushChange = (bounds: any) => {
17
+ const selected = bounds.xValues || []
18
+ const filteredData = tableData.filter(row => selected.includes(row[dataKey]))
19
+ dispatch({ type: 'SET_BRUSH_DATA', payload: filteredData })
20
+ }
21
+
22
+ // whenever your other filters change:
23
+ useEffect(() => {
24
+ setBrushPosition({ start: { x: 0 }, end: { x: xMax } })
25
+ dispatch({ type: 'SET_BRUSH_DATA', payload: [] })
26
+ setBrushKey(k => k + 1)
27
+ }, [config.filters, config.exclusions, config.brush?.active, isDashboardFilters])
28
+
29
+ return (
30
+ <ZoomBrush
31
+ xMax={xMax}
32
+ yMax={yMax}
33
+ brushPosition={brushPosition}
34
+ onBrushChange={handleBrushChange}
35
+ brushKey={brushKey}
36
+ />
37
+ )
38
+ }
39
+ export default BrushController
@@ -15,7 +15,6 @@ export default function DeviationBar({ height, xScale }) {
15
15
  config,
16
16
  formatNumber,
17
17
  twoColorPalette,
18
- updateConfig,
19
18
  parseDate,
20
19
  formatDate,
21
20
  currentViewport