@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
@@ -1,25 +1,39 @@
1
- import React, { useContext, useState } from 'react'
1
+ import React, { useContext } from 'react'
2
2
  import ConfigContext from '../../../ConfigContext'
3
3
  import { BarStack } from '@visx/shape'
4
4
  import { Group } from '@visx/group'
5
5
  import { PatternLines, PatternCircles, PatternWaves } from '@visx/pattern'
6
6
  import BarChartContext from './context'
7
- import Regions from '../../Regions'
8
7
  import { addMinimumBarHeights } from '../helpers'
9
8
 
10
9
  import createBarElement from '@cdc/core/components/createBarElement'
10
+ import { getSeriesValueLabel } from '@cdc/core/helpers/getSeriesName'
11
11
  import { getPatternUrl as getPatternUrlForBar } from '../helpers/getPatternUrl'
12
12
  import { getChartPatternId } from '../../../helpers/getChartPatternId'
13
13
  import { buildSeriesTooltipListHtml } from '../../../helpers/tooltipHelpers'
14
14
 
15
+ export const getStackedVerticalBarThickness = ({
16
+ isDateAxisType,
17
+ dateScaleWidth,
18
+ xMax,
19
+ barCount,
20
+ barThickness
21
+ }: {
22
+ isDateAxisType: boolean
23
+ dateScaleWidth: number
24
+ xMax: number
25
+ barCount: number
26
+ barThickness: number
27
+ }) => (isDateAxisType ? dateScaleWidth : barThickness * (xMax / barCount))
28
+
15
29
  const BarChartStackedVertical = () => {
16
- const [barWidth, setBarWidth] = useState(0)
17
30
  const { xScale, yScale, seriesScale, xMax, yMax, barChart } = useContext(BarChartContext)
18
31
  const {
19
32
  isHorizontal,
20
33
  barBorderWidth,
21
34
  hoveredBar,
22
35
  getAdditionalColumn,
36
+ formatTooltipValue,
23
37
  onMouseLeaveBar,
24
38
  onMouseOverBar,
25
39
  barStackedSeriesKeys
@@ -44,7 +58,7 @@ const BarChartStackedVertical = () => {
44
58
  <defs>
45
59
  {Object.entries(config.legend.patterns).map(([key, pattern]) => {
46
60
  const patternId = getChartPatternId(key)
47
- const size = pattern.patternSize || 8
61
+ const size = pattern.patternSize || 10
48
62
 
49
63
  switch (pattern.shape) {
50
64
  case 'circles':
@@ -89,8 +103,9 @@ const BarChartStackedVertical = () => {
89
103
  id={patternId}
90
104
  height={size}
91
105
  width={size}
92
- fill={pattern.color}
93
- strokeWidth={0.25}
106
+ fill='transparent'
107
+ stroke={pattern.color}
108
+ strokeWidth={0.75}
94
109
  />
95
110
  )
96
111
  default:
@@ -127,15 +142,19 @@ const BarChartStackedVertical = () => {
127
142
  config.legend.behavior === 'highlight' ||
128
143
  seriesHighlight.length === 0 ||
129
144
  seriesHighlight.indexOf(bar.key) !== -1
130
- let barThickness = isDateAxisType
131
- ? seriesScale.range()[1] - seriesScale.range()[0]
132
- : xMax / barStack.bars.length
133
- if (config.runtime.xAxis.type !== 'date') barThickness = config.barThickness * barThickness
145
+ const barThickness = getStackedVerticalBarThickness({
146
+ isDateAxisType,
147
+ dateScaleWidth: seriesScale.range()[1] - seriesScale.range()[0],
148
+ xMax,
149
+ barCount: barStack.bars.length,
150
+ barThickness: config.barThickness
151
+ })
134
152
  // tooltips
135
153
  const rawXValue = bar.bar.data[config.runtime.xAxis.dataKey]
136
154
  const xAxisValue = isDateAxisType ? formatDate(parseDate(rawXValue)) : rawXValue
137
155
  const yAxisValue = formatNumber(bar.bar ? bar.bar.data[bar.key] : 0, 'left')
138
156
  if (!yAxisValue) return
157
+ const tooltipValue = formatTooltipValue(bar.key, rawXValue, yAxisValue, bar.index)
139
158
  const barX =
140
159
  xScale(isDateAxisType ? parseDate(rawXValue) : rawXValue) -
141
160
  (isDateTimeScaleAxisType ? barThickness / 2 : 0)
@@ -143,7 +162,7 @@ const BarChartStackedVertical = () => {
143
162
  ? `${config.runtime.xAxis.label}: ${xAxisValue}`
144
163
  : xAxisValue
145
164
  const additionalColTooltip = getAdditionalColumn(bar.key, hoveredBar)
146
- const tooltipBody = `${config.runtime.seriesLabels[bar.key]}: ${yAxisValue}`
165
+ const tooltipBody = `${getSeriesValueLabel(bar.key, config)}: ${tooltipValue}`
147
166
  const tooltip = buildSeriesTooltipListHtml({
148
167
  config,
149
168
  colorScale,
@@ -153,8 +172,6 @@ const BarChartStackedVertical = () => {
153
172
  extraRows: additionalColTooltip ? [additionalColTooltip] : []
154
173
  })
155
174
 
156
- setBarWidth(barThickness)
157
-
158
175
  // Check if this bar should use a pattern
159
176
  const patternUrl = getPatternUrlForBar({
160
177
  patterns: config.legend?.patterns,
@@ -239,19 +256,6 @@ const BarChartStackedVertical = () => {
239
256
  })
240
257
  }}
241
258
  </BarStack>
242
- <Regions
243
- xScale={xScale}
244
- yMax={yMax}
245
- barWidth={barWidth}
246
- totalBarsInGroup={1}
247
- xMax={xMax}
248
- handleTooltipMouseOff={() => {}}
249
- handleTooltipMouseOver={() => {}}
250
- handleTooltipClick={() => {}}
251
- tooltipData={null}
252
- showTooltip={() => {}}
253
- hideTooltip={() => {}}
254
- />
255
259
  </>
256
260
  )
257
261
  )
@@ -1,4 +1,4 @@
1
- import React, { useContext, useState } from 'react'
1
+ import React, { useContext } from 'react'
2
2
  // Local contexts
3
3
  import ConfigContext from '../../../ConfigContext'
4
4
  import BarChartContext, { type BarChartContextValues } from './context'
@@ -10,28 +10,29 @@ import { Group } from '@visx/group'
10
10
  import { Text } from '@visx/text'
11
11
  import { BarGroup } from '@visx/shape'
12
12
  import { PatternLines, PatternCircles, PatternWaves } from '@visx/pattern'
13
- // Local components
14
- import Regions from '../../Regions'
15
13
  // CDC core components and helpers
16
14
  import { isDateScale } from '@cdc/core/helpers/cove/date'
17
15
  import isNumber from '@cdc/core/helpers/isNumber'
18
16
  import createBarElement from '@cdc/core/components/createBarElement'
19
17
  import { APP_FONT_COLOR } from '@cdc/core/helpers/constants'
18
+ import { getSeriesValueLabel } from '@cdc/core/helpers/getSeriesName'
20
19
  // Types
21
20
  import { type ChartContext } from '../../../types/ChartContext'
22
- import _ from 'lodash'
23
21
  import { getBarData } from '../helpers/getBarData'
24
22
  import { getPatternUrl as getPatternUrlForBar } from '../helpers/getPatternUrl'
23
+ import { getPortionPatternRenderData } from '../helpers/portionPattern'
25
24
  import { getChartPatternId } from '../../../helpers/getChartPatternId'
26
25
  import { buildSeriesTooltipListHtml } from '../../../helpers/tooltipHelpers'
26
+ import { BarPortionPatternOverlay } from './PortionPatternOverlay'
27
27
 
28
28
  const BarChartVertical = () => {
29
- const { xScale, yScale, xMax, yMax, seriesScale, convertLineToBarGraph, barChart } =
29
+ const { xScale, yScale, yMax, seriesScale, convertLineToBarGraph, barChart } =
30
30
  useContext<BarChartContextValues>(BarChartContext)
31
31
  const {
32
32
  assignColorsToValues,
33
33
  barBorderWidth,
34
34
  getAdditionalColumn,
35
+ formatTooltipValue,
35
36
  getHighlightedBarByValue,
36
37
  getHighlightedBarColorByValue,
37
38
  labelFontSize,
@@ -42,16 +43,12 @@ const BarChartVertical = () => {
42
43
  section
43
44
  } = barChart
44
45
 
45
- const [barWidth, setBarWidth] = useState(0)
46
- const [totalBarsInGroup, setTotalBarsInGroup] = useState(0)
47
-
48
46
  const {
49
47
  colorScale,
50
48
  config,
51
49
  currentViewport,
52
50
  vizViewport,
53
51
  dashboardConfig,
54
- tableData,
55
52
  formatDate,
56
53
  formatNumber,
57
54
  parseDate,
@@ -64,13 +61,7 @@ const BarChartVertical = () => {
64
61
 
65
62
  const root = document.documentElement
66
63
 
67
- let data = transformedData
68
- // check if user add suppression
69
- const isSuppressionActive = config.preliminaryData.some(pd => pd.value && pd.type === 'suppression')
70
- // if suppression active use table data (filtere | excluded) but non cleaned
71
- if (isSuppressionActive) {
72
- data = tableData
73
- }
64
+ const data = transformedData
74
65
 
75
66
  const hasConfidenceInterval =
76
67
  config.confidenceKeys.upper &&
@@ -90,7 +81,7 @@ const BarChartVertical = () => {
90
81
  <defs>
91
82
  {Object.entries(config.legend.patterns).map(([key, pattern]) => {
92
83
  const patternId = getChartPatternId(key)
93
- const size = pattern.patternSize || 8
84
+ const size = pattern.patternSize || 10
94
85
 
95
86
  switch (pattern.shape) {
96
87
  case 'circles':
@@ -135,8 +126,9 @@ const BarChartVertical = () => {
135
126
  id={patternId}
136
127
  height={size}
137
128
  width={size}
138
- fill={pattern.color}
139
- strokeWidth={0.25}
129
+ fill='transparent'
130
+ stroke={pattern.color}
131
+ strokeWidth={0.75}
140
132
  />
141
133
  )
142
134
  default:
@@ -216,12 +208,12 @@ const BarChartVertical = () => {
216
208
  bar.x +
217
209
  (config.isLollipopChart ? (barGroupWidth / barGroup.bars.length - lollipopBarWidth) / 2 : 0) -
218
210
  (config.xAxis.type === 'date-time' ? barGroupWidth / 2 : 0)
219
- setBarWidth(barWidth)
220
- setTotalBarsInGroup(barGroup.bars.length)
221
211
  const yAxisValue = formatNumber(/[a-zA-Z]/.test(String(bar.value)) ? '' : bar.value, 'left')
222
212
  const xAxisValue =
223
213
  config.runtime[section].type === 'date' ? formatDate(parseDate(dataValue)) : dataValue
224
214
 
215
+ const tooltipValue = formatTooltipValue(bar.key, dataValue, yAxisValue, barGroup.index)
216
+
225
217
  // create new Index for bars with negative values
226
218
  const newIndex = bar.value < 0 ? -1 : index
227
219
  // tooltips
@@ -229,7 +221,7 @@ const BarChartVertical = () => {
229
221
  let xAxisTooltip = config.runtime.xAxis.label
230
222
  ? `${config.runtime.xAxis.label}: ${xAxisValue}`
231
223
  : xAxisValue
232
- const tooltipBody = `${config.runtime.seriesLabels[bar.key]}: ${yAxisValue}`
224
+ const tooltipBody = `${getSeriesValueLabel(bar.key, config)}: ${tooltipValue}`
233
225
  const tooltip = buildSeriesTooltipListHtml({
234
226
  config,
235
227
  colorScale,
@@ -309,8 +301,7 @@ const BarChartVertical = () => {
309
301
  if (isRegularLollipopColor) _barColor = barColor
310
302
 
311
303
  if (isHighlightedBar) _barColor = 'transparent'
312
- if (config.legend.colorCode)
313
- _barColor = assignColorsToValues(barGroups.length, barGroup.index, barColor)
304
+ if (config.legend.colorCode) _barColor = assignColorsToValues(barGroup.index, barColor)
314
305
  if (isTwoToneLollipopColor) {
315
306
  _barColor = getLollipopStemColor(barColor)
316
307
  }
@@ -321,8 +312,7 @@ const BarChartVertical = () => {
321
312
  if (isTwoToneLollipopColor) {
322
313
  _barColor = getLollipopStemColor(barColor)
323
314
  }
324
- if (config.legend.colorCode)
325
- _barColor = assignColorsToValues(barGroups.length, barGroup.index, barColor)
315
+ if (config.legend.colorCode) _barColor = assignColorsToValues(barGroup.index, barColor)
326
316
 
327
317
  // if we're highlighting a bar make it invisible since it gets a border
328
318
  if (isHighlightedBar) _barColor = 'transparent'
@@ -340,6 +330,15 @@ const BarChartVertical = () => {
340
330
  allowNonSeriesFieldMatch: !config.series || config.series.length <= 1
341
331
  })
342
332
  const baseBackground = getBarBackgroundColor(colorScale(config.runtime.seriesLabels[bar.key]))
333
+ const portionPatternRenderData = getPortionPatternRenderData({
334
+ config,
335
+ orientation: 'vertical',
336
+ bounds: { x: barX, y: barY, width: barWidth, height: barHeight },
337
+ patterns: config.legend?.patterns,
338
+ datum,
339
+ seriesKey: bar.key,
340
+ totalValue: bar.value
341
+ })
343
342
 
344
343
  // Confidence Interval Variables
345
344
  const tickWidth = 5
@@ -420,6 +419,19 @@ const BarChartVertical = () => {
420
419
  }
421
420
  })}
422
421
 
422
+ {portionPatternRenderData && (
423
+ <BarPortionPatternOverlay
424
+ config={config}
425
+ index={newIndex}
426
+ renderData={portionPatternRenderData}
427
+ transformOrigin={`0 ${barY + barHeight}px`}
428
+ style={{
429
+ opacity: transparentBar ? 0.2 : 1,
430
+ display: displayBar ? 'block' : 'none'
431
+ }}
432
+ />
433
+ )}
434
+
423
435
  {(absentDataLabel || isSuppressed) && (
424
436
  <rect
425
437
  x={barX}
@@ -552,8 +564,6 @@ const BarChartVertical = () => {
552
564
  ))
553
565
  }}
554
566
  </BarGroup>
555
-
556
- <Regions xScale={xScale} yMax={yMax} barWidth={barWidth} totalBarsInGroup={totalBarsInGroup} xMax={xMax} />
557
567
  </Group>
558
568
  )
559
569
  )
@@ -0,0 +1,61 @@
1
+ import React from 'react'
2
+
3
+ import createBarElement from '@cdc/core/components/createBarElement'
4
+
5
+ import { type ChartConfig } from '../../../types/ChartConfig'
6
+ import { type PortionPatternRenderData } from '../helpers/portionPattern'
7
+
8
+ type PortionPatternBoundaryProps = {
9
+ renderData: PortionPatternRenderData
10
+ brush?: boolean
11
+ style?: React.CSSProperties
12
+ }
13
+
14
+ type BarPortionPatternOverlayProps = PortionPatternBoundaryProps & {
15
+ config: ChartConfig
16
+ index: number
17
+ transformOrigin: string
18
+ }
19
+
20
+ export const PortionPatternBoundary = ({ renderData, brush = false, style }: PortionPatternBoundaryProps) => {
21
+ if (!renderData.patternColor || !renderData.boundaryGeometry) return null
22
+
23
+ return (
24
+ <line
25
+ className={`pattern-overlay__boundary${brush ? ' pattern-overlay__boundary--brush' : ''}`}
26
+ {...renderData.boundaryGeometry}
27
+ stroke={renderData.patternColor}
28
+ strokeWidth={0.75}
29
+ vectorEffect='non-scaling-stroke'
30
+ pointerEvents='none'
31
+ aria-hidden='true'
32
+ style={style}
33
+ />
34
+ )
35
+ }
36
+
37
+ export const BarPortionPatternOverlay = ({
38
+ config,
39
+ index,
40
+ renderData,
41
+ transformOrigin,
42
+ style
43
+ }: BarPortionPatternOverlayProps) => (
44
+ <>
45
+ {createBarElement({
46
+ config,
47
+ index: renderData.placement === 'end' ? index : undefined,
48
+ className: 'pattern-overlay pattern-overlay--portion',
49
+ background: renderData.patternUrl,
50
+ borderColor: 'transparent',
51
+ borderWidth: '0px',
52
+ ...renderData.geometry,
53
+ styleOverrides: {
54
+ transformOrigin,
55
+ ...style,
56
+ pointerEvents: 'none'
57
+ }
58
+ })}
59
+ <PortionPatternBoundary renderData={renderData} style={style} />
60
+ </>
61
+ )
@@ -14,6 +14,12 @@ export type BarChartContextValues = {
14
14
  assignColorsToValues: Function
15
15
  barBorderWidth: number
16
16
  getAdditionalColumn: Function
17
+ formatTooltipValue: (
18
+ seriesKey: string,
19
+ xAxisValue: unknown,
20
+ displayValue: string | number,
21
+ rowIndex?: number
22
+ ) => string | number
17
23
  getHighlightedBarByValue: Function
18
24
  getHighlightedBarColorByValue: Function
19
25
  lollipopBarWidth: number
@@ -1,28 +1,28 @@
1
- import _ from 'lodash'
2
- import { TransformedData } from '../../../types/ChartContext'
3
- import { ChartConfig } from '../../../types/ChartConfig'
4
-
5
- export const getBarData = (config: ChartConfig, data: TransformedData[], hasConfidenceInterval: boolean) => {
6
- const dynamicSeries = config.series.find(s => s.dynamicCategory)
7
- if (!dynamicSeries) return data
8
- const { dynamicCategory, dataKey } = dynamicSeries
9
- const xAxisKey = config.runtime.originalXAxis.dataKey
10
- const xAxisGroupDataLookup = _.groupBy(data, xAxisKey)
11
- return Object.values(xAxisGroupDataLookup).map(group => {
12
- return group.reduce((acc, datum) => {
13
- const dataValue = datum[dataKey]
14
- const dataCategory = datum[dynamicCategory]
15
- if (hasConfidenceInterval) {
16
- const { lower, upper } = config.confidenceKeys
17
- if (!acc.CI) acc.CI = {}
18
- const lowerValue = datum[lower]
19
- const upperValue = datum[upper]
20
- acc.CI[dataCategory] = { lower: lowerValue, upper: upperValue }
21
- }
22
- acc[dataCategory] = dataValue
23
- acc[xAxisKey] = datum[xAxisKey]
24
- acc.dynamicData = true
25
- return acc
26
- }, {})
27
- })
28
- }
1
+ import groupBy from 'lodash/groupBy'
2
+ import { TransformedData } from '../../../types/ChartContext'
3
+ import { ChartConfig } from '../../../types/ChartConfig'
4
+
5
+ export const getBarData = (config: ChartConfig, data: TransformedData[], hasConfidenceInterval: boolean) => {
6
+ const dynamicSeries = config.series.find(s => s.dynamicCategory)
7
+ if (!dynamicSeries) return data
8
+ const { dynamicCategory, dataKey } = dynamicSeries
9
+ const xAxisKey = config.runtime.originalXAxis.dataKey
10
+ const xAxisGroupDataLookup = groupBy(data, xAxisKey)
11
+ return Object.values(xAxisGroupDataLookup).map(group => {
12
+ return group.reduce((acc, datum) => {
13
+ const dataValue = datum[dataKey]
14
+ const dataCategory = datum[dynamicCategory]
15
+ if (hasConfidenceInterval) {
16
+ const { lower, upper } = config.confidenceKeys
17
+ if (!acc.CI) acc.CI = {}
18
+ const lowerValue = datum[lower]
19
+ const upperValue = datum[upper]
20
+ acc.CI[dataCategory] = { lower: lowerValue, upper: upperValue }
21
+ }
22
+ acc[dataCategory] = dataValue
23
+ acc[xAxisKey] = datum[xAxisKey]
24
+ acc.dynamicData = true
25
+ return acc
26
+ }, {})
27
+ })
28
+ }
@@ -1,5 +1,5 @@
1
1
  import { APP_FONT_SIZE } from '@cdc/core/helpers/constants'
2
- import _ from 'lodash'
2
+ import round from 'lodash/round'
3
3
  import { ChartConfig } from '../../../types/ChartConfig'
4
4
 
5
5
  export const getHorizontalBarHeights = <T>(config: Partial<ChartConfig>, bars: (T & { index })[]) => {
@@ -41,7 +41,7 @@ export const getHorizontalBarHeights = <T>(config: Partial<ChartConfig>, bars: (
41
41
  // return new updated bars/groupes
42
42
  return bars.map((bar, i) => {
43
43
  // set bars Y dynamically to handle space between bars
44
- const y = bar.index === 0 ? 0 : _.round(totalBarHeight * i)
44
+ const y = bar.index === 0 ? 0 : round(totalBarHeight * i)
45
45
  return { ...bar, y, height: barHeight }
46
46
  })
47
47
  }
@@ -1,9 +1,5 @@
1
1
  import { getChartPatternId } from '../../../helpers/getChartPatternId'
2
-
3
- type LegendPattern = {
4
- dataKey?: string
5
- dataValue?: string | number
6
- }
2
+ import { type LegendPattern } from '../../../types/ChartConfig'
7
3
 
8
4
  type SeriesLabels = Record<string, string> | undefined
9
5
 
@@ -64,6 +60,7 @@ export const getPatternUrl = ({
64
60
  for (const patternKey in patterns) {
65
61
  if (!Object.prototype.hasOwnProperty.call(patterns, patternKey)) continue
66
62
  const pattern = patterns[patternKey]
63
+ if (pattern.application === 'portion') continue
67
64
  const dataKey = normalizeString(pattern.dataKey)
68
65
 
69
66
  if (!hasPatternValue(pattern.dataValue)) {
@@ -125,6 +125,14 @@ export const addMinimumBarHeights = barStacks => {
125
125
  const segmentsNeedingAdjustment = segments.filter(segment => segment.height > 0 && segment.height < MIN_BAR_HEIGHT)
126
126
  const segmentsToShrink = segments.filter(segment => segment.height > MIN_BAR_HEIGHT)
127
127
 
128
+ if (segments.length === 1 && segmentsNeedingAdjustment.length === 1) {
129
+ const segment = segmentsNeedingAdjustment[0]
130
+ const bottom = segment.y + segment.height
131
+ segment.height = MIN_BAR_HEIGHT
132
+ segment.y = bottom - MIN_BAR_HEIGHT
133
+ return
134
+ }
135
+
128
136
  if (segmentsNeedingAdjustment.length > 0 && segmentsToShrink.length > 0) {
129
137
  segmentsNeedingAdjustment.forEach(smallSegment => {
130
138
  const heightToAdd = MIN_BAR_HEIGHT - smallSegment.height