@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.
- package/CONFIG.md +504 -368
- package/dist/cdcchart-CYc-Kayd.es.js +22488 -0
- package/dist/cdcchart-DCKn8NmI.es.js +20695 -0
- package/dist/cdcchart-Dyui9nk_.es.js +45828 -0
- package/dist/cdcchart.js +4 -96498
- package/examples/__data__/vega-remote-data.json +6 -0
- package/examples/dendrogram.json +18 -0
- package/examples/feature/bar/bar-chart-race-annual-change.json +68 -0
- package/examples/feature/heatmap/average-age-categorical.json +2 -2
- package/examples/feature/heatmap/calendar-heatmap.json +2 -2
- package/examples/feature/heatmap/cell-values-bottom-axis.json +2 -2
- package/examples/feature/heatmap/sparse-aggregation.json +2 -2
- package/examples/feature/line/line-chart-race.json +50 -0
- package/examples/feature/sankey/sankey-example-data.json +40 -1441
- package/examples/feature/sankey/sankey_chart_data.csv +9 -20
- package/examples/network.json +31 -0
- package/examples/private/box-plot.json +573 -0
- package/examples/private/custom-color-issue.json +625 -0
- package/examples/private/custom-colors.json +522 -0
- package/examples/private/cutoff.json +10750 -0
- package/examples/private/flueview.json +22051 -0
- package/examples/private/overlay-legend.json +485 -0
- package/examples/private/pie-test.json +469 -0
- package/examples/vega-remote.json +22 -0
- package/package.json +11 -13
- package/src/CdcChart.tsx +2 -2
- package/src/CdcChartComponent.tsx +444 -217
- package/src/_stories/Chart.BarRace.stories.tsx +443 -0
- package/src/_stories/Chart.BoxPlotNumericSort.stories.tsx +189 -0
- package/src/_stories/Chart.BoxPlotStatsParity.stories.tsx +207 -0
- package/src/_stories/Chart.ColorDistribution.stories.tsx +299 -0
- package/src/_stories/Chart.DataCutoff.stories.tsx +147 -0
- package/src/_stories/Chart.DataTableDownloadFilename.stories.tsx +60 -0
- package/src/_stories/Chart.Dendrogram.stories.tsx +373 -0
- package/src/_stories/Chart.Forecast.CILegend.stories.tsx +236 -0
- package/src/_stories/Chart.HeatMap.stories.tsx +170 -4
- package/src/_stories/Chart.Legend.AxisAlign.stories.tsx +119 -0
- package/src/_stories/Chart.LineRace.stories.tsx +149 -0
- package/src/_stories/Chart.Network.stories.tsx +432 -0
- package/src/_stories/Chart.PaletteConversion.Editor.stories.tsx +208 -0
- package/src/_stories/Chart.Patterns.smoke.stories.tsx +31 -0
- package/src/_stories/Chart.PercentageValue.stories.tsx +311 -0
- package/src/_stories/Chart.PieLabels.stories.tsx +49 -0
- package/src/_stories/Chart.RankByValueMutation.stories.tsx +206 -0
- package/src/_stories/Chart.RequiredFields.stories.tsx +681 -0
- package/src/_stories/Chart.Sankey.stories.tsx +417 -0
- package/src/_stories/Chart.SeriesColorAssignments.stories.tsx +47 -0
- package/src/_stories/Chart.SmallMultiplesNumericTileOrder.stories.tsx +137 -0
- package/src/_stories/Chart.TooltipSeriesLabels.stories.tsx +43 -0
- package/src/_stories/Chart.VegaRemoteData.stories.tsx +31 -0
- package/src/_stories/Chart.smoke.stories.tsx +14 -1
- package/src/_stories/ChartAnnotation.Editor.stories.tsx +78 -0
- package/src/_stories/ChartAxisTitles.smoke.stories.tsx +48 -0
- package/src/_stories/ChartBar.Editor.stories.tsx +499 -57
- package/src/_stories/ChartBrush.Editor.stories.tsx +46 -67
- package/src/_stories/ChartBrush.Regression.stories.tsx +135 -0
- package/src/_stories/ChartEditor.Editor.stories.tsx +33 -3
- package/src/_stories/ChartLine.EffectCompatibility.stories.tsx +120 -0
- package/src/_stories/ChartPrefixSuffix.smoke.stories.tsx +28 -1
- package/src/_stories/_mock/annotation_event-line_mock.json +2 -2
- package/src/_stories/_mock/editor-test-configs.json +20 -10
- package/src/_stories/_mock/editor-test-datasets.json +38 -42
- package/src/_stories/_mock/heatmap-average-age-categorical.json +2 -2
- package/src/_stories/_mock/heatmap.json +2 -2
- package/src/_stories/_mock/legend-axis-align-stacked-bar.json +125 -0
- package/src/_stories/_mock/sankey_mock.json +23 -27
- package/src/components/Annotations/components/AnnotationDraggable.styles.css +52 -0
- package/src/components/Annotations/components/AnnotationDraggable.tsx +639 -139
- package/src/components/Annotations/components/AnnotationDropdown.styles.css +44 -4
- package/src/components/Annotations/components/AnnotationDropdown.tsx +10 -32
- package/src/components/Annotations/helpers/resolveAnnotationLayout.ts +212 -0
- package/src/components/Annotations/tests/AnnotationDraggable.test.tsx +612 -19
- package/src/components/Annotations/tests/AnnotationDropdown.test.tsx +50 -0
- package/src/components/Annotations/tests/resolveAnnotationLayout.test.ts +203 -0
- package/src/components/Axis/BottomAxis.tsx +1 -1
- package/src/components/Axis/Categorical.Axis.tsx +3 -3
- package/src/components/Axis/RightAxis.tsx +21 -13
- package/src/components/BarChart/components/BarChart.Horizontal.tsx +39 -8
- package/src/components/BarChart/components/BarChart.StackedHorizontal.tsx +13 -4
- package/src/components/BarChart/components/BarChart.StackedVertical.test.ts +28 -0
- package/src/components/BarChart/components/BarChart.StackedVertical.tsx +30 -26
- package/src/components/BarChart/components/BarChart.Vertical.tsx +38 -28
- package/src/components/BarChart/components/PortionPatternOverlay.tsx +61 -0
- package/src/components/BarChart/components/context.tsx +6 -0
- package/src/components/BarChart/helpers/getBarData.ts +28 -28
- package/src/components/BarChart/helpers/getBarHeights.ts +2 -2
- package/src/components/BarChart/helpers/getPatternUrl.ts +2 -5
- package/src/components/BarChart/helpers/index.ts +8 -0
- package/src/components/BarChart/helpers/portionPattern.ts +243 -0
- package/src/components/BarChart/helpers/tests/addMinimumBarHeights.test.ts +42 -0
- package/src/components/BarChart/helpers/tests/getPatternUrl.test.ts +13 -0
- package/src/components/BarChart/helpers/tests/portionPattern.test.ts +280 -0
- package/src/components/BarChart/helpers/tests/useBarChart.test.tsx +202 -0
- package/src/components/BarChart/helpers/useBarChart.ts +60 -60
- package/src/components/BarChartRace/BarChartRace.test.tsx +199 -0
- package/src/components/BarChartRace/BarChartRace.tsx +230 -0
- package/src/components/BarChartRace/BarChartRaceFallback.test.tsx +61 -0
- package/src/components/BarChartRace/BarChartRaceFallback.tsx +48 -0
- package/src/components/BarChartRace/bar-chart-race.css +160 -0
- package/src/components/BarChartRace/helpers.test.ts +114 -0
- package/src/components/BarChartRace/helpers.ts +185 -0
- package/src/components/BarChartRace/index.ts +3 -0
- package/src/components/BoxPlot/BoxPlot.Horizontal.tsx +7 -6
- package/src/components/BoxPlot/BoxPlot.Vertical.tsx +9 -7
- package/src/components/BoxPlot/helpers/index.ts +13 -83
- package/src/components/Brush/BrushSelector.tsx +10 -24
- package/src/components/Brush/MiniChartPreview.tsx +33 -1
- package/src/components/Dendrogram/components/Dendrogram.tsx +374 -0
- package/src/components/Dendrogram/dendrogram.css +113 -0
- package/src/components/Dendrogram/helpers/layoutDendrogram.test.ts +95 -0
- package/src/components/Dendrogram/helpers/layoutDendrogram.ts +56 -0
- package/src/components/Dendrogram/helpers/prepareDendrogramData.test.ts +135 -0
- package/src/components/Dendrogram/helpers/prepareDendrogramData.ts +166 -0
- package/src/components/Dendrogram/helpers/resolveDendrogramLabels.test.ts +196 -0
- package/src/components/Dendrogram/helpers/resolveDendrogramLabels.ts +418 -0
- package/src/components/Dendrogram/index.tsx +1 -0
- package/src/components/Dendrogram/types/index.ts +66 -0
- package/src/components/EditorPanel/EditorPanel.tsx +1111 -805
- package/src/components/EditorPanel/components/Panels/Panel.Annotate.tsx +50 -5
- package/src/components/EditorPanel/components/Panels/Panel.Dendrogram.css +10 -0
- package/src/components/EditorPanel/components/Panels/Panel.Dendrogram.tsx +211 -0
- package/src/components/EditorPanel/components/Panels/Panel.ForestPlotSettings.tsx +19 -8
- package/src/components/EditorPanel/components/Panels/Panel.General.tsx +104 -61
- package/src/components/EditorPanel/components/Panels/Panel.Network.css +9 -0
- package/src/components/EditorPanel/components/Panels/Panel.Network.tsx +202 -0
- package/src/components/EditorPanel/components/Panels/Panel.PatternSettings.tsx +236 -36
- package/src/components/EditorPanel/components/Panels/Panel.Radar.tsx +6 -1
- package/src/components/EditorPanel/components/Panels/Panel.Sankey.tsx +89 -105
- package/src/components/EditorPanel/components/Panels/Panel.Series.tsx +21 -6
- package/src/components/EditorPanel/components/Panels/Panel.SmallMultiples.tsx +1 -1
- package/src/components/EditorPanel/components/Panels/Panel.Visual.tsx +8 -66
- package/src/components/EditorPanel/components/Panels/RacingControls.test.tsx +131 -0
- package/src/components/EditorPanel/components/Panels/RacingControls.tsx +185 -0
- package/src/components/EditorPanel/components/Panels/SeriesColorAssignments.tsx +2 -2
- package/src/components/EditorPanel/components/Panels/index.tsx +4 -0
- package/src/components/EditorPanel/helpers/getVisualizationTypeConfigUpdate.ts +20 -7
- package/src/components/EditorPanel/helpers/tests/getVisualizationTypeConfigUpdate.test.ts +25 -2
- package/src/components/EditorPanel/helpers/updateFieldRankByValue.ts +5 -4
- package/src/components/EditorPanel/useEditorPermissions.test.tsx +94 -0
- package/src/components/EditorPanel/useEditorPermissions.ts +75 -25
- package/src/components/Forecasting/Forecasting.tsx +16 -7
- package/src/components/HeatMap/components/HeatMap.tsx +511 -178
- package/src/components/HeatMap/heatmap.constants.ts +7 -3
- package/src/components/HeatMap/heatmap.css +101 -2
- package/src/components/HeatMap/helpers/layout.ts +80 -0
- package/src/components/HeatMap/tests/HeatMap.test.tsx +339 -16
- package/src/components/HeatMap/tests/helpers.test.ts +79 -0
- package/src/components/Legend/Legend.Component.tsx +163 -148
- package/src/components/Legend/Legend.Suppression.tsx +3 -3
- package/src/components/Legend/LegendGroup/LegendGroup.styles.css +7 -0
- package/src/components/Legend/LegendGroup/LegendGroup.tsx +47 -35
- package/src/components/Legend/helpers/createFormatLabels.test.ts +226 -0
- package/src/components/Legend/helpers/createFormatLabels.tsx +45 -51
- package/src/components/LineChart/components/LineChart.Circle.tsx +3 -3
- package/src/components/LineChart/helpers.test.ts +126 -38
- package/src/components/LineChart/helpers.ts +9 -6
- package/src/components/LineChart/index.tsx +71 -27
- package/src/components/LineChart/tests/LineChart.test.tsx +630 -0
- package/src/components/LineChartRace/LineChartRace.test.tsx +275 -0
- package/src/components/LineChartRace/LineChartRace.tsx +134 -0
- package/src/components/LineChartRace/LineChartRaceFallback.tsx +28 -0
- package/src/components/LineChartRace/helpers.test.ts +88 -0
- package/src/components/LineChartRace/helpers.ts +157 -0
- package/src/components/LineChartRace/index.ts +3 -0
- package/src/components/LineChartRace/line-chart-race.css +16 -0
- package/src/components/LinearChart/ValueAxisAnchors.tsx +58 -0
- package/src/components/LinearChart/VisualizationRenderer.tsx +18 -23
- package/src/components/LinearChart/tests/LinearChart.test.tsx +412 -13
- package/src/components/LinearChart/tests/VisualizationRenderer.test.tsx +141 -0
- package/src/components/LinearChart/tests/mockConfigContext.ts +2 -1
- package/src/components/LinearChart.tsx +85 -54
- package/src/components/Network/components/Network.tsx +372 -0
- package/src/components/Network/helpers/layoutNetwork.test.ts +68 -0
- package/src/components/Network/helpers/layoutNetwork.ts +87 -0
- package/src/components/Network/helpers/prepareNetworkData.test.ts +116 -0
- package/src/components/Network/helpers/prepareNetworkData.ts +101 -0
- package/src/components/Network/helpers/resolveNetworkLabels.test.ts +112 -0
- package/src/components/Network/helpers/resolveNetworkLabels.ts +206 -0
- package/src/components/Network/index.tsx +3 -0
- package/src/components/Network/network.css +107 -0
- package/src/components/Network/types/index.ts +56 -0
- package/src/components/PairedBarChart.jsx +5 -10
- package/src/components/PairedBarChart.test.tsx +71 -0
- package/src/components/PieChart/PieChart.tsx +121 -13
- package/src/components/PieChart/helpers/labelPlacement.test.ts +88 -0
- package/src/components/PieChart/helpers/labelPlacement.ts +95 -0
- package/src/components/RacingChartRenderer.tsx +44 -0
- package/src/components/Regions/components/Regions.test.tsx +179 -0
- package/src/components/Regions/components/Regions.tsx +104 -69
- package/src/components/Regions/index.tsx +2 -3
- package/src/components/Sankey/components/Sankey.tsx +264 -437
- package/src/components/Sankey/helpers/getSankeyTooltip.ts +12 -0
- package/src/components/Sankey/helpers/prepareSankeyData.test.ts +71 -0
- package/src/components/Sankey/helpers/prepareSankeyData.ts +90 -0
- package/src/components/Sankey/sankey.scss +57 -116
- package/src/components/Sankey/types/index.ts +41 -4
- package/src/components/ScatterPlot/ScatterPlot.jsx +28 -12
- package/src/components/ScatterPlot/ScatterPlot.test.tsx +60 -0
- package/src/components/SmallMultiples/SmallMultiples.tsx +12 -12
- package/src/components/SmallMultiples/tests/SmallMultipleTile.test.tsx +7 -5
- package/src/components/raceTiming.ts +18 -0
- package/src/data/initial-state.js +79 -31
- package/src/helpers/applyChartTypeContract.ts +71 -0
- package/src/helpers/axisLabelFontSize.ts +2 -2
- package/src/helpers/boxPlotStats.ts +60 -0
- package/src/helpers/bumpChartTooltip.ts +2 -1
- package/src/helpers/calculateHorizontalBarCategoryLabelWidth.test.ts +37 -0
- package/src/helpers/calculateHorizontalBarCategoryLabelWidth.ts +3 -2
- package/src/helpers/calculateRightYAxisWidth.ts +60 -0
- package/src/helpers/categoryOrder.ts +60 -0
- package/src/helpers/colorAssignmentHelpers.ts +2 -2
- package/src/helpers/createNewChartConfig.ts +56 -0
- package/src/helpers/dataDrivenYAxisCategories.ts +18 -0
- package/src/helpers/forecastLegend.ts +88 -0
- package/src/helpers/getBoxPlotConfig.ts +26 -38
- package/src/helpers/getChartTypeDefaultPalette.ts +29 -0
- package/src/helpers/getColorCodeCategoryColorMap.ts +26 -0
- package/src/helpers/getColorScale.ts +31 -22
- package/src/helpers/getComboChartConfig.ts +0 -1
- package/src/helpers/getDynamicYAxisCategories.ts +69 -0
- package/src/helpers/getExcludedData.ts +0 -1
- package/src/helpers/getHasBoundarySuppression.ts +4 -3
- package/src/helpers/getMinMax.ts +11 -8
- package/src/helpers/getNewRuntime.ts +4 -3
- package/src/helpers/getPiePercent.ts +3 -3
- package/src/helpers/getStackedSeriesMax.ts +51 -0
- package/src/helpers/getV21ChartDistributionColors.ts +57 -0
- package/src/helpers/handleRankByValue.ts +15 -15
- package/src/helpers/isConvertLineToBarGraph.ts +2 -2
- package/src/helpers/seriesColumnSettings.ts +31 -3
- package/src/helpers/sizeHelpers.ts +4 -5
- package/src/helpers/smallMultiplesHelpers.ts +10 -13
- package/src/helpers/tests/applyChartTypeContract.test.ts +37 -0
- package/src/helpers/tests/boxPlotStats.test.ts +31 -0
- package/src/helpers/tests/bumpChartTooltip.test.ts +29 -0
- package/src/helpers/tests/calculateRightYAxisWidth.test.ts +105 -0
- package/src/helpers/tests/categoryOrder.test.ts +57 -0
- package/src/helpers/tests/countNumOfTicks.test.ts +11 -0
- package/src/helpers/tests/createNewChartConfig.test.ts +182 -0
- package/src/helpers/tests/getBoxPlotConfig.test.ts +70 -0
- package/src/helpers/tests/getColorCodeCategoryColorMap.test.ts +113 -0
- package/src/helpers/tests/getColorScale.test.ts +226 -1
- package/src/helpers/tests/getDynamicYAxisCategories.test.ts +61 -0
- package/src/helpers/tests/getMinMax.test.ts +41 -0
- package/src/helpers/tests/getStackedSeriesMax.test.ts +26 -0
- package/src/helpers/tests/handleRankByValue.test.ts +55 -37
- package/src/helpers/tests/seriesColumnSettings.test.ts +83 -0
- package/src/helpers/tests/smallMultiplesHelpers.test.ts +37 -1
- package/src/helpers/tests/tooltipHelpers.test.ts +80 -0
- package/src/helpers/tooltipHelpers.ts +16 -0
- package/src/hooks/tests/useRightAxis.test.tsx +143 -2
- package/src/hooks/tests/useScales.test.tsx +3 -6
- package/src/hooks/tests/useTooltip.test.tsx +484 -0
- package/src/hooks/usePrefersReducedMotion.ts +22 -0
- package/src/hooks/useReduceData.ts +4 -36
- package/src/hooks/useRightAxis.ts +19 -26
- package/src/hooks/useScales.ts +15 -0
- package/src/hooks/useTooltip.tsx +106 -71
- package/src/scss/main.scss +74 -2
- package/src/store/chart.reducer.ts +4 -4
- package/src/test/CdcChart.dataTable.test.tsx +582 -14
- package/src/test/CdcChart.dendrogram.test.tsx +277 -0
- package/src/test/CdcChart.finalization.test.tsx +143 -0
- package/src/test/CdcChart.network.test.tsx +271 -0
- package/src/types/ChartConfig.ts +91 -54
- package/src/types/ChartContext.ts +5 -0
- package/src/types/Horizon.ts +1 -1
- package/LICENSE +0 -201
- package/dist/cdcchart-BWVIUcAF.es.js +0 -4802
- package/src/_stories/Chart.Sankey.smoke.stories.tsx +0 -62
- package/src/components/Sankey/components/ColumnList.tsx +0 -19
- package/src/components/Sankey/helpers/getSankeyTooltip.tsx +0 -34
- package/src/components/Sankey/useSankeyAlert.tsx +0 -60
- package/src/data/legacy-defaults.ts +0 -18
- package/src/helpers/ensureSpecialChartAxisTypes.ts +0 -11
- package/src/helpers/tests/ensureSpecialChartAxisTypes.test.ts +0 -30
|
@@ -1,25 +1,39 @@
|
|
|
1
|
-
import React, { useContext
|
|
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 ||
|
|
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=
|
|
93
|
-
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
:
|
|
133
|
-
|
|
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 = `${
|
|
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
|
|
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,
|
|
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
|
-
|
|
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 ||
|
|
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=
|
|
139
|
-
|
|
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 = `${
|
|
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
|
|
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 =
|
|
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
|
|
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 :
|
|
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
|