@cdc/chart 4.26.3 → 4.26.4

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 (128) hide show
  1. package/CONFIG.md +169 -0
  2. package/README.md +42 -17
  3. package/dist/cdcchart.js +34725 -33730
  4. package/examples/feature/bar/additional-column-tooltip.json +3 -3
  5. package/examples/feature/deviation/planet-deviation-config.json +2 -2
  6. package/examples/feature/paired-bar/paired-bar-example.json +2 -2
  7. package/examples/feature/tests-case-rate/case-rate-example-config.json +2 -2
  8. package/examples/feature/tests-covid/covid-confidence-example-config.json +2 -2
  9. package/examples/feature/tests-covid/covid-example-config.json +2 -2
  10. package/examples/feature/tests-cutoff/cutoff-example-config.json +2 -2
  11. package/examples/feature/tests-non-numerics/planet-pie-example-config-nonnumeric.json +2 -2
  12. package/examples/metadata-variables.json +1 -1
  13. package/examples/minimal-example.json +24 -0
  14. package/examples/private/test2.json +35012 -0
  15. package/package.json +4 -4
  16. package/src/CdcChartComponent.tsx +9 -6
  17. package/src/_stories/{Chart.HTMLInDataTable.stories.tsx → Chart.HTMLInDataTable.smoke.stories.tsx} +10 -0
  18. package/src/_stories/Chart.Minimal.smoke.stories.tsx +25 -0
  19. package/src/_stories/{Chart.SmallMultiples.stories.tsx → Chart.SmallMultiples.smoke.stories.tsx} +17 -1
  20. package/src/_stories/{Chart.stories.tsx → Chart.smoke.stories.tsx} +12 -0
  21. package/src/_stories/{Chart.tooltip.stories.tsx → Chart.tooltip.smoke.stories.tsx} +68 -0
  22. package/src/_stories/ChartBar.Editor.stories.tsx +88 -85
  23. package/src/_stories/ChartEditor.Editor.stories.tsx +23 -0
  24. package/src/_stories/ChartLine.DashedDates.smoke.stories.tsx +23 -0
  25. package/src/_stories/_mock/line_chart_dashed_dates.json +276 -0
  26. package/src/_stories/_mock/paired-bar-abbr.json +1 -1
  27. package/src/_stories/_mock/paired-bar.json +1 -1
  28. package/src/components/Annotations/components/AnnotationDraggable.tsx +1 -1
  29. package/src/components/AreaChart/components/AreaChart.Stacked.jsx +10 -2
  30. package/src/components/Axis/BottomAxis.tsx +1 -1
  31. package/src/components/Axis/LeftAxis.tsx +2 -4
  32. package/src/components/Axis/LeftAxisGridlines.tsx +1 -3
  33. package/src/components/BarChart/components/BarChart.Horizontal.tsx +9 -5
  34. package/src/components/BarChart/components/BarChart.StackedHorizontal.tsx +9 -5
  35. package/src/components/BarChart/components/BarChart.StackedVertical.tsx +9 -5
  36. package/src/components/BarChart/components/BarChart.Vertical.tsx +9 -6
  37. package/src/components/BarChart/components/BarChart.tsx +2 -6
  38. package/src/components/BarChart/helpers/useBarChart.ts +1 -1
  39. package/src/components/BoxPlot/BoxPlot.Vertical.tsx +3 -3
  40. package/src/components/EditorPanel/EditorPanel.tsx +633 -908
  41. package/src/components/EditorPanel/EditorPanelContext.ts +1 -1
  42. package/src/components/EditorPanel/components/Panels/Panel.Annotate.tsx +216 -165
  43. package/src/components/EditorPanel/components/Panels/Panel.PatternSettings.tsx +168 -116
  44. package/src/components/EditorPanel/components/Panels/Panel.Regions.tsx +154 -109
  45. package/src/components/EditorPanel/components/Panels/Panel.Sankey.tsx +3 -3
  46. package/src/components/EditorPanel/components/Panels/Panel.Series.tsx +12 -26
  47. package/src/components/EditorPanel/useEditorPermissions.ts +1 -10
  48. package/src/components/Forecasting/Forecasting.tsx +2 -2
  49. package/src/components/HorizonChart/HorizonChart.tsx +10 -2
  50. package/src/components/HoverLine/HoverLine.tsx +6 -8
  51. package/src/components/Legend/Legend.Component.tsx +4 -4
  52. package/src/components/Legend/LegendGroup/LegendGroup.styles.css +5 -0
  53. package/src/components/Legend/LegendGroup/LegendGroup.tsx +3 -1
  54. package/src/components/Legend/helpers/index.ts +0 -2
  55. package/src/components/LineChart/LineChartProps.ts +1 -0
  56. package/src/components/LineChart/components/LineChart.BumpCircle.tsx +3 -2
  57. package/src/components/LineChart/index.tsx +11 -4
  58. package/src/components/LinearChart/VisualizationRenderer.tsx +11 -1
  59. package/src/components/LinearChart/tests/LinearChart.test.tsx +147 -0
  60. package/src/components/LinearChart.tsx +98 -41
  61. package/src/components/PairedBarChart.jsx +2 -2
  62. package/src/components/PieChart/PieChart.tsx +11 -9
  63. package/src/components/Regions/components/Regions.tsx +30 -20
  64. package/src/components/ScatterPlot/ScatterPlot.jsx +19 -17
  65. package/src/components/SmallMultiples/SmallMultipleTile.tsx +1 -0
  66. package/src/components/Sparkline/components/SparkLine.tsx +1 -1
  67. package/src/components/WarmingStripes/WarmingStripes.tsx +5 -3
  68. package/src/data/initial-state.js +1 -0
  69. package/src/helpers/calculateLeftYAxisWidth.ts +193 -0
  70. package/src/helpers/tests/tooltipHelpers.test.ts +151 -0
  71. package/src/helpers/tooltipHelpers.ts +176 -0
  72. package/src/hooks/useHighlightedBars.ts +9 -16
  73. package/src/hooks/useProgrammaticTooltip.ts +16 -2
  74. package/src/hooks/useSmallMultipleSynchronization.ts +3 -4
  75. package/src/hooks/useTooltip.tsx +167 -38
  76. package/src/test/CdcChart.test.jsx +24 -0
  77. package/src/types/ChartConfig.ts +1 -0
  78. package/LICENSE +0 -201
  79. package/examples/chart-regression-2.json +0 -2360
  80. package/examples/feature/__data__/age-adjusted-rates.json +0 -1486
  81. package/examples/feature/__data__/city-temperature.json +0 -2198
  82. package/examples/feature/bar/Barchart_with_negative.json +0 -34
  83. package/examples/feature/boxplot/box-plot-data.json +0 -71
  84. package/examples/feature/boxplot/boxplot-data.json +0 -156
  85. package/examples/feature/combo/combochart-categories_are_numbers .json +0 -18
  86. package/examples/feature/forest-plot/log.json +0 -26
  87. package/examples/feature/tests-date-exclusions/date-exclusions-data.json +0 -162
  88. package/examples/region-issue.json +0 -2065
  89. package/examples/xaxis.json +0 -493
  90. /package/examples/{data → __data__}/data-with-metadata.json +0 -0
  91. /package/examples/feature/bar/{tall-data.json → __data__/tall-data.json} +0 -0
  92. /package/examples/feature/deviation/{planet-deviation-data.json → __data__/planet-deviation-data.json} +0 -0
  93. /package/examples/feature/paired-bar/{paired-bar-data.json → __data__/paired-bar-data.json} +0 -0
  94. /package/examples/feature/paired-bar/{paired-bar-formatted.json → __data__/paired-bar-formatted.json} +0 -0
  95. /package/examples/feature/tests-case-rate/{case-rate-example-data.json → __data__/case-rate-example-data.json} +0 -0
  96. /package/examples/feature/tests-covid/{covid-example-data-confidence.json → __data__/covid-example-data-confidence.json} +0 -0
  97. /package/examples/feature/tests-covid/{covid-example-data.json → __data__/covid-example-data.json} +0 -0
  98. /package/examples/feature/tests-cutoff/{cutoff-example-data.json → __data__/cutoff-example-data.json} +0 -0
  99. /package/examples/feature/tests-non-numerics/{planet-example-data-nonnumeric.json → __data__/planet-example-data-nonnumeric.json} +0 -0
  100. /package/src/_stories/{Chart.Anchors.stories.tsx → Chart.Anchors.smoke.stories.tsx} +0 -0
  101. /package/src/_stories/{Chart.BoxPlot.stories.tsx → Chart.BoxPlot.smoke.stories.tsx} +0 -0
  102. /package/src/_stories/{Chart.CI.stories.tsx → Chart.CI.smoke.stories.tsx} +0 -0
  103. /package/src/_stories/{Chart.Combo.stories.tsx → Chart.Combo.smoke.stories.tsx} +0 -0
  104. /package/src/_stories/{Chart.CustomColors.stories.tsx → Chart.CustomColors.smoke.stories.tsx} +0 -0
  105. /package/src/_stories/{Chart.Defaults.stories.tsx → Chart.Defaults.smoke.stories.tsx} +0 -0
  106. /package/src/_stories/{Chart.DynamicSeries.stories.tsx → Chart.DynamicSeries.smoke.stories.tsx} +0 -0
  107. /package/src/_stories/{Chart.Filters.stories.tsx → Chart.Filters.smoke.stories.tsx} +0 -0
  108. /package/src/_stories/{Chart.Forecast.stories.tsx → Chart.Forecast.smoke.stories.tsx} +0 -0
  109. /package/src/_stories/{Chart.Legend.Gradient.stories.tsx → Chart.Legend.Gradient.smoke.stories.tsx} +0 -0
  110. /package/src/_stories/{Chart.Patterns.stories.tsx → Chart.Patterns.smoke.stories.tsx} +0 -0
  111. /package/src/_stories/{Chart.PreserveDecimals.stories.tsx → Chart.PreserveDecimals.smoke.stories.tsx} +0 -0
  112. /package/src/_stories/{Chart.Regions.Categorical.stories.tsx → Chart.Regions.Categorical.smoke.stories.tsx} +0 -0
  113. /package/src/_stories/{Chart.Regions.DateScale.stories.tsx → Chart.Regions.DateScale.smoke.stories.tsx} +0 -0
  114. /package/src/_stories/{Chart.Regions.DateTimeScale.stories.tsx → Chart.Regions.DateTimeScale.smoke.stories.tsx} +0 -0
  115. /package/src/_stories/{Chart.ScatterPlot.stories.tsx → Chart.ScatterPlot.smoke.stories.tsx} +0 -0
  116. /package/src/_stories/{Chart.SmallestLeftAxisMax.stories.tsx → Chart.SmallestLeftAxisMax.smoke.stories.tsx} +0 -0
  117. /package/src/_stories/{ChartAnnotation.stories.tsx → ChartAnnotation.smoke.stories.tsx} +0 -0
  118. /package/src/_stories/{ChartAxisLabels.stories.tsx → ChartAxisLabels.smoke.stories.tsx} +0 -0
  119. /package/src/_stories/{ChartAxisTitles.stories.tsx → ChartAxisTitles.smoke.stories.tsx} +0 -0
  120. /package/src/_stories/{ChartBrush.Matrix.Continuous.stories.tsx → ChartBrush.Matrix.Continuous.smoke.stories.tsx} +0 -0
  121. /package/src/_stories/{ChartBrush.Matrix.Date.stories.tsx → ChartBrush.Matrix.Date.smoke.stories.tsx} +0 -0
  122. /package/src/_stories/{ChartBrush.Matrix.DateTime.stories.tsx → ChartBrush.Matrix.DateTime.smoke.stories.tsx} +0 -0
  123. /package/src/_stories/{ChartBrush.stories.tsx → ChartBrush.smoke.stories.tsx} +0 -0
  124. /package/src/_stories/{ChartLine.QuadrantAngles.stories.tsx → ChartLine.QuadrantAngles.smoke.stories.tsx} +0 -0
  125. /package/src/_stories/{ChartLine.Suppression.stories.tsx → ChartLine.Suppression.smoke.stories.tsx} +0 -0
  126. /package/src/_stories/{ChartLine.Symbols.stories.tsx → ChartLine.Symbols.smoke.stories.tsx} +0 -0
  127. /package/src/_stories/{ChartPrefixSuffix.stories.tsx → ChartPrefixSuffix.smoke.stories.tsx} +0 -0
  128. /package/src/_stories/{TechAdoptionWithLinks.stories.tsx → TechAdoptionWithLinks.smoke.stories.tsx} +0 -0
@@ -19,7 +19,7 @@ export type EditorPanelContext = {
19
19
  handleUpdateHighlightedBarColor?: Function
20
20
  handleUpdateHighlightedBorderWidth?: Function
21
21
  highlightedBarValues?: Function
22
- highlightedSeriesValues?: Function
22
+ getHighlightedSeriesValues?: Function
23
23
  isPaletteReversed?: boolean
24
24
  handleRemoveHighlightedBar?: Function
25
25
  setLollipopShape?: Function
@@ -1,12 +1,22 @@
1
1
  import React, { useContext } from 'react'
2
+ import { Draggable } from '@hello-pangea/dnd'
2
3
  import ConfigContext from '../../../../ConfigContext.js'
3
4
  import { useEditorPermissions } from '../../useEditorPermissions'
4
5
 
5
6
  // CDC Core
6
7
  import Accordion from '@cdc/core/components/ui/Accordion'
7
8
  import Button from '@cdc/core/components/elements/Button'
9
+ import GroupedList from '@cdc/core/components/EditorPanel/GroupedList'
10
+ import Icon from '@cdc/core/components/ui/Icon'
8
11
  import { CheckBox, Select } from '@cdc/core/components/EditorPanel/Inputs'
9
12
  import cloneDeep from 'lodash/cloneDeep'
13
+ import {
14
+ Accordion as AccessibleAccordion,
15
+ AccordionItem,
16
+ AccordionItemButton,
17
+ AccordionItemHeading,
18
+ AccordionItemPanel
19
+ } from 'react-accessible-accordion'
10
20
 
11
21
  // types
12
22
  import { type PanelProps } from './../PanelProps'
@@ -102,6 +112,16 @@ const PanelAnnotate: React.FC<PanelProps> = props => {
102
112
  })
103
113
  }
104
114
 
115
+ const handleAnnotationReorder = (sourceIndex: number, destinationIndex: number) => {
116
+ const annotations = [...config.annotations]
117
+ const [movedAnnotation] = annotations.splice(sourceIndex, 1)
118
+ annotations.splice(destinationIndex, 0, movedAnnotation)
119
+ updateConfig({
120
+ ...config,
121
+ annotations
122
+ })
123
+ }
124
+
105
125
  return (
106
126
  <Accordion key={props.name}>
107
127
  <Accordion.Section title={props.name} key={props.name}>
@@ -133,190 +153,221 @@ const PanelAnnotate: React.FC<PanelProps> = props => {
133
153
  />
134
154
  </label>
135
155
  )}
136
- {config?.annotations &&
137
- config?.annotations.map((annotation, index) => (
138
- <Accordion key={index}>
139
- <Accordion.Section
140
- title={annotation.text ? annotation.text.substring(0, 15) + '...' : `Annotation ${index + 1}`}
141
- >
142
- <div className='annotation-group'>
143
- <label>
144
- Annotation Text:
145
- <textarea
146
- rows={5}
147
- value={annotation.text}
148
- onChange={e => handleAnnotationUpdate(e.target.value, 'text', index)}
149
- />
150
- </label>
156
+ <GroupedList
157
+ items={config?.annotations}
158
+ label='Text Annotations'
159
+ droppableId='chart-annotations-order'
160
+ onDragEnd={({ source, destination }) => {
161
+ if (!destination || source.index === destination.index) return
162
+ handleAnnotationReorder(source.index, destination.index)
163
+ }}
164
+ renderItem={(annotation, index) => (
165
+ <Draggable key={`annotation-${index}`} draggableId={`annotation-${index}`} index={index}>
166
+ {(provided, snapshot) => (
167
+ <div
168
+ ref={provided.innerRef}
169
+ {...provided.draggableProps}
170
+ {...provided.dragHandleProps}
171
+ className={snapshot.isDragging ? 'currently-dragging' : ''}
172
+ style={provided.draggableProps.style}
173
+ >
174
+ <AccessibleAccordion allowZeroExpanded preExpanded={['panel']}>
175
+ <AccordionItem uuid='panel' className='series-item series-item--chart'>
176
+ <AccordionItemHeading className='series-item__title'>
177
+ <AccordionItemButton className='accordion__button'>
178
+ <Icon display='move' size={15} style={{ cursor: 'default' }} />
179
+ {annotation.text ? annotation.text.substring(0, 15) + '...' : `Annotation ${index + 1}`}
180
+ </AccordionItemButton>
181
+ </AccordionItemHeading>
182
+ <AccordionItemPanel>
183
+ <div className='series-item__panel-actions'>
184
+ <Button
185
+ type='button'
186
+ variant='danger'
187
+ size='sm'
188
+ className='grouped-list__remove'
189
+ onClick={() => handleRemoveAnnotation(index)}
190
+ >
191
+ Delete Annotation
192
+ </Button>
193
+ </div>
194
+ <label>
195
+ Annotation Text:
196
+ <textarea
197
+ rows={5}
198
+ value={annotation.text}
199
+ onChange={e => handleAnnotationUpdate(e.target.value, 'text', index)}
200
+ />
201
+ </label>
151
202
 
152
- {visSupportsDataAnnotations() && (
153
- <Select
154
- label='Position Mode:'
155
- value={annotation.anchorMode || 'fixed'}
156
- options={[
157
- { value: 'fixed', label: 'Fixed position' },
158
- { value: 'data', label: 'Snap to data' }
159
- ]}
160
- section='annotations'
161
- subsection={null}
162
- fieldName='anchorMode'
163
- updateField={(section, subsection, fieldName, value) => {
164
- const updatedAnnotations = cloneDeep(config?.annotations)
165
- updatedAnnotations[index].anchorMode = value
203
+ {visSupportsDataAnnotations() && (
204
+ <Select
205
+ label='Position Mode:'
206
+ value={annotation.anchorMode || 'fixed'}
207
+ options={[
208
+ { value: 'fixed', label: 'Fixed position' },
209
+ { value: 'data', label: 'Snap to data' }
210
+ ]}
211
+ section='annotations'
212
+ subsection={null}
213
+ fieldName='anchorMode'
214
+ updateField={(section, subsection, fieldName, value) => {
215
+ const updatedAnnotations = cloneDeep(config?.annotations)
216
+ updatedAnnotations[index].anchorMode = value
166
217
 
167
- // When switching to data mode, ensure seriesKey and dataX are initialized
168
- if (value === 'data') {
169
- if (!updatedAnnotations[index].seriesKey) {
170
- updatedAnnotations[index].seriesKey = config.series?.[0]?.dataKey || ''
171
- }
172
- if (!updatedAnnotations[index].dataX) {
173
- updatedAnnotations[index].dataX = transformedData?.[0]?.[config.xAxis.dataKey] || ''
174
- }
175
- }
218
+ // When switching to data mode, ensure seriesKey and dataX are initialized
219
+ if (value === 'data') {
220
+ if (!updatedAnnotations[index].seriesKey) {
221
+ updatedAnnotations[index].seriesKey = config.series?.[0]?.dataKey || ''
222
+ }
223
+ if (!updatedAnnotations[index].dataX) {
224
+ updatedAnnotations[index].dataX = transformedData?.[0]?.[config.xAxis.dataKey] || ''
225
+ }
226
+ }
176
227
 
177
- updateConfig({
178
- ...config,
179
- annotations: updatedAnnotations
180
- })
181
- }}
182
- />
183
- )}
228
+ updateConfig({
229
+ ...config,
230
+ annotations: updatedAnnotations
231
+ })
232
+ }}
233
+ />
234
+ )}
184
235
 
185
- {visSupportsDataAnnotations() && annotation.anchorMode === 'data' && (
186
- <Select
187
- label='Series:'
188
- value={annotation.seriesKey || config.series?.[0]?.dataKey || ''}
189
- options={config.series.map(s => s.dataKey)}
190
- section='annotations'
191
- subsection={null}
192
- fieldName='seriesKey'
193
- updateField={(section, subsection, fieldName, value) => {
194
- const updatedAnnotations = cloneDeep(config?.annotations)
195
- updatedAnnotations[index].seriesKey = value || config.series?.[0]?.dataKey
196
- updateConfig({
197
- ...config,
198
- annotations: updatedAnnotations
199
- })
200
- }}
201
- />
202
- )}
236
+ {visSupportsDataAnnotations() && annotation.anchorMode === 'data' && (
237
+ <Select
238
+ label='Series:'
239
+ value={annotation.seriesKey || config.series?.[0]?.dataKey || ''}
240
+ options={config.series.map(s => s.dataKey)}
241
+ section='annotations'
242
+ subsection={null}
243
+ fieldName='seriesKey'
244
+ updateField={(section, subsection, fieldName, value) => {
245
+ const updatedAnnotations = cloneDeep(config?.annotations)
246
+ updatedAnnotations[index].seriesKey = value || config.series?.[0]?.dataKey
247
+ updateConfig({
248
+ ...config,
249
+ annotations: updatedAnnotations
250
+ })
251
+ }}
252
+ />
253
+ )}
203
254
 
204
- <label>
205
- Opacity
206
- <br />
207
- <input
208
- type='range'
209
- onChange={e => {
210
- const updatedAnnotations = cloneDeep(config?.annotations)
211
- updatedAnnotations[index].opacity = e.target.value
212
- updateConfig({
213
- ...config,
214
- annotations: updatedAnnotations
215
- })
216
- }}
217
- value={config?.annotations?.[index]?.opacity || '100'}
218
- />
219
- </label>
255
+ <label>
256
+ Opacity
257
+ <br />
258
+ <input
259
+ type='range'
260
+ onChange={e => {
261
+ const updatedAnnotations = cloneDeep(config?.annotations)
262
+ updatedAnnotations[index].opacity = e.target.value
263
+ updateConfig({
264
+ ...config,
265
+ annotations: updatedAnnotations
266
+ })
267
+ }}
268
+ value={config?.annotations?.[index]?.opacity || '100'}
269
+ />
270
+ </label>
220
271
 
221
- <CheckBox
222
- value={config?.annotations[index]?.edit?.subject || false}
223
- section='annotations'
224
- subsection={null}
225
- fieldName={`${index}.edit.subject`}
226
- label='Edit Subject'
227
- updateField={(section, subsection, fieldName, value) => {
228
- const updatedAnnotations = cloneDeep(config?.annotations)
229
- updatedAnnotations[index].edit.subject = value
230
- updateConfig({
231
- ...config,
232
- annotations: updatedAnnotations
233
- })
234
- }}
235
- />
236
- <CheckBox
237
- value={config?.annotations[index]?.edit?.label || false}
238
- section='annotations'
239
- subsection={null}
240
- fieldName={`${index}.edit.label`}
241
- label='Edit Label'
242
- updateField={(section, subsection, fieldName, value) => {
243
- const updatedAnnotations = cloneDeep(config?.annotations)
244
- updatedAnnotations[index].edit.label = value
245
- updateConfig({
246
- ...config,
247
- annotations: updatedAnnotations
248
- })
249
- }}
250
- />
251
-
252
- <Select
253
- label='Connection Type:'
254
- value={config?.annotations[index]?.connectionType}
255
- options={['Select', 'curve', 'line', 'elbow', 'none']}
256
- section='annotations'
257
- subsection={null}
258
- fieldName='connectionType'
259
- updateField={(section, subsection, fieldName, value) => {
260
- const updatedAnnotations = cloneDeep(config?.annotations)
261
- updatedAnnotations[index].connectionType = value
262
- updateConfig({
263
- ...config,
264
- annotations: updatedAnnotations
265
- })
266
- }}
267
- />
272
+ <CheckBox
273
+ value={config?.annotations[index]?.edit?.subject || false}
274
+ section='annotations'
275
+ subsection={null}
276
+ fieldName={`${index}.edit.subject`}
277
+ label='Edit Subject'
278
+ updateField={(section, subsection, fieldName, value) => {
279
+ const updatedAnnotations = cloneDeep(config?.annotations)
280
+ updatedAnnotations[index].edit.subject = value
281
+ updateConfig({
282
+ ...config,
283
+ annotations: updatedAnnotations
284
+ })
285
+ }}
286
+ />
287
+ <CheckBox
288
+ value={config?.annotations[index]?.edit?.label || false}
289
+ section='annotations'
290
+ subsection={null}
291
+ fieldName={`${index}.edit.label`}
292
+ label='Edit Label'
293
+ updateField={(section, subsection, fieldName, value) => {
294
+ const updatedAnnotations = cloneDeep(config?.annotations)
295
+ updatedAnnotations[index].edit.label = value
296
+ updateConfig({
297
+ ...config,
298
+ annotations: updatedAnnotations
299
+ })
300
+ }}
301
+ />
268
302
 
269
- {annotation.connectionType === 'curve' && (
270
- <>
271
- <label>
272
- Curve Control
273
- {/* create a range input */}
274
- <input
275
- type='range'
276
- min='-20'
277
- max='20'
278
- value={config?.annotations[index]?.bezier || 0}
279
- onChange={e => {
303
+ <Select
304
+ label='Connection Type:'
305
+ value={config?.annotations[index]?.connectionType}
306
+ options={['Select', 'curve', 'line', 'elbow', 'none']}
307
+ section='annotations'
308
+ subsection={null}
309
+ fieldName='connectionType'
310
+ updateField={(section, subsection, fieldName, value) => {
280
311
  const updatedAnnotations = cloneDeep(config?.annotations)
281
- updatedAnnotations[index].bezier = e.target.value
312
+ updatedAnnotations[index].connectionType = value
282
313
  updateConfig({
283
314
  ...config,
284
315
  annotations: updatedAnnotations
285
316
  })
286
317
  }}
287
318
  />
288
- </label>
289
- </>
290
- )}
291
319
 
292
- <Select
293
- label='Marker'
294
- value={annotation.marker}
295
- options={['arrow', 'circle']}
296
- section='annotations'
297
- subsection={null}
298
- fieldName='marker'
299
- updateField={(section, subsection, fieldName, value) => {
300
- const updatedAnnotations = cloneDeep(config?.annotations)
301
- updatedAnnotations[index].marker = value
302
- updateConfig({
303
- ...config,
304
- annotations: updatedAnnotations
305
- })
306
- }}
307
- />
320
+ {annotation.connectionType === 'curve' && (
321
+ <>
322
+ <label>
323
+ Curve Control
324
+ {/* create a range input */}
325
+ <input
326
+ type='range'
327
+ min='-20'
328
+ max='20'
329
+ value={config?.annotations[index]?.bezier || 0}
330
+ onChange={e => {
331
+ const updatedAnnotations = cloneDeep(config?.annotations)
332
+ updatedAnnotations[index].bezier = e.target.value
333
+ updateConfig({
334
+ ...config,
335
+ annotations: updatedAnnotations
336
+ })
337
+ }}
338
+ />
339
+ </label>
340
+ </>
341
+ )}
308
342
 
309
- <Button className='btn btn-danger full-width' onClick={() => handleRemoveAnnotation(index)}>
310
- Delete Annotation
311
- </Button>
343
+ <Select
344
+ label='Marker'
345
+ value={annotation.marker}
346
+ options={['arrow', 'circle']}
347
+ section='annotations'
348
+ subsection={null}
349
+ fieldName='marker'
350
+ updateField={(section, subsection, fieldName, value) => {
351
+ const updatedAnnotations = cloneDeep(config?.annotations)
352
+ updatedAnnotations[index].marker = value
353
+ updateConfig({
354
+ ...config,
355
+ annotations: updatedAnnotations
356
+ })
357
+ }}
358
+ />
359
+ </AccordionItemPanel>
360
+ </AccordionItem>
361
+ </AccessibleAccordion>
312
362
  </div>
313
- </Accordion.Section>
314
- </Accordion>
315
- ))}
363
+ )}
364
+ </Draggable>
365
+ )}
366
+ />
316
367
  {config?.annotations?.length < 3 && (
317
- <button onClick={handleAddAnnotation} className='btn btn-primary mt-2 full-width'>
368
+ <Button variant='editor-primary' onClick={handleAddAnnotation}>
318
369
  Add Annotation
319
- </button>
370
+ </Button>
320
371
  )}
321
372
  </Accordion.Section>
322
373
  </Accordion>