@cdc/chart 4.26.6 → 4.26.10

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 (276) hide show
  1. package/CONFIG.md +504 -368
  2. package/dist/cdcchart-CYc-Kayd.es.js +22488 -0
  3. package/dist/cdcchart-DCKn8NmI.es.js +20695 -0
  4. package/dist/cdcchart-Dyui9nk_.es.js +45828 -0
  5. package/dist/cdcchart.js +4 -96498
  6. package/examples/__data__/vega-remote-data.json +6 -0
  7. package/examples/dendrogram.json +18 -0
  8. package/examples/feature/bar/bar-chart-race-annual-change.json +68 -0
  9. package/examples/feature/heatmap/average-age-categorical.json +2 -2
  10. package/examples/feature/heatmap/calendar-heatmap.json +2 -2
  11. package/examples/feature/heatmap/cell-values-bottom-axis.json +2 -2
  12. package/examples/feature/heatmap/sparse-aggregation.json +2 -2
  13. package/examples/feature/line/line-chart-race.json +50 -0
  14. package/examples/feature/sankey/sankey-example-data.json +40 -1441
  15. package/examples/feature/sankey/sankey_chart_data.csv +9 -20
  16. package/examples/network.json +31 -0
  17. package/examples/private/box-plot.json +573 -0
  18. package/examples/private/custom-color-issue.json +625 -0
  19. package/examples/private/custom-colors.json +522 -0
  20. package/examples/private/cutoff.json +10750 -0
  21. package/examples/private/flueview.json +22051 -0
  22. package/examples/private/overlay-legend.json +485 -0
  23. package/examples/private/pie-test.json +469 -0
  24. package/examples/vega-remote.json +22 -0
  25. package/package.json +11 -13
  26. package/src/CdcChart.tsx +2 -2
  27. package/src/CdcChartComponent.tsx +444 -217
  28. package/src/_stories/Chart.BarRace.stories.tsx +443 -0
  29. package/src/_stories/Chart.BoxPlotNumericSort.stories.tsx +189 -0
  30. package/src/_stories/Chart.BoxPlotStatsParity.stories.tsx +207 -0
  31. package/src/_stories/Chart.ColorDistribution.stories.tsx +299 -0
  32. package/src/_stories/Chart.DataCutoff.stories.tsx +147 -0
  33. package/src/_stories/Chart.DataTableDownloadFilename.stories.tsx +60 -0
  34. package/src/_stories/Chart.Dendrogram.stories.tsx +373 -0
  35. package/src/_stories/Chart.Forecast.CILegend.stories.tsx +236 -0
  36. package/src/_stories/Chart.HeatMap.stories.tsx +170 -4
  37. package/src/_stories/Chart.Legend.AxisAlign.stories.tsx +119 -0
  38. package/src/_stories/Chart.LineRace.stories.tsx +149 -0
  39. package/src/_stories/Chart.Network.stories.tsx +432 -0
  40. package/src/_stories/Chart.PaletteConversion.Editor.stories.tsx +208 -0
  41. package/src/_stories/Chart.Patterns.smoke.stories.tsx +31 -0
  42. package/src/_stories/Chart.PercentageValue.stories.tsx +311 -0
  43. package/src/_stories/Chart.PieLabels.stories.tsx +49 -0
  44. package/src/_stories/Chart.RankByValueMutation.stories.tsx +206 -0
  45. package/src/_stories/Chart.RequiredFields.stories.tsx +681 -0
  46. package/src/_stories/Chart.Sankey.stories.tsx +417 -0
  47. package/src/_stories/Chart.SeriesColorAssignments.stories.tsx +47 -0
  48. package/src/_stories/Chart.SmallMultiplesNumericTileOrder.stories.tsx +137 -0
  49. package/src/_stories/Chart.TooltipSeriesLabels.stories.tsx +43 -0
  50. package/src/_stories/Chart.VegaRemoteData.stories.tsx +31 -0
  51. package/src/_stories/Chart.smoke.stories.tsx +14 -1
  52. package/src/_stories/ChartAnnotation.Editor.stories.tsx +78 -0
  53. package/src/_stories/ChartAxisTitles.smoke.stories.tsx +48 -0
  54. package/src/_stories/ChartBar.Editor.stories.tsx +499 -57
  55. package/src/_stories/ChartBrush.Editor.stories.tsx +46 -67
  56. package/src/_stories/ChartBrush.Regression.stories.tsx +135 -0
  57. package/src/_stories/ChartEditor.Editor.stories.tsx +33 -3
  58. package/src/_stories/ChartLine.EffectCompatibility.stories.tsx +120 -0
  59. package/src/_stories/ChartPrefixSuffix.smoke.stories.tsx +28 -1
  60. package/src/_stories/_mock/annotation_event-line_mock.json +2 -2
  61. package/src/_stories/_mock/editor-test-configs.json +20 -10
  62. package/src/_stories/_mock/editor-test-datasets.json +38 -42
  63. package/src/_stories/_mock/heatmap-average-age-categorical.json +2 -2
  64. package/src/_stories/_mock/heatmap.json +2 -2
  65. package/src/_stories/_mock/legend-axis-align-stacked-bar.json +125 -0
  66. package/src/_stories/_mock/sankey_mock.json +23 -27
  67. package/src/components/Annotations/components/AnnotationDraggable.styles.css +52 -0
  68. package/src/components/Annotations/components/AnnotationDraggable.tsx +639 -139
  69. package/src/components/Annotations/components/AnnotationDropdown.styles.css +44 -4
  70. package/src/components/Annotations/components/AnnotationDropdown.tsx +10 -32
  71. package/src/components/Annotations/helpers/resolveAnnotationLayout.ts +212 -0
  72. package/src/components/Annotations/tests/AnnotationDraggable.test.tsx +612 -19
  73. package/src/components/Annotations/tests/AnnotationDropdown.test.tsx +50 -0
  74. package/src/components/Annotations/tests/resolveAnnotationLayout.test.ts +203 -0
  75. package/src/components/Axis/BottomAxis.tsx +1 -1
  76. package/src/components/Axis/Categorical.Axis.tsx +3 -3
  77. package/src/components/Axis/RightAxis.tsx +21 -13
  78. package/src/components/BarChart/components/BarChart.Horizontal.tsx +39 -8
  79. package/src/components/BarChart/components/BarChart.StackedHorizontal.tsx +13 -4
  80. package/src/components/BarChart/components/BarChart.StackedVertical.test.ts +28 -0
  81. package/src/components/BarChart/components/BarChart.StackedVertical.tsx +30 -26
  82. package/src/components/BarChart/components/BarChart.Vertical.tsx +38 -28
  83. package/src/components/BarChart/components/PortionPatternOverlay.tsx +61 -0
  84. package/src/components/BarChart/components/context.tsx +6 -0
  85. package/src/components/BarChart/helpers/getBarData.ts +28 -28
  86. package/src/components/BarChart/helpers/getBarHeights.ts +2 -2
  87. package/src/components/BarChart/helpers/getPatternUrl.ts +2 -5
  88. package/src/components/BarChart/helpers/index.ts +8 -0
  89. package/src/components/BarChart/helpers/portionPattern.ts +243 -0
  90. package/src/components/BarChart/helpers/tests/addMinimumBarHeights.test.ts +42 -0
  91. package/src/components/BarChart/helpers/tests/getPatternUrl.test.ts +13 -0
  92. package/src/components/BarChart/helpers/tests/portionPattern.test.ts +280 -0
  93. package/src/components/BarChart/helpers/tests/useBarChart.test.tsx +202 -0
  94. package/src/components/BarChart/helpers/useBarChart.ts +60 -60
  95. package/src/components/BarChartRace/BarChartRace.test.tsx +199 -0
  96. package/src/components/BarChartRace/BarChartRace.tsx +230 -0
  97. package/src/components/BarChartRace/BarChartRaceFallback.test.tsx +61 -0
  98. package/src/components/BarChartRace/BarChartRaceFallback.tsx +48 -0
  99. package/src/components/BarChartRace/bar-chart-race.css +160 -0
  100. package/src/components/BarChartRace/helpers.test.ts +114 -0
  101. package/src/components/BarChartRace/helpers.ts +185 -0
  102. package/src/components/BarChartRace/index.ts +3 -0
  103. package/src/components/BoxPlot/BoxPlot.Horizontal.tsx +7 -6
  104. package/src/components/BoxPlot/BoxPlot.Vertical.tsx +9 -7
  105. package/src/components/BoxPlot/helpers/index.ts +13 -83
  106. package/src/components/Brush/BrushSelector.tsx +10 -24
  107. package/src/components/Brush/MiniChartPreview.tsx +33 -1
  108. package/src/components/Dendrogram/components/Dendrogram.tsx +374 -0
  109. package/src/components/Dendrogram/dendrogram.css +113 -0
  110. package/src/components/Dendrogram/helpers/layoutDendrogram.test.ts +95 -0
  111. package/src/components/Dendrogram/helpers/layoutDendrogram.ts +56 -0
  112. package/src/components/Dendrogram/helpers/prepareDendrogramData.test.ts +135 -0
  113. package/src/components/Dendrogram/helpers/prepareDendrogramData.ts +166 -0
  114. package/src/components/Dendrogram/helpers/resolveDendrogramLabels.test.ts +196 -0
  115. package/src/components/Dendrogram/helpers/resolveDendrogramLabels.ts +418 -0
  116. package/src/components/Dendrogram/index.tsx +1 -0
  117. package/src/components/Dendrogram/types/index.ts +66 -0
  118. package/src/components/EditorPanel/EditorPanel.tsx +1111 -805
  119. package/src/components/EditorPanel/components/Panels/Panel.Annotate.tsx +50 -5
  120. package/src/components/EditorPanel/components/Panels/Panel.Dendrogram.css +10 -0
  121. package/src/components/EditorPanel/components/Panels/Panel.Dendrogram.tsx +211 -0
  122. package/src/components/EditorPanel/components/Panels/Panel.ForestPlotSettings.tsx +19 -8
  123. package/src/components/EditorPanel/components/Panels/Panel.General.tsx +104 -61
  124. package/src/components/EditorPanel/components/Panels/Panel.Network.css +9 -0
  125. package/src/components/EditorPanel/components/Panels/Panel.Network.tsx +202 -0
  126. package/src/components/EditorPanel/components/Panels/Panel.PatternSettings.tsx +236 -36
  127. package/src/components/EditorPanel/components/Panels/Panel.Radar.tsx +6 -1
  128. package/src/components/EditorPanel/components/Panels/Panel.Sankey.tsx +89 -105
  129. package/src/components/EditorPanel/components/Panels/Panel.Series.tsx +21 -6
  130. package/src/components/EditorPanel/components/Panels/Panel.SmallMultiples.tsx +1 -1
  131. package/src/components/EditorPanel/components/Panels/Panel.Visual.tsx +8 -66
  132. package/src/components/EditorPanel/components/Panels/RacingControls.test.tsx +131 -0
  133. package/src/components/EditorPanel/components/Panels/RacingControls.tsx +185 -0
  134. package/src/components/EditorPanel/components/Panels/SeriesColorAssignments.tsx +2 -2
  135. package/src/components/EditorPanel/components/Panels/index.tsx +4 -0
  136. package/src/components/EditorPanel/helpers/getVisualizationTypeConfigUpdate.ts +20 -7
  137. package/src/components/EditorPanel/helpers/tests/getVisualizationTypeConfigUpdate.test.ts +25 -2
  138. package/src/components/EditorPanel/helpers/updateFieldRankByValue.ts +5 -4
  139. package/src/components/EditorPanel/useEditorPermissions.test.tsx +94 -0
  140. package/src/components/EditorPanel/useEditorPermissions.ts +75 -25
  141. package/src/components/Forecasting/Forecasting.tsx +16 -7
  142. package/src/components/HeatMap/components/HeatMap.tsx +511 -178
  143. package/src/components/HeatMap/heatmap.constants.ts +7 -3
  144. package/src/components/HeatMap/heatmap.css +101 -2
  145. package/src/components/HeatMap/helpers/layout.ts +80 -0
  146. package/src/components/HeatMap/tests/HeatMap.test.tsx +339 -16
  147. package/src/components/HeatMap/tests/helpers.test.ts +79 -0
  148. package/src/components/Legend/Legend.Component.tsx +163 -148
  149. package/src/components/Legend/Legend.Suppression.tsx +3 -3
  150. package/src/components/Legend/LegendGroup/LegendGroup.styles.css +7 -0
  151. package/src/components/Legend/LegendGroup/LegendGroup.tsx +47 -35
  152. package/src/components/Legend/helpers/createFormatLabels.test.ts +226 -0
  153. package/src/components/Legend/helpers/createFormatLabels.tsx +45 -51
  154. package/src/components/LineChart/components/LineChart.Circle.tsx +3 -3
  155. package/src/components/LineChart/helpers.test.ts +126 -38
  156. package/src/components/LineChart/helpers.ts +9 -6
  157. package/src/components/LineChart/index.tsx +71 -27
  158. package/src/components/LineChart/tests/LineChart.test.tsx +630 -0
  159. package/src/components/LineChartRace/LineChartRace.test.tsx +275 -0
  160. package/src/components/LineChartRace/LineChartRace.tsx +134 -0
  161. package/src/components/LineChartRace/LineChartRaceFallback.tsx +28 -0
  162. package/src/components/LineChartRace/helpers.test.ts +88 -0
  163. package/src/components/LineChartRace/helpers.ts +157 -0
  164. package/src/components/LineChartRace/index.ts +3 -0
  165. package/src/components/LineChartRace/line-chart-race.css +16 -0
  166. package/src/components/LinearChart/ValueAxisAnchors.tsx +58 -0
  167. package/src/components/LinearChart/VisualizationRenderer.tsx +18 -23
  168. package/src/components/LinearChart/tests/LinearChart.test.tsx +412 -13
  169. package/src/components/LinearChart/tests/VisualizationRenderer.test.tsx +141 -0
  170. package/src/components/LinearChart/tests/mockConfigContext.ts +2 -1
  171. package/src/components/LinearChart.tsx +85 -54
  172. package/src/components/Network/components/Network.tsx +372 -0
  173. package/src/components/Network/helpers/layoutNetwork.test.ts +68 -0
  174. package/src/components/Network/helpers/layoutNetwork.ts +87 -0
  175. package/src/components/Network/helpers/prepareNetworkData.test.ts +116 -0
  176. package/src/components/Network/helpers/prepareNetworkData.ts +101 -0
  177. package/src/components/Network/helpers/resolveNetworkLabels.test.ts +112 -0
  178. package/src/components/Network/helpers/resolveNetworkLabels.ts +206 -0
  179. package/src/components/Network/index.tsx +3 -0
  180. package/src/components/Network/network.css +107 -0
  181. package/src/components/Network/types/index.ts +56 -0
  182. package/src/components/PairedBarChart.jsx +5 -10
  183. package/src/components/PairedBarChart.test.tsx +71 -0
  184. package/src/components/PieChart/PieChart.tsx +121 -13
  185. package/src/components/PieChart/helpers/labelPlacement.test.ts +88 -0
  186. package/src/components/PieChart/helpers/labelPlacement.ts +95 -0
  187. package/src/components/RacingChartRenderer.tsx +44 -0
  188. package/src/components/Regions/components/Regions.test.tsx +179 -0
  189. package/src/components/Regions/components/Regions.tsx +104 -69
  190. package/src/components/Regions/index.tsx +2 -3
  191. package/src/components/Sankey/components/Sankey.tsx +264 -437
  192. package/src/components/Sankey/helpers/getSankeyTooltip.ts +12 -0
  193. package/src/components/Sankey/helpers/prepareSankeyData.test.ts +71 -0
  194. package/src/components/Sankey/helpers/prepareSankeyData.ts +90 -0
  195. package/src/components/Sankey/sankey.scss +57 -116
  196. package/src/components/Sankey/types/index.ts +41 -4
  197. package/src/components/ScatterPlot/ScatterPlot.jsx +28 -12
  198. package/src/components/ScatterPlot/ScatterPlot.test.tsx +60 -0
  199. package/src/components/SmallMultiples/SmallMultiples.tsx +12 -12
  200. package/src/components/SmallMultiples/tests/SmallMultipleTile.test.tsx +7 -5
  201. package/src/components/raceTiming.ts +18 -0
  202. package/src/data/initial-state.js +79 -31
  203. package/src/helpers/applyChartTypeContract.ts +71 -0
  204. package/src/helpers/axisLabelFontSize.ts +2 -2
  205. package/src/helpers/boxPlotStats.ts +60 -0
  206. package/src/helpers/bumpChartTooltip.ts +2 -1
  207. package/src/helpers/calculateHorizontalBarCategoryLabelWidth.test.ts +37 -0
  208. package/src/helpers/calculateHorizontalBarCategoryLabelWidth.ts +3 -2
  209. package/src/helpers/calculateRightYAxisWidth.ts +60 -0
  210. package/src/helpers/categoryOrder.ts +60 -0
  211. package/src/helpers/colorAssignmentHelpers.ts +2 -2
  212. package/src/helpers/createNewChartConfig.ts +56 -0
  213. package/src/helpers/dataDrivenYAxisCategories.ts +18 -0
  214. package/src/helpers/forecastLegend.ts +88 -0
  215. package/src/helpers/getBoxPlotConfig.ts +26 -38
  216. package/src/helpers/getChartTypeDefaultPalette.ts +29 -0
  217. package/src/helpers/getColorCodeCategoryColorMap.ts +26 -0
  218. package/src/helpers/getColorScale.ts +31 -22
  219. package/src/helpers/getComboChartConfig.ts +0 -1
  220. package/src/helpers/getDynamicYAxisCategories.ts +69 -0
  221. package/src/helpers/getExcludedData.ts +0 -1
  222. package/src/helpers/getHasBoundarySuppression.ts +4 -3
  223. package/src/helpers/getMinMax.ts +11 -8
  224. package/src/helpers/getNewRuntime.ts +4 -3
  225. package/src/helpers/getPiePercent.ts +3 -3
  226. package/src/helpers/getStackedSeriesMax.ts +51 -0
  227. package/src/helpers/getV21ChartDistributionColors.ts +57 -0
  228. package/src/helpers/handleRankByValue.ts +15 -15
  229. package/src/helpers/isConvertLineToBarGraph.ts +2 -2
  230. package/src/helpers/seriesColumnSettings.ts +31 -3
  231. package/src/helpers/sizeHelpers.ts +4 -5
  232. package/src/helpers/smallMultiplesHelpers.ts +10 -13
  233. package/src/helpers/tests/applyChartTypeContract.test.ts +37 -0
  234. package/src/helpers/tests/boxPlotStats.test.ts +31 -0
  235. package/src/helpers/tests/bumpChartTooltip.test.ts +29 -0
  236. package/src/helpers/tests/calculateRightYAxisWidth.test.ts +105 -0
  237. package/src/helpers/tests/categoryOrder.test.ts +57 -0
  238. package/src/helpers/tests/countNumOfTicks.test.ts +11 -0
  239. package/src/helpers/tests/createNewChartConfig.test.ts +182 -0
  240. package/src/helpers/tests/getBoxPlotConfig.test.ts +70 -0
  241. package/src/helpers/tests/getColorCodeCategoryColorMap.test.ts +113 -0
  242. package/src/helpers/tests/getColorScale.test.ts +226 -1
  243. package/src/helpers/tests/getDynamicYAxisCategories.test.ts +61 -0
  244. package/src/helpers/tests/getMinMax.test.ts +41 -0
  245. package/src/helpers/tests/getStackedSeriesMax.test.ts +26 -0
  246. package/src/helpers/tests/handleRankByValue.test.ts +55 -37
  247. package/src/helpers/tests/seriesColumnSettings.test.ts +83 -0
  248. package/src/helpers/tests/smallMultiplesHelpers.test.ts +37 -1
  249. package/src/helpers/tests/tooltipHelpers.test.ts +80 -0
  250. package/src/helpers/tooltipHelpers.ts +16 -0
  251. package/src/hooks/tests/useRightAxis.test.tsx +143 -2
  252. package/src/hooks/tests/useScales.test.tsx +3 -6
  253. package/src/hooks/tests/useTooltip.test.tsx +484 -0
  254. package/src/hooks/usePrefersReducedMotion.ts +22 -0
  255. package/src/hooks/useReduceData.ts +4 -36
  256. package/src/hooks/useRightAxis.ts +19 -26
  257. package/src/hooks/useScales.ts +15 -0
  258. package/src/hooks/useTooltip.tsx +106 -71
  259. package/src/scss/main.scss +74 -2
  260. package/src/store/chart.reducer.ts +4 -4
  261. package/src/test/CdcChart.dataTable.test.tsx +582 -14
  262. package/src/test/CdcChart.dendrogram.test.tsx +277 -0
  263. package/src/test/CdcChart.finalization.test.tsx +143 -0
  264. package/src/test/CdcChart.network.test.tsx +271 -0
  265. package/src/types/ChartConfig.ts +91 -54
  266. package/src/types/ChartContext.ts +5 -0
  267. package/src/types/Horizon.ts +1 -1
  268. package/LICENSE +0 -201
  269. package/dist/cdcchart-BWVIUcAF.es.js +0 -4802
  270. package/src/_stories/Chart.Sankey.smoke.stories.tsx +0 -62
  271. package/src/components/Sankey/components/ColumnList.tsx +0 -19
  272. package/src/components/Sankey/helpers/getSankeyTooltip.tsx +0 -34
  273. package/src/components/Sankey/useSankeyAlert.tsx +0 -60
  274. package/src/data/legacy-defaults.ts +0 -18
  275. package/src/helpers/ensureSpecialChartAxisTypes.ts +0 -11
  276. package/src/helpers/tests/ensureSpecialChartAxisTypes.test.ts +0 -30
@@ -8,6 +8,7 @@ import { hasVisibleVizFilters } from '@cdc/core/helpers/filterVisibility'
8
8
  export const useEditorPermissions = () => {
9
9
  const { config, isDashboard } = useContext(ConfigContext)
10
10
  const { visualizationType, series, orientation, visualizationSubType } = config
11
+ const isBarRace = visualizationType === 'Bar' && visualizationSubType === 'racing'
11
12
 
12
13
  // Overall support for the chart types
13
14
  // prettier-ignore
@@ -29,11 +30,13 @@ export const useEditorPermissions = () => {
29
30
  'Scatter Plot',
30
31
  'Spark Line',
31
32
  'Sankey',
33
+ 'Network',
34
+ 'Dendrogram',
32
35
  'Warming Stripes'
33
36
  ]
34
37
 
35
38
  const visSupportsDateCategoryAxis = () => {
36
- const disabledCharts = ['Forest Plot', 'Radar', 'Sankey']
39
+ const disabledCharts = ['Forest Plot', 'Radar', 'Sankey', 'Network', 'Dendrogram']
37
40
  if (disabledCharts.includes(visualizationType)) return false
38
41
  return true
39
42
  }
@@ -82,9 +85,10 @@ export const useEditorPermissions = () => {
82
85
  'Forest Plot',
83
86
  'HeatMap',
84
87
  'Horizon Chart',
85
- 'Pie',
86
88
  'Radar',
87
89
  'Sankey',
90
+ 'Network',
91
+ 'Dendrogram',
88
92
  'Scatter Plot',
89
93
  'Spark Line',
90
94
  'Warming Stripes'
@@ -102,6 +106,8 @@ export const useEditorPermissions = () => {
102
106
  'HeatMap',
103
107
  'Radar',
104
108
  'Sankey',
109
+ 'Network',
110
+ 'Dendrogram',
105
111
  'Scatter Plot',
106
112
  'Spark Line',
107
113
  'Warming Stripes'
@@ -111,6 +117,7 @@ export const useEditorPermissions = () => {
111
117
  }
112
118
 
113
119
  const visHasLegend = () => {
120
+ if (isBarRace) return false
114
121
  switch (visualizationType) {
115
122
  case 'Box Plot':
116
123
  return true
@@ -121,7 +128,10 @@ export const useEditorPermissions = () => {
121
128
  case 'Spark Line':
122
129
  return false
123
130
  case 'Sankey':
131
+ case 'Dendrogram':
124
132
  return false
133
+ case 'Network':
134
+ return true
125
135
  case 'Warming Stripes':
126
136
  return true
127
137
  default:
@@ -131,10 +141,13 @@ export const useEditorPermissions = () => {
131
141
 
132
142
  const visHasNumbersOnBars = () => {
133
143
  if (visualizationType === 'Forest Plot') return false
144
+ const barRaceUsesDefaultLabelPlacement =
145
+ visualizationType === 'Bar' && config.visualizationSubType === 'racing' && !config.yAxis.labelPlacement
134
146
  if (
135
147
  config.orientation === 'horizontal' &&
136
148
  (config.yAxis.labelPlacement === 'Below Bar' ||
137
149
  config.yAxis.labelPlacement === 'On Date/Category Axis' ||
150
+ barRaceUsesDefaultLabelPlacement ||
138
151
  config.visualizationType === 'Paired Bar' ||
139
152
  config.visualizationType === 'Deviation Bar')
140
153
  )
@@ -148,6 +161,7 @@ export const useEditorPermissions = () => {
148
161
  }
149
162
 
150
163
  const visHasAnchors = () => {
164
+ if (isBarRace) return false
151
165
  switch (visualizationType) {
152
166
  case 'Area Chart':
153
167
  return true
@@ -180,6 +194,7 @@ export const useEditorPermissions = () => {
180
194
  }
181
195
 
182
196
  const visHasBarBorders = () => {
197
+ if (isBarRace) return false
183
198
  const disabledCharts = ['Box Plot', 'Scatter Plot', 'Pie', 'Line']
184
199
  if (disabledCharts.includes(visualizationType)) return false
185
200
  return series?.some(
@@ -192,6 +207,8 @@ export const useEditorPermissions = () => {
192
207
  case 'Warming Stripes':
193
208
  return false
194
209
  case 'Sankey':
210
+ case 'Network':
211
+ case 'Dendrogram':
195
212
  return false
196
213
  case 'Forest Plot':
197
214
  return false
@@ -211,7 +228,9 @@ export const useEditorPermissions = () => {
211
228
  'Forest Plot',
212
229
  'HeatMap',
213
230
  'Spark Line',
214
- 'Warming Stripes'
231
+ 'Warming Stripes',
232
+ 'Network',
233
+ 'Dendrogram'
215
234
  ].includes(visualizationType)
216
235
  const visHasLegendAxisAlign = () => {
217
236
  return visualizationType === 'Bar' && visualizationSubType === 'stacked' && config.legend.behavior === 'isolate'
@@ -221,7 +240,7 @@ export const useEditorPermissions = () => {
221
240
  }
222
241
 
223
242
  const visSupportsTooltipOpacity = () => {
224
- const disabledCharts = ['HeatMap', 'Spark Line', 'Sankey', 'Warming Stripes']
243
+ const disabledCharts = ['HeatMap', 'Spark Line', 'Sankey', 'Network', 'Dendrogram', 'Warming Stripes']
225
244
  if (disabledCharts.includes(visualizationType)) return false
226
245
  return true
227
246
  }
@@ -233,60 +252,84 @@ export const useEditorPermissions = () => {
233
252
  }
234
253
 
235
254
  const visSupportsSequentialPallete = () => {
236
- const disabledCharts = ['Line', 'Paired Bar', 'Deviation Bar', 'Forest Plot', 'Forecasting', 'Sankey']
255
+ const disabledCharts = ['Paired Bar', 'Deviation Bar', 'Forest Plot', 'Forecasting', 'Network', 'Dendrogram']
237
256
  if (disabledCharts.includes(visualizationType)) return false
238
257
  return true
239
258
  }
240
259
 
241
260
  const visSupportsNonSequentialPallete = () => {
242
- const disabledCharts = ['HeatMap', 'Paired Bar', 'Deviation Bar', 'Forest Plot', 'Forecasting', 'Sankey']
261
+ const disabledCharts = [
262
+ 'HeatMap',
263
+ 'Paired Bar',
264
+ 'Deviation Bar',
265
+ 'Forest Plot',
266
+ 'Forecasting',
267
+ 'Sankey',
268
+ 'Network',
269
+ 'Dendrogram'
270
+ ]
243
271
  if (disabledCharts.includes(visualizationType)) return false
244
272
  return true
245
273
  }
246
274
 
247
275
  const visSupportsReverseColorPalette = () => {
248
- const disabledCharts = ['Forest Plot', 'Paired Bar', 'Deviation Bar', 'Sankey']
276
+ const disabledCharts = ['Forest Plot', 'Paired Bar', 'Deviation Bar', 'Sankey', 'Network', 'Dendrogram']
249
277
  if (disabledCharts.includes(visualizationType)) return false
250
278
  return true
251
279
  }
252
280
 
253
281
  const visSupportsDateCategoryAxisLabel = () => {
254
- const disabledCharts = ['Forest Plot', 'HeatMap', 'Spark Line', 'Bump Chart', 'Warming Stripes']
282
+ if (isBarRace) return false
283
+ const disabledCharts = [
284
+ 'Forest Plot',
285
+ 'HeatMap',
286
+ 'Spark Line',
287
+ 'Bump Chart',
288
+ 'Network',
289
+ 'Dendrogram',
290
+ 'Warming Stripes'
291
+ ]
255
292
  if (disabledCharts.includes(visualizationType)) return false
256
293
  return true
257
294
  }
258
295
 
259
296
  const visSupportsDateCategoryAxisLine = () => {
260
- const disabledCharts = ['Forest Plot', 'Spark Line', 'Warming Stripes']
297
+ if (isBarRace) return false
298
+ const disabledCharts = ['Forest Plot', 'Spark Line', 'Network', 'Dendrogram', 'Warming Stripes']
261
299
  if (disabledCharts.includes(visualizationType)) return false
262
300
  return true
263
301
  }
264
302
 
265
303
  const visSupportsDateCategoryAxisTicks = () => {
266
- const disabledCharts = ['Forest Plot', 'Spark Line', 'Warming Stripes']
304
+ if (isBarRace) return false
305
+ const disabledCharts = ['Forest Plot', 'Spark Line', 'Network', 'Dendrogram', 'Warming Stripes']
267
306
  if (disabledCharts.includes(visualizationType)) return false
268
307
  return true
269
308
  }
270
309
 
271
310
  const visSupportsDateCategoryTickRotation = () => {
272
- const disabledCharts = ['Spark Line']
311
+ if (isBarRace) return false
312
+ const disabledCharts = ['Spark Line', 'Network', 'Dendrogram']
273
313
  if (disabledCharts.includes(visualizationType)) return false
274
314
  return true
275
315
  }
276
316
 
277
317
  const visSupportsDateCategoryNumTicks = () => {
278
- const disabledCharts = ['HeatMap', 'Spark Line']
318
+ if (isBarRace) return false
319
+ const disabledCharts = ['Spark Line', 'Network', 'Dendrogram']
279
320
  if (disabledCharts.includes(visualizationType)) return false
280
321
  return true
281
322
  }
282
323
 
283
324
  const visSupportsResponsiveTicks = () => {
284
- const disabledCharts = ['HeatMap', 'Spark Line']
325
+ if (isBarRace) return false
326
+ const disabledCharts = ['HeatMap', 'Spark Line', 'Network', 'Dendrogram']
285
327
  if (disabledCharts.includes(visualizationType)) return false
286
328
  return true
287
329
  }
288
330
 
289
331
  const visSupportsRegions = () => {
332
+ if (isBarRace) return false
290
333
  const disabledCharts = [
291
334
  'Forest Plot',
292
335
  'Horizon Chart',
@@ -296,6 +339,8 @@ export const useEditorPermissions = () => {
296
339
  'Radar',
297
340
  'Spark Line',
298
341
  'Sankey',
342
+ 'Network',
343
+ 'Dendrogram',
299
344
  'Warming Stripes'
300
345
  ]
301
346
  if (disabledCharts.includes(visualizationType)) return false
@@ -303,13 +348,13 @@ export const useEditorPermissions = () => {
303
348
  }
304
349
 
305
350
  const visSupportsValueAxisMax = () => {
306
- const disabledCharts = ['Forest Plot', 'HeatMap']
351
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Network', 'Dendrogram']
307
352
  if (disabledCharts.includes(visualizationType)) return false
308
353
  return true
309
354
  }
310
355
 
311
356
  const visSupportsValueAxisMin = () => {
312
- const disabledCharts = ['Forest Plot', 'HeatMap']
357
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Network', 'Dendrogram']
313
358
  if (disabledCharts.includes(visualizationType)) return false
314
359
  return true
315
360
  }
@@ -342,47 +387,47 @@ export const useEditorPermissions = () => {
342
387
  }
343
388
 
344
389
  const visSupportsValueAxisGridLines = () => {
345
- const disabledCharts = ['Forest Plot', 'HeatMap']
390
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Network', 'Dendrogram']
346
391
  if (disabledCharts.includes(visualizationType)) return false
347
392
  return true
348
393
  }
349
394
 
350
395
  // implement later
351
396
  const visSupportsValueAxisTicks = () => {
352
- const disabledCharts = ['Forest Plot', 'HeatMap']
397
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Network', 'Dendrogram']
353
398
  if (disabledCharts.includes(visualizationType)) return false
354
399
  return true
355
400
  }
356
401
 
357
402
  // implement later
358
403
  const visSupportsValueAxisLine = () => {
359
- const disabledCharts = ['Forest Plot']
404
+ const disabledCharts = ['Forest Plot', 'Network', 'Dendrogram']
360
405
  if (disabledCharts.includes(visualizationType)) return false
361
406
  return true
362
407
  }
363
408
 
364
409
  // implement later
365
410
  const visSupportsValueAxisLabels = () => {
366
- const disabledCharts = ['Forest Plot', 'HeatMap', 'Bump Chart']
411
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Bump Chart', 'Network', 'Dendrogram']
367
412
  if (disabledCharts.includes(visualizationType)) return false
368
413
  return true
369
414
  }
370
415
 
371
416
  const visSupportsBarSpace = () => {
372
- const disabledCharts = ['Forest Plot']
417
+ const disabledCharts = ['Forest Plot', 'Network', 'Dendrogram']
373
418
  if (disabledCharts.includes(visualizationType)) return false
374
419
  if (orientation === 'horizontal' || visualizationType === 'Paired Bar') return true
375
420
  return false
376
421
  }
377
422
 
378
423
  const visSupportsBarThickness = () => {
379
- const disabledCharts = ['Forest Plot', 'HeatMap', 'Warming Stripes']
424
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Network', 'Dendrogram', 'Warming Stripes']
380
425
  if (disabledCharts.includes(visualizationType)) return false
381
426
  return true
382
427
  }
383
428
 
384
429
  const visSupportsChartHeight = () => {
385
- const disabledCharts = ['Spark Line', 'Warming Stripes']
430
+ const disabledCharts = ['Spark Line', 'Network', 'Dendrogram', 'Warming Stripes']
386
431
  if (disabledCharts.includes(visualizationType)) return false
387
432
  return true
388
433
  }
@@ -394,19 +439,23 @@ export const useEditorPermissions = () => {
394
439
  }
395
440
 
396
441
  const visSupportsLeftValueAxis = () => {
397
- const disabledCharts = ['Radar', 'Spark Line', 'Sankey', 'Warming Stripes']
442
+ const disabledCharts = ['Radar', 'Spark Line', 'Sankey', 'Network', 'Dendrogram', 'Warming Stripes']
398
443
  if (disabledCharts.includes(visualizationType)) return false
399
444
  return true
400
445
  }
401
446
 
447
+ const visSupportsRightValueAxis = () => {
448
+ return visualizationType === 'Combo' && orientation === 'vertical'
449
+ }
450
+
402
451
  const visSupportsRankByValue = () => {
403
- const disabledCharts = ['HeatMap', 'Spark Line']
452
+ const disabledCharts = ['HeatMap', 'Spark Line', 'Network', 'Dendrogram']
404
453
  if (disabledCharts.includes(visualizationType)) return false
405
454
  return true
406
455
  }
407
456
 
408
457
  const visSupportsDateCategoryHeight = () => {
409
- const disabledCharts = ['HeatMap', 'Spark Line', 'Sankey', 'Bump Chart']
458
+ const disabledCharts = ['HeatMap', 'Spark Line', 'Sankey', 'Network', 'Dendrogram', 'Bump Chart']
410
459
  if (disabledCharts.includes(visualizationType)) return false
411
460
  if (config.orientation !== 'horizontal') return false
412
461
  if (config.orientation === 'horizontal' && visualizationType === 'Bar' && !config.isLollipopChart) return false
@@ -530,6 +579,7 @@ export const useEditorPermissions = () => {
530
579
  visSupportsReactTooltip,
531
580
  visSupportsRegions,
532
581
  visSupportsResponsiveTicks,
582
+ visSupportsRightValueAxis,
533
583
  visSupportsReverseColorPalette,
534
584
  visSupportsSequentialPallete,
535
585
  visSupportsSeriesColorAssignments,
@@ -1,13 +1,18 @@
1
1
  import React, { useContext, useMemo } from 'react'
2
- import { replace } from 'lodash'
2
+ import replace from 'lodash/replace'
3
3
  // cdc
4
4
  import ConfigContext from '../../ConfigContext'
5
5
  import ErrorBoundary from '@cdc/core/components/ErrorBoundary'
6
6
  import { colorPalettesChartV2, sequentialPalettes } from '@cdc/core/data/colorPalettes'
7
7
  import { updatePaletteNames } from '@cdc/core/helpers/updatePaletteNames'
8
- import { getColorPaletteVersion } from '@cdc/core/helpers/getColorPaletteVersion'
8
+ import { getColorPaletteMajorVersion } from '@cdc/core/helpers/getColorPaletteMajorVersion'
9
9
  import { getBridgedData } from '../../helpers/getBridgedData'
10
10
  import { buildForecastPaletteMappings } from '../../helpers/buildForecastPaletteMappings'
11
+ import {
12
+ getForecastConfidenceIntervalKey,
13
+ getForecastLegendKey,
14
+ isForecastLegendSelectionActive
15
+ } from '../../helpers/forecastLegend'
11
16
 
12
17
  // visx & d3
13
18
  import { curveMonotoneX } from '@visx/curve'
@@ -119,7 +124,7 @@ const Forecasting = ({ xScale, yScale, height, width, yAxisWidth, handleTooltipM
119
124
  const forecastingPalettes = useMemo(() => {
120
125
  // Determine palette version from config
121
126
  // Forecasting charts use sequentialPalettes for v1, sequential-only palettes for v2
122
- const paletteVersion = getColorPaletteVersion(config)
127
+ const paletteVersion = getColorPaletteMajorVersion(config)
123
128
 
124
129
  let forecastPalettes
125
130
  if (paletteVersion === 1) {
@@ -148,10 +153,6 @@ const Forecasting = ({ xScale, yScale, height, width, yAxisWidth, handleTooltipM
148
153
  if (!group || !group.stages) return false
149
154
  return group.stages.map((stage, stageIndex) => {
150
155
  const { behavior } = legend
151
- let transparentArea =
152
- behavior === 'highlight' && seriesHighlight.length > 0 && seriesHighlight.indexOf(stage.key) === -1
153
- let displayArea =
154
- behavior === 'highlight' || seriesHighlight.length === 0 || seriesHighlight.indexOf(stage.key) !== -1
155
156
  const bridgedData = getBridgedData(stage.key, group.stageColumn, rawData)
156
157
 
157
158
  return (
@@ -162,6 +163,10 @@ const Forecasting = ({ xScale, yScale, height, width, yAxisWidth, handleTooltipM
162
163
  {group.confidenceIntervals?.map((ciGroup, ciGroupIndex) => {
163
164
  const palette = forecastingPalettes[stage.color] || false
164
165
  const isReversed = stage.color?.toLowerCase().includes('reverse')
166
+ const intervalKey = getForecastConfidenceIntervalKey(group.confidenceIntervals, ciGroupIndex)
167
+ const isActive = isForecastLegendSelectionActive(seriesHighlight, stage.key, intervalKey)
168
+ const transparentArea = behavior === 'highlight' && seriesHighlight.length > 0 && !isActive
169
+ const displayArea = behavior === 'highlight' || isActive
165
170
 
166
171
  const getFill = () => {
167
172
  if (displayArea) return palette?.[2] || 'transparent'
@@ -186,6 +191,10 @@ const Forecasting = ({ xScale, yScale, height, width, yAxisWidth, handleTooltipM
186
191
  / /g,
187
192
  '—'
188
193
  )}--group-${stageIndex}-${ciGroupIndex}`}
194
+ data-forecast-legend-key={
195
+ intervalKey ? getForecastLegendKey(stage.key, intervalKey) : stage.key
196
+ }
197
+ data-forecast-active={isActive ? 'true' : 'false'}
189
198
  >
190
199
  {dataSegments.map((segment, segmentIndex) => (
191
200
  <Group key={`segment-${segmentIndex}`}>