@cdc/editor 4.22.10-alpha.1 → 4.22.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/README.md +8 -7
- package/dist/cdceditor.js +42 -42
- package/example/data-horizontal-filters.json +5 -6
- package/example/data-horizontal-multiseries-filters.json +13 -15
- package/example/data-horizontal-multiseries.json +4 -5
- package/example/data-horizontal.json +2 -3
- package/example/data-vertical-filters.json +7 -8
- package/example/data-vertical-multiseries-filters.json +13 -15
- package/example/data-vertical-multiseries-multirow-filters.json +49 -52
- package/example/data-vertical-multiseries-multirow.json +11 -11
- package/example/data-vertical-multiseries.json +4 -5
- package/example/data-vertical.json +4 -5
- package/example/private/city-state.json +434 -0
- package/example/private/example-city-state.json +86 -0
- package/example/private/map-issue.csv +11 -0
- package/example/private/test.html +26 -1
- package/example/region-map.json +32 -32
- package/example/valid-county-data.json +3047 -3047
- package/package.json +8 -8
- package/src/CdcEditor.js +72 -72
- package/src/components/ChooseTab.js +67 -88
- package/src/components/ConfigureTab.js +51 -51
- package/src/components/DataImport.js +248 -246
- package/src/components/PreviewDataTable.js +130 -149
- package/src/components/TabPane.js +3 -3
- package/src/components/Tabs.js +20 -27
- package/src/components/modal/Confirmation.js +16 -13
- package/src/components/modal/Modal.js +23 -35
- package/src/components/modal/UseModal.js +8 -8
- package/src/context.js +4 -4
- package/src/index.html +1 -4
- package/src/index.js +6 -7
- package/src/scss/_data-table.scss +1 -1
- package/src/scss/_variables.scss +1 -1
- package/src/scss/choose-vis-tab.scss +63 -63
- package/src/scss/configure-tab.scss +17 -17
- package/src/scss/data-import.scss +177 -177
- package/src/scss/main.scss +31 -32
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cdc/editor",
|
|
3
|
-
"version": "4.22.
|
|
3
|
+
"version": "4.22.11",
|
|
4
4
|
"main": "dist/cdceditor",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/CDCgov/cdc-open-viz/issues"
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@babel/runtime": "^7.12.5",
|
|
21
21
|
"@cdc/chart": "^9.22.9",
|
|
22
|
-
"@cdc/core": "^4.22.
|
|
23
|
-
"@cdc/dashboard": "^4.22.
|
|
24
|
-
"@cdc/data-bite": "^4.22.
|
|
25
|
-
"@cdc/map": "^4.22.
|
|
26
|
-
"@cdc/markup-include": "^4.22.
|
|
27
|
-
"@cdc/waffle-chart": "^4.22.
|
|
22
|
+
"@cdc/core": "^4.22.11",
|
|
23
|
+
"@cdc/dashboard": "^4.22.11",
|
|
24
|
+
"@cdc/data-bite": "^4.22.11",
|
|
25
|
+
"@cdc/map": "^4.22.11",
|
|
26
|
+
"@cdc/markup-include": "^4.22.11",
|
|
27
|
+
"@cdc/waffle-chart": "^4.22.11",
|
|
28
28
|
"axios": "^0.21.1",
|
|
29
29
|
"d3": "^7.0.0",
|
|
30
30
|
"html-react-parser": "1.4.9",
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
"resolutions": {
|
|
41
41
|
"@types/react": "17.x"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "9768d1ea0e2383044977d988e33531bcdfe33ea6"
|
|
44
44
|
}
|
package/src/CdcEditor.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import React, { useState, useEffect,useCallback } from 'react'
|
|
1
|
+
import React, { useState, useEffect, useCallback } from 'react'
|
|
2
2
|
|
|
3
3
|
// IE11
|
|
4
4
|
import 'core-js/stable'
|
|
5
5
|
import ResizeObserver from 'resize-observer-polyfill'
|
|
6
6
|
|
|
7
|
-
import getViewport from '@cdc/core/helpers/getViewport'
|
|
7
|
+
import getViewport from '@cdc/core/helpers/getViewport'
|
|
8
8
|
|
|
9
9
|
import { GlobalContextProvider } from '@cdc/core/components/GlobalContext'
|
|
10
|
-
import GlobalState from './context'
|
|
10
|
+
import GlobalState from './context'
|
|
11
11
|
|
|
12
12
|
import OverlayFrame from '@cdc/core/components/ui/OverlayFrame'
|
|
13
13
|
|
|
14
|
-
import DataImport from './components/DataImport'
|
|
15
|
-
import ChooseTab from './components/ChooseTab'
|
|
16
|
-
import ConfigureTab from './components/ConfigureTab'
|
|
17
|
-
import TabPane from './components/TabPane'
|
|
18
|
-
import Tabs from './components/Tabs'
|
|
14
|
+
import DataImport from './components/DataImport'
|
|
15
|
+
import ChooseTab from './components/ChooseTab'
|
|
16
|
+
import ConfigureTab from './components/ConfigureTab'
|
|
17
|
+
import TabPane from './components/TabPane'
|
|
18
|
+
import Tabs from './components/Tabs'
|
|
19
19
|
|
|
20
|
-
import './scss/main.scss'
|
|
20
|
+
import './scss/main.scss'
|
|
21
21
|
|
|
22
|
-
export default function CdcEditor({ config: configObj = {newViz: true}, hostname, containerEl, sharepath }) {
|
|
22
|
+
export default function CdcEditor({ config: configObj = { newViz: true }, hostname, containerEl, sharepath }) {
|
|
23
23
|
const [config, setConfig] = useState(configObj)
|
|
24
24
|
const [tempConfig, setTempConfig] = useState(null)
|
|
25
25
|
const [errors, setErrors] = useState([])
|
|
@@ -27,79 +27,79 @@ export default function CdcEditor({ config: configObj = {newViz: true}, hostname
|
|
|
27
27
|
const [currentViewport, setCurrentViewport] = useState('lg')
|
|
28
28
|
const [dimensions, setDimensions] = useState([])
|
|
29
29
|
|
|
30
|
-
let startingTab = 0
|
|
30
|
+
let startingTab = 0
|
|
31
31
|
|
|
32
|
-
if(config.data && config.type) {
|
|
32
|
+
if (config.data && config.type) {
|
|
33
33
|
startingTab = 2
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
// Legacy support - dashboards using a single dataset
|
|
37
|
-
if(config.type === 'dashboard'){
|
|
38
|
-
let legacyUpdateNeeded = false
|
|
39
|
-
let newConfig
|
|
37
|
+
if (config.type === 'dashboard') {
|
|
38
|
+
let legacyUpdateNeeded = false
|
|
39
|
+
let newConfig
|
|
40
40
|
|
|
41
|
-
if(config.data || config.dataUrl){
|
|
42
|
-
legacyUpdateNeeded = true
|
|
43
|
-
newConfig = {...config}
|
|
41
|
+
if (config.data || config.dataUrl) {
|
|
42
|
+
legacyUpdateNeeded = true
|
|
43
|
+
newConfig = { ...config }
|
|
44
44
|
|
|
45
|
-
newConfig.datasets = {}
|
|
45
|
+
newConfig.datasets = {}
|
|
46
46
|
newConfig.datasets[config.dataFileName || 'dataset-1'] = {
|
|
47
47
|
data: config.data,
|
|
48
48
|
dataUrl: config.dataUrl,
|
|
49
49
|
dataFileName: config.dataFileName || 'dataset-1',
|
|
50
50
|
dataFileSourceType: config.dataFileSourceType
|
|
51
|
-
}
|
|
51
|
+
}
|
|
52
52
|
|
|
53
53
|
Object.keys(newConfig.visualizations).forEach(vizKey => {
|
|
54
|
-
newConfig.visualizations[vizKey].dataKey = config.dataFileName || 'dataset-1'
|
|
55
|
-
newConfig.visualizations[vizKey].dataDescription = newConfig.dataDescription
|
|
56
|
-
newConfig.visualizations[vizKey].formattedData = newConfig.formattedData
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
delete newConfig.data
|
|
60
|
-
delete newConfig.dataUrl
|
|
61
|
-
delete newConfig.dataFileName
|
|
62
|
-
delete newConfig.dataFileSourceType
|
|
63
|
-
delete newConfig.dataDescription
|
|
64
|
-
delete newConfig.formattedData
|
|
54
|
+
newConfig.visualizations[vizKey].dataKey = config.dataFileName || 'dataset-1'
|
|
55
|
+
newConfig.visualizations[vizKey].dataDescription = newConfig.dataDescription
|
|
56
|
+
newConfig.visualizations[vizKey].formattedData = newConfig.formattedData
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
delete newConfig.data
|
|
60
|
+
delete newConfig.dataUrl
|
|
61
|
+
delete newConfig.dataFileName
|
|
62
|
+
delete newConfig.dataFileSourceType
|
|
63
|
+
delete newConfig.dataDescription
|
|
64
|
+
delete newConfig.formattedData
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
if(config.dashboard && config.dashboard.filters){
|
|
68
|
-
legacyUpdateNeeded = true
|
|
69
|
-
newConfig = {...config}
|
|
67
|
+
if (config.dashboard && config.dashboard.filters) {
|
|
68
|
+
legacyUpdateNeeded = true
|
|
69
|
+
newConfig = { ...config }
|
|
70
70
|
|
|
71
|
-
newConfig.dashboard.sharedFilters = newConfig.dashboard.sharedFilters || []
|
|
71
|
+
newConfig.dashboard.sharedFilters = newConfig.dashboard.sharedFilters || []
|
|
72
72
|
newConfig.dashboard.filters.forEach(filter => {
|
|
73
|
-
newConfig.dashboard.sharedFilters.push({...filter, key: filter.label, showDropdown: true, usedBy: Object.keys(newConfig.visualizations)})
|
|
74
|
-
})
|
|
73
|
+
newConfig.dashboard.sharedFilters.push({ ...filter, key: filter.label, showDropdown: true, usedBy: Object.keys(newConfig.visualizations) })
|
|
74
|
+
})
|
|
75
75
|
|
|
76
|
-
delete newConfig.dashboard.filters
|
|
76
|
+
delete newConfig.dashboard.filters
|
|
77
77
|
}
|
|
78
|
-
|
|
79
|
-
if(legacyUpdateNeeded){
|
|
80
|
-
setConfig(newConfig)
|
|
78
|
+
|
|
79
|
+
if (legacyUpdateNeeded) {
|
|
80
|
+
setConfig(newConfig)
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
const [globalActive, setGlobalActive] = useState(startingTab)
|
|
84
|
+
const [globalActive, setGlobalActive] = useState(startingTab)
|
|
85
85
|
|
|
86
|
-
const resizeObserver = new ResizeObserver(([
|
|
86
|
+
const resizeObserver = new ResizeObserver(([container]) => {
|
|
87
87
|
let { width, height } = container.contentRect
|
|
88
88
|
let newViewport = getViewport(width)
|
|
89
89
|
|
|
90
90
|
setDimensions([width, height])
|
|
91
91
|
setCurrentViewport(newViewport)
|
|
92
|
-
})
|
|
92
|
+
})
|
|
93
93
|
|
|
94
94
|
const outerContainerRef = useCallback(node => {
|
|
95
95
|
if (node !== null) {
|
|
96
|
-
|
|
96
|
+
resizeObserver.observe(node)
|
|
97
97
|
}
|
|
98
|
-
},[])
|
|
98
|
+
}, [])
|
|
99
99
|
|
|
100
100
|
// Temp Config is for changes made in the components proper - to prevent render cycles. Regular config is for changes made in the first two tabs.
|
|
101
101
|
useEffect(() => {
|
|
102
|
-
if(null !== tempConfig) {
|
|
102
|
+
if (null !== tempConfig) {
|
|
103
103
|
const parsedData = JSON.stringify(tempConfig)
|
|
104
104
|
// Emit the data in a regular JS event so it can be consumed by anything.
|
|
105
105
|
const event = new CustomEvent('updateVizConfig', { detail: parsedData, bubbles: true })
|
|
@@ -110,29 +110,29 @@ export default function CdcEditor({ config: configObj = {newViz: true}, hostname
|
|
|
110
110
|
useEffect(() => {
|
|
111
111
|
const parsedData = JSON.stringify(config)
|
|
112
112
|
// Emit the data in a regular JS event so it can be consumed by anything.
|
|
113
|
-
const event = new CustomEvent('updateVizConfig', { detail: parsedData})
|
|
113
|
+
const event = new CustomEvent('updateVizConfig', { detail: parsedData })
|
|
114
114
|
window.dispatchEvent(event)
|
|
115
115
|
}, [config])
|
|
116
116
|
|
|
117
117
|
useEffect(() => {
|
|
118
|
-
if(globalActive > -1) {
|
|
118
|
+
if (globalActive > -1) {
|
|
119
119
|
setGlobalActive(-1)
|
|
120
120
|
}
|
|
121
121
|
}, [globalActive])
|
|
122
122
|
|
|
123
|
-
const maxFileSize = 10
|
|
123
|
+
const maxFileSize = 10 // Represents number of MB. Maybe move this to a prop eventually but static for now.
|
|
124
124
|
|
|
125
125
|
const errorMessages = {
|
|
126
|
-
emptyCols:
|
|
127
|
-
emptyData:
|
|
128
|
-
dataType:
|
|
129
|
-
fileType:
|
|
130
|
-
formatting:
|
|
131
|
-
failedFetch:
|
|
132
|
-
urlInvalid:
|
|
126
|
+
emptyCols: 'It looks like your column headers are missing some data. Please make sure all of your columns have titles and upload your file again.',
|
|
127
|
+
emptyData: 'Your data file is empty.',
|
|
128
|
+
dataType: 'Your datatype is not supported.',
|
|
129
|
+
fileType: 'The file type that you are trying to upload is not supported.',
|
|
130
|
+
formatting: 'Please check the formatting of your data file.',
|
|
131
|
+
failedFetch: 'Error fetching or parsing data file.',
|
|
132
|
+
urlInvalid: 'Please make sure to use a valid URL.',
|
|
133
133
|
cannotReach: "Cannot reach URL, please make sure it's correct.",
|
|
134
134
|
fileTooLarge: `File is too large. Maximum file size is ${maxFileSize}MB.`
|
|
135
|
-
}
|
|
135
|
+
}
|
|
136
136
|
|
|
137
137
|
const state = {
|
|
138
138
|
config,
|
|
@@ -149,15 +149,15 @@ export default function CdcEditor({ config: configObj = {newViz: true}, hostname
|
|
|
149
149
|
sharepath
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
let configureDisabled = true
|
|
152
|
+
let configureDisabled = true
|
|
153
153
|
|
|
154
|
-
if(config.type !== 'dashboard'){
|
|
155
|
-
if(config.formattedData){
|
|
156
|
-
configureDisabled = false
|
|
154
|
+
if (config.type !== 'dashboard') {
|
|
155
|
+
if (config.formattedData) {
|
|
156
|
+
configureDisabled = false
|
|
157
157
|
}
|
|
158
158
|
} else {
|
|
159
|
-
if(config.datasets && Object.keys(config.datasets).length > 0){
|
|
160
|
-
configureDisabled = false
|
|
159
|
+
if (config.datasets && Object.keys(config.datasets).length > 0) {
|
|
160
|
+
configureDisabled = false
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
163
|
|
|
@@ -165,21 +165,21 @@ export default function CdcEditor({ config: configObj = {newViz: true}, hostname
|
|
|
165
165
|
<GlobalContextProvider>
|
|
166
166
|
<GlobalState.Provider value={state}>
|
|
167
167
|
<div className={`cdc-open-viz-module cdc-editor ${currentViewport}`} ref={outerContainerRef}>
|
|
168
|
-
<Tabs className=
|
|
169
|
-
<TabPane title=
|
|
168
|
+
<Tabs className='top-level' startingTab={globalActive}>
|
|
169
|
+
<TabPane title='1. Choose Visualization Type' className='choose-type'>
|
|
170
170
|
<ChooseTab />
|
|
171
171
|
</TabPane>
|
|
172
|
-
<TabPane title=
|
|
172
|
+
<TabPane title='2. Import Data' className='data-designer' disableRule={!config.type}>
|
|
173
173
|
<DataImport />
|
|
174
174
|
</TabPane>
|
|
175
|
-
|
|
176
|
-
<TabPane title=
|
|
177
|
-
<ConfigureTab containerEl={containerEl
|
|
175
|
+
|
|
176
|
+
<TabPane title='3. Configure' className='configure' disableRule={configureDisabled}>
|
|
177
|
+
<ConfigureTab containerEl={containerEl} />
|
|
178
178
|
</TabPane>
|
|
179
179
|
</Tabs>
|
|
180
180
|
</div>
|
|
181
181
|
</GlobalState.Provider>
|
|
182
|
-
<OverlayFrame/>
|
|
182
|
+
<OverlayFrame />
|
|
183
183
|
</GlobalContextProvider>
|
|
184
|
-
)
|
|
184
|
+
)
|
|
185
185
|
}
|
|
@@ -30,55 +30,54 @@ export default function ChooseTab() {
|
|
|
30
30
|
/**
|
|
31
31
|
* IconButton component
|
|
32
32
|
*/
|
|
33
|
-
const IconButton = ({ icon, label, type, subType, barType, orientation, stacked = false, generalType =
|
|
33
|
+
const IconButton = ({ icon, label, type, subType, barType, orientation, stacked = false, generalType = 'data' }) => {
|
|
34
34
|
let isSubType = false
|
|
35
35
|
let isHorizontalStackedChart = false
|
|
36
|
-
let classNames
|
|
36
|
+
let classNames
|
|
37
37
|
|
|
38
38
|
if (type === 'map' && config.general) {
|
|
39
39
|
let geoType = config.general.geoType
|
|
40
|
-
isSubType =
|
|
40
|
+
isSubType = subType === geoType
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
if (type === 'chart') {
|
|
44
|
-
isSubType =
|
|
45
|
-
isHorizontalStackedChart =
|
|
44
|
+
isSubType = subType === config.visualizationType
|
|
45
|
+
isHorizontalStackedChart = orientation === config.orientation && stacked === true
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
if(type === 'dashboard' || type === 'data-bite' || type === 'waffle-chart' || type === 'markup-include') isSubType = true
|
|
48
|
+
if (type === 'dashboard' || type === 'data-bite' || type === 'waffle-chart' || type === 'markup-include') isSubType = true
|
|
49
49
|
|
|
50
50
|
// TODO: sorry, we should refactor this at some point.
|
|
51
51
|
// trying to get this out for 4.22.5 - this is so stacked horizontal and bar charts aren't highlighted at the same time.
|
|
52
52
|
// this functionality appears to be working but is admittedly confusing.
|
|
53
|
-
if(type === 'chart' && stacked) {
|
|
54
|
-
classNames =
|
|
53
|
+
if (type === 'chart' && stacked) {
|
|
54
|
+
classNames = config.type === type && isSubType && config.visualizationSubType === 'stacked' ? 'active' : ''
|
|
55
55
|
} else if (type === 'chart' && !stacked && config.visualizationSubType !== 'stacked') {
|
|
56
|
-
classNames =
|
|
56
|
+
classNames = config.type === type && isSubType ? 'active' : ''
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
if(type !== 'chart') {
|
|
60
|
-
classNames =
|
|
59
|
+
if (type !== 'chart') {
|
|
60
|
+
classNames = config.type === type && isSubType && !isHorizontalStackedChart ? 'active' : ''
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
|
|
64
63
|
let setTypes = () => {
|
|
65
|
-
if(type === config.type){
|
|
66
|
-
if(subType !== config.visualizationType){
|
|
67
|
-
setConfig({...config, newViz: true, visualizationType: subType})
|
|
64
|
+
if (type === config.type) {
|
|
65
|
+
if (subType !== config.visualizationType) {
|
|
66
|
+
setConfig({ ...config, newViz: true, visualizationType: subType })
|
|
68
67
|
}
|
|
69
68
|
|
|
70
69
|
setGlobalActive(1)
|
|
71
70
|
} else {
|
|
72
|
-
let confirmation = !config.type || window.confirm('Changing visualization type will clear configuration settings. Do you want to continue?')
|
|
71
|
+
let confirmation = !config.type || window.confirm('Changing visualization type will clear configuration settings. Do you want to continue?')
|
|
73
72
|
|
|
74
|
-
if(confirmation){
|
|
73
|
+
if (confirmation) {
|
|
75
74
|
let newConfig = {
|
|
76
75
|
newViz: true,
|
|
77
76
|
datasets: {},
|
|
78
77
|
type
|
|
79
78
|
}
|
|
80
79
|
|
|
81
|
-
if(type === 'map') {
|
|
80
|
+
if (type === 'map') {
|
|
82
81
|
newConfig.general = {
|
|
83
82
|
...newConfig.general,
|
|
84
83
|
geoType: subType,
|
|
@@ -88,164 +87,144 @@ export default function ChooseTab() {
|
|
|
88
87
|
newConfig.visualizationType = subType
|
|
89
88
|
}
|
|
90
89
|
|
|
91
|
-
setConfig(newConfig)
|
|
90
|
+
setConfig(newConfig)
|
|
92
91
|
setGlobalActive(1)
|
|
93
92
|
}
|
|
94
93
|
}
|
|
95
94
|
}
|
|
96
95
|
|
|
97
|
-
return (
|
|
98
|
-
className=
|
|
96
|
+
return (
|
|
97
|
+
<button className={classNames} onClick={() => setTypes()} aria-label={label}>
|
|
98
|
+
{icon}
|
|
99
|
+
<span className='mt-1'>{label}</span>
|
|
100
|
+
</button>
|
|
101
|
+
)
|
|
99
102
|
}
|
|
100
103
|
|
|
101
104
|
return (
|
|
102
|
-
<div className=
|
|
103
|
-
<a href=
|
|
104
|
-
rel="noopener noreferrer" className="guidance-link" style={{marginTop: 0, marginBottom: "2rem"}}>
|
|
105
|
+
<div className='choose-vis'>
|
|
106
|
+
<a href='https://www.cdc.gov/wcms/4.0/cdc-wp/data-presentation/index.html' target='_blank' rel='noopener noreferrer' className='guidance-link' style={{ marginTop: 0, marginBottom: '2rem' }}>
|
|
105
107
|
<div>
|
|
106
|
-
<p>
|
|
108
|
+
<p>
|
|
109
|
+
For more information on the types of data visualizations in the WCMS, including examples and best practices, <u>see the WCMS Features Gallery</u>.
|
|
110
|
+
</p>
|
|
107
111
|
</div>
|
|
108
112
|
</a>
|
|
109
113
|
|
|
110
|
-
<div className=
|
|
111
|
-
<ul className=
|
|
114
|
+
<div className='heading-2'>General</div>
|
|
115
|
+
<ul className='grid cove-temp'>
|
|
116
|
+
{' '}
|
|
117
|
+
{/*TODO: Remove cove class during refactor to Wizard*/}
|
|
112
118
|
<li>
|
|
113
|
-
<Tooltip position=
|
|
119
|
+
<Tooltip position='right'>
|
|
114
120
|
<Tooltip.Target>
|
|
115
|
-
<IconButton label=
|
|
121
|
+
<IconButton label='Dashboard' type='dashboard' icon={<DashboardIcon />} />
|
|
116
122
|
</Tooltip.Target>
|
|
117
|
-
<Tooltip.Content>
|
|
118
|
-
Present multiple data visualizations with shared filter controls.
|
|
119
|
-
</Tooltip.Content>
|
|
123
|
+
<Tooltip.Content>Present multiple data visualizations with shared filter controls.</Tooltip.Content>
|
|
120
124
|
</Tooltip>
|
|
121
125
|
</li>
|
|
122
126
|
<li>
|
|
123
127
|
<Tooltip>
|
|
124
128
|
<Tooltip.Target>
|
|
125
|
-
<IconButton label=
|
|
129
|
+
<IconButton label='Data Bite' type='data-bite' icon={<DataBiteIcon />} />
|
|
126
130
|
</Tooltip.Target>
|
|
127
|
-
<Tooltip.Content>
|
|
128
|
-
Highlight a single aggregated value (e.g., sum or median).
|
|
129
|
-
</Tooltip.Content>
|
|
131
|
+
<Tooltip.Content>Highlight a single aggregated value (e.g., sum or median).</Tooltip.Content>
|
|
130
132
|
</Tooltip>
|
|
131
133
|
</li>
|
|
132
134
|
<li>
|
|
133
135
|
<Tooltip>
|
|
134
136
|
<Tooltip.Target>
|
|
135
|
-
<IconButton label=
|
|
137
|
+
<IconButton label='Waffle Chart' type='waffle-chart' icon={<WaffleChartIcon />} />
|
|
136
138
|
</Tooltip.Target>
|
|
137
|
-
<Tooltip.Content>
|
|
138
|
-
Highlight a piece of data in relationship to a data set.
|
|
139
|
-
</Tooltip.Content>
|
|
139
|
+
<Tooltip.Content>Highlight a piece of data in relationship to a data set.</Tooltip.Content>
|
|
140
140
|
</Tooltip>
|
|
141
141
|
</li>
|
|
142
142
|
</ul>
|
|
143
143
|
|
|
144
|
-
<div className=
|
|
145
|
-
<ul className=
|
|
144
|
+
<div className='heading-2'>Charts</div>
|
|
145
|
+
<ul className='grid cove-temp'>
|
|
146
146
|
<li>
|
|
147
|
-
<Tooltip position=
|
|
147
|
+
<Tooltip position='right'>
|
|
148
148
|
<Tooltip.Target>
|
|
149
|
-
<IconButton label=
|
|
149
|
+
<IconButton label='Bar' type='chart' subType='Bar' orientation='vertical' icon={<BarIcon />} />
|
|
150
150
|
</Tooltip.Target>
|
|
151
|
-
<Tooltip.Content>
|
|
152
|
-
Use bars to show comparisons between data categories.
|
|
153
|
-
</Tooltip.Content>
|
|
151
|
+
<Tooltip.Content>Use bars to show comparisons between data categories.</Tooltip.Content>
|
|
154
152
|
</Tooltip>
|
|
155
153
|
</li>
|
|
156
154
|
<li>
|
|
157
155
|
<Tooltip>
|
|
158
156
|
<Tooltip.Target>
|
|
159
|
-
<IconButton label=
|
|
157
|
+
<IconButton label='Line' type='chart' subType='Line' orientation='vertical' icon={<LineIcon />} />
|
|
160
158
|
</Tooltip.Target>
|
|
161
|
-
<Tooltip.Content>
|
|
162
|
-
Present one or more data trends over time.
|
|
163
|
-
</Tooltip.Content>
|
|
159
|
+
<Tooltip.Content>Present one or more data trends over time.</Tooltip.Content>
|
|
164
160
|
</Tooltip>
|
|
165
161
|
</li>
|
|
166
162
|
<li>
|
|
167
163
|
<Tooltip>
|
|
168
164
|
<Tooltip.Target>
|
|
169
|
-
<IconButton label=
|
|
165
|
+
<IconButton label='Pie' type='chart' subType='Pie' orientation='vertical' icon={<PieIcon />} />
|
|
170
166
|
</Tooltip.Target>
|
|
171
|
-
<Tooltip.Content>
|
|
172
|
-
Present the numerical proportions of a data series.
|
|
173
|
-
</Tooltip.Content>
|
|
167
|
+
<Tooltip.Content>Present the numerical proportions of a data series.</Tooltip.Content>
|
|
174
168
|
</Tooltip>
|
|
175
169
|
</li>
|
|
176
170
|
<li>
|
|
177
171
|
<Tooltip>
|
|
178
172
|
<Tooltip.Target>
|
|
179
|
-
<IconButton label=
|
|
173
|
+
<IconButton label='Paired Bar' type='chart' subType='Paired Bar' orientation='horizontal' icon={<PairedBarIcon />} />
|
|
180
174
|
</Tooltip.Target>
|
|
181
|
-
<Tooltip.Content>
|
|
182
|
-
Use paired bars to show comparisons between two different data categories.
|
|
183
|
-
</Tooltip.Content>
|
|
175
|
+
<Tooltip.Content>Use paired bars to show comparisons between two different data categories.</Tooltip.Content>
|
|
184
176
|
</Tooltip>
|
|
185
177
|
</li>
|
|
186
178
|
<li>
|
|
187
179
|
<Tooltip>
|
|
188
180
|
<Tooltip.Target>
|
|
189
|
-
<IconButton label=
|
|
190
|
-
icon={<HorizontalStackIcon/>}/>
|
|
181
|
+
<IconButton label='Horizontal Bar (Stacked)' type='chart' subType='Bar' orientation='horizontal' stacked={true} icon={<HorizontalStackIcon />} />
|
|
191
182
|
</Tooltip.Target>
|
|
192
|
-
<Tooltip.Content>
|
|
193
|
-
Use bars to show comparisons between data categories.
|
|
194
|
-
</Tooltip.Content>
|
|
183
|
+
<Tooltip.Content>Use bars to show comparisons between data categories.</Tooltip.Content>
|
|
195
184
|
</Tooltip>
|
|
196
185
|
</li>
|
|
197
186
|
</ul>
|
|
198
187
|
|
|
199
|
-
<div className=
|
|
200
|
-
<ul className=
|
|
188
|
+
<div className='heading-2'>Maps</div>
|
|
189
|
+
<ul className='grid cove-temp'>
|
|
201
190
|
<li>
|
|
202
|
-
<Tooltip position=
|
|
191
|
+
<Tooltip position='right'>
|
|
203
192
|
<Tooltip.Target>
|
|
204
|
-
<IconButton label=
|
|
193
|
+
<IconButton label='United States (State- or County-Level)' type='map' subType='us' icon={<UsaIcon />} />
|
|
205
194
|
</Tooltip.Target>
|
|
206
|
-
<Tooltip.Content>
|
|
207
|
-
Present a U.S. choropleth map at state or county level.
|
|
208
|
-
</Tooltip.Content>
|
|
195
|
+
<Tooltip.Content>Present a U.S. choropleth map at state or county level.</Tooltip.Content>
|
|
209
196
|
</Tooltip>
|
|
210
197
|
</li>
|
|
211
198
|
<li>
|
|
212
|
-
<Tooltip position=
|
|
199
|
+
<Tooltip position='right'>
|
|
213
200
|
<Tooltip.Target>
|
|
214
|
-
<IconButton label=
|
|
201
|
+
<IconButton label='United States (HHS Regions)' type='map' subType='us-region' icon={<UsaRegionIcon />} />
|
|
215
202
|
</Tooltip.Target>
|
|
216
|
-
<Tooltip.Content>
|
|
217
|
-
Present a U.S. choropleth map at state or county level.
|
|
218
|
-
</Tooltip.Content>
|
|
203
|
+
<Tooltip.Content>Present a U.S. choropleth map at state or county level.</Tooltip.Content>
|
|
219
204
|
</Tooltip>
|
|
220
205
|
</li>
|
|
221
206
|
<li>
|
|
222
207
|
<Tooltip>
|
|
223
208
|
<Tooltip.Target>
|
|
224
|
-
<IconButton label=
|
|
209
|
+
<IconButton label='World' type='map' subType='world' icon={<GlobeIcon />} />
|
|
225
210
|
</Tooltip.Target>
|
|
226
|
-
<Tooltip.Content>
|
|
227
|
-
Present a choropleth map of the world.
|
|
228
|
-
</Tooltip.Content>
|
|
211
|
+
<Tooltip.Content>Present a choropleth map of the world.</Tooltip.Content>
|
|
229
212
|
</Tooltip>
|
|
230
213
|
</li>
|
|
231
214
|
<li>
|
|
232
215
|
<Tooltip>
|
|
233
216
|
<Tooltip.Target>
|
|
234
|
-
<IconButton label=
|
|
217
|
+
<IconButton label='U.S. State' type='map' subType='single-state' icon={<AlabamaGraphic />} />
|
|
235
218
|
</Tooltip.Target>
|
|
236
|
-
<Tooltip.Content>
|
|
237
|
-
Present a choropleth map of an individual U.S. state.
|
|
238
|
-
</Tooltip.Content>
|
|
219
|
+
<Tooltip.Content>Present a choropleth map of an individual U.S. state.</Tooltip.Content>
|
|
239
220
|
</Tooltip>
|
|
240
221
|
</li>
|
|
241
222
|
<li>
|
|
242
223
|
<Tooltip>
|
|
243
224
|
<Tooltip.Target>
|
|
244
|
-
<IconButton label=
|
|
225
|
+
<IconButton label='U.S. Geocode' type='map' subType='us-county' generalType='us-geocode' icon={<UsaIcon />} />
|
|
245
226
|
</Tooltip.Target>
|
|
246
|
-
<Tooltip.Content>
|
|
247
|
-
United States GeoCode
|
|
248
|
-
</Tooltip.Content>
|
|
227
|
+
<Tooltip.Content>United States GeoCode</Tooltip.Content>
|
|
249
228
|
</Tooltip>
|
|
250
229
|
</li>
|
|
251
230
|
</ul>
|