@cdc/core 4.24.7 → 4.24.9

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 (66) hide show
  1. package/assets/icon-gear-multi.svg +23 -0
  2. package/components/Alert/components/Alert.styles.css +15 -0
  3. package/components/Alert/components/Alert.tsx +39 -0
  4. package/components/Alert/index.tsx +3 -0
  5. package/components/DataTable/DataTable.tsx +106 -30
  6. package/components/DataTable/helpers/chartCellMatrix.tsx +3 -3
  7. package/components/DataTable/helpers/getChartCellValue.ts +1 -1
  8. package/components/DataTable/helpers/getDataSeriesColumns.ts +2 -2
  9. package/components/DataTable/helpers/mapCellMatrix.tsx +3 -3
  10. package/components/DataTable/types/TableConfig.ts +1 -1
  11. package/components/EditorPanel/Inputs.tsx +13 -4
  12. package/components/EditorPanel/VizFilterEditor/NestedDropdownEditor.tsx +268 -0
  13. package/components/EditorPanel/VizFilterEditor/VizFilterEditor.tsx +161 -82
  14. package/components/EditorPanel/VizFilterEditor/components/FilterOrder.tsx +31 -45
  15. package/components/Filters.tsx +223 -180
  16. package/components/Layout/components/Responsive.tsx +14 -4
  17. package/components/Layout/components/Sidebar/components/Sidebar.tsx +14 -5
  18. package/components/Layout/components/Sidebar/components/sidebar.styles.scss +15 -16
  19. package/components/Layout/components/Visualization/index.tsx +7 -1
  20. package/components/Layout/components/Visualization/visualizations.scss +32 -26
  21. package/components/Layout/styles/editor.scss +0 -8
  22. package/components/Legend/Legend.Gradient.tsx +133 -0
  23. package/components/LegendShape.tsx +28 -0
  24. package/components/MultiSelect/MultiSelect.tsx +6 -3
  25. package/components/NestedDropdown/NestedDropdown.tsx +47 -52
  26. package/components/NestedDropdown/nesteddropdown.styles.css +19 -25
  27. package/components/Table/Table.tsx +8 -5
  28. package/components/Table/components/Cell.tsx +2 -2
  29. package/components/Table/components/Row.tsx +25 -7
  30. package/components/_stories/Layout.Debug.stories.tsx +91 -0
  31. package/components/_stories/_mocks/bar-chart-suppressed.json +474 -0
  32. package/components/_stories/styles.scss +13 -1
  33. package/components/createBarElement.jsx +4 -4
  34. package/components/ui/Icon.tsx +21 -14
  35. package/components/ui/Title/Title.scss +0 -8
  36. package/helpers/DataTransform.ts +2 -2
  37. package/helpers/addValuesToFilters.ts +95 -16
  38. package/helpers/cove/accessibility.ts +16 -4
  39. package/helpers/coveUpdateWorker.ts +24 -10
  40. package/helpers/filterVizData.ts +23 -4
  41. package/helpers/formatConfigBeforeSave.ts +7 -2
  42. package/helpers/getGradientLegendWidth.ts +15 -0
  43. package/helpers/getTextWidth.ts +18 -0
  44. package/helpers/scaling.ts +7 -0
  45. package/helpers/tests/addValuesToFilters.test.ts +55 -0
  46. package/helpers/tests/filterVizData.test.ts +31 -0
  47. package/helpers/tests/invertValue.test.ts +35 -0
  48. package/helpers/updatePaletteNames.ts +19 -0
  49. package/helpers/{useDataVizClasses.js → useDataVizClasses.ts} +3 -2
  50. package/helpers/ver/4.24.5.ts +3 -3
  51. package/helpers/ver/4.24.7.ts +34 -3
  52. package/helpers/ver/4.24.9.ts +63 -0
  53. package/helpers/ver/tests/4.24.9.test.ts +22 -0
  54. package/helpers/ver/versionNeedsUpdate.ts +9 -0
  55. package/package.json +3 -3
  56. package/styles/_button-section.scss +1 -1
  57. package/styles/_global.scss +6 -2
  58. package/styles/filters.scss +4 -0
  59. package/types/Axis.ts +3 -0
  60. package/types/Dimensions.ts +1 -0
  61. package/types/General.ts +1 -1
  62. package/types/VizFilter.ts +24 -3
  63. package/components/LegendCircle.jsx +0 -17
  64. package/helpers/updatePaletteNames.js +0 -16
  65. /package/components/{Waiting.jsx → Waiting.tsx} +0 -0
  66. /package/helpers/ver/{4.23.4.ts → 4.24.4.ts} +0 -0
@@ -0,0 +1,63 @@
1
+ import { Legend } from './../../types/Legend'
2
+ import _ from 'lodash'
3
+ import { AnyVisualization } from '../../types/Visualization'
4
+ import { VizFilter } from '../../types/VizFilter'
5
+ import { AnyVisualization } from '../../types/Visualization'
6
+ import { VizFilter } from '../../types/VizFilter'
7
+ import versionNeedsUpdate from './versionNeedsUpdate'
8
+
9
+ /**
10
+ * Updates the configuration object to disable map zooming for single state maps in a dashboard.
11
+ * when the config is below version 4.24.9
12
+ */
13
+ const patchSingleStateZoom = config => {
14
+ if (config.type === 'dashboard') {
15
+ Object.values(config?.visualizations || {}).forEach((viz: AnyVisualization) => {
16
+ if (viz.type === 'map' && viz.general?.geoType === 'single-state') {
17
+ // if the version is less that 4.24.7 then allowMapZoom should be false
18
+ let allowZoom = versionNeedsUpdate(config.version, '4.24.9') ? false : viz.general.allowMapZoom
19
+ viz.general.allowMapZoom = allowZoom
20
+ }
21
+ })
22
+ }
23
+ if (config.type === 'map' && config.general?.geoType === 'single-state') {
24
+ // if the version is less that 4.24.7 then allowMapZoom should be false
25
+ let allowZoom = versionNeedsUpdate(config.version, '4.24.9') ? false : config.general.allowMapZoom
26
+ config.general.allowMapZoom = allowZoom
27
+ }
28
+ }
29
+
30
+ const doesNotHaveIds = (filters: VizFilter[]) => filters?.some(f => !f.id)
31
+
32
+ export const addIdsToVisFilters = config => {
33
+ if (config.type === 'dashboard') {
34
+ config.visualizations = Object.keys(config.visualizations).reduce((acc, curr) => {
35
+ const viz: AnyVisualization & { filters: VizFilter[] } = config.visualizations[curr]
36
+ if (viz.filters?.length && doesNotHaveIds(viz.filters)) {
37
+ acc[curr].filters = viz.filters.map((filter, i) => ({ ...filter, id: Date.now() + i }))
38
+ }
39
+ return acc
40
+ }, config.visualizations)
41
+ } else if (config.filters?.length && doesNotHaveIds(config.filters)) {
42
+ config.filters = config.filters.map((filter, i) => ({ ...filter, id: Date.now() + i }))
43
+ }
44
+ }
45
+
46
+ const supportLineStyledLegend = newConfig => {
47
+ // support for Charts
48
+ if (newConfig.legend?.lineMode) {
49
+ newConfig.legend.style = 'lines'
50
+ }
51
+ }
52
+
53
+ const update_4_24_9 = config => {
54
+ const ver = '4.24.9'
55
+ const newConfig = _.cloneDeep(config)
56
+ patchSingleStateZoom(newConfig)
57
+ addIdsToVisFilters(newConfig)
58
+ supportLineStyledLegend(config)
59
+ newConfig.version = ver
60
+ return newConfig
61
+ }
62
+
63
+ export default update_4_24_9
@@ -0,0 +1,22 @@
1
+ import { addIdsToVisFilters } from '../4.24.9'
2
+ import { coveUpdateWorker } from '../../coveUpdateWorker'
3
+ import { expect, describe, it } from 'vitest'
4
+
5
+ describe('addIdsToVisFilters', () => {
6
+ it('adds ids to vis filters on dashboards', () => {
7
+ const mockConfig = { type: 'dashboard', visualizations: { a: { filters: [{}] } } } as any
8
+ addIdsToVisFilters(mockConfig)
9
+ expect(mockConfig.visualizations.a.filters[0].id).toBeDefined()
10
+ })
11
+ it('adds ids to vis filters on non dashboards', () => {
12
+ const mockConfig = { filters: [{}] } as any
13
+ addIdsToVisFilters(mockConfig)
14
+ expect(mockConfig.filters[0].id).toBeDefined()
15
+ })
16
+ it('adds ids to nested multi-dashboards', () => {
17
+ const mockConfig = { type: 'dashboard', rows: [], visualizations: { a: { filters: [{}] } }, multiDashboards: [{ rows: [], visualizations: { a: { filters: [{}] } } }] }
18
+ const convertedConfig = coveUpdateWorker(mockConfig)
19
+ expect(convertedConfig.visualizations.a.filters[0].id).toBeDefined()
20
+ expect(convertedConfig.multiDashboards[0].visualizations.a.filters[0].id).toBeDefined()
21
+ })
22
+ })
@@ -0,0 +1,9 @@
1
+ export default function versionNeedsUpdate(previousVersion: string, currentVersion: string): boolean {
2
+ if (!previousVersion) return true
3
+ const [prevMajor, prevMinor, prevPatch] = previousVersion.split('.').map(Number)
4
+ const [currMajor, currMinor, currPatch] = currentVersion.split('.').map(Number)
5
+ if (currMajor > prevMajor) return true
6
+ if (currMajor === prevMajor && currMinor > prevMinor) return true
7
+ if (currMajor === prevMajor && currMinor === prevMinor && currPatch > prevPatch) return true
8
+ return false
9
+ }
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@cdc/core",
3
- "version": "4.24.7",
3
+ "version": "4.24.9",
4
4
  "description": "Core components, styles, hooks, and helpers, for the CDC Open Visualization project",
5
5
  "moduleName": "CdcCore",
6
6
  "main": "dist/cdccore",
7
7
  "scripts": {
8
- "test": "vitest run --reporter verbose",
8
+ "test": "vitest run --environment jsdom --reporter verbose",
9
9
  "test-watch": "vitest watch --reporter verbose",
10
10
  "test-watch:ui": "vitest --ui"
11
11
  },
@@ -33,5 +33,5 @@
33
33
  "react": "^18.2.0",
34
34
  "react-dom": "^18.2.0"
35
35
  },
36
- "gitHead": "7a7372d03778cb977e0e92e3b3bc1a35f8a5bfaf"
36
+ "gitHead": "c4b0402afe6ed209a85b7078711549b9fd7dae7d"
37
37
  }
@@ -14,9 +14,9 @@
14
14
 
15
15
  // links that appear above data tables
16
16
  .download-links {
17
- padding: 0px 1em;
18
17
  display: flex;
19
18
  justify-content: flex-end;
19
+ width: 100%;
20
20
  &.brush-active {
21
21
  margin-top: 2em;
22
22
  }
@@ -181,7 +181,11 @@ select {
181
181
  }
182
182
 
183
183
  section.introText {
184
- padding: 15px;
184
+ width: 100%;
185
+ margin-bottom: 25px;
186
+ &.legend_visible_top {
187
+ margin-bottom: 0;
188
+ }
185
189
  }
186
190
 
187
191
  section.footnotes {
@@ -191,7 +195,7 @@ section.footnotes {
191
195
  }
192
196
 
193
197
  .cdc-chart-inner-container .subtext {
194
- padding: 15px;
198
+ padding: 15px 0;
195
199
  }
196
200
 
197
201
  .margin-left-href {
@@ -28,6 +28,10 @@ section.filters-section {
28
28
  border-radius: 10px;
29
29
  margin-bottom: 10px;
30
30
  display: block !important;
31
+
32
+ &.legend_visible_top {
33
+ margin-bottom: 0px;
34
+ }
31
35
  }
32
36
 
33
37
  div.single-filters {
package/types/Axis.ts CHANGED
@@ -5,6 +5,7 @@ export type Anchor = {
5
5
  }
6
6
 
7
7
  export type Axis = {
8
+ categories: [{ label: string; height: string; color: string }]
8
9
  scalePadding: number
9
10
  anchors?: Anchor[]
10
11
  dataKey: string
@@ -43,4 +44,6 @@ export type Axis = {
43
44
  tickRotation?: number
44
45
  tickWidthMax?: number
45
46
  type: string
47
+ axisBBox: number
48
+ maxValue: string
46
49
  }
@@ -0,0 +1 @@
1
+ export type DimensionsType = [number, number]
package/types/General.ts CHANGED
@@ -8,7 +8,7 @@ export type General = {
8
8
  allowMapZoom?: boolean
9
9
  showMissingDataLabel: boolean
10
10
  showSuppressedSymbol: boolean
11
- showZeroValueDataLabel: boolean
12
11
  showAnnotationDropdown?: boolean
12
+ hideNullValue: boolean
13
13
  title: string
14
14
  }
@@ -1,18 +1,31 @@
1
+ export type OrderBy = 'asc' | 'desc' | 'cust'
2
+
1
3
  export type FilterBase = {
2
4
  columnName: string
3
5
  values: string[]
4
6
  showDropdown: boolean
7
+ id: number
8
+ parents: number[]
5
9
  }
6
10
 
11
+ export type VizFilterStyle =
12
+ | 'tab'
13
+ | 'pill'
14
+ | 'tab bar'
15
+ | 'dropdown'
16
+ | 'dropdown bar'
17
+ | 'multi-select'
18
+ | 'nested-dropdown'
7
19
  export type GeneralFilter = FilterBase & {
8
20
  active: string
9
21
  queuedActive: string
10
- filterStyle: 'tab' | 'pill' | 'tab bar' | 'dropdown' | 'dropdown bar' | 'multi-select'
22
+ filterStyle: VizFilterStyle
11
23
  label: string
12
- order: 'asc' | 'desc' | 'cust'
13
- orderedValues?: string[]
24
+ order: OrderBy
25
+ orderedValues?: string[] // should only exist if the order is 'cust'
14
26
  queryParameter: string
15
27
  setByQueryParameter: string
28
+ subGrouping: SubGrouping
16
29
  type: 'url'
17
30
  }
18
31
 
@@ -21,4 +34,12 @@ export type MultiSelectFilter = {
21
34
  selectLimit: number
22
35
  } & Omit<GeneralFilter, 'active'>
23
36
 
37
+ export type SubGrouping = {
38
+ active: string
39
+ columnName: string
40
+ setByQueryParameter: string
41
+ order?: OrderBy
42
+ valuesLookup: Record<string, { orderedValues?: string[]; values: string[] }>
43
+ }
44
+
24
45
  export type VizFilter = GeneralFilter | MultiSelectFilter
@@ -1,17 +0,0 @@
1
- import React from 'react'
2
-
3
- export default function LegendCircle({ fill, borderColor, display = 'inline-block', viewport }) {
4
- const dimensions = ['sm', 'xs', 'xxs'].includes(viewport) ? { width: '0.7em', height: '0.7em' } : { width: '1em', height: '1em' }
5
- const styles = {
6
- marginRight: '5px',
7
- borderRadius: '300px',
8
- verticalAlign: 'middle',
9
- display: display,
10
- height: dimensions.height || '1em',
11
- width: dimensions.width || '1em',
12
- border: borderColor ? `${borderColor} 1px solid` : 'rgba(0,0,0,.3) 1px solid',
13
- backgroundColor: fill
14
- }
15
-
16
- return <span className='legend-item' style={styles} />
17
- }
@@ -1,16 +0,0 @@
1
- export function updatePaletteNames(colorPalettes) {
2
- // this function adds REVERSE keyword to each palette
3
- delete colorPalettes.qualitative9 // delete palette before reversing
4
- let palettereversed = {}
5
- for (const [paletteName, hexCodeArr] of Object.entries(colorPalettes)) {
6
- const paletteStr = String(paletteName)
7
-
8
- if (!paletteStr.endsWith('reverse')) {
9
- let palette = paletteStr.concat('reverse') // add to the end of the string "reverse"
10
- palettereversed[palette] = [...hexCodeArr].reverse() // reverses arrays elements and create new keys on object
11
- } else {
12
- palettereversed = { ...colorPalettes }
13
- }
14
- }
15
- return { ...palettereversed, ...colorPalettes }
16
- }
File without changes
File without changes