{"version":3,"sources":["components/modules/header.js","redux/actions/actionType.ts","redux/utils.js","redux/actions/map.ts","components/Map.tsx","redux/actions/loading.ts","redux/actions/chart.ts","redux/constants.ts","components/charts/CommuterChart.tsx","redux/actions/guide.ts","components/modules/Guide.js","components/DetailCard.tsx","redux/actions/search.ts","components/modules/searchbar.js","components/ControlPenal.tsx","components/modules/GuideFixed.js","components/modules/Loading.js","components/Dashboard.tsx","App.tsx","redux/reducers/theme.ts","redux/reducers/map.ts","redux/reducers/chart.ts","redux/reducers/search.ts","redux/reducers/guide.ts","redux/reducers/index.ts","redux/reducers/loading.ts","redux/store.js","serviceWorker.js","index.tsx"],"names":["Header","_Component","Object","classCallCheck","this","possibleConstructorReturn","getPrototypeOf","apply","arguments","inherits","createClass","key","value","react_default","a","createElement","Row","className","Col","xl","lg","md","sm","xs","Container","href","target","id","react_router_dom","to","activeStyle","color","Component","THEME_TOGGLE","cluster_palette","data","scaleCluster","domain","copyToClipboard","str","el","document","setAttribute","style","position","left","body","appendChild","select","execCommand","removeChild","download_from_series","options","series","fileName","source","xaxis_list","xaxis","categories","csv","header","map","serie","name","cols_header","val","ind","h","replace","d","indd","blobdata","Blob","type","saveAs","_callee","semmcd","mcdboundary","response","boundaryGeoJson","found","regenerator_default","wrap","_context","prev","next","fetch","sent","json","features","some","feature","properties","abrupt","stop","clean_mcd_name","cleanname","split","trim","parseCsvFile","_x3","_parseCsvFile","_callee2","url","csvText","_context2","text","Promise","resolve","reject","Papa","parse","dynamicTyping","complete","results","error","err","remove_highlight_feature","update_geojson_layer","_ref","asyncToGenerator","mark","mode","flow","flows","inboundKey","groupByKey","filtered","sumsMap","sumTraffic","flowData","then","r","console","log","process","filter","row","Map","forEach","groupVal","cflow","commuterflow","set","get","boundarySemmcd","push","geojson","_x","_x2","_x4","init_geojson_layer","_ref2","_x5","switch_to_inflow","switch_to_outflow","switch_dataset_to_2010","switch_dataset_to_2016","mapbox_key","MapView","map_ref","React","createRef","state","lng","lat","zoom","arrowAngle","highlight","highlightLng","highlightLat","hover","hightlightName","undefined","highlightFlow","geoJSONkey","geoJSONObj","stroke","weight","opacity","fill","fillColor","fillOpacity","onEachFeature","layer","on","click","_","_this","props","handleMapClick","mouseover","hoverCenter","centroid","geometry","clickedID","setState","coordinates","bearing","point","mouseout","setStyle","componentDidMount","loading_start","_objectSpread","direction","year","Number","isNaN","_validate_semmcd","validate_semmcd","res","finally","loading_end","componentDidUpdate","prevProps","highlightedName","highlightFeature","find","f","hightlightCenter","_this$props","clickedFeature","center","history","concat","handlePaletteChange","catch","e","set_clicked_name","palette","render","es_Map","ref","minZoom","maxZoom","keyboard","zoomControl","attributionControl","start","LayersControl","BaseLayer","checked","Pane","zIndex","TileLayer","attribution","LayerGroup","ZoomControl","ScaleControl","Fragment","Marker","LatLng","icon","L","divIcon","html","current","leafletElement","toLocaleString","Polyline","positions","lineCap","dashArray","GeoJSON","connect","store","update_commuter_chart","flows2012_2016","flows2010","nameKey","sortedArray","formattedData","semmcdLookup","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_loop","_iterator","_step","_ref3","flowVal","Array","from","entries","sort","b","slicedToArray","commuterSum","rowWithName","rawName","fallbackRow","cleanName","Symbol","iterator","done","t0","return","finish","slice","update_comparison_chart","_ref4","tableNeededName","datasetOwnName","datasetOwn","flowsNeeded","mcdIDs","incomingData","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_loop2","_iterator2","_step2","incomingDataYear","includes","keys","gVal","k","foundRow","sumVal","_x6","_x7","_x8","_x9","inflowPalette","outflowPalette","secondPalette","CommuterChart","handleOpenDetail","react_apexcharts_min_default","CommuterChart_objectSpread","colors","seriesIndex","plt","w","palette_main","range","palette_secondary","chart","events","dataPointMouseEnter","event","chartContext","config","dataPointIndex","debounced_highlight_feature","dataPointMouseLeave","debounced_remove_highlight_feature","toolbar","tools","download","selection","zoomin","zoomout","pan","reset","customIcons","title","clickedName","legend","formatter","seriesName","opts","height","length","debounce","leading","trailing","guide_next_item","guide_previous_item","guide_skip","Guide","scrollToItem","guide_index","guide_sequence","getElementById","scrollToID","scrollIntoView","behavior","divref","skip","children","Tooltip","innerClassName","placement","tooltipplacement","isOpen","CardHeader","end_index","CardBody","CardTitle","help","ButtonToolbar","ButtonGroup","Button","onClick","guide","DetailCard","detailCardOpen","detailCardIconHover","detailCardMinIconHover","helpTooltipHover","shareTooltipHover","comparisonChart","elem","querySelector","classList","remove","Card","toggle","maximize","bar_chart","tag","minimize","yearData","comparisonDataLoaded","yearArr","yd","sum","toFixed","yearDataInd","outNumber","outPercent","load_main_cache","modules_Guide","load_comparison_cache","charts_CommuterChart","mcdArray","require","loading_search_locations","searchingStr","reg","foundname","RegExp","mcd","exec","nameData","SearchBar","dropdownOpen","prepros","Dropdown","DropdownToggle","placeholder","aria-label","aria-describedby","onChange","DropdownMenu","role","DropdownItem","select_from_id","disabled","searchData","search","ControlPenal","aboutTooltipOpen","aboutOpen","helpTooltipOpen","shareTooltipOpen","info","CardText","help_circle","guide_start","share_2","window","location","modules_searchbar","GuideFixed","loading","viewBox","cx","cy","match","innerWidth","urlparams","URLSearchParams","fluid","modules_Loading","modules_GuideFixed","xmlns","width","strokeWidth","strokeLinecap","strokeLinejoin","points","x1","y1","x2","y2","components_ControlPenal","components_DetailCard","components_Map","App","react","async","src","dangerouslySetInnerHTML","__html","basename","header_Header","react_router","path","exact","component","Dashboard","themes","modern","primary","secondary","tertiary","success","warning","danger","classic","dark","light","initialState","currentTheme","defaultState","plotOptions","bar","barHeight","horizontal","dataLabels","enabled","textAnchor","fontSize","opt","globals","labels","offsetX","dropShadow","top","show","showForSingleSeries","onItemClick","toggleDataSeries","axisBorder","axisTicks","yaxis","tooltip","intersect","shared","x","responsive","breakpoint","series_main","series_comparison","combineReducers","theme","actions","actionType","theme_objectSpread","payload","action","map_objectSpread","colorPalette","xaxisCategory","arr","seriesData","sumData","values","reduce","pre","cur","chart_objectSpread","dataOwnSeriesData","incomingSeriesData","sumIncomingData","toConsumableArray","compareData","search_objectSpread","guide_objectSpread","objectWithoutProperties","createStore","rootReducer","applyMiddleware","dispatch","Boolean","hostname","ReactDOM","es","src_App","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.486a85b9.chunk.js","sourcesContent":["import React, { Component } from \"react\";\nimport { Container, Row, Col } from \"reactstrap\";\nimport { NavLink } from \"react-router-dom\";\nimport \"./header.css\";\n\nexport class Header extends Component {\n render() {\n return (\n \n \n \n \n SEMCOG\n \n \n \n \n \n \n \n Commuting Patterns\n \n \n \n \n \n );\n }\n}\n","export const THEME_TOGGLE = \"THEME_TOGGLE\";\n\nexport const SWITCH_TO_INFLOW = \"SWITCH_TO_INFLOW\";\n\nexport const SWITCH_TO_OUTFLOW = \"SWITCH_TO_OUTFLOW\";\n\nexport const SWITCH_DATASET_TO_2010 = \"SWITCH_DATASET_TO_2010\";\n\nexport const SWITCH_DATASET_TO_2016 = \"SWITCH_DATASET_TO_2016\";\n\nexport const MAP_CLICK = \"MAP_CLICK\";\n\nexport const SET_CLICKED_NAME = \"SET_CLICKED_NAME\";\n\nexport const HIGHLIGHT_FEATURE = \"HIGHLIGHT_FEATURE\";\n\nexport const REMOVE_HIGHLIGHT_FEATURE = \"REMOVE_HIGHLIGHT_FEATURE\";\n\nexport const UPDATE_GEOJSON_LAYER = \"UPDATE_GEOJSON_LAYER\";\n\nexport const INIT_GEOJSON_LAYER = \"INIT_GEOJSON_LAYER\";\n\nexport const UPDATE_COMMUTER_CHART = \"UPDATE_COMMUTER_CHART\";\n\nexport const UPDATE_COMPARISON_CHART = \"UPDATE_COMPARISON_CHART\";\n\nexport const LOAD_COMPARISON_CACHE = \"LOAD_COMPARISON_CACHE\";\n\nexport const LOAD_MAIN_CACHE = \"LOAD_MAIN_CACHE\";\n\n// search\n\nexport const LOADING_SEARCH_LOCATIONS = \"LOADING_SEARCH_LOCATIONS\";\n\nexport const LOADING_SEARCH_ID = \"LOADING_SEARCH_ID\";\n\nexport const SELECT_FROM_ID = \"SELECT_FROM_ID\";\n\n// guide\nexport const GUIDE_NEXT_ITEM = \"GUIDE_NEXT_ITEM\";\n\nexport const GUIDE_PREVIOUS_ITEM = \"GUIDE_PREVIOUS_ITEM\";\n\nexport const GUIDE_SKIP = \"GUIDE_SKIP\";\n\nexport const GUIDE_START = \"GUIDE_START\";\n\n//loading\nexport const LOADING_START = \"LOADING_START\";\n\nexport const LOADING_END = \"LOADING_END\";\n","import * as d3scale from \"d3-scale\";\nimport scaleCluster from \"d3-scale-cluster\";\nimport { saveAs } from \"file-saver\";\nimport Papa from \"papaparse\";\n\nexport const palette = (min, max, colors) => {\n var d = (max - min) / 10;\n return d3scale\n .scaleSqrt()\n .range(colors)\n .domain([\n min + d * 1,\n min + d * 2,\n min + d * 3,\n min + d * 4,\n min + d * 5,\n min + d * 6,\n min + d * 7,\n min + d * 8,\n min + d * 9\n ]);\n};\n\n// https://github.com/schnerd/d3-scale-cluster\nexport const cluster_palette = data => scaleCluster().domain(data);\n\nexport const copyToClipboard = str => {\n const el = document.createElement(\"textarea\");\n el.value = str;\n el.setAttribute(\"readonly\", \"\");\n el.style.position = \"absolute\";\n el.style.left = \"-9999px\";\n document.body.appendChild(el);\n el.select();\n document.execCommand(\"copy\");\n document.body.removeChild(el);\n return null;\n};\n\nexport const paletteOmitFirstValue = (array, plt) =>\n array.map((val, ind, arr) => {\n const localPlt = palette(\n 0,\n Math.max(...array.splice(1)), // drop outRegion or outState value\n plt\n );\n if (ind === 0) {\n return localPlt(arr[1]);\n } else {\n return localPlt(val);\n }\n });\n\nexport const download_from_series = (options, series, fileName, source) => {\n const xaxis_list = options.xaxis.categories;\n // **This function only works for specify format of json**\n let csv =\n source +\n \" Note: Some data do not perfectly match the original source due to the data preparation process.\" +\n \",\";\n // Add header , year\n const header = series.map(serie => serie.name);\n const data = series.map(serie => serie.data);\n\n let rows_header = xaxis_list;\n let cols_header = header;\n rows_header.map((val, ind) => {\n ind !== 0 && (csv += \",\");\n csv += val;\n return null;\n });\n csv += \"\\r\\n\";\n cols_header.map((h, ind) => {\n csv += h.replace(\",\", \" \") + \",\";\n data[ind].map((d, indd) => {\n indd !== 0 && (csv += \",\");\n csv += d;\n return null;\n });\n csv += \"\\r\\n\";\n return null;\n });\n const fileType = \"text/csv\";\n const fileExtension = \".csv\";\n const blobdata = new Blob([csv], { type: fileType });\n saveAs(blobdata, fileName + fileExtension);\n};\n\n/**\n * validate_semmcd\n * Loads a local GeoJSON boundary file and checks if `semmcd` exists.\n * @param {number} semmcd - The numeric semmcd identifier to validate\n * @param {string} mcdboundary - The boundary name (if you have multiple files)\n * @returns {Promise} Whether semmcd exists in boundary\n */\nexport async function validate_semmcd(semmcd, mcdboundary) {\n // 1) Fetch the local GeoJSON file (adjust path as needed).\n // If you have multiple boundary files, choose one based on `mcdboundary`.\n const response = await fetch(\"/CommutingPatterns/data/communities_combined.geojson\");\n const boundaryGeoJson = await response.json();\n\n // 2) Check if any feature has the given `semmcd` in its properties.\n const found = boundaryGeoJson.features.some(feature => {\n return feature.properties && feature.properties.semmcd === semmcd;\n });\n\n return found;\n}\n\nexport const clean_mcd_name = name => {\n const cleanname = name.split(\"(\")[0].trim();\n // Special case: two\tBerlin Twp with same names\n if (cleanname === \"Berlin Twp\") {\n return name;\n } else {\n return cleanname;\n }\n};\n\nexport async function parseCsvFile(url) {\n // if (process.env.NODE_ENV === \"production\") {\n // url += \"/CommutingPatterns\"\n // }\n // console.log(process.env.NODE_ENV, url);\n const response = await fetch(url);\n const csvText = await response.text();\n\n return new Promise((resolve, reject) => {\n Papa.parse(csvText, {\n header: true, // So Papa returns objects (vs arrays of columns)\n dynamicTyping: true, // Attempt to convert numeric strings, etc.\n complete: (results) => {\n resolve(results.data);\n },\n error: (err) => {\n reject(err);\n }\n });\n });\n}\n","import {\n MAP_CLICK,\n SET_CLICKED_NAME,\n HIGHLIGHT_FEATURE,\n REMOVE_HIGHLIGHT_FEATURE,\n UPDATE_GEOJSON_LAYER,\n INIT_GEOJSON_LAYER,\n SWITCH_TO_INFLOW,\n SWITCH_TO_OUTFLOW,\n SELECT_FROM_ID,\n SWITCH_DATASET_TO_2010,\n SWITCH_DATASET_TO_2016\n} from \"./actionType\";\nimport * as Core from \"../../components/types/core\";\nimport { parseCsvFile } from \"../utils\";\n\nexport const handleMapClick = (semmcd: Core.mcd) => {\n return {\n type: MAP_CLICK,\n semmcd\n };\n};\n\nexport const set_clicked_name = (name: string) => ({\n type: SET_CLICKED_NAME,\n name\n});\n\nexport const highlight_feature = (name: string) => {\n return {\n type: HIGHLIGHT_FEATURE,\n name\n };\n};\n\nexport const remove_highlight_feature = () => {\n return {\n type: REMOVE_HIGHLIGHT_FEATURE\n };\n};\n\n/**\n * `update_geojson_layer` uses local GeoJSON + local CSV\n */\nexport const update_geojson_layer = async (\n semmcd: Core.mcd,\n mode: Core.Mode,\n mcdboundary: string, // Not used in the fetch URL now; we load a static file\n flow: Core.Flow\n): Promise<{\n type: \"UPDATE_GEOJSON_LAYER\";\n geojson: Core.GeoJSONType;\n sumTraffic: number;\n flowData: number[];\n}> => {\n // 1) Load local GeoJSON boundary (e.g., /public/data/communities_combined.geojson)\n // @ts-ignore\n const boundaryGeoJson: Core.GeoJSONType = await fetch(\"/CommutingPatterns/data/communities_combined.geojson\").then(r => r.json());\n\n // 2) Load local flows CSV. If multiple flow files exist, choose one by `flow`,\n // or read them all. For simplicity, we show just 2012_2016 here.\n console.log(process.env.NODE_ENV,);\n // @ts-ignore\n const flows = await parseCsvFile(\"/CommutingPatterns/data/semcogmcdflows_2012_2016.csv\");\n\n // 3) Filter flows where inboundKey = semmcd\n const inboundKey = (mode === \"inflow\") ? \"wrksemmcd\" : \"ressemmcd\";\n const groupByKey = (mode === \"inflow\") ? \"ressemmcd\" : \"wrksemmcd\";\n\n // @ts-ignore\n const filtered = flows.filter(row => row[inboundKey] === semmcd);\n\n // 4) Group commuterflow by `groupByKey`. \n // For example, if inflow, group by row.ressemmcd\n const sumsMap = new Map();\n // @ts-ignore\n filtered.forEach(row => {\n // @ts-ignore\n const groupVal = row[groupByKey];\n const cflow = row.commuterflow || 0;\n sumsMap.set(groupVal, (sumsMap.get(groupVal) || 0) + cflow);\n });\n\n // 5) Attach sums to each boundary feature where feature.properties.semmcd = groupVal\n let sumTraffic = 0;\n const flowData: number[] = [];\n\n // @ts-ignore\n boundaryGeoJson.features.forEach(feature => {\n // @ts-ignore\n const boundarySemmcd = feature.properties.semmcd as number;\n const commuterflow = sumsMap.get(boundarySemmcd) || 0;\n // Attach commuterflow\n feature.properties.commuterflow = commuterflow;\n // For summation\n sumTraffic += commuterflow;\n flowData.push(commuterflow);\n });\n\n return {\n type: UPDATE_GEOJSON_LAYER,\n geojson: boundaryGeoJson,\n sumTraffic,\n flowData\n };\n};\n\n/**\n * `init_geojson_layer` loads your boundary GeoJSON from a local file\n * (instead of from Carto).\n */\nexport const init_geojson_layer = async (\n mcdboundary: string\n): Promise<{\n type: \"INIT_GEOJSON_LAYER\";\n geojson: Core.GeoJSONType;\n}> => {\n // @ts-ignore\n const geojson: Core.GeoJSONType = await fetch(\"/CommutingPatterns/data/communities_combined.geojson\").then(r => r.json());\n\n return {\n type: INIT_GEOJSON_LAYER,\n geojson\n };\n};\nexport const switch_to_inflow = () => ({\n type: SWITCH_TO_INFLOW\n});\n\nexport const switch_to_outflow = () => ({\n type: SWITCH_TO_OUTFLOW\n});\n\nexport const switch_dataset_to_2010 = () => ({\n type: SWITCH_DATASET_TO_2010\n});\n\nexport const switch_dataset_to_2016 = () => ({\n type: SWITCH_DATASET_TO_2016\n});\n\nexport const select_from_id = (id: Core.mcd) => ({\n type: SELECT_FROM_ID,\n id\n});\n","///\n\nimport React, { RefObject } from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n Map,\n LayerGroup,\n TileLayer,\n GeoJSON,\n Pane,\n Polyline,\n Marker,\n ScaleControl,\n ZoomControl,\n LayersControl\n} from \"react-leaflet\";\nimport L, {\n Path,\n LatLng,\n StyleFunction,\n PathOptions,\n GeoJSONOptions\n} from \"leaflet\";\nimport centroid from \"@turf/centroid\";\nimport bearing from \"@turf/bearing\";\nimport { point, Geometry } from \"@turf/helpers\";\nimport * as Core from \"./types/core\";\nimport * as geojson from \"geojson\";\n\nimport {\n handleMapClick,\n update_geojson_layer,\n init_geojson_layer,\n set_clicked_name,\n switch_to_inflow,\n switch_to_outflow,\n switch_dataset_to_2016,\n switch_dataset_to_2010,\n remove_highlight_feature\n} from \"../redux/actions/map\";\nimport { loading_start, loading_end } from \"../redux/actions/loading\";\nimport { validate_semmcd } from \"../redux/utils\";\nimport { match } from \"react-router-dom\";\nimport * as H from \"history\";\nimport { GeoJSONType, Store } from \"./types/core\";\nimport { Action } from \"redux\";\n\nconst mapbox_key = process.env.REACT_APP_MAPBOX_KEY;\n\ninterface mapProps {\n match: match;\n history: H.History;\n semmcd: number;\n direction: string;\n year: number;\n handleMapClick(semmcd: Core.mcd): Action;\n update_geojson_layer(\n clickedID: Core.mcd,\n mode: Core.Mode,\n mcdboundary: string,\n flow: Core.Flow\n ): Promise;\n init_geojson_layer(mcdboundary: string): Promise;\n set_clicked_name(mcdname: string): Action;\n switch_to_inflow(): Action;\n switch_to_outflow(): Action;\n switch_dataset_to_2016(): Action;\n switch_dataset_to_2010(): Action;\n remove_highlight_feature(): Action;\n loading_start(): Action;\n loading_end(): Action;\n mcdboundary: string;\n flow: Core.Flow;\n mode: Core.Mode;\n clickedID: Core.mcd;\n highlightedName?: string;\n geojson?: GeoJSONType;\n palette?: (commuterflow: number) => string;\n start: boolean;\n}\n\ninterface geoJSONObj extends GeoJSONOptions {\n key: number;\n style: StyleFunction | PathOptions;\n data: Core.GeoJSONType;\n}\n\ninterface mapStates {\n lng: number; // Map initial center viewport\n lat: number;\n zoom: number; // initial zoom level\n arrowAngle: number;\n highlight: boolean;\n highlightLng: number; // Initialize highlight mcd position\n highlightLat: number;\n hover: boolean; // Initialize hover properties\n hightlightName?: string; // .. hover mcd name\n highlightFlow: number; // .. hover mcd value\n geoJSONkey: number; // Used as 'key' property for react-leaflet React Object\n // when update geojosn, it auto-increase by 1.\n geoJSONObj: geoJSONObj;\n}\n\nclass MapView extends React.Component {\n map_ref: RefObject = React.createRef();\n state = {\n lng: -83.27627, // Map initial center viewport\n lat: 42.396688,\n zoom: 9, // initial zoom level\n arrowAngle: 0.0,\n highlight: false,\n highlightLng: -83.27627, // Initialize highlight mcd position\n highlightLat: 42.396688,\n hover: false, // Initialize hover properties\n hightlightName: undefined, // .. hover mcd name\n highlightFlow: 0.0, // .. hover mcd value\n geoJSONkey: 0.0, // Used as 'key' property for react-leaflet React Object\n // when update geojosn, it auto-increase by 1.\n geoJSONObj: {\n // Used as properties for react-leaflet React Object\n key: 0.0,\n data: { type: \"MultiPolygon\" as geojson.GeoJsonTypes },\n style: (\n feature?: geojson.Feature\n ) => {\n //https://leafletjs.com/reference-1.5.0.html#path\n return {\n stroke: true,\n color: \"#9e9e9e\",\n weight: 1,\n opacity: 1,\n fill: true,\n fillColor: \"#f00\",\n fillOpacity: 0\n };\n },\n onEachFeature: (\n feature: geojson.Feature,\n layer: Path\n ) => {\n const semmcd = feature.properties.semmcd;\n layer.on({\n click: _ => {\n this.props.handleMapClick(semmcd);\n },\n mouseover: _ => {\n const hoverCenter = centroid(feature.geometry as Geometry);\n if (\n feature.properties.commuterflow &&\n feature.properties.semmcd !== this.props.clickedID\n ) {\n this.setState({\n hover: true,\n hightlightName: feature.properties.name,\n highlightFlow: feature.properties.commuterflow,\n // Add arrow\n highlight: true,\n highlightLat: hoverCenter.geometry.coordinates[1],\n highlightLng: hoverCenter.geometry.coordinates[0],\n arrowAngle: bearing(\n point([this.state.lng, this.state.lat]),\n point([\n hoverCenter.geometry.coordinates[0],\n hoverCenter.geometry.coordinates[1]\n ])\n )\n });\n }\n },\n mouseout: _ => {\n semmcd !== this.props.clickedID &&\n layer.setStyle({\n color: \"#9e9e9e\"\n });\n this.setState({\n // remove hover\n hover: false,\n highlight: false,\n hightlightName: undefined\n });\n // remove arrow from the map\n //this.props.remove_highlight_feature();\n }\n });\n }\n }\n };\n\n componentDidMount = () => {\n const { mcdboundary } = this.props;\n this.props.loading_start();\n this.props\n .init_geojson_layer(mcdboundary)\n .then(() => {\n if (!this.props.geojson) {\n return;\n }\n this.setState({\n geoJSONkey: this.state.geoJSONkey + 1,\n geoJSONObj: {\n ...this.state.geoJSONObj,\n key: this.state.geoJSONkey,\n data: this.props.geojson\n }\n });\n })\n .then(() => {\n // Acquire url parameters\n const semmcd = this.props.semmcd;\n const direction = this.props.direction;\n const year = this.props.year;\n if (\n typeof Number(semmcd) === \"number\" &&\n Number(semmcd) !== 0 &&\n !isNaN(Number(semmcd))\n ) {\n validate_semmcd(Number(semmcd), this.props.mcdboundary).then(res =>\n res\n ? this.props.handleMapClick(Number(semmcd))\n : this.props.handleMapClick(5)\n );\n } else {\n // start from detroit as default\n this.props.handleMapClick(5);\n }\n direction === \"inflow\" && this.props.switch_to_inflow();\n direction === \"outflow\" && this.props.switch_to_outflow();\n year === 2010 && this.props.switch_dataset_to_2010();\n year === 2016 && this.props.switch_dataset_to_2016();\n })\n .finally(() => this.props.loading_end());\n };\n\n componentDidUpdate = (prevProps: mapProps) => {\n if (\n this.props.geojson &&\n this.props.clickedID !== 0 &&\n (this.props.clickedID !== prevProps.clickedID ||\n this.props.mode !== prevProps.mode ||\n this.props.flow !== prevProps.flow)\n ) {\n this.props.loading_start();\n const { clickedID, mcdboundary, flow, mode } = this.props;\n // clean up flow line\n this.setState({\n hover: false,\n highlight: false,\n hightlightName: undefined\n });\n this.props.remove_highlight_feature();\n // reset center coordinate of clicked feature\n const features = this.props.geojson.features;\n let clickedFeature;\n if (features) {\n clickedFeature = features.find(f => f.properties.semmcd === clickedID);\n }\n if (clickedFeature !== undefined) {\n // not zoom in and center when selecting mcd\n const center = centroid(clickedFeature.geometry);\n this.setState({\n lng: center.geometry.coordinates[0],\n lat: center.geometry.coordinates[1]\n //zoom: 10 //no zoom in\n });\n this.props.history.push(\n `/?semmcd=${clickedID}&direction=${mode}&year=${\n flow === \"semcogmcdflows_2010\" ? \"2010\" : \"2016\"\n }`\n );\n this.props\n .update_geojson_layer(clickedID, mode, mcdboundary, flow)\n .then(() => this.handlePaletteChange())\n .catch(e => console.error(e))\n .finally(() => this.props.loading_end());\n }\n } else if (\n // highlight\n this.props.geojson &&\n this.props.highlightedName !== prevProps.highlightedName\n ) {\n if (!this.props.highlightedName) {\n return;\n }\n const features = this.props.geojson.features;\n let highlightFeature;\n if (features) {\n highlightFeature = features.find(\n f => f.properties.name === this.props.highlightedName\n );\n }\n if (typeof highlightFeature !== \"undefined\") {\n const hightlightCenter = centroid(highlightFeature.geometry);\n const highlightFlow: number =\n highlightFeature.properties.commuterflow || 0.0;\n this.setState({\n hover: true,\n hightlightName: highlightFeature.properties.name,\n highlightFlow: highlightFlow,\n // Add arrow\n highlight: true,\n highlightLat: hightlightCenter.geometry.coordinates[1],\n highlightLng: hightlightCenter.geometry.coordinates[0],\n arrowAngle: bearing(\n point([this.state.lng, this.state.lat]),\n point([\n hightlightCenter.geometry.coordinates[0],\n hightlightCenter.geometry.coordinates[1]\n ])\n )\n });\n }\n }\n };\n\n handlePaletteChange = () => {\n if (!this.props.geojson) {\n return;\n }\n this.setState({\n geoJSONkey: this.state.geoJSONkey + 1,\n geoJSONObj: {\n ...this.state.geoJSONObj,\n key: this.state.geoJSONkey,\n data: this.props.geojson,\n style: (\n feature?: geojson.Feature\n ) => {\n if (!feature) {\n // if feature is undefined\n return {}; // return empty PathOptions\n }\n\n if (\n feature.properties.semmcd !== this.props.clickedID &&\n !feature.properties.commuterflow\n ) {\n return {\n stroke: true,\n color: \"#9e9e9e\",\n weight: 1,\n opacity: 0.8,\n fill: true,\n fillOpacity: 0\n };\n }\n\n // record name of the mcd\n if (feature.properties.semmcd + \"\" === this.props.clickedID + \"\") {\n this.props.set_clicked_name(feature.properties.name);\n return {\n stroke: true,\n color: \"#9e9e9e\",\n weight: 1,\n opacity: 1,\n fill: true,\n fillColor: \"#FFF959\",\n fillOpacity: 0.8\n };\n } else {\n if (!this.props.palette || !feature.properties.commuterflow) {\n return {}; // return nothing if palette undefine\n }\n const fillColor = this.props.palette(\n feature.properties.commuterflow\n );\n return {\n stroke: true,\n color: \"#9e9e9e\",\n weight: 1,\n opacity: 0.8,\n fill: true,\n fillColor: fillColor,\n fillOpacity: 0.8\n };\n // }\n }\n }\n }\n });\n };\n\n render = () => {\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {this.state.highlight && (\n <>\n \n ${\n (this.map_ref.current.leafletElement[\n \"_zoom\"\n ] as number) < 11\n ? `\n

\n ${this.state.hightlightName}\n

`\n : \"\"\n }\n

${this.state.highlightFlow.toLocaleString()}

\n `\n })}\n />\n \n )}\n
\n \n {this.state.highlight && (\n <>\n
`\n })}\n />\n \n )\n \n )}\n
\n
\n \n \n {(() => {\n const features = (this.state.geoJSONObj.data as Core.GeoJSONType)\n .features;\n if (features) {\n return (\n \n );\n } else {\n return null;\n }\n })()}\n \n \n \n );\n };\n}\n\nexport default connect(\n (store: Store) => ({\n mcdboundary: store.map.mcdboundary,\n flow: store.map.flow,\n mode: store.map.mode,\n clickedID: store.map.clickedID,\n highlightedName: store.map.highlightedName,\n geojson: store.map.geojson,\n palette: store.map.palette\n }),\n {\n handleMapClick,\n update_geojson_layer,\n init_geojson_layer,\n set_clicked_name,\n switch_to_inflow,\n switch_to_outflow,\n switch_dataset_to_2016,\n switch_dataset_to_2010,\n remove_highlight_feature,\n loading_start,\n loading_end\n }\n)(MapView);\n","import { LOADING_START, LOADING_END } from \"./actionType\";\n\nexport const loading_start = () => ({\n type: LOADING_START\n});\n\nexport const loading_end = () => ({\n type: LOADING_END\n});\n","import {\n UPDATE_COMMUTER_CHART,\n UPDATE_COMPARISON_CHART,\n LOAD_COMPARISON_CACHE,\n LOAD_MAIN_CACHE\n} from \"./actionType\";\nimport { clean_mcd_name, parseCsvFile } from \"../utils\";\nimport * as Core from \"../../components/types/core\";\n\nexport const update_commuter_chart = async (\n semmcd: Core.mcd,\n mode: Core.Mode,\n flow: Core.Flow\n): Promise<{\n type: \"UPDATE_COMMUTER_CHART\";\n data: Core.chartDataType;\n semmcdLookup: Core.semmcdLookup;\n clickedID: Core.clickedID;\n year: string;\n}> => {\n // Load CSV from /public/data/...\n const flows2012_2016 = await parseCsvFile(\"/CommutingPatterns/data/semcogmcdflows_2012_2016.csv\");\n const flows2010 = await parseCsvFile(\"/CommutingPatterns/data/semcogmcdflows_2010.csv\");\n\n // Decide which columns to filter/group by, based on \"inflow\" vs \"outflow\"\n // If inflow, inboundKey = wrksemmcd; groupByKey = ressemmcd; nameKey = resmcdname\n // If outflow, inboundKey = ressemmcd; groupByKey = wrksemmcd; nameKey = wrkmcdname\n const inboundKey = (mode === \"inflow\") ? \"wrksemmcd\" : \"ressemmcd\";\n const groupByKey = (mode === \"inflow\") ? \"ressemmcd\" : \"wrksemmcd\";\n const nameKey = (mode === \"inflow\") ? \"resmcdname\" : \"wrkmcdname\";\n\n // Filter rows so inboundKey matches semmcd\n // Removed `row.flow_table_name === flow` because your CSV doesn't have that column\n // @ts-ignore\n const filtered = flows2012_2016.filter(row =>\n row[inboundKey] === semmcd\n );\n\n // Aggregate commuterflow by groupByKey\n const sumsMap = new Map();\n // @ts-ignore\n filtered.forEach(row => {\n const groupVal = row[groupByKey];\n const flowVal = row.commuterflow || 0;\n sumsMap.set(groupVal, (sumsMap.get(groupVal) || 0) + flowVal);\n });\n\n // Sort descending by commuterflow\n const sortedArray = Array.from(sumsMap.entries())\n .sort((a, b) => b[1] - a[1]);\n\n // Build final data\n const formattedData = new Map();\n const semmcdLookup = new Map();\n\n for (const [groupVal, commuterSum] of sortedArray) {\n // find row to get the name from\n // @ts-ignore\n const rowWithName = filtered.find(r => r[groupByKey] === groupVal);\n if (!rowWithName) continue;\n\n let rawName = rowWithName[nameKey];\n\n // If missing, fallback to flows2010\n if (!rawName) {\n // @ts-ignore\n const fallbackRow = flows2010.find(r => r[groupByKey] === groupVal);\n if (fallbackRow) {\n rawName = fallbackRow[nameKey];\n }\n }\n\n const cleanName = clean_mcd_name(rawName);\n if (cleanName) {\n formattedData.set(cleanName, commuterSum);\n semmcdLookup.set(groupVal, cleanName);\n }\n }\n\n return {\n type: UPDATE_COMMUTER_CHART,\n data: formattedData,\n semmcdLookup,\n clickedID: semmcd,\n // Keep this if you need the year from the \"flow\" string\n // (e.g. \"semcogmcdflows_2016\" -> \"2016\")\n year: flow.slice(-4),\n };\n};\n\nexport const update_comparison_chart = async (\n tableNeededName: Core.Flow,\n datasetOwnName: Core.Flow,\n datasetOwn: Core.chartDataType,\n semmcdLookup: Core.semmcdLookup,\n semmcd: Core.mcd,\n mode: Core.Mode\n): Promise<{\n type: \"UPDATE_COMPARISON_CHART\";\n incomingDataYear: string[];\n datasetOwn: Core.chartDataType;\n incomingData: Core.chartDataType;\n clickedID: Core.clickedID;\n}> => {\n // 1) Load both CSV files from /public/data/...\n // Then decide which dataset to use based on the table name.\n // (Adjust if you have more tables or a different naming convention.)\n // @ts-ignore\n const flows2012_2016 = await parseCsvFile(\"/CommutingPatterns/data/semcogmcdflows_2012_2016.csv\");\n // @ts-ignore\n const flows2010 = await parseCsvFile(\"/CommutingPatterns/data/semcogmcdflows_2010.csv\");\n\n let flowsNeeded;\n if (tableNeededName.includes(\"2010\")) {\n flowsNeeded = flows2010;\n } else {\n flowsNeeded = flows2012_2016;\n }\n\n // 2) Decide columns for inbound/outbound logic\n const inboundKey = (mode === \"inflow\") ? \"wrksemmcd\" : \"ressemmcd\";\n const groupByKey = (mode === \"inflow\") ? \"ressemmcd\" : \"wrksemmcd\";\n const nameKey = (mode === \"inflow\") ? \"resmcdname\" : \"wrkmcdname\";\n\n // 3) We only care about the MCD IDs in semmcdLookup\n const mcdIDs = Array.from(semmcdLookup.keys());\n\n // Filter rows where inboundKey = semmcd AND groupByKey is in mcdIDs\n // @ts-ignore\n const filtered = flowsNeeded.filter(row => {\n // @ts-ignore\n return row[inboundKey] === semmcd && mcdIDs.includes(row[groupByKey]);\n });\n\n // 4) Aggregate commuterflow by groupByKey (similar to SQL GROUP BY)\n const sumsMap = new Map();\n // @ts-ignore\n filtered.forEach(row => {\n // @ts-ignore\n const gVal = row[groupByKey];\n // @ts-ignore\n const cflow = row.commuterflow || 0;\n sumsMap.set(gVal, (sumsMap.get(gVal) || 0) + cflow);\n });\n\n // 5) Build incomingData by matching datasetOwn’s MCD names \n // to the aggregated sums in sumsMap.\n const incomingData: Core.chartDataType = new Map();\n // @ts-ignore\n for (let k of datasetOwn.keys()) {\n // Find a row whose nameKey, after clean_mcd_name, matches k\n // @ts-ignore\n const foundRow = filtered.find(r => clean_mcd_name(r[nameKey]) === k);\n if (!foundRow) {\n // If not found, set commuterflow = 0\n incomingData.set(k, 0);\n } else {\n // Otherwise, pull the sum from sumsMap\n // @ts-ignore\n const groupVal = foundRow[groupByKey];\n const sumVal = sumsMap.get(groupVal) || 0;\n incomingData.set(k, sumVal);\n }\n }\n\n // 6) The year is based on the tableNeededName suffix\n const incomingDataYear = [tableNeededName.slice(-4)];\n\n return {\n type: UPDATE_COMPARISON_CHART,\n clickedID: semmcd,\n datasetOwn,\n incomingDataYear,\n incomingData\n };\n};\nexport const load_comparison_cache = () => ({\n type: LOAD_COMPARISON_CACHE\n});\n\nexport const load_main_cache = () => ({\n type: LOAD_MAIN_CACHE\n});\n","import { ApexOptions } from \"apexcharts\";\n\nexport const inflowPalette = [\n \"#aee2e4\",\n \"#8ac6cb\",\n \"#67a9b6\",\n \"#4d8ca2\",\n \"#37708c\"\n];\nexport const outflowPalette = [\n \"#a0ddae\",\n \"#78c39a\",\n \"#54a98a\",\n \"#3f8d7f\",\n \"#2d7174\"\n];\nexport const secondPalette = [\n \"#f8f8f1\",\n \"#d5d5d0\",\n \"#b4b4b0\",\n \"#939391\",\n \"#747474\"\n];\nexport const commuterChartOptions: ApexOptions = {\n plotOptions: {\n bar: {\n barHeight: \"100%\",\n horizontal: true,\n dataLabels: {\n position: \"bottom\"\n }\n }\n },\n dataLabels: {\n enabled: true,\n textAnchor: \"start\",\n style: {\n fontSize: \"15px\",\n colors: [\"#2e2e2e\"]\n },\n formatter: function(val, opt) {\n return (\n opt.w.globals.labels[opt.dataPointIndex] + \": \" + val.toLocaleString()\n );\n },\n offsetX: 0,\n dropShadow: {\n enabled: true,\n top: 1,\n left: 1,\n opacity: 0.2,\n }\n },\n legend: {\n show: true,\n showForSingleSeries: true,\n position: \"top\",\n onItemClick: {\n toggleDataSeries: false\n }\n },\n\n stroke: {\n width: 1,\n colors: [\"#fff\"]\n },\n xaxis: {\n categories: [],\n labels: { show: false },\n axisBorder: { show: false },\n axisTicks: { show: false }\n },\n yaxis: {\n show: false,\n labels: {\n show: false\n },\n axisTicks: {\n show: false\n }\n },\n tooltip: {\n enabled: true,\n intersect: true,\n shared: false,\n x: {\n show: false\n }\n },\n responsive: [\n {\n breakpoint: 576,\n options: {\n dataLabels: {\n dropShadow: {\n enabled: false\n }\n }\n }\n }\n ]\n};\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport debounce from \"lodash.debounce\";\nimport { update_commuter_chart } from \"../../redux/actions/chart\";\nimport {\n highlight_feature,\n remove_highlight_feature\n} from \"../../redux/actions/map\";\nimport {\n inflowPalette,\n outflowPalette,\n secondPalette\n} from \"../../redux/constants\";\nimport ReactApexChart from \"react-apexcharts\";\n\nimport { Col, Row } from \"reactstrap\";\nimport { download_from_series } from \"../../redux/utils\";\nimport { ApexOptions } from \"apexcharts\";\nimport * as Core from \"../types/core\";\n\ninterface CommuteChartProps {\n clickedID: string | number;\n clickedName: string;\n mode: \"inflow\" | \"outflow\";\n flow: \"semcogmcdflows_2012_2016\" | \"semcogmcdflows_2010\";\n /*palette: store.map.palette,*/\n palette_main: Core.palette;\n palette_secondary: Core.palette;\n options: ApexOptions;\n series: ApexAxisChartSeries;\n handleOpenDetail: Function; // from parent\n update_commuter_chart: Function;\n debounced_highlight_feature: Function;\n debounced_remove_highlight_feature: Function;\n}\n\nclass CommuterChart extends React.Component {\n componentDidUpdate = (prevProps: CommuteChartProps) => {\n if (\n (this.props.clickedID !== prevProps.clickedID ||\n this.props.mode !== prevProps.mode ||\n this.props.flow !== prevProps.flow) &&\n this.props.clickedID !== 0\n ) {\n this.props.handleOpenDetail();\n this.props.update_commuter_chart(\n this.props.clickedID,\n this.props.mode,\n this.props.flow\n );\n }\n };\n render = () => (\n <>\n \n \n {\n let plt =\n this.props.mode === \"inflow\"\n ? this.props.palette_main.range(inflowPalette)\n : this.props.palette_main.range(outflowPalette);\n plt =\n seriesIndex === 0\n ? plt\n : this.props.palette_secondary.range(secondPalette);\n return plt(value);\n }\n ],\n chart: {\n ...this.props.options.chart,\n events: {\n dataPointMouseEnter: (\n event: any,\n chartContext: any,\n config: any\n ) => {\n const name =\n config.w.config.xaxis.categories[config.dataPointIndex];\n this.props.debounced_highlight_feature(name);\n },\n dataPointMouseLeave: () => {\n this.props.debounced_remove_highlight_feature();\n }\n },\n toolbar: {\n tools: {\n download: false,\n selection: false,\n zoom: false,\n zoomin: false,\n zoomout: false,\n pan: false,\n reset: false,\n customIcons: [\n {\n icon: ``,\n title: \"Download data\",\n click: () => {\n download_from_series(\n this.props.options,\n this.props.series,\n \"CommutePattern_\" +\n this.props.clickedName +\n \"_\" +\n this.props.mode,\n \"Census CTPP dataset; SEMCOG Analysis\"\n );\n }\n }\n ]\n }\n }\n },\n legend: {\n ...this.props.options.legend,\n formatter: (seriesName: string, opts: any) => {\n if (\n seriesName === \"Commuter Flow\" ||\n opts.seriesIndex === 0\n ) {\n return `
\n     \n
${seriesName} ${\n this.props.mode === \"outflow\" ? \"outflow\" : \"inflow\"\n }`;\n } else {\n return `
\n     \n
${seriesName} ${\n this.props.mode === \"outflow\" ? \"outflow\" : \"inflow\"\n }`;\n }\n }\n }\n }}\n series={this.props.series}\n type=\"bar\"\n height={\n this.props.series[0]\n ? (this.props.series[0].data.length + 1) * 50\n : 500\n }\n />\n \n
\n \n );\n}\n\nexport default connect(\n (store: Core.Store) => ({\n clickedID: store.map.clickedID,\n clickedName: store.map.clickedName,\n mode: store.map.mode,\n flow: store.map.flow,\n palette_main: store.chart.palette_main,\n palette_secondary: store.chart.palette_secondary,\n options: store.chart.options,\n series: store.chart.series\n }),\n {\n update_commuter_chart,\n debounced_highlight_feature: debounce(highlight_feature, 100, {\n leading: true,\n trailing: true\n }),\n debounced_remove_highlight_feature: debounce(\n remove_highlight_feature,\n 100,\n { leading: true, trailing: true }\n )\n }\n)(CommuterChart);\n","import {\n GUIDE_SKIP,\n GUIDE_PREVIOUS_ITEM,\n GUIDE_NEXT_ITEM,\n GUIDE_START\n} from \"./actionType\";\n\nexport const guide_next_item = () => ({\n type: GUIDE_NEXT_ITEM\n});\n\nexport const guide_previous_item = () => ({\n type: GUIDE_PREVIOUS_ITEM\n});\n\nexport const guide_skip = () => ({\n type: GUIDE_SKIP\n});\n\nexport const guide_start = () => ({\n type: GUIDE_START\n});\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n Tooltip,\n Button,\n ButtonToolbar,\n ButtonGroup,\n CardHeader,\n CardTitle,\n CardBody\n} from \"reactstrap\";\nimport {\n guide_next_item,\n guide_previous_item,\n guide_skip\n} from \"../../redux/actions/guide\";\nimport \"./guide.css\";\n\nclass Guide extends React.Component {\n componentDidUpdate = prevProps => {\n if (\n this.props.scrollToItem &&\n this.props.guide_index === this.props.guide_sequence\n ) {\n const ele = document.getElementById(this.props.scrollToID);\n ele.scrollIntoView(true, { behavior: \"smooth\" });\n }\n };\n divref = React.createRef();\n render = () => (\n <>\n {!this.props.skip &&\n this.props.guide_index === this.props.guide_sequence && (\n
\n )}\n \n {this.props.children}\n \n {!this.props.skip && (\n \n \n User Guide{\" \"}\n \n {this.props.guide_index + 1}/{this.props.end_index + 1}\n {\" \"}\n \n \n \n {this.props.help}\n \n \n \n this.props.guide_skip()}\n >\n Skip\n \n \n \n this.props.guide_previous_item()}\n >\n Previous\n \n this.props.guide_next_item()}\n >\n Next\n \n \n \n \n \n )}\n \n );\n}\n\nexport default connect(\n store => ({\n guide_index: store.guide.guide_index,\n end_index: store.guide.end_index,\n skip: store.guide.skip\n }),\n {\n guide_next_item,\n guide_previous_item,\n guide_skip\n }\n)(Guide);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n Row,\n Col,\n Container,\n Card,\n CardHeader,\n CardBody,\n CardTitle,\n Tooltip, //https://reactstrap.github.io/components/tooltips/\n ButtonGroup,\n Button\n} from \"reactstrap\";\nimport { Minimize, Maximize, BarChart } from \"react-feather\";\n\nimport CommuterChart from \"./charts/CommuterChart\";\nimport Guide from \"./modules/Guide\";\n\nimport {\n update_comparison_chart,\n load_comparison_cache,\n load_main_cache\n} from \"../redux/actions/chart\";\nimport { match } from \"react-router-dom\";\nimport * as H from \"history\";\nimport * as Core from \"./types/core\";\n\ninterface DetailCardProps {\n match: match;\n history: H.History;\n clickedID: Core.clickedID;\n clickedName: string;\n mode: Core.Mode;\n flow: Core.Flow;\n // chart\n semmcdLookup: Core.semmcdLookup;\n yearArr: Core.ChartYear;\n yearData: Core.ChartYearData;\n comparisonDataLoaded: boolean;\n update_comparison_chart: Function;\n load_comparison_cache: Function;\n load_main_cache: Function;\n}\n\ninterface DetailCardStates {\n detailCardOpen: boolean;\n detailCardIconHover: boolean;\n detailCardMinIconHover: boolean;\n helpTooltipHover: boolean;\n shareTooltipHover: boolean;\n comparisonChart: boolean;\n}\n\nclass DetailCard extends React.Component {\n state = {\n detailCardOpen: false,\n detailCardIconHover: false,\n detailCardMinIconHover: false,\n helpTooltipHover: false,\n shareTooltipHover: false,\n comparisonChart: false\n };\n handleOpenDetail = () => {\n const elem: HTMLElement | null = document.querySelector(\"#detailCard\");\n if (elem) {\n elem.classList.remove(\"detail-close\");\n this.setState({ detailCardOpen: true });\n }\n };\n render = () => {\n return (\n \n {\" \"}\n {\n const elem: HTMLElement | null = document.querySelector(\n \"#detailCard\"\n );\n if (this.props.clickedID !== 0 && elem) {\n elem.classList.toggle(\"detail-close\");\n this.setState({ detailCardOpen: !this.state.detailCardOpen });\n }\n }}\n >\n
\n {this.state.detailCardIconHover ? : }\n
\n {\n this.setState({\n detailCardIconHover: !this.state.detailCardIconHover\n });\n }}\n >\n Show Detail Charts\n \n \n \n \n {this.props.mode === \"inflow\"\n ? \"Where Workers Commute From\"\n : \"Where Residents Commute To\"}\n \n
\n {\n const elem: HTMLElement | null = document.querySelector(\n \"#detailCard\"\n );\n elem && elem.classList.toggle(\"detail-close\");\n this.setState({\n detailCardOpen: !this.state.detailCardOpen\n });\n }}\n />\n {\n this.setState({\n detailCardMinIconHover: !this.state.detailCardMinIconHover\n });\n }}\n >\n Minimize Detail Charts\n \n
\n \n \n \n \n {this.props.yearData[0] &&\n this.props.semmcdLookup &&\n this.props.semmcdLookup.get(this.props.clickedID) ? (\n this.state.comparisonChart &&\n this.props.comparisonDataLoaded ? (\n <>\n \n \n {this.props.yearArr\n .slice()\n .sort()\n .map(year => (\n \n {year}\n \n ))}\n \n \n \n Total Workers{\" \"}\n {this.props.mode === \"inflow\" ? \"Working\" : \"Living\"} in{\" \"}\n {this.props.clickedName}\n \n {this.props.yearArr\n .slice()\n .sort()\n .map(year => (\n \n {(() => {\n const found = this.props.yearData.find(\n yd => yd.year === year\n );\n return found && found.sum.toLocaleString();\n })()}\n \n ))}\n \n \n \n {this.props.mode === \"inflow\"\n ? \"Working and Living\"\n : \"Living and Working\"}{\" \"}\n in {this.props.clickedName}\n \n {this.props.yearArr\n .slice()\n .sort()\n .map(year => (\n \n {(() => {\n const found = this.props.yearData.find(\n yd => yd.year === year\n );\n const name = this.props.semmcdLookup.get(\n this.props.clickedID\n );\n const val = found && name && found.data.get(name);\n return (\n found && name && val && val.toLocaleString()\n );\n })()}\n \n ))}\n \n \n \n Percent\n \n {this.props.yearArr\n .slice()\n .sort()\n .map(year => (\n \n {(() => {\n const found = this.props.yearData.find(\n yd => yd.year === year\n );\n const name = this.props.semmcdLookup.get(\n this.props.clickedID\n );\n const val = found && name && found.data.get(name);\n return (\n found &&\n name &&\n val &&\n ((val / found.sum) * 100).toFixed(1)\n );\n })()}\n %\n \n ))}\n \n \n ) : (\n <>\n \n \n \n {this.props.yearArr[0]}\n \n \n \n \n Total Workers{\" \"}\n {this.props.mode === \"inflow\" ? \"Working\" : \"Living\"} in{\" \"}\n {this.props.clickedName}\n \n \n {this.props.yearData[0] &&\n this.props.yearData[0].sum.toLocaleString()}\n \n \n \n \n {this.props.mode === \"inflow\"\n ? \"Working and Living\"\n : \"Living and Working\"}{\" \"}\n in {this.props.clickedName}\n \n \n {(() => {\n const yearDataInd = this.props.semmcdLookup.get(\n this.props.clickedID\n );\n const outNumber =\n yearDataInd &&\n this.props.yearData[0].data.get(yearDataInd);\n return outNumber && outNumber.toLocaleString();\n })()}\n \n \n \n \n Percent\n \n \n {(() => {\n const yearDataInd = this.props.semmcdLookup.get(\n this.props.clickedID\n );\n const outNumber =\n yearDataInd &&\n this.props.yearData[0].data.get(yearDataInd);\n const outPercent =\n outNumber &&\n (outNumber / this.props.yearData[0].sum) * 100;\n return outPercent && outPercent.toFixed(1);\n })()}\n %\n \n \n \n )\n ) : (\n \"Loading...\"\n )}\n \n\n {this.props.yearData[0] && (\n \n {!this.state.comparisonChart ||\n !this.props.comparisonDataLoaded ? (\n \n {\n this.setState({\n comparisonChart: true\n });\n if (this.props.comparisonDataLoaded) {\n this.props.load_comparison_cache();\n } else {\n this.props.update_comparison_chart(\n this.props.flow === \"semcogmcdflows_2010\"\n ? \"semcogmcdflows_2012_2016\"\n : \"semcogmcdflows_2010\",\n this.props.flow,\n this.props.yearData[0].data,\n this.props.semmcdLookup,\n this.props.clickedID,\n this.props.mode\n );\n }\n }}\n >\n Compare two years\n {\" \"}\n \n ) : (\n {\n this.setState({\n comparisonChart: false\n });\n this.props.load_main_cache();\n }}\n >\n Back to single year\n \n )}\n \n )}\n\n \n \n \n \n
\n );\n };\n}\n\nexport default connect(\n (store: Core.Store) => ({\n // map\n clickedID: store.map.clickedID,\n clickedName: store.map.clickedName,\n mode: store.map.mode,\n flow: store.map.flow,\n // chart\n semmcdLookup: store.chart.semmcdLookup,\n yearArr: store.chart.yearArr,\n yearData: store.chart.yearData,\n comparisonDataLoaded: store.chart.comparisonDataLoaded\n }),\n { update_comparison_chart, load_comparison_cache, load_main_cache }\n)(DetailCard);\n","import { LOADING_SEARCH_LOCATIONS, LOADING_SEARCH_ID } from \"./actionType\";\n\nconst mcdArray: string[] = require(\"../../communities_name.json\");\n\n// TODO: finish adding local json as another way to search mcd\n// dispatch different action based on matching result from reg exp\n\nexport const loading_search_locations = async (searchingStr: string) => {\n const reg = new RegExp(`(^${searchingStr})`, \"gi\");\n const foundname = mcdArray.filter((mcd: any) => reg.exec(mcd.name));\n if (foundname.length > 0) {\n return {\n type: LOADING_SEARCH_ID,\n data: foundname\n };\n }\n const access_token = process.env.REACT_APP_MAPBOX_KEY;\n const url = `\n https://api.mapbox.com/geocoding/v5/mapbox.places/${searchingStr}.json?access_token=${access_token}&autocomplete=true&country=us&types=district%2Cpostcode%2Clocality%2Cplace%2Cneighborhood%2Caddress%2Cpoi&bbox=-84.00111253629939%2C41.72817989437715%2C-82.47684089369453%2C42.840189320770776&limit=5&language=en&languageMode=strict`;\n const r = await fetch(url).then(res => res.json());\n return {\n type: LOADING_SEARCH_LOCATIONS,\n data: r,\n nameData: foundname\n };\n};\n","import React from \"react\";\nimport { connect } from \"react-redux\";\n\nimport {\n Dropdown,\n DropdownToggle,\n DropdownMenu,\n DropdownItem\n} from \"reactstrap\";\nimport \"./searchbar.css\";\nimport { select_from_id } from \"../../redux/actions/map\";\nimport { loading_search_locations } from \"../../redux/actions/search\";\n\nclass SearchBar extends React.Component {\n state = {\n dropdownOpen: false\n };\n componentDidUpdate = prepros => {\n if (this.props.clickedName !== prepros.clickedName) {\n document.querySelector(\"#searchInput\").value = this.props.clickedName;\n }\n };\n render = () => (\n this.setState({ dropdownOpen: !this.state.dropdownOpen })}\n >\n \n {\n this.setState({ dropdownOpen: true });\n this.props.loading_search_locations(\n document.querySelector(\"#searchInput\").value\n );\n }}\n />\n \n \n {this.props.nameData && this.props.nameData.length > 0 ? (\n this.props.nameData.map(mcd => (\n {\n this.props.select_from_id(mcd.id);\n }}\n >\n {mcd.name}\n \n ))\n ) : (\n \n Search by place name\n \n )}\n \n \n );\n}\n\nexport default connect(\n store => ({\n searchData: store.search.data,\n nameData: store.search.nameData,\n clickedName: store.map.clickedName,\n mcdboundary: store.map.mcdboundary\n }),\n { loading_search_locations, select_from_id }\n)(SearchBar);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n Card,\n CardHeader,\n CardTitle,\n Tooltip, //https://reactstrap.github.io/components/tooltips/\n Button,\n ButtonGroup,\n CardText,\n CardBody,\n ButtonToolbar\n} from \"reactstrap\";\nimport { Info, Share2, HelpCircle } from \"react-feather\";\n\nimport {\n switch_to_inflow,\n switch_to_outflow,\n switch_dataset_to_2016,\n switch_dataset_to_2010\n} from \"../redux/actions/map\";\nimport { guide_start } from \"../redux/actions/guide\";\n\nimport SearchBar from \"./modules/searchbar\";\nimport Guide from \"./modules/Guide\";\nimport { copyToClipboard } from \"../redux/utils\";\nimport { Store, Mode, Flow } from \"./types/core\";\nimport { Action, ActionCreator, AnyAction } from \"redux\";\nimport { match } from \"react-router-dom\";\nimport * as H from \"history\";\n\ninterface ControlPenalProps {\n match: match;\n history: H.History;\n mode: Mode;\n flow: Flow;\n searchData: JSON;\n switch_to_inflow: ActionCreator;\n switch_to_outflow: ActionCreator;\n switch_dataset_to_2016: ActionCreator;\n switch_dataset_to_2010: ActionCreator;\n guide_start: ActionCreator;\n}\n\nclass ControlPenal extends React.Component {\n state = {\n aboutTooltipOpen: false,\n aboutOpen: false,\n helpTooltipOpen: false,\n shareTooltipOpen: false\n };\n render = () => {\n return (\n \n \n \n Commuters\n \n
\n \n this.setState({\n aboutOpen: !this.state.aboutOpen\n })\n }\n />\n {this.state.aboutOpen && (\n \n About\n \n \n Commuting Patterns in Southeast Michigan\n

\n Travel to work – showing the connections between business\n and the labor market – is one of the defining factors of a\n regional economy. Travel-to-work data in Southeast\n Michigan suggests that the SEMCOG region is connected by\n commuting flows that tie the housing markets and job\n centers across the region into one very strong, cohesive\n inter-reliant region.\n

\n

\n SEMCOG’s Commuting Patterns map provides quick and easy\n understanding of the travel to work patterns of the\n region’s workforce for all of region’s communities for\n years 2016 and 2010. The data presented in the map is\n based on Census Transportation Planning Products (CTPP)\n tabulations of Census Bureau’s 5-year American Community\n Survey (ACS) data. Data for 2010 represents 2006-2010\n 5-year CTPP data and the data for 2016 is from 2012-2016\n 5-year CTPP data.\n

\n
\n \n \n this.setState({ aboutOpen: false })}\n >\n Close\n \n \n \n
\n
\n )}\n this.props.guide_start()}\n />\n copyToClipboard(window.location.href)}\n />\n {\n this.setState({\n aboutTooltipOpen: !this.state.aboutTooltipOpen\n });\n }}\n >\n About\n \n {\n this.setState({ helpTooltipOpen: !this.state.helpTooltipOpen });\n }}\n >\n Help\n \n {\n this.setState({\n shareTooltipOpen: !this.state.shareTooltipOpen\n });\n }}\n >\n Copy link to clipboard\n \n
\n
\n \n \n Search community\n \n \n \n \n\n {/* \n Switch between Inflow / Outflow\n */}\n \n \n {\n this.props.switch_to_inflow();\n }}\n >\n Inflow\n \n {\n this.props.switch_to_outflow();\n }}\n >\n Outflow\n \n \n \n \n \n {/* \n Select year\n */}\n \n \n {\n this.props.switch_dataset_to_2010();\n }}\n >\n 2010\n \n {\n this.props.switch_dataset_to_2016();\n }}\n >\n 2016\n \n \n \n \n
\n );\n };\n}\n\nexport default connect(\n (store: Store) => ({\n mode: store.map.mode,\n flow: store.map.flow,\n searchData: store.search.data\n }),\n {\n switch_to_inflow,\n switch_to_outflow,\n switch_dataset_to_2016,\n switch_dataset_to_2010,\n guide_start\n }\n)(ControlPenal);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport {\n Button,\n ButtonToolbar,\n ButtonGroup,\n Card,\n CardHeader,\n CardTitle,\n CardBody\n} from \"reactstrap\";\nimport {\n guide_next_item,\n guide_previous_item,\n guide_skip\n} from \"../../redux/actions/guide\";\nimport \"./guide.css\";\n\nclass GuideFixed extends React.Component {\n render = () => (\n <>\n {!this.props.skip &&\n this.props.guide_index === this.props.guide_sequence && (\n
\n )}\n \n \n User Guide{\" \"}\n \n {this.props.guide_index + 1}/{this.props.end_index + 1}\n {\" \"}\n \n \n {this.props.help}\n \n \n this.props.guide_skip()}\n >\n Skip\n \n \n \n this.props.guide_previous_item()}\n >\n Previous\n \n this.props.guide_next_item()}\n >\n Next\n \n \n \n \n \n \n );\n}\n\nexport default connect(\n store => ({\n guide_index: store.guide.guide_index,\n end_index: store.guide.end_index,\n skip: store.guide.skip\n }),\n {\n guide_next_item,\n guide_previous_item,\n guide_skip\n }\n)(GuideFixed);\n","import { connect } from \"react-redux\";\nimport React from \"react\";\nimport \"./loading.css\";\n\nconst Loading = ({ loading }) => {\n return (\n
\n
\n \n \n \n
\n
\n );\n};\n\nexport default connect(store => ({ loading: store.loading.loading }))(Loading);\n","import React from \"react\";\nimport { connect } from \"react-redux\";\nimport { Container } from \"reactstrap\";\nimport MapView from \"./Map\";\n// Charts\nimport DetailCard from \"./DetailCard\";\nimport ControlPenal from \"./ControlPenal\";\n// Guide\nimport GuideFixed from \"./modules/GuideFixed\";\nimport { guide_skip } from \"../redux/actions/guide\";\n\n// Loading\nimport Loading from \"./modules/Loading\";\n\n// css\nimport \"./css/layout.css\";\nimport { match } from \"react-router-dom\";\n\nimport * as H from \"history\";\nimport { ActionCreator, Action } from \"redux\";\n\nconst Dashboard = ({\n match,\n history,\n location,\n guide_skip\n}: {\n match: match;\n history: H.History;\n location: Location;\n guide_skip: ActionCreator;\n}) => {\n if (window.innerWidth < 600) guide_skip();\n const urlparams = new URLSearchParams(location.search);\n const semmcd: number = Number(urlparams.get(\"semmcd\"));\n const direction: string = urlparams.get(\"direction\") || \"outflow\";\n const year: number = Number(urlparams.get(\"year\"));\n return (\n \n \n \n \n Clicking{\" \"}\n \n \n \n \n {\" \"}\n at the top right corner of the chart to download the data.\n \n }\n />\n \n \n \n \n );\n};\n\nexport default connect(store => ({}), { guide_skip })(Dashboard);\n","import * as React from \"react\";\nimport \"./App.css\";\nimport { BrowserRouter as Router, Route } from \"react-router-dom\";\nimport { Header } from \"./components/modules/header\";\nimport Dashboard from \"./components/Dashboard\";\n\nfunction App() {\n return (\n
\n \n \n \n
\n \n \n
\n );\n}\n\nexport default App;\n","import * as actionType from \"../actions/actionType\";\n\nconst themes = {\n modern: {\n primary: \"#2196f3\",\n secondary: \"#9c27b0\",\n tertiary: \"#4dabf5\",\n success: \"#4caf50\",\n info: \"#009688\",\n warning: \"#fb8c00\",\n danger: \"#e53935\"\n },\n classic: {\n primary: \"#41D492\",\n secondary: \"#5C59ED\",\n tertiary: \"#41D492\",\n success: \"#a877b5\",\n info: \"#00bcd4\",\n warning: \"#F2B51D\",\n danger: \"#F26666\"\n },\n dark: {\n primary: \"#4caf50\",\n secondary: \"#9c27b0\",\n tertiary: \"#4dabf5\",\n success: \"#2196f3\",\n info: \"#009688\",\n warning: \"#fb8c00\",\n danger: \"#e53935\"\n },\n light: {\n primary: \"#2196f3\",\n secondary: \"#9c27b0\",\n tertiary: \"#4dabf5\",\n success: \"#4caf50\",\n info: \"#009688\",\n warning: \"#fb8c00\",\n danger: \"#e53935\"\n }\n};\n\ntype Themes = {\n modern: any;\n classic: any;\n dark: any;\n light: any;\n};\n\ntype Action = {\n type: \"THEME_TOGGLE\";\n payload: keyof Themes;\n};\n\nconst initialState = {\n currentTheme: themes.modern,\n themes: themes\n};\n\nexport default function reducer(state = initialState, actions: Action) {\n switch (actions.type) {\n case actionType.THEME_TOGGLE:\n return {\n ...state,\n currentTheme: state.themes[actions.payload]\n };\n\n default:\n return state;\n }\n}\n","import {\n MAP_CLICK,\n SET_CLICKED_NAME,\n HIGHLIGHT_FEATURE,\n REMOVE_HIGHLIGHT_FEATURE,\n UPDATE_GEOJSON_LAYER,\n INIT_GEOJSON_LAYER,\n SWITCH_TO_INFLOW,\n SWITCH_TO_OUTFLOW,\n SWITCH_DATASET_TO_2010,\n SWITCH_DATASET_TO_2016,\n SELECT_FROM_ID\n} from \"../actions/actionType\";\n\nimport { cluster_palette } from \"../utils\";\nimport { inflowPalette, outflowPalette } from \"../constants\";\nimport * as Core from \"../../components/types/core\";\n\ntype Action =\n | {\n type: \"MAP_CLICK\";\n semmcd: Core.mcd;\n }\n | {\n type: \"SET_CLICKED_NAME\";\n name: string;\n }\n | {\n type: \"HIGHLIGHT_FEATURE\";\n name: string;\n }\n | {\n type: \"REMOVE_HIGHLIGHT_FEATURE\";\n }\n | {\n type: \"UPDATE_GEOJSON_LAYER\";\n geojson: Core.GeoJSONType;\n sumTraffic: number;\n flowData: number[];\n }\n | {\n type: \"INIT_GEOJSON_LAYER\";\n geojson: Core.GeoJSONType;\n }\n | {\n type: \"SWITCH_TO_INFLOW\";\n }\n | {\n type: \"SWITCH_TO_OUTFLOW\";\n }\n | {\n type: \"SWITCH_DATASET_TO_2010\";\n }\n | {\n type: \"SWITCH_DATASET_TO_2016\";\n }\n | {\n type: \"SELECT_FROM_ID\";\n id: Core.mcd;\n };\n\ntype State = {\n mcdboundary: string;\n flow: Core.Flow;\n mode: Core.Mode;\n clickedID: Core.mcd;\n geojson?: Core.GeoJSONType;\n palette?: Core.paletteFunc;\n sumTraffic?: number;\n highlightedName?: string;\n};\n\nexport const initialState: State = {\n // combined: communities_combined, separate: communityboundary\n mcdboundary: \"communities_combined\",\n flow: \"semcogmcdflows_2012_2016\" as Core.Flow,\n mode: \"outflow\" as Core.Mode,\n clickedID: 0\n};\n\nexport default (state: State = initialState, action: Action) => {\n switch (action.type) {\n case INIT_GEOJSON_LAYER: {\n const { geojson } = action;\n return {\n ...state,\n geojson\n };\n }\n case HIGHLIGHT_FEATURE: {\n const { name } = action;\n return {\n ...state,\n highlightedName: name\n };\n }\n case REMOVE_HIGHLIGHT_FEATURE: {\n return {\n ...state,\n highlightedName: undefined\n };\n }\n case UPDATE_GEOJSON_LAYER: {\n const { geojson, /*maxTraffic,*/ sumTraffic, flowData } = action;\n const colorPalette =\n state.mode === (\"inflow\" as Core.Mode) ? inflowPalette : outflowPalette;\n return {\n ...state,\n geojson,\n //palette: palette(0, maxTraffic, colorPalette),\n palette: cluster_palette(flowData).range(colorPalette),\n sumTraffic\n };\n }\n case MAP_CLICK: {\n const { semmcd } = action;\n return {\n ...state,\n clickedID: semmcd\n };\n }\n case SET_CLICKED_NAME: {\n const { name } = action;\n return {\n ...state,\n clickedName: name\n };\n }\n\n case SWITCH_TO_INFLOW: {\n return {\n ...state,\n mode: \"inflow\" as Core.Mode\n };\n }\n case SWITCH_TO_OUTFLOW: {\n return {\n ...state,\n mode: \"outflow\" as Core.Mode\n };\n }\n case SWITCH_DATASET_TO_2010: {\n return {\n ...state,\n flow: \"semcogmcdflows_2010\" as Core.Flow\n };\n }\n case SWITCH_DATASET_TO_2016: {\n return {\n ...state,\n flow: \"semcogmcdflows_2012_2016\" as Core.Flow\n };\n }\n case SELECT_FROM_ID: {\n const { id } = action;\n return {\n ...state,\n clickedID: id\n };\n }\n\n default:\n return state;\n }\n};\n","import {\n UPDATE_COMMUTER_CHART,\n UPDATE_COMPARISON_CHART,\n LOAD_COMPARISON_CACHE,\n LOAD_MAIN_CACHE\n} from \"../actions/actionType\";\nimport { commuterChartOptions } from \"../constants\";\nimport { cluster_palette } from \"../utils\";\nimport * as Core from \"../../components/types/core\";\nimport { ApexOptions } from \"apexcharts\";\n\ntype Action =\n | {\n type: \"UPDATE_COMMUTER_CHART\";\n data: Core.chartDataType;\n semmcdLookup: Core.semmcdLookup;\n clickedID: Core.clickedID;\n year: string;\n }\n | {\n type: \"UPDATE_COMPARISON_CHART\";\n incomingDataYear: string[];\n datasetOwn: Core.chartDataType;\n incomingData: Core.chartDataType;\n clickedID: Core.clickedID;\n }\n | { type: \"LOAD_COMPARISON_CACHE\" }\n | { type: \"LOAD_MAIN_CACHE\" };\n\ntype State = {\n comparisonDataLoaded: boolean; // Flag, comparison data is loaded\n yearArr: Core.ChartYear; // Arr of all loaded data year\n yearData: Core.ChartYearData;\n // Generated Data Statistic\n // Chart config and series\n options: ApexOptions;\n series: ApexAxisChartSeries;\n series_main: ApexAxisChartSeries;\n series_comparison: ApexAxisChartSeries;\n semmcdLookup?: Core.semmcdLookup; // Lookup {Name=> commuter number}\n};\n\nconst defaultState = {\n comparisonDataLoaded: false, // Flag, comparison data is loaded\n yearArr: [], // Arr of all loaded data year\n yearData: [],\n // Generated Data Statistic\n // Chart config and series\n options: commuterChartOptions,\n series: [],\n series_main: [],\n series_comparison: []\n // // Color palletes\n // palette_main: null,\n // palette_secondary: null\n};\n\nexport default (state: State = defaultState, action: Action) => {\n switch (action.type) {\n case UPDATE_COMMUTER_CHART: {\n const { data, semmcdLookup, clickedID, year } = action;\n const foundMCDinnerFlow = semmcdLookup.get(clickedID);\n const xaxisCategory = foundMCDinnerFlow\n ? Array.from(data.keys()).filter(\n val => val !== semmcdLookup.get(clickedID)\n )\n : Array.from(data.keys()).filter(\n (val, ind, arr) => ind !== arr.length - 1\n );\n const seriesData = xaxisCategory.map(val => data.get(val) || 0.0);\n const sumData = Array.from(data.values()).reduce(\n (pre, cur) => pre + cur,\n 0\n );\n\n return {\n ...state,\n comparisonDataLoaded: false,\n semmcdLookup: semmcdLookup,\n yearArr: [year],\n yearData: [\n {\n year,\n data,\n sum: sumData\n }\n ],\n options: {\n ...state.options,\n xaxis: {\n ...state.options.xaxis,\n categories: xaxisCategory\n }\n },\n series: [\n {\n name: year,\n data: seriesData\n }\n ],\n series_main: [\n {\n name: year,\n data: seriesData\n }\n ],\n palette_main: cluster_palette(seriesData)\n };\n }\n case UPDATE_COMPARISON_CHART: {\n const { semmcdLookup, yearArr, yearData } = state;\n const { incomingDataYear, datasetOwn, incomingData, clickedID } = action;\n if (semmcdLookup) {\n const foundMCDinnerFlow = semmcdLookup.get(clickedID);\n const xaxisCategory = foundMCDinnerFlow\n ? Array.from(incomingData.keys()).filter(\n val => val !== semmcdLookup.get(clickedID)\n )\n : Array.from(incomingData.keys()).filter(\n (val, ind, arr) => ind !== arr.length - 1\n );\n const dataOwnSeriesData = xaxisCategory.map(\n val => datasetOwn.get(val) || 0.0\n );\n const incomingSeriesData = xaxisCategory.map(\n val => incomingData.get(val) || 0.0\n );\n const sumIncomingData = Array.from(incomingData.values()).reduce(\n (pre, cur) => pre + cur,\n 0\n );\n\n return {\n ...state,\n comparisonDataLoaded: true,\n yearArr: [...yearArr, ...incomingDataYear],\n yearData: [\n ...yearData,\n {\n year: incomingDataYear[0],\n data: incomingData,\n sum: sumIncomingData\n }\n ],\n compareData: incomingData,\n series: [\n {\n name: yearArr[0],\n data: dataOwnSeriesData\n },\n {\n name: incomingDataYear[0],\n data: incomingSeriesData\n }\n ],\n series_comparison: [\n {\n name: yearArr[0],\n data: dataOwnSeriesData\n },\n {\n name: incomingDataYear[0],\n data: incomingSeriesData\n }\n ],\n palette_main: cluster_palette(dataOwnSeriesData),\n palette_secondary: cluster_palette(incomingSeriesData)\n };\n } else {\n return state;\n }\n }\n case LOAD_MAIN_CACHE: {\n return {\n ...state,\n series: state.series_main\n };\n }\n case LOAD_COMPARISON_CACHE: {\n return {\n ...state,\n series: state.series_comparison\n };\n }\n default:\n return state;\n }\n};\n","import {\n LOADING_SEARCH_LOCATIONS,\n LOADING_SEARCH_ID\n} from \"../actions/actionType\";\n\ntype Action =\n | {\n type: \"LOADING_SEARCH_LOCATIONS\";\n data: any;\n nameData: any;\n }\n | {\n type: \"LOADING_SEARCH_ID\";\n data: any;\n };\n\nconst defaultState = {\n data: undefined,\n nameData: undefined\n};\n\nexport default (state = defaultState, action: Action) => {\n switch (action.type) {\n case LOADING_SEARCH_LOCATIONS: {\n const { data, nameData } = action;\n return {\n ...state,\n data,\n nameData\n };\n }\n case LOADING_SEARCH_ID: {\n const { data } = action;\n return {\n ...state,\n nameData: data\n };\n }\n\n default:\n return state;\n }\n};\n","import {\n GUIDE_NEXT_ITEM,\n GUIDE_PREVIOUS_ITEM,\n GUIDE_SKIP,\n GUIDE_START\n} from \"../actions/actionType\";\n\ntype Action =\n | {\n type: \"GUIDE_NEXT_ITEM\";\n }\n | {\n type: \"GUIDE_PREVIOUS_ITEM\";\n }\n | {\n type: \"GUIDE_SKIP\";\n }\n | {\n type: \"GUIDE_START\";\n };\n\nconst initialState = {\n guide_index: 0,\n end_index: 5,\n skip: false\n};\n\nexport default (state = initialState, action: Action) => {\n switch (action.type) {\n case GUIDE_NEXT_ITEM: {\n const { guide_index, ...others } = state;\n return {\n ...others,\n guide_index: guide_index + 1\n };\n }\n case GUIDE_PREVIOUS_ITEM: {\n const { guide_index, ...others } = state;\n return {\n ...others,\n guide_index: guide_index - 1\n };\n }\n case GUIDE_SKIP: {\n const { skip, ...others } = state;\n return {\n ...others,\n skip: true\n };\n }\n case GUIDE_START: {\n const { skip, guide_index, ...others } = state;\n return {\n ...others,\n skip: false,\n guide_index: 0\n };\n }\n default:\n return state;\n }\n};\n","import { combineReducers } from \"redux\";\nimport theme from \"./theme\";\nimport map from \"./map\";\nimport chart from \"./chart\";\nimport search from \"./search\";\nimport guide from \"./guide\";\nimport loading from \"./loading\";\n\nexport default combineReducers({\n theme,\n map,\n chart,\n search,\n guide,\n loading\n});\n","import { LOADING_START, LOADING_END } from \"../actions/actionType\";\n\ntype Action =\n | {\n type: \"LOADING_START\";\n }\n | {\n type: \"LOADING_END\";\n };\n\nexport default (state = { loading: true }, action: Action) => {\n switch (action.type) {\n case LOADING_START:\n return {\n loading: true\n };\n case LOADING_END:\n return {\n loading: false\n };\n default:\n return state;\n }\n};\n","import { createStore, applyMiddleware } from \"redux\";\nimport rootReducer from \"./reducers\";\n\nconst vanillaPromise = store => next => action => {\n if (typeof action.then !== \"function\") {\n return next(action);\n }\n\n return Promise.resolve(action).then(store.dispatch);\n};\n\nexport default createStore(rootReducer, applyMiddleware(vanillaPromise));\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.css\";\nimport App from \"./App\";\nimport store from \"./redux/store\";\nimport { Provider } from \"react-redux\";\nimport * as serviceWorker from \"./serviceWorker\";\n\nReactDOM.render(\n \n \n ,\n document.getElementById(\"root\")\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}