@cdc/core 4.25.10 → 4.26.1

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 (134) hide show
  1. package/_stories/Gallery.Charts.stories.tsx +307 -0
  2. package/_stories/Gallery.DataBite.stories.tsx +72 -0
  3. package/_stories/Gallery.Maps.stories.tsx +230 -0
  4. package/_stories/Gallery.WaffleChart.stories.tsx +187 -0
  5. package/_stories/PageART.stories.tsx +192 -0
  6. package/_stories/PageBRFSS.stories.tsx +289 -0
  7. package/_stories/PageCancerRegistries.stories.tsx +199 -0
  8. package/_stories/PageEasternEquineEncephalitis.stories.tsx +202 -0
  9. package/_stories/PageExcessiveAlcoholUse.stories.tsx +196 -0
  10. package/_stories/PageMaternalMortality.stories.tsx +192 -0
  11. package/_stories/PageOralHealth.stories.tsx +196 -0
  12. package/_stories/PageRespiratory.stories.tsx +332 -0
  13. package/_stories/PageSmokingTobacco.stories.tsx +195 -0
  14. package/_stories/PageStateDiabetesProfiles.stories.tsx +196 -0
  15. package/_stories/PageWastewater.stories.tsx +463 -0
  16. package/_stories/StoryRenderingTests.stories.tsx +164 -0
  17. package/assets/icon-magnifying-glass.svg +5 -0
  18. package/assets/icon-warming-stripes.svg +13 -0
  19. package/components/AdvancedEditor/AdvancedEditor.tsx +7 -1
  20. package/components/AdvancedEditor/EmbedEditor.tsx +281 -0
  21. package/components/ComboBox/ComboBox.tsx +345 -0
  22. package/components/ComboBox/combobox.styles.css +185 -0
  23. package/components/ComboBox/index.ts +1 -0
  24. package/components/CustomColorsEditor/CustomColorsEditor.css +299 -0
  25. package/components/CustomColorsEditor/CustomColorsEditor.tsx +209 -0
  26. package/components/CustomColorsEditor/index.ts +1 -0
  27. package/components/DataTable/DataTable.tsx +132 -58
  28. package/components/DataTable/DataTableStandAlone.tsx +8 -3
  29. package/components/DataTable/components/DataTableEditorPanel.tsx +12 -2
  30. package/components/DataTable/data-table.css +217 -210
  31. package/components/DataTable/helpers/mapCellMatrix.tsx +28 -9
  32. package/components/DataTable/helpers/standardizeState.js +2 -2
  33. package/components/DataTable/helpers/tests/standardizeState.test.js +54 -0
  34. package/components/EditorPanel/ColumnsEditor.tsx +37 -19
  35. package/components/EditorPanel/DataTableEditor.tsx +54 -28
  36. package/components/EditorPanel/EditorPanel.styles.css +439 -0
  37. package/components/EditorPanel/EditorPanel.tsx +144 -0
  38. package/components/EditorPanel/EditorPanelDispatch.tsx +75 -0
  39. package/components/EditorPanel/FieldSetWrapper.tsx +66 -23
  40. package/components/EditorPanel/FootnotesEditor.tsx +44 -37
  41. package/components/EditorPanel/Inputs.tsx +44 -8
  42. package/components/EditorPanel/VizFilterEditor/NestedDropdownEditor.tsx +35 -62
  43. package/components/EditorPanel/VizFilterEditor/VizFilterEditor.tsx +246 -175
  44. package/components/EditorPanel/components/MarkupVariablesEditor.tsx +61 -22
  45. package/components/EditorPanel/sections/VisualSection.tsx +169 -0
  46. package/components/Filters/Filters.tsx +57 -10
  47. package/components/Filters/components/Dropdown.tsx +6 -1
  48. package/components/Filters/helpers/getNestedOptions.ts +2 -1
  49. package/components/Filters/helpers/handleSorting.ts +1 -1
  50. package/components/Footnotes/Footnotes.tsx +35 -25
  51. package/components/Footnotes/FootnotesStandAlone.tsx +42 -6
  52. package/components/HeaderThemeSelector/HeaderThemeSelector.css +43 -0
  53. package/components/HeaderThemeSelector/HeaderThemeSelector.stories.tsx +74 -0
  54. package/components/HeaderThemeSelector/HeaderThemeSelector.tsx +61 -0
  55. package/components/HeaderThemeSelector/index.ts +2 -0
  56. package/components/Layout/components/Sidebar/components/sidebar.styles.scss +82 -0
  57. package/components/Layout/components/Visualization/index.tsx +16 -1
  58. package/components/Layout/components/Visualization/visualizations.scss +7 -0
  59. package/components/Layout/styles/editor.scss +2 -1
  60. package/components/Legend/Legend.Gradient.tsx +1 -1
  61. package/components/Loader/Loader.tsx +1 -1
  62. package/components/MediaControls.tsx +63 -34
  63. package/components/PaletteConversionModal.tsx +7 -4
  64. package/components/PaletteSelector/PaletteSelector.css +49 -6
  65. package/components/Table/components/Cell.tsx +23 -2
  66. package/components/Table/components/Row.tsx +5 -3
  67. package/components/_stories/Filters.stories.tsx +20 -1
  68. package/components/_stories/Footnotes.CSV.stories.tsx +247 -0
  69. package/components/_stories/Footnotes.stories.tsx +768 -3
  70. package/components/_stories/Inputs.stories.tsx +2 -2
  71. package/components/_stories/styles.scss +0 -1
  72. package/components/ui/Accordion.jsx +1 -1
  73. package/components/ui/Icon.tsx +3 -1
  74. package/components/ui/Title/index.tsx +30 -2
  75. package/components/ui/Title/title.styles.css +42 -0
  76. package/components/ui/accordion.styles.css +57 -0
  77. package/data/chartColorPalettes.ts +1 -1
  78. package/dist/cove-main.css +75 -6
  79. package/dist/cove-main.css.map +1 -1
  80. package/generateViteConfig.js +8 -1
  81. package/helpers/addValuesToFilters.ts +11 -1
  82. package/helpers/constants.ts +37 -0
  83. package/helpers/cove/number.ts +33 -12
  84. package/helpers/coveUpdateWorker.ts +20 -11
  85. package/helpers/embedCodeGenerator.ts +109 -0
  86. package/helpers/fetchRemoteData.ts +3 -15
  87. package/helpers/getUniqueValues.ts +19 -0
  88. package/helpers/hashObj.ts +25 -0
  89. package/helpers/isRightAlignedTableValue.js +5 -0
  90. package/helpers/markupProcessor.ts +27 -12
  91. package/helpers/mergeCustomOrderValues.ts +37 -0
  92. package/helpers/metrics/helpers.ts +1 -0
  93. package/helpers/parseCsvWithQuotes.ts +65 -0
  94. package/helpers/pivotData.ts +2 -2
  95. package/helpers/prepareScreenshot.ts +268 -0
  96. package/helpers/queryStringUtils.ts +29 -0
  97. package/helpers/testing.ts +17 -4
  98. package/helpers/tests/prepareScreenshot.test.ts +414 -0
  99. package/helpers/tests/queryStringUtils.test.ts +381 -0
  100. package/helpers/tests/testStandaloneBuild.ts +23 -5
  101. package/helpers/useDataVizClasses.ts +0 -1
  102. package/helpers/ver/4.25.11.ts +13 -0
  103. package/helpers/ver/4.26.1.ts +80 -0
  104. package/helpers/viewports.ts +2 -0
  105. package/hooks/useDataColumns.ts +63 -0
  106. package/hooks/useFilterManagement.ts +94 -0
  107. package/hooks/useLegendSeparators.ts +26 -0
  108. package/hooks/useListManagement.ts +192 -0
  109. package/package.json +6 -4
  110. package/styles/_button-section.scss +0 -3
  111. package/styles/_common-components.css +73 -0
  112. package/styles/_global.scss +25 -5
  113. package/styles/base.scss +0 -50
  114. package/styles/cove-main.scss +3 -1
  115. package/styles/filters.scss +10 -3
  116. package/styles/v2/base/index.scss +0 -1
  117. package/styles/v2/components/editor.scss +14 -6
  118. package/styles/v2/utils/_breakpoints.scss +1 -1
  119. package/styles/v2/utils/index.scss +0 -1
  120. package/styles/waiting.scss +1 -1
  121. package/types/Axis.ts +1 -0
  122. package/types/ForecastingSeriesKey.ts +1 -0
  123. package/types/MarkupInclude.ts +5 -3
  124. package/types/MarkupVariable.ts +1 -1
  125. package/types/Series.ts +3 -0
  126. package/types/Table.ts +1 -0
  127. package/types/Visualization.ts +1 -0
  128. package/types/VizFilter.ts +2 -0
  129. package/LICENSE +0 -201
  130. package/styles/_mixins.scss +0 -13
  131. package/styles/_typography.scss +0 -0
  132. package/styles/v2/base/_typography.scss +0 -0
  133. package/styles/v2/components/guidance-block.scss +0 -74
  134. package/styles/v2/utils/_functions.scss +0 -0
@@ -5,6 +5,7 @@ import { filterOrderOptions } from '../../../helpers/filterOrderOptions'
5
5
  import FilterOrder from './components/FilterOrder'
6
6
  import { Visualization } from '../../../types/Visualization'
7
7
  import { useMemo } from 'react'
8
+ import { Select } from '../Inputs'
8
9
 
9
10
  type NestedDropdownEditorProps = {
10
11
  config: Visualization
@@ -155,43 +156,26 @@ const NestedDropdownEditor: React.FC<NestedDropdownEditorProps> = ({
155
156
  />
156
157
  </label>
157
158
 
158
- <label>
159
- <div className='edit-label column-heading mt-2'>
160
- Filter Grouping
161
- <span></span>
162
- </div>
163
- <select value={filter.columnName} onChange={e => handleGroupColumnNameChange(e.target.value)}>
164
- <option value=''>- Select Option -</option>
165
- {columnNameOptions.map((option, index) => (
166
- <option value={option} key={index}>
167
- {option}
168
- </option>
169
- ))}
170
- </select>
171
- </label>
172
- <label>
173
- <div className='edit-label column-heading mt-2'>
174
- Filter SubGrouping
175
- <span></span>
176
- </div>
177
- <select
178
- value={subGrouping?.columnName ?? ''}
179
- onChange={e => {
180
- handleSubGroupColumnNameChange(e.target.value)
181
- }}
182
- >
183
- <option value=''>- Select Option -</option>
184
- {columnNameOptions.map((option, index) => {
185
- if (option !== filter.columnName) {
186
- return (
187
- <option value={option} key={index}>
188
- {option}
189
- </option>
190
- )
191
- }
192
- })}
193
- </select>
194
- </label>
159
+ <Select
160
+ label='Filter Grouping'
161
+ value={filter.columnName}
162
+ options={[{ value: '', label: '- Select Option -' }, ...columnNameOptions.map(opt => ({ value: opt, label: opt }))]}
163
+ onChange={e => handleGroupColumnNameChange(e.target.value)}
164
+ />
165
+
166
+ <Select
167
+ label='Filter SubGrouping'
168
+ value={subGrouping?.columnName ?? ''}
169
+ options={[
170
+ { value: '', label: '- Select Option -' },
171
+ ...columnNameOptions
172
+ .filter(option => option !== filter.columnName)
173
+ .map(opt => ({ value: opt, label: opt }))
174
+ ]}
175
+ onChange={e => {
176
+ handleSubGroupColumnNameChange(e.target.value)
177
+ }}
178
+ />
195
179
 
196
180
  <label>
197
181
  <input
@@ -229,39 +213,28 @@ const NestedDropdownEditor: React.FC<NestedDropdownEditorProps> = ({
229
213
  )}
230
214
  </label>
231
215
 
232
- <label className='mt-2'>
216
+ <div className='mt-2'>
233
217
  <div className='edit-label column-heading float-right'>{filter.columnName} </div>
234
- <span className={'edit-filterOrder column-heading '}>Group Order</span>
235
- <select value={filter.order} onChange={e => handleGroupingOrderBy(e.target.value as OrderBy)}>
236
- {filterOrderOptions.map((option, index) => {
237
- return (
238
- <option value={option.value} key={`filter-${option.label}-${index}`}>
239
- {option.label}
240
- </option>
241
- )
242
- })}
243
- </select>
218
+ <Select
219
+ label='Group Order'
220
+ value={filter.order}
221
+ options={filterOrderOptions}
222
+ onChange={e => handleGroupingOrderBy(e.target.value as OrderBy)}
223
+ />
244
224
  {filter.order === 'cust' && (
245
225
  <FilterOrder orderedValues={filter.orderedValues} handleFilterOrder={handleGroupingCustomOrder} />
246
226
  )}
247
- </label>
227
+ </div>
248
228
 
249
229
  {subGrouping?.columnName && (
250
- <label className='mt-2'>
251
- <span className={'edit-filterOrder column-heading'}>SubGrouping Order</span>
230
+ <div className='mt-2'>
252
231
  <div className='edit-label column-heading float-right'>{subGrouping.columnName} </div>
253
- <select
232
+ <Select
233
+ label='SubGrouping Order'
254
234
  value={subGrouping.order ? subGrouping.order : 'asc'}
235
+ options={filterOrderOptions}
255
236
  onChange={e => handleSubGroupingOrderBy(e.target.value as OrderBy)}
256
- >
257
- {filterOrderOptions.map((option, index) => {
258
- return (
259
- <option value={option.value} key={`filter-${index}`}>
260
- {option.label}
261
- </option>
262
- )
263
- })}
264
- </select>
237
+ />
265
238
  {subGrouping?.order === 'cust' &&
266
239
  filter.values.map((groupName, i) => {
267
240
  const orderedSubGroupValues = subGrouping.valuesLookup[groupName].orderedValues
@@ -278,7 +251,7 @@ const NestedDropdownEditor: React.FC<NestedDropdownEditorProps> = ({
278
251
  </div>
279
252
  )
280
253
  })}
281
- </label>
254
+ </div>
282
255
  )}
283
256
  </div>
284
257
  )
@@ -14,6 +14,7 @@ import FilterOrder from './components/FilterOrder'
14
14
  import { useMemo, useState } from 'react'
15
15
  import MultiSelect from '../../MultiSelect'
16
16
  import NestedDropdownEditor from './NestedDropdownEditor'
17
+ import { DragDropContext, Droppable, Draggable } from '@hello-pangea/dnd'
17
18
 
18
19
  type VizFilterProps = {
19
20
  config: Visualization
@@ -28,6 +29,16 @@ const VizFilterEditor: React.FC<VizFilterProps> = ({ config, updateField, rawDat
28
29
  return _.uniq(_.flatten(rawData?.map(row => Object.keys(row))))
29
30
  }, [rawData])
30
31
 
32
+ // Helper function to get filter values from various sources
33
+ const getFilterValues = (filter: VizFilter) => {
34
+ if (filter.values && filter.values.length > 0) return filter.values
35
+ if (filter.orderedValues && filter.orderedValues.length > 0) return filter.orderedValues
36
+ if (filter.columnName && rawData && rawData.length > 0) {
37
+ return _.uniq(rawData.map(row => row[filter.columnName]))
38
+ }
39
+ return []
40
+ }
41
+
31
42
  const removeFilter = index => {
32
43
  let filters = _.cloneDeep(config.filters)
33
44
 
@@ -118,6 +129,26 @@ const VizFilterEditor: React.FC<VizFilterProps> = ({ config, updateField, rawDat
118
129
  .map(({ label, columnName, id }) => ({ label: label || columnName, value: id }))
119
130
  }
120
131
 
132
+ const handleFilterReorder = (idx1: number, idx2: number) => {
133
+ if (idx1 === undefined || idx2 === undefined || idx1 === idx2) return
134
+ const filters = _.cloneDeep(config.filters)
135
+ const [movedFilter] = filters.splice(idx1, 1)
136
+ filters.splice(idx2, 0, movedFilter)
137
+ updateField(null, null, 'filters', filters)
138
+ }
139
+
140
+ const getItemStyle = (isDragging: boolean, draggableStyle: any) => ({
141
+ ...draggableStyle
142
+ })
143
+
144
+ const sortableItemStyles = {
145
+ animate: false,
146
+ animateReplay: true,
147
+ display: 'block',
148
+ boxSizing: 'border-box' as const,
149
+ border: '1px solid #D1D1D1'
150
+ }
151
+
121
152
  return (
122
153
  <>
123
154
  {config.filters && (
@@ -150,188 +181,228 @@ const VizFilterEditor: React.FC<VizFilterProps> = ({ config, updateField, rawDat
150
181
  fieldName='filterIntro'
151
182
  />
152
183
  <br />
153
- <ul className='filters-list'>
154
- {/* Whether filters should apply onChange or Apply Button */}
184
+ <DragDropContext
185
+ onDragEnd={({ source, destination }) => handleFilterReorder(source.index, destination?.index)}
186
+ >
187
+ <Droppable droppableId='filters_list'>
188
+ {provided => (
189
+ <ul {...provided.droppableProps} ref={provided.innerRef} className='draggable-field-list'>
190
+ {/* Whether filters should apply onChange or Apply Button */}
155
191
 
156
- {config.filters.map((filter, filterIndex) => {
157
- if (filter.type === 'url') return <></>
158
- return (
159
- <FieldSetWrapper
160
- key={filter.columnName}
161
- fieldName={filter.columnName}
162
- fieldKey={filterIndex}
163
- fieldType='Filter'
164
- controls={openControls}
165
- deleteField={() => removeFilter(filterIndex)}
166
- >
167
- <Select
168
- value={filter.filterStyle}
169
- fieldName='filterStyle'
170
- label='Filter Style'
171
- updateField={(_section, _subsection, _field, value) => updateFilterStyle(filterIndex, value)}
172
- options={filterStyleOptions}
173
- />
192
+ {config.filters.map((filter, filterIndex) => {
193
+ if (filter.type === 'url') return <></>
194
+ return (
195
+ <Draggable
196
+ key={filter.id || `filter-${filterIndex}`}
197
+ draggableId={`filter-${filter.id || filterIndex}`}
198
+ index={filterIndex}
199
+ >
200
+ {(provided, snapshot) => (
201
+ <div
202
+ ref={provided.innerRef}
203
+ {...provided.draggableProps}
204
+ {...provided.dragHandleProps}
205
+ className={snapshot.isDragging ? 'currently-dragging' : ''}
206
+ style={getItemStyle(snapshot.isDragging, provided.draggableProps.style)}
207
+ >
208
+ <FieldSetWrapper
209
+ key={filter.columnName}
210
+ fieldName={filter.columnName}
211
+ fieldKey={filterIndex}
212
+ fieldType='Filter'
213
+ controls={openControls}
214
+ deleteField={() => removeFilter(filterIndex)}
215
+ draggable={true}
216
+ >
217
+ <Select
218
+ value={filter.filterStyle}
219
+ fieldName='filterStyle'
220
+ label='Filter Style'
221
+ updateField={(_section, _subsection, _field, value) =>
222
+ updateFilterStyle(filterIndex, value)
223
+ }
224
+ options={filterStyleOptions}
225
+ />
174
226
 
175
- {filter.filterStyle !== 'nested-dropdown' ? (
176
- <>
177
- <Select
178
- value={filter.columnName}
179
- fieldName='columnName'
180
- label='Filter'
181
- updateField={(_section, _subsection, _field, value) => handleNameChange(filterIndex, value)}
182
- options={dataColumns}
183
- initial='- Select Option -'
184
- />
227
+ {filter.filterStyle !== 'nested-dropdown' ? (
228
+ <>
229
+ <Select
230
+ value={filter.columnName}
231
+ fieldName='columnName'
232
+ label='Filter'
233
+ updateField={(_section, _subsection, _field, value) =>
234
+ handleNameChange(filterIndex, value)
235
+ }
236
+ options={dataColumns}
237
+ initial='- Select Option -'
238
+ />
185
239
 
186
- {filter.columnName && (
187
- <Select
188
- value={filter.defaultValue}
189
- options={
190
- filter.resetLabel
191
- ? [filter.resetLabel, ...config.filters?.[filterIndex].values]
192
- : config.filters?.[filterIndex].values
193
- }
194
- updateField={(_section, _subSection, _key, value) => {
195
- updateFilterDefaultValue(filterIndex, value)
196
- }}
197
- label='Filter Default Value'
198
- initial='Select'
199
- />
200
- )}
240
+ {filter.columnName && (
241
+ <Select
242
+ value={filter.defaultValue}
243
+ options={
244
+ filter.resetLabel
245
+ ? [filter.resetLabel, ...getFilterValues(filter)]
246
+ : getFilterValues(filter)
247
+ }
248
+ updateField={(_section, _subSection, _key, value) => {
249
+ updateFilterDefaultValue(filterIndex, value)
250
+ }}
251
+ label={`Filter Default Value${
252
+ filter.columnName ? ` (${filter.columnName})` : ''
253
+ }`}
254
+ initial='Select'
255
+ />
256
+ )}
201
257
 
202
- <label>
203
- <span className='edit-label column-heading'>Label</span>
204
- <input
205
- type='text'
206
- value={filter.label}
207
- onChange={e => {
208
- updateFilterProp('label', filterIndex, e.target.value)
209
- }}
210
- />
211
- </label>
258
+ <label>
259
+ <span className='edit-label column-heading'>Label</span>
260
+ <input
261
+ type='text'
262
+ value={filter.label}
263
+ onChange={e => {
264
+ updateFilterProp('label', filterIndex, e.target.value)
265
+ }}
266
+ />
267
+ </label>
212
268
 
213
- {filter.filterStyle === 'multi-select' && (
214
- <TextField
215
- label='Select Limit'
216
- value={(filter as MultiSelectFilter).selectLimit}
217
- updateField={updateField}
218
- section='filters'
219
- subsection={filterIndex}
220
- fieldName='selectLimit'
221
- type='number'
222
- tooltip={
223
- <Tooltip style={{ textTransform: 'none' }}>
224
- <Tooltip.Target>
225
- <Icon display='question' style={{ marginLeft: '0.5rem' }} />
226
- </Tooltip.Target>
227
- <Tooltip.Content>
228
- <p>The maximum number of items that can be selected.</p>
229
- </Tooltip.Content>
230
- </Tooltip>
231
- }
232
- />
233
- )}
269
+ {filter.filterStyle === 'multi-select' && (
270
+ <TextField
271
+ label='Select Limit'
272
+ value={(filter as MultiSelectFilter).selectLimit}
273
+ updateField={updateField}
274
+ section='filters'
275
+ subsection={filterIndex}
276
+ fieldName='selectLimit'
277
+ type='number'
278
+ tooltip={
279
+ <Tooltip style={{ textTransform: 'none' }}>
280
+ <Tooltip.Target>
281
+ <Icon display='question' style={{ marginLeft: '0.5rem' }} />
282
+ </Tooltip.Target>
283
+ <Tooltip.Content>
284
+ <p>The maximum number of items that can be selected.</p>
285
+ </Tooltip.Content>
286
+ </Tooltip>
287
+ }
288
+ />
289
+ )}
234
290
 
235
- <Select
236
- value={filter.order || 'asc'}
237
- fieldName='order'
238
- label='Filter Order'
239
- updateField={(_section, _subSection, _field, value) => {
240
- updateFilterProp('order', filterIndex, value)
241
- if (filter.orderColumn && value !== 'column') updateFilterProp('orderColumn', filterIndex, '')
242
- }}
243
- options={filterOrderOptions}
244
- />
245
- {filter.order === 'cust' && (
246
- <FilterOrder
247
- orderedValues={filter.orderedValues || filter.values}
248
- handleFilterOrder={(index1, index2) => handleFilterOrder(index1, index2, filterIndex)}
249
- />
250
- )}
251
- {filter.order === 'column' && (
252
- <Select
253
- value={filter.orderColumn}
254
- fieldName='orderColumn'
255
- label='Order Column'
256
- updateField={(_section, _subSection, _field, value) =>
257
- updateFilterProp('orderColumn', filterIndex, value)
258
- }
259
- options={dataColumns}
260
- />
261
- )}
262
- <label>
263
- <span className='edit-label column-heading'>Default Value Set By Query String Parameter</span>
264
- <input
265
- type='text'
266
- value={filter.setByQueryParameter}
267
- onChange={e => {
268
- updateFilterProp('setByQueryParameter', filterIndex, e.target.value)
269
- }}
270
- />
271
- </label>
291
+ <Select
292
+ value={filter.order || 'asc'}
293
+ fieldName='order'
294
+ label='Filter Order'
295
+ updateField={(_section, _subSection, _field, value) => {
296
+ updateFilterProp('order', filterIndex, value)
297
+ if (filter.orderColumn && value !== 'column')
298
+ updateFilterProp('orderColumn', filterIndex, '')
299
+ }}
300
+ options={filterOrderOptions}
301
+ />
302
+ {filter.order === 'cust' && (
303
+ <FilterOrder
304
+ orderedValues={filter.orderedValues || filter.values}
305
+ handleFilterOrder={(index1, index2) =>
306
+ handleFilterOrder(index1, index2, filterIndex)
307
+ }
308
+ />
309
+ )}
310
+ {filter.order === 'column' && (
311
+ <Select
312
+ value={filter.orderColumn}
313
+ fieldName='orderColumn'
314
+ label='Order Column'
315
+ updateField={(_section, _subSection, _field, value) =>
316
+ updateFilterProp('orderColumn', filterIndex, value)
317
+ }
318
+ options={dataColumns}
319
+ />
320
+ )}
321
+ <label>
322
+ <span className='edit-label column-heading'>
323
+ Default Value Set By Query String Parameter
324
+ </span>
325
+ <input
326
+ type='text'
327
+ value={filter.setByQueryParameter}
328
+ onChange={e => {
329
+ updateFilterProp('setByQueryParameter', filterIndex, e.target.value)
330
+ }}
331
+ />
332
+ </label>
272
333
 
273
- <label>
274
- <input
275
- type='checkbox'
276
- checked={filter.showDropdown === undefined ? true : filter.showDropdown}
277
- onChange={e => {
278
- updateFilterProp('showDropdown', filterIndex, e.target.checked)
279
- }}
280
- />
281
- <span className='edit-showDropdown column-heading'>Show Filter</span>
282
- </label>
283
- </>
284
- ) : (
285
- <NestedDropdownEditor
286
- config={config}
287
- dataColumns={dataColumns}
288
- filterIndex={filterIndex}
289
- rawData={rawData}
290
- handleGroupingCustomOrder={(index1, index2) => handleFilterOrder(index1, index2, filterIndex)}
291
- handleNameChange={value => handleNameChange(filterIndex, value)}
292
- updateField={updateField}
293
- updateFilterStyle={updateFilterStyle}
294
- />
295
- )}
296
- {hasFootnotes && (
297
- <label>
298
- <input
299
- type='checkbox'
300
- checked={!!filter.filterFootnotes}
301
- onChange={e => {
302
- updateFilterProp('filterFootnotes', filterIndex, e.target.checked)
303
- }}
304
- />
305
- <span className='edit-showDropdown column-heading'>Filter Footnotes</span>
306
- </label>
307
- )}
308
- <label>
309
- <span className='edit-label column-heading'>
310
- Filter Parents{' '}
311
- <Tooltip style={{ textTransform: 'none' }}>
312
- <Tooltip.Target>
313
- <Icon display='question' style={{ marginLeft: '0.5rem' }} />
314
- </Tooltip.Target>
315
- <Tooltip.Content>
316
- <p>
317
- A selected parent's value will be used to filter the available options of this child filter.
318
- </p>
319
- </Tooltip.Content>
320
- </Tooltip>
321
- </span>
322
- <MultiSelect
323
- fieldName='parents'
324
- updateField={(_section, _subsection, _fieldname, value) => {
325
- updateFilterProp('parents', filterIndex, value)
326
- }}
327
- options={getParentFilterOptions(filterIndex)}
328
- selected={config.filters[filterIndex].parents}
329
- />
330
- </label>
331
- </FieldSetWrapper>
332
- )
333
- })}
334
- </ul>
334
+ <label>
335
+ <input
336
+ type='checkbox'
337
+ checked={filter.showDropdown === undefined ? true : filter.showDropdown}
338
+ onChange={e => {
339
+ updateFilterProp('showDropdown', filterIndex, e.target.checked)
340
+ }}
341
+ />
342
+ <span className='edit-showDropdown column-heading'>Show Filter</span>
343
+ </label>
344
+ </>
345
+ ) : (
346
+ <NestedDropdownEditor
347
+ config={config}
348
+ dataColumns={dataColumns}
349
+ filterIndex={filterIndex}
350
+ rawData={rawData}
351
+ handleGroupingCustomOrder={(index1, index2) =>
352
+ handleFilterOrder(index1, index2, filterIndex)
353
+ }
354
+ handleNameChange={value => handleNameChange(filterIndex, value)}
355
+ updateField={updateField}
356
+ updateFilterStyle={updateFilterStyle}
357
+ />
358
+ )}
359
+ {hasFootnotes && (
360
+ <label>
361
+ <input
362
+ type='checkbox'
363
+ checked={!!filter.filterFootnotes}
364
+ onChange={e => {
365
+ updateFilterProp('filterFootnotes', filterIndex, e.target.checked)
366
+ }}
367
+ />
368
+ <span className='edit-showDropdown column-heading'>Filter Footnotes</span>
369
+ </label>
370
+ )}
371
+ <label>
372
+ <span className='edit-label column-heading'>
373
+ Filter Parents{' '}
374
+ <Tooltip style={{ textTransform: 'none' }}>
375
+ <Tooltip.Target>
376
+ <Icon display='question' style={{ marginLeft: '0.5rem' }} />
377
+ </Tooltip.Target>
378
+ <Tooltip.Content>
379
+ <p>
380
+ A selected parent's value will be used to filter the available options of this
381
+ child filter.
382
+ </p>
383
+ </Tooltip.Content>
384
+ </Tooltip>
385
+ </span>
386
+ <MultiSelect
387
+ fieldName='parents'
388
+ updateField={(_section, _subsection, _fieldname, value) => {
389
+ updateFilterProp('parents', filterIndex, value)
390
+ }}
391
+ options={getParentFilterOptions(filterIndex)}
392
+ selected={config.filters[filterIndex].parents}
393
+ />
394
+ </label>
395
+ </FieldSetWrapper>
396
+ </div>
397
+ )}
398
+ </Draggable>
399
+ )
400
+ })}
401
+ {provided.placeholder}
402
+ </ul>
403
+ )}
404
+ </Droppable>
405
+ </DragDropContext>
335
406
  </>
336
407
  )}
337
408
  {!config.filters && <p style={{ textAlign: 'center' }}>There are currently no filters.</p>}