@cdc/chart 4.25.8 → 4.25.11
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/.claude/settings.local.json +9 -0
- package/dist/{cdcchart-1a1724a1.es.js → cdcchart-dgT_1dIT.es.js} +136 -151
- package/dist/cdcchart.js +44236 -40355
- package/examples/feature/__data__/planet-example-data.json +0 -30
- package/examples/feature/boxplot/valid-boxplot.csv +38 -17
- package/examples/grouped-bar-test.json +400 -0
- package/examples/private/DEV-11825.json +573 -0
- package/examples/private/d.json +382 -0
- package/examples/private/example-2.json +49784 -0
- package/examples/private/f2.json +1 -0
- package/examples/private/f4.json +1577 -0
- package/examples/private/forecast.json +1180 -0
- package/examples/private/lollipop.json +468 -0
- package/examples/private/na.json +913 -0
- package/examples/private/new.json +48756 -0
- package/examples/private/pie-chart-legend.json +904 -0
- package/examples/private/test-data.csv +28 -0
- package/examples/suppressed_tooltip.json +480 -0
- package/index.html +2 -133
- package/package.json +25 -7
- package/src/CdcChart.tsx +9 -13
- package/src/CdcChartComponent.tsx +403 -92
- package/src/_stories/Chart.Anchors.stories.tsx +2 -2
- package/src/_stories/Chart.BoxPlot.stories.tsx +1 -1
- package/src/_stories/Chart.CI.stories.tsx +1 -1
- package/src/_stories/Chart.Combo.stories.tsx +18 -0
- package/src/_stories/Chart.CustomColors.stories.tsx +1 -1
- package/src/_stories/Chart.DynamicSeries.stories.tsx +2 -2
- package/src/_stories/Chart.Filters.stories.tsx +2 -2
- package/src/_stories/Chart.Forecast.stories.tsx +36 -0
- package/src/_stories/Chart.HTMLInDataTable.stories.tsx +520 -0
- package/src/_stories/Chart.Legend.Gradient.stories.tsx +2 -2
- package/src/_stories/Chart.Patterns.stories.tsx +20 -0
- package/src/_stories/Chart.PreserveDecimals.stories.tsx +220 -0
- package/src/_stories/Chart.ScatterPlot.stories.tsx +1 -1
- package/src/_stories/Chart.SmallMultiples.stories.tsx +47 -0
- package/src/_stories/Chart.stories.tsx +8 -5
- package/src/_stories/Chart.tooltip.stories.tsx +1 -1
- package/src/_stories/ChartAnnotation.stories.tsx +7 -4
- package/src/_stories/ChartAxisLabels.stories.tsx +2 -2
- package/src/_stories/ChartAxisTitles.stories.tsx +2 -2
- package/src/_stories/ChartBar.Editor.stories.tsx +3580 -0
- package/src/_stories/ChartEditor.Editor.stories.tsx +658 -0
- package/src/_stories/ChartEditor.stories.tsx +59 -60
- package/src/_stories/ChartLine.Suppression.stories.tsx +1 -1
- package/src/_stories/ChartLine.Symbols.stories.tsx +1 -1
- package/src/_stories/ChartPrefixSuffix.stories.tsx +2 -2
- package/src/_stories/_mock/combo.json +451 -0
- package/src/_stories/_mock/editor-test-configs.json +376 -0
- package/src/_stories/_mock/editor-test-datasets.json +477 -0
- package/src/_stories/_mock/editor-tests/bar-chart-editor-test.json +255 -0
- package/src/_stories/_mock/editor-tests/bar-chart-general-test.json +267 -0
- package/src/_stories/_mock/editor-tests/bar-chart-test.json +237 -0
- package/src/_stories/_mock/forecast_combo_with_gaps.json +913 -0
- package/src/_stories/_mock/pie_config.json +257 -62
- package/src/_stories/_mock/small_multiples/small_multiples_bars.json +1944 -0
- package/src/_stories/_mock/small_multiples/small_multiples_big_data_bars.json +1114 -0
- package/src/_stories/_mock/small_multiples/small_multiples_lines.json +2646 -0
- package/src/_stories/_mock/small_multiples/small_multiples_lines_colors.json +1305 -0
- package/src/_stories/_mock/small_multiples/small_multiples_stacked_bars.json +1936 -0
- package/src/_stories/_mock/stacked-pattern-test.json +520 -0
- package/src/components/Annotations/components/AnnotationDraggable.tsx +1 -0
- package/src/components/Annotations/components/AnnotationDropdown.tsx +1 -1
- package/src/components/Annotations/components/findNearestDatum.ts +6 -41
- package/src/components/AreaChart/components/AreaChart.Stacked.jsx +10 -6
- package/src/components/AreaChart/index.tsx +1 -2
- package/src/components/BarChart/components/BarChart.Horizontal.tsx +161 -22
- package/src/components/BarChart/components/BarChart.StackedHorizontal.tsx +138 -5
- package/src/components/BarChart/components/BarChart.StackedVertical.tsx +215 -73
- package/src/components/BarChart/components/BarChart.Vertical.tsx +155 -22
- package/src/components/BarChart/helpers/index.ts +43 -4
- package/src/components/BarChart/helpers/lollipopColors.ts +27 -0
- package/src/components/BarChart/helpers/useBarChart.ts +25 -3
- package/src/components/BoxPlot/BoxPlot.Vertical.tsx +2 -1
- package/src/components/BoxPlot/helpers/index.ts +3 -3
- package/src/components/Brush/BrushChart.tsx +1 -1
- package/src/components/DeviationBar.jsx +9 -6
- package/src/components/EditorPanel/EditorPanel.tsx +563 -229
- package/src/components/EditorPanel/EditorPanelContext.ts +3 -0
- package/src/components/EditorPanel/components/Panels/Panel.Annotate.tsx +96 -111
- package/src/components/EditorPanel/components/Panels/Panel.General.tsx +19 -1
- package/src/components/EditorPanel/components/Panels/Panel.PatternSettings.tsx +461 -0
- package/src/components/EditorPanel/components/Panels/Panel.Series.tsx +80 -67
- package/src/components/EditorPanel/components/Panels/Panel.SmallMultiples.tsx +422 -0
- package/src/components/EditorPanel/components/Panels/Panel.Visual.tsx +188 -139
- package/src/components/EditorPanel/components/Panels/index.tsx +5 -1
- package/src/components/EditorPanel/components/Panels/panelVisual.styles.css +0 -8
- package/src/components/EditorPanel/editor-panel.scss +0 -20
- package/src/components/EditorPanel/helpers/updateFieldRankByValue.ts +49 -48
- package/src/components/EditorPanel/useEditorPermissions.ts +7 -15
- package/src/components/Forecasting/Forecasting.tsx +175 -27
- package/src/components/ForestPlot/ForestPlot.tsx +11 -7
- package/src/components/ForestPlot/ForestPlotProps.ts +1 -1
- package/src/components/Legend/Legend.Component.tsx +114 -14
- package/src/components/Legend/helpers/createFormatLabels.tsx +230 -171
- package/src/components/Legend/helpers/getLegendClasses.ts +0 -1
- package/src/components/LegendWrapper.tsx +1 -1
- package/src/components/LineChart/LineChartProps.ts +0 -3
- package/src/components/LineChart/components/LineChart.Circle.tsx +2 -2
- package/src/components/LineChart/helpers.ts +1 -1
- package/src/components/LineChart/index.tsx +38 -15
- package/src/components/LinearChart.tsx +96 -84
- package/src/components/PairedBarChart.jsx +6 -4
- package/src/components/PieChart/PieChart.tsx +170 -54
- package/src/components/Regions/components/Regions.tsx +3 -24
- package/src/components/Sankey/components/Sankey.tsx +7 -1
- package/src/components/Sankey/types/index.ts +1 -1
- package/src/components/ScatterPlot/ScatterPlot.jsx +32 -4
- package/src/components/SmallMultiples/SmallMultipleTile.tsx +198 -0
- package/src/components/SmallMultiples/SmallMultiples.css +32 -0
- package/src/components/SmallMultiples/SmallMultiples.tsx +271 -0
- package/src/components/SmallMultiples/index.ts +2 -0
- package/src/data/initial-state.js +327 -293
- package/src/helpers/buildForecastPaletteMappings.ts +112 -0
- package/src/helpers/buildForecastPaletteOptions.ts +71 -0
- package/src/helpers/getColorScale.ts +82 -8
- package/src/{hooks/useMinMax.ts → helpers/getMinMax.ts} +14 -7
- package/src/helpers/getNewRuntime.ts +1 -1
- package/src/helpers/getTransformedData.ts +1 -1
- package/src/helpers/getYAxisAutoPadding.ts +53 -0
- package/src/helpers/smallMultiplesHelpers.ts +529 -0
- package/src/hooks/useChartHoverAnalytics.tsx +44 -0
- package/src/hooks/useProgrammaticTooltip.ts +96 -0
- package/src/hooks/useReduceData.ts +105 -70
- package/src/hooks/useScales.ts +88 -34
- package/src/hooks/useSmallMultipleSynchronization.ts +59 -0
- package/src/hooks/useTooltip.tsx +116 -29
- package/src/index.jsx +0 -2
- package/src/scss/main.scss +13 -80
- package/src/store/chart.actions.ts +2 -0
- package/src/store/chart.reducer.ts +5 -1
- package/src/test/CdcChart.test.jsx +8 -3
- package/src/types/ChartConfig.ts +53 -11
- package/src/types/ChartContext.ts +4 -0
- package/vite.config.js +1 -1
- package/vitest.config.ts +16 -0
- package/src/_stories/_mock/pie_data.json +0 -218
- package/src/components/AreaChart/components/AreaChart.jsx +0 -109
- package/src/coreStyles_chart.scss +0 -3
- package/src/helpers/configHelpers.ts +0 -28
- package/src/helpers/generateColorsArray.ts +0 -8
- package/src/helpers/sort.ts +0 -7
- package/src/hooks/useActiveElement.js +0 -19
- package/src/hooks/useChartClasses.js +0 -41
- package/src/hooks/useColorPalette.js +0 -76
|
@@ -1,171 +1,230 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return labels
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
1
|
+
import {
|
|
2
|
+
colorPalettesChart as colorPalettes,
|
|
3
|
+
colorPalettesChartV2,
|
|
4
|
+
sequentialPalettes,
|
|
5
|
+
twoColorPalette
|
|
6
|
+
} from '@cdc/core/data/colorPalettes'
|
|
7
|
+
import { getCurrentPaletteName, getFallbackColorPalette, migratePaletteWithMap } from '@cdc/core/helpers/palettes/utils'
|
|
8
|
+
import { chartPaletteMigrationMap } from '@cdc/core/helpers/palettes/migratePaletteName'
|
|
9
|
+
import { getPaletteAccessor } from '@cdc/core/helpers/getPaletteAccessor'
|
|
10
|
+
import { getColorPaletteVersion } from '@cdc/core/helpers/getColorPaletteVersion'
|
|
11
|
+
import { isV1Palette } from '@cdc/core/helpers/palettes/utils'
|
|
12
|
+
import { v2ColorDistribution } from '@cdc/core/helpers/palettes/colorDistributions'
|
|
13
|
+
import { updatePaletteNames } from '@cdc/core/helpers/updatePaletteNames'
|
|
14
|
+
import { buildForecastPaletteMappings } from '../../../helpers/buildForecastPaletteMappings'
|
|
15
|
+
import { FaStar } from 'react-icons/fa'
|
|
16
|
+
import { Label } from '../../../types/Label'
|
|
17
|
+
import { ColorScale, TransformedData } from '../../../types/ChartContext'
|
|
18
|
+
import { ChartConfig } from '../../../types/ChartConfig'
|
|
19
|
+
import _ from 'lodash'
|
|
20
|
+
|
|
21
|
+
export const createFormatLabels =
|
|
22
|
+
(config: ChartConfig, tableData: Object[], data: TransformedData[], colorScale: ColorScale) =>
|
|
23
|
+
(defaultLabels: Label[]): Label[] => {
|
|
24
|
+
const { visualizationType, visualizationSubType, series, runtime, legend } = config
|
|
25
|
+
const sortVertical = labels =>
|
|
26
|
+
legend.verticalSorted
|
|
27
|
+
? _.sortBy(_.cloneDeep(labels), label => {
|
|
28
|
+
const match = label.datum?.match(/-?\d+(\.\d+)?/)
|
|
29
|
+
return match ? parseFloat(match[0]) : Number.MAX_SAFE_INTEGER
|
|
30
|
+
})
|
|
31
|
+
: labels
|
|
32
|
+
const reverseLabels = labels => {
|
|
33
|
+
if (config.series.some(series => series.dynamicCategory)) {
|
|
34
|
+
return orderDynamicLabels(labels)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return config.legend.reverseLabelOrder ? sortVertical(labels).reverse() : sortVertical(labels)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const orderDynamicLabels = labels => {
|
|
41
|
+
// Handle different ordering configurations
|
|
42
|
+
switch (config.legend.order) {
|
|
43
|
+
case 'dataColumn':
|
|
44
|
+
return labels
|
|
45
|
+
case 'asc':
|
|
46
|
+
case 'desc':
|
|
47
|
+
return labels.sort((a, b) => {
|
|
48
|
+
const valA = a.datum || a.text
|
|
49
|
+
const valB = b.datum || b.text
|
|
50
|
+
const numA = parseFloat(valA)
|
|
51
|
+
const numB = parseFloat(valB)
|
|
52
|
+
if (!isNaN(numA) && !isNaN(numB)) {
|
|
53
|
+
return config.legend.order === 'asc' ? numA - numB : numB - numA
|
|
54
|
+
} else {
|
|
55
|
+
return config.legend.order === 'asc' ? valA.localeCompare(valB) : valB.localeCompare(valA)
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
default:
|
|
60
|
+
return labels // Default case to handle any unexpected config.legend.order values
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const colorCode = config.legend?.colorCode
|
|
64
|
+
if (visualizationType === 'Deviation Bar') {
|
|
65
|
+
let versionName = isV1Palette(config) ? 'v1' : 'v2'
|
|
66
|
+
const [belowColor, aboveColor] = twoColorPalette?.[versionName]?.[config.twoColor.palette] || [
|
|
67
|
+
'#1D6ABF',
|
|
68
|
+
'#935586'
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
const labelBelow = {
|
|
72
|
+
datum: 'X',
|
|
73
|
+
index: 0,
|
|
74
|
+
text: `Below ${config.xAxis.targetLabel}`,
|
|
75
|
+
value: belowColor
|
|
76
|
+
}
|
|
77
|
+
const labelAbove = {
|
|
78
|
+
datum: 'X',
|
|
79
|
+
index: 1,
|
|
80
|
+
text: `Above ${config.xAxis.targetLabel}`,
|
|
81
|
+
value: aboveColor
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return reverseLabels([labelBelow, labelAbove])
|
|
85
|
+
}
|
|
86
|
+
if (visualizationType === 'Bar' && visualizationSubType === 'regular' && colorCode && series?.length === 1) {
|
|
87
|
+
const currentPaletteName = getCurrentPaletteName(config) || getFallbackColorPalette(config)
|
|
88
|
+
const paletteName = migratePaletteWithMap(currentPaletteName, chartPaletteMigrationMap, true)
|
|
89
|
+
let palette = getPaletteAccessor(colorPalettes, config, paletteName)
|
|
90
|
+
|
|
91
|
+
const numberOfKeys = data.length
|
|
92
|
+
|
|
93
|
+
// Check if we should use v2 distribution logic for better contrast
|
|
94
|
+
const version = getColorPaletteVersion(config)
|
|
95
|
+
const isSequentialOrDivergent =
|
|
96
|
+
paletteName && (paletteName.includes('sequential') || paletteName.includes('divergent'))
|
|
97
|
+
const isPairedBarOrDeviation = ['Paired Bar', 'Deviation Bar'].includes(config.visualizationType)
|
|
98
|
+
const useV2Distribution =
|
|
99
|
+
version === 2 && isSequentialOrDivergent && palette.length === 9 && numberOfKeys <= 9 && !isPairedBarOrDeviation
|
|
100
|
+
|
|
101
|
+
if (useV2Distribution && v2ColorDistribution[numberOfKeys]) {
|
|
102
|
+
// Use strategic color distribution for v2 sequential palettes
|
|
103
|
+
const distributionIndices = v2ColorDistribution[numberOfKeys]
|
|
104
|
+
palette = distributionIndices.map(index => palette[index])
|
|
105
|
+
} else {
|
|
106
|
+
// Use existing logic for v1 palettes and other cases
|
|
107
|
+
while (tableData.length > palette?.length) {
|
|
108
|
+
palette = palette.concat(palette)
|
|
109
|
+
}
|
|
110
|
+
palette = palette?.slice(0, data.length)
|
|
111
|
+
}
|
|
112
|
+
//store unique values to Set by colorCode
|
|
113
|
+
const set = new Set()
|
|
114
|
+
|
|
115
|
+
tableData.forEach(d => set.add(d[colorCode]))
|
|
116
|
+
|
|
117
|
+
// create labels with unique values
|
|
118
|
+
const uniqueLabels = Array.from(set).map((val, i) => {
|
|
119
|
+
const newLabel = {
|
|
120
|
+
datum: val,
|
|
121
|
+
index: i,
|
|
122
|
+
text: val,
|
|
123
|
+
value: palette?.[i]
|
|
124
|
+
}
|
|
125
|
+
return newLabel
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
return reverseLabels(uniqueLabels)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// get forecasting items inside of combo
|
|
132
|
+
if (runtime?.forecastingSeriesKeys?.length > 0) {
|
|
133
|
+
let seriesLabels = []
|
|
134
|
+
|
|
135
|
+
// Create palette lookup map - use version-specific palettes
|
|
136
|
+
// Forecasting charts use sequentialPalettes for v1, sequential-only palettes for v2
|
|
137
|
+
const paletteVersion = getColorPaletteVersion(config)
|
|
138
|
+
|
|
139
|
+
let forecastPalettes
|
|
140
|
+
if (paletteVersion === 1) {
|
|
141
|
+
// V1: Use original sequential palettes
|
|
142
|
+
forecastPalettes = sequentialPalettes
|
|
143
|
+
} else {
|
|
144
|
+
// V2: Only use sequential palettes (filter out divergent and qualitative)
|
|
145
|
+
const allV2Palettes = colorPalettesChartV2
|
|
146
|
+
forecastPalettes = {}
|
|
147
|
+
Object.keys(allV2Palettes).forEach(key => {
|
|
148
|
+
if (key.startsWith('sequential')) {
|
|
149
|
+
forecastPalettes[key] = allV2Palettes[key]
|
|
150
|
+
}
|
|
151
|
+
})
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const processedPalettes = updatePaletteNames(forecastPalettes)
|
|
155
|
+
const forecastingPalettes = buildForecastPaletteMappings(processedPalettes, paletteVersion)
|
|
156
|
+
|
|
157
|
+
//store unique values to Set by colorCode
|
|
158
|
+
// loop through each stage/group/area on the chart and create a label
|
|
159
|
+
config.runtime?.forecastingSeriesKeys?.map((outerGroup, index) => {
|
|
160
|
+
return outerGroup?.stages?.map((stage, index) => {
|
|
161
|
+
const palette = forecastingPalettes[stage.color] || false
|
|
162
|
+
let colorValue = palette?.[2] || '#ccc'
|
|
163
|
+
|
|
164
|
+
const newLabel = {
|
|
165
|
+
datum: stage.key,
|
|
166
|
+
index: index,
|
|
167
|
+
text: stage.key,
|
|
168
|
+
value: colorValue
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
seriesLabels.push(newLabel)
|
|
172
|
+
})
|
|
173
|
+
})
|
|
174
|
+
|
|
175
|
+
// loop through bars for now to meet requirements.
|
|
176
|
+
config.runtime.barSeriesKeys &&
|
|
177
|
+
config.runtime.barSeriesKeys.forEach((bar, index) => {
|
|
178
|
+
const currentPaletteName = getCurrentPaletteName(config) || getFallbackColorPalette(config)
|
|
179
|
+
const migratedPaletteName = migratePaletteWithMap(currentPaletteName, chartPaletteMigrationMap, true)
|
|
180
|
+
const palette = getPaletteAccessor(colorPalettes, config, migratedPaletteName)
|
|
181
|
+
let colorValue = palette?.[index] || '#ccc'
|
|
182
|
+
|
|
183
|
+
const newLabel = {
|
|
184
|
+
datum: bar,
|
|
185
|
+
index: index,
|
|
186
|
+
text: bar,
|
|
187
|
+
value: colorValue
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
seriesLabels.push(newLabel)
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
return reverseLabels(seriesLabels)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (config.series.some(item => item.name)) {
|
|
197
|
+
const uniqueLabels = Array.from(new Set(config.series.map(d => d.name || d.dataKey))).map((val, i) => ({
|
|
198
|
+
datum: val,
|
|
199
|
+
index: i,
|
|
200
|
+
text: val,
|
|
201
|
+
value: colorScale(val)
|
|
202
|
+
}))
|
|
203
|
+
return reverseLabels(uniqueLabels)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (
|
|
207
|
+
(config.visualizationType === 'Bar' || config.visualizationType === 'Combo') &&
|
|
208
|
+
config.visualizationSubType === 'regular' &&
|
|
209
|
+
config.suppressedData
|
|
210
|
+
) {
|
|
211
|
+
const lastIndex = defaultLabels.length - 1
|
|
212
|
+
let newLabels = []
|
|
213
|
+
|
|
214
|
+
config.suppressedData?.forEach(({ label, icon }, index) => {
|
|
215
|
+
if (label && icon) {
|
|
216
|
+
const newLabel = {
|
|
217
|
+
datum: label,
|
|
218
|
+
index: lastIndex + index,
|
|
219
|
+
text: label,
|
|
220
|
+
icon: <FaStar color='#000' size={15} />
|
|
221
|
+
}
|
|
222
|
+
newLabels.push(newLabel)
|
|
223
|
+
}
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
return [...defaultLabels, ...newLabels]
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return reverseLabels(defaultLabels)
|
|
230
|
+
}
|
|
@@ -22,7 +22,7 @@ const LegendWrapper: React.FC<LegendWrapperProps> = props => {
|
|
|
22
22
|
return classes.join(' ')
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
return <div className={getLegendWrappingClasses()}>{
|
|
25
|
+
return <div className={getLegendWrappingClasses()}>{children}</div>
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
export default LegendWrapper
|
|
@@ -105,7 +105,7 @@ const LineChartCircle = (props: LineChartCircleProps) => {
|
|
|
105
105
|
<g
|
|
106
106
|
transform={transformShape(pointData[config.xAxis.dataKey], pointData[filtered?.dataKey])}
|
|
107
107
|
className={`visx-glyph-group${displayArea ? '' : '-hidden'}`}
|
|
108
|
-
data-
|
|
108
|
+
data-seriesindex={seriesIndex}
|
|
109
109
|
>
|
|
110
110
|
<Shape
|
|
111
111
|
fillOpacity={mode === 'ALWAYS_SHOW_POINTS' ? 1 : 0}
|
|
@@ -142,7 +142,7 @@ const LineChartCircle = (props: LineChartCircleProps) => {
|
|
|
142
142
|
<g
|
|
143
143
|
transform={transformShape(pointData[config.xAxis?.dataKey], pointData[filtered?.dataKey])}
|
|
144
144
|
className={`visx-glyph-group${displayArea ? '' : '-hidden'}`}
|
|
145
|
-
data-
|
|
145
|
+
data-seriesindex={seriesIndex}
|
|
146
146
|
>
|
|
147
147
|
<Shape size={dotSize} stroke={color} fill={color} />
|
|
148
148
|
</g>
|
|
@@ -79,6 +79,21 @@ const LineChart = (props: LineChartProps) => {
|
|
|
79
79
|
? data.filter(d => d[seriesData.dynamicCategory] === seriesKey)
|
|
80
80
|
: data
|
|
81
81
|
const circleData = filterCircles(config?.preliminaryData, tableData, _seriesKey)
|
|
82
|
+
|
|
83
|
+
// Prepare sorted data for line and area rendering
|
|
84
|
+
const sortedData =
|
|
85
|
+
config.visualizationType == 'Bump Chart'
|
|
86
|
+
? _data
|
|
87
|
+
: config.xAxis.type === 'date-time' || config.xAxis.type === 'date'
|
|
88
|
+
? _data.sort((d1, d2) => {
|
|
89
|
+
let x1 = getXAxisData(d1)
|
|
90
|
+
let x2 = getXAxisData(d2)
|
|
91
|
+
if (x1 < x2) return -1
|
|
92
|
+
if (x2 < x1) return 1
|
|
93
|
+
return 0
|
|
94
|
+
})
|
|
95
|
+
: _data
|
|
96
|
+
|
|
82
97
|
return (
|
|
83
98
|
<Group
|
|
84
99
|
key={`series-${seriesKey}-${index}`}
|
|
@@ -228,10 +243,10 @@ const LineChart = (props: LineChartProps) => {
|
|
|
228
243
|
/>
|
|
229
244
|
|
|
230
245
|
{suppressedSegments.map((segment, index) => {
|
|
231
|
-
return Object.entries(segment.data).map(([key, value]) => {
|
|
246
|
+
return Object.entries(segment.data).map(([key, value], entryIndex) => {
|
|
232
247
|
return (
|
|
233
248
|
<LinePath
|
|
234
|
-
key={index}
|
|
249
|
+
key={`${index}-${key}-${entryIndex}`}
|
|
235
250
|
data={value}
|
|
236
251
|
x={d => xPos(d)}
|
|
237
252
|
y={d =>
|
|
@@ -310,19 +325,7 @@ const LineChart = (props: LineChartProps) => {
|
|
|
310
325
|
{/* STANDARD LINE */}
|
|
311
326
|
<LinePath
|
|
312
327
|
curve={allCurves[seriesData.lineType]}
|
|
313
|
-
data={
|
|
314
|
-
config.visualizationType == 'Bump Chart'
|
|
315
|
-
? _data
|
|
316
|
-
: config.xAxis.type === 'date-time' || config.xAxis.type === 'date'
|
|
317
|
-
? _data.sort((d1, d2) => {
|
|
318
|
-
let x1 = getXAxisData(d1)
|
|
319
|
-
let x2 = getXAxisData(d2)
|
|
320
|
-
if (x1 < x2) return -1
|
|
321
|
-
if (x2 < x1) return 1
|
|
322
|
-
return 0
|
|
323
|
-
})
|
|
324
|
-
: _data
|
|
325
|
-
}
|
|
328
|
+
data={sortedData}
|
|
326
329
|
x={d => xPos(d)}
|
|
327
330
|
y={d =>
|
|
328
331
|
seriesAxis === 'Right'
|
|
@@ -338,6 +341,26 @@ const LineChart = (props: LineChartProps) => {
|
|
|
338
341
|
return item[_seriesKey] !== '' && item[_seriesKey] !== null && item[_seriesKey] !== undefined
|
|
339
342
|
}}
|
|
340
343
|
/>
|
|
344
|
+
|
|
345
|
+
{/* SHADED AREA UNDER LINE */}
|
|
346
|
+
{config.showAreaUnderLine && (
|
|
347
|
+
<AreaClosed
|
|
348
|
+
curve={allCurves[seriesData.lineType]}
|
|
349
|
+
data={sortedData}
|
|
350
|
+
x={d => xPos(d)}
|
|
351
|
+
y={d =>
|
|
352
|
+
seriesAxis === 'Right'
|
|
353
|
+
? yScaleRight(getYAxisData(d, _seriesKey))
|
|
354
|
+
: yScale(Number(getYAxisData(d, _seriesKey)))
|
|
355
|
+
}
|
|
356
|
+
yScale={seriesAxis === 'Right' ? yScaleRight : yScale}
|
|
357
|
+
fill={colorScale(config.runtime.seriesLabels[seriesKey])}
|
|
358
|
+
fillOpacity={0.3}
|
|
359
|
+
defined={(item, i) => {
|
|
360
|
+
return item[_seriesKey] !== '' && item[_seriesKey] !== null && item[_seriesKey] !== undefined
|
|
361
|
+
}}
|
|
362
|
+
/>
|
|
363
|
+
)}
|
|
341
364
|
</>
|
|
342
365
|
)}
|
|
343
366
|
|