@cdc/dashboard 4.25.3 → 4.25.6

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 (63) hide show
  1. package/Dynamic_Data.md +79 -0
  2. package/Override_Data.md +39 -0
  3. package/dist/cdcdashboard.js +77308 -78377
  4. package/examples/legend-issue-data.json +1874 -0
  5. package/examples/legend-issue.json +749 -0
  6. package/examples/m2.json +32904 -0
  7. package/examples/map.json +628 -0
  8. package/examples/special-classes.json +54340 -0
  9. package/index.html +1 -26
  10. package/package.json +10 -15
  11. package/src/CdcDashboardComponent.tsx +65 -216
  12. package/src/_stories/Dashboard.stories.tsx +2 -0
  13. package/src/_stories/_mock/api-filter-map.json +43 -1
  14. package/src/components/CollapsibleVisualizationRow.tsx +4 -6
  15. package/src/components/DashboardEditors.tsx +143 -0
  16. package/src/components/DashboardFilters/DashboardFilters.tsx +205 -205
  17. package/src/components/DashboardFilters/DashboardFiltersEditor/components/APIModal.tsx +129 -0
  18. package/src/components/DashboardFilters/DashboardFiltersEditor/components/FilterEditor.tsx +680 -652
  19. package/src/components/DashboardFilters/DashboardFiltersWrapper.tsx +198 -198
  20. package/src/components/DataDesignerModal.tsx +33 -14
  21. package/src/components/Header/Header.tsx +7 -9
  22. package/src/components/MultiConfigTabs/multiconfigtabs.styles.css +3 -0
  23. package/src/components/Row.tsx +2 -24
  24. package/src/components/VisualizationRow.tsx +191 -214
  25. package/src/helpers/getVizConfig.ts +108 -80
  26. package/src/helpers/getVizRowColumnLocator.ts +0 -1
  27. package/src/helpers/reloadURLHelpers.ts +11 -6
  28. package/src/helpers/shouldLoadAllFilters.ts +30 -30
  29. package/src/index.tsx +2 -1
  30. package/src/scss/main.scss +0 -5
  31. package/src/store/dashboard.actions.ts +2 -2
  32. package/src/store/dashboard.reducer.ts +15 -11
  33. package/src/types/ConfigRow.ts +0 -1
  34. package/src/types/Dashboard.ts +1 -1
  35. package/src/types/DashboardConfig.ts +1 -1
  36. package/src/types/SharedFilter.ts +2 -0
  37. package/examples/private/DEV-10120.json +0 -1294
  38. package/examples/private/DEV-10527.json +0 -845
  39. package/examples/private/DEV-10586.json +0 -54319
  40. package/examples/private/DEV-10856.json +0 -54319
  41. package/examples/private/DEV-9199.json +0 -606
  42. package/examples/private/DEV-9644.json +0 -20092
  43. package/examples/private/DEV-9684.json +0 -2135
  44. package/examples/private/DEV-9932.json +0 -95
  45. package/examples/private/DEV-9989.json +0 -229
  46. package/examples/private/art-dashboard.json +0 -18174
  47. package/examples/private/art-scratch.json +0 -2406
  48. package/examples/private/bird-flu-2.json +0 -440
  49. package/examples/private/bird-flu.json +0 -413
  50. package/examples/private/dashboard-config-ehdi.json +0 -29915
  51. package/examples/private/dashboard-map-filter.json +0 -815
  52. package/examples/private/dashboard-margins.js +0 -15
  53. package/examples/private/dataset.json +0 -1452
  54. package/examples/private/dev-10856-2.json +0 -1348
  55. package/examples/private/ehdi-data.json +0 -29502
  56. package/examples/private/exposure-source-h5-data.csv +0 -26
  57. package/examples/private/fatal-data.csv +0 -3159
  58. package/examples/private/feelings.json +0 -1
  59. package/examples/private/gaza-issue.json +0 -1214
  60. package/examples/private/markup.json +0 -115
  61. package/examples/private/nhis.json +0 -1792
  62. package/examples/private/workforce.json +0 -2041
  63. package/src/types/DataSet.ts +0 -11
@@ -1,80 +1,108 @@
1
- import _ from 'lodash'
2
- import { MultiDashboardConfig } from '../types/MultiDashboard'
3
- import DataTransform from '@cdc/core/helpers/DataTransform'
4
- import { getApplicableFilters } from './getFilteredData'
5
- import { filterData } from './filterData'
6
- import Footnotes from '@cdc/core/types/Footnotes'
7
-
8
- const transform = new DataTransform()
9
-
10
- export const getFootnotesVizConfig = (vizKey: string, rowNumber: number, config: MultiDashboardConfig) => {
11
- const visualizationConfig = _.cloneDeep(config.visualizations[vizKey])
12
-
13
- const data = config.datasets[visualizationConfig.dataKey]?.data
14
- const dataColumns = data?.length ? Object.keys(data[0]) : []
15
- const filters = (getApplicableFilters(config.dashboard, rowNumber) || []).filter(filter =>
16
- dataColumns.includes(filter.columnName)
17
- )
18
- if (filters.length) {
19
- visualizationConfig.formattedData = filterData(filters, data)
20
- }
21
- visualizationConfig.data = data
22
- return visualizationConfig as Footnotes
23
- }
24
-
25
- export const getVizConfig = (
26
- visualizationKey: string,
27
- rowNumber: number,
28
- config: MultiDashboardConfig,
29
- data: Object,
30
- filteredData?: Object
31
- ) => {
32
- if (rowNumber === undefined) return {}
33
- const visualizationConfig = _.cloneDeep(config.visualizations[visualizationKey])
34
- const rowData = config.rows[rowNumber]
35
- if (rowData.footnotesId && rowData.footnotesId === visualizationKey) {
36
- // return the footnotes visualization config with filtered data
37
- return getFootnotesVizConfig(visualizationKey, rowNumber, config)
38
- }
39
- if (rowData?.dataKey) {
40
- // data configured on the row
41
- Object.assign(visualizationConfig, _.pick(rowData, ['dataKey', 'dataDescription', 'formattedData', 'data']))
42
- }
43
-
44
- if (visualizationConfig.table && config.dashboard.sharedFilters.length) {
45
- // Download CSV button needs to know to include shared filter columns
46
- const sharedFilterColumns = config.dashboard.sharedFilters.reduce((acc, filter) => {
47
- if (!filter.usedBy?.length || filter.usedBy?.includes(visualizationKey)) {
48
- const apiFilter = filter.apiFilter
49
- const colName = apiFilter?.textSelector || apiFilter?.valueSelector || filter.columnName
50
- acc.push(colName)
51
- const subGrouping =
52
- apiFilter?.subgroupTextSelector || apiFilter?.subgroupValueSelector || filter.subGrouping?.columnName
53
- if (subGrouping) {
54
- acc.push(subGrouping)
55
- }
56
- }
57
- return acc
58
- }, [])
59
- visualizationConfig.table.sharedFilterColumns = sharedFilterColumns
60
- }
61
-
62
- if (visualizationConfig.formattedData) visualizationConfig.originalFormattedData = visualizationConfig.formattedData
63
- const filteredVizData = filteredData?.[rowNumber] ?? filteredData?.[visualizationKey]
64
-
65
- if (filteredVizData) {
66
- visualizationConfig.data = filteredVizData || []
67
- if (visualizationConfig.formattedData) {
68
- visualizationConfig.formattedData = visualizationConfig.data
69
- }
70
- } else {
71
- const dataKey = visualizationConfig.dataKey || 'backwards-compatibility'
72
- visualizationConfig.data = data[dataKey] || []
73
- if (visualizationConfig.formattedData) {
74
- visualizationConfig.formattedData =
75
- transform.developerStandardize(visualizationConfig.data, visualizationConfig.dataDescription) ||
76
- visualizationConfig.data
77
- }
78
- }
79
- return visualizationConfig
80
- }
1
+ import _ from 'lodash'
2
+ import { MultiDashboardConfig } from '../types/MultiDashboard'
3
+ import DataTransform from '@cdc/core/helpers/DataTransform'
4
+ import { getApplicableFilters } from './getFilteredData'
5
+ import { filterData } from './filterData'
6
+ import { AnyVisualization } from '@cdc/core/types/Visualization'
7
+
8
+ const transform = new DataTransform()
9
+
10
+ export const getFootnotesVizConfig = (
11
+ visualizationConfig: AnyVisualization,
12
+ rowNumber: number,
13
+ config: MultiDashboardConfig
14
+ ) => {
15
+ if (!visualizationConfig?.footnotes) return visualizationConfig
16
+ const data = _.cloneDeep(config.datasets[visualizationConfig.footnotes.dataKey]?.data)
17
+ const dataColumns = data?.length ? Object.keys(data[0]) : []
18
+ const filters = (getApplicableFilters(config.dashboard, rowNumber) || []).filter(filter =>
19
+ dataColumns.includes(filter.columnName)
20
+ )
21
+
22
+ const newConfig = _.cloneDeep(visualizationConfig)
23
+
24
+ if (filters.length) {
25
+ _.set(newConfig, 'footnotes.data', filterData(filters, data))
26
+ } else {
27
+ _.set(newConfig, 'footnotes.data', data)
28
+ }
29
+
30
+ return newConfig
31
+ }
32
+
33
+ export const getVizConfig = (
34
+ visualizationKey: string,
35
+ rowNumber: number,
36
+ config: MultiDashboardConfig,
37
+ data: Object,
38
+ filteredData?: Object,
39
+ filteredDataOverride?: Object[],
40
+ multiVizColumn?: string
41
+ ): AnyVisualization => {
42
+ if (rowNumber === undefined) return {} as AnyVisualization
43
+ const visualizationConfig = _.cloneDeep(config.visualizations[visualizationKey])
44
+ const rowData = config.rows[rowNumber]
45
+ if (visualizationConfig.footnotes?.dataKey) {
46
+ _.set(visualizationConfig, 'footnotes.data', config.datasets[visualizationConfig.footnotes.dataKey]?.data)
47
+ }
48
+ if (rowData?.dataKey) {
49
+ // data configured on the row
50
+ Object.assign(visualizationConfig, _.pick(rowData, ['dataKey', 'dataDescription', 'formattedData', 'data']))
51
+ }
52
+
53
+ if (visualizationConfig.table && config.dashboard.sharedFilters.length) {
54
+ // Download CSV button needs to know to include shared filter columns
55
+ const sharedFilterColumns = config.dashboard.sharedFilters.reduce((acc, filter) => {
56
+ if (!filter.usedBy?.length || filter.usedBy?.includes(visualizationKey)) {
57
+ const apiFilter = filter.apiFilter
58
+ const colName = apiFilter?.textSelector || apiFilter?.valueSelector || filter.columnName
59
+ acc.push(colName)
60
+ const subGrouping =
61
+ apiFilter?.subgroupTextSelector || apiFilter?.subgroupValueSelector || filter.subGrouping?.columnName
62
+ if (subGrouping) {
63
+ acc.push(subGrouping)
64
+ }
65
+ }
66
+ return acc
67
+ }, [])
68
+ visualizationConfig.table.sharedFilterColumns = sharedFilterColumns
69
+ }
70
+
71
+ if (visualizationConfig.formattedData) visualizationConfig.originalFormattedData = visualizationConfig.formattedData
72
+ const filteredVizData = filteredData?.[rowNumber] ?? filteredData?.[visualizationKey]
73
+
74
+ if (filteredVizData) {
75
+ visualizationConfig.data = filteredVizData || []
76
+ if (visualizationConfig.formattedData) {
77
+ visualizationConfig.formattedData = visualizationConfig.data
78
+ }
79
+ } else {
80
+ const dataKey = visualizationConfig.dataKey || 'backwards-compatibility'
81
+ visualizationConfig.data = data[dataKey] || []
82
+ if (visualizationConfig.formattedData) {
83
+ visualizationConfig.formattedData =
84
+ transform.developerStandardize(visualizationConfig.data, visualizationConfig.dataDescription) ||
85
+ visualizationConfig.data
86
+ }
87
+ }
88
+
89
+ if (filteredDataOverride) {
90
+ visualizationConfig.data = filteredDataOverride
91
+ if (visualizationConfig.formattedData) {
92
+ visualizationConfig.formattedData = filteredDataOverride
93
+ }
94
+ }
95
+ if (visualizationConfig.footnotes) {
96
+ const visConfigWithFootnotes = getFootnotesVizConfig(visualizationConfig, rowNumber, config)
97
+ if (multiVizColumn && filteredDataOverride) {
98
+ const vizCategory = filteredDataOverride[0][multiVizColumn]
99
+ // the multiViz filtering filtering is applied after the dashboard filters
100
+
101
+ const categoryFootnote = visConfigWithFootnotes.footnotes.data.filter(d => d[multiVizColumn] === vizCategory)
102
+ _.set(visConfigWithFootnotes, 'footnotes.data', categoryFootnote)
103
+ }
104
+ return visConfigWithFootnotes
105
+ }
106
+
107
+ return visualizationConfig as AnyVisualization
108
+ }
@@ -6,6 +6,5 @@ export const getVizRowColumnLocator = (rows: ConfigRow[]): Record<string, { row:
6
6
  curr.columns?.forEach((column, columnIndex) => {
7
7
  if (column.widget !== undefined) acc[column.widget] = { row: index, column: columnIndex }
8
8
  })
9
- if (curr.footnotesId) acc[curr.footnotesId] = { row: index, column: 0 }
10
9
  return acc
11
10
  }, {})
@@ -5,6 +5,7 @@ import { AnyVisualization, Visualization } from '@cdc/core/types/Visualization'
5
5
  import _ from 'lodash'
6
6
  import { DashboardConfig } from '../types/DashboardConfig'
7
7
  import { ConfigRow } from '../types/ConfigRow'
8
+ import { getVizRowColumnLocator } from './getVizRowColumnLocator'
8
9
 
9
10
  export const isUpdateNeeded = (
10
11
  filters: SharedFilter[],
@@ -30,8 +31,11 @@ type GetDatasetKeysParams = Pick<DashboardConfig, 'visualizations' | 'datasets'
30
31
  export const getDatasetKeys = ({ visualizations, datasets, rows }: GetDatasetKeysParams): string[] => {
31
32
  const vizDataKeys = Object.values(visualizations).map(viz => viz.dataKey)
32
33
  const rowDataKeys = rows.map(row => row.dataKey)
34
+ const footnoteDataKeys = Object.values(visualizations)
35
+ .map(viz => viz.footnotes?.dataKey)
36
+ .filter(Boolean)
33
37
  // ensure to only load datasets for the specific dashboard tab.
34
- const datasetsUsedByDashboard = _.uniq([...vizDataKeys, ...rowDataKeys])
38
+ const datasetsUsedByDashboard = _.uniq([...vizDataKeys, ...rowDataKeys, ...footnoteDataKeys])
35
39
  return Object.keys(datasets).filter(datasetKey => datasetsUsedByDashboard.includes(datasetKey))
36
40
  }
37
41
 
@@ -110,10 +114,11 @@ export const filterUsedByDataUrl = (
110
114
  ) => {
111
115
  if (!filter.usedBy || !filter.usedBy.length) return true
112
116
  const vizUsingFilters = filter.usedBy?.map(vizOrRowKey => visualizations[vizOrRowKey] || rows[vizOrRowKey])
113
- // push any footnotes which are using the filter also
114
- filter.usedBy?.forEach(vizOrRowKey => {
115
- if (rows[vizOrRowKey] && rows[vizOrRowKey].footnotesId)
116
- return vizUsingFilters.push(visualizations[rows[vizOrRowKey].footnotesId])
117
+
118
+ return vizUsingFilters?.some(viz => {
119
+ const usedByViz = viz?.dataKey === datasetKey
120
+ // datasetKey might be a key to a dynamic footnotes URL
121
+ const usedByVizFootnote = viz?.footnotes?.dataKey === datasetKey
122
+ return usedByViz || usedByVizFootnote
117
123
  })
118
- return vizUsingFilters?.some(viz => viz?.dataKey === datasetKey)
119
124
  }
@@ -1,30 +1,30 @@
1
- import { getQueryParam } from '@cdc/core/helpers/queryStringUtils'
2
- import { Visualization } from '@cdc/core/types/Visualization'
3
-
4
- export const shouldLoadAllFilters = (config, isEditorPanel): boolean => {
5
- const autoLoad = Boolean(getQueryParam('cove-auto-load'))
6
- const activeConfig = config.multiDashboards ? config.multiDashboards[config.activeDashboard] : config
7
- const hasFilterByFileNameFunctionality = activeConfig.dashboard.sharedFilters?.some(
8
- filter => filter.filterBy === 'File Name'
9
- )
10
- const isAutoLoadTab = Object.values(activeConfig.visualizations).reduce((acc, viz: Visualization) => {
11
- if (acc === false) return acc
12
- if (viz.visualizationType === 'dashboardFilters') {
13
- if (viz.filterBehavior === 'Apply Button') return false
14
- if (viz.autoLoad) {
15
- return true
16
- }
17
- }
18
- return acc
19
- }, undefined)
20
- if (autoLoad || isAutoLoadTab || hasFilterByFileNameFunctionality || isEditorPanel) {
21
- const rowDataSetKeys = activeConfig.rows.map(row => row.dataKey).filter(Boolean)
22
- const dataKeys = Object.values(activeConfig.visualizations)
23
- .map((visualization: Visualization) => visualization.dataKey)
24
- .filter(Boolean)
25
- .concat(rowDataSetKeys)
26
- const missingData = dataKeys.find(dataset => !config.datasets[dataset].data?.length)
27
- return Boolean(missingData)
28
- }
29
- return false
30
- }
1
+ import { getQueryParam } from '@cdc/core/helpers/queryStringUtils'
2
+ import { Visualization } from '@cdc/core/types/Visualization'
3
+
4
+ export const shouldLoadAllFilters = (config, isEditorPanel): boolean => {
5
+ const autoLoad = Boolean(getQueryParam('cove-auto-load'))
6
+ const activeConfig = config.multiDashboards ? config.multiDashboards[config.activeDashboard] : config
7
+ const hasFilterByFileNameFunctionality = activeConfig.dashboard.sharedFilters?.some(
8
+ filter => filter.filterBy === 'File Name'
9
+ )
10
+ const isAutoLoadTab = Object.values(activeConfig.visualizations).reduce((acc, viz: Visualization) => {
11
+ if (acc === false) return acc
12
+ if (viz.visualizationType === 'dashboardFilters') {
13
+ if (viz.filterBehavior === 'Apply Button') return false
14
+ if (viz.autoLoad) {
15
+ return true
16
+ }
17
+ }
18
+ return acc
19
+ }, undefined)
20
+ if (autoLoad || isAutoLoadTab || hasFilterByFileNameFunctionality || isEditorPanel) {
21
+ const rowDataSetKeys = activeConfig.rows.map(row => row.dataKey).filter(Boolean)
22
+ const dataKeys = Object.values(activeConfig.visualizations)
23
+ .map((visualization: Visualization) => visualization.dataKey)
24
+ .filter(Boolean)
25
+ .concat(rowDataSetKeys)
26
+ const missingData = dataKeys.find(dataset => !config.datasets[dataset]?.data?.length)
27
+ return Boolean(missingData)
28
+ }
29
+ return false
30
+ }
package/src/index.tsx CHANGED
@@ -1,10 +1,11 @@
1
1
  import React from 'react'
2
2
  import ReactDOM from 'react-dom/client'
3
3
 
4
- import MultiDashboardWrapper from './CdcDashboard'
5
4
  import '@cdc/core/styles/cove-main.scss'
6
5
  import './coreStyles_dashboard.scss'
7
6
 
7
+ import MultiDashboardWrapper from './CdcDashboard'
8
+
8
9
  let isEditor = window.location.href.includes('editor=true')
9
10
  let isDebug = window.location.href.includes('debug=true')
10
11
 
@@ -121,11 +121,6 @@
121
121
  }
122
122
  }
123
123
 
124
- .visually-hidden {
125
- position: fixed;
126
- left: -10000px;
127
- }
128
-
129
124
  .loader {
130
125
  width: 100%;
131
126
  text-align: center;
@@ -6,7 +6,6 @@ import { AnyVisualization } from '@cdc/core/types/Visualization'
6
6
  import Footnotes from '@cdc/core/types/Footnotes'
7
7
  import { SharedFilter } from '../types/SharedFilter'
8
8
 
9
- type ADD_FOOTNOTE = Action<'ADD_FOOTNOTE', { id: string; rowIndex: number; config: Footnotes }>
10
9
  type ADD_VISUALIZATION = Action<'ADD_VISUALIZATION', { rowIdx: number; colIdx: number; newViz: AnyVisualization }>
11
10
  type APPLY_CONFIG = Action<'APPLY_CONFIG', [Config, Object?]>
12
11
  type DELETE_WIDGET = Action<'DELETE_WIDGET', { uid: string }>
@@ -30,12 +29,12 @@ type ADD_NEW_DASHBOARD = Action<'ADD_NEW_DASHBOARD', undefined>
30
29
  type SAVE_CURRENT_CHANGES = Action<'SAVE_CURRENT_CHANGES', undefined>
31
30
  type SWITCH_CONFIG = Action<'SWITCH_CONFIG', number>
32
31
  type TOGGLE_ROW = Action<'TOGGLE_ROW', { rowIndex: number; colIndex: number }>
32
+ type RESET_VISUALIZATION = Action<'RESET_VISUALIZATION', { vizKey: string }>
33
33
  type UPDATE_VISUALIZATION = Action<'UPDATE_VISUALIZATION', { vizKey: string; configureData: Partial<AnyVisualization> }>
34
34
  type UPDATE_ROW = Action<'UPDATE_ROW', { rowIndex: number; rowData: Partial<ConfigRow> }>
35
35
  type UPDATE_TOGGLE_NAME = Action<'UPDATE_TOGGLE_NAME', { rowIndex: number; columnIndex: number; toggleName: string }>
36
36
 
37
37
  type DashboardActions =
38
- | ADD_FOOTNOTE
39
38
  | ADD_VISUALIZATION
40
39
  | APPLY_CONFIG
41
40
  | ADD_NEW_DASHBOARD
@@ -56,6 +55,7 @@ type DashboardActions =
56
55
  | SWITCH_CONFIG
57
56
  | INITIALIZE_MULTIDASHBOARDS
58
57
  | TOGGLE_ROW
58
+ | RESET_VISUALIZATION
59
59
  | UPDATE_VISUALIZATION
60
60
  | UPDATE_ROW
61
61
  | UPDATE_TOGGLE_NAME
@@ -39,17 +39,6 @@ export type DashboardState = {
39
39
 
40
40
  const reducer = (state: DashboardState, action: DashboardActions): DashboardState => {
41
41
  switch (action.type) {
42
- case 'ADD_FOOTNOTE': {
43
- const { id, rowIndex, config } = action.payload
44
- const newRows = state.config.rows.map((row, i) => (i === rowIndex ? { ...row, footnotesId: id } : row))
45
- return {
46
- ...state,
47
- config: saveMultiChanges(
48
- { ...state.config, rows: newRows, visualizations: { ...state.config.visualizations, [id]: config } },
49
- state.config.activeDashboard
50
- )
51
- }
52
- }
53
42
  case 'ADD_NEW_DASHBOARD': {
54
43
  const currentMultiDashboards = state.config.multiDashboards
55
44
  const label = 'New Dashboard ' + (currentMultiDashboards.length + 1)
@@ -195,6 +184,21 @@ const reducer = (state: DashboardState, action: DashboardActions): DashboardStat
195
184
  config: saveMultiChanges({ ...state.config, rows: newRows }, state.config.activeDashboard)
196
185
  }
197
186
  }
187
+ case 'RESET_VISUALIZATION': {
188
+ const { vizKey } = action.payload
189
+ const updatedViz = { ...state.config.visualizations[vizKey] } as AnyVisualization
190
+ delete updatedViz.data
191
+ delete updatedViz.dataKey
192
+ delete updatedViz.dataDescription
193
+ delete updatedViz.formattedData
194
+ return {
195
+ ...state,
196
+ config: saveMultiChanges(
197
+ { ...state.config, visualizations: { ...state.config.visualizations, [vizKey]: updatedViz } },
198
+ state.config.activeDashboard
199
+ )
200
+ }
201
+ }
198
202
  case 'UPDATE_VISUALIZATION': {
199
203
  const { vizKey, configureData } = action.payload
200
204
  const updatedViz = { ...state.config.visualizations[vizKey], ...configureData } as AnyVisualization
@@ -16,5 +16,4 @@ export type ConfigRow = {
16
16
  toggle?: boolean
17
17
  equalHeight?: boolean
18
18
  multiVizColumn?: string
19
- footnotesId?: string // id for the footnotes in the vizConfig section
20
19
  } & ConfigureData
@@ -1,4 +1,4 @@
1
- import { DataSet } from './DataSet'
1
+ import { DataSet } from '@cdc/core/types/DataSet'
2
2
  import { SharedFilter } from './SharedFilter'
3
3
 
4
4
  export type Dashboard = {
@@ -1,6 +1,6 @@
1
1
  import { Series } from '@cdc/core/types/Series'
2
2
  import { Runtime } from '@cdc/core/types/Runtime'
3
- import { DataSet } from './DataSet'
3
+ import { DataSet } from '@cdc/core/types/DataSet'
4
4
  import { ConfigRow } from './ConfigRow'
5
5
  import { AnyVisualization } from '@cdc/core/types/Visualization'
6
6
  import { Table } from '@cdc/core/types/Table'
@@ -22,6 +22,8 @@ export type SharedFilter = FilterBase & {
22
22
  datasetKey?: string
23
23
  subGrouping: SubGrouping
24
24
  tier?: number
25
+ // value to use when the filter loads
26
+ defaultValue?: string
25
27
  /**
26
28
  * How to format the end file name when filter.filterBy is set to "File Name"
27
29
  *