//resize for mobile // show all stats on screen // title left align? //// CREATE //// function createProvinceTotals(parent, geoData, region) { // Select parent element (div defined in index.html) let container = d3.select(parent); // Add div for region name let regionDiv = d3.select('.totals-region') regionDiv.text(region) //Add div for total cases (one container, one div for title, one for the number) //Repeat for active cases, recovered and deaths let statsDiv = container.append('div').attr('class', 'stats-div') let data = geoData.data.cases; statsDiv.append('div') .attr('class', 'totals-cases-number totals-number') //.style('color', '#c1392b') .style('color', '#333') .text(data.length.toLocaleString()) statsDiv.append('div') .attr('class', 'totals-label') .text('Total cases') statsDiv.append('div') .attr('class', 'active-cases-number totals-number') //.style('color', '#16a086') .style('color', '#999') .text(data.filter(person => person.Outcome1 === 'Not Resolved').length.toLocaleString()) statsDiv.append('div') .attr('class', 'totals-label') .text('Active') statsDiv.append('div') .attr('class', 'recovered-cases-number totals-number') //.style('color', '#305366') .style('color', '#999') .text(data.filter(person => person.Outcome1 === 'Resolved').length.toLocaleString()) statsDiv.append('div') .attr('class', 'totals-label') .text('Recovered') statsDiv.append('div') .attr('class', 'deaths-cases-number totals-number') //.style('color', '#8f44ab') .style('color', '#999') .text(data.filter(person => person.Outcome1 === 'Fatal').length.toLocaleString()) statsDiv.append('div') .attr('class', 'totals-label') .text('Deaths') let genderArray = sortGender(data) let genderBar = container.append('div').attr('class', 'gender-bar-div') let male = genderArray.find(obj => obj.status === "MALE").cases.length; let female = genderArray.find(obj => obj.status === "FEMALE").cases.length; let malePct = 100*male/(male+female); let femalePct = 100*female/(male+female); genderBar.append('div').attr('class', 'gender-female gender-bar') .style('width', `${femalePct}%`) genderBar.append('div').attr('class', 'gender-male gender-bar') .style('width', `${malePct}%`) let genderText = container.append('div').attr('class', 'gender-text-div') genderText.append('div').attr('class', 'gender-female-text') .html(`${Math.round(femalePct)}% female`) genderText.append('div').attr('class', 'gender-male-text') .html(`${Math.round(malePct)}% male`) } //// UPDATE //// function updateProvinceTotals(parent, geoData, region) { let container = d3.select(parent); let data = geoData.data.cases; // In the update function, select the divs instead of creating them, then update the text let regionDiv = d3.select('.totals-region') regionDiv.text(region) let casesDiv = container.select('.totals-cases-number') // This numberTween function makes the numbers animate between the old and new number numberTween(casesDiv, data.length) let activeDiv = container.select('.active-cases-number') numberTween(activeDiv, data.filter(person => person.Outcome1 === 'Not Resolved').length) let recoveredDiv = container.select('.recovered-cases-number') numberTween(recoveredDiv, data.filter(person => person.Outcome1 === 'Resolved').length) let deathsDiv = container.select('.deaths-cases-number') numberTween(deathsDiv, data.filter(person => person.Outcome1 === 'Fatal').length) let genderArray = sortGender(data) let genderBar = container.select('.gender-bar-div') let male = genderArray.find(obj => obj.status === "MALE").cases.length; let female = genderArray.find(obj => obj.status === "FEMALE").cases.length; let malePct = 100*male/(male+female); let femalePct = 100*female/(male+female); genderBar.select('.gender-male') .style('width', `${malePct}%`) genderBar.select('.gender-female') .style('width', `${femalePct}%`) let genderText = container.select('.gender-text-div') numberTween(genderText.select('.female-text-number'), femalePct) numberTween(genderText.select('.male-text-number') , malePct) } //// RESIZE //// function resizeProvinceTotals(parent, data) { // Will try to resize with CSS only } function sortGender(caseData) { genderArray = []; caseData.forEach(person => { let genderObj = genderArray.find(obj => obj.status === person['Client_Gender']); if (genderObj) { genderObj.cases.push(person) } else { let newGender = { status: person['Client_Gender'], cases: [] } newGender.cases.push(person); genderArray.push(newGender) } }) return genderArray } // Transition animation function function numberTween(selection, targetNumber) { selection.transition().duration(1000) .tween("text", function(d) { let node = this; let i = d3.interpolate(strToNum(node.textContent), targetNumber); return function(t) { node.textContent = Math.round(i(t)).toLocaleString(); }; }) } function strToNum(string) { return Number(string.split(',').join('')) }