diff --git a/app/choropleth-config/index.js b/app/choropleth-config/index.js index 212c150a..acba5a93 100644 --- a/app/choropleth-config/index.js +++ b/app/choropleth-config/index.js @@ -17,24 +17,6 @@ const choroplethConfigs = [ '#e54444', ], }, - { - group: 'Demographic (ACS)', - id: 'pop65pl1', - label: '65 Years and Over', - tooltip: 'Population 65 years and over', - legendTitle: 'Population 65 years and over', - stops: [ - '#f2f2a2', - 4000, - '#efc68a', - 8000, - '#e99963', - 12000, - '#e56d44', - 15000, - '#e54444', - ], - }, { group: 'Social (ACS)', id: 'ea_bchdh', @@ -84,7 +66,7 @@ const choroplethConfigs = [ legendTitle: 'Percent foreign-born population', stops: [ '#f2f2a2', - 25, + 20, '#efc68a', 35, '#e99963', @@ -139,13 +121,13 @@ const choroplethConfigs = [ label: 'Below Poverty (percent)', tooltip: 'Percent of population whose income is below the poverty level', legendTitle: 'Percent of population below poverty level', - stops: ['#f2f2a2', 12, '#efc68a', 20, '#e56d44', 40, '#e54444'], + stops: ['#f2f2a2', 15, '#efc68a', 30, '#e56d44', 40, '#e54444'], }, { group: 'Housing (ACS)', id: 'mdgr', label: 'Median Gross Rent', - tooltip: 'Median gross rent (in 2020 inflation-adjusted dollars)', + tooltip: 'Median gross rent (in 2022 inflation-adjusted dollars)', legendTitle: 'Median Gross Rent', stops: ['#f2f2a2', 1500, '#efc68a', 2000, '#e56d44', 2500, '#e54444'], }, @@ -188,6 +170,24 @@ const choroplethConfigs = [ '#e54444', ], }, + { + group: 'Census', + id: 'pop65pl', + label: '65 Years and Over', + tooltip: 'Population 65 years and over', + legendTitle: 'Population 65 years and over', + stops: [ + '#f2f2a2', + 4000, + '#efc68a', + 6000, + '#e99963', + 8000, + '#e56d44', + 10000, + '#e54444', + ], + }, { group: 'Census', id: 'wnh', @@ -645,7 +645,6 @@ const MINIMUM_RACIAL_COUNT = 5000; // For all other variables, or for racial group percent change when the count is above the minimum, // fill color is simply determined by the "steps" array const buildPaintFill = (id, minimum, stops) => { - const racialPercentChangeIds = ['wnh_pc', 'bnh_pc', 'anh_pc', 'hsp1_pc']; return racialPercentChangeIds.includes(id) diff --git a/app/components/explorer/source-select-dropdown.js b/app/components/explorer/source-select-dropdown.js index 70513273..7866c04e 100644 --- a/app/components/explorer/source-select-dropdown.js +++ b/app/components/explorer/source-select-dropdown.js @@ -57,7 +57,7 @@ export default class SourceSelectDropdownComponent extends Component { } get showACS() { - if(['districts', 'blocks', 'ccds'].includes(this.args.geotype)) { + if(['districts', 'blocks'].includes(this.args.geotype)) { return false; } return true; diff --git a/app/components/map-utility-box.js b/app/components/map-utility-box.js index 6d90da2d..a34a5daa 100644 --- a/app/components/map-utility-box.js +++ b/app/components/map-utility-box.js @@ -146,8 +146,8 @@ export default Component.extend({ }) } - // Reset the source for geotypes that do not have ACS data - if ((['ccds', 'districts'].includes(type)) && (['acs-current', 'acs-previous', 'acs-change'].includes(queryParams['source']))) { + // Reset the source for geotypes that do not have ACS data. + if ((['districts'].includes(type)) && (['acs-current', 'acs-previous', 'acs-change'].includes(queryParams['source']))) { queryParams['source'] = 'decennial-current'; } diff --git a/app/controllers/explorer.js b/app/controllers/explorer.js index 923c70b0..8d76e331 100644 --- a/app/controllers/explorer.js +++ b/app/controllers/explorer.js @@ -22,16 +22,18 @@ export default class ExplorerController extends Controller { 'acsTopics', 'compareTo', 'showReliability', - 'showCharts' + 'showCharts', ]; @tracked showCharts = true; @tracked sourceId = 'decennial-current'; - @tracked censusTopics = 'populationSexAgeDensity,mutuallyExclusiveRaceHispanicOrigin,relationHeadHousehold,householdType,housingOccupancy,housingTenure,householdSize'; + @tracked censusTopics = + 'populationSexAgeDensity,mutuallyExclusiveRaceHispanicOrigin,detailedRaceAndEthnicity,relationHeadHousehold,householdType,housingOccupancy,housingTenure,householdSize'; - @tracked acsTopics = 'demo-sexAndAge,demo-mutuallyExclusiveRaceHispanicOrigin,demo-hispanicSubgroup,demo-asianSubgroup'; + @tracked acsTopics = + 'demo-sexAndAge,demo-mutuallyExclusiveRaceHispanicOrigin,demo-hispanicSubgroup,demo-asianSubgroup'; @tracked showReliability = false; @@ -40,10 +42,10 @@ export default class ExplorerController extends Controller { // The comparison geography ID. // Must match ID of one option in comparisonGeoOptions. // Default "0" maps to NYC. - @tracked compareTo = "0"; + @tracked compareTo = '0'; pauseToRerender(time) { - return new Promise(resolve => setTimeout(resolve, time)); + return new Promise((resolve) => setTimeout(resolve, time)); } toggleSourceInList(sourceId) { @@ -58,51 +60,51 @@ export default class ExplorerController extends Controller { return { ...source, selected: false, - } + }; }); } toggleChildren = (children, selectedValue) => { - return children.map(child => { + return children.map((child) => { return { ...child, selected: selectedValue, children: this.toggleChildren(child.children, selectedValue), - } + }; }); - } + }; toggleTopicInList = (topics, itemId) => { return topics.map((topic) => { if (topic.id === itemId) { return { ...topic, - selected: "selected", - children: this.toggleChildren(topic.children, "selected"), + selected: 'selected', + children: this.toggleChildren(topic.children, 'selected'), }; } if (topic.children && topic.children.length > 0) { const newChildren = this.toggleTopicInList(topic.children, itemId); - let newSelectedValue = "indeterminate"; + let newSelectedValue = 'indeterminate'; - if (newChildren.every(child => child.selected === "selected")) { - newSelectedValue = "selected"; + if (newChildren.every((child) => child.selected === 'selected')) { + newSelectedValue = 'selected'; } - if (newChildren.every(child => child.selected === "unselected")) { - newSelectedValue = "unselected"; + if (newChildren.every((child) => child.selected === 'unselected')) { + newSelectedValue = 'unselected'; } return { ...topic, selected: newSelectedValue, - children: newChildren - } + children: newChildren, + }; } return topic; }); - } + }; get comparisonGeo() { if (this.model.comparisonGeoOptions) { @@ -121,15 +123,15 @@ export default class ExplorerController extends Controller { } get source() { - return this.sources.find(source => source.selected); + return this.sources.find((source) => source.selected); } set source(newSource) { const { id } = newSource; - sessionStorage.setItem('source', id) + sessionStorage.setItem('source', id); - this.transitionToRoute('explorer', { queryParams: { source: id }}); + this.transitionToRoute('explorer', { queryParams: { source: id } }); } // returns either 'current', 'previous' or 'change' @@ -142,15 +144,18 @@ export default class ExplorerController extends Controller { } get topicsIdList() { - const rawTopicsList = this.source.type === 'census' ? this.censusTopics : this.acsTopics; + const rawTopicsList = + this.source.type === 'census' ? this.censusTopics : this.acsTopics; - if (rawTopicsList === 'all'){ + if (rawTopicsList === 'all') { if (this.source.type === 'census') { - return censusTopicsDefault.map(topic => topic.id); + return censusTopicsDefault.map((topic) => topic.id); } return acsTopicsDefault.reduce((topicsIdList, curTopic) => { - return topicsIdList.concat(curTopic.children.map(subtopic => subtopic.id)); + return topicsIdList.concat( + curTopic.children.map((subtopic) => subtopic.id) + ); }, []); } else if (rawTopicsList === 'none') { return []; @@ -166,7 +171,7 @@ export default class ExplorerController extends Controller { return this.toggleTopicInList(topicsIdList, curTopicId); }, censusTopicsDefault); } - + return this.topicsIdList.reduce((topicsIdList, curTopicId) => { return this.toggleTopicInList(topicsIdList, curTopicId); }, acsTopicsDefault); @@ -178,23 +183,23 @@ export default class ExplorerController extends Controller { set topics(newTopics) { const qpKey = this.source.type === 'census' ? 'censusTopics' : 'acsTopics'; - sessionStorage.setItem([qpKey], newTopics) + sessionStorage.setItem([qpKey], newTopics); - this.transitionToRoute('explorer', { queryParams: { [qpKey]: newTopics }}); + this.transitionToRoute('explorer', { queryParams: { [qpKey]: newTopics } }); } get isAllTopicsSelected() { const { topics } = this; - if (topics.every(topic => topic.selected === "selected")) { - return "selected"; + if (topics.every((topic) => topic.selected === 'selected')) { + return 'selected'; } - if (topics.every(topic => topic.selected === "unselected")) { - return "unselected"; + if (topics.every((topic) => topic.selected === 'unselected')) { + return 'unselected'; } - return "indeterminate"; + return 'indeterminate'; } get selectedCount() { @@ -204,21 +209,25 @@ export default class ExplorerController extends Controller { get sortedLabels() { var { features } = this.model.selection; if (['districts', 'boroughs'].includes(this.model.selection.type)) { - for(var i = 0; i < features.length; i++) { - features[i].properties.borocode = features[i].properties.geoid.toString().slice(0,1); + for (var i = 0; i < features.length; i++) { + features[i].properties.borocode = features[i].properties.geoid + .toString() + .slice(0, 1); if (this.model.selection.type === 'districts') { features[i].properties.district = features[i].properties.geoid % 100; } } } else if (this.model.selection.type === 'ccds') { - return features.map((ccd) => ccd.properties.geolabel).sort((a, b) => a - b); + return features + .map((ccd) => ccd.properties.geolabel) + .sort((a, b) => a - b); } - - const bronx = features.filter(d => d.properties.borocode === '2'); - const brooklyn = features.filter(d => d.properties.borocode === '3'); - const manhattan = features.filter(d => d.properties.borocode === '1'); - const queens = features.filter(d => d.properties.borocode === '4'); - const statenisland = features.filter(d => d.properties.borocode === '5'); + + const bronx = features.filter((d) => d.properties.borocode === '2'); + const brooklyn = features.filter((d) => d.properties.borocode === '3'); + const manhattan = features.filter((d) => d.properties.borocode === '1'); + const queens = features.filter((d) => d.properties.borocode === '4'); + const statenisland = features.filter((d) => d.properties.borocode === '5'); return [ { @@ -241,7 +250,7 @@ export default class ExplorerController extends Controller { label: 'Staten Island', features: statenisland, }, - ].filter(d => d.features.length > 0); + ].filter((d) => d.features.length > 0); } get agePopDist() { @@ -286,8 +295,8 @@ export default class ExplorerController extends Controller { this.source = newSource; window.dataLayer = window.dataLayer || []; window.dataLayer.push({ - 'event' : 'select_data_source', - 'select_data_source' : newSource.label, + event: 'select_data_source', + select_data_source: newSource.label, }); this.metrics.trackEvent('GoogleAnalytics', { eventCategory: 'Data Source', @@ -301,18 +310,22 @@ export default class ExplorerController extends Controller { await this.pauseToRerender(1); if (topic.type === 'subtopic') { - if (this.topicsIdList.includes(topic.id)) { - this.topics = this.topicsIdList.filter(topicId => topicId !== topic.id); - } else { - this.topics = this.topicsIdList.concat([topic.id]); - } + if (this.topicsIdList.includes(topic.id)) { + this.topics = this.topicsIdList.filter( + (topicId) => topicId !== topic.id + ); + } else { + this.topics = this.topicsIdList.concat([topic.id]); + } } if (topic.type === 'topic') { - const topicChildrenIds = topic.children.map(subtopic => subtopic.id); + const topicChildrenIds = topic.children.map((subtopic) => subtopic.id); - if (topic.selected === "selected" || topic.selected === "indeterminate") { - this.topics = this.topicsIdList.filter(topicId => !topicChildrenIds.includes(topicId)); + if (topic.selected === 'selected' || topic.selected === 'indeterminate') { + this.topics = this.topicsIdList.filter( + (topicId) => !topicChildrenIds.includes(topicId) + ); } else { this.topics = this.topicsIdList.concat(topicChildrenIds); } @@ -325,19 +338,19 @@ export default class ExplorerController extends Controller { this.isLoading = true; await this.pauseToRerender(1); - this.topics = this.isAllTopicsSelected === "unselected" ? "all" : "none"; + this.topics = this.isAllTopicsSelected === 'unselected' ? 'all' : 'none'; this.isLoading = false; window.dataLayer = window.dataLayer || []; window.dataLayer.push({ - 'event' : 'select_all_topics', - 'toggle' : this.isAllTopicsSelected === "unselected" ? "none" : "all", + event: 'select_all_topics', + toggle: this.isAllTopicsSelected === 'unselected' ? 'none' : 'all', }); this.metrics.trackEvent('GoogleAnalytics', { eventCategory: 'Select Topics', eventAction: 'Select All Topics Toggle', - eventLabel: this.isAllTopicsSelected === "unselected" ? "none" : "all", + eventLabel: this.isAllTopicsSelected === 'unselected' ? 'none' : 'all', }); } @@ -347,8 +360,8 @@ export default class ExplorerController extends Controller { if (controlId === 'showReliability') { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ - 'event' : 'toggle_show_reliability_data', - 'show_reliability_data' : !currentControlValue, + event: 'toggle_show_reliability_data', + show_reliability_data: !currentControlValue, }); this.metrics.trackEvent('GoogleAnalytics', { eventCategory: 'Show Reliability Data', @@ -358,8 +371,8 @@ export default class ExplorerController extends Controller { } else if (controlId === 'showCharts') { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ - 'event' : 'toggle_show_charts', - 'show_charts' : !currentControlValue, + event: 'toggle_show_charts', + show_charts: !currentControlValue, }); this.metrics.trackEvent('GoogleAnalytics', { eventCategory: 'Show Charts', @@ -368,23 +381,32 @@ export default class ExplorerController extends Controller { }); } - sessionStorage.setItem([controlId], !currentControlValue) + sessionStorage.setItem([controlId], !currentControlValue); - this.transitionToRoute('explorer', { queryParams: { - [controlId]: !currentControlValue, - }}); + this.transitionToRoute('explorer', { + queryParams: { + [controlId]: !currentControlValue, + }, + }); } @task({ restartable: true }) *reloadExplorerModel(newGeoid) { yield this.store.unloadAll('row'); - const newExplorerModel = yield fetchExplorerModel(this.store, this.model.geotype, this.model.geoid, newGeoid); + const newExplorerModel = yield fetchExplorerModel( + this.store, + this.model.geotype, + this.model.geoid, + newGeoid + ); this.model = newExplorerModel; - sessionStorage.setItem('compareTo', newGeoid) + sessionStorage.setItem('compareTo', newGeoid); - yield this.transitionToRoute('explorer', { queryParams: { compareTo: newGeoid }}); + yield this.transitionToRoute('explorer', { + queryParams: { compareTo: newGeoid }, + }); } @action updateCompareTo(geoid) { @@ -396,10 +418,10 @@ export default class ExplorerController extends Controller { @action toggleReliability() { this.showReliability = !this.showReliability; /*global Promise*/ - return new Promise(resolve => { - setTimeout(function() { - resolve("slow") - }, 1) - }) + return new Promise((resolve) => { + setTimeout(function () { + resolve('slow'); + }, 1); + }); } } diff --git a/app/sources-config/index.js b/app/sources-config/index.js index 4c7c9f00..9d63a51f 100644 --- a/app/sources-config/index.js +++ b/app/sources-config/index.js @@ -25,9 +25,9 @@ export default [ }, { id: 'acs-current', - label: '2017 - 2021', + label: '2018 - 2022', type: 'acs', - year: '2017-2021', + year: '2018-2022', mode: 'current', selected: false, }, @@ -41,7 +41,7 @@ export default [ }, { id: 'acs-change', - label: 'Change Over Time (2006-2010 to 2017-2021)', + label: 'Change Over Time (2006-2010 to 2018-2022)', type: 'acs', year: null, mode: 'change', diff --git a/app/table-config/acs/demographic/asian-subgroup.js b/app/table-config/acs/demographic/asian-subgroup.js index e54c3d14..a1fc8925 100644 --- a/app/table-config/acs/demographic/asian-subgroup.js +++ b/app/table-config/acs/demographic/asian-subgroup.js @@ -13,6 +13,11 @@ export default [ title: 'Chinese, except Taiwanese', data: 'asnchinot', }, + { + indent: 1, + title: 'Hmong', + data: 'asnhmng', + }, { indent: 1, title: 'Japanese', @@ -39,87 +44,131 @@ export default [ data: 'asntwn', }, { - title: 'South Asian', - data: 'asnsouth', + indent: 1, + title: 'Other East Asian', + data: 'asnoeast', + }, + { + title: 'Southeast Asian', + data: 'asnseast', }, { indent: 1, - title: 'Asian Indian', - data: 'asnind', + title: 'Burmese', + data: 'asnburm', }, { indent: 1, - title: 'Bangladeshi', - data: 'asnbng', + title: 'Cambodian', + data: 'asncmb', }, { indent: 1, - title: 'Bhutanese', - data: 'asnbhutn', + title: 'Filipino', + data: 'asnflp', }, { indent: 1, - title: 'Nepalese', - data: 'asnnepal', + title: 'Indonesian', + data: 'asnindnsn', }, { indent: 1, - title: 'Pakistani', - data: 'asnpak', + title: 'Laotian', + data: 'asnlao', }, { indent: 1, - title: 'Sri Lankan', - data: 'asnsril', + title: 'Malaysian', + data: 'asnmalsn', }, { - title: 'Southeast Asian', - data: 'asnseast', + indent: 1, + title: 'Mien', + data: 'asnmien', }, { indent: 1, - title: 'Burmese', - data: 'asnburm', + title: 'Singaporean', + data: 'asnsingpr', }, { indent: 1, - title: 'Cambodian', - data: 'asncmb', + title: 'Thai', + data: 'asnthai', }, { indent: 1, - title: 'Filipino', - data: 'asnflp', + title: 'Vietnamese', + data: 'asnvtn', }, { indent: 1, - title: 'Hmong', - data: 'asnhmng', + title: 'Other Southeast Asian', + data: 'asnoseast', + }, + { + title: 'South Asian', + data: 'asnsouth', }, { indent: 1, - title: 'Indonesian', - data: 'asnindnsn', + title: 'Asian Indian', + data: 'asnind', }, { indent: 1, - title: 'Laotian', - data: 'asnlao', + title: 'Bangladeshi', + data: 'asnbng', }, { indent: 1, - title: 'Malaysian', - data: 'asnmalsn', + title: 'Bhutanese', + data: 'asnbhutn', }, { indent: 1, - title: 'Thai', - data: 'asnthai', + title: 'Nepalese', + data: 'asnnepal', }, { indent: 1, - title: 'Vietnamese', - data: 'asnvtn', + title: 'Pakistani', + data: 'asnpak', + }, + { + indent: 1, + title: 'Sikh', + data: 'asnsikh', + }, + { + indent: 1, + title: 'Sri Lankan', + data: 'asnsril', + }, + { + indent: 1, + title: 'Other South Asian', + data: 'asnosouth', + }, + { + title: 'Central Asian', + data: 'asncntrl', + }, + { + indent: 1, + title: 'Kazakh', + data: 'asnkazakh', + }, + { + indent: 1, + title: 'Uzbek', + data: 'asnuzbek', + }, + { + indent: 1, + title: 'Other Central Asian', + data: 'asnocntrl', }, { title: 'Other Asian', diff --git a/app/table-config/acs/social/place-of-birth.js b/app/table-config/acs/social/place-of-birth.js index c4f6db34..2f93eb18 100755 --- a/app/table-config/acs/social/place-of-birth.js +++ b/app/table-config/acs/social/place-of-birth.js @@ -25,7 +25,8 @@ export default [ }, { indent: 1, - title: 'Born in Puerto Rico, U.S. Island areas, or born abroad to American parent(s)', + title: + 'Born in Puerto Rico, U.S. Island areas, or born abroad to American parent(s)', data: 'ntvprusab', }, { @@ -154,6 +155,11 @@ export default [ title: 'Portugal', data: 'portugal', }, + { + indent: 3, + title: 'Azores Islands', + data: 'azores', + }, { indent: 2, title: 'Spain', @@ -318,6 +324,11 @@ export default [ title: 'Bangladesh', data: 'bngldsh', }, + { + indent: 2, + title: 'Bhutan', + data: 'bhutan', + }, { indent: 2, title: 'India', @@ -418,6 +429,21 @@ export default [ title: 'Western Asia', data: 'wasia', }, + { + indent: 2, + title: 'Armenia', + data: 'armenia', + }, + { + indent: 2, + title: 'Azerbaijan', + data: 'azerbjn', + }, + { + indent: 2, + title: 'Georgia', + data: 'georgia', + }, { indent: 2, title: 'Iraq', @@ -455,18 +481,18 @@ export default [ }, { indent: 2, - title: 'Yemen', - data: 'yemen', + title: 'Turkey', + data: 'turkey', }, { indent: 2, - title: 'Turkey', - data: 'turkey', + title: 'United Arab Emirates', + data: 'uaremir', }, { indent: 2, - title: 'Armenia', - data: 'armenia', + title: 'Yemen', + data: 'yemen', }, { indent: 2, @@ -502,6 +528,26 @@ export default [ title: 'Kenya', data: 'kenya', }, + { + indent: 2, + title: 'Somalia', + data: 'somalia', + }, + { + indent: 2, + title: 'Tanzania', + data: 'tanzania', + }, + { + indent: 2, + title: 'Uganda', + data: 'uganda', + }, + { + indent: 2, + title: 'Zimbabwe', + data: 'zimbabwe', + }, { indent: 2, title: 'Other Eastern Africa', @@ -517,6 +563,16 @@ export default [ title: 'Cameroon ', data: 'cameroon', }, + { + indent: 2, + title: 'Congo', + data: 'congo', + }, + { + indent: 2, + title: 'Democratic Republic of Congo (Zaire)', + data: 'drcongo', + }, { indent: 2, title: 'Other Middle Africa', @@ -527,6 +583,11 @@ export default [ title: 'Northern Africa', data: 'nafr', }, + { + indent: 2, + title: 'Algeria', + data: 'algeria', + }, { indent: 2, title: 'Egypt', @@ -577,6 +638,11 @@ export default [ title: 'Ghana', data: 'ghana', }, + { + indent: 2, + title: 'Ivory Coast ', + data: 'ivorycst', + }, { indent: 2, title: 'Liberia', @@ -587,11 +653,21 @@ export default [ title: 'Nigeria', data: 'nigeria', }, + { + indent: 2, + title: 'Senegal', + data: 'senegal', + }, { indent: 2, title: 'Sierra Leone', data: 'sierral', }, + { + indent: 2, + title: 'Togo', + data: 'togo', + }, { indent: 2, title: 'Other Western Africa', @@ -626,6 +702,16 @@ export default [ title: 'Fiji', data: 'fiji', }, + { + indent: 1, + title: 'Marshall Islands', + data: 'mrshlisl', + }, + { + indent: 1, + title: 'Micronesia', + data: 'microns', + }, { indent: 1, title: 'Oceania, n.e.c.', @@ -685,6 +771,11 @@ export default [ title: 'Jamaica', data: 'jamaica', }, + { + indent: 3, + title: 'St. Lucia', + data: 'stlucia', + }, { indent: 3, title: 'St. Vincent and the Grenadines', diff --git a/app/table-config/census/detailed-race-and-ethnicity.js b/app/table-config/census/detailed-race-and-ethnicity.js new file mode 100644 index 00000000..b2bc0e76 --- /dev/null +++ b/app/table-config/census/detailed-race-and-ethnicity.js @@ -0,0 +1,928 @@ +export default [ + { + data: 'pop', + title: 'Total Population', + highlight: true, + }, + { + title: 'Hispanic or Latino (of any race)', + }, + { + data: 'hmex', + title: 'Mexican', + indent: 3, + }, + { + data: 'hca', + title: 'Central American', + indent: 2, + }, + { + data: 'hcacstrcn', + title: 'Costa Rican', + indent: 3, + }, + { + data: 'hcagutmln', + title: 'Guatemalan', + indent: 3, + }, + { + data: 'hcahndrn', + title: 'Honduran', + indent: 3, + }, + { + data: 'hcancrgn', + title: 'Nicaraguan', + indent: 3, + }, + { + data: 'hcapnmn', + title: 'Panamanian', + indent: 3, + }, + { + data: 'hcaslvdrn', + title: 'Salvadoran', + indent: 3, + }, + { + data: 'hsa', + title: 'South American', + indent: 2, + }, + { + data: 'hsaargntn', + title: 'Argentinean', + indent: 3, + }, + { + data: 'hsablvn', + title: 'Bolivian', + indent: 3, + }, + { + data: 'hsachln', + title: 'Chilean', + indent: 3, + }, + { + data: 'hsaclmbn', + title: 'Colombian', + indent: 3, + }, + { + data: 'hsaecudrn', + title: 'Ecuadorian', + indent: 3, + }, + { + data: 'hsaprguyn', + title: 'Paraguayan', + indent: 3, + }, + { + data: 'hsaprvn', + title: 'Peruvian', + indent: 3, + }, + { + data: 'hsaurgyn', + title: 'Uruguayan', + indent: 3, + }, + { + data: 'hsavnzuln', + title: 'Venezuelan', + indent: 3, + }, + { + data: 'hch', + title: 'Caribbean Hispanic', + indent: 2, + }, + { + data: 'hchcuban', + title: 'Cuban', + indent: 3, + }, + { + data: 'hchdmncn', + title: 'Dominican', + indent: 3, + }, + { + data: 'hchprtrcn', + title: 'Puerto Rican', + indent: 3, + }, + { + data: 'hoth', + title: 'Other Hispanic, Latino, or Spanish', + indent: 2, + }, + { + data: 'hothspnrd', + title: 'Spaniard', + indent: 3, + }, + { + data: 'hothspnsh', + title: 'Spanish', + indent: 3, + }, + { + data: 'hothspnam', + title: 'Spanish American ', + indent: 3, + }, + { + data: 'hothgrfna', + title: 'Garifuna', + indent: 3, + }, + { + title: 'White', + }, + { + data: 'weur', + title: 'European', + indent: 2, + }, + { + data: 'weuralbn', + title: 'Albanian', + indent: 3, + }, + { + data: 'weurarmn', + title: 'Armenian', + indent: 3, + }, + { + data: 'weurastrn', + title: 'Austrian', + indent: 3, + }, + { + data: 'weurazrbn', + title: 'Azerbaijani', + indent: 3, + }, + { + data: 'weurblrsn', + title: 'Belarusian', + indent: 3, + }, + { + data: 'weurblgn', + title: 'Belgian', + indent: 3, + }, + { + data: 'weurbshrz', + title: 'Bosnian and Herzegovinian', + indent: 3, + }, + { + data: 'weurbrtsh', + title: 'British', + indent: 3, + }, + { + data: 'weurblgrn', + title: 'Bulgarian', + indent: 3, + }, + { + data: 'weurcrtn', + title: 'Croatian', + indent: 3, + }, + { + data: 'weurcyprt', + title: 'Cypriot', + indent: 3, + }, + { + data: 'weurczch', + title: 'Czech', + indent: 3, + }, + { + data: 'weurdnsh', + title: 'Danish', + indent: 3, + }, + { + data: 'weurdtch', + title: 'Dutch', + indent: 3, + }, + { + data: 'weurengsh', + title: 'English', + indent: 3, + }, + { + data: 'weurestn', + title: 'Estonian', + indent: 3, + }, + { + data: 'weurfnnsh', + title: 'Finnish', + indent: 3, + }, + { + data: 'weurfrnch', + title: 'French', + indent: 3, + }, + { + data: 'weurgrgn', + title: 'Georgian', + indent: 3, + }, + { + data: 'weurgrmn', + title: 'German', + indent: 3, + }, + { + data: 'weurgrk', + title: 'Greek', + indent: 3, + }, + { + data: 'weurhngrn', + title: 'Hungarian', + indent: 3, + }, + { + data: 'weurirsh', + title: 'Irish', + indent: 3, + }, + { + data: 'weuritln', + title: 'Italian', + indent: 3, + }, + { + data: 'weurksvn', + title: 'Kosovan', + indent: 3, + }, + { + data: 'weurltvn', + title: 'Latvian', + indent: 3, + }, + { + data: 'weurlthn', + title: 'Lithuanian', + indent: 3, + }, + { + data: 'weurmcdn', + title: 'Macedonian', + indent: 3, + }, + { + data: 'weurmlts', + title: 'Maltese', + indent: 3, + }, + { + data: 'weurmldvn', + title: 'Moldovan', + indent: 3, + }, + { + data: 'weurmtgrn', + title: 'Montenegrin', + indent: 3, + }, + { + data: 'weurnrwgn', + title: 'Norwegian', + indent: 3, + }, + { + data: 'weurplsh', + title: 'Polish', + indent: 3, + }, + { + data: 'weurprtgs', + title: 'Portuguese', + indent: 3, + }, + { + data: 'weurrmn', + title: 'Romanian', + indent: 3, + }, + { + data: 'weurrsn', + title: 'Russian', + indent: 3, + }, + { + data: 'weurscdvn', + title: 'Scandinavian', + indent: 3, + }, + { + data: 'weursirsh', + title: 'Scots-Irish', + indent: 3, + }, + { + data: 'weursctsh', + title: 'Scottish', + indent: 3, + }, + { + data: 'weursrbn', + title: 'Serbian', + indent: 3, + }, + { + data: 'weurslvc', + title: 'Slavic', + indent: 3, + }, + { + data: 'weurslvk', + title: 'Slovak', + indent: 3, + }, + { + data: 'weurslvn', + title: 'Slovenian', + indent: 3, + }, + { + data: 'weurswdsh', + title: 'Swedish', + indent: 3, + }, + { + data: 'weurswiss', + title: 'Swiss', + indent: 3, + }, + { + data: 'WEurTrksh', + title: 'Turkish', + indent: 3, + }, + { + data: 'weururkrn', + title: 'Ukrainian', + indent: 3, + }, + { + data: 'weurwlsh', + title: 'Welsh', + indent: 3, + }, + { + data: 'wmena', + title: 'Middle Eastern or North African', + indent: 2, + }, + { + data: 'wmenaagrn', + title: 'Algerian', + indent: 3, + }, + { + data: 'wmenaarab', + title: 'Arab', + indent: 3, + }, + { + data: 'wmenaegtn', + title: 'Egyptian', + indent: 3, + }, + { + data: 'WMENAIrn', + title: 'Iranian', + indent: 3, + }, + { + data: 'wmenairq', + title: 'Iraqi', + indent: 3, + }, + { + data: 'wmenaisrl', + title: 'Israeli', + indent: 3, + }, + { + data: 'wmenajrdn', + title: 'Jordanian', + indent: 3, + }, + { + data: 'wmenalbns', + title: 'Lebanese', + indent: 3, + }, + { + data: 'wmenamrcn', + title: 'Moroccan', + indent: 3, + }, + { + data: 'wmenapstn', + title: 'Palestinian', + indent: 3, + }, + { + data: 'wmenasyrn', + title: 'Syrian', + indent: 3, + }, + { + data: 'wmenatnsn', + title: 'Tunisian', + indent: 3, + }, + { + data: 'wmenaymn', + title: 'Yemeni', + indent: 3, + }, + { + data: 'woth', + title: 'Other White', + indent: 2, + }, + { + data: 'wothastrn', + title: 'Australian', + indent: 3, + }, + { + data: 'wothcndn', + title: 'Canadian', + indent: 3, + }, + { + data: 'wothfrcdn', + title: 'French Canadian', + indent: 3, + }, + { + data: 'wothnzldr', + title: 'New Zealander', + indent: 3, + }, + { + title: 'Black or African American', + }, + { + data: 'bafram', + title: 'African American', + indent: 3, + }, + { + data: 'bssaf', + title: 'Sub-Saharan African', + indent: 2, + }, + { + data: 'bssafbrkb', + title: 'Burkinabe', + indent: 3, + }, + { + data: 'bssafcmrn', + title: 'Cameroonian', + indent: 3, + }, + { + data: 'bssafcgls', + title: 'Congolese', + indent: 3, + }, + { + data: 'bssafethn', + title: 'Ethiopian', + indent: 3, + }, + { + data: 'bssafgmbn', + title: 'Gambian', + indent: 3, + }, + { + data: 'bssafghn', + title: 'Ghanaian', + indent: 3, + }, + { + data: 'bssafgnn', + title: 'Guinean', + indent: 3, + }, + { + data: 'bssafivrn', + title: 'Ivoirian', + indent: 3, + }, + { + data: 'bssafknyn', + title: 'Kenyan', + indent: 3, + }, + { + data: 'bssaflbrn', + title: 'Liberian', + indent: 3, + }, + { + data: 'bssafmln', + title: 'Malian', + indent: 3, + }, + { + data: 'bssafngrn', + title: 'Nigerian (Nigeria)', + indent: 3, + }, + { + data: 'bssafsgls', + title: 'Senegalese', + indent: 3, + }, + { + data: 'bssafsrln', + title: 'Sierra Leonean', + indent: 3, + }, + { + data: 'bssafsafr', + title: 'South African', + indent: 3, + }, + { + data: 'bssafsdns', + title: 'Sudanese', + indent: 3, + }, + { + data: 'bssaftgls', + title: 'Togolese', + indent: 3, + }, + { + data: 'bcrb', + title: 'Caribbean', + indent: 2, + }, + { + data: 'bcrbatbrb', + title: 'Antiguan and Barbudan', + indent: 3, + }, + { + data: 'bcrbbhmn', + title: 'Bahamian', + indent: 3, + }, + { + data: 'bcrbbrbdn', + title: 'Barbadian', + indent: 3, + }, + { + data: 'bcrbdmis', + title: 'Dominica Islander', + indent: 3, + }, + { + data: 'bcrbgrndn', + title: 'Grenadian', + indent: 3, + }, + { + data: 'bcrbhtn', + title: 'Haitian', + indent: 3, + }, + { + data: 'bcrbjmcn', + title: 'Jamaican', + indent: 3, + }, + { + data: 'bcrbktnv', + title: 'Kittian and Nevisian', + indent: 3, + }, + { + data: 'bcrbstluc', + title: 'St. Lucian', + indent: 3, + }, + { + data: 'bcrbtrtob', + title: 'Trinidadian and Tobagonian', + indent: 3, + }, + { + data: 'bcrbusvis', + title: 'U.S. Virgin Islander', + indent: 3, + }, + { + data: 'bcrbvnctn', + title: 'Vincentian', + indent: 3, + }, + { + data: 'bcrbwind', + title: 'West Indian', + indent: 3, + }, + { + data: 'both', + title: 'Other Black or African American', + indent: 3, + }, + { + title: 'American Indian and Alaska Native', + }, + { + data: 'aianalkntv', + title: 'Alaska Native', + indent: 2, + }, + { + data: 'aianain', + title: 'American Indian', + indent: 2, + }, + { + data: 'aianainbf', + title: 'Blackfeet Tribe of the Blackfeet Indian Reservation of Montana', + indent: 4, + }, + { + data: 'aianainch', + title: 'Cherokee', + indent: 4, + }, + { + data: 'aiancnain', + title: 'Central American Indian (all tribes)', + indent: 2, + }, + { + data: 'aianmxin', + title: 'Mexican Indian (all tribes)', + indent: 2, + }, + { + data: 'aianmxina', + title: 'Aztec', + indent: 3, + }, + { + data: 'aiansai', + title: 'South American Indian (all tribes)', + indent: 2, + }, + { + data: 'aiansaiei', + title: 'Ecuadorian Indian', + indent: 3, + }, + { + data: 'aiansaigy', + title: 'Guyanese South American Indian', + indent: 3, + }, + { + data: 'aiansaiic', + title: 'Inca', + indent: 3, + }, + { + data: 'aiancrb', + title: 'Caribbean Indian (all tribes)', + indent: 2, + }, + { + data: 'aiancrbt', + title: 'Taino', + indent: 3, + }, + { + data: 'aianmsin', + title: 'Mesoamerican Indian (all tribes)', + indent: 2, + }, + { + data: 'aianmsinm', + title: 'Maya', + indent: 3, + }, + { + title: 'Asian', + }, + { + data: 'aea', + title: 'East Asian', + indent: 3, + }, + { + data: 'aeachnsnt', + title: 'Chinese, except Taiwanese', + indent: 3, + }, + { + data: 'aeajpns', + title: 'Japanese', + indent: 3, + }, + { + data: 'aeakrn', + title: 'Korean', + indent: 3, + }, + { + data: 'aeatwns', + title: 'Taiwanese', + indent: 3, + }, + { + data: 'aca', + title: 'Central Asian', + indent: 2, + }, + { + data: 'acaafghan', + title: 'Afghan', + indent: 3, + }, + { + data: 'acakazakh', + title: 'Kazakh', + indent: 3, + }, + { + data: 'acakyrgyz', + title: 'Kyrgyz', + indent: 3, + }, + { + data: 'acatajik', + title: 'Tajik', + indent: 3, + }, + { + data: 'acauzbek', + title: 'Uzbek', + indent: 3, + }, + { + data: 'asa', + title: 'South Asian', + indent: 2, + }, + { + data: 'asaasnind', + title: 'Asian Indian', + indent: 3, + }, + { + data: 'asabngdsh', + title: 'Bangladeshi', + indent: 3, + }, + { + data: 'asanpls', + title: 'Nepalese', + indent: 3, + }, + { + data: 'asapkstn', + title: 'Pakistani', + indent: 3, + }, + { + data: 'asasikh', + title: 'Sikh', + indent: 3, + }, + { + data: 'asasrlnkn', + title: 'Sri Lankan', + indent: 3, + }, + { + data: 'asea', + title: 'Southeast Asian', + indent: 2, + }, + { + data: 'aseabrms', + title: 'Burmese', + indent: 3, + }, + { + data: 'aseacmbdn', + title: 'Cambodian', + indent: 3, + }, + { + data: 'aseaflpn', + title: 'Filipino', + indent: 3, + }, + { + data: 'aseaindsn', + title: 'Indonesian', + indent: 3, + }, + { + data: 'aseamlysn', + title: 'Malaysian', + indent: 3, + }, + { + data: 'aseasgprn', + title: 'Singaporean', + indent: 3, + }, + { + data: 'aseathai', + title: 'Thai', + indent: 3, + }, + { + data: 'aseavtnms', + title: 'Vietnamese', + indent: 3, + }, + { + data: 'aoth', + title: 'Other Asian', + indent: 2, + }, + { + title: 'Native Hawaiian and Other Pacific Islander', + }, + { + data: 'nhpiply', + title: 'Polynesian', + indent: 2, + }, + { + data: 'nhpiplynh', + title: 'Native Hawaiian', + indent: 3, + }, + { + data: 'nhpiplysm', + title: 'Samoan', + indent: 3, + }, + { + data: 'nhpimc', + title: 'Micronesian', + indent: 2, + }, + { + data: 'nhpimcchr', + title: 'Chamorro', + indent: 3, + }, + { + title: 'Some Other Race', + }, + { + data: 'sorblzn', + title: 'Belizean', + indent: 3, + }, + { + data: 'sorbrzln', + title: 'Brazilian', + indent: 3, + }, + { + data: 'sorguyans', + title: 'Guyanese', + indent: 3, + }, +]; diff --git a/app/table-config/census/index.js b/app/table-config/census/index.js index a4c182fe..8873200e 100644 --- a/app/table-config/census/index.js +++ b/app/table-config/census/index.js @@ -7,6 +7,7 @@ import householdSize from './household-size'; import mutuallyExclusiveRaceHispanicOrigin from './mutually-exclusive-race---hispanic-origin'; import relationshipToHeadOfHouseholdHouseholder from './relationship-to-head-of-household--householder'; import populationSexAgeDensity from './population-sex-age-density'; +import detailedRaceAndEthnicity from './detailed-race-and-ethnicity'; export default { householdType, @@ -16,4 +17,5 @@ export default { mutuallyExclusiveRaceHispanicOrigin, relationshipToHeadOfHouseholdHouseholder, populationSexAgeDensity, + detailedRaceAndEthnicity, }; diff --git a/app/templates/about.hbs b/app/templates/about.hbs index be7d1fc7..ce42e7c9 100644 --- a/app/templates/about.hbs +++ b/app/templates/about.hbs @@ -63,6 +63,10 @@ <p>It is also important to note that private information (such as names and addresses) collected through the census is protected under Title 13 of U. S. Code. To adhere to the law and to avoid the disclosure of information about individual respondents, the Census Bureau has historically applied a host of techniques, such as top- and bottom-coding, imputation, table- and cell-suppression, and data swapping. The Census Bureau is employing a new technique with the 2020 Census, referred to as the Disclosure Avoidance System (DAS), based on differential privacy. With this approach, the Census Bureau “infuses noise” systematically across census data and sets a quantified disclosure risk, referred to as the Privacy Loss Budget (PLB).</p> <p>While the new DAS approach may diminish the risk of disclosure concerns, it comes at a cost to data accuracy. Consequently, 2020 Census data users should be aware that all sub-state counts, except for housing units (which are unaffected by the DAS), may be adjusted to protect the privacy of Census participants and may be subject to reduced accuracy. Because DAS noise infusion is randomized, it is impossible for data users to know the degree to which any individual statistic is altered. However, it is possible to say that in general the relative size of errors decreases as counts increase. Consequently, data users should have greater confidence in the accuracy of the data as counts get larger. Further, an evaluation of a Privacy-Protected Microdata File (PPMF), treated with a Disclosure Avoidance System like the one applied to 2020 redistricting data, showed that counts of 300 or more rarely have sizable errors (error beyond +/- 10% of the count). Therefore, while data users need to be cognizant of data accuracy limitations, they should have confidence in conclusions based on sizable counts, which are relatively unaffected by the Census Bureau’s latest disclosure avoidance method.</p> <p>The Census Bureau has not yet released data on average household size. This variable was derived from published data by DCP and are considered draft calculations. The data are provided for information purposes only and should not be relied on for analyses until verified by the Census Bureau.</p> + <h4>Detailed Race and Ethnicity</h4> + <p>Counts for all detailed race and ethnicity groups shown in NYC PFF represent the number of people who identified with each group, either alone or in combination with another group(s) -- this count represents the maximum number of people who identified with each respective 2020 Census group. Counts are given for both detailed and regional groups, with detailed groups nesting under regional, and both nesting under broad Race/Ethnicity groups following the Census Bureau’s classification methodology. Some responses may have been reclassified by the Census Bureau. All detailed race and ethnicity data are affected by the Census Bureau’s infusion of statistical noise for privacy protection, and thus come with bands of uncertainty. (For more information on the classifications and noise infusion, see the <a href="https://www2.census.gov/programs-surveys/decennial/2020/technical-documentation/complete-tech-docs/detailed-demographic-and-housing-characteristics-file-a/2020census-detailed-dhc-a-techdoc.pdf" target="_blank">Census Bureau’s Detailed DHC-A technical documentation</a>.)</p> + <p>For all geographies, and for every given detailed race and ethnicity group, the Census Bureau suppressed counts of less than 22. For regional groups, the Census Bureau suppressed counts of less than 94. Consequently, NYC PFF will display such suppressed values as blank.</p> + <p>When geographies are aggregated (such as a grouping of census tracts forming a Neighborhood Tabulation Area, Community District Tabulation Area, or other custom study area) there may be compounded error from both suppression and intentional noise infusion. Further, aggregated counts will not sum to published counts for higher orders of geography, such as boroughs, due to independent application of noise infusion. (Again, see the <a href="https://www2.census.gov/programs-surveys/decennial/2020/technical-documentation/complete-tech-docs/detailed-demographic-and-housing-characteristics-file-a/2020census-detailed-dhc-a-techdoc.pdf" target="_blank">Census Bureau’s Detailed DHC-A technical documentation</a> for more information.)</p> <h3>American Community Survey</h3> <p>The American Community Survey (ACS) is the most extensive nationwide survey currently available. From its annual releases users are able to examine the city’s detailed demographic, social, economic, and housing characteristics. Each month, questionnaires are sent to a sample of approximately 300,000 addresses across the country, so households are continuously receiving and responding to the ACS. In order to have a large enough sample from which to create estimates of characteristics for small areas, the ACS “rolls-up” the sample for five-year periods. New York City Population FactFinder (PFF) relies on these five-year period estimates to produce all of its ACS profile content. Because these estimates span a five-year period, they are represented with a start-year and end-year (for example, 2014-2018). These do not represent change over that five-year period, but rather something akin to a five-year average. It is also important to note that ACS estimates are derived from a survey and are subject to sampling error. Consequently, all ACS estimates are published with Margins of Error (MOEs) at a 90% confidence interval. These MOEs are available in PFF in data reliability views.</p> diff --git a/app/templates/components/data-table-header-change.hbs b/app/templates/components/data-table-header-change.hbs index 9b7430c4..c431f7d5 100644 --- a/app/templates/components/data-table-header-change.hbs +++ b/app/templates/components/data-table-header-change.hbs @@ -21,8 +21,8 @@ <th colspan="3" class="text-center cell-border-bottom">Change, 2010 to 2020</th> {{else}}{{!-- acs --}} <th colspan="{{if @reliability "5" "2"}}" class="text-center cell-border-bottom">2006-2010</th> - <th colspan="{{if @reliability "5" "2"}}" class="text-center cell-border-bottom">2017-2021</th> - <th colspan="{{if @reliability "6" "3"}}" class="text-center cell-border-bottom">Change, 2006-2010 to 2017-2021</th> + <th colspan="{{if @reliability "5" "2"}}" class="text-center cell-border-bottom">2018-2022</th> + <th colspan="{{if @reliability "6" "3"}}" class="text-center cell-border-bottom">Change, 2006-2010 to 2018-2022</th> {{/if}} </tr> {{#if @reliability}} @@ -39,7 +39,7 @@ Percent {{fa-icon icon='question-circle' transform='shrink-2'}} {{ember-tooltip - text='2017-2021 number minus 2006-2010 number, divided by 2006-2010 number. Quotient multiplied by 100.' + text='2018-2022 number minus 2006-2010 number, divided by 2006-2010 number. Quotient multiplied by 100.' side='left' }} </span> diff --git a/app/templates/components/default-modal.hbs b/app/templates/components/default-modal.hbs index 055cd1ae..c2851ce9 100644 --- a/app/templates/components/default-modal.hbs +++ b/app/templates/components/default-modal.hbs @@ -1,8 +1,6 @@ <RevealModal @open={{this.openModal}} @closeModal={{this.toggleModal}}> <h1 class='header-large'> - NYC Population FactFinder will soon be updated with 2018-2022 American - Community Survey (ACS) data and with Detailed Race/Ethnicity Responses from - the 2020 Census. + NYC Population FactFinder has been updated with 2018-2022 American Community Survey (ACS) data and with Detailed Race/Ethnicity Responses from the 2020 Census. 2017-2021 ACS data are still available in the ACS sub-section of <a target="_blank" href="https://www.nyc.gov/site/planning/planning-level/nyc-population/american-community-survey.page">NYC City Planning's Population Division</a> website. </h1> <h1 class='header-large mobile-header'> diff --git a/app/templates/components/explorer/source-select-dropdown.hbs b/app/templates/components/explorer/source-select-dropdown.hbs index 24c90777..a7c2a65b 100644 --- a/app/templates/components/explorer/source-select-dropdown.hbs +++ b/app/templates/components/explorer/source-select-dropdown.hbs @@ -1,98 +1,85 @@ -<div - {{on-click-outside (action "closeMenu")}} -> - <button - class="source-select-toggle button" - role="button" - {{on "click" this.toggleOpen}} - > +<div {{on-click-outside (action "closeMenu" )}}> + <button class="source-select-toggle button" role="button" {{on "click" this.toggleOpen}}> <span class="button-caption">Data Source:</span> {{this.source.label}} {{fa-icon icon=(if this.open 'caret-up' 'caret-down')}} </button> {{#if this.open}} - <div class="source-menu"> - {{#if @isModelLoading}} - <div class="text-center"> - Please wait... - </div> - {{else}} - Decennial Census - {{#each this.censusSources key="id" as |source|}} - <div - class="nestable-list-item grid-x clickable" - {{on "click" (fn @setSource source)}} - > - <div class="cell small-1"> - <span> - {{#if source.selected}} - {{fa-icon icon='dot-circle' prefix='far'}} - {{else}} - {{fa-icon icon='circle' prefix='far' class='silver'}} - {{/if}} - </span> - </div> + <div class="source-menu"> + {{#if @isModelLoading}} + <div class="text-center"> + Please wait... + </div> + {{else}} + Decennial Census + {{#each this.censusSources key="id" as |source|}} + <div class="nestable-list-item grid-x clickable" {{on "click" (fn @setSource source)}}> + <div class="cell small-1"> + <span> + {{#if source.selected}} + {{fa-icon icon='dot-circle' prefix='far'}} + {{else}} + {{fa-icon icon='circle' prefix='far' class='silver'}} + {{/if}} + </span> + </div> - <div class="cell auto"> - {{source.label}} - </div> - </div> - {{/each}} + <div class="cell auto"> + {{source.label}} + </div> + </div> + {{/each}} - {{#if this.showACS}} - American Community Survey (ACS) - {{#each this.acsSources key="id" as |source|}} - <div - class="nestable-list-item grid-x clickable" - {{on "click" (fn @setSource source)}} - > - <div class="cell small-1"> - <span> - {{#if source.selected}} - {{fa-icon icon='dot-circle' prefix='far'}} - {{else}} - {{fa-icon icon='circle' prefix='far' class='silver'}} - {{/if}} - </span> - </div> + {{#if this.showACS}} + American Community Survey (ACS) + {{#each this.acsSources key="id" as |source|}} + <div class="nestable-list-item grid-x clickable" {{on "click" (fn @setSource source)}}> + <div class="cell small-1"> + <span> + {{#if source.selected}} + {{fa-icon icon='dot-circle' prefix='far'}} + {{else}} + {{fa-icon icon='circle' prefix='far' class='silver'}} + {{/if}} + </span> + </div> - <div class="cell auto"> - {{source.label}} - </div> - </div> - {{/each}} - {{else}} - <span class="disabled">American Community Survey (ACS)</span> - {{#each this.acsSources key="id" as |source|}} - <div - class="nestable-list-item grid-x disabled" - aria-disabled="true" - > - <div class="cell small-1"> - <span class="disabled"> - {{fa-icon icon='circle' prefix='far' class='silver'}} - </span> - </div> + <div class="cell auto"> + {{source.label}} + </div> + </div> + {{/each}} + {{else}} + <span class="disabled">American Community Survey (ACS)</span> + {{#each this.acsSources key="id" as |source|}} + <div class="nestable-list-item grid-x disabled" aria-disabled="true"> + <div class="cell small-1"> + <span class="disabled"> + {{fa-icon icon='circle' prefix='far' class='silver'}} + </span> + </div> - <div class="cell auto disabled"> - {{source.label}} - </div> - </div> - {{/each}} - {{/if}} - {{/if}} - {{#if this.showDistrictACSWarning}} - <p class="text-small district-acs-warning"> - *ACS data are not available for Community Districts (CDs). Alternatively, users can select Community District Tabulation Areas – rough approximations of CDs – to access ACS data.* - </p> - {{/if}} - {{#if this.showCCDACSWarning}} - <p class="text-small district-acs-warning"> - *ACS data are currently not available for City Council Districts (CCDs).* - </p> - {{/if}} + <div class="cell auto disabled"> + {{source.label}} + </div> </div> + {{/each}} + {{/if}} + {{/if}} + {{#if this.showDistrictACSWarning}} + <p class="text-small district-acs-warning"> + *ACS data are not available for Community Districts (CDs). Alternatively, users can select Community District + Tabulation Areas – rough approximations of CDs – to access ACS data.* + </p> + {{/if}} + {{#if this.showCCDACSWarning}} + <p class="text-small district-acs-warning"> + *ACS data for City Council Districts (CCDs) come from aggregations of census tracts that roughly approximate the + area of each CCD and may not be perfectly representative of the population within each CCD.* + </p> + {{/if}} + </div> {{/if}} -</div> +</div> \ No newline at end of file diff --git a/app/templates/explorer.hbs b/app/templates/explorer.hbs index 0708fb3d..f33155cd 100644 --- a/app/templates/explorer.hbs +++ b/app/templates/explorer.hbs @@ -78,6 +78,10 @@ <h3 class="header-small"> {{subtopic.label}} </h3> + {{#if subtopic.labelText}} + <p class="text-small"> + {{subtopic.labelText}}</p> + {{/if}} {{data-table mode=this.mode decennial=true diff --git a/app/topics-config/acs.js b/app/topics-config/acs.js index c9efaac3..860e8d92 100644 --- a/app/topics-config/acs.js +++ b/app/topics-config/acs.js @@ -311,7 +311,7 @@ export default [ { id: 'econ-incomeAndBenefits', label: 'Income and Benefits', - tooltip: 'In 2021 inflation-adjusted dollars', + tooltip: 'In 2022 inflation-adjusted dollars', selected: 'unselected', type: 'subtopic', tableConfig: acsEconomicTableConfig.incomeAndBenefits, @@ -329,7 +329,7 @@ export default [ label: 'Earnings', selected: 'unselected', type: 'subtopic', - tooltip: 'In 2021 inflation-adjusted dollars', + tooltip: 'In 2022 inflation-adjusted dollars', tableConfig: acsEconomicTableConfig.earnings, charts: null, children: [], @@ -461,7 +461,7 @@ export default [ { id: 'hou-value', label: 'Value', - tooltip: 'In 2021 inflation-adjusted dollars', + tooltip: 'In 2022 inflation-adjusted dollars', selected: 'unselected', type: 'subtopic', tableConfig: acsHousingTableConfig.value, @@ -495,7 +495,7 @@ export default [ { id: 'hou-grossRent', label: 'Gross Rent', - tooltip: 'In 2021 inflation-adjusted dollars', + tooltip: 'In 2022 inflation-adjusted dollars', selected: 'unselected', type: 'subtopic', tableConfig: acsHousingTableConfig.grossRent, diff --git a/app/topics-config/census.js b/app/topics-config/census.js index 2ac702fb..8e3655fb 100644 --- a/app/topics-config/census.js +++ b/app/topics-config/census.js @@ -26,6 +26,17 @@ export default [ ], children: [], }, + { + id: 'detailedRaceAndEthnicity', + label: 'Detailed Race and Ethnicity', + labelText: + 'Detailed race and ethnicity data represent the group alone or in any combination. The Census Bureau only publishes detailed race and ethnicity data for NYC at a tract, county, and city level. All other geographies are calculated by the Department of City Planning. Because of suppression, aggregate counts incorporate nonsampling error.', + selected: 'unselected', + type: 'subtopic', + tableConfig: censusTableConfig.detailedRaceAndEthnicity, + charts: null, + children: [], + }, { id: 'relationHeadHousehold', label: 'Relationship to Head of Household (Householder)',