{"version":3,"sources":["components/chartutils.js","components/ResponsiveTable.js","components/chart.js","components/timeSeriesChart.js","components/barChart.js","components/donutChart.js","sections/tabset2/demographics/index.js","sections/tabset2/index.js"],"names":["utils","x","digits","Number","isInteger","toFixed","undefined","data","column","reduce","total","num","index","list","map","item","Object","keys","_sort_order","assign","target","TypeError","arguments","length","source","key","prototype","hasOwnProperty","call","sort","item1","item2","i","order","direction","pos1","indexOf","pos2","number","format","mask","isNaN","Math","round","toLocaleString","style","currency","maximumSignificantDigits","replace","measures","sortorder","result","current","rec","forEach","measure","newfirst","checkkeys","push","newcurrent","groupBy","summands","acc","cur","findIndex","d","group","every","summand","obj","names_from","values_from","fixed","groupVars","value","groupVarValues","groupVar","Set","add","var1","var2","newObj","useStyles","makeStyles","root","width","container","maxHeight","scrollbarWidth","overflowX","scrollbarColor","paddingLeft","paddingRight","webkitScrollbar","styledScrollBar","webkitScrollbarTrack","background","webkitScrollbarThumb","backgroundColor","borderRadius","border","descendingComparator","a","b","orderBy","ResponsiveTable","props","rows","columns","columnOrder","sortBy","React","useState","setOrder","setOrderBy","classes","createSortHandler","property","event","handleRequestSort","className","stickyHeader","aria-label","size","id","align","minWidth","borderBottom","fontWeight","active","onClick","label","array","comparator","stabilizedThis","el","stableSort","getComparator","row","hover","role","tabIndex","random","toString","minimumFractionDigits","decimals","Chart","this","generateChart","chart","destroy","c3","generate","bindto","node","config","otherProps","ref","PureComponent","this_chart","createRef","String","endsWith","search","this_len","substring","TimeSeriesChart","divref","chartref","state","chartid","updateFlag","date_type","datain","datecolumns","date_col","concat","datacolumns_confirmed","datacolumns_prelim","measure_cols","measure_col_labels","inAnyRegion","categories","chartutils","listValues","cat_data","curr_category","measure_col","sorted","select_data","sortIt","dayData","inRegion","regions","region","test_date","start","end","some","transformData","types","ret","columnName","colors","chartdata","prepareData","color","textAlign","tooltip","title","dateparts","toDateString","split","substr","measure_format","ratio","calcnumber","calcpercent","calcpercent_decimal","calcpercent_number","calcdollarMillions","calcdollarBillions","calcdollarNoCents","calcdollar","c3_config","assignTypes","height","axis","type","tick","toLocaleDateString","month","day","fit","culling","max","min","Date","y","padding","bottom","top","ymax","grid","show","lines","date_lines","line","text","legend","hide","point","showPoints","r","bar","zoom","enabled","extent","subchart","Box","justifyContent","updateflag","Component","BarChart","rotated","datalabels","hideYLabels","category_groups","category","category_col_label","category_col_labels","category_order","by_category_order","chartdiv","element","DOMNode","ReactDOM","findDOMNode","offsetWidth","offsetHeight","measureElement","rotated_small","height_small","datalabels_small","culling_small","hideYLabels_small","resize","setState","preparedData","group_display","groups","showlegend","position","legendposition","multiline","xmultiline","xwidth","d3","totals","datalabelformat","labels","datelables","v","j","shown","ycount","count","onrendered","center","display","alignItems","buttonselected","boxShadow","DonutChart","view","sum_data","sumByGroup","totValues","table_data","percent","donut","table","ButtonGroup","margin","variant","Button","selectChart","bind","selectTable","Demographics","epicurve_by_race_sex","setEpicurve_by_race_sex","currdate","useContext","CacheContext","useEffect","fetch","then","resp","csv","Papa","parse","header","skipEmptyLines","dynamicTyping","json","race_order","age_order","demographics_info","epicurve_by_age","demoCaseCategory","setDemoCaseCategory","demographicBarView","setDemographicBarView","epicurveAgeView","setEpicurveAgeView","Typography","component","gutterBottom","horizontalAlign","flexDirection","mx","whiteSpace","overflow","ToggleButtonGroup","onChange","exclusive","toggleContainer","ToggleButton","measure_type","hideXLabels_small","pattern","sumMeasures","hr","Grid","xs","filter","age_group_major","fillMissing","left","sm","md","lg","mediaFlow","paddingBottom","fontSize","borderColor","Select","selectBox","child","MenuItem","Container","maxWidth","pivotWider","county_name","race","Female","Male","Total","Unknown","ageMap","Map","raceMap","Tabset2","setDemographics_info","setEpicurve_by_age","get","age_group","race_other","sex","fallback"],"mappings":"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","file":"static/js/12.5a5ef82a.chunk.js","sourcesContent":["import 'core-js/stable'\n\nexport default class utils {\n static totValues (data, column) {\n /**\n * @name totValues (function)\n * @property data - data array\n * @property column - column name to be totalled\n * @example totValues(data, 'column1')\n */\n var total = data.reduce((total, num, index) => {\n return total + num[column]\n }, 0)\n return total\n }\n\n static listValues (data, column) {\n /**\n * @name listValues (function)\n * @property data - data array\n * @property column - column name to enumerate values\n * @example totValues(data, 'column1')\n */\n const list = {}\n data.map((item) => {\n list[item[column]] = item[column]\n return null\n })\n return Object.keys(list).map((item) => list[item])\n }\n\n /**\n * @name sortIt (function)\n * @property data - data to be sorted\n * @property sortorder - array of sort keys in order\n * @property sortorder.key - column to be sorted\n * @property sortorder.direction - 'ASC'/ 'DSC'\n * @property sortorder.order - (optional) array of values for custom order\n * @example sortIt(data, [{key: 'column1', direction: 'ASC'},\n * {key: 'column2', direction: 'ASC',\n * order: ['item1','item2','item4','item5']})\n */\n static sortIt (data, _sort_order) {\n if (typeof Object.assign !== 'function') {\n Object.assign = function (target) {\n // 'use strict';\n if (target == null) {\n throw new TypeError('Cannot convert undefined or null to object')\n }\n\n target = Object(target)\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index]\n if (source != null) {\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key]\n }\n }\n }\n }\n return target\n }\n }\n var dataIn = Object.assign([], data)\n var sorteddata = dataIn.sort((item1, item2) => {\n for (var i = 0; i < _sort_order.length; i++) {\n if (_sort_order[i].order === undefined) { // No custom order\n if (((item1[_sort_order[i].key] > item2[_sort_order[i].key]) && _sort_order[i].direction === 'ASC') ||\n ((item1[_sort_order[i].key] < item2[_sort_order[i].key]) && _sort_order[i].direction === 'DSC')\n ) {\n return 1\n } else if (((item1[_sort_order[i].key] < item2[_sort_order[i].key]) && _sort_order[i].direction === 'ASC') ||\n ((item1[_sort_order[i].key] > item2[_sort_order[i].key]) && _sort_order[i].direction === 'DSC')\n ) {\n return -1\n }\n } else { // custom order\n var pos1 = _sort_order[i].order.indexOf(item1[_sort_order[i].key])\n var pos2 = _sort_order[i].order.indexOf(item2[_sort_order[i].key])\n if ((pos1 > pos2 && _sort_order[i].direction === 'ASC') ||\n (pos1 < pos2 && _sort_order[i].direction === 'DSC')) {\n return 1\n } else if ((pos1 < pos2 && _sort_order[i].direction === 'ASC') ||\n (pos1 > pos2 && _sort_order[i].direction === 'DSC')) {\n return -1\n }\n }\n }\n return 0\n })\n return sorteddata\n }\n\n static numFormat (number, format, digits, mask) {\n if (isNaN(number)) {\n number = Number(number)\n }\n switch (format) {\n case 'dollar':\n return digits === 0 ? '$' + Math.round(number).toLocaleString()\n : number.toLocaleString('USD', { style: 'currency', currency: 'USD' })\n case 'dollar-nocents':\n if (number > 999999999) {\n return '$ ' + ((number / 1000000000)).toFixed(1) + ' B'\n } else if (number > 999999) {\n return '$ ' + ((number / 1000000)).toFixed(1) + ' M'\n } else {\n return number.toLocaleString('USD', { style: 'currency', currency: 'USD' })\n }\n case 'percent-number':\n // console.log(\"Mask is \", mask, \"Number is \", number)\n if (isNaN(number) || number === null) {\n return 'N/A'\n } else if (mask === undefined) {\n return Number(number).toFixed(digits === undefined ? 1 : digits)\n } else {\n if (mask === 1) {\n return '>95'\n } else if (mask === 2) {\n return '<5'\n } else if (mask === 3) {\n return '<10'\n } else {\n return Number(number).toFixed(digits)\n }\n }\n case 'percent':\n // console.log(\"Mask is \", mask, \"Number is \", number)\n if (mask === undefined) {\n return Number(number).toFixed(digits === undefined ? 1 : digits) + '%'\n } else {\n if (mask === 1) {\n return '>95%'\n } else if (mask === 2) {\n return '<5%'\n } else if (mask === 3) {\n return '<10%'\n } else {\n return Number(number).toFixed(digits) + '%'\n }\n }\n case 'percent-decimal':\n if (mask === undefined) {\n return Number(number * 100).toFixed(digits === undefined ? 1 : digits) + '%'\n } else {\n if (mask === 1) {\n return '>95%'\n } else if (mask === 2) {\n return '<5%'\n } else if (mask === 3) {\n return '<10%'\n } else {\n return Number(number).toFixed(digits) + '%'\n }\n }\n case 'number':\n\n if (isNaN(number) || number === null) {\n return 'N/A'\n } else if (mask === undefined) {\n return digits === undefined || digits < 1 ? Math.round(Number(number)).toLocaleString() : Number(number).toFixed(digits).toLocaleString({ maximumSignificantDigits: digits })\n } else {\n if (mask === 1) {\n return 'N/A'\n } else if (mask === 2) {\n return 'N/A'\n } else if (mask === 3) {\n return '<10'\n } else {\n return Number(number).toFixed(digits)\n }\n }\n default:\n break\n }\n }\n\n calcpercent (x, digits) {\n if (x > 100) {\n return null\n } else {\n if (Number.isInteger(x)) {\n return x.toFixed(digits === undefined ? 0 : digits) + ' %'\n } else if (x === null) { return 'N/A' } else {\n return x.toFixed(digits === undefined ? 2 : digits) + ' %'\n }\n }\n }\n\n static calcpercent_number (x, digits) {\n if (x > 100) { return null } else {\n if (Number.isInteger(x)) { return x.toFixed(digits === undefined ? 0 : digits) } else if (x === null) { return 'N/A' } else { return x.toFixed(digits === undefined ? 2 : digits) }\n }\n }\n\n static calcpercent_decimal (x, digits) {\n if (x > 1) { return null } else {\n // var value = 100*Number(x);\n if (Number.isInteger(x)) {\n // console.log(\"Calcpercent_decimal\",x,\"Formatted\",(x*100).toFixed(digits === undefined ? 0 : digits) + \" %\" );\n return (x * 100).toFixed(0) + ' %'\n } else if (x === null) { return 'N/A' } else {\n // console.log(\"Calcpercent_decimal-2\",x,value,Math.round(value),\"Formatted\",(x*100).toFixed(digits === undefined ? 1 : digits) + \" %\" );\n return (x * 100).toFixed(digits === undefined ? 1 : digits) + ' %'\n }\n }\n }\n\n static calcnumber (x, digits) {\n digits = digits === undefined ? 2 : digits\n if (Number.isInteger(x)) { return x.toLocaleString() } else { return (Number(Math.round(x + 'e' + digits) + 'e-' + digits)).toLocaleString() }\n }\n\n static calcdollar (x, digits) {\n return '$' + Number(x).toFixed(2).replace(/(\\d)(?=(\\d{3})+\\.)/g, '$1,')\n }\n\n static calcdollarNoCents (x, digits) {\n if (x > 999999999) {\n return '$ ' + ((x / 1000000000)).toFixed(1) + ' B'\n } else if (x > 999999) {\n return '$ ' + ((x / 1000000)).toFixed(1) + ' M'\n } else {\n return 0 // numFormat(x,\"dollar\",0);\n }\n }\n\n static calcdollarMillions (x, digits) {\n return '$ ' + ((x / 1000000)).toFixed(1) + ' M'\n }\n\n static calcdollarBillions (x, digits) {\n return '$ ' + ((x / 1000000000)).toFixed(1) + ' B'\n }\n\n static sumMeasures (data, keys, measures, sortorder) {\n // data -JSON Array to be summarized\n // key - key for values to summarize\n // amount - value to be used to create subtotals\n // limitentries - Maximum number of entries\n // console.log(\"Data in SumMeasures\", data, keys,measures)\n const result = []\n const checkkeys = (item1, item2, keys) => {\n let result = true\n keys.forEach((key) => { if (item1[key] !== item2[key]) { result = false } })\n // console.log(\"Compare \", result, item1, item2)\n return result\n }\n const newfirst = (item) => {\n const rec = {}\n measures.forEach((measure) => rec[measure] = 0)\n keys.forEach((key) => rec[key] = item[key])\n return rec\n }\n const newcurrent = (item) => {\n const rec = {}\n measures.forEach((measure) => rec[measure] = item[measure])\n keys.forEach((key) => rec[key] = item[key])\n return rec\n }\n let current = newfirst(data[0])\n data.map(function (item, index) {\n if (!checkkeys(item, current, keys)) {\n result.push(current)\n current = newcurrent(item)\n } else {\n for (let i = 0; i < measures.length; i++) {\n current[measures[i]] = current[measures[i]] + data[index][measures[i]]\n }\n }\n return null\n })\n result.push(current)\n // console.log(\"Result\", result)\n return result\n }\n\n /** Sums an array of objects by a grouping variable.\n * Returns an array of objects, one for each level of the grouby variable.\n *@param {array} data\n *@param {string[]} groupBy Variables to group by\n *@param {string[]} summands Variables to sum up\n */\n static sumByGroup (data, groupBy, summands) {\n const ret = data.reduce((acc, cur) => {\n const i = acc.findIndex((d) => {\n return groupBy.map((group) => d[group] === cur[group]).every(item => item === true)\n })\n if (i > -1) {\n for (const summand of summands) {\n acc[i][summand] = acc[i][summand] + cur[summand]\n }\n } else {\n const obj = {}\n for (const group of groupBy) {\n obj[group] = cur[group]\n }\n for (const summand of summands) {\n obj[summand] = cur[summand]\n }\n acc.push(obj)\n }\n return acc\n }, []\n )\n return ret\n }\n\n /** \"Widens\" data, increasing the number of columns and decreasing the number of rows.\n * Returns a (shorter) array of objects, one for each level of the \"fixed\" variable\n * @param {array} data\n * @param {string} names_from which column to get the name of the output columns from\n * @param {string} values_from which column to get the cell values from\n * @param {string} fixed columns that do not get pivotted\n */\n static pivotWider (data, names_from, values_from, fixed) {\n const ret = data.reduce((acc, cur) => {\n const i = acc.findIndex((d) => {\n return (d[fixed] === cur[fixed])\n })\n if (i > -1) {\n acc[i][cur[names_from]] = cur[values_from]\n } else {\n const obj = {}\n obj[fixed] = cur[fixed]\n obj[cur[names_from]] = cur[values_from]\n acc.push(obj)\n }\n return acc\n }, []\n )\n return ret\n }\n\n /** Find missing combinations of groupVars and add in zeroes.\n * Only works for combinations of 2 variables.\n * @param {array} data\n * @param {string[]} groupVars The variables whose combinations we need values for\n * @param {string} value The name of the value column that needs to be filled in\n */\n static fillMissing (data, groupVars, value) {\n // Get all unique values of each groupVar\n const groupVarValues = {}\n for (const groupVar of groupVars) {\n groupVarValues[groupVar] = new Set()\n data.forEach((value) => {\n groupVarValues[groupVar].add(value[groupVar])\n })\n }\n\n // For each combination of groupvars, see if an entry exists in the data\n // If not, add an entry with that combination of groupvars and a value of 0\n for (const var1 of groupVarValues[groupVars[0]]) {\n for (const var2 of groupVarValues[groupVars[1]]) {\n const i = data.findIndex((d) => {\n return (d[groupVars[0]] === var1 && d[groupVars[1]] === var2)\n })\n if (i < 0) {\n const newObj = {}\n newObj[groupVars[0]] = var1\n newObj[groupVars[1]] = var2\n newObj[value] = 0\n data.push(newObj)\n }\n }\n }\n // console.log('fillMissing', data)\n return data\n }\n\n}\n","import React from 'react'\nimport { makeStyles } from '@material-ui/core/styles'\nimport Paper from '@material-ui/core/Paper'\nimport Table from '@material-ui/core/Table'\nimport TableBody from '@material-ui/core/TableBody'\nimport TableCell from '@material-ui/core/TableCell'\nimport TableContainer from '@material-ui/core/TableContainer'\nimport TableHead from '@material-ui/core/TableHead'\n// import TablePagination from '@material-ui/core/TablePagination';\nimport TableRow from '@material-ui/core/TableRow'\nimport TableSortLabel from '@material-ui/core/TableSortLabel'\n\nconst useStyles = makeStyles({\n root: {\n width: '100%'\n },\n container: {\n maxHeight: 440,\n // maxWidth: 500,\n scrollbarWidth: 'thin',\n overflowX: 'scroll',\n scrollbarColor: '#002137 #314c68',\n paddingLeft: '15px',\n paddingRight: '15px',\n webkitScrollbar: {\n width: '11px'\n }\n // backgroundColor: \"#002137\"\n },\n styledScrollBar: {\n webkitScrollbar: {\n width: '11px'\n },\n webkitScrollbarTrack: {\n background: '#314c68'\n },\n webkitScrollbarThumb: {\n backgroundColor: '#002137',\n borderRadius: '6px',\n border: '2px solid #314c68'\n }\n }\n})\n\nfunction descendingComparator (a, b, orderBy) {\n if (b[orderBy] < a[orderBy]) {\n return -1\n }\n if (b[orderBy] > a[orderBy]) {\n return 1\n }\n return 0\n}\n\nfunction getComparator (order, orderBy) {\n return order === 'desc'\n ? (a, b) => descendingComparator(a, b, orderBy)\n : (a, b) => -descendingComparator(a, b, orderBy)\n}\n\nfunction stableSort (array, comparator) {\n const stabilizedThis = array.map((el, index) => [el, index])\n stabilizedThis.sort((a, b) => {\n const order = comparator(a[0], b[0])\n if (order !== 0) return order\n return a[1] - b[1]\n })\n\n return stabilizedThis.map((el) => el[0])\n}\n\nexport default function ResponsiveTable (props) {\n const { rows, columns, columnOrder, sortBy } = props\n const [order, setOrder] = React.useState(columnOrder)\n const [orderBy, setOrderBy] = React.useState(sortBy)\n const classes = useStyles()\n // const [page] = React.useState(0)\n // const [rowsPerPage] = React.useState(19999)\n\n const handleRequestSort = (event, property) => {\n const isAsc = orderBy === property && order === 'asc'\n setOrder(isAsc ? 'desc' : 'asc')\n setOrderBy(property)\n }\n\n const createSortHandler = (property) => (event) => {\n handleRequestSort(event, property)\n }\n // const createSortHandler = (property) => (event) => {\n // onRequestSort(event, property);\n // };\n // const handleChangePage = (event, newPage) => {\n // setPage(newPage);\n // };\n\n // const handleChangeRowsPerPage = (event) => {\n // setRowsPerPage(+event.target.value);\n // setPage(0);\n // };\n\n return (\n <Paper className={classes.root}>\n <TableContainer className={classes.container}>\n <Table stickyHeader aria-label='sticky table' size='small'>\n <TableHead>\n <TableRow>\n {columns.map((column) => (\n <TableCell\n key={column.id}\n align={column.align}\n style={{ minWidth: column.minWidth, border: 'none', borderBottom: '1px grey solid', fontWeight: 600 }}\n >\n <TableSortLabel\n active={orderBy === column.id}\n direction={orderBy === column.id ? order : 'asc'}\n onClick={createSortHandler(column.id)}\n >\n {column.label}\n </TableSortLabel>\n </TableCell>\n ))}\n </TableRow>\n </TableHead>\n <TableBody>\n {stableSort(rows, getComparator(order, orderBy))\n // .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\n .map((row) => {\n return (\n <TableRow hover role='checkbox' tabIndex={-1} key={'row' + Math.random().toString()}>\n {columns.map((column) => {\n const value = row[column.id]\n return (\n <TableCell key={column.id} align={column.align} style={{ border: 'none' }}>\n {typeof value === 'number' ? \n value.toLocaleString(undefined, {minimumFractionDigits: column.decimals}) : \n value\n }\n </TableCell>\n )\n })}\n </TableRow>\n )\n })}\n </TableBody>\n </Table>\n </TableContainer>\n {/* <TablePagination\n rowsPerPageOptions={[999, 25, 100]}\n component=\"div\"\n count={rows.length}\n rowsPerPage={rowsPerPage}\n page={page}\n onChangePage={handleChangePage}\n onChangeRowsPerPage={handleChangeRowsPerPage}\n /> */}\n </Paper>\n )\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport c3 from 'c3';\n// import * as d3 from 'd3';\nexport default class Chart extends React.PureComponent {\n static propTypes = {\n config: PropTypes.object,\n };\n static this_chart = React.createRef;\n\n componentDidMount() {\n this.generateChart();\n }\n\n componentDidUpdate() {\n this.generateChart();\n }\n\n componentWillUnmount() {\n this.chart = this.chart.destroy();\n }\n\n\n generateChart() {\n this.chart = c3.generate({\n bindto: this.node,\n ...this.props.config,\n }); \n \n // let columns = this.props.config.data.columns.map((column) => column[0]);\n // let colors = this.props.config.color.pattern;\n // columns.splice(0,1) \n // let thischart = this.chart\n // console.log(\"Generate chart\", this.props,columns, this.chart) \n // d3.select(this.node).insert('div', '.chart').attr('class', 'legend').selectAll('span')\n // .data(columns) \n // .enter().append('span')\n // .attr('data-id', function (id) { return id; })\n // .html(function (id) { return id; })\n // .each(function (id,idx) {\n // d3.select(this).style('background-color', colors[idx]);\n // })\n // .on('mouseover', function (id) {\n // thischart.focus(id);\n // })\n // .on('mouseout', function (id) {\n // thischart.revert();\n // })\n // .on('click', function (id) {\n // thischart.toggle(id);\n // });\n }\n\n render() {\n // return <div ref={node => (this.node = node)} {...otherProps} />;\n const { config, ...otherProps } = this.props;\n return <div ref={node => (this.node = node)} {...otherProps} />;\n }\n}","import React from \"react\";\n// import ReactDOM from \"react-dom\";\n// import * as d3 from 'd3';\nimport Chart from \"./chart.js\";\n\n// import { makeStyles } from '@material-ui/core/styles';\nimport \"c3/c3.css\";\nimport \"../css/c3.css\";\nimport chartutils from \"./chartutils.js\";\nimport { Box } from \"@material-ui/core\";\n\nif (!String.prototype.endsWith) {\n // eslint-disable-next-line\n String.prototype.endsWith = function (search, this_len) {\n if (this_len === undefined || this_len > this.length) {\n this_len = this.length;\n }\n return this.substring(this_len - search.length, this_len) === search;\n };\n}\nexport default class TimeSeriesChart extends React.Component {\n // classes = useStyles();\n constructor(props) {\n super(props);\n\n this.divref = React.createRef();\n this.chartref = React.createRef();\n this.state = {\n chartid: \"c3_chart\" + Math.random().toString,\n updateFlag: true,\n date_type: \"onset\",\n };\n }\n\n transformData(datain) {\n const datecolumns = [this.props.date_col].concat(\n datain.map((data) => data[this.props.date_col])\n );\n let datacolumns_confirmed = [];\n let datacolumns_prelim = [];\n if (this.props.measure_cols !== undefined) {\n datacolumns_confirmed = this.props.measure_cols.map((measure, index) => {\n const measure_col_label =\n this.props.measure_col_labels === undefined\n ? measure\n : this.props.measure_col_labels[index];\n return [measure_col_label].concat(\n datain.map((data) => {\n return data.inAnyRegion ? null : data[measure];\n })\n );\n });\n datacolumns_prelim = this.props.measure_cols.map((measure, index) => {\n const measure_col_label =\n this.props.measure_col_labels === undefined\n ? measure + \" (Preliminary)\"\n : this.props.measure_col_labels[index] + \" (Preliminary)\";\n return [measure_col_label].concat(\n datain.map((data) => {\n return data.inAnyRegion ? data[measure] : null;\n })\n );\n });\n } else {\n const categories = chartutils.listValues(\n datain,\n this.props.categories[0]\n );\n let cat_data = [];\n let curr_category = 0;\n datain.forEach((data, index) => {\n if (data[this.props.categories[0]] !== categories[curr_category]) {\n datacolumns_confirmed.push(\n [categories[curr_category]].concat(cat_data)\n );\n cat_data = [data.inAnyRegion ? null : data[this.props.measure_col]];\n cat_data = [];\n curr_category = curr_category + 1;\n cat_data.push(data.inAnyRegion ? null : data[this.props.measure_col]);\n } else {\n cat_data.push(data.inAnyRegion ? null : data[this.props.measure_col]);\n }\n });\n datacolumns_confirmed.push([categories[curr_category]].concat(cat_data));\n cat_data = [];\n curr_category = 0;\n datain.forEach((data, index) => {\n if (data[this.props.categories[0]] !== categories[curr_category]) {\n datacolumns_prelim.push(\n [categories[curr_category] + \" (Preliminary)\"].concat(cat_data)\n );\n cat_data = [data.inAnyRegion ? data[this.props.measure_col] : null];\n cat_data = [];\n curr_category = curr_category + 1;\n } else {\n cat_data.push(data.inAnyRegion ? data[this.props.measure_col] : null);\n }\n });\n datacolumns_prelim.push(\n [categories[curr_category] + \" (Preliminary)\"].concat(cat_data)\n );\n }\n return [datecolumns]\n .concat(datacolumns_confirmed)\n .concat(datacolumns_prelim);\n // return datacolumns\n }\n\n prepareData() {\n const select_data = this.props.data;\n if (select_data.length < 2) {\n return null;\n }\n // console.log(\"Select data\",this.state.current_select, this.props.filter_select,select_data)\n let sorted;\n if (this.props.sort === false) {\n sorted = select_data;\n } else {\n sorted = chartutils.sortIt(select_data, [\n { key: this.props.date_col, direction: \"ASC\" },\n ]);\n }\n sorted = sorted.map((dayData) => {\n const inRegion =\n this.props.regions === undefined\n ? undefined\n : this.props.regions.map(\n (region) =>\n dayData.test_date > region.start &&\n dayData.test_date <= region.end\n );\n if (this.props.regions !== undefined) {\n dayData.inAnyRegion = inRegion.some((region) => region === true);\n }\n return dayData;\n });\n const data = this.transformData(sorted);\n const regions = {};\n if (this.props.regions !== undefined) {\n data.map((item, index) => {\n if (index === 0) return null;\n regions[item[0]] = this.props.regions.map((region) => {\n return { start: region.start, end: region.end };\n });\n return null;\n });\n }\n return {\n x: this.props.date_col,\n columns: data,\n regions: this.props.regions === undefined ? undefined : regions,\n types: this.props.types,\n };\n }\n\n assignTypes(types, columns) {\n const ret = {};\n columns.forEach((column) => {\n let columnName = column[0];\n if (columnName.endsWith(\"(Preliminary)\")) {\n ret[columnName] = \"scatter\";\n } else {\n ret[columnName] = types === undefined ? undefined : types[columnName];\n }\n });\n return ret;\n }\n\n render() {\n // console.log(this.props);\n const { colors } = this.props;\n const chartdata = this.prepareData();\n if (chartdata === null) {\n return (\n <h3 style={{ color: \"white\", textAlign: \"center\" }}>\n Not enough data to draw a chart\n </h3>\n );\n }\n var tooltip = {\n order: null,\n format: {\n title: (x, index) => {\n const dateparts = x.toDateString().split(\" \");\n return dateparts[2] + dateparts[1] + dateparts[3].substr(2, 3);\n },\n },\n };\n if (this.state.measure_format === \"number\") {\n tooltip.format.value = (value, ratio, id, index) =>\n chartutils.calcnumber(value, this.props.digits);\n } else if (this.state.measure_format === \"percent\") {\n tooltip.format.value = (value, ratio, id, index) =>\n chartutils.calcpercent(value, this.props.digits);\n } else if (this.state.measure_format === \"percent-decimal\") {\n tooltip.format.value = (value, ratio, id, index) =>\n chartutils.calcpercent_decimal(value);\n } else if (this.state.measure_format === \"percent-number\") {\n tooltip.format.value = (value, ratio, id, index) =>\n chartutils.calcpercent_number(value);\n } else if (this.state.measure_format === \"dollar-millions\") {\n tooltip.format.value = (value, ratio, id, index) =>\n chartutils.calcdollarMillions(value);\n } else if (this.state.measure_format === \"dollar-billions\") {\n tooltip.format.value = (value, ratio, id, index) =>\n chartutils.calcdollarBillions(value);\n } else if (this.state.measure_format === \"dollar-nocents\") {\n tooltip.format.value = (value, ratio, id, index) =>\n chartutils.calcdollarNoCents(value);\n } else if (\n this.state.measure_format === \"dollar\" &&\n this.state.digits === 0\n ) {\n tooltip.format.value = (value, ratio, id, index) =>\n chartutils.calcdollarNoCents(value);\n } else if (this.state.measure_format === \"dollar\") {\n tooltip.format.value = (value, ratio, id, index) =>\n chartutils.calcdollar(value);\n } else {\n tooltip.format.value = (value, ratio, id, index) =>\n chartutils.calcnumber(value, this.props.digits);\n }\n\n const c3_config = {\n data: {\n x: chartdata.x,\n columns: chartdata.columns,\n types: this.assignTypes(this.props.types, chartdata.columns),\n },\n size: {\n height: this.props.height === undefined ? undefined : this.props.height,\n width: this.props.width === undefined ? undefined : this.props.width,\n },\n axis: {\n x: {\n type: \"timeseries\",\n tick: {\n format: (x) => {\n const dateparts = x.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n });\n return dateparts;\n },\n // count: 7,\n fit: false,\n culling: {\n max: 5,\n },\n },\n min: new Date(2020, 2, 1),\n },\n y: {\n tick: {\n format: (x) => {\n if (Number.isInteger(x) === true) {\n return x;\n } else {\n return null;\n }\n },\n },\n padding: {\n bottom: 0,\n top: this.props.ymax === undefined ? undefined : this.props.ymax / 10,\n },\n max: this.props.ymax,\n },\n },\n grid: {\n x: {\n show: true,\n lines:\n this.props.date_lines === undefined\n ? undefined\n : this.props.date_lines.map((line) => {\n return {\n value: line.value,\n text: line.label,\n };\n }),\n },\n y: {\n show: true,\n },\n },\n // this.props.date_lines === undefined\n // ? undefined\n // : {\n // x: {\n // lines: this.props.date_lines.map((line) => {\n // return {\n // value: line.value,\n // text: line.label,\n // // position: \"start\",\n // };\n // }),\n // },\n // },\n regions:\n this.props.regions === undefined ? undefined : this.props.regions,\n color: colors,\n legend: {\n hide: chartdata.columns.reduce((result, column) => {\n if (column[0].endsWith(\"(Preliminary)\")) {\n // console.log(\"Hide \", \"|\" + column[0] + \"|\");\n result.push(column[0]);\n }\n return result;\n }, []),\n },\n tooltip: tooltip,\n point: {\n show: this.props.showPoints,\n r: 3,\n },\n bar: {\n width: 3,\n },\n zoom: {\n enabled: true,\n extent: [1, 100],\n },\n subchart: {\n show: this.props.subchart,\n size: {\n height: 100,\n },\n axis: {\n x: {\n show: false,\n },\n },\n },\n\n // types: this.props.types\n };\n // c3_config.legend.item = { onclick: function (id) { console.log(\"Clicked on legend\", id)} }\n // console.log(\"C3 Config \",c3_config)\n // console.log(\"Props \",this.props.filter_select.default_select !== this.state.current_select,this.props.filter_select,this.state )\n return (\n <Box ref={this.divref} justifyContent=\"center\">\n <Chart\n ref={this.chartref}\n updateflag={this.state.updateFlag.toString()}\n config={c3_config}\n />\n </Box>\n );\n }\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport * as d3 from 'd3'\nimport Chart from 'react-c3-component'\nimport 'c3/c3.css'\nimport '../css/c3.css'\nimport chartutils from './chartutils.js'\nimport Box from '@material-ui/core/Box'\nconst measureElement = element => {\n const DOMNode = ReactDOM.findDOMNode(element)\n return {\n width: DOMNode.offsetWidth,\n height: DOMNode.offsetHeight\n }\n}\n\n/*\n\n*/\nexport default class BarChart extends React.Component {\n constructor (props) {\n super(props)\n\n this.divref = React.createRef()\n this.chartref = React.createRef()\n this.state = {\n chartid: 'c3_chart' + (Math.random().toString),\n updateFlag: true,\n rotated: props.rotated === undefined ? undefined : props.rotated,\n height: props.height === undefined ? undefined : props.height,\n datalabels: props.datalabels === undefined ? undefined : props.datalabels,\n culling: props.culling === undefined ? undefined : props.culling,\n hideYLabels: props.hideYLabels === undefined ? undefined : props.hideYLabels,\n measure_format: props.measure_format === undefined ? 'number' : props.measure_format\n }\n }\n\n transformData (datain) {\n // Categories are enumerated value of the second category\n let columns = []\n let category_groups = []\n let categories = []\n if (this.props.measure_cols !== undefined) { // If multiple measures\n categories = chartutils.listValues(datain, this.props.categories[0])\n columns = this.props.measure_cols.map((measure, index) => {\n const measure_col_label = this.props.measure_col_labels === undefined ? measure : this.props.measure_col_labels[index]\n return [measure_col_label].concat(datain.map((data) => data[measure]))\n })\n } else { // Multiple measure in second category\n category_groups = chartutils.listValues(this.props.data, this.props.categories[0])\n categories = chartutils.listValues(this.props.data, this.props.categories[1])\n columns = category_groups.map((category, index) => {\n const category_col_label = this.props.category_col_labels === undefined ? category : this.props.category_col_labels[index]\n const cat_data = []\n datain.map((data) => {\n if (data[this.props.categories[0]] === category) {\n cat_data.push(data[this.props.measure_col])\n }\n return null\n })\n return [category_col_label].concat(cat_data)\n })\n }\n\n return { columns: columns, category_groups: category_groups, categories: categories }\n // return datacolumns\n }\n\n prepareData () {\n let data\n if (this.props.sort === true || this.props.sort === undefined) {\n const sorted = chartutils.sortIt(this.props.data,\n this.props.measure_cols === undefined ? [\n { key: this.props.categories[0], direction: 'ASC', order: this.state.category_order === undefined ? undefined : this.state.category_order },\n { key: this.props.categories[1], direction: 'ASC', order: this.props.by_category_order === undefined ? undefined : this.props.by_category_order }]\n : [{ key: this.props.categories[0], direction: 'ASC', order: this.props.category_order === undefined ? undefined : this.props.category_order }])\n data = this.transformData(sorted)\n } else {\n data = this.transformData(this.props.data)\n }\n return data\n }\n\n componentDidMount () {\n const chartdiv = measureElement(this.divref.current)\n // console.log(\"Resizing\")\n var height = this.state.height\n var rotated = this.state.rotated\n var datalabels = this.state.datalabels\n var culling = this.state.culling\n var hideYLabels = this.state.hideYLabels\n if (this.props.rotated_small === true) {\n if (chartdiv.width < 500) {\n rotated = true\n if (this.props.height_small !== undefined) {\n height = this.props.height_small\n }\n if (this.props.datalabels_small !== undefined) {\n datalabels = this.props.datalabels_small\n }\n if (this.props.culling_small !== undefined) {\n culling = this.props.culling_small\n }\n if (this.props.hideYLabels_small !== undefined) {\n hideYLabels = this.props.hideYLabels_small\n }\n } else {\n rotated = false\n if (this.props.height_small !== undefined) {\n height = undefined\n }\n if (this.props.datalabels_small !== undefined) {\n datalabels = this.props.datalabels\n }\n if (this.props.culling_small !== undefined) {\n culling = this.props.culling\n }\n if (this.props.hideYLabels_small !== undefined) {\n hideYLabels = this.props.hideYLabels\n }\n }\n }\n this.chartref.current.chart.resize({ height: chartdiv.height, width: chartdiv.width - 20 })\n this.setState({ hideYLabels: hideYLabels, culling: culling, datalabels: datalabels, height: height, rotated: rotated, updateflag: this.state.updateFlag !== true })\n\n // })\n }\n\n checkParameters () {\n\n }\n\n render () {\n const { colors } = this.props\n const preparedData = this.prepareData()\n const chartdata = {\n columns: preparedData.columns,\n type: 'bar',\n order: null\n }\n if (this.props.group_display === true) {\n chartdata.groups = [preparedData.category_groups]\n }\n // console.log(\"Chartdata is\", chartdata,this.props.data)\n const legend = {\n show: this.props.showlegend !== false,\n position: 'bottom'\n }\n if (this.props.legendposition !== undefined) {\n legend.position = this.props.legendposition\n }\n\n const axis = {\n rotated: this.state.rotated === undefined ? undefined : this.state.rotated,\n x: {\n categories: preparedData.categories,\n tick: {\n multiline: (this.props.xmultiline === undefined ? true : this.props.xmultiline),\n culling: this.state.culling === undefined ? undefined : { max: this.state.culling }\n },\n type: 'category'\n },\n y: {\n tick: {\n multiline: true\n },\n padding: {\n // top: 2\n }\n }\n }\n\n if (this.props.xwidth !== undefined) {\n axis.x.tick.width = this.props.xwidth\n }\n\n if (this.state.measure_format === 'number') {\n axis.y.tick.format = chartutils.calcnumber\n } else if (this.state.measure_format === 'percent') {\n axis.y.tick.format = chartutils.calcpercent\n } else if (this.state.measure_format === 'percent-decimal') {\n axis.y.tick.format = chartutils.calcpercent_decimal\n } else if (this.state.measure_format === 'percent-number') {\n axis.y.tick.format = chartutils.calcpercent_number\n } else if (this.state.measure_format === 'dollar-millions') {\n axis.y.tick.format = chartutils.calcdollarMillions\n } else if (this.state.measure_format === 'dollar-billions') {\n axis.y.tick.format = chartutils.calcdollarBillions\n } else if (this.state.measure_format === 'dollar-nocents') {\n axis.y.tick.format = chartutils.calcdollarNoCents\n } else if (this.state.measure_format === 'dollar' && this.state.digits === 0) {\n axis.y.tick.format = chartutils.calcdollarNoCents\n } else if (this.state.measure_format === 'dollar') {\n axis.y.tick.format = chartutils.calcdollar\n } else if (this.state.measure_format === 'numberTrunc') {\n axis.y.tick.format = d3.format('~s')\n } else {\n axis.y.tick.format = chartutils.calcpercent_decimal\n }\n\n // Data Labels have been modified to display totals\n // function showLastLabel()\n // {\n // var shown = chartdata.shown().map(function(item){ return item.id }) // get visible ids: ['data1', 'data2', ...]\n // var last = (shown[shown.length - 1])\n // d3.select('.c3-chart-texts').selectAll('.c3-target').style('display', 'none') // hide all\n // d3.select('.c3-chart-texts').selectAll('.c3-target-' + last).style('display', 'block') // show last\n // }\n\n var totals = []\n // console.log(chartdata.columns)\n\n if (this.props.datalabelformat !== undefined) {\n chartdata.labels = { format: this.props.datalabelformat }\n }\n if (this.state.datelables === false) {\n return\n } else if (this.state.datalabels === true) {\n // chartdata.labels = {format: axis.y.tick.format};\n chartdata.labels = {\n format: function (v, id, i, j) {\n if (isNaN(totals[i])) totals[i] = 0\n // sum only visible\n if (chartdata.data) {\n var shown = chartdata.data.shown().map(function (item) { return item.id })\n if (shown.indexOf(id) !== -1) totals[i] += v\n } else {\n totals[i] += v\n }\n return totals[i].toLocaleString()\n }\n }\n }\n\n if (this.state.hideYLabels === true) {\n axis.x.show = false\n }\n if (this.props.hideYLabels === true) {\n axis.y.show = false\n }\n if (this.props.ymax !== undefined) {\n axis.y.max = this.props.ymax\n }\n if (this.props.ycount !== undefined) {\n axis.y.tick.count = this.props.ycount\n }\n\n if (this.props.width !== undefined) {\n axis.x.width = this.props.xwidth\n // console.log(\"Okay set x height\", axis)\n }\n\n if (this.props.xwidth !== undefined) {\n axis.x.tick.width = this.props.xwidth\n }\n const c3_config = {\n // Prevent totals from adding to data labels on each re-render\n onrendered: function () {\n totals = []\n },\n data: chartdata,\n type: 'bar',\n bar: {\n width: {\n ratio: 0.5 // this makes bar width 50% of length between ticks\n }\n },\n axis: axis,\n legend: legend,\n color: colors,\n size: this.state.height === undefined ? undefined : { height: this.state.height },\n padding: this.props.padding,\n grid: {\n y: {\n show: true\n }\n },\n tooltip: {\n // format: {\n // title: (x, index) => {\n // let dateparts = x.toDateString().split(\" \")\n // return dateparts[2]+dateparts[1]+dateparts[3].substr(2,3);\n // }\n // }\n // contents: function (d, defaultTitleFormat, defaultValueFormat, color) {\n // return \"<font color='red'>\" + d[0].value\n // }\n }\n\n // types: this.props.types\n }\n // console.log(\"C3 Config \",c3_config,\"data\",this.props.data)\n // return <h1 style={{color: \"white\"}}> No Bar Chart Yet -TBD</h1>\n\n return <Box id={'barchart' + Math.random().toString()} ref={this.divref}>\n <Chart\n ref={this.chartref}\n updateflag={this.state.updateFlag.toString()}\n config={c3_config}\n />\n </Box>\n }\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport Chart from 'react-c3-component'\nimport 'c3/c3.css'\nimport '../css/c3.css'\nimport ResponsiveTable from './ResponsiveTable'\n// import { makeStyles } from '@material-ui/core/styles';\nimport chartutils from './chartutils.js'\nimport Box from '@material-ui/core/Box'\n\nimport ButtonGroup from '@material-ui/core/ButtonGroup'\nimport Button from '@material-ui/core/Button'\nconst measureElement = element => {\n const DOMNode = ReactDOM.findDOMNode(element)\n return {\n width: DOMNode.offsetWidth,\n height: DOMNode.offsetHeight\n }\n}\n// const useStyles = makeStyles((theme) => ({\n// toggleContainer: {\n// margin: theme.spacing(2, 0),\n// color: \"white\",\n// textTransform: \"none\"\n// },\n// selectBox: {\n// WebkitAppearance: \"menulist\",\n// MozAppearance: \"menulist\"\n// }\n// }));\n\nconst center = {\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center'\n}\nconst buttonselected = {\n backgroundColor: 'rgb(11, 33, 57)',\n boxShadow: '0px 2px 4px -1px rgba(0,0,0,0.2), 0px 4px 5px 0px rgba(0,0,0,0.14), 0px 1px 10px 0px rgba(0,0,0,0.12)',\n fontWeight: 'bold'\n}\n\n// const classes = useStyles();\n/*\n\n*/\nexport default class DonutChart extends React.Component {\n constructor (props) {\n super(props)\n\n this.divref = React.createRef()\n this.chartref = React.createRef()\n this.state = {\n chartid: 'c3_chart' + (Math.random().toString),\n view: 'chart',\n measure_format: props.measure_format === undefined ? 'number' : props.measure_format\n }\n }\n\n transformData (datain) {\n // Categories are enumerated value of the second category\n const sum_data = chartutils.sumByGroup(datain, [this.props.category], [this.props.measure_col])\n // console.log('Sum data ', sum_data)\n const total = chartutils.totValues(sum_data, this.props.measure_col)\n const table_data = sum_data.map((item) => {\n item.percent = (item[this.props.measure_col] / total * 100).toFixed(1) + '%'\n return item\n })\n // console.log('Table data', table_data)\n const categories = sum_data.map((item) => item[this.props.category])\n const columns = sum_data.map((item) => [item[this.props.category], item[this.props.measure_col]])\n return { columns: columns, categories: categories, table_data: table_data }\n // return datacolumns\n }\n\n prepareData () {\n const data = this.transformData(this.props.data)\n return data\n }\n\n selectChart () {\n this.setState({\n view: 'chart'\n })\n }\n\n selectTable () {\n this.setState({\n view: 'table'\n })\n }\n\n componentDidMount () {\n // console.log(\"Component mounted\",this.chartref.current)\n // window.addEventListener('resize', (event) => {\n\n const chartdiv = measureElement(this.divref.current)\n // console.log(\"Resizing\")\n this.chartref.current.chart.resize({ height: chartdiv.height, width: chartdiv.width - 20 })\n this.setState({ updateflag: this.state.updateFlag !== true })\n\n // })\n }\n\n checkParameters () {\n\n }\n\n render () {\n const { colors } = this.props\n const preparedData = this.prepareData()\n const chartdata = {\n columns: preparedData.columns,\n type: 'donut'\n }\n // console.log(\"Chartdata is\", chartdata,this.props.data)\n const legend = {\n show: this.props.showlegend !== false,\n position: 'bottom'\n }\n if (this.props.legendposition !== undefined) {\n legend.position = this.props.legendposition\n }\n\n const c3_config = {\n data: chartdata,\n type: 'donut',\n legend: legend,\n color: colors,\n size: this.props.height === undefined ? undefined : { height: this.props.height },\n padding: this.props.padding,\n donut: {\n title: this.props.title === undefined ? undefined : this.props.title\n }\n // tooltip: {\n // format: {\n // title: (x, index) => {\n // let dateparts = x.toDateString().split(\" \")\n // return dateparts[2]+dateparts[1]+dateparts[3].substr(2,3);\n // }\n // }\n // }\n\n // types: this.props.types\n }\n // console.log('C3 Config ', c3_config, 'data', this.props.data)\n // return <h1 style={{color: \"white\"}}> No Bar Chart Yet -TBD</h1>\n\n return <Box id={'donutchart' + Math.random().toString()} ref={this.divref}>\n {this.state.view === 'chart' ? <Chart\n ref={this.chartref}\n config={c3_config}\n />\n : <ResponsiveTable\n rows={preparedData.table_data}\n columns={this.props.table.columns}\n sortBy={this.props.table.sortBy} columnOrder={this.props.table.columnOrder}\n />}<br />\n <div style={center}>\n <ButtonGroup style={{ margin: '0 auto' }} variant='contained' color='primary'>\n <Button onClick={this.selectChart.bind(this)} style={this.state.view === 'chart' ? buttonselected : null}>Chart</Button>\n <Button onClick={this.selectTable.bind(this)} style={this.state.view !== 'chart' ? buttonselected : null}>Table</Button>\n </ButtonGroup>\n </div>\n </Box>\n }\n}\n","import React from \"react\";\nimport Papa from 'papaparse';\n\nimport { Typography, Box, Grid, MenuItem, Container, Select } from \"@material-ui/core\";\nimport ToggleButtonGroup from \"@material-ui/lab/ToggleButtonGroup\";\nimport ToggleButton from \"@material-ui/lab/ToggleButton\";\nimport chartutils from \"../../../components/chartutils\";\nimport BarChart from \"../../../components/barChart\";\nimport DonutChart from \"../../../components/donutChart\";\nimport TimeSeriesChart from \"../../../components/timeSeriesChart\";\nimport ResponsiveTable from \"../../../components/ResponsiveTable\";\nimport CacheContext from \"../../../cacheBuster\";\n\nconst Demographics = (props) => {\n const [epicurve_by_race_sex, setEpicurve_by_race_sex] = React.useState([]);\n \n const currdate = React.useContext(CacheContext);\n React.useEffect(() => {\n fetch('./data/epicurve_by_race_sex.csv?tstamp='+currdate)\n .then((resp) => resp.text())\n .then(csv => Papa.parse(csv, { header:true, skipEmptyLines:true, dynamicTyping:true }))\n .then((json) => {\n setEpicurve_by_race_sex(json.data);\n });\n },[currdate]);\n \n const race_order = props.race_order;\n const age_order = props.age_order;\n const classes = props.classes;\n const demographics_info = props.demographics_info;\n const epicurve_by_age = props.epicurve_by_age;\n\n const [demoCaseCategory, setDemoCaseCategory] = React.useState(\"Age Group\");\n const [demographicBarView, setDemographicBarView] = React.useState(0);\n const [epicurveAgeView, setEpicurveAgeView] = React.useState(0);\n\n return (\n !!epicurve_by_race_sex.length? (\n <Box>\n <Typography\n variant=\"h1\"\n component=\"h4\"\n gutterBottom\n style={{ horizontalAlign: \"center\", color: \"white\" }}\n >\n COVID-19 Case Demographics\n </Typography>\n <Box display=\"flex\" flexDirection=\"column\" justifyContent=\"center\">\n <h2\n style={{\n color: \"white\",\n textAlign: \"center\",\n fontWeight: \"normal\",\n }}\n >\n Confirmed COVID-19 Cases, { /* Hospitalizations, */ } Deaths by{\" \"}\n {demoCaseCategory}\n </h2>\n <Box mx=\"auto\" whiteSpace=\"nowrap\" overflow=\"hidden\">\n <ToggleButtonGroup\n value={demoCaseCategory}\n onChange={(event, value) => setDemoCaseCategory(value)}\n exclusive\n className={classes.toggleContainer}\n >\n <ToggleButton value={\"Age Group\"}>Age Group</ToggleButton>\n <ToggleButton value={\"Race\"}>Race</ToggleButton>\n <ToggleButton value={\"Ethnicity\"}>Ethnicity</ToggleButton>\n </ToggleButtonGroup>\n </Box>\n {(() => {\n switch (demoCaseCategory) {\n case \"Race\":\n return (\n <BarChart\n data={chartutils.sortIt(\n chartutils.sumByGroup(\n demographics_info,\n [\"race_other\"],\n [/* \"hospitalization\", */ \"positives\", \"deaths\"]\n ),\n [\n {\n key: \"race_other\",\n direction: \"ASC\",\n order: race_order,\n },\n ]\n )}\n categories={[\"race_other\"]}\n category_order={race_order}\n sort={false}\n measure_cols={[\"positives\", /* \"hospitalization\", */ \"deaths\"]}\n measure_col_labels={[\n \"Confirmed Cases\",\n /* \"Hospitalizations\", */\n \"Deaths\",\n ]}\n measure_type=\"number\"\n measure_format=\"numberTrunc\"\n group_display\n // datalabels ={true}\n padding={{ bottom: 50 }}\n height={500}\n datalabels_small={false}\n hideXLabels_small\n colors={{ pattern: [\"#33a3ff\", /* \"#ffcc32\", */ \"#dd5757\"] }}\n rotated\n order={null}\n />\n );\n case \"Ethnicity\":\n return (\n <BarChart\n data={chartutils.sortIt(\n chartutils.sumByGroup(\n demographics_info,\n [\"ethnicity\"],\n [/* \"hospitalization\", */ \"positives\", \"deaths\"]\n ),\n [\n {\n key: \"ethnicity\",\n direction: \"ASC\",\n },\n ]\n )}\n categories={[\"ethnicity\"]}\n // category_order={age_order}\n sort={false}\n measure_cols={[\"positives\", /* \"hospitalization\", */ \"deaths\"]}\n measure_col_labels={[\n \"Confirmed Cases\",\n /* \"Hospitalizations\", */\n \"Deaths\",\n ]}\n measure_type=\"number\"\n measure_format=\"numberTrunc\"\n group_display\n // datalabels ={true}\n padding={{ bottom: 50 }}\n height={500}\n datalabels_small={false}\n hideXLabels_small\n colors={{ pattern: [\"#33a3ff\", /* \"#ffcc32\", */ \"#dd5757\"] }}\n rotated\n order={null}\n />\n );\n default:\n return (\n <BarChart\n data={chartutils.sortIt(\n chartutils.sumMeasures(\n demographics_info,\n [\"age_group\"],\n [/* \"hospitalization\", */ \"positives\", \"deaths\"]\n ),\n [\n {\n key: \"age_group\",\n direction: \"ASC\",\n order: age_order,\n },\n ]\n )}\n categories={[\"age_group\"]}\n category_order={age_order}\n sort={false}\n measure_cols={[\"positives\", /* \"hospitalization\", */ \"deaths\"]}\n measure_col_labels={[\n \"Confirmed Cases\",\n /* \"Hospitalizations\", */\n \"Deaths\",\n ]}\n measure_type=\"number\"\n measure_format=\"numberTrunc\"\n group_display\n // datalabels ={true}\n padding={{ bottom: 50 }}\n height={500}\n datalabels_small={false}\n hideXLabels_small\n colors={{ pattern: [\"#33a3ff\", /* \"#ffcc32\", */ \"#dd5757\"] }}\n rotated\n order={null}\n />\n );\n }\n })()}\n </Box>\n <hr className={classes.hr} />\n\n <Grid item xs={12}>\n <Box display=\"flex\" flexDirection=\"column\" justifyContent=\"center\">\n <Typography\n style={{\n color: \"white\",\n textAlign: \"center\",\n }}\n >\n Cases by Age Over Time (7 Day Moving Average)\n </Typography>\n <Box mx=\"auto\" whiteSpace=\"nowrap\" overflow=\"hidden\">\n <ToggleButtonGroup\n value={epicurveAgeView}\n onChange={(event, value) => setEpicurveAgeView(value)}\n exclusive\n className={classes.toggleContainer}\n >\n <ToggleButton value={0}>All Ages</ToggleButton>\n <ToggleButton value={1}>Children Only</ToggleButton>\n </ToggleButtonGroup>\n </Box>\n {(() => {\n switch (epicurveAgeView) {\n case 0:\n return (\n <TimeSeriesChart\n data={chartutils.sumByGroup(\n epicurve_by_age,\n [\"report_date\", \"age_group_major\"],\n [\"moving_avg\"]\n )}\n date_col=\"report_date\"\n measure_col=\"moving_avg\"\n categories={[\"age_group_major\"]}\n sort={false}\n colors={{\n pattern: [\n \"#33a3ff\",\n \"#ffcc32\",\n \"#dd5757\",\n \"#9471ff\",\n \"#15b57b\",\n ],\n }}\n />\n );\n default:\n return (\n <TimeSeriesChart\n data={chartutils.sortIt(\n epicurve_by_age.filter(\n (item) => item.age_group_major === \"0-17\"\n ),\n [\n {\n key: \"age_group\",\n direction: \"ASC\",\n order: age_order,\n },\n ]\n )}\n date_col=\"report_date\"\n measure_col=\"moving_avg\"\n categories={[\"age_group\"]}\n sort={false}\n colors={{\n pattern: [\n \"#33a3ff\",\n \"#ffcc32\",\n \"#dd5757\",\n \"#9471ff\",\n \"#15b57b\",\n ],\n }}\n />\n );\n }\n })()}\n </Box>\n </Grid>\n\n <hr className={classes.hr} />\n\n <Grid item xs={12}>\n <Typography\n style={{\n color: \"white\",\n textAlign: \"center\",\n }}\n >\n Confirmed Deaths by Age and Race\n </Typography>\n <BarChart\n data={chartutils.sortIt(\n chartutils.fillMissing(\n chartutils.sumByGroup(\n demographics_info,\n [\"race_other\", \"age_group\"],\n [\"deaths\"]\n ),\n [\"race_other\", \"age_group\"],\n \"deaths\"\n ),\n [\n {\n key: \"race_other\",\n direction: \"ASC\",\n order: race_order,\n },\n {\n key: \"age_group\",\n direction: \"ASC\",\n order: age_order,\n },\n ]\n )}\n categories={[\"race_other\", \"age_group\"]}\n measure_col=\"deaths\"\n measure_col_labels={[\"Confirmed Deaths\"]}\n measure_type=\"number\"\n sort={false}\n group_display\n height={650}\n padding={{ bottom: 75, left: 150 }}\n datalabels\n // rotated\n // rotated_small={true}\n colors={{\n pattern: [\"#33a3ff\", \"#ffcc32\", \"#dd5757\", \"#9471ff\", \"#15b57b\"],\n }}\n order={null}\n />\n </Grid>\n\n <hr className={classes.hr} />\n\n <Grid\n id=\"KPI1\"\n container\n direction=\"row\"\n item\n justifyContent=\"space-around\"\n xs={12}\n sm={12}\n md={12}\n lg={12}\n className={classes.mediaFlow}\n style={{ paddingBottom: 375 }}\n >\n <Grid item xs={12} sm={12} md={8} lg={8}>\n {/* Component for user to choose demographic view */}\n <Box display={{ xs: \"none\", sm: \"block\" }}>\n <ToggleButtonGroup\n value={demographicBarView}\n onChange={(event, value) => setDemographicBarView(value)}\n exclusive\n style={{\n fontSize: \"1.2em\",\n borderColor: \"white\",\n color: \"white\",\n backgroundColor: \"#103052\",\n }}\n >\n <ToggleButton value={0}>Race and Sex</ToggleButton>\n {/* <ToggleButton value={1}>Race and Ethnicity</ToggleButton> */}\n {/* <ToggleButton value={2}>Ethnicity and Sex</ToggleButton> */}\n </ToggleButtonGroup>\n </Box>\n <Box display={{ xs: \"block\", sm: \"none\" }}>\n <Select\n id=\"selectbox\"\n className={classes.selectBox}\n value={demographicBarView}\n onChange={(event, child) =>\n setDemographicBarView(event.target.value)\n }\n >\n <MenuItem key=\"0\" value={0}>\n Race and Sex\n </MenuItem>\n {/* <MenuItem key=\"1\" value={1}>\n Race and Ethnicity\n </MenuItem>\n <MenuItem key=\"2\" value={2}>\n Ethnicity and Sex\n </MenuItem> */}\n </Select>\n </Box>\n\n {/* Render Barchart based on user's selection. A self-calling function handles the switching logic */}\n <div>\n {(() => {\n switch (demographicBarView) {\n case 0:\n return (\n <>\n <Typography\n style={{\n color: \"white\",\n textAlign: \"center\",\n }}\n >\n Confirmed Cases by Race and Sex\n </Typography>\n <BarChart\n data={chartutils.sortIt(\n chartutils.fillMissing(\n chartutils.sumByGroup(\n demographics_info,\n [\"race_other\", \"sex\"],\n [\"positives\"]\n ),\n [\"race_other\", \"sex\"],\n \"positives\"\n ),\n [\n {\n key: \"race_other\",\n direction: \"ASC\",\n order: race_order,\n },\n {\n key: \"sex\",\n direction: \"ASC\",\n order: [\"Female\", \"Male\", \"Unknown\"],\n },\n ]\n )}\n categories={[\"sex\", \"race_other\"]}\n measure_col=\"positives\"\n measure_col_labels={[\"Confirmed Cases\"]}\n measure_type=\"number\"\n measure_format=\"numberTrunc\"\n sort={false}\n group_display\n height={650}\n padding={{ bottom: 75, left: 150 }}\n datalabels\n rotated\n // rotated_small={true}\n colors={{\n pattern: [\"#dd5757\", \"#33a3ff\", \"#9471ff\"],\n }}\n order={null}\n />\n </>\n );\n case 1:\n return (\n <>\n <Typography\n style={{\n color: \"white\",\n textAlign: \"center\",\n }}\n >\n Confirmed Cases by Race and Ethnicity\n </Typography>\n <BarChart\n data={chartutils.sortIt(\n chartutils.sumByGroup(\n epicurve_by_race_sex,\n [\"race\", \"ethnicity\"],\n [\"positives\"]\n ),\n [\n {\n key: \"race\",\n direction: \"ASC\",\n order: race_order,\n },\n { key: \"ethnicity\", direction: \"ASC\" },\n ]\n )}\n categories={[\"ethnicity\", \"race\"]}\n measure_col=\"positives\"\n measure_col_labels={[\"Confirmed Cases\"]}\n measure_type=\"number\"\n sort={false}\n group_display\n height={650}\n padding={{ bottom: 75, left: 150 }}\n datalabels\n rotated\n colors={{\n pattern: [\"#dd5757\", \"#33a3ff\", \"#9471ff\"],\n }}\n />\n </>\n );\n case 2:\n return (\n <>\n <Typography\n style={{\n color: \"white\",\n textAlign: \"center\",\n }}\n >\n Confirmed Cases by Ethnicity and Sex\n </Typography>\n <BarChart\n data={chartutils.sumMeasures(\n chartutils.sortIt(epicurve_by_race_sex, [\n { key: \"ethnicity\", direction: \"ASC\" },\n { key: \"sex\", direction: \"ASC\" },\n ]),\n [\"sex\", \"ethnicity\"],\n [\"positives\"]\n )}\n categories={[\"sex\", \"ethnicity\"]}\n measure_col=\"positives\"\n measure_col_labels={[\"Confirmed Cases\"]}\n measure_type=\"number\"\n sort={false}\n // group_display= {true}\n height={650}\n padding={{ bottom: 75 }}\n datalabels={false}\n rotated_small\n colors={{\n pattern: [\"#dd5757\", \"#33a3ff\", \"#9471ff\"],\n }}\n />\n </>\n );\n default:\n return <>default</>;\n }\n })()}\n </div>\n </Grid>\n\n <Grid item xs={12} sm={8} md={4} lg={4}>\n <Typography\n style={{\n color: \"white\",\n textAlign: \"center\",\n fontWeight: \"normal\",\n }}\n >\n Confirmed COVID-19 Cases by Sex\n </Typography>\n <DonutChart\n data={chartutils.sumMeasures(\n chartutils.sortIt(demographics_info, [\n { key: \"sex\", direction: \"ASC\" },\n ]),\n [\"sex\"],\n [\"positives\"]\n )}\n category=\"sex\"\n measure_col=\"positives\"\n // measure_col_labels ={[\"Confirmed Cases\" ]}\n measure_type=\"number\"\n sort={false}\n title=\"Confirmed Cases\"\n table={{\n columns: [\n {\n id: \"sex\",\n label: \"Sex\",\n minWidth: 15,\n align: \"left\",\n },\n {\n id: \"positives\",\n label: \"Confirmed Cases\",\n minWidth: 12,\n align: \"right\",\n },\n {\n id: \"percent\",\n label: \"Percent\",\n minWidth: 12,\n align: \"right\",\n },\n ],\n sortBy: \"sex\",\n columnOrder: \"asc\",\n }}\n // datalabels = {false}\n // height = {500}\n // padding = {{bottom: 75, top: 150 }}\n datalabels={false}\n // backgroundColor = \"#d9d9d9\"\n rotated_small\n // colors = {{pattern: [ '#cc3300', '#000066', 'green', 'gray', '#ff9933', '#6667a3', '#654321', 'black', 'purple', 'tan','#b76e79','brown','#174800']}}\n // colors= {{pattern: ['#ff7f0e','#e9e9e9','#35a5ff','#8782DD','#f9f9f9','#98FB98','#ad7100','#bedefe']}}\n // colors = {{pattern: [ '#cc3300', '#000066', 'green', 'gray', '#ff9933', '#6667a3', '#654321', 'black', 'purple', 'tan','#b76e79','brown','#174800']}}\n colors={{ pattern: [\"#dd5757\", \"#33a3ff\", \"#9471ff\"] }}\n />\n </Grid>\n <hr className={classes.hr} />\n <h2\n style={{\n color: \"white\",\n textAlign: \"center\",\n fontWeight: \"normal\",\n }}\n >\n Confirmed COVID-19 Cases by Race and Sex\n </h2>\n <br />\n <Grid item xs={12}>\n <Container maxWidth=\"md\">\n <ResponsiveTable\n rows={chartutils\n .pivotWider(\n chartutils.sumByGroup(\n demographics_info.filter(\n (d) => d.county_name === \"Georgia\"\n ),\n [\"race\", \"sex\"],\n [\"positives\"]\n ),\n \"sex\",\n \"positives\",\n \"race\"\n )\n .map((row) => {\n return {\n race: row.race,\n Female: row.Female,\n Male: row.Male,\n Total:\n row.Female +\n row.Male +\n (row.Unknown !== undefined ? row.Unknown : 0),\n };\n })}\n columns={[\n {\n id: \"race\",\n label: \"Race\",\n minWidth: 15,\n align: \"left\",\n },\n { id: \"Total\", label: \"Total Cases\", align: \"right\" },\n {\n id: \"Female\",\n label: \"Female Cases\",\n minWidth: 12,\n align: \"right\",\n },\n {\n id: \"Male\",\n label: \"Male Cases\",\n minWidth: 12,\n align: \"right\",\n },\n ]}\n sortBy=\"Total\"\n columnOrder=\"desc\"\n />\n </Container>\n </Grid>\n </Grid>\n </Box>)\n : null\n );\n};\n\nexport default Demographics;\n","import Papa from 'papaparse';\n\nimport React, { Suspense } from \"react\";\nimport LoadingSpinner from \"../../components/loadingSpinner\";\nimport Demographics from \"./demographics\";\nimport CacheContext from \"../../cacheBuster\";\n\nconst ageMap = new Map([\n [\"<1\", \"0-17\"],\n [\"01-04\", \"0-17\"],\n [\"05-09\", \"0-17\"],\n [\"10-17\", \"0-17\"],\n [\"18-29\", \"18-29\"],\n [\"30-39\", \"30-59\"],\n [\"40-49\", \"30-59\"],\n [\"50-59\", \"30-59\"],\n [\"60-69\", \"60 & Older\"],\n [\"70-79\", \"60 & Older\"],\n [\"80 & Older\", \"60 & Older\"],\n [\"Unknown\", \"Unknown\"],\n]);\n\nconst raceMap = new Map([\n [\"African-American/ Black\", \"African-American/ Black\"],\n [\"White\", \"White\"],\n [\"Asian\", \"Asian\"],\n [\"American Indian/ Alaska Native\", \"Other\"],\n [\"Native Hawaiian/ Pacific Islander\", \"Other\"],\n [\"Other\", \"Other\"],\n [\"Unknown\", \"Unknown\"],\n]);\n\nconst race_order = [\n \"African-American/ Black\",\n \"White\",\n \"Asian\",\n \"American Indian/ Alaska Native\",\n \"Native Hawaiian/ Pacific Islander\",\n \"Other\",\n \"Unknown\",\n \"Missing\",\n];\nconst age_order = [\n \"<1\",\n \"01-04\",\n \"05-09\",\n \"10-17\",\n \"18-29\",\n \"30-39\",\n \"40-49\",\n \"50-59\",\n \"60-69\",\n \"70-79\",\n \"80 & Older\",\n \"Unknown\",\n];\n\nlet totals = 0;\n\nconst Tabset2 = (props) => {\n const [demographics_info, setDemographics_info] = React.useState([]);\n const [epicurve_by_age, setEpicurve_by_age] = React.useState([]);\n \n const currdate = React.useContext(CacheContext);\n React.useEffect(() => {\n fetch('./data/demographics.csv?tstamp='+currdate)\n .then((resp) => resp.text())\n .then(csv => Papa.parse(csv, { header:true, skipEmptyLines:true, dynamicTyping:true }))\n .then((json) => {\n json.data.forEach((item) => {\n item.age_group_major = ageMap.get(item.age_group);\n item.race_other = raceMap.get(item.race);\n });\n \n json.data.forEach((item) => {\n if (item.sex === \"Female\" && item.race === \"White\") {\n totals = totals + item.count;\n }\n });\n \n setDemographics_info(json.data);\n });\n fetch('./data/epicurve_age_group_rpt_date.csv?tstamp='+currdate)\n .then((resp) => resp.text())\n .then(csv => Papa.parse(csv, { header:true, skipEmptyLines:true, dynamicTyping:true }))\n .then((json) => {\n json.data.forEach((item) => {\n item.age_group_major = ageMap.get(item.age_group);\n });\n \n setEpicurve_by_age(json.data);\n });\n },[currdate]);\n \n const classes = props.classes;\n\n return (\n !!demographics_info.length && !!epicurve_by_age.length? (\n <Suspense fallback={<LoadingSpinner />}>\n <Demographics\n classes={classes}\n race_order={race_order}\n age_order={age_order}\n demographics_info={demographics_info}\n epicurve_by_age={epicurve_by_age}\n />\n </Suspense>)\n : null\n );\n};\n\nexport default Tabset2;\n"],"sourceRoot":""}