{"version":3,"sources":["view/MapVectorStyles.js","model/SVIThemeModel.js","controller/ScriptUrl.js","model/StaticVariables.js","controller/TextVariables.js","model/LocalStorageService.js","model/DataService.js","model/DevDataService.js","controller/DownloadString.js","model/DataTransformation.js","model/InterfaceProvider.js","controller/MapProvider.js","view/Tooltip.js","view/Dropdown.js","view/ThemeSelectView.js","view/ToggleSwitch.js","view/CensusToggle.js","view/CompareToggle.js","view/StateSelect.js","view/YearSelect.js","view/ResetButton.js","view/DataControls.js","model/OneMapApiDataService.js","controller/LayerQueries.js","view/TableGrid.js","view/ContentData.js","controller/PreparedCountyMapController.js","view/PreparedMaps.js","view/ContentInformation.js","view/Legend.js","model/FeatureProvider.js","view/Modal.js","view/DragContainer.js","controller/useMousePosition.js","controller/useMouseDown.js","controller/CollisionDetection.js","view/FeatureModal.js","view/FeatureTitle.js","view/RemoveMapMarkerButton.js","controller/useAfterInit.js","controller/addPropsToChildren.js","view/Layer.js","view/Waiting.js","view/Map.js","view/MeasureLayer.js","view/OLMSLayer.js","view/CensusLayer.js","view/CountyLayer.js","view/CircleFeature.js","model/POI_model.js","view/PoiLayer.js","view/MapControls.js","view/ZoomControls.js","controller/Control.js","view/DownloadControl.js","view/ZoomNumberControl.js","view/FullScreenControl.js","view/ZoomSelect.js","model/mergeFeatures.js","view/StateLayer.js","view/RegionLayer.js","view/HHSregionsLayer.js","view/GridDebugLayer.js","view/FeatureOutlineLayer.js","view/IconFeature.js","view/MapMarkerLayer.js","view/HighlightRegionLayer.js","controller/MapController.js","view/ContentMap.js","view/checkAdjustShortScreens.js","controller/DownloadProvider.js","view/DownloadModal.js","controller/DownloadCSV.js","controller/convertMapToImage.js","controller/DownloadJPG.js","controller/AppDownloader.js","view/TabsContent.js","view/CDCHeader.js","view/SVIBanner.js","view/DropCheck.js","view/PointOfInterestUI.js","model/SearchLookup.js","model/OnemapSearchLookup.js","view/SearchUI.js","view/OpacitySlider.js","view/MapTitle.js","view/AdminControls.js","view/ViewControls.js","view/Tablist.js","view/MobileMenu.js","controller/App.js","view/ErrorModal.js","view/MessageModal.js","controller/IfIE.js","controller/AdobeAnalytics.js","controller/Analytics.js","view/Interface.js","controller/App404.js","index.js"],"names":["canvasHatchPattern","pixelRatio","p","pctx","olHas","document","createElement","width","height","getContext","strokeStyle","lineWidth","beginPath","moveTo","lineTo","x0","x1","stroke","createPattern","outlineExtent","Style","Stroke","color","lineDash","outlineHHS","outlineHHSlow","outlineRegion","outlineRegionLow","outlineState","outlineStateLow","outlineCounty","outlineCountyLow","outlineCensus","outlineFeatureHighlightCensus","outlineFeatureHighlightCounty","flatColorStyle","fill","Fill","flatColorCountyStyle","low","poiCircle","val","hhsLabelStyle","highlight","offset","distance","offsets","center","left","top","right","bottom","selectedOffset","text","Text","font","padding","backgroundFill","backgroundStroke","offsetX","offsetY","rotation","noData","outOfScope","colorPalletA","none","mapStyles","med","high","colorPalletB","colorPalletC","colorPalletD","colorPalletE","colorSchemeToStyle","scheme","Object","keys","forEach","key","sviThemes","id","xicon","label","labelPast","label2020","slug","colorPallet","colorScheme","dataNames","SCRIPT_URL","scriptPath","currentScript","src","divide","indexOf","substring","getLocalReactPath","localDevelopment","localurl","window","location","origin","debugMode","Boolean","search","statesList","Array","isArray","StatesList","values","countiesList","CountiesList","DATA_URL","process","PUBLIC_URL","REACT_APP_DATA_URL","trim","tractList","staticYearList","columns","localdoc","varpage","docs","filename","staticRegions","states","bounds","tabList","icon","close","hidden","staticPOIList","textColor","blacklist","dataProjection","featureProjection","mapStaticVariables","extents","contiguous_us_and_pr","max_map_bounds","coordinates","worldCenter","usCenter4326","usCenter3857","projections","mercator","latlon","getStateName","fips","state","stateFips","String","find","st","getState","getCountyName","county","countyFips","cnt","cc","CC","getCounty","CN","TEXTS","cdc","cdc_subtext","svi","cdc_banner","popup","featureInfo","button","modals","download","link","maplabel","datalabel","titleCheck","legendCheck","currentMap","currentData","select_state","select_county","usmap","autoSwitchCensus","autoSwitchDCtract","legend","tooltip","non_applicable","controls","svi_select","tooltiptable","comparison","option1","option2","state_select","placeholder","disabled","data_level","helpText","data_year","reset_button","resetTooltip","poi_select","svi_opacity","search_box","zoom_level","zoom_in","zoom_out","reset_to_full_extent","night_day_mode","full_screen","zoom_select","expandCollapse","errorMessages","101","name","devNotes","message","400","403","401","405","498","init","LocalStorageService","_service","_clearToken","localStorage","removeItem","access_token","getService","this","setToken","tokenObj","setItem","refresh_token","expires","getAccessToken","token","getItem","Date","getTime","getRefreshToken","clearToken","DataServiceError","code","options","TEXT","console","log","description","modalMessage","combinedMessage","config","Error","DataService","props","_verbose","_localStorageService","_needsAuth","_name","_client","axios","create","baseURL","params","_requestCount","_authClient","_queue","_authStatus","_token","_axiosSource","CancelToken","source","responseError","err","a","_retry","authenticate","Promise","reject","responseInterceptor","res","data","status","error","rawError","codeDetails","details","toLowerCase","_callsAreAuthorized","requestInterceptor","needsAuth","hasOwnProperty","tok","cancel","body","_api","args","url","head","formatCall","callObj","applyFilterAuth","applyFiltertransformData","getAuthCall","formatSlug","type","scope","tract","filter","join","toLocaleLowerCase","replace","startToken","post","then","dat","catch","length","get","cancelToken","paramsSerializer","entries","assign","map","value","getListData","Table","getPOIData","extent","year","tileKey","zoom","getZoomFromTileKey","fetch","json","Table1","Count","getGeometryData","getSVIData","getBaseMapPath","getBaseStyleData","interceptors","request","use","response","stateNames","10","11","12","13","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","44","45","46","47","48","49","50","51","53","54","55","56","72","DevDataService","counties","theme","y1","x2","y2","base","protocol","poiBase","baseMap_arcGIS_style_path","baseMap_arcGIS_geometry_path","output","defaults","AppVersion","State","XMin","YMin","XMax","YMax","adjyear","loop","StateFIPS","CountyFIPS","SVIYear","SVIThemeID","LayerName","PointsCount","mapSVIJson","applyAuth","downloadString","string","blank","onDownload","setAttribute","appendChild","click","href","target","remove","mapThemeAttributes","obj","thm0","R_PL_THEME1","RPL_THEMES","Overall_SVI_Percentile","thm1","R_PL_THEME2","RPL_THEME1","Theme1_Socioeconomic_Percentile","Theme1_Percentile","thm2","R_PL_THEME3","RPL_THEME2","Theme2_HouseholdAndDisability_Percentile","Theme2_Percentile","thm3","R_PL_THEME4","RPL_THEME3","Theme3_MinorityAndLanguage_Percentile","Theme3_Percentile","thm4","R_PL_THEME5","RPL_THEME4","Theme4_HousingAndTransportation_Percentile","Theme4_Percentile","theme0","sviValueToSlug","theme1","theme2","theme3","theme4","theme0Num","theme1Num","theme2Num","theme3Num","theme4Num","num","list","row","themes","FIPS","jsonToCSVDownloadString","csvLink","useQuotes","jcopy","slice","indexRow","unshift","jsonToCSVString","encodeURI","distanceBetweenPoints","pointA","pointB","absolute","w","Math","abs","l","d","floor","sqrt","groupAsSingle","poi","x","y","tilekey","chunkArray","array","size","chunked_arr","numOfChild","ceil","i","push","splice","findCenter","coords","getCenter","boundingExtent","capitalizeFirstLetter","charAt","toUpperCase","tableDataMappingOrdered","item","GeoLevel","Comparison","hide","headerName","foundState","ST","STATE","ST_ABBR","abbr","STCNTY","foundCounty","cnty","reg","RegExp","COUNTY","sort","b","parseInt","tableDataMapping","whitelistKeys","pick","OBJECTID","GRASPID","STATE_NAME","STATE_ABBR","COUNTY_FIPS","COUNTY_NAME","readErrorMesssage","InterfaceContext","createContext","interface_init","usState","downloadRegion","geometry","tab","hash","opacity","hhsregion","streetmap","openMenu","hospital","daycare","school","nursinghome","infoWindows","selectedFeature","hoveredFeature","selectedFeatureIsPinned","download_modal","darkMode","censusEnabled","errorMessage","isResizing","tableData","printPDF","fipsInView","tempState","highlightedFips","loadStatus","marker","compareExtent","preparedMapState","preparedMapCounty","switchDCTract","usstate","interfaceReducer","action","shouldSwitchTract","nursing","themeObj","isLoading","newContent","content","feature","newState","InterfaceProvider","children","useReducer","dispatch","setSelectedFeature","setHHS","hhs","setStreets","setHospitals","hospitals","setDaycare","setSchools","schools","setNursing","setSelectedState","setDownloadRegion","setSelectedScope","setSelectedTract","setSelectedTheme","setSelectedCounty","setSelectedYear","setThemeOpacity","setSearch","setStateSearch","unsetSearch","unsetMarker","loadEnd","doReset","doResetZoom","setToggle","setSelectedTab","setinfobox","pixel","unsetinfobox","addInfoWindow","removeInfoWindow","index","moveInfoWindow","moveHoveredFeature","updateInfoWindow","pinInfoWindow","setMode","updatePinnedFeature","updateHoveredFeature","pinWindow","showDownloadModal","closeDownloadModal","setMessage","setErrorMessage","setIsResize","setTableData","setCensusEnabled","enableCensus","setIMap","setFipsInView","setForceMap","setTempState","setHighlightedFips","setCompareExtent","setLoadStatus","setOpenMenu","setPreparedMapChoice","uiActions","Provider","MapContext","map_init","census_geometry","county_geometry","hhs_geometry","detail_level","fipsList","features","referenceAdded","census_loaded","county_loaded","init_load","boundingBox","tiles","zoomRead","wait","mapReducer","MapProvider","setTiles","setFipsList","setFips","setSvi","setCountyGeo","setCensusGeo","setReferenceAdded","setCensusLoadStatus","setCountyLoadStatus","setInitLoad","setMap","doMapReset","setZoom","setZoomRead","setWait","setCenter","setBbox","mapActions","StandardTooltipWindow","tooltipPlace","place","effect","delayShow","Tooltip","data-tip","data-for","DropDownLabel","toggleOpen","classStr","selected","className","onClick","aria-hidden","DropDown","selectedObj","onChange","focus","useState","open","setOpen","_uniqueId","selectid","dropDownDom","useRef","useEffect","ttip","current","querySelector","getBoundingClientRect","topoff","style","ref","tabIndex","onMouseLeave","e","onFocus","onBlur","htmlFor","title","tehSelected","t","memo","ThemeSelectView","useContext","tooltipMap","adjustbyYear","adjustThemeLabel","ToggleTab","op","option","pose","input","parsedLabel","parsedValue","data-value","ToggleSwitch","position","switchPosition","stopPropagation","newValue","onKeyDown","preventDefault","aria-labelledby","role","aria-disabled","CensusToggle","enabled","helpTexts","split","CompareToggle","aria-label","StateSelect","setEnabled","setvalue","filtededList","setFilteredList","activeToolTip","setActiveToolTip","forceCloseWindow","dropMenu","display","addEventListener","removeEventListener","setTimeout","items","inputProps","getItemValue","renderItem","highlighted","onSelect","sel","filList","YearSelect","ResetButton","DataControls","sviFields","themeColumns","general","general_flag","theme0_flag","theme1_flag","theme2_flag","theme3_flag","theme4_flag","OneMapApiDataService","themeFields","themeFlags","where","ReleaseYear","f","outfields","resultRecordCount","_record_max","geometryType","geometryPrecision","returnTrueCurve","returnGeometry","inSR","outSR","orderByFields","quantizationParameter","convertExtent","ext","toLonLat","_batch_max","getCount","count","convertToSVIobj2","arr","attributes","convertToSVIobj","_chunkArray","copied","getTillEndOfPage","callProps","callCount","callLimit","batchSize","isLastPage","seriesCount","callObject","resultOffset","validateFips","from","getByBatch","maximum","chunkedFips","promises","maxRuns","min","aChunkOfCountyFips","propsOnTheFly","all","flat","getFirstPageTableData","getTableData","allFipsAllPagesData","allPOIpageData","getPOICoords","pw","encodeURIComponent","h","DS","ODS","getCountyLayerReference","getLayers","array_","lyr","convertGeometryToFeatures","format","clonedData","firstNode","objects","TopoJSON","layers","readFeatures","GeoJSON","getTileExtent","getView","calculateExtent","getSize","grid","getSource","tileGrid","tilesObj","forEachTileCoord","getZoom","coord","tileExtent","getTileCoordExtent","getFipsFromExtent","featureFips","mapExtent","countyLyr","forEachFeatureIntersectingExtent","toString","stateName","substr","getFeatureFipsFromExtent","detail","Set","countyLyrSource","add","getPoiData","tile","extentKey","addCountyFIPSInfo","feat","countyFIPS","CDC","set","SN","countiesFromFips","expandedCountyExtent","geo","cntyfips","getVisibleGeometry","getSimpleGeometry","getDetailedGeometry","fstate","memoSimpleGeo","rez","combinedFeatures","FFips","resultFeatures","concat","getVisibleSVI","withinScope","getSviStyle","themeColorSet","themeSlug","sviThemeValue","stylizeGeometry","sviData","useStyle","shape","sviValues","them30Num","inScope","sviStyle","setStyle","TableGrid","rows","setRows","setcolumns","wrapDiv","createRef","loading","setLoading","dataToTable","useCallback","TableColumns","TableGridColumns","TableGridColumnKeys","cols","reduce","col","order","columnProps","adjCol","field","minWidth","cellClassName","class","headerClassName","c","findHighlightInd","findIndex","LQ","getData","useFips","firstPage","getRowClassName","components","Toolbar","ContentData","PureComponent","importXML","xmlfile","callback","arg1","arg2","xhr","XMLHttpRequest","responseType","overrideMimeType","onload","readyState","DONE","responseXML","send","loadcountiesxml","getElementById","opt0","populateCounties_PreparedMapDDL","xmlDoc","getElementsByTagName","getAttribute","opt1","j","opt","firstChild","nodeValue","hasAttribute","dispatchEvent","Event","opencountymap","alert","fileName","selOption","selectedIndex","filePath","PreparedMaps","setUSstate","setCounty","localYear","setLocalYear","updateCountyValue","reloadcountiesxml","ContentInformation","yrStr","Legend","background","FeatureContext","state_init","pinnedFeature","modalIsPinned","featureReducer","FeatureProvider","setPinnedFeature","Modal","visible","delay","pixelCoords","onClose","pinned","divWindow","on","setOn","modalID","hideBox","closeWindow","time","clearTimeout","ModalBackground","DragContainer","dragging","onMove","verbose","updateWhenScrolled","dragRef","mousePosition","setMousePosition","updateMousePosition","ev","clientX","clientY","useMousePosition","containerPose","setContainerPose","winScrollY","setWinScrollY","calculateBounds","outerRect","contentRect","minX","minY","maxX","maxY","scrollY","adjustedCoords","calculateCoords","nextCoords","useOffset","max","calcCoords","JSON","stringify","useMouseDown","isPositionalElement","element","Element","HTMLDocument","domRectToObject","getRelativeBoundingClientRect","domElement","refereceDomElement","rect","refRec","pointWithinRectangle","withinX","withinY","pointWithinDomElement","referenceDomElement","POIFeatureModalContent","values_","info","NAME","ADDRESS","ZIP","CITY","poiListItem","SVIFeatureModalContent","goToPreparedMap","scrollTop","scroll","behavior","countyName","geolevel","allvals","sviValNum","vulnerableText","scopetext","dangerouslySetInnerHTML","__html","FeatureModal","setType","getFeatureSlug","HoveredFeatureModal","windowRef","isOpen","lastClick","isDragging","setIsDragging","dragOffset","setDragOffset","closeThisWindow","mouseup","dragbarClicked","dragBarRect","getLastClickOffset","getSelection","removeAllRanges","selection","empty","SVItitle","POItitle","DragArrow","HoveredFeatureTitle","offsetLeft","setOffsetLeft","titleRef","flip","setFlip","titleBounds","leftEdge","rightEdge","leftDiff","rightDiff","halfwayDown","RemoveMapMarkerButton","useAfterInit","deps","initialRender","effectReturns","defaultPropsFilter","child","addPropsToChildren","startIndex","prefix","suffix","propsFilter","rest","grandKidsInd","Children","variableToInspect","adjustedIndex","Fragment","grandChildren","isValidElement","adjustedProps","cloneElement","fn","Layers","onLoadStatus","mappedChildren","setMappedChildren","mappedKids","zIndex","Layer","addedToMap","setAddedToMap","constructor","onAdded","onPreRender","onPostRender","setOpacity","failsafeOpacity","isNaN","setZIndex","addLayer","removeLayer","VectorLayer","renderOrder","OLVectorLayer","OLVectorSource","updateFeatures","lyrSource","overlaps","setSource","VectorLayer2","loader","newFeatures","clear","addFeatures","Waiting","defaultLayerFilter","Map","projection","minZoom","maxZoom","initExtent","initViewExtent","maxExtent","onZoom","layerFilter","layerFilterFn","onClickFeature","onHoverFeature","onCenter","onInitMap","mapRef","mouseIsDown","setMouseIsDown","isWorking","setIsWorking","loadSet","setLoadSet","loadQueue","mouseDownAction","mouseUpAction","onmapclick","coordinate","pixelCollidesWithUI","targetFeatures","getFeaturesAtPixel","mouseoutMap","querySelectorAll","control","controlCollisionDetected","downloadButton","downloadCollisionDetected","mapPointerMove","hoveredFeatures","mapmoveend","m","mapObject","z","cid","delete","onChildLoadStatus","view","ol","showFullExtent","overlays","setTarget","fit","proj","getProjection","alas","initMap","undefined","getViewport","done","coord1","coord2","line","LineString","round","getLength","DrawExtent","setFeatures","redrawFeature","_offset","minx","miny","maxx","maxy","topLeft","bottomLeft","topRight","bottomRight","Feature","Polygon","drawExtentPolygon","lay","FipsTracker","onSourceInit","updateSource","nationalCountyFeatures","updateFips","fip","OLMSLayer","setLayer","active","setActive","fpoObj","OLMap","OLView","olms","lyrFound","CensusLayer","generateDataSlug","globalOpacity","setVisible","localOpacity","setLocalOpacity","setLyr","selected_data_slug","setSelectedDataSlug","once","refreshColors","refreshSVI","refreshFeatures","getGeometry","ffips","newfeatures","getSvi","canDecorate","localScope","success","decorated","decorateFeatures","getStyleFromFeature","featureWithinScope","restyleFeatures","context","globalCompositeOperation","CountyLayer","getDetailLevel","setDetail","changeQueue","isEmpty","prop","defaultStyle","getDefaultStyle","zoomStyle","boundsStyle","outlineFeatures","resolution","failure","CircleFeature","cirFeat","Point","centerCoord","image","Icon","scale","anchorXUnits","anchorYUnits","anchor","circleStyle","bubbleZoomSizeMatrix","2","subdivide","pixelRange","valueScaling","3","4","5","6","7","8","9","14","PoiBubble","poiInfo","calculateBubbleSize","valWithinRange","r1","r2","bubbleLimits","minimumValueScale","maximumValueScale","getAllIdsFromDistanceMap","ids","reduceTileLookupData","tileData","mapFn","outputTileArr","reducedList","outputPoiList","newPOI","state_data_cache","cached_poilookups","PoiLayer","DDS","loadStateGeometry","getStateGeometry","generateFeatures","fetchGeometry","distanceMap","useIDs","POI","tileLookupData","has","ID","formattedPoiData","formatGeometry","poiClusterToFeatures","preventPointsFromBeingInWater","points","keepPointOnDryLand","point","s","stateFeature","intersectsCoordinate","pointIsWithinUsState","newCenter","getClosestPoint","movePointToState","refreshLayer","poiClusters","poiGroup","getPixelCoordsFromCluster","getPixelFromCoordinate","mergeClusters","clusters","compiled","clust","separatePointsByRange","range","within","without","ca","rrange","cb","DT","groupSplit","statememo","tilePoiData","mapped","found","chunks","chunk","centers","merged","restClusters","clusterA","pop","boundary","outputClusters","clusterResults","mergePointsByPixel","chunksize","separatePoiDataByZoom","fetchPoiDataByExtent","bbox","onMapExtent","call","validateZoom","floorZoom","tileZ","iz","MapControls","React","ops","ZoomControl","zoomScreenControl","Zoom","Control","onMount","clickHandler","onclick","tehcontrol","olControl","render","innerHTML","renderToString","DownloadControl","ZoomNumberControl","setInput","sanitizeZoom","zoomStr","onInput","updateText","acontrol","inp","inputSTR","pattern","required","FullScreenControl","zoomTo","ZoomSelect","boxZoomInInteraction","DragZoom","condition","mapclick","out","btnCtrl","classList","toggle","contains","addInteraction","removeInteraction","filterGeometryByRegion","regionID","objectKeyName","geometries","geom","whiteListAbbr","currentStAbbr","properties","STUSPS","includes","geometryIsWithinRegion","mergeJsonByRegion","regions","r","clonedJson","parse","regionGeometry","mergedRegion","mergeArcs","StateLayer","reportLoadStatus","allStateFeatures","shapes","styleFeatures","RegionLayer","mergedRegionFeatures","regionJson","HHSregionsLayer","staticLabels","HHSRegID","createBoundaryFeatures","labels","createLabelFeatures","GridDebugLayer","OLTileLayer","OLTileDebug","FeatureOutlineLayer","localFeatures","setLocalFeatures","updateFeature","featr","clonedFeature","clone","borderStyle","IconFeature","iconFeat","pic","iconStyle","MapMarkerLayer","markerCoords","HighlightRegionLayer","stateFeatures","hhsFeatures","hhsRegions","MapController","defaultBbox","homeBbox","setHomeBbox","localStateRef","localTractRef","localScopeRef","streetmapLabels","streetmapLinesShapes","featureRef","featureIsWithinScope","ftr","stFIPS","validSviFeature","mustBeClickable","validPoiFeature","validateFeature","hoverFeatureHandler","prevID","nextID","ftrObject","handleFeatureClick","olmap","handleCensusEnabledStatus","simpleZoom","createXYZ","getTilesInView","layerName","sviLayerFilter","poiLayerFilter","ContentMap","inter","offsetWidth","uiHeight","total","elem","offsetHeight","contentHeight","updateSize","checkAdjustShortScreens","DownloadContext","downloading","csv","printState","printScope","csv_link","map_link","doc_link","reducer","DownloadProvider","setcsv_option","setmap_option","init_download","completeDownload","setFilter_option","setState_option","set_csv_link","set_map_link","set_doc_link","setPrintScope","actions","DownloadModal","regionDropdownElement","valid","setValid","localusState","setLocalusState","localMapCheck","setLocalMapCheck","localDataCheck","setLocalDataCheck","localTitleCheck","setLocalTitleCheck","localLegendCheck","setLocalLegendCheck","disablePR","setDisablePR","setPose","validateForm","onRadioClick","clearLinks","setSelectedRegion","selectedArea","selectedRegion","selectedState","getSelectedPrintArea","setStartingPose","xcoord","clientWidth","checked","int","useForce","DownloadModalBackground","Downloader","triggerDownload","onDownloadDoc","dataProps","loadJsonForDownload","req","blob","Blob","documentMode","navigator","msSaveBlob","URL","webkitURL","createObjectURL","onerror","downloadFile","downloadCSV","clonedp","csvState","tableColumns","convertMapToImage","mapdom","includeLegend","includeTitle","mapCanvas","mapContext","fillStyle","fillRect","mapDom","append","prototype","canvas","parentNode","globalAlpha","Number","matrix","transform","match","CanvasRenderingContext2D","setTransform","apply","drawImage","html2canvas","mapCopy","converted","toDataURL","restoreState","dimensions","dpi","downloadJPG","createSendDownload","addLegend","addTitle","print","mapImgUrl","web","getResolution","getWebDimensions","pageWidth","pageHeight","scaling","getPrintDimensions","webView","View","setSize","setView","AppDownloadController","aState","selectedFips","setSelectedFips","csvComplete","set_csvComplete","mapComplete","set_mapComplete","docComplete","set_docComplete","setFipsAndState","tehState","AppDownloader","tabs","TabsContent","tc","CDCheader","SVIBanner","DropCheck","onSelectItem","PointOfInterestUI","nominatimSearch","searchString","signal","countrycodes","q","limit","searchLookup","nominatimSearchStreet","street","nominatimLookup","osm_ids","photonSearch","boundingbox","osm_tag","mapboxSearch","country","proximity","autocomplete","types","onemapSuggestToken","credentialsUrl","geoCodeServerUrl","getCredentials","getCredentialsFromAPI","expires_in","onemapFindAddress","magicKey","creds","SearchUI","controller","usExtent","setExtent","useMapBox","setUseMapBox","setItems","justScrolled","setJustScrolled","convertBBoxFromLonLat","center1","center2","center1CV","fromLonLat","center2CV","map_nominatim","display_name","lat","lon","map_mapbox","newBBox","ctx","newObj","placeID","place_type","place_name","map_photon","countrycode","city","postcode","housenumber","osm_key","osm_id","osm_type","newext","couldBeHouse","firstLet","fallbackSearch","lookups","zipItem","houseItem","mzip","mhouse","getSelectionBBox","foundItem","candidates","xmin","ymin","xmax","ymax","onemapBoundingBox","transformExtent","precise","onInputEnter","preExtent","blur","activeElement","coord1LL","coord2LL","convertBBoxToLonLat","abort","AbortController","renderInput","onMenuVisibilityChange","OpacitySlider","step","MapTitle","scopeText","stateText","trackAdj","AdminControls","localZoom","setLocalZoom","localCenter","setLocalCenter","updateUI","un","changeZoom","ViewControls","Tablist","selectedTab","clickedTab","tabID","isSelected","aria-selected","aria-controls","MobileMenu","ErrorModal","messageText","setMessageText","MessageModal","vis","visClass","isIE","ua","userAgent","test","UnlessIE","AdobeAnalytics","_satellite","ch","prop3","host","prop5","prop16","pathname","prop41","prop8","sendPageView","str","satelite","dataObject","pageName","prop2","track","sendInteraction","eventLabel","eventValue","interactionType","interactionValue","Analytics","dataSlug","scrolled","Interface","CDCHeader","require","App","App404","checkDataDownloads","hasAllStrings","searchStr","outcome","stName","stateList","urlList","generateDataFilesListByType","urlArr","zips","csvs","batch404Lookup","found404","cleared","USE_APP","REACT_APP_BUILD","childNodes","ReactDOM","StrictMode"],"mappings":"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","file":"static/js/main.87ed0d99.chunk.js","sourcesContent":["import { Fill, Stroke, Style, Circle as CircleStyle, Icon } from 'ol/style';\r\nimport Text from 'ol/style/Text';\r\n\r\nimport * as olHas from 'ol/has';\r\nconst canvasHatchPattern = (() => {\r\n var pixelRatio;\r\n var p;\r\n var pctx;\r\n var x0 = 36;\r\n var x1 = -4;\r\n var y0 = -2;\r\n var y1 = 18;\r\n var offset = 32;\r\n\r\n pixelRatio = olHas.DEVICE_PIXEL_RATIO;\r\n p = document.createElement('canvas');\r\n p.width = 32 * pixelRatio;\r\n p.height = 16 * pixelRatio;\r\n pctx = p.getContext('2d');\r\n\r\n pctx.strokeStyle = '#000000';\r\n pctx.lineWidth = 1;\r\n pctx.beginPath();\r\n pctx.moveTo(x0, y0);\r\n pctx.lineTo(x1, y1);\r\n pctx.moveTo(x0 - offset, y0);\r\n pctx.lineTo(x1 - offset, y1);\r\n pctx.moveTo(x0 + offset, y0);\r\n pctx.lineTo(x1 + offset, y1);\r\n pctx.stroke();\r\n\r\n return pctx.createPattern(p, 'repeat');\r\n})();\r\n\r\nconst guide = new Style({\r\n stroke: new Stroke({\r\n color: '#000080',\r\n width: 7\r\n })\r\n});\r\nconst outline = new Style({\r\n stroke: new Stroke({\r\n color: '#000',\r\n width: 0.5\r\n // lineDash: [2, 4],\r\n })\r\n});\r\nconst outlineThick = new Style({\r\n stroke: new Stroke({\r\n color: '#000',\r\n width: 2\r\n // lineDash: [2, 4],\r\n })\r\n});\r\nconst outlineExtent = new Style({\r\n stroke: new Stroke({\r\n color: '#5992e1',\r\n width: 4,\r\n lineDash: [10, 5]\r\n })\r\n});\r\nconst outlineExtentTwo = new Style({\r\n stroke: new Stroke({\r\n color: 'navy',\r\n width: 4,\r\n lineDash: [10, 5]\r\n })\r\n});\r\n\r\nconst outlineHHS = new Style({\r\n stroke: new Stroke({\r\n color: '#ff5200',\r\n width: 7\r\n })\r\n});\r\n\r\nconst outlineHHSlow = new Style({\r\n stroke: new Stroke({\r\n color: '#ff5200',\r\n width: 3\r\n })\r\n});\r\n\r\nconst outlineRegion = new Style({\r\n stroke: new Stroke({\r\n color: '#daa520',\r\n width: 6\r\n })\r\n});\r\n\r\nconst outlineRegionLow = new Style({\r\n stroke: new Stroke({\r\n color: '#daa520',\r\n width: 5\r\n })\r\n});\r\n\r\nconst outlineState = new Style({\r\n stroke: new Stroke({\r\n color: '#000',\r\n width: 3\r\n })\r\n});\r\n\r\nconst outlineStateLow = new Style({\r\n stroke: new Stroke({\r\n color: '#000',\r\n width: 2\r\n })\r\n});\r\n\r\nconst outlineCounty = new Style({\r\n stroke: new Stroke({\r\n color: '#000',\r\n width: 2\r\n })\r\n});\r\nconst outlineCountyLow = new Style({\r\n stroke: new Stroke({\r\n color: '#000',\r\n width: 1\r\n })\r\n});\r\n\r\nconst outlineCensus = new Style({\r\n stroke: new Stroke({\r\n color: '#000',\r\n width: 1\r\n // lineDash: [2, 4],\r\n })\r\n});\r\n\r\nconst outlineFeatureHighlightCensus = new Style({\r\n stroke: new Stroke({\r\n color: '#0e5eaa',\r\n width: 3\r\n })\r\n});\r\nconst outlineFeatureHighlightCounty = new Style({\r\n stroke: new Stroke({\r\n color: '#00695b',\r\n width: 3\r\n })\r\n});\r\n\r\n//Convert A hex, rgb, or pattern value to a open layers style\r\nconst flatColorStyle = (color) => {\r\n return new Style({\r\n fill: new Fill({ color }),\r\n stroke: new Stroke({ color: '#000', width: 0.5 })\r\n });\r\n};\r\nconst flatColorCountyStyle = (color, low = false) => {\r\n return new Style({\r\n fill: new Fill({ color }),\r\n stroke: new Stroke({\r\n color: low ? '#000' : '#000',\r\n width: low ? 0.5 : 1\r\n })\r\n });\r\n};\r\nconst flatColorHoverStyle = (color) => {\r\n return new Style({\r\n fill: new Fill({ color }),\r\n stroke: new Stroke({ color: '#000', width: 4 })\r\n });\r\n};\r\nconst poiCircle = (val, color = '#808080') => {\r\n return val > 10\r\n ? `\r\n \r\n ${val}\r\n `\r\n : `\r\n \r\n ${val}\r\n \r\n `;\r\n};\r\nexport { poiCircle };\r\n\r\nconst circleStyle = (val, size, color, textColor = '#000000', offset = 'center') => {\r\n const distance = 10;\r\n const centerCoord = [20, 20];\r\n const offsets = {\r\n center: centerCoord,\r\n left: [centerCoord[0] + distance * -1, centerCoord[1]],\r\n top: [centerCoord[0], centerCoord[1] + distance * -1],\r\n right: [centerCoord[0] + distance * +1, centerCoord[1]],\r\n bottom: [centerCoord[0], distance * +1 + centerCoord[1]]\r\n };\r\n const selectedOffset = offsets[offset];\r\n return new Style({\r\n image: new Icon({\r\n opacity: 1,\r\n src: 'data:image/svg+xml;utf8,' + encodeURIComponent(poiCircle(val, color)),\r\n scale: (1 / 40) * size,\r\n anchorXUnits: 'pixels',\r\n anchorYUnits: 'pixels',\r\n anchor: selectedOffset\r\n })\r\n });\r\n};\r\n\r\nconst iconStyle = (pic, color, val) => {\r\n return new Style({\r\n image: new Icon({\r\n anchor: [0.5, 46],\r\n anchorXUnits: 'fraction',\r\n anchorYUnits: 'pixels',\r\n opacity: 1,\r\n scale: 0.8,\r\n src: pic,\r\n color: color + ''\r\n })\r\n });\r\n};\r\nconst hhsLabelStyle = (val, highlight = false, offset = 'center') => {\r\n const distance = 20;\r\n const offsets = {\r\n center: [0, 0],\r\n left: [distance * -1, 0],\r\n top: [0, distance * -1],\r\n right: [distance * +1, 0],\r\n bottom: [0, distance * +1]\r\n };\r\n const selectedOffset = offsets[offset];\r\n return new Style({\r\n text: new Text({\r\n font: 'bold 16px \"Montserrat\", sans-serif',\r\n text: val + '',\r\n fill: new Fill({\r\n color: 'white'\r\n }),\r\n padding: [4, 4, 4, 4],\r\n backgroundFill: new Fill({\r\n color: highlight ? '#daa520' : '#ff5200'\r\n }),\r\n backgroundStroke: new Stroke({\r\n color: highlight ? '#b8860b' : '#c13e01',\r\n width: 4\r\n }),\r\n offsetX: 0 + selectedOffset[0],\r\n offsetY: 0 + selectedOffset[1] * -1,\r\n rotation: 0\r\n })\r\n });\r\n};\r\nexport { hhsLabelStyle };\r\n\r\nconst noData = flatColorStyle(canvasHatchPattern);\r\n// const outOfScope = flatColorStyle('red'); //wthis is the color for when svi data cannot be mapped to geometry due to error\r\nconst outOfScope = flatColorStyle('#cccccc'); //wthis is the color for when svi data cannot be mapped to geometry due to error\r\nconst undefinedData = flatColorStyle('#cccccc'); //wthis is the color for when svi data cannot be mapped to geometry due to error\r\n\r\nexport { outlineFeatureHighlightCensus, outlineFeatureHighlightCounty, outlineExtent, outlineExtentTwo, canvasHatchPattern, outlineCensus, outlineThick, outlineRegion, outlineRegionLow, outlineState, outlineStateLow, outlineHHS, outlineHHSlow, outlineCounty, outlineCountyLow, guide, outline, noData, outOfScope, undefinedData, flatColorStyle, flatColorCountyStyle, flatColorHoverStyle, circleStyle, iconStyle };\r\n","import * as mapStyles from '../view/MapVectorStyles';\r\n\r\n// ΔVΔVΔ: Blue Green Yellow colors\r\nvar colorPalletA = { none: mapStyles.canvasHatchPattern, low: 'rgba(255, 255, 204, .7)', med: 'rgba(161, 218, 180, .7)', high: 'rgba(65, 182, 196, .7)', top: 'rgba(34, 94, 168, .7)' };\r\n// ΔVΔVΔ: Greens\r\nvar colorPalletB = { none: mapStyles.canvasHatchPattern, low: 'rgba(237, 248, 233, .7)', med: 'rgba(186, 228, 179, .7)', high: 'rgba(116, 196, 118, .7)', top: 'rgba(35, 139, 69 , .7)' };\r\n// ΔVΔVΔ: Oranges\r\nvar colorPalletC = { none: mapStyles.canvasHatchPattern, low: 'rgba(255, 255, 212, .7)', med: 'rgba(254, 217, 142, .7)', high: 'rgba(254, 153, 41, .7)', top: 'rgba(204, 72, 2 , .7)' };\r\n// ΔVΔVΔ: Purples\r\nvar colorPalletD = { none: mapStyles.canvasHatchPattern, low: 'rgba(242, 240, 247, .7)', med: 'rgba(203, 201, 226, .7)', high: 'rgba(158, 154, 200, .7)', top: 'rgba(106, 81, 163, .7)' };\r\n// ΔVΔVΔ: Blues\r\nvar colorPalletE = { none: mapStyles.canvasHatchPattern, low: 'rgba(239, 243, 255, .7)', med: 'rgba(189, 215, 231, .7)', high: 'rgba(107, 174, 214, .7)', top: 'rgba(33, 113, 181, .7)' };\r\n\r\n//Convert A hex, rgb, or pattern value to a open layers style\r\n// const flatColorStyle = (color) => {\r\n// return new Style({\r\n// fill: new Fill({ color }),\r\n// stroke: new Stroke({ color: \"#000\" }),\r\n// });\r\n// };\r\n\r\n//Convert each Theme attribute to an open layers style\r\nconst colorSchemeToStyle = (scheme) => {\r\n Object.keys(scheme).forEach((key) => {\r\n let color = scheme[key];\r\n scheme[key] = mapStyles.flatColorStyle(color);\r\n scheme[key + '_county'] = mapStyles.flatColorCountyStyle(color);\r\n scheme[key + '_low'] = mapStyles.flatColorStyle(color, true);\r\n scheme[key + '_low_county'] = mapStyles.flatColorCountyStyle(color, true);\r\n scheme[key + '_hover'] = mapStyles.flatColorHoverStyle(color);\r\n });\r\n return scheme;\r\n};\r\n\r\nconst colorSchemeA = colorSchemeToStyle({ ...colorPalletA });\r\nconst colorSchemeB = colorSchemeToStyle({ ...colorPalletB });\r\nconst colorSchemeC = colorSchemeToStyle({ ...colorPalletC });\r\nconst colorSchemeD = colorSchemeToStyle({ ...colorPalletD });\r\nconst colorSchemeE = colorSchemeToStyle({ ...colorPalletE });\r\n\r\n// const noDataStyle = flatColorStyle(mapStyles.canvasHatchPattern);\r\n// var undefinedAreaColorScheme = flatColorStyle(\"#cccccc\");\r\n\r\n// ΔVΔVΔ: Global themes\r\nconst sviThemes = [\r\n { id: 0, xicon: 'globe', label: 'Overall SVI', labelPast: 'Overall SVI', label2020: 'Overall SVI', slug: 'overall_svi', colorPallet: colorPalletA, colorScheme: colorSchemeA, dataNames: [''] },\r\n { id: 1, xicon: 'building', label: 'Socioeconomic Status', labelPast: 'Socioeconomic Status', label2020: 'Socioeconomic Status', slug: 'socioeconomic_status', colorPallet: colorPalletB, colorScheme: colorSchemeB, dataNames: [''] },\r\n { id: 2, xicon: 'house', label: 'Household Composition & Disability', labelPast: 'Household Composition & Disability', label2020: 'Household Characteristics', slug: 'household_composition_disability', colorPallet: colorPalletC, colorScheme: colorSchemeC, dataNames: [''] },\r\n { id: 3, xicon: 'language', label: 'Minority Status & Language', labelPast: 'Minority Status & Language', label2020: 'Racial & Ethnic Minority Status', slug: 'minority_status_language', colorPallet: colorPalletD, colorScheme: colorSchemeD, dataNames: [''] },\r\n { id: 4, xicon: 'car', label: 'Housing Type & Transportation', labelPast: 'Housing Type & Transportation', label2020: 'Housing Type & Transportation', slug: 'housing_rype_transportation', colorPallet: colorPalletE, colorScheme: colorSchemeE, dataNames: [''] }\r\n];\r\n\r\nexport { sviThemes };\r\n","// ΔVΔVΔ: This code must be run at the start of the app or SCRIPT_URL will be null\r\nconst getLocalReactPath = () => {\r\n const scriptPath = document.currentScript.src;\r\n const divide = scriptPath.indexOf('/static/js/');\r\n return scriptPath.substring(0, divide);\r\n};\r\n\r\nconst SCRIPT_URL = getLocalReactPath();\r\nexport { SCRIPT_URL };\r\n","import StatesList from './StaticStatesList.json';\r\nimport CountiesList from './StaticCountiesList.json';\r\nimport { SCRIPT_URL } from '../controller/ScriptUrl';\r\n\r\nconst localDevelopment = (() => {\r\n const localurl = 'http://localhost';\r\n var h = window.location.origin || localurl; //fallback for local testing\r\n return h.substring(0, 16) === localurl;\r\n})();\r\nconst debugMode = Boolean(window.location.search === '?debug=direct');\r\nconst statesList = Array.isArray(StatesList) ? StatesList : Object.values(StatesList);\r\nconst countiesList = Array.isArray(CountiesList) ? CountiesList : Object.values(CountiesList);\r\n\r\nconst PUBLIC_URL = process.env?.PUBLIC_URL;\r\nexport { PUBLIC_URL };\r\n\r\nconst DATA_URL = process.env?.REACT_APP_DATA_URL?.trim() || SCRIPT_URL + '/data';\r\nexport { DATA_URL };\r\n\r\nexport { SCRIPT_URL };\r\n\r\nconst scopeList = ['national', 'state'];\r\n\r\nconst tractList = ['county', 'census'];\r\n\r\nconst minCensusZoom = 8;\r\n\r\nconst staticYearList = [\r\n { id: 5, label: 2020, columns: '2020', localdoc: 'SVI2020Documentation_08.05.22.pdf', varpage: 7, docs: '/placeandhealth/svi/map/data/docs/SVI2020Documentation_08.05.22.pdf', filename: 'svi_2020_Documentation.pdf' },\r\n { id: 4, label: 2018, columns: 'before2020', localdoc: 'SVI2018Documentation_01192022_1.pdf', varpage: 6, docs: 'https://www.atsdr.cdc.gov/placeandhealth/svi/documentation/pdf/SVI2018Documentation_01192022_1.pdf', filename: 'svi_2018_Documentation.pdf' },\r\n { id: 3, label: 2016, columns: 'before2020', localdoc: 'SVI2016Documentation_01192022.pdf', varpage: 5, docs: 'https://www.atsdr.cdc.gov/placeandhealth/svi/documentation/pdf/SVI2016Documentation_01192022.pdf', filename: 'svi_2016_Documentation.pdf' },\r\n { id: 2, label: 2014, columns: 'before2020', localdoc: 'SVI2014Documentation_01192022.pdf', varpage: 5, docs: 'https://www.atsdr.cdc.gov/placeandhealth/svi/documentation/pdf/SVI2014Documentation_01192022\".pdf', filename: 'svi_2014_Documentation.pdf' },\r\n { id: 1, label: 2010, columns: 'before2020', localdoc: 'SVI-2010-Documentation-H.pdf', varpage: 2, docs: 'https://www.atsdr.cdc.gov/placeandhealth/svi/documentation/pdf/SVI-2010-Documentation-H.pdf', filename: 'svi_2010_Documentation.pdf' },\r\n { id: 0, label: 2000, columns: 'before2020', localdoc: 'SVI2000Documentation-H.pdf', varpage: 2, docs: 'https://www.atsdr.cdc.gov/placeandhealth/svi/documentation/pdf/SVI2000Documentation-H.pdf', filename: 'svi_2000_Documentation.pdf' }\r\n];\r\n// [-8963431.22589316, 4711436.653467792, -7452829.01045942, 6017435.399903431]\r\nconst staticRegions = [\r\n { id: 90, label: 'North East', slug: 'north', states: ['CT', 'ME', 'MA', 'NH', 'RI', 'VT', 'NJ', 'NY', 'PA'], bounds: [-8963431.22589316, 4711436.653467792, -7452829.01045942, 6017435.399903431] },\r\n { id: 91, label: 'Midwest', slug: 'midwest', states: ['IA', 'IL', 'MI', 'OH', 'WI', 'IN', 'KS', 'MN', 'MO', 'NE', 'ND', 'SD'], bounds: [-11583671.057132892, 4300030.803637005, -8963298.449877389, 6340327.948480618] },\r\n { id: 92, label: 'South', slug: 'south', states: ['DE', 'DC', 'FL', 'GA', 'MD', 'NC', 'SC', 'VA', 'WV', 'AL', 'KY', 'MS', 'TN', 'AR', 'LA', 'OK', 'TX'], bounds: [-11871738.107350338, 2817279.165905216, -8354406.609551439, 4959208.80562331] },\r\n { id: 93, label: 'West', slug: 'west', states: ['AZ', 'CO', 'ID', 'NM', 'MT', 'UT', 'NV', 'WY', 'AK', 'CA', 'HI', 'OR', 'WA'], bounds: [-13888558.366914133, 3675966.7275074017, -11359213.202471135, 6275282.0832699165] },\r\n { id: 101, label: 'HHS Region 1', slug: 'hhs_1', bounds: [-8207048.885487032, 5012035.78267602, -7454920.732438947, 6016392.843228203] },\r\n { id: 102, label: 'HHS Region 2', slug: 'hhs_2', bounds: [-8879202.748137256, 4715458.061657053, -8000410.112031289, 5622432.644064123] },\r\n { id: 103, label: 'HHS Region 3', slug: 'hhs_3', bounds: [-9314669.693540633, 4375378.482643267, -8315453.342702627, 5201183.892387872] },\r\n { id: 104, label: 'HHS Region 4', slug: 'hhs_4', bounds: [-10201783.354081057, 2870403.981349898, -8399819.28488534, 4742074.857426927] },\r\n { id: 105, label: 'HHS Region 5', slug: 'hhs_5', bounds: [-10823548.790989276, 4437201.018921441, -8963337.550752344, 6338102.318433109] },\r\n { id: 106, label: 'HHS Region 6', slug: 'hhs_6', bounds: [-12139657.48903961, 2980058.997398602, -9909854.080172105, 4439285.342256802] },\r\n { id: 107, label: 'HHS Region 7', slug: 'hhs_7', bounds: [-11583535.68933657, 4299155.480271736, -9919099.662877059, 5388633.782217532] },\r\n { id: 108, label: 'HHS Region 8', slug: 'hhs_8', bounds: [-12920215.80890543, 4437548.37768374, -10735715.755292203, 6274851.243617513] },\r\n { id: 109, label: 'HHS Region 9', slug: 'hhs_9', bounds: [-17838403.528806202, 2146081.977474044, -12138964.070336737, 5161336.555302727] },\r\n { id: 110, label: 'HHS Region 10', slug: 'hhs_10', bounds: [-19839378.76572607, 5159096.592124039, -12361782.61352615, 11542482.88598487] }\r\n];\r\n/*\r\nnorth:\r\n========\r\n-86.6162109, 47.4610385\r\n-59.4873083, 47.4610385\r\n-59.4873083, 37.2303284\r\n-86.6162109, 37.2303284\r\n-86.6162109, 47.4610385\r\n\r\nmidwest:\r\n=======\r\n-115.6640598, 46.9238494\r\n-89.7656259, 46.9238494\r\n-89.7656259, 36.3239001\r\n-115.6640598, 36.3239001\r\n\r\nsouth\r\n======\r\n-110.8740261, 37.9396502\r\n-86.1767605, 37.9396502\r\n-86.1767605, 26.0247440\r\n-110.8740261, 26.0247440\r\n\r\nwest\r\n======\r\n-115.6640598, 46.9238494\r\n-89.7656259, 46.9238494\r\n-89.7656259, 36.3239001\r\n-115.6640598, 36.3239001\r\n*/\r\nconst tabList = [\r\n { id: 0, label: 'Map', slug: 'map', icon: 'map' },\r\n { id: 1, label: 'Table', slug: 'data', icon: 'table' },\r\n { id: 2, label: 'More', slug: 'info', icon: 'info' },\r\n { id: 3, label: 'Details', slug: 'details', close: true, hidden: true }\r\n];\r\n\r\nconst staticPOIList = [\r\n { id: 0, label: 'Streets & Roads', slug: 'streetmap', icon: 'map-signs' },\r\n { id: 1, label: 'HHS Regions', slug: 'hhsregion', icon: 'road' },\r\n { id: 2, label: 'Nursing Home', slug: 'nursinghome', icon: 'hand-holding-heart', color: '#b78907', textColor: '#000', offset: 'left', blacklist: [] },\r\n { id: 3, label: 'Hospital', slug: 'hospital', icon: 'building', color: '#2b5ddf', textColor: '#fff', offset: 'top', blacklist: [] },\r\n { id: 4, label: 'Daycare Center', slug: 'daycare', icon: 'baby', color: '#b76fb0', textColor: '#000', offset: 'right', blacklist: [] },\r\n { id: 5, label: 'Public School', slug: 'school', icon: 'school', color: '#db1325', textColor: '#fff', offset: 'bottom', blacklist: [37422] }\r\n];\r\n\r\nconst mercator = 'EPSG:3857'; //https://epsg.io/3857\r\nconst latlon = 'EPSG:4326'; //https://epsg.io/4326\r\n\r\nconst dataProjection = 'EPSG:4326';\r\nconst featureProjection = 'EPSG:3857';\r\n\r\nconst app_coordinates = {\r\n worldCenter: [0, 0],\r\n usCenter4326: [-98.5789045063735, 39.85508149128133],\r\n usCenter3857: [-10973753.45260824, 4844905.410136566]\r\n};\r\n//left,bottom,right,top\r\nconst app_extents = {\r\n contiguous_us_and_pr: [-14150703.25072198, 1724460.655959669, -7075872.59319234, 6815350.164313462], //mercator\r\n max_map_bounds: [-28150703.25072198, -80000.1396078935, 339584.7237982075, 12446275.841017159] //mercator\r\n};\r\n\r\nconst mapStaticVariables = {\r\n extents: app_extents,\r\n coordinates: app_coordinates,\r\n projections: { mercator, latlon }\r\n};\r\nexport { mapStaticVariables };\r\n\r\nexport { localDevelopment, debugMode, staticPOIList, scopeList, tractList, countiesList, staticYearList, staticRegions, statesList, tabList, dataProjection, featureProjection, minCensusZoom };\r\n\r\nconst getState = (fips) => {\r\n let stateFips = String(fips).substring(0, 2);\r\n return statesList.find((st) => st.id === stateFips);\r\n};\r\nconst getStateName = (fips) => {\r\n let state = getState(fips);\r\n return state?.label || '';\r\n};\r\nexport { getState, getStateName };\r\n\r\nconst getCounty = (fips) => {\r\n let countyFips = String(fips).substring(0, 5);\r\n return countiesList.find((cnt) => cnt.cc + '' == countyFips || cnt.CC + '' == countyFips);\r\n};\r\nconst getCountyName = (fips) => {\r\n let county = getCounty(fips);\r\n return county?.CN || '';\r\n};\r\nexport { getCounty, getCountyName };\r\n","const TEXTS = {\r\n cdc: 'Centers for Disease Control and Prevention',\r\n cdc_subtext: 'CDC 24/7 Saving Lives Protecting People™',\r\n svi: '(Social Vulnerability Index)',\r\n cdc_banner: 'CDC/ATSDR SVI',\r\n popup: {\r\n featureInfo: {\r\n label: 'Identify Result',\r\n button: 'Social Vulnerability Info'\r\n }\r\n },\r\n modals: {\r\n download: {\r\n label: 'Select Information for Download',\r\n link: 'Select All',\r\n maplabel: 'Map (JPG)',\r\n datalabel: 'Data (CSV)',\r\n titleCheck: 'Title',\r\n legendCheck: 'Legend',\r\n currentMap: 'Current Map View',\r\n currentData: 'Current Data Selections',\r\n select_state: 'Select State',\r\n select_county: 'Select County',\r\n usmap: 'United States',\r\n button: 'Download'\r\n },\r\n autoSwitchCensus: {\r\n text: 'Geographic Unit switched to County. Census tracts can be accessed again by zooming in and toggling to the Census Tracts Geographic Unit.'\r\n },\r\n autoSwitchDCtract: {\r\n text: 'There is no State comparison data for county, switched to census'\r\n }\r\n },\r\n legend: {\r\n label: 'Level of Vulnerability',\r\n tooltip: 'Legend',\r\n low: {\r\n label: 'Low',\r\n tooltip: '0.0-0.25 (Least Vulnerable 25%)'\r\n },\r\n med: {\r\n label: 'Low-Medium',\r\n tooltip: '0.2501-0.50'\r\n },\r\n high: {\r\n label: 'Medium-High',\r\n tooltip: '0.5001-0.75'\r\n },\r\n top: {\r\n label: 'High',\r\n tooltip: '0.7501-1.0 (Most Vulnerable 25%)'\r\n },\r\n none: {\r\n label: 'No Data',\r\n tooltip: 'No Data'\r\n },\r\n non_applicable: {\r\n label: 'N/A',\r\n tooltip: 'Area out of scope'\r\n }\r\n },\r\n controls: {\r\n svi_select: {\r\n label: 'SVI Theme',\r\n tooltip: 'Select Overall SVI or one of the SVI themes to display on the map',\r\n tooltiptable: 'Select Overall SVI or one of the SVI themes to display in the table'\r\n },\r\n comparison: {\r\n label: 'Geographic Comparison',\r\n option1: 'Nationwide',\r\n option2: 'Statewide',\r\n tooltip: 'Toggle to view nationwide or statewide data comparison level'\r\n },\r\n state_select: {\r\n label: 'State Selection',\r\n placeholder: 'Select',\r\n tooltip: 'Choose state/district/territory',\r\n disabled: 'Switch Geographic Comparison to Statewide to select a state/district/territory'\r\n },\r\n data_level: {\r\n label: 'Geographic Unit',\r\n option1: 'County',\r\n option2: 'Census Tract',\r\n tooltip: 'Toggle to view SVI data at either county level or census tract level',\r\n disabled: 'Toggle to view SVI data at either county level or census tract level',\r\n helpText: 'Jump to **Zoom Level 8** to view Census Tracts'\r\n },\r\n data_year: {\r\n label: 'Data Year',\r\n tooltip: 'Select SVI data year'\r\n },\r\n reset_button: {\r\n label: 'Reset',\r\n tooltip: 'Click to reset data selections',\r\n resetTooltip: 'To view all of the SVI data, click to reset data selections'\r\n },\r\n poi_select: {\r\n label: 'Map Features',\r\n placeholder: 'Click to view',\r\n tooltip: 'Click to choose map feature layers'\r\n },\r\n svi_opacity: {\r\n label: 'Map Transparency',\r\n tooltip: 'Scroll to adjust transparency levels of the selected SVI layer'\r\n },\r\n search_box: {\r\n label: 'Find address, county, or ZIP code',\r\n tooltip: 'Although search for ZIP or address is available, results will only show county or census tract information'\r\n },\r\n zoom_level: {\r\n tooltip: 'Zoom level'\r\n },\r\n zoom_in: {\r\n tooltip: 'Zoom in on map'\r\n },\r\n zoom_out: {\r\n tooltip: 'Zoom out on map'\r\n },\r\n reset_to_full_extent: {\r\n tooltip: 'Zoom to original map view'\r\n },\r\n night_day_mode: {\r\n tooltip: 'Switch between night and day mode'\r\n },\r\n full_screen: {\r\n tooltip: 'View in full screen'\r\n },\r\n zoom_select: {\r\n tooltip: 'Click and Drag to Zoom'\r\n },\r\n download: {\r\n tooltip: 'Download…'\r\n },\r\n expandCollapse: {\r\n tooltip: 'Click to hide/expand data selections'\r\n }\r\n },\r\n errorMessages: {\r\n 101: {\r\n name: 'DataServiceError',\r\n devNotes: 'An error occured that not been yet documented in this app.',\r\n message: 'Unknown Error'\r\n },\r\n 400: {\r\n name: 'URLError',\r\n devNotes: 'Problem generating url string (probably in code)',\r\n message: 'An error occured loading the page'\r\n },\r\n 403: {\r\n name: 'Permission Error',\r\n devNotes: 'Expired Password',\r\n message: 'An error occured loading the page'\r\n },\r\n 401: {\r\n name: 'LoginAttemptError',\r\n devNotes: 'API User/password is wrong',\r\n message: 'An error occured loading the page'\r\n },\r\n 405: {\r\n name: 'LoginAttemptError',\r\n devNotes: 'API User/password is wrong',\r\n message: 'An error occured loading the page'\r\n },\r\n 498: {\r\n name: 'TokenError',\r\n devNotes: 'Token may have expired or was overriden by another cient',\r\n message: 'An error occured loading the page'\r\n },\r\n 405: {\r\n name: 'DataServiceError',\r\n devNotes: 'Too many login attempts with incorrect credentials',\r\n message: 'An error occured loading the page'\r\n },\r\n 503: {\r\n name: 'DataServiceError',\r\n devNotes: 'server is down',\r\n message: 'Server is unavailable'\r\n }\r\n }\r\n};\r\nexport default TEXTS;\r\n","var init = false; // ΔVΔVΔ: delete token on page load\r\n\r\nconst LocalStorageService = (function () {\r\n var _service;\r\n function _getService() {\r\n if (!_service) {\r\n _service = this;\r\n return _service;\r\n }\r\n return _service;\r\n }\r\n function _setToken(tokenObj) {\r\n localStorage.setItem('access_token', tokenObj.access_token);\r\n localStorage.setItem('refresh_token', tokenObj.refresh_token);\r\n localStorage.setItem('token_expires', tokenObj.expires);\r\n }\r\n function _getAccessToken() {\r\n let token = localStorage.getItem('access_token');\r\n const expires = localStorage.getItem('token_expires');\r\n if (expires == 'undefined' || new Date().getTime() + 20 > expires || !expires) {\r\n _clearToken();\r\n return false;\r\n }\r\n return token;\r\n }\r\n function _getRefreshToken() {\r\n return localStorage.getItem('refresh_token');\r\n }\r\n function _clearToken() {\r\n localStorage.removeItem('access_token');\r\n localStorage.removeItem('refresh_token');\r\n localStorage.removeItem('token_expires');\r\n }\r\n if (!init) {\r\n delete window.localStorage.access_token;\r\n init = true;\r\n }\r\n return {\r\n getService: _getService,\r\n setToken: _setToken,\r\n getAccessToken: _getAccessToken,\r\n getRefreshToken: _getRefreshToken,\r\n clearToken: _clearToken\r\n };\r\n})();\r\nexport default LocalStorageService;\r\n","import axios from 'axios';\r\nimport LocalStorageService from './LocalStorageService';\r\nimport TEXT from '../controller/TextVariables';\r\nimport { localDevelopment } from './StaticVariables';\r\nimport { getZoomFromTileKey } from './DataTransformation';\r\nclass DataServiceError extends Error {\r\n code;\r\n name;\r\n description;\r\n modalMessage;\r\n config;\r\n\r\n constructor(code = 101, message, options = {}) {\r\n //leave here for later troubleshooting\r\n if (!(code in TEXT.errorMessages)) {\r\n console.log(code);\r\n console.log(TEXT.errorMessages);\r\n console.log(message);\r\n console.log(options);\r\n }\r\n const { name, devNotes: description, message: modalMessage } = code in TEXT.errorMessages ? TEXT.errorMessages[code] : TEXT.errorMessages[101];\r\n const combinedMessage = `${code}: API MESSAGE: ${message}: ${description}`;\r\n super(combinedMessage, options);\r\n this.code = code;\r\n this.name = name;\r\n this.description = description;\r\n this.modalMessage = modalMessage;\r\n this.config = options.config;\r\n }\r\n}\r\n\r\nclass DataService {\r\n _verbose = false;\r\n _localStorageService = LocalStorageService;\r\n _needsAuth = false;\r\n _name = 'Data Service';\r\n _client = axios.create({\r\n baseURL: '',\r\n params: { token: '' }\r\n });\r\n _requestCount = 0;\r\n _authClient = axios.create({});\r\n _queue = [];\r\n _authStatus = 0; //0. Unset, 1. Authenticated, -1. Invalid username and Password\r\n _token = false;\r\n _axiosSource = axios.CancelToken.source();\r\n\r\n constructor(props) {\r\n this._needsAuth = props?._needsAuth;\r\n this._name = props?._name;\r\n\r\n this._token = this.authenticate()\r\n .then((res) => {\r\n this._authStatus = 1;\r\n return res;\r\n })\r\n .catch((err) => {\r\n this._authStatus = -1;\r\n return false;\r\n });\r\n\r\n this._client.interceptors.request.use(this.requestInterceptor);\r\n this._client.interceptors.response.use(this.responseInterceptor, this.responseError);\r\n //ΔVΔVΔ: Uncomment to rest token refresh\r\n // setTimeout(async() => {\r\n // console.log('BRK: ')\r\n // this._token = await this._token +'break'\r\n // },10 * 1000)\r\n }\r\n responseError = async (err) => {\r\n if (err.code === 498 && !err.config._retry) {\r\n this._token = await this.authenticate();\r\n return this._client({ _retry: true, ...err.config });\r\n }\r\n return Promise.reject(err);\r\n };\r\n responseInterceptor = (res) => {\r\n //ΔVΔVΔ: Error Handling\r\n if (res.data?.[0]?.status === 'error' || res.data?.error) {\r\n const rawError = res.data?.[0] || res.data.error;\r\n var code = res.data?.error?.code || 505;\r\n var codeDetails = rawError.details?.[0]?.toLowerCase();\r\n if (codeDetails && codeDetails?.indexOf('too many') !== -1) {\r\n code = 405;\r\n }\r\n if (codeDetails && codeDetails.indexOf('invalid username or password') !== -1) {\r\n code = 401;\r\n }\r\n const message = res.data.message || res.data?.error?.message;\r\n var error = new DataServiceError(code, message, { ...res });\r\n throw error;\r\n }\r\n return res;\r\n };\r\n _callsAreAuthorized = async () => {\r\n if (!this._needsAuth) return true;\r\n if (this._authStatus === -1) return false;\r\n if ((await this._token) === 'invalid') return false;\r\n return true;\r\n };\r\n requestInterceptor = async (config) => {\r\n //if congif has keys: data,reponse, or headers, then this interceptor was set to response on accident\r\n if (!this._needsAuth || config.params?.needsAuth === 'false') {\r\n if (config.params.hasOwnProperty('token')) delete config.params.token;\r\n if (config.params.needsAuth) delete config.params.needsAuth;\r\n return config;\r\n }\r\n // ΔVΔVΔ:remove below validation with _callsAreAuthorized\r\n const tok = await this._token; //await for inherited calls\r\n if (tok === 'invalid') {\r\n throw this._client.cancel('Authorization faild ignore request');\r\n }\r\n if (config?.body) config.body.token = tok;\r\n if (config?.params) config.params.token = tok;\r\n return config;\r\n };\r\n // ΔVΔVΔ: Function that takes args and uses a switch case to return the request config to pass to axios for a lookup\r\n _api = (args) => {\r\n return { url: '', body: {}, head: {} };\r\n };\r\n // ΔVΔVΔ: Adds additional pre-flight formatting for config calls\r\n formatCall = (args) => {\r\n const callObj = this._api(args);\r\n callObj.args = args;\r\n this.applyFilterAuth(callObj);\r\n return callObj;\r\n };\r\n\r\n // ΔVΔVΔ: Use for inheritance\r\n applyFiltertransformData = (callObj, res) => {\r\n if (!res || !res.data) return [];\r\n return res.data ? res.data : [];\r\n };\r\n //ΔVΔVΔ: Funtion that returns the request config to pass to axios for the authorization lookup\r\n getAuthCall = () => {\r\n return { url: '', body: {}, head: {} };\r\n };\r\n // ΔVΔVΔ: Format api Operation slug\r\n formatSlug = (args) => {\r\n const { type, scope, tract } = args;\r\n return [type, scope, tract]\r\n .filter((a) => a)\r\n .join('_')\r\n .toLocaleLowerCase()\r\n .replace(/ /g, '_');\r\n };\r\n // ΔVΔVΔ: Check if authentication token is needed/exists otherwise run the auth call and return the token\r\n authenticate = async () => {\r\n if (!this._needsAuth) return 'N/A';\r\n\r\n const startToken = this._localStorageService.getAccessToken();\r\n if (startToken && startToken === 'invalid') {\r\n // throw new Error(\"invalid token clear cache\");\r\n return 'invalid';\r\n }\r\n if (startToken && startToken !== 'undefined') return startToken;\r\n const callObj = this.getAuthCall();\r\n return await axios\r\n .post(callObj.url, callObj.body)\r\n .then((res) => {\r\n this.responseInterceptor(res); //see if there is an error and throw\r\n let dat = this.applyFiltertransformData(callObj, res);\r\n this._localStorageService.setToken({ access_token: dat.token, expires: dat.expires });\r\n return dat.token;\r\n })\r\n .catch((err) => {\r\n this._localStorageService.setToken({ access_token: 'invalid' });\r\n throw err;\r\n });\r\n };\r\n // ΔVΔVΔ: Alters the config to add authorization based on api requirments\r\n applyFilterAuth = (callObj) => {\r\n if (this._needsAuth && callObj.url.length) {\r\n callObj.body.token = this._localStorageService.getAccessToken();\r\n }\r\n return callObj;\r\n };\r\n\r\n get = async (callObj, allowParamTransform = true) => {\r\n this._requestCount++;\r\n const needsAuth = this._needsAuth;\r\n const id = this._requestCount;\r\n return this._client\r\n .get(callObj.url, {\r\n params: callObj.body,\r\n cancelToken: this._axiosSource.token,\r\n paramsSerializer: function paramsSerializer(params) {\r\n if (!needsAuth) delete params.token; //ΔVΔVΔ: remove token from config if this data service does not need authentication\r\n return Object.entries(Object.assign({}, params))\r\n .map(([key, value]) => `${key}=${value}`)\r\n .join('&');\r\n }\r\n })\r\n .then((res) => {\r\n return this.applyFiltertransformData(callObj, res);\r\n });\r\n // .catch((err) => {\r\n // console.log(\"DATA SERvice\", err);\r\n // // return this.onError(callObj, err);\r\n // throw err;\r\n // });\r\n };\r\n post = async (callObj) => {\r\n const needsAuth = this._needsAuth;\r\n if (!needsAuth) delete callObj.body.token;\r\n return this._client.post(callObj.url, callObj.body).then((res) => {\r\n return this.applyFiltertransformData(callObj, res);\r\n });\r\n };\r\n getListData = async (scope) => {\r\n const callObj = this.formatCall({ type: 'list', scope });\r\n return this.get(callObj).then((data) => {\r\n return data.Table ? data.Table : data; //this may be specofoc to an a, maybe move to the api specific file as a data transform\r\n });\r\n };\r\n getPOIData = async (props) => {\r\n const { scope, extent, year, tileKey } = props;\r\n let zoom = getZoomFromTileKey(tileKey);\r\n if (localDevelopment) {\r\n const url = `/mock/${tileKey.replace(/:/g, '_')}_${zoom}_nursinghome_poi.json`;\r\n // const url = `/mock/${tileKey.replace(/:/g, '_')}_${zoom}_${scope}_poi.json`;\r\n return fetch(url)\r\n .then((data) => data.json())\r\n .catch(() => {\r\n return { Table: [], Table1: [{ Count: 0 }] };\r\n });\r\n }\r\n // console.log(props);\r\n const callObj = this.formatCall({ type: 'poi', scope, extent, year, tileKey });\r\n return this.post(callObj).then((data) => {\r\n // var filename = `${tileKey}_${zoom}_${scope}_poi.json`;\r\n // if (!downloadList[filename]) {\r\n // var jsonstr = jsonToDownloadString(data);\r\n // downloadString(jsonstr, filename);\r\n // downloadList[filename] = true;\r\n // console.log(downloadList);\r\n // }\r\n return data;\r\n // return data.Table ? data.Table : data;\r\n // return { Table: [], Table1: [{ Count: 0 }] };\r\n });\r\n };\r\n getGeometryData = async (props) => {\r\n const { type = 'geometry', scope, extent, tract, state, year } = props;\r\n const callObj = this.formatCall({ type, scope, tract, state, year, extent });\r\n return await this.get(callObj);\r\n };\r\n getSVIData = async (props) => {\r\n const { type = 'svi', scope, extent, tract, state, year } = props;\r\n const callObj = this.formatCall({ type, scope, tract, state, year, extent });\r\n return await this.post(callObj);\r\n };\r\n getBaseMapPath = () => {\r\n const { type = 'base', scope = 'geometry' } = {};\r\n return this.formatCall({ type, scope }).url;\r\n };\r\n getBaseStyleData = async (props) => {\r\n //base_style\r\n const { type = 'base', scope = 'style' } = {};\r\n const callObj = this.formatCall({ type, scope });\r\n return this.get(callObj);\r\n };\r\n}\r\nexport { DataService };\r\n\r\n// https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=year%3D2018\r\n\r\n// // JSON call\r\n// //https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=year%3D2018&f=pjson\r\n\r\n// //Returns Json all Fields for year 2018\r\n// // https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=year%3D2018&outFields=*&returnGeometry=false&f=pjson\r\n\r\n// // Returns pbf\r\n// // https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=year%3D2018&outFields=*&returnGeometry=false&f=pbf\r\n\r\n// https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=year%3D2018+AND+comparison%3D%27national%27+AND+ST%3D%2701%27&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Foot&relationParam=&outFields=&returnGeometry=true&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&gdbVersion=&historicMoment=&returnDistinctValues=false&returnIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&orderByFields=&groupByFieldsForStatistics=&outStatistics=&returnZ=false&returnM=false&multipatchOption=xyFootprint&resultOffset=&resultRecordCount=&returnTrueCurves=false&returnExceededLimitFeatures=false&quantizationParameters=&returnCentroid=false&sqlFormat=none&resultType=&featureEncoding=esriDefault&datumTransformation=&f=json\r\n// https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=year%3D2018+AND+comparison%3D%27national%27+AND+ST%3D%2701%27&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&distance=&units=esriSRUnit_Foot&relationParam=&outFields=&returnGeometry=true&maxAllowableOffset=&geometryPrecision=&outSR=&havingClause=&gdbVersion=&historicMoment=&returnDistinctValues=false&returnIdsOnly=false&returnCountOnly=false&f=json\r\n// https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=year%3D2018+AND+comparison%3D%27national%27+AND+ST%3D%2701%27&f=json\r\n// https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=year=2018+AND+Comparison=%3Dnational%3D+AND+geoLevel=%3Dcensus%3D&f=JSON\r\n// https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=year%3D2018+AND+comparison%3D%27national%27+AND+ST%3D%2701%27&f=json\r\n// https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=year%3D2018+AND+Comparison%3D%27national%27+AND+geoLevel%3D%27census%27&f=JSON\r\n// https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=year%3D2018+AND+comparison%3D%27national%27+AND+ST%3D%2701%27&f=json REFRERENCE\r\n","import { DataService } from './DataService';\r\nimport { mapSVIJson } from './DataTransformation';\r\nimport { DATA_URL } from '../model/StaticVariables';\r\n\r\nconst stateNames = {\r\n 10: 'Delaware',\r\n 11: 'DistrictofColumbia',\r\n 12: 'Florida',\r\n 13: 'Georgia',\r\n 15: 'Hawaii',\r\n 16: 'Idaho',\r\n 17: 'Illinois',\r\n 18: 'Indiana',\r\n 19: 'Iowa',\r\n 20: 'Kansas',\r\n 21: 'Kentucky',\r\n 22: 'Louisiana',\r\n 23: 'Maine',\r\n 24: 'Maryland',\r\n 25: 'Massachusetts',\r\n 26: 'Michigan',\r\n 27: 'Minnesota',\r\n 28: 'Mississippi',\r\n 29: 'Missouri',\r\n 30: 'Montana',\r\n 31: 'Nebraska',\r\n 32: 'Nevada',\r\n 33: 'NewHampshire',\r\n 34: 'NewJersey',\r\n 35: 'NewMexico',\r\n 36: 'NewYork',\r\n 37: 'NorthCarolina',\r\n 38: 'NorthDakota',\r\n 39: 'Ohio',\r\n 40: 'Oklahoma',\r\n 41: 'Oregon',\r\n 42: 'Pennsylvania',\r\n 44: 'RhodeIsland',\r\n 45: 'SouthCarolina',\r\n 46: 'SouthDakota',\r\n 47: 'Tennessee',\r\n 48: 'Texas',\r\n 49: 'Utah',\r\n 50: 'Vermont',\r\n 51: 'Virginia',\r\n 53: 'Washington',\r\n 54: 'WestVirginia',\r\n 55: 'Wisconsin',\r\n 56: 'Wyoming',\r\n 72: 'PuertoRico',\r\n '00': 'AllStates',\r\n '01': 'Alabama',\r\n '02': 'Alaska',\r\n '04': 'Arizona',\r\n '05': 'Arkansas',\r\n '06': 'California',\r\n '08': 'Colorado',\r\n '09': 'Connecticut'\r\n};\r\nclass DevDataService extends DataService {\r\n constructor() {\r\n super({ _needsAuth: false, _name: 'Dev Serv' });\r\n }\r\n\r\n _api = (args) => {\r\n const { type, scope, tract, year = '2010', counties, theme = 0, state = { slug: '', fips: '' }, extent = { x1: 0, y1: 0, x2: 0, y2: 0 } } = args;\r\n const base = window.location.protocol + '//grasp_internal_test.cdc.gov/svi2021/';\r\n const poiBase = `https://svi.cdc.gov`;\r\n const slug = this.formatSlug(args);\r\n const baseMap_arcGIS_style_path = `${window.location.origin}${DATA_URL}/style/light-gray-labels2.json`;\r\n\r\n const baseMap_arcGIS_geometry_path = window.location.protocol + '//basemaps.arcgis.com/v1/arcgis/rest/services/World_Basemap/VectorTileServer/tile/{z}/{y}/{x}.pbf';\r\n const output = { url: '', body: {}, head: {} };\r\n const defaults = {\r\n AppVersion: 'SVIDB',\r\n State: 'US',\r\n XMin: extent.x1,\r\n YMin: extent.y1,\r\n XMax: extent.x2,\r\n YMax: extent.y2\r\n };\r\n switch (slug) {\r\n case 'geometry_state':\r\n output.url = `${DATA_URL}/geometry/detailed_states.json`;\r\n break;\r\n // ΔVΔVΔ: Geometry\r\n case 'geometry_national_county':\r\n let adjyear = year;\r\n output.url = `${DATA_URL}/geometry/national_county_${adjyear}.json`;\r\n break;\r\n\r\n case 'geometry_national_census':\r\n output.url = `${base}/maps/tractstopojson/tracts2010_STFIPS_${state.fips}.json`;\r\n output.loop = {\r\n state\r\n };\r\n break;\r\n\r\n case 'geometry_state_county':\r\n if (!state.slug && state.fips) {\r\n state.slug = stateNames[state.fips];\r\n }\r\n output.url = `${base}/maps/countytopojson/${state.slug}.json`;\r\n break;\r\n\r\n case 'geometry_state_census':\r\n output.url = `${base}/maps/tractstopojson/tracts2010_STFIPS_${state.fips}.json`;\r\n break;\r\n\r\n case 'geometry_hhs':\r\n output.url = `${DATA_URL}/geometry/hhs_regions.json`;\r\n break;\r\n\r\n // ΔVΔVΔ: Lists\r\n case 'list_county':\r\n output.url = `${DATA_URL}/list/allcountieslist.json`;\r\n break;\r\n case 'list_county_sm':\r\n output.url = `${DATA_URL}/list/smallCountieslist.json`;\r\n break;\r\n\r\n case 'list_state':\r\n output.url = `${DATA_URL}/list/statesList.json`;\r\n break;\r\n\r\n // ΔVΔVΔ: SVI data\r\n case 'svi_national_county':\r\n case 'svi_national_census':\r\n case 'svi_state_county':\r\n case 'svi_state_census':\r\n output.url = `${poiBase}/api/SVIData`;\r\n output.body = {\r\n StateFIPS: state.fips ? state.fips : '00',\r\n CountyFIPS: counties,\r\n SVIYear: year,\r\n SVIThemeID: theme\r\n };\r\n break;\r\n\r\n // ΔVΔVΔ: POI\r\n case 'poi_hospital':\r\n case 'poi_hospitals':\r\n output.url = `${poiBase}/api/PostGetPointsData`;\r\n output.body = Object.assign(defaults, {\r\n LayerName: 'Hospitals',\r\n PointsCount: 0,\r\n key: args.tileKey\r\n });\r\n break;\r\n case 'poi_nursinghome':\r\n case 'poi_nursing_home':\r\n case 'poi_nursing_homes':\r\n output.url = `${poiBase}/api/PostGetPointsData`;\r\n output.body = Object.assign(defaults, {\r\n LayerName: 'Nursing Homes',\r\n PointsCount: 0,\r\n key: args.tileKey\r\n });\r\n break;\r\n\r\n case 'poi_daycare':\r\n case 'poi_day_care_centers':\r\n output.url = `${poiBase}/api/PostGetPointsData`;\r\n output.body = Object.assign(defaults, {\r\n LayerName: 'Day Care Centers',\r\n PointsCount: 0,\r\n key: args.tileKey\r\n });\r\n break;\r\n\r\n case 'poi_school':\r\n case 'poi_schools':\r\n case 'poi_public_schools':\r\n output.url = `${poiBase}/api/PostGetPointsData`;\r\n output.body = Object.assign(defaults, {\r\n LayerName: 'Public Schools',\r\n PointsCount: 149,\r\n key: args.tileKey\r\n });\r\n break;\r\n // ΔVΔVΔ: Basemap\r\n case 'base_geometry':\r\n output.url = baseMap_arcGIS_geometry_path;\r\n break;\r\n\r\n case 'base_style':\r\n output.url = baseMap_arcGIS_style_path;\r\n break;\r\n default:\r\n var err = new Error('Could Not create call object config for ' + slug);\r\n throw err;\r\n }\r\n\r\n return output;\r\n };\r\n // ΔVΔVΔ: Use for inheritance\r\n applyFiltertransformData = (callObj, res) => {\r\n if (!res || !res.data) return [];\r\n if (callObj.args && callObj.args.type === 'geometry') {\r\n return [res.data];\r\n }\r\n if (callObj?.args?.type === 'svi') {\r\n return mapSVIJson(res.data);\r\n }\r\n return res.data ? res.data : [];\r\n };\r\n\r\n authenticate = async () => {\r\n return true;\r\n };\r\n applyAuth = (callObj) => {\r\n return callObj;\r\n };\r\n}\r\nexport { DevDataService };\r\n","// ΔVΔVΔ: Filename will be download.csv\r\nconst downloadString = (string, filename = 'download.txt', blank = false, onDownload = () => {}) => {\r\n const link = document.createElement('a');\r\n link.setAttribute('href', string);\r\n link.setAttribute('download', filename);\r\n if (blank) link.setAttribute('target', '_blank');\r\n document.body.appendChild(link); // Required for FF\r\n link.click();\r\n onDownload({ href: string, download: filename, target: blank ? '_blank' : '' });\r\n link.remove(); //use to prevent re-download\r\n return null;\r\n};\r\nexport { downloadString };\r\n\r\n//Found here: https://www.aspsnippets.com/Articles/Automatically-download-PDF-File-using-JavaScript.aspx\r\nconst downloadFile = (url, fileName, onDownload) => {\r\n //Create XMLHTTP Request.\r\n var req = new XMLHttpRequest();\r\n req.open('GET', url, true);\r\n req.responseType = 'blob';\r\n req.onload = function () {\r\n //Convert the Byte Data to BLOB object.\r\n var blob = new Blob([req.response], { type: 'application/octetstream' });\r\n\r\n //Check the Browser type and download the File.\r\n var isIE = false || !!document.documentMode;\r\n if (isIE) {\r\n window.navigator.msSaveBlob(blob, fileName);\r\n } else {\r\n var url = window.URL || window.webkitURL;\r\n var link = url.createObjectURL(blob);\r\n var a = document.createElement('a');\r\n\r\n downloadString(link, fileName, false);\r\n // a.setAttribute(\"download\", fileName);\r\n // a.setAttribute(\"href\", link);\r\n // document.body.appendChild(a);\r\n // a.click();\r\n // document.body.removeChild(a);\r\n }\r\n };\r\n req.onerror = function () {};\r\n onDownload({ href: url, download: fileName, target: '_blank' });\r\n req.send();\r\n};\r\nexport { downloadFile };\r\n","import { getCenter } from 'ol/extent';\r\nimport { boundingExtent } from 'ol/extent';\r\nimport { csv as d3csv } from 'd3';\r\nimport { DevDataService } from './DevDataService';\r\nimport { statesList, countiesList } from './StaticVariables';\r\nimport { downloadString } from '../controller/DownloadString';\r\nimport { pick } from 'lodash';\r\nimport { fromLonLat, transformExtent, get as getExtent } from 'ol/proj';\r\n\r\n// ΔVΔVΔ: Pass an SVI row return themes spport different data attributes for themes by year\r\nconst mapThemeAttributes = (obj) => {\r\n const thm0 = obj.R_PL_THEME1 || obj.RPL_THEMES || obj.Overall_SVI_Percentile;\r\n const thm1 = obj.R_PL_THEME2 || obj.RPL_THEME1 || obj.Theme1_Socioeconomic_Percentile || obj.Theme1_Percentile;\r\n const thm2 = obj.R_PL_THEME3 || obj.RPL_THEME2 || obj.Theme2_HouseholdAndDisability_Percentile || obj.Theme2_Percentile;\r\n const thm3 = obj.R_PL_THEME4 || obj.RPL_THEME3 || obj.Theme3_MinorityAndLanguage_Percentile || obj.Theme3_Percentile;\r\n const thm4 = obj.R_PL_THEME5 || obj.RPL_THEME4 || obj.Theme4_HousingAndTransportation_Percentile || obj.Theme4_Percentile;\r\n return {\r\n theme0: sviValueToSlug(thm0),\r\n theme1: sviValueToSlug(thm1),\r\n theme2: sviValueToSlug(thm2),\r\n theme3: sviValueToSlug(thm3),\r\n theme4: sviValueToSlug(thm4),\r\n theme0Num: thm0,\r\n theme1Num: thm1,\r\n theme2Num: thm2,\r\n theme3Num: thm3,\r\n theme4Num: thm4\r\n };\r\n};\r\nexport { mapThemeAttributes };\r\n\r\nfunction sviValueToSlug(num) {\r\n if (num < 0) return 'none';\r\n if (num > -1 && num < 0.25) return 'low';\r\n if (num > 0.24 && num < 0.5) return 'med';\r\n if (num > 0.49 && num < 0.75) return 'high';\r\n if (num > 0.74) return 'top';\r\n return 'none';\r\n}\r\nconst formatSVIobj = async (arr) => {\r\n let list = {};\r\n arr.forEach((row) => {\r\n let themes = mapThemeAttributes(row);\r\n list[row.FIPS] = Object.values(themes);\r\n });\r\n return list;\r\n};\r\nexport { formatSVIobj };\r\n\r\nconst getTractFill = async (props) => {\r\n let list = {};\r\n return await d3csv(props.styleFile).then((dat) => {\r\n dat.forEach((row) => {\r\n let themes = mapThemeAttributes(row);\r\n list[row.FIPS] = Object.values(themes);\r\n });\r\n return list;\r\n });\r\n};\r\nexport { getTractFill };\r\n\r\nconst mapSVIJson = (dat) => {\r\n let list = {};\r\n dat.forEach((row) => {\r\n let themes = mapThemeAttributes(row);\r\n list[row.FIPS] = Object.values(themes);\r\n });\r\n return list;\r\n};\r\nexport { mapSVIJson };\r\n\r\nconst convertCountyList = async (includeTerritories = false) => {\r\n const countyCoords = await d3csv('/data/list/county_coords.csv');\r\n const DS = new DevDataService();\r\n\r\n const countiesMapped = await DS.getListData('county').then((res) => {\r\n return res\r\n .filter((rec) => {\r\n return rec.SN != null;\r\n })\r\n .map((item, i) => {\r\n let { CC, CN, SN } = item;\r\n //ΔVΔVΔ: Map County coords\r\n let coord = countyCoords.find((record) => record.fips * 1 === CC * 1);\r\n if (!coord) coord = getStateBy(CC.substring(0, 2)); //Use state as a fallback\r\n let cen = coord?.lon ? coord.lon + ',' + coord.lat : coord.center;\r\n SN = coord ? coord.abbr : SN;\r\n return { SN, CC, CN, cen };\r\n });\r\n });\r\n return includeTerritories ? countiesMapped : countiesMapped.filter((cnt) => cnt.SN && cnt.SN !== 'PR');\r\n};\r\nexport { convertCountyList };\r\n\r\n//ΔVΔVΔ: For app cached data building\r\nconst convertCountyListToCSV = async (includeTerritories = false) => {\r\n const arr = await convertCountyList(includeTerritories);\r\n const link = jsonToCSVDownloadString(arr);\r\n downloadString(link, 'counties.csv');\r\n};\r\n\r\nexport { convertCountyListToCSV };\r\n\r\n//ΔVΔVΔ: Expocts fips to be obj {12345:true,65789:true}\r\nconst fipsToState = (fips) => {\r\n const stateIDS = {};\r\n Object.keys(fips).map((key) => {\r\n let id = key.substring(0, 2);\r\n stateIDS[id] = true;\r\n });\r\n\r\n return Object.keys(stateIDS)\r\n .filter((id) => id < 57 || id === 72)\r\n .map((id) => getStateBy(id));\r\n};\r\nexport { fipsToState };\r\n\r\nconst getCountyBy = (value, field = 'id') => {\r\n // ΔVΔVΔ: Search through static county list to find matching value\r\n return false; // if unfound\r\n};\r\n\r\nconst getStateBy = (value, field = 'id') => {\r\n // ΔVΔVΔ: Search through static state list to find matching value\r\n return statesList.find((st) => st[field] == value);\r\n};\r\nexport { getStateBy };\r\n\r\n//ΔVΔVΔ: Convert array of objects to csv string\r\nconst jsonToCSVString = (json, useQuotes = true) => {\r\n const jcopy = json.slice(0);\r\n const indexRow = Object.keys(jcopy[0]);\r\n\r\n jcopy.unshift(indexRow);\r\n const rows = jcopy.map((row) => {\r\n if (!useQuotes) return Object.values(row).join(',');\r\n return '\"' + Object.values(row).join('\",\"') + '\"';\r\n });\r\n return rows.join('\\n');\r\n};\r\nexport { jsonToCSVString };\r\n\r\n//ΔVΔVΔ: Convert csv obj to url encoded link\r\nconst jsonToCSVDownloadString = (json) => {\r\n let csvLink = 'data:text/csv;charset=utf-8,' + jsonToCSVString(json);\r\n return encodeURI(csvLink).replace(/#/g, '%23');\r\n};\r\nexport { jsonToCSVDownloadString };\r\n\r\nconst jsonToDownloadString = (json) => {\r\n return 'data:text/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(json));\r\n};\r\nexport { jsonToDownloadString };\r\n\r\nconst convertStateList = async () => {\r\n const DS = new DevDataService();\r\n const latlon = await d3csv('/data/list/state-lon-lat.csv').then((json) => {\r\n return json;\r\n });\r\n return DS.getListData('state')\r\n .then((res) => {\r\n return res.map((item, i) => {\r\n let slug = item.STATE_NAME.toLowerCase().replace(/ /g, '');\r\n const { minx, miny, maxx, maxy, STATE_ABBR } = item;\r\n const findSt = latlon.find((st) => {\r\n return st.state == item.STATE_NAME;\r\n });\r\n const center = findSt ? [findSt.lon * 1, findSt.lat * 1] : [0, 0];\r\n const bounds = [minx, miny, maxx, maxy];\r\n return { id: item.STATE_FIPS, label: item.STATE_NAME, bounds, slug, center, abbr: STATE_ABBR };\r\n });\r\n })\r\n .then((dat) => dat.slice(1)) // ΔVΔVΔ: Remove \"All States\"\r\n .then((dat) => console.log('**** ', dat));\r\n};\r\nexport { convertStateList };\r\n\r\nconst sortAlphabetical = (a, b) => {\r\n let na = a.name;\r\n let nb = b.name;\r\n if (na < nb) return -1;\r\n if (na > nb) return 1;\r\n return 0;\r\n};\r\n// Math.abs\r\nexport { sortAlphabetical };\r\n\r\nconst createTestPoint = (top, left, str, id) => {\r\n // if (id > 100) return;\r\n // const prevdot = document.querySelectorAll('[pose=\"' + str + top + ',' + left + '\"]');\r\n // if (prevdot.length) return document.createElement('div');\r\n const dot = document.createElement('div');\r\n dot.classList.add('testdot', str);\r\n dot.setAttribute('pose', str + top + ',' + left);\r\n // dot.id = str + id;\r\n dot.style.top = top + 'px';\r\n dot.style.left = left + 'px';\r\n return dot;\r\n};\r\nconst addTestPoints = (a, rest, str = '') => {\r\n const grp = document.createElement('div');\r\n grp.classList.add('tstgrp', str);\r\n grp.id = 'grp' + document.querySelectorAll('.tstgrp').length;\r\n if (a) grp.appendChild(createTestPoint(a[1], a[0], 'a'));\r\n for (let b of rest) {\r\n grp.appendChild(createTestPoint(b[1], b[0], b.length == 3 ? 'c' : 'b'));\r\n }\r\n document.querySelector('.tabpanel #test').appendChild(grp);\r\n};\r\nexport { addTestPoints };\r\n\r\nconst addTestPointInteractions = () => {\r\n document.querySelector('.tstgrp').classList.add('active'); //add class to first node\r\n document.querySelector('.tabpanel #test .tstgrp').addEventListener('mouseover', (e) => {\r\n let prevactive = document.querySelector('.tstgrp.active');\r\n if (prevactive) prevactive.classList.remove('active');\r\n let pos = e.target.getAttribute('pose').replace('b', 'a');\r\n let targetDot = document.querySelector(`[pose=\"${pos}\"]`);\r\n if (targetDot?.parentNode) targetDot?.parentNode.classList.add('active');\r\n });\r\n document.querySelector('.tabpanel #test .tstgrp').addEventListener('mouseout', (e) => {\r\n let prevactive = document.querySelector('.tstgrp.active');\r\n if (prevactive) prevactive.classList.remove('active');\r\n });\r\n};\r\nexport { addTestPointInteractions };\r\n\r\n// Return boolean: check to see if 2 points are within specified range\r\nconst pointsAreWithinRange = (pointA, pointB, range) => {\r\n // use range * range is the same as using the sqrt of the distance calculation\r\n let d = distanceBetweenPoints(pointA, pointB, false);\r\n return d < range * range;\r\n};\r\nexport { pointsAreWithinRange };\r\n\r\nconst distanceBetweenPoints = (pointA, pointB, absolute = false) => {\r\n let w = Math.abs(pointA[0] - pointB[0]); //x-x\r\n let l = Math.abs(pointA[1] - pointB[1]); //y-y\r\n let d = Math.floor(l * l + w * w);\r\n if (!absolute) return d; //Relative distance\r\n return Math.sqrt(d); //Actual distance, less performant\r\n};\r\nexport { distanceBetweenPoints };\r\n\r\nconst groupAsSingle = (json) => {\r\n if (!json.list[0]) return [];\r\n return json.list.map((poi) => {\r\n return {\r\n data: [poi],\r\n x: poi.x,\r\n y: poi.y\r\n };\r\n });\r\n};\r\nexport { groupAsSingle };\r\n\r\nconst getZoomFromTileKey = (tilekey) => {\r\n return tilekey.substring(2, 3);\r\n};\r\nexport { getZoomFromTileKey };\r\n\r\n// ΔVΔVΔ: Expects an array of poi locations\r\n// returns empty data because too much to display\r\nconst groupPoiByState = (json, mapped = {}, format = 'array') => {\r\n // const mapped = {};\r\n //json = [\r\n //{ \"NAME\", \"ADDRESS\", \"CITY\", \"STATE\", \"ZIP\", \"COUNTY\", \"TELEPHONE\", \"x\", \"y\" }\r\n //]\r\n\r\n for (const poi of json) {\r\n // console.log('mapped, poi: ', mapped, poi);\r\n const key = poi.STATE ? poi.STATE : poi.attributes.STATE;\r\n if (!mapped[key]) {\r\n const found = statesList.find((st) => {\r\n return st.abbr == key;\r\n });\r\n if (found) {\r\n mapped[key] = { val: 0, x: found.center[0], y: found.center[1], name: key, data: [] };\r\n } else {\r\n mapped[key] = { val: 0, x: 0, y: 0, name: '', data: [] };\r\n }\r\n }\r\n mapped[key].val++;\r\n mapped[key].data.push(poi);\r\n }\r\n return format == 'array' ? Object.values(mapped) : mapped;\r\n};\r\nexport { groupPoiByState };\r\n\r\nconst factorial = (num) => {\r\n if (num < 0) return -1;\r\n if (num == 0) return 1;\r\n return num * factorial(num - 1);\r\n};\r\nexport { factorial };\r\n\r\nconst triangleNumber = (num) => {\r\n if (num < 0) return -1;\r\n if (num == 0) return 0;\r\n return num + triangleNumber(num - 1);\r\n};\r\n\r\nconst chunkArray = (array, size) => {\r\n const chunked_arr = [];\r\n const numOfChild = Math.ceil(array.length / size); // Round up to the nearest integer\r\n for (let i = 0; i < numOfChild; i++) {\r\n chunked_arr.push(array.splice(0, size));\r\n }\r\n return chunked_arr;\r\n};\r\nexport { chunkArray };\r\n\r\nconst findCenter = (coords) => {\r\n if (coords.length == 1) return coords[0]; //only one set of coords is a point\r\n return getCenter(boundingExtent(coords)); //find point in center of all points provided\r\n};\r\nexport { findCenter };\r\n\r\nconst mapCountyTopoJson = (json_url) => {\r\n fetch(json_url)\r\n .then((res) => res.json())\r\n .then((json) => {\r\n const objkey = Object.keys(json.objects)[0];\r\n const geo = json.objects[objkey].geometries;\r\n const objects = {\r\n counties: {\r\n geometries: geo.map((item) => {\r\n const { COUNTY, NAME, STATE } = item.properties;\r\n return {\r\n arcs: item.arcs,\r\n type: item.type,\r\n properties: {\r\n FIPS: STATE + COUNTY,\r\n NAME: NAME,\r\n STATE_NAME: getStateBy(STATE)?.label\r\n }\r\n };\r\n }),\r\n type: 'GeometryCollection'\r\n }\r\n };\r\n\r\n const output = {\r\n type: json.type,\r\n arcs: json.arcs,\r\n transform: json.transform,\r\n objects: objects\r\n };\r\n });\r\n};\r\nexport { mapCountyTopoJson };\r\n\r\nconst capitalizeFirstLetter = (string) => {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n};\r\n\r\nconst tableDataMappingOrdered = (data, columns = []) => {\r\n return data\r\n .map((row) => {\r\n let item = {}; //whitelistKeys.length ? pick(row, whitelistKeys) : row;\r\n item['GEO LEVEL'] = capitalizeFirstLetter(row.GeoLevel);\r\n item['GEO COMPARISON'] = capitalizeFirstLetter(row.Comparison);\r\n for (let key in columns) {\r\n let props = columns[key];\r\n if (!props?.hide) {\r\n // let key = columns[ind];\r\n item[props.headerName] = row[key];\r\n }\r\n }\r\n delete item['Geo Unit'];\r\n delete item['Comparison'];\r\n const foundState = statesList.find((st) => {\r\n return st.id == row.ST;\r\n });\r\n if (foundState) {\r\n item.STATE = foundState.label;\r\n item.ST_ABBR = foundState.abbr;\r\n }\r\n item.STCNTY = row.FIPS.substring(0, 5);\r\n const foundCounty = countiesList.find((cnty) => {\r\n return cnty.CC + '' === item.STCNTY + '';\r\n });\r\n if (foundCounty) {\r\n var reg = new RegExp(''', 'g');\r\n item.COUNTY = foundCounty.CN.replace(reg, \"'\");\r\n }\r\n return item;\r\n })\r\n .sort((a, b) => parseInt(a.FIPS) - parseInt(b.FIPS));\r\n};\r\nexport { tableDataMappingOrdered };\r\n\r\nconst tableDataMapping = (data, whitelistKeys = []) => {\r\n return data\r\n .map((row) => {\r\n let item = whitelistKeys.length ? pick(row, whitelistKeys) : row;\r\n item.id = row.OBJECTID || row.GRASPID;\r\n item.GeoLevel = capitalizeFirstLetter(item.GeoLevel);\r\n item.Comparison = capitalizeFirstLetter(item.Comparison);\r\n const foundState = statesList.find((st) => {\r\n return st.id == item.ST;\r\n });\r\n if (foundState) {\r\n item.STATE_NAME = foundState.label;\r\n item.STATE_ABBR = foundState.abbr;\r\n }\r\n item.COUNTY_FIPS = item.FIPS.substring(0, 5);\r\n const foundCounty = countiesList.find((cnty) => {\r\n return cnty.CC + '' === item.COUNTY_FIPS + '';\r\n });\r\n if (foundCounty) {\r\n //'\r\n var reg = new RegExp(''', 'g');\r\n item.COUNTY_NAME = foundCounty.CN.replace(reg, \"'\");\r\n }\r\n return item;\r\n })\r\n .sort((a, b) => parseInt(a.FIPS) - parseInt(b.FIPS));\r\n};\r\nexport { tableDataMapping };\r\n\r\nconst readErrorMesssage = (message, err) => {\r\n if (message) return message; //ΔVΔVΔ: If there is a message explicitly sent then use that\r\n let serr = String(err?.err || err); //ΔVΔVΔ: In case send as embeded object\r\n return serr;\r\n};\r\nexport { readErrorMesssage };\r\n\r\n//helper function to convert an extent drawn from:\r\n//https://www.keene.edu/campus/maps/tool/\r\n/*\r\nexample input:\r\n-132.1875000, 48.0093777\r\n-106.9921830, 47.9636190\r\n-107.0361283, 33.2582183\r\n-131.5136728, 33.2232081\r\n*/\r\nconst convertDrawnOnlineExtent = (str) => {\r\n var arr = str.split(`\\n`).map((pointstr) => pointstr.replace(' ', '').split(','));\r\n var pointA = fromLonLat(arr[0]);\r\n var pointB = fromLonLat(arr[2]);\r\n // return [...pointA, ...pointB];\r\n var latlonext = boundingExtent([arr[0], arr[1]]);\r\n return transformExtent(latlonext, getExtent('EPSG:4326'), getExtent('EPSG:3857'));\r\n};\r\n","import { useReducer, createContext } from 'react';\r\nimport { sviThemes } from './SVIThemeModel';\r\nimport { scopeList, tractList, staticYearList, tabList, statesList } from './StaticVariables';\r\nimport produce from 'immer';\r\nimport TEXTS from '../controller/TextVariables';\r\nimport { readErrorMesssage, findCenter } from './DataTransformation';\r\nexport const InterfaceContext = createContext();\r\n\r\nconst infoWindow_init = {\r\n feature: null,\r\n pinned: false\r\n};\r\n//ΔVΔVΔ: UI Context Variables\r\nconst interface_init = {\r\n usState: false,\r\n downloadRegion: false,\r\n scope: scopeList[0],\r\n // scope: scopeList[1],\r\n // usState: statesList.find((st) => st.abbr === 'GA'),\r\n // tract: tractList[1],\r\n tract: tractList[0],\r\n geometry: tractList[0],\r\n theme: sviThemes[0],\r\n year: staticYearList[0],\r\n search: '',\r\n tab: window.location.hash.indexOf('#more') !== -1 ? tabList[2] : tabList[0],\r\n // tab: tabList[1],\r\n opacity: 100,\r\n hhsregion: 0,\r\n streetmap: 1,\r\n openMenu: true,\r\n map: null, //ΔVΔVΔ: Temprarily here to get download working\r\n hospital: 0,\r\n daycare: 0,\r\n school: 0,\r\n nursinghome: 0,\r\n infoWindows: [],\r\n selectedFeature: null,\r\n hoveredFeature: null,\r\n selectedFeatureIsPinned: false,\r\n download_modal: false,\r\n darkMode: false,\r\n censusEnabled: false,\r\n errorMessage: '',\r\n err: '',\r\n message: '',\r\n isResizing: '',\r\n tableData: null,\r\n printPDF: false,\r\n fipsInView: [],\r\n tempState: null,\r\n highlightedFips: null,\r\n loadStatus: 1,\r\n marker: { center: [] },\r\n compareExtent: [-17426261.63232968, 1792316.2485397668, -4521245.272886802, 7897494.571733365],\r\n preparedMapState: false,\r\n preparedMapCounty: false\r\n};\r\n// ΔVΔVΔ: UI Context Methods\r\nconst uiActions = (state, dispatch) => {\r\n return {\r\n setSelectedFeature: (value) => dispatch({ type: 'setSelectedFeature', value }),\r\n setHHS: () => dispatch({ type: 'setHHS', value: !state.hhs }),\r\n setStreets: (value) => dispatch({ type: 'setStreets', value: !state.streetmap }),\r\n setHospitals: () => dispatch({ type: 'setHospitals', value: !state.hospitals }),\r\n setDaycare: () => dispatch({ type: 'setDaycare', value: !state.daycare }),\r\n setSchools: () => dispatch({ type: 'setSchools', value: !state.schools }),\r\n setNursing: () => dispatch({ type: 'setNursing', value: !state.nursing }),\r\n setSelectedState: (value) => dispatch({ type: 'setSelectedState', value }),\r\n setDownloadRegion: (value) => dispatch({ type: 'setDownloadRegion', value }),\r\n setSelectedScope: (value) => dispatch({ type: 'setSelectedScope', value }),\r\n setSelectedTract: (value) => dispatch({ type: 'setSelectedTract', value }),\r\n setSelectedTheme: (value) => dispatch({ type: 'setSelectedTheme', value }),\r\n setSelectedCounty: (value) => dispatch({ type: 'setSelectedCounty', value }),\r\n setSelectedYear: (value) => dispatch({ type: 'setSelectedYear', value }),\r\n setThemeOpacity: (value) => dispatch({ type: 'setThemeOpacity', value }),\r\n setSearch: (value) => dispatch({ type: 'setSearch', value }),\r\n setStateSearch: (value) => dispatch({ type: 'setStateSearch', value }),\r\n unsetSearch: () => dispatch({ type: 'unsetSearch' }),\r\n unsetMarker: () => dispatch({ type: 'unsetMarker' }),\r\n loadEnd: () => dispatch({ type: 'loadEnd' }),\r\n doReset: () => dispatch({ type: 'reset' }),\r\n doResetZoom: () => dispatch({ type: 'resetZoom' }),\r\n setToggle: (name) => dispatch({ type: 'setToggle', name: name, value: !state[name] }),\r\n setSelectedTab: (value) => dispatch({ type: 'setSelectedTab', value }),\r\n setinfobox: (feature, pixel) => dispatch({ type: 'setinfobox', feature, pixel }),\r\n unsetinfobox: () => dispatch({ type: 'unsetinfobox' }),\r\n addInfoWindow: (feature, pixel) => dispatch({ type: 'addInfoWindow', feature, pixel }),\r\n removeInfoWindow: (index) => dispatch({ type: 'removeInfoWindow', index }),\r\n moveInfoWindow: (pixel) => dispatch({ type: 'moveInfoWindow', pixel }),\r\n moveHoveredFeature: (pixel) => dispatch({ type: 'moveHoveredFeature', pixel }),\r\n updateInfoWindow: (feature, pixel) => dispatch({ type: 'updateInfoWindow', feature, pixel }),\r\n pinInfoWindow: (index) => dispatch({ type: 'pinInfoWindow', index }),\r\n setMode: () => dispatch({ type: 'setMode' }),\r\n updatePinnedFeature: (feature) => dispatch({ type: 'updatePinnedFeature', feature }),\r\n updateHoveredFeature: (feature, pixel) => dispatch({ type: 'updateHoveredFeature', feature, pixel }),\r\n pinWindow: (value) => dispatch({ type: 'pinWindow', value }),\r\n showDownloadModal: () => dispatch({ type: 'toggleDownloadModal', value: true }),\r\n closeDownloadModal: () => dispatch({ type: 'toggleDownloadModal', value: false }),\r\n setMessage: (value) => dispatch({ type: 'setMessage', message: value }),\r\n setErrorMessage: (value, err = false) => dispatch({ type: 'setErrorMessage', value, err }),\r\n setIsResize: (value) => dispatch({ type: 'setIsResize', value }),\r\n setTableData: (value) => dispatch({ type: 'setTableData', value }),\r\n setCensusEnabled: (value) => dispatch({ type: 'setCensusEnabled', value }),\r\n enableCensus: (value) => dispatch({ type: 'enableCensus', value }),\r\n setIMap: (value) => dispatch({ type: 'setIMap', value }),\r\n setFipsInView: (value) => dispatch({ type: 'setFipsInView', value }),\r\n setForceMap: (value) => dispatch({ type: 'setForceMap', value }),\r\n setTempState: (value) => dispatch({ type: 'setTempState', value }),\r\n setHighlightedFips: (value) => dispatch({ type: 'setHighlightedFips', value }),\r\n setCompareExtent: (value) => dispatch({ type: 'setCompareExtent', value }),\r\n setLoadStatus: (value) => dispatch({ type: 'setLoadStatus', value }),\r\n setOpenMenu: (value) => dispatch({ type: 'setOpenMenu', value }),\r\n setPreparedMapChoice: (value) => dispatch({ type: 'setPreparedMapChoice', value })\r\n };\r\n};\r\nfunction switchDCTract(scope, usstate, tract) {\r\n // console.log('===> ', ' SCOPE: ',scope,' STATE',usstate?.id,' TRACT: ',tract)\r\n return usstate?.id + '' === '11' && scope === 'state' && tract === 'county';\r\n}\r\n// ΔVΔVΔ: UI Context State Transformation\r\nfunction interfaceReducer(state, action) {\r\n let shouldSwitchTract, tract, usState, message;\r\n switch (action.type) {\r\n case 'setSelectedFeature':\r\n return { ...state, selectedFeature: action.value };\r\n case 'setSelectedTract':\r\n shouldSwitchTract = switchDCTract(state.scope, state.usState, action.value);\r\n tract = shouldSwitchTract ? 'census' : action.value;\r\n message = shouldSwitchTract ? TEXTS.modals.autoSwitchDCtract.text : action.message;\r\n return { ...state, tract, message };\r\n case 'setSelectedScope':\r\n usState = action.value === 'national' ? false : state.usState;\r\n shouldSwitchTract = switchDCTract(action.value, usState, state.tract);\r\n tract = shouldSwitchTract ? 'census' : state.tract;\r\n message = shouldSwitchTract ? TEXTS.modals.autoSwitchDCtract.text : action.message;\r\n return { ...state, scope: action.value, usState, tract, message };\r\n case 'setTempState':\r\n return { ...state, tempState: action.value };\r\n case 'setSelectedTheme':\r\n return { ...state, theme: action.value };\r\n case 'setComparedExtent':\r\n return { ...state, compareExtent: action.value };\r\n case 'setOpenMenu':\r\n return { ...state, openMenu: action.value };\r\n case 'setToggle':\r\n const obj = {};\r\n obj[action.name] = action.value;\r\n return { ...state, ...obj };\r\n case 'setHHS':\r\n return { ...state, hhsregion: action.value };\r\n case 'setHospitals':\r\n return { ...state, hospital: action.value };\r\n case 'setDaycare':\r\n return { ...state, daycare: action.value };\r\n case 'setSchools':\r\n return { ...state, school: action.value };\r\n case 'setNursing':\r\n return { ...state, nursing: action.value };\r\n case 'setSelectedState':\r\n shouldSwitchTract = switchDCTract(state.scope, action.value, state.tract);\r\n tract = shouldSwitchTract ? 'census' : state.tract;\r\n message = shouldSwitchTract ? TEXTS.modals.autoSwitchDCtract.text : action.message;\r\n return { ...state, usState: action.value, tract, message };\r\n case 'setDownloadRegion':\r\n return { ...state, downloadRegion: action.value, message };\r\n case 'setThemeOpacity':\r\n return { ...state, opacity: action.value };\r\n case 'setSelectedYear':\r\n var themeObj = { ...state.theme };\r\n themeObj.label = action.value.label + '' === '2020' ? state.theme.label2020 : state.theme.labelPast;\r\n return { ...state, year: action.value, theme: themeObj };\r\n case 'UIload':\r\n return { ...state, isLoading: true };\r\n case 'UIloadEnd':\r\n return { ...state, isLoading: false };\r\n case 'setSelectedTab':\r\n return { ...state, tab: action.value };\r\n case 'setStreets':\r\n return { ...state, streetmap: action.value };\r\n case 'setMap':\r\n let newContent = Object.assign({}, state.content, {\r\n map: action.value\r\n });\r\n return { ...state, content: newContent };\r\n case 'reset':\r\n return {\r\n ...state,\r\n ...interface_init,\r\n tab: state.tab,\r\n search: ''\r\n };\r\n case 'setSearch':\r\n return {\r\n ...state,\r\n search: action.value,\r\n marker: {\r\n center: findCenter([action.value.slice(0, 2), action.value.slice(2)])\r\n }\r\n };\r\n case 'setStateSearch':\r\n return {\r\n ...state,\r\n search: action.value,\r\n marker: {\r\n center: []\r\n }\r\n };\r\n case 'unsetMarker':\r\n return { ...state, marker: interface_init.marker };\r\n case 'unsetSearch':\r\n return { ...state, search: '', marker: interface_init.marker };\r\n case 'setMode':\r\n return { ...state, darkMode: !state.darkMode };\r\n case 'setTableData':\r\n return { ...state, tableData: action.value };\r\n case 'updatePinnedFeature':\r\n return { ...state, selectedFeature: action.feature };\r\n case 'updateHoveredFeature':\r\n return { ...state, hoveredFeature: action.feature };\r\n case 'pinWindow':\r\n return { ...state, selectedFeatureIsPinned: action.value };\r\n case 'toggleDownloadModal':\r\n return { ...state, download_modal: action.value };\r\n case 'setMessage':\r\n return { ...state, message: action.message };\r\n case 'setErrorMessage':\r\n return {\r\n ...state,\r\n errorMessage: readErrorMesssage(action.value, action.err)\r\n };\r\n case 'setIsResize':\r\n return { ...state, isResizing: action.value };\r\n case 'setCensusEnabled':\r\n case 'enableCensus':\r\n const newState = {\r\n ...state,\r\n censusEnabled: action.value,\r\n tract: action.value ? state.tract : tractList[0]\r\n };\r\n if (state.censusEnabled && action.value === false) {\r\n if (state.tab.slug === 'map' && state.tract === 'census') {\r\n newState.message = TEXTS.modals.autoSwitchCensus.text;\r\n }\r\n }\r\n return newState;\r\n case 'setIMap':\r\n return { ...state, map: action.value };\r\n case 'setFipsInView':\r\n return { ...state, fipsInView: action.value };\r\n case 'setHighlightedFips':\r\n return { ...state, highlightedFips: action.value };\r\n case 'setLoadStatus':\r\n return { ...state, loadStatus: action.value };\r\n case 'setPreparedMapChoice':\r\n // console.log(action.value);\r\n // return state;\r\n return {\r\n ...state,\r\n tab: tabList[2],\r\n preparedMapState: action.value.usstate,\r\n preparedMapCounty: action.value.county\r\n };\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nconst InterfaceProvider = ({ children }) => {\r\n const [state, dispatch] = useReducer(interfaceReducer, interface_init);\r\n const value = {\r\n ...state,\r\n ...uiActions(state, dispatch)\r\n };\r\n return {children};\r\n};\r\nexport { InterfaceProvider };\r\n","import { useReducer, createContext } from 'react';\r\nimport { minCensusZoom, mapStaticVariables } from '../model/StaticVariables';\r\n\r\nconst MapContext = new createContext();\r\nexport default MapContext;\r\n\r\nconst map_init = {\r\n map: null,\r\n census_geometry: [],\r\n svi: [],\r\n county_geometry: [],\r\n hhs_geometry: [],\r\n detail_level: 'low', //low or high\r\n fips: null,\r\n fipsList: { features: [], stateNames: [], countyFips: [], stateFips: [] },\r\n referenceAdded: 0,\r\n census_loaded: 1,\r\n county_loaded: 0,\r\n init_load: 0,\r\n boundingBox: mapStaticVariables.extents.contiguous_us_and_pr,\r\n tiles: {},\r\n zoom: 4,\r\n zoomRead: 4,\r\n wait: false\r\n};\r\nexport { map_init };\r\nconst mapActions = (state, dispatch) => {\r\n return {\r\n setHHS: () => dispatch({ type: 'setHHS', value: !state.hhs }),\r\n setTiles: (value) => dispatch({ type: 'setTiles', value }),\r\n setFipsList: (value) => dispatch({ type: 'setFipsList', value }),\r\n setFips: (value) => dispatch({ type: 'setFips', value }),\r\n setSvi: (value) => dispatch({ type: 'setSvi', value }),\r\n setCountyGeo: (value) => dispatch({ type: 'setCountyGeo', value }),\r\n setCensusGeo: (value) => dispatch({ type: 'setCensusGeo', value }),\r\n setReferenceAdded: () => dispatch({ type: 'setReferenceAdded' }),\r\n setCensusLoadStatus: (value) => dispatch({ type: 'setCensusLoadStatus', value }),\r\n setCountyLoadStatus: (value) => dispatch({ type: 'setCountyLoadStatus', value }),\r\n setInitLoad: () => dispatch({ type: 'setInitLoad' }),\r\n setMap: (value) => dispatch({ type: 'setMap', value }),\r\n doMapReset: () => dispatch({ type: 'doMapReset' }),\r\n setZoom: (value) => dispatch({ type: 'setZoom', value }),\r\n setZoomRead: (value) => dispatch({ type: 'setZoomRead', value }),\r\n setWait: (value) => dispatch({ type: 'setWait', value }),\r\n setCenter: (value) => dispatch({ type: 'setCenter', value }),\r\n setBbox: (value) => dispatch({ type: 'setBbox', value })\r\n };\r\n};\r\n\r\nfunction mapReducer(state, action) {\r\n switch (action.type) {\r\n case 'setInitLoad':\r\n return { ...state, init_load: 1 };\r\n case 'setCensusGeo':\r\n return { ...state, census_geometry: action.value };\r\n case 'setCountyGeo':\r\n return { ...state, county_geometry: action.value };\r\n case 'setSvi':\r\n return { ...state, svi: action.value };\r\n case 'setReferenceAdded':\r\n return { ...state, referenceAdded: true };\r\n case 'setCensusLoadStatus':\r\n return { ...state, census_loaded: action.value };\r\n case 'setCountyLoadStatus':\r\n return { ...state, county_loaded: action.value };\r\n case 'setTiles':\r\n return { ...state, tiles: action.value };\r\n case 'setFipsList':\r\n return { ...state, fipsList: action.value };\r\n case 'setFips':\r\n return { ...state, fips: action.value };\r\n case 'setMap':\r\n return { ...state, map: action.value };\r\n case 'setZoomRead':\r\n return { ...state, zoomRead: action.value, detail_level: action.value >= minCensusZoom ? 'high' : 'low' };\r\n case 'setZoom':\r\n return { ...state, zoom: action.value, zoomRead: action.value, detail_level: action.value >= minCensusZoom ? 'high' : 'low' };\r\n case 'setWait':\r\n return { ...state, wait: action.value };\r\n case 'setBbox':\r\n console.log('>>>bbox updated', action);\r\n return { ...state, boundingBox: action.value };\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nconst MapProvider = ({ children, options }) => {\r\n const [state, dispatch] = useReducer(mapReducer, { ...map_init });\r\n const value = {\r\n ...state,\r\n ...options,\r\n ...mapActions(state, dispatch)\r\n };\r\n return {children};\r\n};\r\nexport { MapProvider };\r\n","import ReactTooltip from 'react-tooltip';\r\n\r\nconst StandardTooltipWindow = ({ text, id, tooltipPlace = 'top' }) => {\r\n return (\r\n \r\n {text}\r\n \r\n );\r\n};\r\nexport { StandardTooltipWindow };\r\n\r\nconst Tooltip = (props) => {\r\n const { id, tooltip, children, window } = props;\r\n return tooltip ? (\r\n <>\r\n \r\n {children}\r\n \r\n {window}\r\n \r\n ) : (\r\n <> {children}\r\n );\r\n};\r\nexport { Tooltip };\r\n","import { useState, useEffect, memo, useRef } from 'react';\r\nimport { Tooltip, StandardTooltipWindow } from './Tooltip';\r\nimport _uniqueId from 'lodash/uniqueId';\r\n\r\nconst DropDownLabel = (props) => {\r\n const { toggleOpen, classStr = 'drop', selected } = props;\r\n\r\n return (\r\n
\r\n
\r\n {selected.label}\r\n
\r\n
\r\n );\r\n};\r\nconst DropDown = (props) => {\r\n const { selected: selectedObj, onChange, classStr = 'drop', focus, label, list, tooltip, disabled = false, tooltipPlace = 'left' } = props;\r\n const [open, setOpen] = useState(false);\r\n const [selectid] = useState(_uniqueId('field-'));\r\n const dropDownDom = useRef();\r\n\r\n const toggleOpen = () => {\r\n if (disabled) return;\r\n setOpen(true);\r\n };\r\n const close = (e) => {\r\n setOpen(false);\r\n };\r\n\r\n const onChangeSelected = (e) => {\r\n const tehSelected = list.find((item) => {\r\n return item.id + '' == e.target.value + '';\r\n });\r\n onChange(tehSelected);\r\n };\r\n useEffect(() => focus && setOpen(true), [focus]);\r\n useEffect(() => setOpen(false), [disabled]);\r\n\r\n useEffect(() => {\r\n if (open && tooltipPlace === 'bottom') {\r\n //move tooltip under open dropdown\r\n const ttip = dropDownDom.current.querySelector('.__react_component_tooltip');\r\n const wrap = dropDownDom.current.querySelector('.wrap');\r\n const { y, height } = wrap.getBoundingClientRect();\r\n const topoff = Math.floor(y + height);\r\n ttip.style.top = topoff + 'px';\r\n }\r\n }, [open]);\r\n\r\n return (\r\n
setOpen(true)} onBlur={() => setOpen(false)}>\r\n }>\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\nexport default memo(DropDown);\r\n","import TEXTS from '../controller/TextVariables';\r\nimport { useContext } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { sviThemes } from '../model/SVIThemeModel';\r\nimport DropDown from './Dropdown';\r\n\r\nconst ThemeSelectView = () => {\r\n const { setSelectedTheme, theme, tab, year } = useContext(InterfaceContext);\r\n const { label, tooltip: tooltipMap, tooltiptable } = TEXTS.controls.svi_select;\r\n\r\n const tooltip = tab.slug == 'map' ? tooltipMap : tooltiptable;\r\n\r\n const adjustThemeLabel = (theme) => {\r\n var themeObj = { ...theme };\r\n themeObj.label = year.label + '' === '2020' ? theme.label2020 : theme.labelPast;\r\n return themeObj;\r\n };\r\n const adjustbyYear = sviThemes.map((theme) => {\r\n return adjustThemeLabel(theme);\r\n });\r\n const onChangeTheme = (val) => {\r\n setSelectedTheme(val);\r\n };\r\n return (\r\n <>\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\nexport default ThemeSelectView;\r\n","import { memo } from 'react';\r\nimport _uniqueId from 'lodash/uniqueId';\r\n\r\nconst ToggleTab = (props) => {\r\n const { option: op, pose, input, selected, onClick } = props;\r\n const parsedLabel = typeof op === 'string' ? op : op.label;\r\n const parsedValue = typeof op === 'string' ? op.toLocaleLowerCase() : op.value;\r\n return (\r\n <>\r\n \r\n \r\n );\r\n};\r\n\r\nconst ToggleSwitch = (props) => {\r\n const { onChange, selected, disabled, options, id } = props;\r\n\r\n const position = selected === options[1].value ? 1 : 0;\r\n\r\n const switchPosition = (e) => {\r\n if (disabled) return;\r\n e.stopPropagation();\r\n const newValue = position === 0 ? options[1].value : options[0].value;\r\n onChange(newValue);\r\n };\r\n const onKeyDown = (e) => {\r\n if (e.code == 'Space') {\r\n switchPosition(e);\r\n e.preventDefault();\r\n }\r\n };\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n};\r\nexport default memo(ToggleSwitch);\r\n","import TEXTS from '../controller/TextVariables';\r\nimport ToggleSwitch from './ToggleSwitch';\r\nimport { useContext, useState, memo, useEffect } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { Tooltip, StandardTooltipWindow } from './Tooltip';\r\nimport MapContext from '../controller/MapProvider';\r\n\r\nconst CensusToggle = (props) => {\r\n const { tract, setSelectedTract, censusEnabled, tab } = useContext(InterfaceContext);\r\n const { setZoom, setWait } = useContext(MapContext);\r\n const { label, tooltip, disabled: disabled, helpText } = TEXTS.controls.data_level;\r\n // const [enabled, setEnabled] = useState(censusEnabled);\r\n const id = 'census-select';\r\n const onChange = (val) => {\r\n setSelectedTract(val); //set the tract_level variable\r\n };\r\n const options = [\r\n { label: 'Counties', value: 'county' },\r\n { label: 'Census Tracts', value: 'census' }\r\n ];\r\n const jumpToCensus = () => {\r\n setWait(true);\r\n setZoom(8);\r\n onChange(options[1].value);\r\n };\r\n const enabled = censusEnabled || tab.slug === 'data';\r\n const helpTexts = helpText.split('**');\r\n\r\n return (\r\n
\r\n }>\r\n \r\n \r\n \r\n {tab.slug === 'map' && (\r\n

\r\n {helpTexts.length > 1 && helpTexts[0]}\r\n \r\n {helpTexts.length === 1 ? helpTexts[0] : helpTexts[1]}\r\n \r\n {helpTexts.length > 2 && helpTexts[2]}\r\n

\r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default memo(CensusToggle);\r\n","import ToggleSwitch from './ToggleSwitch';\r\nimport TEXTS from '../controller/TextVariables';\r\nimport { useContext, memo } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { Tooltip, StandardTooltipWindow } from './Tooltip';\r\n\r\nconst CompareToggle = () => {\r\n const { setSelectedScope, scope } = useContext(InterfaceContext);\r\n const { label, tooltip } = TEXTS.controls.comparison;\r\n const id = 'comparison-tip';\r\n const onChange = (e) => {\r\n setSelectedScope(e);\r\n };\r\n\r\n const options = [\r\n { label: TEXTS.controls.comparison.option1, value: 'national' },\r\n { label: TEXTS.controls.comparison.option2, value: 'state' }\r\n ];\r\n return (\r\n <>\r\n
\r\n }>\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nexport default memo(CompareToggle);\r\n","import TEXTS from '../controller/TextVariables';\r\nimport { statesList } from '../model/StaticVariables';\r\nimport { useContext, useEffect, useState } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport ReactAutocomplete from 'react-autocomplete';\r\nimport { Tooltip, StandardTooltipWindow } from './Tooltip';\r\n\r\nexport default function StateSelect() {\r\n const { setSelectedState, usState, setStateSearch, scope } = useContext(InterfaceContext);\r\n const onChangeStateSelect = (val) => {\r\n const tehSelected = list.find((item) => {\r\n return item.label == val;\r\n });\r\n const sel = tehSelected?.bounds ? tehSelected : false;\r\n setvalue(val);\r\n setSelectedState(sel);\r\n setStateSearch(sel?.bounds);\r\n setFilteredList(list);\r\n };\r\n const [enabled, setEnabled] = useState(scope === 'state');\r\n const { label, placeholder, tooltip, disabled } = TEXTS.controls.state_select;\r\n const list = [...statesList];\r\n const [value, setvalue] = useState(usState ? usState.label : '');\r\n const [filtededList, setFilteredList] = useState(list);\r\n const [activeToolTip, setActiveToolTip] = useState(disabled);\r\n\r\n const forceCloseWindow = () => {\r\n const dropMenu = document.querySelector('#state-select > div > div');\r\n if (dropMenu) {\r\n dropMenu.style.display = 'none';\r\n }\r\n };\r\n useEffect(() => {\r\n window.addEventListener('scroll', forceCloseWindow);\r\n return () => {\r\n window.removeEventListener('scroll', forceCloseWindow);\r\n };\r\n }, []);\r\n //@@##\r\n useEffect(() => {\r\n setvalue(usState ? usState.label : '');\r\n }, [usState]);\r\n useEffect(() => {\r\n setEnabled(scope === 'state');\r\n if (scope === 'state' && value === '') {\r\n setTimeout(() => document.querySelector('.state.field input').focus(), 500);\r\n setActiveToolTip(tooltip);\r\n } else if (scope !== 'state') {\r\n setvalue('');\r\n setActiveToolTip(disabled);\r\n }\r\n }, [scope]);\r\n return (\r\n <>\r\n
\r\n }>\r\n \r\n item.label}\r\n renderItem={(item, highlighted) => (\r\n
\r\n {item.label}\r\n
\r\n )}\r\n value={value}\r\n onSelect={onChangeStateSelect}\r\n onChange={(e) => {\r\n setvalue(e.target.value);\r\n let filList = list.filter((item) => {\r\n return item.label.toLowerCase().indexOf(e.target.value.toLocaleLowerCase()) === 0;\r\n });\r\n setFilteredList(filList);\r\n }}\r\n />\r\n
\r\n {/* */}\r\n
\r\n \r\n );\r\n}\r\n","import { useContext } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport TEXTS from '../controller/TextVariables';\r\nimport { staticYearList } from '../model/StaticVariables';\r\nimport DropDown from './Dropdown';\r\n\r\nconst YearSelect = (props) => {\r\n const { setSelectedYear, year } = useContext(InterfaceContext);\r\n\r\n const onChangeYearSelect = (val) => {\r\n setSelectedYear(val);\r\n };\r\n const { label, tooltip } = TEXTS.controls.data_year;\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\nexport default YearSelect;\r\n","import TEXTS from '../controller/TextVariables';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { useContext } from 'react';\r\nimport { Tooltip, StandardTooltipWindow } from './Tooltip';\r\n\r\nexport default function ResetButton() {\r\n const { doReset, setSearch, tab, theme } = useContext(InterfaceContext);\r\n const { label, tooltip, resetTooltip } = TEXTS.controls.reset_button;\r\n const id = 'reset-tip';\r\n\r\n const onBtnClick = () => {\r\n doReset();\r\n };\r\n return (\r\n
\r\n }>\r\n \r\n \r\n {tab.slug === 'data' && theme.slug != 'overall_svi' && (\r\n }>\r\n
\r\n
\r\n )}\r\n
\r\n );\r\n}\r\n","import ThemeSelectView from './ThemeSelectView';\r\nimport CensusToggle from './CensusToggle';\r\nimport CompareToggle from './CompareToggle';\r\nimport StateSelect from './StateSelect';\r\nimport YearSelect from './YearSelect';\r\nimport ResetButton from './ResetButton';\r\n\r\nexport default function DataControls(props) {\r\n const { type } = props;\r\n const tab = type.label.toLowerCase();\r\n if (tab === 'more info') return null;\r\n return (\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n","import { DataService } from './DataService';\r\nimport { toLonLat } from 'ol/proj';\r\nimport { mapThemeAttributes } from './DataTransformation';\r\nimport { debugMode } from '../model/StaticVariables';\r\n\r\n//\"ReleaseYear 272018 AND Comparison =national AND GeoLevel=county\r\n\r\nconst sviFields = ['Overall_SVI_Percentile', 'Theme1_Percentile', 'Theme2_Percentile', 'Theme3_Percentile', 'Theme4_Percentile'];\r\n\r\nconst themeColumns = {\r\n general: ['ReleaseYear', 'GeoLevel', 'Comparison', 'ST', 'FIPS', 'E_TOTPOP', 'M_TOTPOP', 'E_HU', 'M_HU', 'E_HH', 'M_HH'],\r\n theme0: ['*'],\r\n theme1: ['Theme1_E_POV', 'Theme1_M_POV', 'Theme1_EP_POV', 'Theme1_MP_POV', 'Theme1_EPL_POV', 'Theme1_E_UNEMP', 'Theme1_M_UNEMP', 'Theme1_EP_UNEMP', 'Theme1_MP_UNEMP', 'Theme1_EPL_UNEMP', 'Theme1_E_PCI', 'Theme1_M_PCI', 'Theme1_EP_PCI', 'Theme1_MP_PCI', 'Theme1_EPL_PCI', 'Theme1_E_NOHSDP', 'Theme1_M_NOHSDP', 'Theme1_EP_NOHSDP', 'Theme1_MP_NOHSDP', 'Theme1_EPL_NOHSDP', 'Theme1_SPL', 'Theme1_Percentile'],\r\n theme2: ['Theme2_E_AGE65', 'Theme2_M_AGE65', 'Theme2_EP_AGE65', 'Theme2_MP_AGE65', 'Theme2_EPL_AGE65', 'Theme2_E_AGE17', 'Theme2_M_AGE17', 'Theme2_EP_AGE17', 'Theme2_MP_AGE17', 'Theme2_EPL_AGE17', 'Theme2_E_DISABL', 'Theme2_M_DISABL', 'Theme2_EP_DISABL', 'Theme2_MP_DISABL', 'Theme2_EPL_DISABL', 'Theme2_E_SNGPNT', 'Theme2_M_SNGPNT', 'Theme2_EP_SNGPNT', 'Theme2_MP_SNGPNT', 'Theme2_EPL_SNGPNT', 'Theme2_SPL', 'Theme2_Percentile'],\r\n theme3: ['Theme3_E_MINRTY', 'Theme3_M_MINRTY', 'Theme3_EP_MINRTY', 'Theme3_MP_MINRTY', 'Theme3_EPL_MINRTY', 'Theme3_E_LIMENG', 'Theme3_M_LIMENG', 'Theme3_EP_LIMENG', 'Theme3_MP_LIMENG', 'Theme3_EPL_LIMENG', 'Theme3_SPL', 'Theme3_Percentile'],\r\n theme4: ['Theme4_E_MUNIT', 'Theme4_M_MUNIT', 'Theme4_EP_MUNIT', 'Theme4_MP_MUNIT', 'Theme4_EPL_MUNIT', 'Theme4_E_MOBILE', 'Theme4_M_MOBILE', 'Theme4_EP_MOBILE', 'Theme4_MP_MOBILE', 'Theme4_EPL_MOBILE', 'Theme4_E_CROWD', 'Theme4_M_CROWD', 'Theme4_EP_CROWD', 'Theme4_MP_CROWD', 'Theme4_EPL_CROWD', 'Theme4_E_NOVEH', 'Theme4_M_NOVEH', 'Theme4_EP_NOVEH', 'Theme4_MP_NOVEH', 'Theme4_EPL_NOVEH', 'Theme4_E_GROUPQ', 'Theme4_M_GROUPQ', 'Theme4_EP_GROUPQ', 'Theme4_MP_GROUPQ', 'Theme4_EPL_GROUPQ', 'Theme4_SPL', 'Theme4_Percentile'],\r\n general_flag: ['F_Total', 'E_UNINSUR', 'M_UNINSUR', 'EP_UNINSUR', 'MP_UNINSUR', 'E_DAYPOP', 'GRASPID'],\r\n theme0_flag: [],\r\n theme1_flag: ['F_POV', 'F_UNEMP', 'F_PCI', 'F_NOHSDP', 'F_Theme1'],\r\n theme2_flag: ['F_AGE65', 'F_AGE17', 'F_DISABL', 'F_SNGPNT', 'F_Theme2'],\r\n theme3_flag: ['F_MINRTY', 'F_LIMENG', 'F_Theme3'],\r\n theme4_flag: ['F_MUNIT', 'F_MOBILE', 'F_CROWD', 'F_NOVEH', 'F_GROUPQ', 'F_Theme4']\r\n};\r\n//Quantization params:\r\n// {\"mode\":\"view\",\"originPosition\":\"upperLeft\",\"tolerance\":1.0583354500042335,\"extennt\":{\"type\":\"extent\",\"xmin\":${extent.XMin},\"ymin\":${extent.YMin},\"xmax\":${extent.XMax},\"ymax\":${extent.YMax},\"spatialReference\":{\"wkid\":102100,\"latestWkid\":3857}}}\r\n//&quantizationParameters=%7B%22mode%22%3A%22view%22%2C%22originPosition%22%3A%22upperLeft%22%2C%22tolerance%22%3A1.0583354500042335%2C%22extent%22%3A%7B%22type%22%3A%22extent%22%2C%22xmin%22%3A${extent.XMin}%2C%22ymin%22%3A${extent.YMin}%2C%22xmax%22%3A${extent.XMax}%2C%22ymax%22%3A${extent.YMax}%2C%22spatialReference%22%3A%7B%22wkid%22%3A102100%2C%22latestWkid%22%3A3857%7D%7D%7D\r\n// %7B%27extent%27%3A%7B%27type%27%3A%27extent%27%2C%27xmin%27%3A${extent.XMin}%2C%27ymin%27%3A${extent.YMin}%2C%27xmax%27%3A${extent.XMax}%2C%27ymax%27%3A${extent.YMax}%7D%7D/ ' { } :\r\n// quantizationParameters=%7B\"extent\"%3A%7B\"type\"%3A\"extent\"%2C\"xmin\"%3A${extent.XMin}%2C\"ymin\"%3A${extent.YMin}%2C\"xmax\"%3A${extent.XMax}%2C\"ymax\"%3A${extent.YMax}%7D%7D\r\nclass OneMapApiDataService extends DataService {\r\n _needsAuth = false;\r\n _name = 'one map';\r\n constructor() {\r\n super();\r\n\r\n this._token = this.authenticate();\r\n this._client.interceptors.response.use(this.responseInterceptor, this.responseError);\r\n // ** every 8 hrs refresh token, for idle tabs that stay open overnight\r\n // setInterval(() => {\r\n // this._token = this.authenticate();\r\n // }, 1000 * 60 * 60 * 8);\r\n // ms sec min hr\r\n\r\n // setInterval(() => {\r\n // console.log('refresh auth token....');\r\n // this._token = this.authenticate();\r\n // }, 1000 * 60 * 5);\r\n // ms sec min hr\r\n }\r\n\r\n _api = (args) => {\r\n const { type, theme, scope, tract, year, fips = [], extent = { x1: 0, y1: 0, x2: 0, y2: 0 }, blacklist } = args;\r\n const state = args.usState || args.state || { id: 0, slug: '', fips: '' };\r\n // const { type, scope, tract, year, state = { id: 0, slug: \"\", fips: \"\" }, extent = { x1: 0, y1: 0, x2: 0, y2: 0 } } = args;\r\n const base = debugMode ? 'https://wipv-grsp-10.cdc.gov/onemapservices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query' : 'https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query';\r\n const graspBase = 'http://grasp_internal_test.cdc.gov/sviwebsite/';\r\n // console.log(\"Base Info:\");\r\n // console.log(base);\r\n const slug = this.formatSlug(args);\r\n //Direct access url use for testing:\r\n //https://wipv-grsp-10.cdc.gov/onemapservices/rest/services\r\n //grasp 10\r\n\r\n const geometryProps = {\r\n geometryType: 'esriGeometryPolyline',\r\n geometryPrecision: 4,\r\n returnTrueCurve: true\r\n };\r\n var themeFields, themeFlags, general;\r\n const output = { url: '', body: {}, head: {} };\r\n const defaults = {\r\n XMin: extent.x1,\r\n YMin: extent.y1,\r\n XMax: extent.x2,\r\n YMax: extent.y2\r\n };\r\n\r\n switch (slug) {\r\n case 'geometry_state':\r\n output.url = 'https://cdn.jsdelivr.net/npm/us-atlas@3/states-10m.json';\r\n break;\r\n // ΔVΔVΔ: Geometry\r\n case 'geometry_national_county':\r\n case 'geometry_national_census':\r\n case 'geometry_state_county':\r\n case 'geometry_state_census':\r\n output.url = `${base}`;\r\n output.body = {\r\n where: {\r\n ReleaseYear: year,\r\n Comparison: scope,\r\n GeoLevel: tract == 'census' ? 'tract' : 'county'\r\n },\r\n f: 'geojson',\r\n outfields: ['FIPS'],\r\n resultRecordCount: this._record_max\r\n };\r\n output.body = { ...output.body, ...geometryProps };\r\n\r\n if (state.fips) {\r\n output.body.where.ST = state.fips;\r\n } else if (fips.length) {\r\n output.body.where.fips = fips;\r\n }\r\n break;\r\n case 'table_national_county':\r\n case 'table_national_census':\r\n case 'table_state_county':\r\n case 'table_state_census':\r\n output.url = `${base}`;\r\n output.body = {\r\n where: {\r\n ReleaseYear: year,\r\n Comparison: scope,\r\n GeoLevel: tract == 'census' ? 'tract' : 'county'\r\n },\r\n returnGeometry: false,\r\n f: 'JSON',\r\n outfields: ['GRASPID', 'FIPS', 'ReleaseYear', 'GeoLevel', 'Comparison', 'ST']\r\n };\r\n themeFields = themeColumns['theme' + theme.id];\r\n general = themeColumns['general'];\r\n if (themeFields[0] === '*') {\r\n output.body.outfields = ['*'];\r\n } else {\r\n themeFlags = themeColumns['theme' + theme.id + '_flag'];\r\n output.body.outfields.push(...general, ...themeFields);\r\n if (themeFlags.length) output.body.outfields.push(...themeFlags);\r\n }\r\n if (state.id) {\r\n output.body.where.fips = [state.id];\r\n }\r\n break;\r\n // ΔVΔVΔ: SVI data\r\n case 'svi_national_county':\r\n case 'svi_national_census':\r\n output.url = `${base}`;\r\n output.body = {\r\n where: {\r\n ReleaseYear: year,\r\n Comparison: scope,\r\n GeoLevel: tract == 'census' ? 'tract' : 'county'\r\n },\r\n\r\n returnGeometry: false,\r\n f: 'JSON',\r\n outfields: ['GRASPID', 'FIPS', 'ST', ...sviFields]\r\n };\r\n if (fips.length) {\r\n output.body.where.fips = fips;\r\n }\r\n break;\r\n case 'svi_state_county':\r\n case 'svi_state_census':\r\n output.url = `${base}`;\r\n output.body = {\r\n where: {\r\n ReleaseYear: year,\r\n Comparison: scope,\r\n GeoLevel: tract == 'census' ? 'tract' : 'county'\r\n },\r\n\r\n returnGeometry: false,\r\n f: 'JSON',\r\n outfields: ['GRASPID', 'FIPS', 'ST', ...sviFields]\r\n };\r\n\r\n if (fips.length) {\r\n output.body.where.fips = fips;\r\n }\r\n\r\n break;\r\n case 'geometry_hhs':\r\n output.url = `${base}`;\r\n break;\r\n\r\n // ΔVΔVΔ: Lists\r\n case 'list_county':\r\n output.url = `${base}/list/allcountieslist.json`;\r\n break;\r\n\r\n case 'list_state':\r\n output.url = `${base}/list/statesList.json`;\r\n break;\r\n\r\n // ΔVΔVΔ: POI\r\n case 'poi_hospital':\r\n case 'poi_hospitals':\r\n // case 'poi_Hospitals': // Future POI endpoint changes coming in 2023 (US16431)\r\n output.url = `https://services1.arcgis.com/Hp6G80Pky0om7QvQ/ArcGIS/rest/services/Hospital/FeatureServer/0/query`;\r\n output.body = {\r\n // supportsCoordinatesQuantization: true,\r\n // quantizationParameter: { mode: 'view', originPosition: 'upperLeft', tolerance: 1.0583354500042335, extent: { type: 'extent', xmin: ${extent.XMin}, ymin: ${extent.YMin}, xmax: ${extent.XMax}, ymax: ${extent.YMax}, spatialReference: { wkid: 102100, latestWkid: 3857 } } },\r\n // quantizationParameter: `{ 'extent': { 'type': 'extent', 'xmin': ${extent.XMin || extent.x1}, 'ymin': ${extent.YMin || extent.y1}, 'xmax': ${extent.XMax || extent.x2}, 'ymax': ${extent.YMax || extent.y2} } }`,\r\n geometry: Object.values(extent).join('%2C'),\r\n needsAuth: 'false',\r\n outfields: 'ID,NAME,ADDRESS,CITY,STATE,COUNTY,ZIP',\r\n inSR: '3857',\r\n outSR: '3857',\r\n f: 'json'\r\n };\r\n if (blacklist?.length) output.body.where = `ID+not+in%28${blacklist.join(',')}%29`;\r\n break;\r\n case 'poi_nursinghome':\r\n case 'poi_nursing_home':\r\n case 'poi_nursing_homes':\r\n // case 'poi_NursingHomes': // Future POI endpoint changes coming in 2023 (US16431)\r\n output.url = `https://services1.arcgis.com/Hp6G80Pky0om7QvQ/ArcGIS/rest/services/NursingHomes/FeatureServer/0/query`;\r\n output.body = {\r\n geometry: Object.values(extent).join('%2C'),\r\n needsAuth: 'false',\r\n //ΔVΔVΔ: Public school API does not yet have an ID attribute andd breaks lookup\r\n // outfields: 'ID,NAME,ADDRESS,CITY,STATE,COUNTY,ZIP',\r\n outfields: 'ID,NAME,ADDRESS,CITY,STATE,COUNTY,ZIP',\r\n inSR: '3857',\r\n outSR: '3857',\r\n f: 'json'\r\n };\r\n if (blacklist?.length) output.body.where = `ID+not+in%28${blacklist.join(',')}%29`;\r\n break;\r\n\r\n case 'poi_daycare':\r\n case 'poi_day_care_centers':\r\n case 'poi_ChildCareCenters': // Future POI endpoint changes coming in 2023 (US16431)\r\n //output.url = `https://services1.arcgis.com/Hp6G80Pky0om7QvQ/ArcGIS/rest/services/Child_Care/FeatureServer/0/query`;\r\n output.url = `https://services1.arcgis.com/Hp6G80Pky0om7QvQ/ArcGIS/rest/services/ChildCareCenter1/FeatureServer/0/query`;\r\n output.body = {\r\n geometry: Object.values(extent).join('%2C'),\r\n needsAuth: 'false',\r\n outfields: 'ID,NAME,ADDRESS,CITY,STATE,COUNTY,ZIP',\r\n inSR: '3857',\r\n outSR: '3857',\r\n f: 'json'\r\n };\r\n if (blacklist?.length) output.body.where = `ID+not+in%28${blacklist.join(',')}%29`;\r\n break;\r\n\r\n case 'poi_school':\r\n case 'poi_schools':\r\n case 'poi_public_schools':\r\n // case 'poi_Public_Schools': // Future POI endpoint changes coming in 2023 (US16431) (note, not needed)\r\n output.url = `https://services1.arcgis.com/Hp6G80Pky0om7QvQ/ArcGIS/rest/services/Public_Schools/FeatureServer/0/query`;\r\n output.body = {\r\n geometry: Object.values(extent).join('%2C'),\r\n needsAuth: 'false',\r\n outfields: 'OBJECTID,NAME,ADDRESS,CITY,STATE,COUNTY,ZIP',\r\n inSR: '3857',\r\n outSR: '3857',\r\n f: 'json'\r\n };\r\n if (blacklist) output.body.where = `OBJECTID+not+in%28${blacklist.join(',')}%29`; //%28 = [ %29 = ]\r\n break;\r\n //OBJECTID+not+in[37422]\r\n //where=OBJECTID+not+in+%2839202%29\r\n\r\n case 'poi_coords_hospital':\r\n case 'poi_coords_hospitals':\r\n // case 'poi_Hospitals': // Future POI endpoint changes coming in 2023 (US16431)\r\n output.url = `https://services1.arcgis.com/Hp6G80Pky0om7QvQ/ArcGIS/rest/services/Hospital/FeatureServer/0/query`;\r\n output.body = {\r\n // supportsCoordinatesQuantization: true,\r\n // quantizationParameter: { mode: 'view', originPosition: 'upperLeft', tolerance: 1.0583354500042335, extent: { type: 'extent', xmin: ${extent.XMin}, ymin: ${extent.YMin}, xmax: ${extent.XMax}, ymax: ${extent.YMax}, spatialReference: { wkid: 102100, latestWkid: 3857 } } },\r\n // quantizationParameter: `{ 'extent': { 'type': 'extent', 'xmin': ${extent.XMin || extent.x1}, 'ymin': ${extent.YMin || extent.y1}, 'xmax': ${extent.XMax || extent.x2}, 'ymax': ${extent.YMax || extent.y2} } }`,\r\n // geometry: Object.values(extent).join('%2C'),\r\n needsAuth: 'false',\r\n outfields: 'ID',\r\n inSR: '3857',\r\n outSR: '3857',\r\n f: 'json'\r\n };\r\n break;\r\n case 'poi_coords_nursinghome':\r\n case 'poi_coords_nursing_home':\r\n case 'poi_coords_nursing_homes':\r\n output.url = `https://services1.arcgis.com/Hp6G80Pky0om7QvQ/ArcGIS/rest/services/NursingHomes/FeatureServer/0/query`;\r\n output.body = {\r\n // geometry: Object.values(extent).join('%2C'),\r\n needsAuth: 'false',\r\n outfields: 'ID',\r\n inSR: '3857',\r\n outSR: '3857',\r\n f: 'json'\r\n };\r\n if (state) {\r\n output.body.where.STATE = state;\r\n }\r\n break;\r\n\r\n case 'poi_coords_daycare':\r\n case 'poi_coords_day_care_centers':\r\n case 'poi_coords_ChildCareCenters': // Future POI endpoint changes coming in 2023 (US16431)\r\n //output.url = `https://services1.arcgis.com/Hp6G80Pky0om7QvQ/ArcGIS/rest/services/Child_Care/FeatureServer/0/query`;\r\n output.url = `https://services1.arcgis.com/Hp6G80Pky0om7QvQ/ArcGIS/rest/services/ChildCareCenter1/FeatureServer/0/query`;\r\n output.body = {\r\n // geometry: Object.values(extent).join('%2C'),\r\n needsAuth: 'false',\r\n outfields: 'ID',\r\n // outfields: 'ID,NAME,ADDRESS,CITY,STATE,COUNTY,ZIP',\r\n inSR: '3857',\r\n outSR: '3857',\r\n f: 'json'\r\n };\r\n break;\r\n\r\n case 'poi_coords_school':\r\n case 'poi_coords_schools':\r\n case 'poi_coords_public_schools':\r\n output.url = `https://services1.arcgis.com/Hp6G80Pky0om7QvQ/ArcGIS/rest/services/Public_Schools/FeatureServer/0/query`;\r\n output.body = {\r\n // geometry: Object.values(extent).join('%2C'),\r\n needsAuth: 'false',\r\n outfields: 'OBJECTID',\r\n inSR: '3857',\r\n outSR: '3857',\r\n f: 'json'\r\n };\r\n break;\r\n // ΔVΔVΔ: Depreciated: count is an unreliable endpoint\r\n case 'count':\r\n case 'count_national_county':\r\n case 'count_national_census':\r\n case 'count_state_county':\r\n case 'count_state_census':\r\n output.url = `${base}?where=ReleaseYear%3D${year}&returnCountOnly=true&f=pjson`;\r\n break;\r\n default:\r\n var err = new Error('Could Not create call object config for ' + slug);\r\n throw err;\r\n }\r\n\r\n if (output.body?.where && typeof output.body.where == 'object') {\r\n output.body.where = Object.keys(output.body.where)\r\n .map((key) => {\r\n if (key === 'fips' && output.body.where.fips.length) {\r\n const fipsSTR =\r\n '( ' +\r\n output.body.where.fips\r\n .map((item) => {\r\n return `FIPS like '${item}%'`;\r\n })\r\n .join(' or ') +\r\n ' )';\r\n return fipsSTR;\r\n }\r\n // return key + \"='\" + output.body.where[key] + \"'\";\r\n\r\n if (key === 'ReleaseYear') {\r\n //ΔVΔVΔ: For Integers\r\n return key + '=' + output.body.where[key];\r\n } else {\r\n //ΔVΔVΔ: For strings\r\n return key + \"='\" + output.body.where[key] + \"'\";\r\n }\r\n })\r\n .join(' AND ');\r\n output.body.where = output.body.where.replace(/=/g, '%3D').replace(/ /g, '+').replace(/'/g, '%27');\r\n output.body.orderByFields = 'FIPS';\r\n } else if (typeof output.body?.where == 'string') {\r\n //\r\n } else {\r\n output.body.where = '1=1';\r\n }\r\n if (output.body?.quantizationParameter) {\r\n //conveert\r\n output.body.quantizationParameter = output.body.quantizationParameter.replace(/=/g, '%3D').replace(/ /g, '').replace(/'/g, '%22').replace(/{/g, '%7B').replace(/}/g, '%7D').replace(/:/g, '%3A').replace(/,/g, '%2C');\r\n }\r\n // if (output.body.geometry) {\r\n // output.body.geometry = output.body.geometry.replace(/,/g, '%2C');\r\n // }\r\n\r\n return output;\r\n };\r\n convertExtent = (extent = [0, 0, 0, 0]) => {\r\n let ext = toLonLat(extent);\r\n return String(`xmin=${ext[0]}, ymin=${ext[1]}, xmax=${ext[2]}, ymax=${ext[3]}`).replace(/=/g, '%3D').replace(/ /g, '+').replace(/'/g, '%27').replace(/,/g, '%2C');\r\n };\r\n // ΔVΔVΔ: For Reference\r\n // queryVars = {\r\n // request: {\r\n // returnCentroid: \"center of a feature\",\r\n // returnCountOnly: \"t/f only return result count\",\r\n // resultOffset: \"(start index of request)\",\r\n // resultRecordCount: \"\",\r\n // outFields: \"(sets the fields returned)\",\r\n // distance: \"buffer distance surrounding the suppplied coords\",\r\n // returnGeometry: \"t/f\",\r\n // recordType: \"\",\r\n // geometryPrecision: \"limit decimal point for coords value\",\r\n // returnExceededLimitFeatures: \"=>ignores exceededTransferLimit\",\r\n // f: \"json(format)\",\r\n // supportsCoordinatesQuantization: \"t/f\",\r\n // quantizationParameters: \"\",\r\n // },\r\n // response: {\r\n // GRASPID: 134043,\r\n // FIPS: \"01003011403\",\r\n // GDB_GEOMATTR_DATA: null,\r\n // year: 2018,\r\n // ST: \"01\",\r\n // GeoLevel: \"(County,Tract)\",\r\n // Comparison: \"(National/State)\",\r\n // Overall_SVI_Percentile: 0.2102,\r\n // Theme1_Percentile: \"\",\r\n // Theme2_Percentile: \"\",\r\n // Theme3_Percentile: \"\",\r\n // Theme4_Percentile: \"\",\r\n // },\r\n // };\r\n _batch_max = 150;\r\n _record_max = 10000;\r\n\r\n getCount = async (args) => {\r\n const params = Object.assign({ type: 'count' }, args);\r\n const callObj = this.formatCall(params);\r\n return await this.get(callObj)\r\n .then((res) => {\r\n return res.count;\r\n })\r\n .catch((err) => {\r\n return err;\r\n });\r\n };\r\n\r\n applyFiltertransformData = (callObj, res) => {\r\n if (!res || !res.data) return [];\r\n if (callObj?.args?.type === 'geometry') {\r\n return [res.data];\r\n }\r\n // if (callObj?.args?.type === \"svi\") {\r\n // return [this.convertToSVIobj(res.data)];\r\n // }\r\n // if (callObj?.args?.type === \"table\") {\r\n // return res.data.features.map((a) => a.attributes);\r\n // }\r\n return res.data ? res.data : [];\r\n };\r\n convertToSVIobj2 = (arr) => {\r\n var obj = {};\r\n arr.forEach((row) => {\r\n var item = row.attributes;\r\n obj[item.FIPS] = mapThemeAttributes(item);\r\n });\r\n return obj;\r\n };\r\n convertToSVIobj = (arr) => {\r\n var obj = {};\r\n arr.features.forEach((row) => {\r\n var item = row.attributes;\r\n obj[item.FIPS] = mapThemeAttributes(item);\r\n });\r\n return obj;\r\n };\r\n\r\n // ΔVΔVΔ: Helper function to split array for batch lookups\r\n _chunkArray = (array, size) => {\r\n const chunked_arr = [];\r\n let copied = [...array]; // ES6 destructuring\r\n const numOfChild = Math.ceil(copied.length / size); // Round up to the nearest integer\r\n for (let i = 0; i < numOfChild; i++) {\r\n chunked_arr.push(copied.splice(0, size));\r\n }\r\n return chunked_arr;\r\n };\r\n\r\n getTillEndOfPage = async (props) => {\r\n let { callProps, callCount = 0, callLimit = 500, batchSize = 2000 } = props;\r\n // const formatArray = callProps.type === \"table\";\r\n var output = []; //formatArray ? [] : {};\r\n let isLastPage = false;\r\n let seriesCount = 0;\r\n const callObject = this.formatCall(callProps);\r\n while (!isLastPage && callCount < callLimit) {\r\n const offset = batchSize * seriesCount;\r\n callObject.body.resultOffset = offset; // / 10;\r\n callObject.body.resultRecordCount = batchSize; //for test now\r\n callCount++;\r\n seriesCount++;\r\n const json = await this.get(callObject).then((data) => {\r\n return data?.features || data?.[0]?.features;\r\n // return formatArray ? data.flat() : data.flat()[0];\r\n });\r\n if (!json) return;\r\n output = [...output, ...json];\r\n\r\n if (json.length < batchSize) {\r\n isLastPage = true;\r\n }\r\n }\r\n //send a single array of features\r\n return output;\r\n };\r\n validateFips = (fips) => {\r\n if (fips?.length) return fips;\r\n if (fips?.size) return Array.from(fips);\r\n return [0, 1, 2, 3, 4, 5, 6, 7];\r\n };\r\n getByBatch = async (props) => {\r\n const { callProps, callLimit = 1000, maximum = 200 } = props;\r\n const batchSize = 2000;\r\n let fips = this.validateFips(callProps.fips);\r\n //ΔVΔVΔ: Make this function more generic, instead of the specific data in th callProps, just pass an array to the fuction\r\n const chunkedFips = this._chunkArray(fips, 30); //ΔVΔVΔ: looking up more than 59 fips in query seems to create a 404. There seems to be a limitonst chunkedFips = this.chunkArray(props.fips, 50);\r\n let callCount = 0;\r\n const promises = [];\r\n const maxRuns = Math.min(maximum, chunkedFips.length); //create boundary to prevent infinite lookup\r\n for (var i = 0; i < maxRuns; i++) {\r\n var aChunkOfCountyFips = chunkedFips[i];\r\n let propsOnTheFly = Object.assign({}, callProps, {\r\n fips: aChunkOfCountyFips\r\n });\r\n promises.push(\r\n this.getTillEndOfPage({\r\n callProps: propsOnTheFly,\r\n callCount,\r\n callLimit,\r\n batchSize\r\n }).then((res) => {\r\n return res;\r\n })\r\n );\r\n }\r\n\r\n return await Promise.all(promises).then((res) => {\r\n return res.flat();\r\n });\r\n };\r\n getFirstPageTableData = async (props) => {\r\n props.type = 'table';\r\n const config = this.formatCall(props);\r\n config.body.resultRecordCount = 100;\r\n return await this.get(config).then((res) => {\r\n const tableDat = res.features.map((a) => a.attributes);\r\n return tableDat;\r\n });\r\n };\r\n getTableData = async (props) => {\r\n props.type = 'table';\r\n // var allFipsAllPagesData = [];\r\n return await this.getByBatch({\r\n callProps: props\r\n }).then((res) => {\r\n //return res.data.features.map((a) => a.attributes);\r\n const tableDat = res.map((a) => a.attributes);\r\n return tableDat;\r\n // return allFipsAllPagesData;\r\n });\r\n };\r\n // getSVIData => break fips array into batches/chunks. For each chunk call the api until the endpoint indicates that there are no more records to return\r\n getSVIData = async (props) => {\r\n props.type = 'svi';\r\n return await this.getByBatch({\r\n callProps: props\r\n }).then((res) => {\r\n const sviObject = this.convertToSVIobj2(res);\r\n return sviObject;\r\n });\r\n };\r\n // geo data by state\r\n getGeometryData = async (props) => {\r\n props.type = 'geometry';\r\n var allFipsAllPagesData = [];\r\n await this.getTillEndOfPage({ callProps: props }).then((res) => {\r\n allFipsAllPagesData.push(res);\r\n });\r\n\r\n return allFipsAllPagesData.flat();\r\n };\r\n getPOIData = async (props) => {\r\n const { scope, extent, year, tileKey, blacklist } = props;\r\n var allPOIpageData = await this.getTillEndOfPage({\r\n callProps: { type: 'poi', scope, extent, year, tileKey, blacklist }\r\n });\r\n\r\n return allPOIpageData;\r\n };\r\n getPOICoords = async (props) => {\r\n const { scope, extent } = props;\r\n var allPOIpageData = await this.getTillEndOfPage({\r\n callProps: { type: 'poi_coords', scope, extent }\r\n });\r\n\r\n return allPOIpageData;\r\n };\r\n\r\n // ΔVΔVΔ: !!!Temporary solution, should keep pw info serverside\r\n getAuthCall = () => {\r\n const un = 'svi_interactive_map';\r\n\r\n const pw = encodeURIComponent('qrx.ujz.VND7cjp2cdc');\r\n var h = encodeURIComponent(window.location.origin);\r\n h = h ? h : 'http://localhost'; //fallback for local testin\r\n\r\n return {\r\n args: { type: 'auth' },\r\n url: 'https://onemap.cdc.gov/Portal/sharing/rest/generateToken',\r\n body: `username=${un}&password=${pw}&referer=${h}&expiration=60&f=json`,\r\n head: { 'Content-Type': 'application/x-www-form-urlencoded' }\r\n };\r\n };\r\n}\r\nexport { OneMapApiDataService };\r\n\r\n// https://onemap.cdc.gov/OneMapServices/rest/services/SVI/SVI_consolidated_data/FeatureServer/0/query?where=ReleaseYear%3D%272000%27+AND+Comparison%3D%27national%27+AND+GeoLevel%3D%27tract%27&returnGeometry=false&f=JSON&outfields=GRASPID,FIPS,ST,Overall_SVI_Percentile,Theme1_Percentile,Theme2_Percentile,Theme3_Percentile,Theme4_Percentile&orderByFields=FIPS&resultOffset=0&resultRecordCount=2000\r\n","import { localDevelopment } from '../model/StaticVariables';\r\nimport VectorSource from 'ol/source/Vector';\r\nimport { DevDataService } from '../model/DevDataService';\r\nimport TopoJSON from 'ol/format/TopoJSON';\r\nimport GeoJSON from 'ol/format/GeoJSON';\r\nimport * as mapStyles from '../view/MapVectorStyles.js';\r\nimport { OneMapApiDataService } from '../model/OneMapApiDataService';\r\nimport { countiesList, dataProjection, featureProjection, statesList, minCensusZoom } from '../model/StaticVariables';\r\n\r\nconst DS = new DevDataService();\r\nconst ODS = new OneMapApiDataService();\r\n\r\nconst getCountyLayerReference = (map) => {\r\n return map.getLayers().array_.find(function (lyr) {\r\n return lyr.get('title') === 'referenceCounty';\r\n });\r\n};\r\n\r\nconst convertGeometryToFeatures = (data, format = 'topojson') => {\r\n //ΔVΔVΔ: note for later conver to TopoJson or geojson based on data\r\n const clonedData = Object.assign({}, data);\r\n var features;\r\n if (format === 'topojson') {\r\n let firstNode = Object.keys(clonedData.objects)[0];\r\n features = new TopoJSON({\r\n layers: firstNode\r\n }).readFeatures(clonedData, {\r\n dataProjection,\r\n featureProjection\r\n });\r\n }\r\n if (format === 'geojson') {\r\n features = new GeoJSON({\r\n // layers: firstNode,\r\n }).readFeatures(clonedData, {\r\n dataProjection,\r\n featureProjection\r\n });\r\n }\r\n return features;\r\n};\r\nconst getTileExtent = (map, lyr) => {\r\n const extent = map.getView().calculateExtent(map.getSize());\r\n const grid = lyr.getSource().tileGrid;\r\n // const tiles = [];\r\n const tilesObj = {};\r\n grid.forEachTileCoord(extent, map.getView().getZoom(), (coord) => {\r\n let tileExtent = grid.getTileCoordExtent(coord);\r\n tilesObj[`z:${coord[0]}x:${coord[1]}y:${coord[2]}`] = tileExtent;\r\n // tiles.push(tileExtent);\r\n });\r\n // return tiles;\r\n return tilesObj;\r\n};\r\nexport { getTileExtent };\r\n\r\nconst getFipsFromExtent = (map, id) => {\r\n const obj = {\r\n features: [],\r\n stateNames: [],\r\n stateFips: [],\r\n countyFips: [],\r\n featureFips: []\r\n };\r\n if (!map) return obj;\r\n const mapExtent = map.getView().calculateExtent();\r\n const countyLyr = getCountyLayerReference(map);\r\n if (!countyLyr) return obj;\r\n const countyLyrSource = countyLyr.getSource();\r\n //ΔVΔVΔ: Use if lyr is visible\r\n // countyLyrSource.forEachFeature((feature)=>{\r\n // feature.setStyle( mapStyles.outOfScope)\r\n // })\r\n countyLyrSource.forEachFeatureIntersectingExtent(mapExtent, function (feature) {\r\n let fips = feature.get('FIPS') || feature.get('STATEFP') + feature.get('COUNTYFP');\r\n fips = fips.toString();\r\n let stateName =\r\n feature.get('STATE_NAME') ||\r\n statesList.find((st) => {\r\n return st.id === feature.get('STATEFP');\r\n })?.label;\r\n // feature.setStyle( mapStyles.flatColorCountyStyle('#fff8dcab')) //cornsilk\r\n\r\n obj.features.push(feature);\r\n obj.featureFips[fips] = true;\r\n obj.stateNames[stateName] = true;\r\n obj.countyFips[fips.substr(0, 5)] = true;\r\n obj.stateFips[fips.substr(0, 2)] = true;\r\n });\r\n obj.countyFips = Object.keys(obj.countyFips);\r\n obj.stateFips = Object.keys(obj.stateFips);\r\n obj.stateNames = Object.keys(obj.stateNames);\r\n return obj;\r\n};\r\n\r\nconst getFeatureFipsFromExtent = (map, detail = 'low') => {\r\n const obj = new Set();\r\n if (!map) return obj;\r\n const mapExtent = map.getView().calculateExtent();\r\n const countyLyr = getCountyLayerReference(map);\r\n if (!countyLyr) return obj;\r\n const countyLyrSource = countyLyr.getSource();\r\n\r\n countyLyrSource.forEachFeatureIntersectingExtent(mapExtent, function (feature) {\r\n let fips = feature.get('FIPS') || feature.get('STATEFP') + feature.get('COUNTYFP');\r\n fips = detail === 'low' ? fips.toString().substring(0, 2) : fips.toString();\r\n obj.add(fips);\r\n });\r\n return obj;\r\n};\r\nexport { getFeatureFipsFromExtent };\r\n\r\nconst getPoiData = async (props) => {\r\n const { scope, tilesObj } = props;\r\n var promises;\r\n\r\n // tileObj = {\r\n // \"z:4x:3y:5\": [ -12523442.714243278, 5009377.085697312, -10018754.171394622, 7514065.628545968 ],\r\n // \"z:4x:3y:6\": [ -12523442.714243278, 2504688.542848654, -10018754.171394622, 5009377.08569731 ]\r\n // }\r\n //ΔVΔVΔ: Get mock data for local dev\r\n if (localDevelopment) {\r\n let key = Object.keys(tilesObj)[0];\r\n let zoom = key.split(':')[1].replace(/x/, '');\r\n const url = `/data//poijson/poi_zoom_${zoom}_${scope}.json`;\r\n const json = fetch(url)\r\n .then((data) => data.json())\r\n .then((res) => {\r\n const tilekeys = Object.keys(tilesObj);\r\n return tilekeys.map((key, i) => {\r\n let tile = res[i];\r\n if (!tile) return { extent: tilesObj[key], count: 0, data: [] };\r\n\r\n console.log(key, i, tile, tile.Table1[0]);\r\n return { extent: tilesObj[key], count: tile.Table1[0].Count, data: tile.Table };\r\n });\r\n });\r\n promises = [json];\r\n console.log(await json);\r\n return Promise.all(promises);\r\n }\r\n\r\n //ΔVΔVΔ: Get Live Data, loop through map tiles in extent\r\n promises = Object.keys(tilesObj).map(async (key) => {\r\n let t = tilesObj[key];\r\n const tileExtent = { x1: t[0], y1: t[1], x2: t[2], y2: t[3] };\r\n return DS.getPOIData({ scope, extent: tileExtent, extentKey: key }).then((data) => {\r\n data.tileExtent = tileExtent;\r\n data.key = key;\r\n return data;\r\n });\r\n });\r\n return Promise.all(promises);\r\n};\r\nexport { getPoiData };\r\n\r\nconst addCountyFIPSInfo = async (features) => {\r\n return features.map(function (feat) {\r\n let cdc = feat.get('ID');\r\n let countyFIPS = countiesList.find(function (d) {\r\n return d.CDC === cdc;\r\n });\r\n try {\r\n feat.set('FIPS', countyFIPS.CC);\r\n feat.set('COUNTY', countyFIPS.CN);\r\n feat.set('STATE_NAME', countyFIPS.SN);\r\n } catch (err) {\r\n console.error('Err:213, could not assign County FIPS');\r\n }\r\n return feat;\r\n });\r\n};\r\n\r\nconst countiesFromFips = (geometry) => {\r\n var expandedCountyExtent = {};\r\n geometry.forEach((geo) => {\r\n let fips = geo.get('FIPS');\r\n let cntyfips = fips.substr(0, 5);\r\n expandedCountyExtent[cntyfips] = true;\r\n });\r\n return Object.keys(expandedCountyExtent);\r\n};\r\n\r\nconst getVisibleGeometry = async (props) => {\r\n const { scope, tract, fipsList, year, zoom } = props;\r\n var features = [];\r\n if (zoom < minCensusZoom) {\r\n features = await getSimpleGeometry({ tract, year });\r\n } else {\r\n features = await getDetailedGeometry({ scope, tract, fipsList, year }).catch((err) => {\r\n throw err;\r\n });\r\n }\r\n if (features.length && features[0]?.get('STATEFP')) {\r\n features = features.map((f) => {\r\n let fips = f.get('FIPS') || f.get('GEOID') || f.get('STATEFP') + f.get('COUNTYFP');\r\n f.set('FIPS', fips);\r\n f.set('ID', fips);\r\n f.set('COUNTY', f.get('NAME'));\r\n let fstate = statesList.find((st) => {\r\n return st.id + '' === f.get('STATEFP');\r\n });\r\n if (fstate) {\r\n f.set('STATE_NAME', fstate.abbr);\r\n }\r\n return f;\r\n });\r\n } else if (features.length && !features[0].get('FIPS')) {\r\n features = await addCountyFIPSInfo(features, countiesList);\r\n }\r\n return features;\r\n};\r\nconst memoSimpleGeo = {};\r\nconst getSimpleGeometry = async (props) => {\r\n const { tract, year } = props;\r\n if (tract === 'county') {\r\n if (year in memoSimpleGeo) return memoSimpleGeo[year];\r\n const geo = await DS.getGeometryData({ scope: 'national', tract: 'county', year }).then((rez) => convertGeometryToFeatures(rez[0]));\r\n memoSimpleGeo[year] = geo;\r\n return geo;\r\n } else {\r\n // ΔVΔVΔ: dont lookup census, too far zoomed in\r\n return [];\r\n }\r\n};\r\nexport { getSimpleGeometry };\r\n//\r\n\r\nconst getDetailedGeometry = async (props) => {\r\n const { scope, tract, fipsList, year } = props;\r\n var combinedFeatures = [];\r\n const FFips = fipsList?.length || fipsList?.size ? fipsList : [0, 1, 2, 3, 4, 5, 6, 7]; //Fallback if Fips is empty get all results\r\n const promises = [];\r\n for (let fips of FFips) {\r\n let p = ODS.getGeometryData({ scope, tract, year, fips: [fips] }).then((res) => {\r\n res.forEach((rez) => {\r\n const resultFeatures = convertGeometryToFeatures(rez, 'geojson');\r\n combinedFeatures = combinedFeatures.concat(resultFeatures);\r\n });\r\n });\r\n promises.push(p);\r\n }\r\n\r\n await Promise.all(promises);\r\n return combinedFeatures;\r\n};\r\n\r\nconst getVisibleSVI = async (props) => {\r\n const { theme, year, scope, tract, state, fips } = props;\r\n return ODS.getSVIData({ theme, year, scope, state, tract, fips });\r\n};\r\nconst withinScope = (scope, state, fips) => {\r\n //this would make everything true always, needs check if compare is stare\r\n if (scope === 'national') return true;\r\n if (!state) return false; //state scope but no state selected\r\n return state.id + '' == fips.substr(0, 2);\r\n};\r\nconst getSviStyle = (data, theme, county = false, zoom = 5) => {\r\n if (!data) return null;\r\n const themeColorSet = theme.colorScheme;\r\n const low = zoom < 6;\r\n const themeSlug = 'theme' + theme.id;\r\n const sviThemeValue = data[themeSlug] + (low ? '_low' : '') + (county ? '_county' : '');\r\n return themeColorSet[sviThemeValue] || mapStyles.noData;\r\n};\r\nconst stylizeGeometry = (features, scope, theme, state, sviData, county = false, useStyle = false, zoom = 5) => {\r\n features.forEach((shape) => {\r\n const fips = shape.get('FIPS') || shape.get('STATEFP') + shape.get('COUNTYFP');\r\n let sviValues = sviData[fips] ? sviData[fips] : { theme0: false, theme1: false, theme2: false, theme3: false, theme4: false, theme0Num: 0, theme1Num: 0, theme2Num: 0, them30Num: 0, theme4Num: 0 };\r\n shape.set('sviValues', sviValues);\r\n shape.set('hover', false);\r\n //need scope\r\n let inScope = withinScope(scope, state, fips);\r\n\r\n let sviStyle = useStyle ? useStyle : getSviStyle(sviData[fips], theme, county, zoom) || mapStyles.noData;\r\n if (!inScope) {\r\n sviStyle = mapStyles.outOfScope;\r\n }\r\n\r\n if (typeof sviStyle == 'object') shape.setStyle(sviStyle);\r\n });\r\n return features;\r\n};\r\n\r\nexport { addCountyFIPSInfo, getCountyLayerReference, convertGeometryToFeatures, getFipsFromExtent, getVisibleGeometry, getVisibleSVI, stylizeGeometry, countiesFromFips };\r\n","import { statesList, countiesList } from '../model/StaticVariables';\r\nimport { OneMapApiDataService } from '../model/OneMapApiDataService';\r\nimport { DataGrid } from '@material-ui/data-grid';\r\nimport { useState, useContext, useEffect, useCallback, createRef } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport * as LQ from '../controller/LayerQueries';\r\nimport TableGridColumns from '../model/TableColumns';\r\nimport { GridToolbar, GridToolbarColumnsButton, GridToolbarDensitySelector, GridToolbarContainer } from '@material-ui/data-grid';\r\nimport { tableDataMapping } from '../model/DataTransformation';\r\n\r\nconst TableGrid = () => {\r\n const [rows, setRows] = useState([]);\r\n const [columns, setcolumns] = useState([]);\r\n const { scope, tract, theme, usState, year, tab, setTableData, setFipsInView, highlightedFips, setErrorMessage } = useContext(InterfaceContext);\r\n const wrapDiv = createRef();\r\n const [loading, setLoading] = useState(true);\r\n const { showDownloadModal } = useContext(InterfaceContext);\r\n const tableToolbar = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n };\r\n const dataToTable = useCallback(\r\n (data) => {\r\n // ΔVΔVΔ: Map table data input with local column data\r\n const TableColumns = TableGridColumns[year.columns];\r\n const TableGridColumnKeys = Object.keys(TableColumns).map((key) => key.toLowerCase());\r\n const cols = Object.keys(data[0])\r\n .reduce((output, col, i) => {\r\n const slug = col.toLowerCase();\r\n var order = TableGridColumnKeys.indexOf(slug);\r\n if (order === -1) return output;\r\n const columnProps = TableColumns[col] || TableColumns[slug] || TableColumns[col.toUpperCase()]; // || TableColumns[headerName];\r\n const adjCol = Object.assign({ field: col, width: 200, minWidth: 50, cellClassName: columnProps?.class, headerClassName: columnProps?.class }, columnProps, { order });\r\n output.push(adjCol);\r\n return output;\r\n }, [])\r\n .sort((a, b) => {\r\n return a.order - b.order;\r\n });\r\n setcolumns(cols);\r\n if (highlightedFips) {\r\n let findHighlightInd = data.findIndex((d) => d.FIPS === highlightedFips + '');\r\n if (findHighlightInd > 0) {\r\n if (findHighlightInd) {\r\n let a, b, c;\r\n a = data.slice(0, findHighlightInd);\r\n b = data.slice(findHighlightInd, findHighlightInd + 1);\r\n c = data.slice(findHighlightInd + 1);\r\n data = [...b, ...a, ...c];\r\n }\r\n }\r\n }\r\n setRows(data);\r\n },\r\n [LQ, scope, theme, tract, usState, year]\r\n );\r\n const getData = useCallback(async () => {\r\n setLoading(true);\r\n const DS = new OneMapApiDataService();\r\n const useFips = usState?.id ? [usState.id] : false; //countyFips;\r\n if (rows.length === 0) {\r\n var firstPage = await DS.getFirstPageTableData({ scope, tract, theme, usState, year: year.label, fips: useFips })\r\n .then((res) => {\r\n return tableDataMapping(res);\r\n })\r\n .catch((err) => {\r\n setErrorMessage(err.modalMessage, err);\r\n return [];\r\n });\r\n if (firstPage?.length) {\r\n dataToTable(firstPage);\r\n setLoading(false);\r\n }\r\n }\r\n setFipsInView(useFips);\r\n\r\n var data = await DS.getTableData({ scope, tract, theme, usState, year: year.label, fips: useFips })\r\n .then((res) => {\r\n return tableDataMapping(res);\r\n })\r\n .catch((err) => {\r\n setErrorMessage(err.modalMessage, err);\r\n return [];\r\n });\r\n if (data?.length) {\r\n dataToTable(data);\r\n }\r\n document.querySelector('.MuiDataGrid-window')?.setAttribute('tabindex', 0);\r\n setLoading(false);\r\n }, [LQ, scope, theme, tract, usState, year]);\r\n const openDocumentation = () => {\r\n window.open(year.docs + '#page=' + year.varpage);\r\n };\r\n\r\n useEffect(() => {\r\n setTableData(rows);\r\n }, [rows]);\r\n\r\n useEffect(() => {\r\n if (tab.slug !== 'data') return; //don't fetch data if table is nt being viewed\r\n if (!tract) return;\r\n getData();\r\n }, [scope, theme, tract, usState, year, tab]);\r\n return (\r\n
\r\n
\r\n {\r\n openDocumentation();\r\n }}\r\n >\r\n View Data Dictionary\r\n \r\n {\r\n showDownloadModal();\r\n }}\r\n >\r\n Download\r\n \r\n
\r\n `${params.row.FIPS === highlightedFips ? 'highlight' : ''}`} columns={columns} rows={rows} loading={loading} components={{ Toolbar: tableToolbar }} />\r\n
\r\n );\r\n};\r\n\r\nexport default TableGrid;\r\n","import React, { PureComponent } from \"react\";\r\nimport TableGrid from \"./TableGrid\";\r\nexport default class ContentData extends PureComponent {\r\n render() {\r\n return (\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n","import { DATA_URL } from '../model/StaticVariables';\r\n\r\n/* Cross-Browser Import of XML document into a XML Document. */\r\nfunction importXML(xmlfile, callback, arg1, arg2) {\r\n var xhr = new XMLHttpRequest();\r\n // xhr.callback = callback;\r\n xhr.open('GET', xmlfile, true);\r\n\r\n // If specified, responseType must be empty string or \"document\"\r\n xhr.responseType = 'document';\r\n\r\n // overrideMimeType() can be used to force the response to be parsed as XML\r\n xhr.overrideMimeType('text/xml');\r\n\r\n xhr.onload = function () {\r\n if (xhr.readyState === xhr.DONE) {\r\n if (xhr.status === 200) {\r\n // console.log(xhr.response);\r\n callback(xhr.responseXML, arg1, arg2);\r\n }\r\n }\r\n };\r\n\r\n xhr.send(null);\r\n}\r\n\r\nfunction loadpublicationsxml(category, groupName) {\r\n // Load the xml file\r\n var xmlpath = 'xmldata/SVIPublications.xml';\r\n var xmlDoc = importXML(xmlpath, createpublications, category, groupName);\r\n // Get all Elements with Tag name 'Publication'\r\n}\r\nfunction createpublications(xmlDoc, category, groupName) {\r\n var x = xmlDoc.getElementsByTagName('Publication');\r\n // Loop through Publication tag and process it for \"publications\" element\r\n for (let i = 0; i < x.length; i++) {\r\n // Create 'br' tag and then append it to publications element of the page\r\n var rowdiv = document.createElement('div');\r\n rowdiv.className = 'row';\r\n\r\n var spanDiv = document.createElement('div');\r\n\r\n var h2Elem = document.createElement('h4');\r\n\r\n h2Elem.innerText = x[i].getAttribute('Category');\r\n\r\n spanDiv.appendChild(h2Elem);\r\n\r\n // Get all Elements with Tag name 'Group' under current Publication tag\r\n var y = x[i].getElementsByTagName('Group');\r\n for (let j = 0; j < y.length; j++) {\r\n //If the Group's Name attribute is not empty, add a new Paragraph and put the Name text to the paragraph.\r\n // if (y[j].getAttribute('Name') == groupName) {\r\n //9/7/18 uma each group is a panel\r\n\r\n var modDiv = document.createElement('div');\r\n modDiv.className = 'module-typeA tp-collapsible';\r\n //collapse 2nd panel onwards\r\n if (i != 0) modDiv.className += ' tp-collapsible-collapsed';\r\n\r\n var headerElem = document.createElement('h3');\r\n headerElem.className = 'tp-collapsible-header tp-collapsible-toggle tp-noselect';\r\n headerElem.innerHTML = y[j].getAttribute('Name');\r\n\r\n var img1 = document.createElement('img');\r\n img1.className = 'tp-collapsible-icon-expand';\r\n img1.alt = 'expand';\r\n img1.tabindex = '0';\r\n img1.src = '/TemplatePackage/3.0/images/plus12-reverse.png';\r\n var img2 = document.createElement('img');\r\n img2.className = 'tp-collapsible-icon-collapse';\r\n img2.alt = 'collapse';\r\n img2.tabindex = '0';\r\n img2.src = '/TemplatePackage/3.0/images/minus12-reverse.png';\r\n\r\n headerElem.appendChild(img1);\r\n headerElem.appendChild(img2);\r\n\r\n modDiv.appendChild(headerElem);\r\n\r\n var contentDiv = document.createElement('div');\r\n\r\n // Get all Elements with Tag name 'Item' under current Publication tag\r\n var z = y[j].getElementsByTagName('Item');\r\n // Loop through Item tag and process it for \"publications\" element\r\n for (let k = 0; k < z.length; k++) {\r\n var pElem = document.createElement('p');\r\n if (k == 0) {\r\n pElem.className = 'tp-collapsible-content';\r\n }\r\n if (z[k].getElementsByTagName('Authors').length > 0) if (z[k].getElementsByTagName('Authors')[0].childNodes.length > 0) pElem.innerText = z[k].getElementsByTagName('Authors')[0].childNodes[0].nodeValue + ' ';\r\n //var bElem_z = document.createElement('a');\r\n\r\n //var spanbElem = document.createElement('span');\r\n //spanbElem.className = \"cdc-decorated\";\r\n\r\n var aElem = document.createElement('a');\r\n // aElem.className = \"tp-link-policy\";\r\n if (z[k].getElementsByTagName('Link')[0].childNodes.length > 0) {\r\n aElem.setAttribute('href', z[k].getElementsByTagName('Link')[0].childNodes[0].nodeValue);\r\n aElem.setAttribute('target', '_blank');\r\n }\r\n var spanaElem = document.createElement('span');\r\n spanaElem.className = 'tp-label';\r\n //If the Title property of the item is empty, it will be a child item\r\n if (z[k].getElementsByTagName('Title')[0].childNodes.length > 0) {\r\n spanaElem.innerHTML = z[k].getElementsByTagName('Title')[0].childNodes[0].nodeValue + ' ';\r\n } else {\r\n spanaElem.innerHTML = '';\r\n }\r\n\r\n aElem.appendChild(spanaElem);\r\n\r\n if (z[k].getElementsByTagName('ImgAlt')[0].childNodes.length > 0) {\r\n var spanimgElem = document.createElement('span');\r\n spanimgElem.className = 'plugIns';\r\n\r\n var imgElem = document.createElement('img');\r\n imgElem.className = 'plugin';\r\n imgElem.style.border = '0';\r\n //if the ImgAlt is empty, it will be the Parent item\r\n if (z[k].getElementsByTagName('ImgAlt')[0].childNodes.length > 0) {\r\n imgElem.setAttribute('title', z[k].getElementsByTagName('ImgAlt')[0].childNodes[0].nodeValue);\r\n }\r\n //if the ImgAlt is empty, it will be the Parent item\r\n if (z[k].getElementsByTagName('Icon')[0].childNodes.length > 0) {\r\n imgElem.setAttribute('src', z[k].getElementsByTagName('Icon')[0].childNodes[0].nodeValue);\r\n }\r\n //if the ImgAlt is empty, it will be the Parent item\r\n if (z[k].getElementsByTagName('ImgAlt')[0].childNodes.length > 0) {\r\n imgElem.setAttribute('alt', z[k].getElementsByTagName('ImgAlt')[0].childNodes[0].nodeValue);\r\n }\r\n\r\n spanimgElem.appendChild(imgElem);\r\n aElem.appendChild(spanimgElem);\r\n }\r\n\r\n pElem.appendChild(aElem);\r\n if (z[k].getElementsByTagName('LinkText').length > 0)\r\n if (z[k].getElementsByTagName('LinkText')[0].childNodes.length > 0) {\r\n var spnTxt = document.createElement('span');\r\n spnTxt.innerHTML = ' ' + z[k].getElementsByTagName('LinkText')[0].childNodes[0].nodeValue + '';\r\n pElem.appendChild(spnTxt);\r\n }\r\n\r\n contentDiv.appendChild(pElem);\r\n }\r\n modDiv.appendChild(contentDiv);\r\n spanDiv.appendChild(modDiv);\r\n rowdiv.appendChild(spanDiv);\r\n\r\n document.getElementById('publications').appendChild(rowdiv);\r\n }\r\n }\r\n // CDC.Modules.init();\r\n}\r\n\r\nfunction loadcountiesxml() {\r\n if (document.getElementById('State').value == '') {\r\n document.getElementById('County').options.length = 0;\r\n var opt0 = document.createElement('option');\r\n opt0.value = '';\r\n opt0.text = ' -------- Select a state first --------';\r\n document.getElementById('County').options.add(opt0);\r\n } else {\r\n var year = document.getElementById('Year').value;\r\n\r\n var xmlpath = DATA_URL + '/list/' + year + '_counties.xml';\r\n importXML(xmlpath, populateCounties_PreparedMapDDL, null, null);\r\n }\r\n}\r\nexport { loadcountiesxml };\r\nfunction loadcountiesxml_fordownload() {\r\n if (document.getElementById('State').value == '') {\r\n document.getElementById('County').options.length = 0;\r\n var opt0 = document.createElement('option');\r\n opt0.value = '';\r\n opt0.text = ' ------ Select a geography first ------';\r\n document.getElementById('County').options.add(opt0);\r\n } else {\r\n var year = document.getElementById('Year').value;\r\n\r\n populateCountiesDDL(year);\r\n }\r\n}\r\nfunction reloadcountiesxml() {\r\n var year = document.getElementById('Year').value;\r\n\r\n //Enable/Disable the Puerti Rico option\r\n if (year == '2000' || year == '2010') {\r\n document.getElementById('State').options[40].disabled = true;\r\n } else {\r\n document.getElementById('State').options[40].disabled = false;\r\n }\r\n\r\n if (document.getElementById('State').value == '') {\r\n document.getElementById('County').options.length = 0;\r\n var opt0 = document.createElement('option');\r\n opt0.value = '';\r\n opt0.text = ' -------- Select a state first --------';\r\n document.getElementById('County').options.add(opt0);\r\n } else if (document.getElementById('State').value == 'Puerto Rico' && (year == '2000' || year == '2010')) {\r\n document.getElementById('State').value = '';\r\n document.getElementById('County').options.length = 0;\r\n var opt0 = document.createElement('option');\r\n opt0.value = '';\r\n opt0.text = ' -- Select a state first --';\r\n document.getElementById('County').options.add(opt0);\r\n } else {\r\n var xmlpath = DATA_URL + '/list/' + year + '_Counties.xml';\r\n importXML(xmlpath, populateCounties_PreparedMapDDL, null, null);\r\n }\r\n}\r\nexport { reloadcountiesxml };\r\nfunction populateCountiesDDL(year) {\r\n document.getElementById('County').options.length = 0;\r\n var geo = document.getElementById('State').value;\r\n geo = geo.replace(/\\s+/g, '');\r\n if (year == 2000) {\r\n createOption();\r\n } else {\r\n document.getElementById('County').disabled = false;\r\n createUSOptions();\r\n if (document.getElementById('State').value != 'US') {\r\n if (year == 2010) {\r\n document.getElementById('County').options.length = 1;\r\n document.getElementById('County').value = 'Census Tracts';\r\n document.getElementById('County').disabled = true;\r\n }\r\n //else if (year == 2014) {\r\n else {\r\n //2016 now is as same as 2014\r\n //10/17/2018 if tribal tracts is selected, only census tracts is\r\n if (document.getElementById('State').value == 'TRIBAL_TRACTS') {\r\n document.getElementById('County').options.length = 1;\r\n document.getElementById('County').value = 'Census Tracts';\r\n document.getElementById('County').disabled = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n resetFileTypeSelection(year, geo);\r\n}\r\nfunction populateCounties_PreparedMapDDL(xmlDoc, year) {\r\n var x = xmlDoc.getElementsByTagName('State');\r\n\r\n for (let i = 0; i < x.length; i++) {\r\n if (document.getElementById('State').value == x[i].getAttribute('name')) {\r\n var counties = x[i].getElementsByTagName('County');\r\n\r\n document.getElementById('County').options.length = 0;\r\n\r\n var opt1 = document.createElement('option');\r\n opt1.value = '';\r\n opt1.text = ' ----- Select your option -----';\r\n document.getElementById('County').options.add(opt1);\r\n\r\n for (var j = 0; j < counties.length; j++) {\r\n var opt = document.createElement('option');\r\n opt.value = counties[j].firstChild.nodeValue;\r\n opt.text = counties[j].firstChild.nodeValue;\r\n if (counties[j].hasAttribute('name')) opt.setAttribute('data-filename', counties[j].getAttribute('name'));\r\n document.getElementById('County').options.add(opt);\r\n }\r\n console.log('finished populating...');\r\n window.dispatchEvent(new Event('CountyPopulation'));\r\n break;\r\n }\r\n }\r\n}\r\nfunction createOption() {\r\n var opt1 = document.createElement('option');\r\n opt1.value = 'Census Tracts';\r\n opt1.text = 'Census Tracts';\r\n document.getElementById('County').options.add(opt1);\r\n document.getElementById('County').value = 'Census Tracts';\r\n document.getElementById('County').disabled = true;\r\n}\r\n\r\nfunction resetFileTypeSelection(year, geo) {\r\n var doctype = '';\r\n var options = document.getElementsByName('downloadtype');\r\n if (options) {\r\n for (var i = 0; i < options.length; i++) {\r\n if (options[i].checked) {\r\n doctype = options[i].value;\r\n }\r\n }\r\n }\r\n if (doctype === 'data' && (year === '2000' || year === '2010')) {\r\n if (geo === 'US') {\r\n document.getElementById('FileType').disabled = false;\r\n } else if (geo === 'State' || geo === 'States') {\r\n document.getElementById('FileType').value = 'shp'; //set default value\r\n document.getElementById('FileType').disabled = true;\r\n } else {\r\n //a state\r\n document.getElementById('FileType').value = 'csv'; //set default value\r\n document.getElementById('FileType').disabled = true;\r\n }\r\n }\r\n}\r\n\r\nfunction createUSOptions() {\r\n var optionsArr = ['Census Tracts', 'Counties'];\r\n\r\n for (var i = 0; i < optionsArr.length; i++) {\r\n var opt = document.createElement('option');\r\n opt.innerHTML = optionsArr[i];\r\n opt.value = optionsArr[i];\r\n document.getElementById('County').options.add(opt);\r\n }\r\n}\r\nfunction opencountymap() {\r\n if (document.getElementById('State').value == '') {\r\n alert('Please select a state first');\r\n } else if (document.getElementById('County').value == '') {\r\n alert('Please select a county first');\r\n } else {\r\n var mapsize = '';\r\n var fileName = '';\r\n if (document.getElementById('Year').value == '2014' || document.getElementById('Year').value == '2016' || document.getElementById('Year').value == '2018' || document.getElementById('Year').value == '2020') {\r\n var selOption = document.getElementById('County').options[document.getElementById('County').selectedIndex];\r\n fileName = mapsize + document.getElementById('State').value.replace(/\\s+/g, '') + document.getElementById('Year').value + '_' + (selOption.hasAttribute('data-filename') ? selOption.getAttribute('data-filename') + '.pdf' : document.getElementById('County').value + '.pdf');\r\n // fileName = mapsize + document.getElementById('State').value.replace(/\\s+/g, '') +document.getElementById('Year').value + \"_\" + document.getElementById('County').value + \".pdf\";\r\n } else if (document.getElementById('Year').value == '2010') {\r\n var selOption = document.getElementById('County').options[document.getElementById('County').selectedIndex];\r\n fileName = mapsize + document.getElementById('State').value + document.getElementById('Year').value + '_v2_' + (selOption.hasAttribute('data-filename') ? selOption.getAttribute('data-filename') + '.pdf' : document.getElementById('County').value + '.pdf');\r\n } else {\r\n fileName = mapsize + document.getElementById('State').value + document.getElementById('Year').value + '_' + document.getElementById('County').value + '.pdf';\r\n }\r\n var filePath = encodeURI('https://svi.cdc.gov/Documents/CountyMaps/' + document.getElementById('Year').value + '/' + document.getElementById('State').value + '/' + fileName);\r\n window.open(filePath, '_blank');\r\n }\r\n}\r\nexport { opencountymap };\r\n\r\nfunction downloadState2010GeoData() {\r\n var modifiedDate = '03242014';\r\n\r\n if (document.getElementById('State').value == '') {\r\n alert('Please select geography first');\r\n } else if (document.getElementById('State').value == 'All States') {\r\n var fileName = 'SVI2010_States_' + modifiedDate + '.zip';\r\n var filePath = 'https://svi.cdc.gov/Documents/2010_SVI_Data/' + fileName;\r\n window.open(filePath, '_blank');\r\n } else {\r\n var fileName = document.getElementById('State').value + '_' + modifiedDate + '.zip';\r\n var filePath = 'https://svi.cdc.gov/Documents/2010_SVI_Data/States/' + fileName;\r\n window.open(filePath, '_blank');\r\n }\r\n}\r\n\r\nfunction downloadStateShapefile(year) {\r\n if (document.getElementById('State').value == '') {\r\n alert('Please select geography first');\r\n } else {\r\n var optionValue = document.getElementById('State').value;\r\n optionValue = optionValue.replace(/\\s+/g, '');\r\n var fileName = optionValue + '.zip';\r\n var filePath = 'https://svi.cdc.gov/Documents/' + year + '_SVI_Data/States/' + fileName;\r\n window.open(filePath, '_blank');\r\n }\r\n}\r\n\r\nfunction downloadStateCSV(year) {\r\n if (document.getElementById('State').value == '') {\r\n alert('Please select geography first');\r\n } else {\r\n var optionValue = document.getElementById('State').value;\r\n optionValue = optionValue.replace(/\\s+/g, '');\r\n var fileName = optionValue + '.csv';\r\n var filePath = 'https://svi.cdc.gov/Documents/' + year + '_SVI_Data/CSV/States/' + fileName;\r\n window.open(filePath, '_blank');\r\n }\r\n}\r\n\r\nfunction downloadCountyShapefile(year) {\r\n var cntyLabel = year == 2014 ? '_CNTY' : '_COUNTY';\r\n if (document.getElementById('County').value == '') {\r\n alert('Please select geography first');\r\n } else {\r\n var optionValue = document.getElementById('State').value;\r\n optionValue = optionValue.replace(/\\s+/g, '');\r\n var fileName = optionValue + cntyLabel + '.zip';\r\n var filePath = 'https://svi.cdc.gov/Documents/' + year + '_SVI_Data/States_Counties/' + fileName;\r\n window.open(filePath, '_blank');\r\n }\r\n}\r\n\r\nfunction downloadCountyCSV(year) {\r\n var cntyLabel = year == 2014 ? '_CNTY' : '_COUNTY';\r\n if (document.getElementById('County').value == '') {\r\n alert('Please select State first');\r\n } else {\r\n var optionValue = document.getElementById('State').value;\r\n optionValue = optionValue.replace(/\\s+/g, '');\r\n var fileName = optionValue + cntyLabel + '.csv';\r\n var filePath = 'https://svi.cdc.gov/Documents/' + year + '_SVI_Data/CSV/States_Counties/' + fileName;\r\n window.open(filePath, '_blank');\r\n }\r\n}\r\n\r\nfunction validate() {\r\n if (document.zipcodesviMapping.txtzipcode.value == '') {\r\n document.zipcodesviMapping.txtzipcode.focus();\r\n var alertempty = document.getElementById('zipcode');\r\n alertempty.style.visibility = 'visible';\r\n var alertwrongformat = document.getElementById('CustomValidator1');\r\n alertwrongformat.style.visibility = 'hidden';\r\n return false;\r\n }\r\n if (isNaN(document.zipcodesviMapping.txtzipcode.value) || document.zipcodesviMapping.txtzipcode.value.length != 5) {\r\n document.zipcodesviMapping.txtzipcode.focus();\r\n var alertempty = document.getElementById('zipcode');\r\n alertempty.style.visibility = 'hidden';\r\n var alertwrongformat = document.getElementById('CustomValidator1');\r\n alertwrongformat.style.visibility = 'visible';\r\n return false;\r\n }\r\n\r\n var alertempty = document.getElementById('zipcode');\r\n alertempty.style.visibility = 'hidden';\r\n var alertwrongformat = document.getElementById('CustomValidator1');\r\n alertwrongformat.style.visibility = 'hidden';\r\n return true;\r\n}\r\n\r\n//uma's code\r\nfunction loadstatesxml_fordownload() {\r\n var year = document.getElementById('Year').value;\r\n const pathAdjust = DATA_URL + '/';\r\n var xmlpath = pathAdjust + 'data/list/SVI_StatesForDownload.xml';\r\n importXML(xmlpath, populateStatesDDL, year, null);\r\n}\r\nfunction downloadData() {\r\n var year = document.getElementById('Year').value;\r\n var docType = document.querySelector('input[name=\"downloadtype\"]:checked').value;\r\n if (docType == 'doc') downloadDocumentation(year);\r\n else {\r\n if (document.getElementById('State').value == 'NA') {\r\n alert('Please select geography first');\r\n } else {\r\n var geo = document.getElementById('State').value;\r\n geo = geo.replace(/\\s+/g, '');\r\n var fileName, filePath;\r\n if (year == 2000) download2000Data(geo);\r\n else if (year == 2010) download2010Data(geo);\r\n else {\r\n if (geo == 'US') {\r\n if (year == 2016 || year == 2018) downloadUSData('COUNTY', '', year);\r\n else if (year == 2014)\r\n //downloadUSData('CNTY', '03242014',year);\r\n downloadUSData('CNTY', '', year);\r\n } else {\r\n var county = document.getElementById('County').value;\r\n if (county.replace(/\\s+/g, '') == 'Counties') downloadCountyData(year);\r\n else downloadStateData(year);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction downloadUSData(cntyLabel, usLabel, year) {\r\n var fileName, filePath;\r\n var docType = document.getElementById('FileType').value;\r\n docType = docType.replace(/\\s+/g, '');\r\n var geoType = document.getElementById('County').value.replace(/\\s+/g, '');\r\n var label = usLabel != '' ? '_' + usLabel : '';\r\n if (geoType == 'CensusTracts') {\r\n if (docType == 'shp') {\r\n fileName = 'SVI' + year + '_US' + label + '.zip';\r\n filePath = 'https://svi.cdc.gov/Documents/' + year + '_SVI_Data/' + fileName;\r\n } else if (docType == 'csv') {\r\n fileName = 'SVI' + year + '_US.csv';\r\n filePath = 'https://svi.cdc.gov/Documents/' + year + '_SVI_Data/CSV/' + fileName;\r\n }\r\n\r\n window.open(filePath, '_blank');\r\n } else if (geoType == 'Counties') {\r\n if (docType == 'shp') {\r\n fileName = 'SVI' + year + '_US_' + cntyLabel + '.zip';\r\n filePath = 'https://svi.cdc.gov/Documents/' + year + '_SVI_Data/' + fileName;\r\n } else if (docType == 'csv') {\r\n fileName = 'SVI' + year + '_US_' + cntyLabel + '.csv';\r\n filePath = 'https://svi.cdc.gov/Documents/' + year + '_SVI_Data/CSV/' + fileName;\r\n }\r\n\r\n window.open(filePath, '_blank');\r\n }\r\n}\r\nfunction populateStatesDDL(xmlDoc, year) {\r\n var doctype;\r\n var options = document.getElementsByName('downloadtype');\r\n if (options) {\r\n for (var i = 0; i < options.length; i++) {\r\n if (options[i].checked) {\r\n doctype = options[i].value;\r\n }\r\n }\r\n }\r\n if (doctype == 'data') {\r\n //clear state select options\r\n document.getElementById('State').options.length = 0;\r\n var x = xmlDoc.getElementsByTagName('Data');\r\n\r\n for (let i = 0; i < x.length; i++) {\r\n var states = x[i].getElementsByTagName('State');\r\n var opt1 = document.createElement('option');\r\n opt1.value = 'NA';\r\n opt1.text = ' ----- Select your option -----';\r\n document.getElementById('State').options.add(opt1);\r\n\r\n for (var j = 0; j < states.length; j++) {\r\n var opt = document.createElement('option');\r\n opt.value = states[j].getAttribute('value');\r\n opt.text = states[j].firstChild.nodeValue;\r\n if (j == 1 || j == 3)\r\n //1 and 3 are dash lines\r\n opt.disabled = true; //Disbale them\r\n document.getElementById('State').options.add(opt);\r\n }\r\n if (year == 2000) {\r\n //document.getElementById(\"State\").options.length = 2; //get the postion of the 2nd option, which is Puerto Rico\r\n var opt = document.createElement('option');\r\n opt.value = 'State';\r\n opt.text = 'State-specific';\r\n document.getElementById('State').options.add(opt, 5); //Insert State-specific to the position at index is 5\r\n } else if (year == 2010) {\r\n var opt = document.createElement('option');\r\n opt.value = 'States';\r\n opt.text = 'All States';\r\n document.getElementById('State').options.add(opt, 5); //Insert All States to the position at index is 5\r\n }\r\n //else if (year == 2014) {\r\n else {\r\n //2014 and 2016\r\n var options = document.getElementById('State').options;\r\n var index = 48; //Texas just in case\r\n for (let k = 0; k < options.length; k++) {\r\n if (options[k].value === 'Texas') {\r\n index = k; //Find Texas postion\r\n break;\r\n }\r\n }\r\n var opt = document.createElement('option');\r\n opt.value = 'TRIBAL_TRACTS';\r\n opt.text = 'Tribal Tracts';\r\n document.getElementById('State').options.add(opt, index + 1); //Insert Tribal Tracts after Texas\r\n }\r\n }\r\n var xmlpath;\r\n populateCountiesDDL(year);\r\n document.getElementById('FileType').disabled = false;\r\n if (year == 2000) {\r\n document.getElementById('State').options[3].disabled = true; //PR\r\n\r\n document.getElementById('FileType').options[0].innerText = 'ESRI Geodatabase';\r\n document.getElementById('FileType').options[1].disabled = false; //csv disabled\r\n document.getElementById('FileType').value = 'shp'; //set default value\r\n } else if (year == 2010) {\r\n document.getElementById('County').disabled = false; //Geography Type\r\n document.getElementById('State').options[3].disabled = true; //PR\r\n\r\n document.getElementById('FileType').options[0].innerText = 'ESRI Geodatabase';\r\n document.getElementById('FileType').options[1].disabled = false;\r\n document.getElementById('FileType').value = 'shp'; //set default value\r\n } else {\r\n document.getElementById('State').disabled = false;\r\n document.getElementById('State').options[3].disabled = false; //PR\r\n document.getElementById('FileType').options[0].innerText = 'Shapefile';\r\n document.getElementById('FileType').options[1].disabled = false; //csv disabled\r\n }\r\n }\r\n}\r\nfunction downloadStateData(year) {\r\n var docType = document.getElementById('FileType').value;\r\n docType = docType.replace(/\\s+/g, '');\r\n if (docType == 'shp') downloadStateShapefile(year);\r\n else if (docType == 'csv') downloadStateCSV(year);\r\n else if (docType == 'pdf') window.open('https://svi.cdc.gov/Documents/' + year + '_SVI_Data/' + 'SVI' + year + 'Documentation.pdf', '_blank');\r\n}\r\nfunction downloadCountyData(year) {\r\n var docType = document.getElementById('FileType').value;\r\n docType = docType.replace(/\\s+/g, '');\r\n if (docType == 'shp') downloadCountyShapefile(year);\r\n else if (docType == 'csv') downloadCountyCSV(year);\r\n else if (docType == 'pdf') window.open('https://svi.cdc.gov/Documents/' + year + '_SVI_Data/' + 'SVI' + year + 'Documentation.pdf', '_blank');\r\n}\r\nfunction download2000Data(geo) {\r\n var fileName, filePath;\r\n var fileType = document.getElementById('FileType').value;\r\n fileType = fileType.replace(/\\s+/g, '');\r\n if (fileType == 'shp') {\r\n fileName = geo + '_2000_SVI.zip';\r\n filePath = 'https://svi.cdc.gov/Documents/2000_SVI_Data/' + fileName;\r\n window.open(filePath, '_blank');\r\n } else if (fileType == 'csv') {\r\n if (geo == 'US') {\r\n fileName = 'SVI2000_US.csv';\r\n filePath = 'https://svi.cdc.gov/Documents/2000_SVI_Data/CSV/' + fileName;\r\n } else {\r\n var optionValue = document.getElementById('State').value;\r\n optionValue = optionValue.replace(/\\s+/g, '');\r\n fileName = optionValue + '.csv';\r\n filePath = 'https://svi.cdc.gov/Documents/2000_SVI_Data/CSV/States/' + fileName;\r\n }\r\n\r\n window.open(filePath, '_blank');\r\n } else if (fileType == 'pdf') {\r\n window.open('https://svi.cdc.gov/Documents/2000_SVI_Data/SVI2000DataDictionary.pdf', '_blank');\r\n }\r\n}\r\nfunction download2010Data(geo) {\r\n var fileType = document.getElementById('FileType').value;\r\n fileType = fileType.replace(/\\s+/g, '');\r\n var fileName, filePath;\r\n if (fileType == 'shp') {\r\n if (geo == 'US') {\r\n var cntyOpt = document.getElementById('County').value;\r\n cntyOpt = cntyOpt.replace(/\\s+/g, '');\r\n if (cntyOpt == 'CensusTracts') filePath = 'https://svi.cdc.gov/Documents/2010_SVI_Data/SVI2010_US_03242014.zip';\r\n else if (cntyOpt == 'Counties') filePath = 'https://svi.cdc.gov/Documents/2010_SVI_Data/SVI2010_Counties.zip';\r\n window.open(filePath, '_blank');\r\n } else if (geo == 'States') {\r\n window.open('https://svi.cdc.gov/Documents/2010_SVI_Data/SVI2010_States_03242014.zip', '_blank');\r\n } else downloadState2010GeoData();\r\n } else if (fileType == 'csv') {\r\n if (geo == 'US') {\r\n fileName = 'SVI2010_US.csv';\r\n filePath = 'https://svi.cdc.gov/Documents/2010_SVI_Data/CSV/' + fileName;\r\n } else {\r\n var optionValue = document.getElementById('State').value;\r\n optionValue = optionValue.replace(/\\s+/g, '');\r\n fileName = optionValue + '.csv';\r\n filePath = 'https://svi.cdc.gov/Documents/2010_SVI_Data/CSV/States/' + fileName;\r\n }\r\n\r\n window.open(filePath, '_blank');\r\n }\r\n}\r\nfunction radioClicked() {\r\n var doctype;\r\n var options = document.getElementsByName('downloadtype');\r\n if (options) {\r\n for (var i = 0; i < options.length; i++) {\r\n if (options[i].checked) {\r\n doctype = options[i].value;\r\n }\r\n }\r\n }\r\n if (doctype == 'doc') {\r\n addRemoveDocType(true);\r\n // if (document.getElementById(\"datapanel\") != undefined)\r\n document.getElementById('datapanel').style.display = 'none';\r\n //document.getElementById('FileType').options.length = 1;\r\n document.getElementById('FileType').value = 'pdf';\r\n document.getElementById('FileType').disabled = true;\r\n } else {\r\n loadstatesxml_fordownload();\r\n addRemoveDocType(false);\r\n document.getElementById('datapanel').style.display = 'block';\r\n //document.getElementById('FileType').options.length = 3;\r\n document.getElementById('FileType').value = 'shp';\r\n document.getElementById('FileType').disabled = false;\r\n }\r\n}\r\n\r\n// Added on 14Sept2020, Kiran Batchu\r\nfunction loadDataDownloads() {\r\n loadstatesxml_fordownload();\r\n addRemoveDocType(false);\r\n document.getElementById('datapanel').style.display = 'block';\r\n //document.getElementById('FileType').options.length = 3;\r\n document.getElementById('FileType').value = 'shp';\r\n document.getElementById('FileType').disabled = false;\r\n}\r\n\r\nfunction addRemoveDocType(doAdd) {\r\n var optExists = false;\r\n if (doAdd) {\r\n for (let i = 0; i < document.getElementById('FileType').length; ++i) {\r\n if (document.getElementById('FileType').options[i].value == 'pdf') {\r\n optExists = true;\r\n }\r\n }\r\n if (!optExists) {\r\n var opt1 = document.createElement('option');\r\n opt1.value = 'pdf';\r\n opt1.text = ' PDF';\r\n document.getElementById('FileType').options.add(opt1, 0);\r\n }\r\n } else document.getElementById('FileType').remove(0);\r\n}\r\nfunction downloadDocumentation(year) {\r\n var fileName = 'SVI' + year + 'Documentation-508.pdf'; // KB,17Jul2020\r\n var filePath = 'https://svi.cdc.gov/Documents/' + year + '_SVI_Data/' + fileName;\r\n window.open(filePath, '_blank');\r\n}\r\nfunction geotypeChanged() {\r\n var year = document.getElementById('Year').value;\r\n //if (year == 2014) {\r\n if (year == 2014 || year == 2016 || year == 2018) {\r\n var options = document.getElementById('State').options;\r\n var ttindex = 49; //TRIBAL_TRACTS just in case\r\n for (var i = 0; i < options.length; i++) {\r\n if (options[i].value === 'TRIBAL_TRACTS') {\r\n ttindex = i;\r\n break;\r\n }\r\n }\r\n if (document.getElementById('County').value == 'Counties') document.getElementById('State').options[ttindex].disabled = true;\r\n else document.getElementById('State').options[ttindex].disabled = false;\r\n } else if (year == 2010) {\r\n if (document.getElementById('County').value == 'Counties') {\r\n document.getElementById('FileType').value = 'shp'; //set default value\r\n document.getElementById('FileType').disabled = true;\r\n } else {\r\n document.getElementById('FileType').disabled = false;\r\n }\r\n }\r\n}\r\n","import { useContext, useEffect, useState } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { reloadcountiesxml, loadcountiesxml, opencountymap } from '../controller/PreparedCountyMapController';\r\n\r\nconst PreparedMaps = () => {\r\n const { year, preparedMapState, preparedMapCounty } = useContext(InterfaceContext);\r\n const [usstate, setUSstate] = useState(preparedMapState);\r\n const [county, setCounty] = useState(preparedMapCounty);\r\n const [localYear, setLocalYear] = useState(year);\r\n\r\n const onStateChange = (e) => {\r\n loadcountiesxml();\r\n setUSstate(e.target.value);\r\n };\r\n const onSetCounty = (e) => {\r\n setCounty(e.target.value);\r\n };\r\n const onChangeYear = (e) => {\r\n setLocalYear(e.target.value);\r\n reloadcountiesxml();\r\n };\r\n\r\n useEffect(() => {\r\n window.addEventListener('CountyPopulation', updateCountyValue);\r\n return () => {\r\n window.removeEventListener('CountyPopulation', updateCountyValue);\r\n };\r\n }, []);\r\n const updateCountyValue = () => {\r\n if (preparedMapCounty) {\r\n setCounty(preparedMapCounty);\r\n document.querySelector('#County').value = preparedMapCounty;\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n loadcountiesxml();\r\n setUSstate(preparedMapState);\r\n setCounty(preparedMapCounty);\r\n }, [preparedMapState]);\r\n\r\n return (\r\n <>\r\n
\r\n

Select from the dropdown menus below to view the prepared county map.

\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n {/*

\r\n \r\n * Printing Tips\r\n \r\n

\r\n

\r\n PDF display not loading? Download the most recent version of\r\n Adobe Reader here: \"\r\n \r\n http://get.adobe.com/reader/\r\n \r\n

*/}\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default PreparedMaps;\r\n","import React from 'react';\r\nimport { staticYearList } from '../model/StaticVariables';\r\nimport PreparedMaps from './PreparedMaps';\r\n\r\nconst ContentInformation = () => {\r\n const yrs = staticYearList.slice(0, staticYearList.length - 1);\r\n const yrStr = yrs.map((y) => y.label).join(', ');\r\n return (\r\n
\r\n
\r\n

\r\n SVI Interactive Map
\r\n Help Documentation\r\n

\r\n\r\n

\r\n Our suggested citation for use of the SVI Interactive Map:\r\n

\r\n
\r\n Centers for Disease Control and Prevention/Agency for Toxic Substances and Disease Registry/Geospatial Research, Analysis, and Services Program. CDC/ATSDR Social Vulnerability Index Interactive Map [Insert {yrStr}, or 2000] Database [Insert US or State]. [url of the interactive map]. Accessed on [Insert date].\r\n
\r\n\r\n

Additional Resources

\r\n

\r\n Visit these links to learn more about the CDC/ATSDR Social Vulnerability Index:\r\n

\r\n \r\n \r\n

Prepared County Maps

\r\n
\r\n \r\n

\r\n For more information, please contact the SVI Coordinator at\r\n \r\n svi_coordinator@cdc.gov\r\n \r\n .\r\n

\r\n
\r\n
\r\n );\r\n};\r\nexport default ContentInformation;\r\n","import React, { useContext } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport TEXTS from '../controller/TextVariables';\r\n\r\nexport default function Legend() {\r\n const { theme, scope } = useContext(InterfaceContext);\r\n const { legend } = TEXTS;\r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n}\r\n","import { useReducer, createContext } from 'react';\r\nexport const FeatureContext = createContext();\r\n\r\n//ΔVΔVΔ: Context Variables\r\nconst state_init = {\r\n pinnedFeature: null,\r\n hoveredFeature: null,\r\n modalIsPinned: false\r\n};\r\n// ΔVΔVΔ: Context Methods\r\nconst uiActions = (state, dispatch) => {\r\n return {\r\n setPinnedFeature: (feature) => dispatch({ type: 'setPinnedFeature', feature }),\r\n updateHoveredFeature: (feature, pixel) => dispatch({ type: 'updateHoveredFeature', feature, pixel }),\r\n pinWindow: (value) => dispatch({ type: 'pinWindow', value })\r\n };\r\n};\r\n// ΔVΔVΔ: Context State Transformation\r\nfunction featureReducer(state, action) {\r\n switch (action.type) {\r\n case 'setPinnedFeature':\r\n return { ...state, pinnedFeature: action.feature };\r\n case 'updateHoveredFeature':\r\n return { ...state, hoveredFeature: action.feature };\r\n case 'pinWindow':\r\n return { ...state, modalIsPinned: action.value };\r\n default:\r\n return state;\r\n }\r\n}\r\n\r\nconst FeatureProvider = ({ children }) => {\r\n const [state, dispatch] = useReducer(featureReducer, state_init);\r\n const value = {\r\n ...state,\r\n ...uiActions(state, dispatch)\r\n };\r\n return {children};\r\n};\r\nexport { FeatureProvider };\r\n","import { useState, useEffect } from 'react';\r\nimport _uniqueId from 'lodash/uniqueId';\r\n\r\nconst Modal = ({ id = 0, visible, children, delay = 2000, title, pixelCoords, onClose, pinned, divWindow = false }) => {\r\n const [on, setOn] = useState(false);\r\n const [modalID] = useState(_uniqueId('modal-'));\r\n\r\n const hideBox = () => setOn(pinned);\r\n const closeWindow = () => {\r\n setOn(false);\r\n if (onClose) onClose();\r\n };\r\n var time = false;\r\n\r\n //When content added\r\n useEffect(() => {\r\n if (!delay) {\r\n setOn(true);\r\n return;\r\n }\r\n clearTimeout(time);\r\n if (!pinned) return;\r\n setTimeout(() => {\r\n setOn(true); //turn on animation\r\n time = setTimeout(hideBox, delay);\r\n }, 10);\r\n return () => {\r\n clearTimeout(time);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n setOn(visible); //turn on animation\r\n if (!delay) return;\r\n clearTimeout(time);\r\n if (!pinned) return;\r\n time = setTimeout(hideBox, delay);\r\n return () => {\r\n clearTimeout(time);\r\n };\r\n }, [children, visible]);\r\n\r\n //ΔVΔVΔ: Temprary needed for Feature title, positioning thrown off by changing div to dialog\r\n if (divWindow) {\r\n return (\r\n <>\r\n
\r\n {pinned &&
}\r\n {title &&

{title}

}\r\n {/* {!title &&
} */}\r\n
{children}
\r\n
\r\n \r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {pinned &&
}\r\n {title &&

{title}

}\r\n {!title &&
}\r\n
{children}
\r\n
\r\n \r\n );\r\n};\r\nexport default Modal;\r\n\r\nconst ModalBackground = (props) => {\r\n const { visible } = props;\r\n return
;\r\n};\r\nexport { ModalBackground };\r\n","import { useEffect, useState, useRef } from 'react';\r\nimport { useMousePosition } from '../controller/useMousePosition';\r\n\r\n//ΔVΔVΔ: Wrapper component for dragging and positioning\r\nconst DragContainer = (props) => {\r\n const { className, pose = { x: 0, y: 0 }, offset = { x: 0, y: 0 }, children, dragging = true, onMove = () => {}, verbose = false, updateWhenScrolled = false } = props;\r\n const dragRef = useRef();\r\n const mousePosition = useMousePosition();\r\n const [containerPose, setContainerPose] = useState(() => pose);\r\n const [winScrollY, setWinScrollY] = useState(0);\r\n\r\n const calculateBounds = () => {\r\n const outerRect = dragRef.current.getBoundingClientRect();\r\n const contentRect = dragRef.current.querySelector('.drag-container').getBoundingClientRect();\r\n const minX = outerRect.x;\r\n const minY = outerRect.y;\r\n const maxX = outerRect.right - contentRect.width;\r\n const maxY = outerRect.bottom - contentRect.height;\r\n\r\n return { minX, minY, maxX, maxY };\r\n };\r\n useEffect(() => {\r\n window.addEventListener('scroll', () => {\r\n setWinScrollY(Math.floor(window.scrollY));\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (updateWhenScrolled) {\r\n const coords = Object.assign({}, containerPose);\r\n const adjustedCoords = calculateCoords(coords, false);\r\n const nextCoords = { x: coords.x, y: adjustedCoords.y };\r\n if (className === 'download-window') console.log('&&& scroll updated: ', winScrollY, 'coords', nextCoords);\r\n setContainerPose(adjustedCoords);\r\n }\r\n }, [winScrollY]);\r\n\r\n const calculateCoords = ({ x, y }, useOffset = true) => {\r\n const bounds = calculateBounds();\r\n const coords = { x: x || 0, y: y || 0 };\r\n if (useOffset) {\r\n coords.x += offset.x;\r\n coords.y += offset.y;\r\n }\r\n\r\n coords.x = Math.max(coords.x, bounds.minX); //dont' drag too far left\r\n coords.y = Math.max(coords.y, bounds.minY); //don't drag too far up\r\n\r\n coords.x = Math.min(coords.x, bounds.maxX); //don't drag too far right\r\n coords.y = Math.min(coords.y, bounds.maxY); //don't drag too far down\r\n return coords;\r\n };\r\n useEffect(() => {\r\n var calcCoords = calculateCoords(pose);\r\n setContainerPose(calcCoords);\r\n }, [JSON.stringify(pose)]);\r\n\r\n useEffect(() => {\r\n if (dragging) {\r\n const coords = calculateCoords(mousePosition);\r\n setContainerPose(coords);\r\n onMove(coords, dragRef.current.getBoundingClientRect());\r\n }\r\n }, [JSON.stringify(mousePosition)]);\r\n\r\n return (\r\n
\r\n
\r\n {children}\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DragContainer;\r\n","import { useEffect, useState } from 'react';\r\n\r\nexport const useMousePosition = () => {\r\n const [mousePosition, setMousePosition] = useState({ x: null, y: null });\r\n useEffect(() => {\r\n const updateMousePosition = (ev) => {\r\n setMousePosition({ x: ev.clientX, y: ev.clientY });\r\n };\r\n window.addEventListener('mousemove', updateMousePosition);\r\n return () => {\r\n window.removeEventListener('mousemove', updateMousePosition);\r\n };\r\n }, []);\r\n return mousePosition;\r\n};\r\n","import { useEffect, useState } from 'react';\r\n\r\nexport const useMouseDown = () => {\r\n const [mousePosition, setMousePosition] = useState({ x: null, y: null });\r\n useEffect(() => {\r\n const updateMousePosition = (ev) => {\r\n setMousePosition({ x: ev.clientX, y: ev.clientY });\r\n };\r\n window.addEventListener('mousedown', updateMousePosition);\r\n return () => {\r\n window.removeEventListener('mousedown', updateMousePosition);\r\n };\r\n }, []);\r\n return mousePosition;\r\n};\r\n","/** Detetmine if the supplied element is a valid Dom Element */\r\nfunction isPositionalElement(element) {\r\n if (!element) return false;\r\n return element instanceof Element || element instanceof HTMLDocument;\r\n}\r\n/** Convert DomRect to cloned primative object */\r\nconst domRectToObject = (element) => {\r\n const { top, right, bottom, left, width, height, x, y } = element.getBoundingClientRect();\r\n return { top, right, bottom, left, width, height, x, y };\r\n};\r\n\r\nconst getRelativeBoundingClientRect = (domElement, refereceDomElement) => {\r\n const rect = domRectToObject(domElement); //Object.assign({}, ...domElement.getBoundingClientRect());\r\n const refRec = domRectToObject(refereceDomElement);\r\n rect.x = rect.x - refRec.x;\r\n rect.y = rect.y - refRec.y;\r\n return rect;\r\n};\r\n\r\n/** Point is within specified rectanlge\r\n * x,y are mouse point coordinates\r\n * rect is and objec with x,y,width,height values, the easiest way is to use the result of getBoundingClientRect on a dom element\r\n * padding: allows the collision to return true when outside the rect but within entra distance around the rect\r\n */\r\nconst pointWithinRectangle = (x, y, rect, padding = 0) => {\r\n // console.log(':x', x, rect.x, rect.width, '::', x >= rect.x - padding && x <= rect.x + rect.width + padding);\r\n let withinX = x >= rect.x - padding && x <= rect.x + rect.width + padding;\r\n let withinY = y >= rect.y - padding && y <= rect.y + rect.height + padding;\r\n return withinX && withinY;\r\n};\r\nexport { pointWithinRectangle };\r\n\r\n/** Point specified is within a domElement's bounding rectangle\r\n * same as pointWithinRectangle but with domElement validation\r\n */\r\nconst pointWithinDomElement = (x, y, domElement, padding = 0, referenceDomElement = null) => {\r\n if (!isPositionalElement(domElement)) return false;\r\n const rect = referenceDomElement ? getRelativeBoundingClientRect(domElement, referenceDomElement) : domElement.getBoundingClientRect();\r\n // console.log(referenceDomElement, getRelativeBoundingClientRect(domElement, referenceDomElement), domElement.getBoundingClientRect());\r\n return pointWithinRectangle(x, y, rect, padding);\r\n};\r\nexport { pointWithinDomElement };\r\n","import { useContext, useEffect, useState, useRef, dangerouslySetInnerHTML } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { FeatureContext } from '../model/FeatureProvider';\r\nimport Modal from './Modal';\r\nimport { tabList } from '../model/StaticVariables';\r\nimport DragContainer from './DragContainer';\r\nimport { useMouseDown } from '../controller/useMouseDown';\r\nimport { getStateName, getCountyName } from '../model/StaticVariables';\r\nimport { pointWithinDomElement } from '../controller/CollisionDetection';\r\n\r\n//ΔVΔVΔ: Deselect any text selected by user cursor\r\nconst clearSelection = () => {\r\n if (window.getSelection) {\r\n window.getSelection().removeAllRanges();\r\n } else if (document.selection) {\r\n document.selection.empty();\r\n }\r\n};\r\nconst POIFeatureModalContent = (props) => {\r\n const { feature } = props;\r\n if (!feature || !feature.get('info')) return null;\r\n\r\n const {\r\n data,\r\n info: { label },\r\n count\r\n } = feature.values_;\r\n\r\n const poiListItem = (data) => {\r\n const { NAME, ADDRESS, ZIP, CITY, STATE } = data;\r\n return (\r\n

\r\n {NAME} \r\n
\r\n {ADDRESS}\r\n
\r\n {CITY} {STATE}, {ZIP}\r\n

\r\n );\r\n };\r\n\r\n return (\r\n
\r\n

\r\n {label} ({count})\r\n

\r\n
\r\n
\r\n {data.map((poi, i) => {\r\n return poiListItem(poi);\r\n })}\r\n
\r\n
\r\n );\r\n};\r\n//**if scope state, year changes and it's svi remove window\r\nconst SVIFeatureModalContent = (props) => {\r\n const { feature } = props;\r\n const { theme, year, setSelectedTab, setHighlightedFips, scope, setPreparedMapChoice } = useContext(InterfaceContext);\r\n const vulnerability_txt = {\r\n //none low med high top\r\n top: 'high',\r\n high: 'medium to high',\r\n med: 'low to medium',\r\n low: 'low',\r\n none: 'none'\r\n };\r\n\r\n if (!feature || !feature.get('FIPS')) return null;\r\n\r\n const gotoTableFips = () => {\r\n setSelectedTab(tabList[1]);\r\n setHighlightedFips(feature.get('FIPS'));\r\n };\r\n\r\n const goToPreparedMap = async (e) => {\r\n e.preventDefault();\r\n const fips = feature.get('FIPS');\r\n\r\n const county = getCountyName(fips)\r\n .replace(/county/gi, '')\r\n .trim();\r\n const usstate = getStateName(fips);\r\n\r\n setPreparedMapChoice({ usstate, county });\r\n setTimeout(() => {\r\n var link = document.querySelector('[name=preparedcountymaps]');\r\n var y = link.getBoundingClientRect().y;\r\n document.body.scrollTop = y;\r\n window.scroll({\r\n top: y,\r\n behavior: 'smooth'\r\n });\r\n }, 300);\r\n };\r\n const fips = feature.get('FIPS');\r\n const countyName = getCountyName(fips);\r\n const stateName = getStateName(fips);\r\n const geolevel = String(fips).length === 5 ? 'county' : 'census';\r\n\r\n const allvals = feature.get('sviValues') || '';\r\n const sviValNum = allvals['theme' + theme.id + 'Num'];\r\n const sviValSlug = allvals['theme' + theme.id];\r\n const vulnerableText = vulnerability_txt[sviValSlug];\r\n const scopetext = scope === 'national' ? 'National' : 'Statewide';\r\n\r\n //Does the modal update when theme changes?=ye\r\n return (\r\n
\r\n

\r\n {geolevel === 'census' && (\r\n <>\r\n Census Tract {fips}, \r\n
\r\n \r\n )}\r\n , {stateName}\r\n

\r\n
\r\n {sviValNum === -999 &&

Data unavailable from the Census to calculate this variable.

}\r\n {sviValNum !== -999 && (\r\n <>\r\n

\r\n {year.label} {scopetext} {theme.label} Score:\r\n

\r\n

\r\n {sviValNum}\r\n

\r\n

Possible scores range from 0 (lowest vulnerability) to 1 (highest vulnerability).

\r\n

\r\n A score of {sviValNum} indicates a {vulnerableText} level of vulnerability.\r\n

\r\n \r\n View Prepared County Map\r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nconst FeatureModal = (props) => {\r\n const { visible, feature, onClose } = props;\r\n const [type, setType] = useState('county');\r\n\r\n const getFeatureSlug = (feature) => {\r\n if (feature.get('poi')) {\r\n return feature.values_.info?.slug || 'poi';\r\n } else {\r\n const fipsNum = feature.get('FIPS');\r\n return fipsNum.length > 5 ? 'census' : 'county';\r\n }\r\n };\r\n\r\n useEffect(async () => {\r\n if (!feature) return;\r\n setType(getFeatureSlug(feature));\r\n }, [feature]);\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\nexport { FeatureModal };\r\n\r\nconst HoveredFeatureModal = () => {\r\n const { modalIsPinned, pinWindow, pinnedFeature } = useContext(FeatureContext);\r\n const { year, scope, usState, tract } = useContext(InterfaceContext);\r\n const windowRef = useRef();\r\n const isOpen = useRef(false);\r\n const lastClick = useMouseDown();\r\n const [isDragging, setIsDragging] = useState(false);\r\n const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });\r\n\r\n const closeThisWindow = () => {\r\n pinWindow(false);\r\n isOpen.current = false;\r\n setIsDragging(false);\r\n };\r\n\r\n const mouseup = (e) => {\r\n setDragOffset({ x: 0, y: 0 });\r\n setIsDragging(false);\r\n };\r\n\r\n const getLastClickOffset = () => {\r\n const dragBarRect = windowRef.current.querySelector('.drag-bar').getBoundingClientRect();\r\n return { x: dragBarRect.x - lastClick.x, y: dragBarRect.y - lastClick.y };\r\n };\r\n\r\n useEffect(() => {\r\n if (!modalIsPinned) return;\r\n if (!lastClick.x || !windowRef.current) return;\r\n const dragbarClicked = pointWithinDomElement(lastClick.x, lastClick.y, windowRef.current.querySelector('.drag-bar'));\r\n setDragOffset(getLastClickOffset());\r\n setIsDragging(dragbarClicked);\r\n }, [lastClick]);\r\n\r\n useEffect(() => {\r\n if (isDragging) clearSelection();\r\n }, [isDragging]);\r\n\r\n useEffect(() => {\r\n if (!pinnedFeature) {\r\n closeThisWindow();\r\n return;\r\n } else if (!isOpen.current) {\r\n isOpen.current = true;\r\n setDragOffset(lastClick);\r\n }\r\n }, [pinnedFeature]);\r\n\r\n useEffect(() => {\r\n closeThisWindow();\r\n }, [year, scope, usState, tract]);\r\n\r\n useEffect(() => {\r\n document.addEventListener('mouseup', mouseup);\r\n return () => {\r\n document.removeEventListener('mouseup', mouseup);\r\n };\r\n }, []);\r\n if (!modalIsPinned) return null;\r\n return (\r\n <>\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\nexport { HoveredFeatureModal };\r\n","import { useContext, useEffect, useState, useRef, useCallback, dangerouslySetInnerHTML } from 'react';\r\nimport { FeatureContext } from '../model/FeatureProvider';\r\nimport { getStateName, getCountyName } from '../model/StaticVariables';\r\nimport DragContainer from './DragContainer';\r\n\r\nconst SVItitle = (props) => {\r\n const { feature } = props;\r\n if (!feature || !feature.get('FIPS')) return null;\r\n const fips = feature.get('FIPS');\r\n const geolevel = String(fips).length === 5 ? 'county' : 'census';\r\n const countyName = getCountyName(fips);\r\n const stateName = getStateName(fips);\r\n /*note county json has special characters which is why we are using dangerouslysetinnerhtml*/\r\n\r\n return (\r\n <>\r\n
\r\n <>\r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nconst POItitle = (props) => {\r\n const { feature } = props;\r\n if (!feature || !feature.get('info')) return null;\r\n const slug = feature.get('info').slug;\r\n const label = feature.get('info').label;\r\n const count = feature.get('count');\r\n /*note county json has special characters which is why we are using dangerouslysetinnerhtml*/\r\n\r\n return (\r\n <>\r\n {count < 11 && }\r\n
\r\n <>\r\n \r\n \r\n
\r\n \r\n );\r\n};\r\nconst DragArrow = (props) => {\r\n const { feature } = props;\r\n if (!feature) return null;\r\n const type = feature.get('FIPS') ? 'svi' : 'poi';\r\n var slug = '';\r\n if (type === 'svi') {\r\n slug = String(feature.get('FIPS')).length === 5 ? 'county' : 'census';\r\n } else {\r\n slug = feature.get('info').slug;\r\n }\r\n return
;\r\n};\r\n\r\nconst HoveredFeatureTitle = () => {\r\n const { hoveredFeature } = useContext(FeatureContext);\r\n const [offsetLeft, setOffsetLeft] = useState(0);\r\n const titleRef = useRef();\r\n const margin = 20; //allows bubble to to left or right outside bounds\r\n const [flip, setFlip] = useState(false);\r\n\r\n const handleMove = (coords, bounds) => {\r\n var titleBounds = titleRef.current.getBoundingClientRect();\r\n if (titleBounds.width) {\r\n const leftEdge = Math.floor(coords.x + margin - titleBounds.width / 2);\r\n const rightEdge = Math.floor(coords.x - margin + titleBounds.width / 2);\r\n const leftDiff = Math.max(0, bounds.x - leftEdge); //0 or more\r\n const rightDiff = Math.min(0, bounds.right - rightEdge); //0 or less\r\n setOffsetLeft(leftDiff || rightDiff);\r\n } else {\r\n setOffsetLeft(0);\r\n }\r\n const halfwayDown = coords.y > bounds.height / 2 + bounds.y; //halfway point of viewport\r\n setFlip(halfwayDown);\r\n };\r\n\r\n return (\r\n <>\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\nexport { HoveredFeatureTitle };\r\n\r\n// const FeatureTitle = (props) => {\r\n// const { theme, tract } = useContext(InterfaceContext);\r\n// const { id, visible, feature, pixelCoords, onClose } = props;\r\n// const [statename, setStateName] = useState('');\r\n// const [countyname, setCountyName] = useState('');\r\n// const [fips, setFips] = useState('');\r\n\r\n// const getFeatureFips = () => {\r\n// if (!feature) return '';\r\n// return feature.get('FIPS') || '';\r\n// };\r\n// const getFullStateName = () => {\r\n// if (!fips) return '';\r\n// let stateFips = String(fips).substring(0, 2);\r\n// return statesList.find((st) => {\r\n// return st.id + '' === stateFips;\r\n// }).label;\r\n// };\r\n// const getCountyName = async () => {\r\n// if (!fips) return;\r\n// let countFips = String(fips).substring(0, 5);\r\n// const counties = countiesList;\r\n// return (\r\n// counties.find((cnt) => {\r\n// return cnt.cc + '' == countFips || cnt.CC + '' == countFips;\r\n// })?.CN || ''\r\n// );\r\n// };\r\n\r\n// useEffect(async () => {\r\n// if (!feature) return;\r\n// let fipsNum = getFeatureFips(feature);\r\n// setFips(fipsNum);\r\n// }, [feature, visible, theme]);\r\n\r\n// useEffect(async () => {\r\n// if (!fips) return;\r\n\r\n// let stateNM = getFullStateName();\r\n// let countyNM = await getCountyName();\r\n\r\n// setStateName(stateNM);\r\n// setCountyName(countyNM);\r\n// }, [fips]);\r\n\r\n// var modalCoords = [pixelCoords[0], pixelCoords[1]];\r\n// var arrowX = pixelCoords[2];\r\n// var flip = pixelCoords[3] ? 'flip' : '';\r\n// const censusTitle = useCallback(() => {\r\n// if (tract !== 'census') return;\r\n// return (\r\n// <>\r\n// \r\n// {tract === 'census' ? 'Census Tract' : 'County'} {fips},\r\n// \r\n// \r\n// );\r\n// }, [tract, fips]);\r\n\r\n// return (\r\n// <>\r\n//
\r\n// {feature && feature?.get('data')?.length < 11 && }\r\n// \r\n// {(feature && feature.get('poi') && (\r\n// <>\r\n// \r\n// \r\n// \r\n// \r\n// \r\n// )) || (\r\n// <>\r\n// 5 ? 'census' : 'county'} ${flip}`} style={{ left: arrowX, display: visible ? 'block' : 'none' }}>\r\n// \r\n// \r\n// \r\n// \r\n// )}\r\n// \r\n//
\r\n// \r\n// );\r\n// };\r\n// export { FeatureTitle };\r\n\r\n// const Backup_HoveredFeatureTitle = () => {\r\n// const { scope, usState, selectedFeatureIsPinned: pinned } = useContext(InterfaceContext);\r\n// const { hoveredFeature } = useContext(InterfaceContext);\r\n// //@@ __for testing__\r\n// // const [visible, setVisible] = useState(false);\r\n// var visible = true;\r\n// var setVisible = () => {};\r\n// //@@ __\r\n// const [localCoods, setLocalCoords] = useState([0, 0, 0]);\r\n// const [localFeature, setLocalFeature] = useState(false);\r\n// const featureRef = useRef();\r\n\r\n// const mousemove = (e) => {\r\n// if (!document) return;\r\n// const tabContent = document.querySelector('#tab-content');\r\n// const bounds = tabContent?.getBoundingClientRect();\r\n// if (!bounds) return;\r\n// const mouseOverMap = e.target.closest('#tab-content');\r\n// if (!mouseOverMap) return;\r\n// let mousex = e.pageX;\r\n// let mousey = e.pageY;\r\n// let mapx = bounds.x + window.scrollX;\r\n// let mapy = bounds.y + window.scrollY;\r\n// let relativex = Math.floor(mousex - mapx);\r\n// let relativey = Math.floor(mousey - mapy);\r\n// poseWindow([relativex, relativey]);\r\n// };\r\n\r\n// useEffect(() => {\r\n// setLocalFeature(hoveredFeature);\r\n// }, [hoveredFeature, scope]);\r\n\r\n// const validateFeature = (feature) => {\r\n// if (!feature) return false;\r\n// const fips = feature?.get('FIPS') || '';\r\n// if (feature.get('poi')) return true;\r\n// if (scope === 'state' && usState?.id !== fips?.substring(0, 2)) {\r\n// return false;\r\n// }\r\n// return true;\r\n// };\r\n\r\n// const getMaxDraggingBounds = (m = 0) => {\r\n// if (!featureRef.current) return;\r\n// const tabContent = document.querySelector('#tab-content');\r\n// const modal = featureRef.current.querySelector('.modal-win');\r\n// let h = tabContent.offsetHeight; //for reference\r\n// let b = tabContent.offsetHeight - modal.offsetHeight; //largest(down) y value possible without getting cropped\r\n\r\n// let w = tabContent.offsetWidth;\r\n// let r = tabContent.offsetWidth - modal.offsetWidth;\r\n\r\n// let t = 0; //minimum y value without getting cropped\r\n// let l = 0;\r\n\r\n// return { top: t + m, left: l + m, right: r - m, bottom: b - m };\r\n// };\r\n// const poseWindow = (pixelCoords) => {\r\n// const margin = 10;\r\n// // const tabContent = document.querySelector('#tab-content');\r\n// const modal = featureRef.current.querySelector('.modal-win');\r\n// let arrow = featureRef.current.querySelector('.modal-win .inner');\r\n// let button = modal.querySelector('button');\r\n// var boundary = getMaxDraggingBounds(margin);\r\n// let yhalfway = (boundary.bottom - boundary.top) / 2 + boundary.top;\r\n// let yOffset = arrow.offsetHeight / 2; //arrow.offsetHeight - arrow.offsetHeight / 2;\r\n// let xOffset = modal.offsetWidth / 2;\r\n\r\n// let x = pixelCoords[0] - xOffset;\r\n// let y = pixelCoords[1] + yOffset;\r\n// let flip = 0;\r\n// let buttonX = Math.max(x, 0);\r\n// buttonX = Math.min(buttonX, boundary.right);\r\n// let arrowX = xOffset;\r\n\r\n// let rightMax = boundary.right - modal.offsetWidth / 2; //width of bounds - 1/2 width of bubble\r\n// if (buttonX === 0) {\r\n// arrowX = Math.max(pixelCoords[0], 0);\r\n// }\r\n// if (buttonX > rightMax) {\r\n// arrowX = Math.min(pixelCoords[0] - buttonX, boundary.right);\r\n// }\r\n// //ΔVΔVΔ: minimum left should be 0, x offset should take diff between\r\n// if (y > yhalfway) {\r\n// let halfwayy = button.offsetHeight + yOffset + 10;\r\n// flip = 1;\r\n// y = pixelCoords[1] - halfwayy;\r\n// }\r\n// setLocalCoords([buttonX, y, arrowX, flip]);\r\n// };\r\n// useEffect(() => {\r\n// setVisible(validateFeature(hoveredFeature));\r\n// }, [hoveredFeature]);\r\n// useEffect(() => {\r\n// window.addEventListener('mousemove', mousemove);\r\n// return () => {\r\n// window.removeEventListener('mousemove', mousemove);\r\n// };\r\n// }, []);\r\n\r\n// return (\r\n//
\r\n// \r\n//
\r\n// );\r\n// };\r\n// export { HoveredFeatureTitle };\r\n","import { InterfaceContext } from \"../model/InterfaceProvider\";\r\nimport { useContext } from \"react\";\r\n\r\nconst RemoveMapMarkerButton = ()=>{\r\nconst {unsetMarker,marker} = useContext(InterfaceContext);\r\n// console.log(marker.center)\r\n\r\nreturn (\r\n<>\r\n{marker.center.length>0 && \r\n
Remove Marker
\r\n}\r\n)\r\n\r\n}\r\nexport default RemoveMapMarkerButton;","import { useEffect, useRef } from 'react';\r\n\r\nexport const useAfterInit = (effect = () => {}, deps = []) => {\r\n const initialRender = useRef(true);\r\n\r\n useEffect(() => {\r\n let effectReturns = () => {};\r\n\r\n if (initialRender.current) {\r\n initialRender.current = false;\r\n } else {\r\n effectReturns = effect();\r\n }\r\n\r\n if (effectReturns && typeof effectReturns === 'function') {\r\n return effectReturns;\r\n }\r\n }, deps);\r\n};\r\n","import { Fragment, Children, isValidElement, cloneElement } from 'react';\r\n\r\n//ΔVΔVΔ: Helper fn, check to see if a variable is <>\r\nconst isReactFragment = (variableToInspect) => {\r\n if (variableToInspect?.type) {\r\n return variableToInspect.type === Fragment;\r\n }\r\n return variableToInspect === Fragment;\r\n};\r\nexport { isReactFragment };\r\n\r\n//ΔVΔVΔ: A Props filter is used when adding props to children,\r\n//a function must have the following arguments: index,child,props and must return a props object\r\n//by default it will return the original unaltered props\r\n// the purpose of this filter is to be able to alter the props based on the child ID or child object\r\nconst defaultPropsFilter = (index, child, props) => {\r\n //example of use\r\n // props.logMe = (id) => {\r\n // console.log(id, child);\r\n // };\r\n return props;\r\n};\r\nconst addPropsToChildren = (children, props) => {\r\n const { startIndex = 0, prefix = '', suffix = '', propsFilter = defaultPropsFilter, ...rest } = props;\r\n\r\n var grandKidsInd = 0;\r\n return Children.map(children, (child, index) => {\r\n let adjustedIndex = startIndex + index + grandKidsInd;\r\n if (isReactFragment(child)) {\r\n var grandChildren = addPropsToChildren(child.props.children, { ...props, startIndex: adjustedIndex });\r\n grandKidsInd = grandChildren[grandChildren.length - 1].props.index;\r\n return <>{grandChildren};\r\n }\r\n if (isValidElement(child)) {\r\n let id = prefix + index + suffix;\r\n let adjustedProps = propsFilter(adjustedIndex, child, { id, ...rest });\r\n return cloneElement(child, { index: adjustedIndex, ...adjustedProps });\r\n }\r\n return child;\r\n });\r\n};\r\nexport { addPropsToChildren };\r\n","import React, { useEffect, useState } from 'react';\r\nimport OLTileLayer from 'ol/layer/Tile';\r\nimport OLVectorLayer from 'ol/layer/Vector';\r\nimport OLTileSource from 'ol/source/Tile';\r\nimport OLVectorSource from 'ol/source/Vector';\r\nimport OLClusterSource from 'ol/source/Cluster';\r\nimport * as mapStyles from './MapVectorStyles.js';\r\nimport { addPropsToChildren } from '../controller/addPropsToChildren.js';\r\n\r\nconst fn = () => {};\r\n\r\nconst Layers = (props) => {\r\n const { map, children, onLoadStatus = () => {} } = props;\r\n const [mappedChildren, setMappedChildren] = useState([]);\r\n\r\n //ΔVΔVΔ: Assign z-index by order in child array, can be overriden in each child obj props\r\n // const mappedChildren\r\n\r\n // console.log(props)\r\n useEffect(() => {\r\n if (!map) return;\r\n const mappedKids = addPropsToChildren(children, {\r\n map,\r\n propsFilter: (index, child, props) => {\r\n props.zIndex = child.props.zIndex || index;\r\n props.id = `layer_${index}_${child.props.id || child.props.type || child.type.name || ''}`;\r\n props.onLoadStatus = (status) => onLoadStatus(props.id, status);\r\n return props;\r\n }\r\n });\r\n setMappedChildren(mappedKids);\r\n }, [map, children]);\r\n\r\n return
{mappedChildren}
;\r\n};\r\nexport default Layers;\r\n\r\nconst Layer = (props) => {\r\n const [addedToMap, setAddedToMap] = useState(false);\r\n const { map, opacity = 1, visible = true, zIndex = 0, title } = props;\r\n const { constructor = null, onAdded = fn, onPreRender = fn, onPostRender = fn } = props;\r\n const [lyr] = useState(constructor);\r\n // console.log(title + 'lyr');\r\n\r\n const setOpacity = () => {\r\n if (!map || !lyr) return;\r\n let failsafeOpacity = opacity == null || isNaN(opacity) ? 1 : opacity; //If opacity is set with a non number throws assertion error\r\n lyr.setOpacity(visible ? failsafeOpacity : 0);\r\n };\r\n\r\n useEffect(() => map && lyr && setOpacity(), [visible, opacity]);\r\n useEffect(() => map && lyr && lyr.setZIndex(zIndex), [zIndex]);\r\n useEffect(() => map && lyr && lyr.set('title', title));\r\n\r\n const preRender = (e) => {\r\n console.log(title + '&&& Prerender');\r\n onPreRender(e);\r\n };\r\n\r\n const postRender = (e) => {\r\n console.log(title + '%%% Postrender');\r\n onPostRender(e);\r\n };\r\n\r\n useEffect(() => {\r\n if (!map || !lyr) return;\r\n if (addedToMap) return; //ΔVΔVΔ: Only Happens On local and testing, prevents re-adding\r\n\r\n // lyr.on('prerender', preRender);\r\n // lyr.on('postrender', postRender);\r\n map.addLayer(lyr);\r\n lyr.setZIndex(zIndex);\r\n setAddedToMap(true);\r\n setOpacity();\r\n onAdded(lyr);\r\n\r\n return () => {\r\n if (map) {\r\n map.removeLayer(lyr);\r\n setAddedToMap(false);\r\n }\r\n };\r\n }, [map, lyr]);\r\n return null;\r\n};\r\nexport { Layer };\r\n\r\nconst TileLayer = (props) => {\r\n const { map, opacity = 1, visible = true, source, url, zIndex = 0, style, title, className } = props;\r\n const { onAdded = fn, onPreRender = fn, onPostRender = fn } = props;\r\n let src = url || source || new OLTileSource();\r\n\r\n const [lyr] = useState(\r\n new OLTileLayer({\r\n source: src,\r\n zIndex,\r\n title,\r\n style,\r\n className,\r\n map\r\n })\r\n );\r\n\r\n return ;\r\n};\r\n\r\nexport { TileLayer };\r\n\r\nconst VectorLayer = (props) => {\r\n const { map, features, opacity = 1, visible = true, zIndex = 0, title = 'vector layer', style = mapStyles.outlineExtent, className } = props;\r\n const { onAdded = fn, onPreRender = fn, onPostRender = fn, renderOrder = () => 1 } = props;\r\n\r\n const [lyr] = useState(\r\n new OLVectorLayer({\r\n title,\r\n opacity: visible ? opacity : 0,\r\n source: new OLVectorSource(),\r\n style,\r\n zIndex,\r\n className,\r\n renderOrder\r\n })\r\n );\r\n\r\n const updateFeatures = () => {\r\n const lyrSource = new OLVectorSource({\r\n features,\r\n overlaps: false\r\n });\r\n lyr.setSource(lyrSource);\r\n };\r\n const clearFeatures = () => {\r\n lyr.setSource(new OLVectorSource());\r\n };\r\n useEffect(() => map && features && updateFeatures(), [features]);\r\n useEffect(() => map && !features && clearFeatures(), [features]);\r\n\r\n return (\r\n {\r\n lyr.setStyle(style);\r\n updateFeatures();\r\n onAdded(lyr);\r\n }}\r\n map={map}\r\n onPreRender={onPreRender}\r\n onPostRender={onPostRender}\r\n constructor={lyr}\r\n />\r\n );\r\n};\r\nexport { VectorLayer };\r\n\r\nconst VectorLayer2 = (props) => {\r\n const { map, features, opacity = 1, visible = true, zIndex = 0, title = 'vector layer', style = mapStyles.outlineExtent, className, loader } = props;\r\n const { onAdded = fn, onPreRender = fn, onPostRender = fn, renderOrder = () => 1 } = props;\r\n const [lyrSource] = useState(\r\n new OLVectorSource({\r\n overlaps: false,\r\n loader: loader,\r\n features: features\r\n })\r\n );\r\n\r\n const [lyr] = useState(\r\n new OLVectorLayer({\r\n title,\r\n opacity: visible ? opacity : 0,\r\n source: lyrSource,\r\n style,\r\n zIndex,\r\n className,\r\n renderOrder\r\n })\r\n );\r\n\r\n const updateFeatures = (newFeatures) => {\r\n lyrSource.clear();\r\n lyrSource.addFeatures(newFeatures);\r\n };\r\n useEffect(() => {\r\n if (!map) return;\r\n if (!features) return;\r\n updateFeatures(features);\r\n }, [features]);\r\n\r\n return (\r\n {\r\n lyr.setStyle(style);\r\n onAdded(lyr);\r\n }}\r\n map={map}\r\n onPreRender={onPreRender}\r\n onPostRender={onPostRender}\r\n constructor={lyr}\r\n />\r\n );\r\n};\r\nexport { VectorLayer2 };\r\n\r\nconst ClusterLayer = (props) => {\r\n const { map, features, opacity = 1, visible = true, zIndex = 0, title = 'vector layer', style = mapStyles.outlineExtent, className, source = null } = props;\r\n const { onAdded = fn, onPreRender = fn, onPostRender = fn } = props;\r\n\r\n const [lyr] = useState(\r\n new OLVectorLayer({\r\n title,\r\n opacity: visible ? opacity : 0,\r\n source: new OLVectorSource(),\r\n style,\r\n zIndex,\r\n className\r\n })\r\n );\r\n\r\n const updateFeatures = () => {\r\n const lyrSource = new OLVectorSource({\r\n features,\r\n overlaps: false\r\n });\r\n\r\n const clusterSource = new OLClusterSource({\r\n distance: 40,\r\n minDistance: 20,\r\n source: lyrSource\r\n });\r\n lyr.setSource(clusterSource);\r\n };\r\n useEffect(() => map && features && updateFeatures(), [features]);\r\n\r\n return (\r\n {\r\n lyr.setStyle(style);\r\n updateFeatures();\r\n onAdded(lyr);\r\n }}\r\n map={map}\r\n onPreRender={onPreRender}\r\n onPostRender={onPostRender}\r\n constructor={lyr}\r\n />\r\n );\r\n};\r\nexport { ClusterLayer };\r\n","export default function Waiting(props) {\r\n const init_load = 0;\r\n const isLoading = props.visible;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n );\r\n}\r\n","import React, { useRef, useState, useContext, useEffect, useCallback, memo } from 'react';\r\nimport * as ol from 'ol';\r\nimport MapContext from '../controller/MapProvider';\r\nimport Waiting from './Waiting';\r\nimport { addPropsToChildren } from '../controller/addPropsToChildren';\r\nimport { pointWithinDomElement } from '../controller/CollisionDetection';\r\nimport { fromLonLat, toLonLat } from 'ol/proj';\r\n\r\nconst fn = () => {};\r\n\r\nconst defaultLayerFilter = (lyr) => {\r\n if (lyr.get('opacity') === 0 || !lyr.get('visible')) return false; //ΔVΔVΔ: No invisible layers\r\n return lyr;\r\n};\r\n\r\nconst Map = (props) => {\r\n const { verbose = false, children, id = 'mapContainer', zoom = 4, projection, minZoom = 2, maxZoom = 15, initViewExtent: initExtent, extent: maxExtent, center = [0, 0] } = props;\r\n const { onZoom = fn, layerFilter: layerFilterFn = defaultLayerFilter, onClickFeature = fn, onHoverFeature = fn, onCenter = fn, onInitMap = fn, onMove = fn, onLoadStatus = fn } = props;\r\n\r\n const mapRef = useRef();\r\n const { map, setZoomRead } = useContext(MapContext);\r\n const [mouseIsDown, setMouseIsDown] = useState(false);\r\n const [isWorking, setIsWorking] = useState(1);\r\n const [loadSet, setLoadSet] = useState(new Set());\r\n const loadQueue = useRef(new Set());\r\n\r\n const mouseDownAction = () => {\r\n setMouseIsDown(true);\r\n };\r\n const mouseUpAction = () => {\r\n setMouseIsDown(false);\r\n };\r\n const onmapclick = (e) => {\r\n console.log(e.coordinate);\r\n if (pixelCollidesWithUI(e.pixel)) return;\r\n const targetFeatures = map.getFeaturesAtPixel(e.pixel, {\r\n layerFilter: layerFilterFn\r\n });\r\n onClickFeature(targetFeatures[0]);\r\n };\r\n\r\n const mouseoutMap = () => {\r\n onHoverFeature(false);\r\n setMouseIsDown(false);\r\n };\r\n\r\n //pointWithinDomElement\r\n const pixelCollidesWithUI = (pixel, padding = 10) => {\r\n //check that map pixel is not hovering over map controls\r\n const controls = mapRef.current.querySelectorAll('.ol-overlaycontainer-stopevent .ol-control');\r\n for (var i = 1; i < controls.length; i++) {\r\n var control = controls[i];\r\n const controlCollisionDetected = pointWithinDomElement(pixel[0], pixel[1], control, padding, mapRef.current); //control && detectCollision(pixel[0], pixel[1], getRelativeBoundingClientRect(control), padding);\r\n if (controlCollisionDetected) return true;\r\n }\r\n const downloadButton = mapRef.current.querySelector('.ol-overlaycontainer-stopevent button.map-download');\r\n const downloadCollisionDetected = pointWithinDomElement(pixel[0], pixel[1], downloadButton, padding, mapRef.current); //downloadButton && detectCollision(pixel[0], pixel[1], getRelativeBoundingClientRect(downloadButton), padding);\r\n if (downloadCollisionDetected) return true;\r\n return false;\r\n };\r\n\r\n const mapPointerMove = (e) => {\r\n if (e.dragging || mouseIsDown) {\r\n onHoverFeature(false);\r\n return;\r\n }\r\n if (pixelCollidesWithUI(e.pixel)) return;\r\n const hoveredFeatures = map.getFeaturesAtPixel(e.pixel, {\r\n layerFilter: layerFilterFn\r\n });\r\n onHoverFeature(hoveredFeatures[0]);\r\n };\r\n\r\n const mapmoveend = useCallback(\r\n (m) => {\r\n if (!map) return;\r\n let mapObject = map;\r\n let e = map.getView().calculateExtent(mapObject.getSize());\r\n let c = map.getView().getCenter();\r\n let z = map.getView().getZoom();\r\n setZoomRead(z); //\r\n onZoom(z);\r\n onCenter(c);\r\n onMove({ zoom: z, center: c, extent: e, map }); //props function\r\n },\r\n [map]\r\n );\r\n\r\n const moveMapTo = (extent) => {\r\n if (!map) return;\r\n map.getView().fit(extent, map.getSize());\r\n mapmoveend();\r\n };\r\n const onChildLoadStatus = (id, status) => {\r\n if (status === 0) {\r\n loadQueue.current.add(id);\r\n setLoadSet(new Set(loadQueue.current));\r\n }\r\n if (status === 1) {\r\n loadQueue.current.delete(id);\r\n setLoadSet(new Set(loadQueue.current));\r\n }\r\n\r\n //ΔVΔVΔ: If for some reason the status passed is not 1 or 0 do nothing\r\n };\r\n\r\n const mappedChildren = addPropsToChildren(children, {\r\n prefix: 'map_util_',\r\n map,\r\n propsFilter: (index, child, props) => {\r\n props.onLoadStatus = (cid, status) => onChildLoadStatus(props.id + '_' + cid, status);\r\n return props;\r\n }\r\n });\r\n const initMap = () => {\r\n let options = {\r\n view: new ol.View({\r\n extent: maxExtent,\r\n projection,\r\n minZoom,\r\n maxZoom,\r\n showFullExtent: true\r\n }),\r\n layers: [],\r\n controls: [],\r\n overlays: []\r\n };\r\n let mapObject = new ol.Map(options);\r\n mapObject.setTarget(mapRef.current);\r\n\r\n mapObject.getView().fit(initExtent, mapObject.getSize());\r\n document.addEventListener('mousedown', mouseDownAction);\r\n document.addEventListener('mouseup', mouseUpAction);\r\n onInitMap(mapObject);\r\n var tst = [-14150703.25072198, 1724460.655959669, -7075872.59319234, 6815350.164313462];\r\n var proj = mapObject.getView().getProjection();\r\n console.log('tst', toLonLat(tst, proj));\r\n\r\n // var rtest = [-132.1875000, 48.0093777, -106.9921830, 47.9636190]\r\n console.log('from lonlat');\r\n var alas = [-19430660.90751849, 6002448.621339999, -13665405.635740003, 12265255.002859998];\r\n console.log('tst2', toLonLat(alas.slice(0, 2), proj), toLonLat(alas.slice(2), proj));\r\n return mapObject;\r\n };\r\n useEffect(() => {\r\n const mapObject = initMap();\r\n return () => {\r\n // ΔVΔVΔ: On component unmount\r\n mapObject.setTarget(undefined);\r\n };\r\n }, []);\r\n\r\n // useEffect(() => mapmoveend(), [tab]);// there was a time this was needed, probably when the content map tab was not ALWAYS active\r\n\r\n useEffect(() => {\r\n if (!map) return;\r\n map.addEventListener('moveend', mapmoveend);\r\n map.addEventListener('pointermove', mapPointerMove);\r\n map.addEventListener('click', onmapclick);\r\n map.getViewport().addEventListener('mouseout', mouseoutMap);\r\n\r\n return () => {\r\n map.removeEventListener('moveend', mapmoveend);\r\n map.removeEventListener('pointermove', mapPointerMove);\r\n map.getViewport().removeEventListener('mouseout', mouseoutMap);\r\n map.removeEventListener('click', onmapclick);\r\n };\r\n }, [map]);\r\n\r\n useEffect(() => map && moveMapTo(initExtent), [initExtent]);\r\n\r\n useEffect(() => {\r\n const done = loadSet.size === 0;\r\n setIsWorking(!done);\r\n if (verbose) console.log('@@@ update loadset:', loadSet.size, 'isWorking? ', !done);\r\n if (verbose) console.log('Inqueue', loadSet);\r\n }, [loadSet]);\r\n\r\n useEffect(() => {\r\n if (!map) return;\r\n map.getView().setZoom(zoom);\r\n setZoomRead(zoom);\r\n map.dispatchEvent('codemoveend');\r\n }, [zoom]);\r\n\r\n useEffect(() => {\r\n if (!map) return;\r\n map.getView().setCenter(center);\r\n map.dispatchEvent('codemoveend');\r\n }, [center]);\r\n\r\n useEffect(() => onLoadStatus(isWorking ? 0 : 1), [isWorking]);\r\n\r\n return (\r\n <>\r\n \r\n
\r\n {mappedChildren}\r\n
\r\n \r\n );\r\n};\r\nexport default memo(Map);\r\n","import React, { useEffect, useState, useRef } from 'react';\r\nimport { Feature } from 'ol';\r\nimport { VectorLayer } from './Layer.js';\r\nimport Polygon from 'ol/geom/Polygon';\r\nimport { outlineExtent } from './MapVectorStyles.js';\r\nimport LineString from 'ol/geom/LineString';\r\nimport { createXYZ } from 'ol/tilegrid';\r\nimport OLVectorSource from 'ol/source/Vector';\r\nimport { getSimpleGeometry } from '../controller/LayerQueries';\r\n\r\nconst distanceBetweenPoints = (coord1, coord2) => {\r\n var line = new LineString([coord1, coord2]);\r\n return Math.round(line.getLength() * 100) / 100;\r\n};\r\nconst drawExtentPolygon = (ext, _offset = 0) => {\r\n const diagonalDistance = distanceBetweenPoints(ext.slice(0, 2), ext.slice(2));\r\n\r\n const offset = diagonalDistance * (_offset / 100);\r\n\r\n const minx = ext[0] + offset;\r\n const miny = ext[1] + offset * 2;\r\n const maxx = ext[2] - offset;\r\n const maxy = ext[3] - offset;\r\n\r\n const topLeft = [minx, maxy];\r\n const bottomLeft = [minx, miny];\r\n const topRight = [maxx, maxy];\r\n const bottomRight = [maxx, miny];\r\n\r\n const coords = [topLeft, topRight, bottomRight, bottomLeft, topLeft, bottomRight, topRight, bottomLeft];\r\n\r\n const feature = new Feature({\r\n geometry: new Polygon([coords])\r\n });\r\n return feature;\r\n};\r\n\r\nconst DrawExtent = (props) => {\r\n const { map, extent, opacity = 1, visible = true, zIndex = 0, title = 'extent border', style = outlineExtent } = props;\r\n const [features, setFeatures] = useState([]);\r\n\r\n const redrawFeature = () => {\r\n const ext = extent || map.getView().calculateExtent(map.getSize());\r\n const feature = drawExtentPolygon(ext, 2);\r\n setFeatures([feature]);\r\n };\r\n useEffect(() => map && redrawFeature(), [map, extent]);\r\n\r\n return (\r\n {\r\n redrawFeature(lay);\r\n }}\r\n map={map}\r\n />\r\n );\r\n};\r\nexport { DrawExtent };\r\n\r\nconst getTilesInView = (args) => {\r\n const { zoom, extent } = args;\r\n const simpleZoom = Math.max(Math.floor(zoom), 6); //min zoom\r\n const grid = createXYZ();\r\n const tilesObj = {};\r\n grid.forEachTileCoord(extent, simpleZoom, (coord) => {\r\n let tileExtent = grid.getTileCoordExtent(coord);\r\n tilesObj[`z:${coord[0]}x:${coord[1]}y:${coord[2]}`] = tileExtent;\r\n });\r\n return tilesObj;\r\n};\r\n\r\nexport { getTilesInView };\r\n\r\nconst TileTracker = (props) => {\r\n const { map, onChange = () => {}, minZoom = 0, limits = {} } = props;\r\n const [tiles, setTiles] = useState([]);\r\n const grid = useRef(createXYZ());\r\n\r\n //ΔVΔVΔ: If rule has a num > x condition and meets the condition\r\n\r\n const validateRule = (num, rule, p = 0) => {\r\n num = num * 1;\r\n if (rule.indexOf('-') === -1) return num === rule * 1; //not a range just number\r\n let range = rule.split('-').map((n) => parseInt(n));\r\n let min = range[0] - p;\r\n let max = range[1] + p;\r\n if (min < num < max) return true;\r\n return false;\r\n };\r\n const withinLimit = (coord) => {\r\n let cz = coord[0];\r\n let cx = coord[1];\r\n let cy = coord[2];\r\n if (!cz in limits) return true; //no rule present\r\n var rules = limits[cz];\r\n let xRules = rules.x.split(',');\r\n let yRules = rules.y.split(',');\r\n if (xRules.length !== yRules.length) {\r\n console.error(`Invaid zoom rule [${rules.x}] and [${rules.y}] do not have matching lengths`);\r\n return true; //Ignore rule\r\n }\r\n for (let i = 0; i < xRules.length; i++) {\r\n let xMatch = validateRule(cx, xRules[i], rules.p);\r\n let yMatch = validateRule(cy, yRules[i], rules.p);\r\n // console.log('XXX', cx, xRules[i], xMatch);\r\n // console.log('YYY', cy, yRules[i], yMatch);\r\n if (xMatch && yMatch) return true;\r\n }\r\n return false;\r\n };\r\n\r\n const tilesViewed = () => {\r\n let extent = map.getView().calculateExtent(map.getSize());\r\n let zoom = Math.max(map.getView().getZoom(), minZoom); //minimum zoom 6 for fetching poi data\r\n // let zoom = map.getView().getZoom();\r\n\r\n const tilesObj = {};\r\n grid.current.forEachTileCoord(extent, zoom, (coord) => {\r\n // if (withinLimit(coord)) {\r\n let tileExtent = grid.current.getTileCoordExtent(coord);\r\n tilesObj[`z:${coord[0]}x:${coord[1]}y:${coord[2]}`] = tileExtent;\r\n // }\r\n });\r\n // console.log(tilesObj);\r\n setTiles(tilesObj);\r\n };\r\n\r\n useEffect(() => {\r\n tilesViewed();\r\n map.on('moveend', async () => tilesViewed());\r\n }, []);\r\n\r\n useEffect(() => tilesViewed(), [map]);\r\n useEffect(() => onChange(tiles), [tiles]);\r\n return null;\r\n};\r\nexport { TileTracker };\r\n\r\nconst FipsTracker = (props) => {\r\n const { map, year, onChange, onSourceInit } = props;\r\n const [fips, setFips] = useState(new Set());\r\n const [source, setSource] = useState(null);\r\n\r\n const updateSource = async () => {\r\n const nationalCountyFeatures = await getSimpleGeometry({ scope: 'national', tract: 'county', year: year.label });\r\n\r\n const lyrSource = new OLVectorSource({\r\n features: nationalCountyFeatures,\r\n overlaps: false\r\n });\r\n setSource(lyrSource);\r\n };\r\n\r\n useEffect(() => {\r\n if (!map || !source) return;\r\n updateFips();\r\n map.on('moveend', async () => updateFips());\r\n }, [source, map]);\r\n\r\n useEffect(() => onSourceInit && onSourceInit(source), [source]);\r\n useEffect(async () => year && updateSource(), [map, year]);\r\n useEffect(() => map && onChange(fips), [fips]);\r\n\r\n const updateFips = (detail = 'low') => {\r\n const obj = new Set();\r\n if (!map || !source) return obj;\r\n\r\n source.forEachFeatureIntersectingExtent(map.getView().calculateExtent(map.getSize()), function (feature) {\r\n let fip = feature.get('FIPS') || feature.get('STATEFP') + feature.get('COUNTYFP');\r\n fip = detail === 'low' ? fip.toString().substring(0, 2) : fip.toString();\r\n obj.add(fip);\r\n });\r\n setFips(obj);\r\n };\r\n\r\n return null;\r\n};\r\nexport { FipsTracker };\r\n","import { useEffect, useState } from 'react';\r\nimport olms from 'ol-mapbox-style';\r\nimport OLMap from 'ol/Map';\r\nimport OLView from 'ol/View';\r\n\r\nconst OLMSLayer = (props) => {\r\n const { zIndex, map, url, visible, title = '' } = props;\r\n const [lyr, setLayer] = useState(0);\r\n const [active, setActive] = useState(false);\r\n\r\n useEffect(async () => {\r\n if (!map && !active) return;\r\n setActive(true);\r\n const fpoObj = new OLMap({ view: new OLView() });\r\n\r\n olms(fpoObj, url).then(() => {\r\n const lyrFound = fpoObj.getLayers().array_[0];\r\n lyrFound.set('title', title);\r\n setLayer(lyrFound);\r\n fpoObj.removeLayer(lyrFound);\r\n map.addLayer(lyrFound);\r\n });\r\n return () => {\r\n if (map) {\r\n map.removeLayer(lyr);\r\n }\r\n };\r\n }, [map]);\r\n\r\n useEffect(() => {\r\n if (!map || !lyr) return;\r\n lyr.setOpacity(visible ? 1 : 0);\r\n }, [visible]);\r\n\r\n useEffect(() => {\r\n if (!lyr) return;\r\n lyr.setZIndex(zIndex);\r\n }, [lyr]);\r\n\r\n return null;\r\n};\r\nexport { OLMSLayer };\r\n","import { VectorLayer, VectorLayer2 } from './Layer.js';\r\nimport { outlineCensus } from './MapVectorStyles.js';\r\nimport * as LQ from '../controller/LayerQueries';\r\nimport { useState, useEffect, useContext } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport MapContext from '../controller/MapProvider';\r\nimport { useAfterInit } from '../controller/useAfterInit.js';\r\nimport * as mapStyles from '../view/MapVectorStyles.js';\r\n\r\nconst CensusLayer = (props) => {\r\n const generateDataSlug = () => theme.slug;\r\n const { opacity, zIndex, onLoadStatus, map } = props;\r\n const { scope, tract, theme, year, usState, setErrorMessage, opacity: globalOpacity } = useContext(InterfaceContext);\r\n const { fips } = useContext(MapContext);\r\n\r\n const [visible, setVisible] = useState(() => tract === 'census');\r\n\r\n const [localOpacity, setLocalOpacity] = useState(opacity);\r\n const [features, setFeatures] = useState([]);\r\n const [loadStatus, setLoadStatus] = useState(1);\r\n const [lyr, setLyr] = useState(null);\r\n\r\n const [selected_data_slug, setSelectedDataSlug] = useState(() => generateDataSlug());\r\n\r\n const setBlendMode = (e) => (e.context.globalCompositeOperation = 'multiply');\r\n const updateSlug = () => setSelectedDataSlug(generateDataSlug());\r\n\r\n useEffect(() => setVisible(tract === 'census'), [tract]);\r\n\r\n useEffect(() => updateSlug(), [scope, theme, tract]);\r\n useEffect(() => setLocalOpacity((opacity || 1) * (globalOpacity / 100)), [opacity, globalOpacity]);\r\n useEffect(() => onLoadStatus(loadStatus), [loadStatus]);\r\n useEffect(\r\n () =>\r\n lyr &&\r\n lyr.once('postrender', () => {\r\n // console.log('*** CENSUS, rendered');\r\n setLoadStatus(1);\r\n }),\r\n [features]\r\n );\r\n\r\n //@@==\r\n useAfterInit(() => {\r\n if (!visible) return;\r\n setLoadStatus(0);\r\n refreshColors();\r\n }, [selected_data_slug]);\r\n\r\n //@@==\r\n useAfterInit(() => {\r\n if (!visible) return;\r\n setLoadStatus(0);\r\n refreshSVI();\r\n }, [usState, scope]);\r\n\r\n //@@==\r\n useAfterInit(() => {\r\n if (!visible) return;\r\n setLoadStatus(0);\r\n refreshFeatures();\r\n }, [year, visible, fips, scope]);\r\n\r\n const getGeometry = async (ffips) => {\r\n var zoom = map.getView().getZoom();\r\n var newfeatures = await LQ.getVisibleGeometry({\r\n zoom,\r\n scope: 'state',\r\n tract: 'census',\r\n state: usState,\r\n fipsList: ffips,\r\n year: year.label\r\n }).catch((err) => {\r\n setErrorMessage(err.modalMessage, err);\r\n return [];\r\n });\r\n return newfeatures || [];\r\n };\r\n const getSvi = async (fips) => {\r\n const canDecorate = scope === 'national' || usState;\r\n let localScope = usState ? 'state' : scope;\r\n const shouldGetSvi = Boolean(tract === 'census' && canDecorate && features);\r\n if (!shouldGetSvi) return {};\r\n\r\n return await LQ.getVisibleSVI({\r\n theme: theme.id,\r\n year: year.label,\r\n scope: localScope,\r\n tract: 'census',\r\n state: usState,\r\n fips\r\n }).catch((err) => {\r\n console.error('Failed to load SVI data in census layer');\r\n console.error(err);\r\n setErrorMessage(err.modalMessage, err);\r\n setLoadStatus(1);\r\n });\r\n };\r\n const refreshFeatures = async (success = () => {}, failure = () => {}) => {\r\n const newfeatures = await getGeometry(fips);\r\n const svi = await getSvi(fips);\r\n const decorated = decorateFeatures(newfeatures, svi);\r\n setFeatures(decorated);\r\n success(decorated);\r\n };\r\n\r\n const decorateFeatures = (features, svi) => {\r\n let localScope = usState ? 'state' : scope;\r\n return LQ.stylizeGeometry(features, localScope, theme, usState, svi, false);\r\n };\r\n const featureWithinScope = (shape) => {\r\n if (scope == 'national') return true;\r\n if (!usState) return false;\r\n const fips = shape.get('FIPS') || shape.get('STATEFP');\r\n return fips.substr(0, 2) === usState.id + '';\r\n };\r\n const getStyleFromFeature = (shape) => {\r\n if (!featureWithinScope(shape)) return mapStyles.outOfScope;\r\n const val = shape.get('sviValues')['theme' + theme.id];\r\n return theme.colorScheme[val] || mapStyles.noData;\r\n };\r\n const restyleFeatures = (features) => {\r\n features.forEach((shape) => {\r\n let sviStyle = getStyleFromFeature(shape);\r\n if (typeof sviStyle == 'object') shape.setStyle(sviStyle);\r\n });\r\n };\r\n const refreshColors = () => {\r\n restyleFeatures(features);\r\n setFeatures(features.slice(0));\r\n };\r\n const refreshSVI = async () => {\r\n const svi = await getSvi(fips);\r\n const decorated = decorateFeatures(features.slice(), svi);\r\n setFeatures(decorated);\r\n };\r\n\r\n return setLyr(lyr)} />;\r\n};\r\nexport default CensusLayer;\r\n","import { VectorLayer2 } from './Layer.js';\r\nimport { outlineCounty, outlineCountyLow } from './MapVectorStyles.js';\r\nimport * as LQ from '../controller/LayerQueries';\r\nimport { useState, useEffect, useContext, useRef } from 'react';\r\nimport { useAfterInit } from '../controller/useAfterInit.js';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport MapContext from '../controller/MapProvider';\r\nimport * as mapStyles from '../view/MapVectorStyles.js';\r\n\r\nconst CountyLayer = (props) => {\r\n const getDetailLevel = (zoom) => (zoom < 8 ? 'low' : 'high');\r\n const generateDataSlug = () => [scope, tract, theme.slug, usState?.slug || 'us'].join('_');\r\n\r\n const { opacity, zIndex, onLoadStatus, map } = props;\r\n const { scope, tract, theme, year, usState, setErrorMessage, opacity: globalOpacity } = useContext(InterfaceContext);\r\n const { zoomRead } = useContext(MapContext);\r\n const { fips } = useContext(MapContext);\r\n\r\n const [detail, setDetail] = useState(() => getDetailLevel(zoomRead));\r\n const [localOpacity, setLocalOpacity] = useState(opacity);\r\n const [features, setFeatures] = useState([]);\r\n const [loadStatus, setLoadStatus] = useState(1);\r\n const [lyr, setLyr] = useState(null);\r\n const changeQueue = useRef(0);\r\n\r\n const [selected_data_slug, setSelectedDataSlug] = useState(() => generateDataSlug());\r\n\r\n const setBlendMode = (e) => (e.context.globalCompositeOperation = 'multiply');\r\n const updateSlug = () => setSelectedDataSlug(generateDataSlug());\r\n\r\n useEffect(() => setDetail(getDetailLevel(zoomRead)), [zoomRead]);\r\n useEffect(() => updateSlug(), [scope, theme, tract]);\r\n useEffect(() => setLocalOpacity((opacity || 1) * (globalOpacity / 100)), [opacity, globalOpacity]);\r\n useEffect(() => onLoadStatus(loadStatus), [loadStatus]);\r\n // useEffect(() => lyr && lyr.once('postrender', () => setLoadStatus(1)), [features]);\r\n useEffect(() => {\r\n if (lyr) {\r\n setLoadStatus(0);\r\n lyr.once('postrender', () => {\r\n changeQueue.current = changeQueue.current - 1;\r\n if (changeQueue.current < 1) {\r\n changeQueue.current = 0;\r\n setLoadStatus(1);\r\n }\r\n });\r\n }\r\n }, [features]);\r\n\r\n useAfterInit(() => {\r\n // console.log('$$$COUNTY selected_data_slug', selected_data_slug);\r\n setLoadStatus(0);\r\n refreshColors();\r\n }, [selected_data_slug]);\r\n\r\n useEffect(() => {\r\n // console.log('$$$county state updated', changeQueue.current);\r\n if (!features?.length) return;\r\n changeQueue.current = changeQueue.current + 1;\r\n setLoadStatus(0);\r\n refreshSVI();\r\n }, [usState]);\r\n\r\n useEffect(() => {\r\n // console.log('$$$county year, detail', changeQueue.current);\r\n if (!features?.length) return; //don't refresh on var init\r\n changeQueue.current = changeQueue.current + 1;\r\n setLoadStatus(0);\r\n refreshFeatures();\r\n }, [year, detail]);\r\n\r\n const getGeometry = async () => {\r\n var zoom = map.getView().getZoom();\r\n var newfeatures = await LQ.getVisibleGeometry({ zoom, scope: 'state', tract: 'county', state: usState, year: year.label }).catch((err) => {\r\n setErrorMessage(err.modalMessage, err);\r\n return [];\r\n });\r\n return newfeatures || [];\r\n };\r\n const getSvi = async () => {\r\n let localScope = usState ? 'state' : scope;\r\n\r\n return await LQ.getVisibleSVI({ theme: theme.id, year: year.label, scope: localScope, tract: 'county', state: usState, fips: [] }).catch((err) => {\r\n console.error('Failed to load SVI data in County Layer');\r\n console.error(err);\r\n setErrorMessage(err.modalMessage, err);\r\n setLoadStatus(1);\r\n });\r\n };\r\n const isEmpty = (obj) => {\r\n for (let prop in obj) return false;\r\n return true;\r\n };\r\n const decorateFeatures = (features, svi) => {\r\n var zoom = map.getView().getZoom();\r\n let defaultStyle = getDefaultStyle(svi);\r\n let localScope = usState ? 'state' : scope;\r\n return LQ.stylizeGeometry(features, localScope, theme, usState, svi, true, defaultStyle, zoom);\r\n };\r\n const refreshFeatures = async (success = () => {}, failure = () => {}) => {\r\n const newfeatures = await getGeometry(fips);\r\n const svi = await getSvi(fips);\r\n let decorated = decorateFeatures(newfeatures, svi);\r\n if (tract === 'census' && usState) {\r\n //ΔVΔVΔ: I don't know why clearing the styles fixes the county/overlay issue\r\n decorated = decorated.map((f) => {\r\n f.setStyle(outlineCounty);\r\n return f;\r\n });\r\n }\r\n setFeatures(decorated);\r\n success(decorated);\r\n };\r\n\r\n //switching from state to national causes double render\r\n const refreshSVI = async () => {\r\n const svi = await getSvi(fips);\r\n let decorated = decorateFeatures(features, svi);\r\n //if cenus and state set outline\r\n if (tract === 'census' && usState) {\r\n //ΔVΔVΔ: I don't know why clearing the styles fixes the county/overlay issue\r\n decorated = decorated.map((f) => {\r\n f.setStyle(outlineCounty);\r\n return f;\r\n });\r\n }\r\n setFeatures(decorated.slice(0)); // using slice tells react to treat the features as a new reference and trigger render listen\r\n };\r\n const getDefaultStyle = (svi = {}) => {\r\n var zoom = map.getView().getZoom();\r\n let zoomStyle = zoom > 6 ? outlineCounty : outlineCountyLow;\r\n return isEmpty(svi) && zoomStyle;\r\n };\r\n const featureWithinScope = (shape) => {\r\n if (scope == 'national') return true;\r\n if (!usState) return false;\r\n const fips = shape.get('FIPS') || shape.get('STATEFP');\r\n return fips.substr(0, 2) === usState.id + '';\r\n };\r\n const getStyleFromFeature = (shape) => {\r\n if (!featureWithinScope(shape)) return mapStyles.outOfScope;\r\n const val = shape.get('sviValues')['theme' + theme.id];\r\n return theme.colorScheme[val] || mapStyles.noData;\r\n };\r\n const restyleFeatures = (features) => {\r\n features.forEach((shape) => {\r\n let sviStyle = getStyleFromFeature(shape);\r\n if (typeof sviStyle == 'object') shape.setStyle(sviStyle);\r\n });\r\n };\r\n const outlineFeatures = (features) => {\r\n var zoom = map.getView().getZoom();\r\n let boundsStyle = zoom > 6 ? outlineCounty : outlineCountyLow;\r\n features.forEach((shape) => {\r\n shape.setStyle(boundsStyle);\r\n });\r\n return features;\r\n };\r\n const refreshColors = () => {\r\n if (tract === 'census') {\r\n outlineFeatures(features);\r\n } else {\r\n restyleFeatures(features);\r\n }\r\n setFeatures(features.slice(0));\r\n };\r\n return (\r\n {\r\n setLoadStatus(0);\r\n refreshFeatures(success, failure);\r\n }}\r\n zIndex={zIndex}\r\n map={map}\r\n onPreRender={setBlendMode}\r\n onAdded={(lyr) => setLyr(lyr)}\r\n />\r\n );\r\n};\r\nexport default CountyLayer;\r\n","import { circleStyle } from './MapVectorStyles.js';\r\nimport Feature from 'ol/Feature';\r\nimport Point from 'ol/geom/Point';\r\n\r\nconst CircleFeature = (props) => {\r\n const { x, y, val, size, color, info, textColor = '#000', offset, data } = props;\r\n\r\n const cirFeat = new Feature({\r\n geometry: new Point([x, y]),\r\n poi: true,\r\n info,\r\n count: val,\r\n data\r\n });\r\n cirFeat.setStyle(circleStyle(val, size, color, textColor, offset));\r\n return cirFeat;\r\n};\r\n\r\nexport default CircleFeature;\r\n\r\nconst bubbleZoomSizeMatrix = {\r\n 2: {\r\n subdivide: 100,\r\n pixelRange: [30, 40],\r\n valueScaling: [300, 3000]\r\n },\r\n 3: {\r\n subdivide: 100,\r\n pixelRange: [30, 40],\r\n valueScaling: [100, 3000]\r\n },\r\n 4: {\r\n subdivide: 100,\r\n pixelRange: [30, 40],\r\n valueScaling: [100, 1000]\r\n },\r\n 5: {\r\n subdivide: 100,\r\n pixelRange: [30, 40],\r\n valueScaling: [100, 1000]\r\n },\r\n 6: {\r\n subdivide: 50,\r\n pixelRange: [30, 50],\r\n valueScaling: [50, 800]\r\n },\r\n 7: {\r\n subdivide: 50,\r\n pixelRange: [30, 50],\r\n valueScaling: [5, 300]\r\n },\r\n 8: {\r\n subdivide: 10,\r\n pixelRange: [30, 70],\r\n valueScaling: [1, 150]\r\n },\r\n 9: {\r\n subdivide: 10,\r\n pixelRange: [30, 70],\r\n valueScaling: [1, 100]\r\n },\r\n 10: {\r\n subdivide: 1,\r\n pixelRange: [30, 70],\r\n valueScaling: [1, 50]\r\n },\r\n 11: {\r\n subdivide: 1,\r\n pixelRange: [30, 70],\r\n valueScaling: [1, 30]\r\n },\r\n 12: {\r\n subdivide: 1,\r\n pixelRange: [40, 70],\r\n valueScaling: [1, 10]\r\n },\r\n 13: {\r\n subdivide: 1,\r\n pixelRange: [40, 70],\r\n valueScaling: [1, 10]\r\n },\r\n 14: {\r\n subdivide: 1,\r\n pixelRange: [40, 70],\r\n valueScaling: [1, 10]\r\n },\r\n 15: {\r\n subdivide: 1,\r\n pixelRange: [40, 70],\r\n valueScaling: [1, 10]\r\n }\r\n};\r\nexport { bubbleZoomSizeMatrix };\r\n\r\nconst PoiBubble = (props) => {\r\n const { x, y, data, poiInfo, map } = props;\r\n const { color, textColor } = poiInfo;\r\n const zoom = Math.floor(map.getView().getZoom());\r\n const size = calculateBubbleSize(data.length, zoom);\r\n\r\n return CircleFeature({\r\n x,\r\n y,\r\n color,\r\n textColor,\r\n val: data.length,\r\n size,\r\n info: poiInfo,\r\n data\r\n });\r\n};\r\n\r\nexport { PoiBubble };\r\n\r\nconst convertRange = (value, r1, r2) => ((value - r1[0]) * (r2[1] - r2[0])) / (r1[1] - r1[0]) + r2[0];\r\nexport { convertRange };\r\n\r\nconst calculateBubbleSize = (val, zoom) => {\r\n const bubbleLimits = bubbleZoomSizeMatrix[zoom];\r\n const minimumValueScale = bubbleLimits.valueScaling[0];\r\n const maximumValueScale = bubbleLimits.valueScaling[1];\r\n let valWithinRange;\r\n valWithinRange = Math.max(val, minimumValueScale);\r\n valWithinRange = Math.min(val, maximumValueScale);\r\n return Math.ceil(convertRange(valWithinRange, bubbleLimits.valueScaling, bubbleLimits.pixelRange)); //* 1.75;\r\n};\r\n","import { findCenter, distanceBetweenPoints } from '../model/DataTransformation';\r\n\r\n//Possibly no longer needed\r\nconst distanceMapListToObject = (list) => {\r\n return list.reduce((dmap, row) => {\r\n let { pointA, pointB, DIST } = row;\r\n if (!(pointA in dmap)) dmap[pointA] = {};\r\n dmap[pointA][pointB] = DIST;\r\n return dmap;\r\n }, {});\r\n};\r\nexport { distanceMapListToObject };\r\n\r\nconst getAllIdsFromDistanceMap = (data) => {\r\n return data.reduce((ids, p) => {\r\n ids.add(p.pointA);\r\n ids.add(p.pointB);\r\n return ids;\r\n }, new Set());\r\n};\r\nexport { getAllIdsFromDistanceMap };\r\n\r\n//ΔVΔVΔ: Transform distance map to an object of ids with the best matching distances\r\nconst optimizeDistanceMap = (dmap) => {\r\n var range = Infinity;\r\n var rowsInRange = dmap.filter((p) => p.DIST <= range);\r\n\r\n var ordered = rowsInRange.sort((a, b) => {\r\n return a.DIST - b.DIST;\r\n });\r\n\r\n let row = ordered.pop();\r\n let addSet = new Set();\r\n let distObj = {};\r\n while (row) {\r\n let { pointA, pointB, DIST } = row;\r\n if (!(pointA in distObj)) distObj[pointA] = {};\r\n distObj[pointA][pointB] = DIST;\r\n addSet.add(pointA);\r\n addSet.add(pointB);\r\n ordered = ordered.filter((r) => {\r\n return r.pointA != pointB && r.pointB != pointB;\r\n });\r\n row = ordered.pop();\r\n }\r\n return distObj;\r\n};\r\nexport { optimizeDistanceMap };\r\n\r\n//ΔVΔVΔ: Transform a list of pois with the attributes: (ID,x,y) to a distance map with schema: {pointA,pointB,DIST}\r\nconst createBasicDistanceMap = (poilist) => {\r\n var dmap = [];\r\n for (var i = 0; i < poilist.length; i++) {\r\n var pointA = poilist[i].ID;\r\n var pointACoords = [poilist[i].x, poilist[i].y];\r\n for (var j = i + 1; j < poilist.length; j++) {\r\n var pointB = poilist[j].ID;\r\n var pointBCoords = [poilist[j].x, poilist[j].y];\r\n var DIST = distanceBetweenPoints(pointACoords, pointBCoords);\r\n dmap.push({ pointA, pointB, DIST });\r\n }\r\n }\r\n return dmap;\r\n};\r\nexport { createBasicDistanceMap };\r\n\r\nconst createDistanceMap = (poilist, range = 1e11) => {\r\n var dmap = [];\r\n console.time('count');\r\n for (var i = 0; i < poilist.length; i++) {\r\n var k = i % 1000;\r\n if (k == 0) {\r\n console.log(i);\r\n console.timeLog('count');\r\n }\r\n var pointA = poilist[i].ID;\r\n var pointACoords = [poilist[i].x, poilist[i].y];\r\n for (var j = i + 1; j < poilist.length; j++) {\r\n var pointB = poilist[j].ID;\r\n var pointBCoords = [poilist[j].x, poilist[j].y];\r\n var DIST = distanceBetweenPoints(pointACoords, pointBCoords);\r\n if (DIST < range) dmap.push({ pointA, pointB, DIST });\r\n }\r\n }\r\n return dmap;\r\n};\r\nexport { createDistanceMap };\r\n\r\nconst minMaxDistFromMap = (list, minimum = 1000, cap = 0, key = 'DIST') => {\r\n //return ,min,max,count\r\n return list.reduce(\r\n (out, line) => {\r\n let d = line[key];\r\n if (cap && d > cap) return out;\r\n if (d < minimum) return out;\r\n return [Math.min(out[0], d), Math.max(out[1], d), out[2] + 1];\r\n },\r\n [Infinity, 0, 0]\r\n );\r\n};\r\nexport { minMaxDistFromMap };\r\n\r\n// ΔVΔVΔ: Use to filter out tile data by individual POI\r\n// ΔVΔVΔ: Helper function for testing\r\nconst reduceTileLookupData = (tileData, mapFn = () => {}) => {\r\n return tileData.reduce((outputTileArr, tile) => {\r\n const reducedList = tile.list.reduce((outputPoiList, poi) => {\r\n const newPOI = mapFn && poi && mapFn(poi);\r\n if (newPOI) outputPoiList.push(newPOI);\r\n return outputPoiList;\r\n }, []);\r\n\r\n if (reducedList.length) outputTileArr.push({ count: reducedList.length, key: tile.key, list: reducedList });\r\n return outputTileArr;\r\n }, []);\r\n};\r\nexport { reduceTileLookupData };\r\n\r\nconst pointDensityMap = (list, range, muliplier = 1) => {\r\n // list = {pointA,pointB,DIST}\r\n var ids = new Set();\r\n var chart = [];\r\n // const linesInRange = distances.filter((ln) => ln.DIST < d);\r\n for (var item of list) {\r\n const point = item.pointA;\r\n if (!ids.has(point)) {\r\n ids.add(point);\r\n const lines = list.filter((line) => line.DIST < range && line.pointA === point);\r\n const mass = lines.length;\r\n const totalDistance = lines.reduce((val, line) => {\r\n return (val += line.DIST);\r\n }, 0);\r\n const averageDistance = totalDistance / mass;\r\n const volume = averageDistance;\r\n //volume is actually the range (or max range)\r\n let density = (mass / volume) * muliplier;\r\n density = density == Infinity ? 0 : density;\r\n chart.push({ point: point, mass, density, volume, lines });\r\n }\r\n }\r\n return chart.sort((a, b) => b.mass - a.mass);\r\n // return chart.sort((a, b) => b.density - a.density);\r\n // return chart.sort((a, b) => b.mass + b.density - a.mass + a.density);\r\n};\r\nexport { pointDensityMap };\r\n\r\nconst pointDensityMap2 = (list, range) => {\r\n // list = {pointA,pointB,DIST}\r\n var ids = new Set();\r\n var chart = [];\r\n var orderedListInRange = list.filter((ln) => ln.DIST < range).sort((a, b) => a.DIST - b.DIST);\r\n for (var item of list) {\r\n const point = item.pointA;\r\n if (!ids.has(point)) {\r\n ids.add(point);\r\n // console.log(point, point == '1222318878');\r\n let dd = point == '1222318878';\r\n\r\n const lines = orderedListInRange.filter((line) => line.DIST < range && line.pointA === point);\r\n const mass = Math.max(lines.length, 1);\r\n const totalDistance = lines.reduce((val, line) => {\r\n return (val += line.DIST);\r\n }, 0);\r\n // if (!lines.length) {\r\n // console.log(\r\n // 'lines length:',\r\n // lines.length,\r\n // 'basicLines =>',\r\n // list.filter((line) => line.pointA === point)\r\n // );\r\n // }\r\n const volume = totalDistance / mass; //volume is average distance\r\n // console.log('ms', mass, 'aveD', Math.floor(volume), 'total D', totalDistance, 'av is larger?', volume > totalDistance);a\r\n dd && console.table({ lines, mass, totalDistance, volume });\r\n\r\n chart.push({ point: point, mass, volume, lines });\r\n }\r\n }\r\n var total_mass = chart.length;\r\n const calculateG = (ln) => {\r\n var massPer = (ln.mass / total_mass) * 300;\r\n var density = ((range - ln.volume) / range) * 10;\r\n return density + massPer;\r\n };\r\n chart = chart.map((ln) => {\r\n ln.g = calculateG(ln);\r\n return ln;\r\n });\r\n\r\n return chart.sort((a, b) => b.g - a.g);\r\n // return chart.sort((a, b) => b.mass - a.mass);\r\n};\r\n\r\nexport { pointDensityMap2 };\r\n\r\nconst clusterMapByDensity = (dmap) => {\r\n var allocatedIDs = new Set();\r\n var clusters = [];\r\n for (var line of dmap) {\r\n const { point, lines } = line;\r\n if (!allocatedIDs.has(point)) {\r\n allocatedIDs.add(point);\r\n var unusedLines = lines.filter((ln) => !allocatedIDs.has(ln.pointB)).map((ln) => ln.pointB);\r\n var data = [point];\r\n for (var pt of unusedLines) {\r\n allocatedIDs.add(pt);\r\n data.push(pt);\r\n }\r\n clusters.push({ point, data });\r\n }\r\n }\r\n return clusters;\r\n};\r\nexport { clusterMapByDensity };\r\n\r\nconst clusterMapByDensityAndRange = (dmap, range) => {\r\n var allocatedIDs = new Set();\r\n var clusters = [];\r\n for (var line of dmap) {\r\n const { point, lines } = line;\r\n if (!allocatedIDs.has(point)) {\r\n allocatedIDs.add(point);\r\n var unusedLines = lines.filter((ln) => !allocatedIDs.has(ln.pointB) && ln.DIST < range).map((ln) => ln.pointB);\r\n if (lines.length) {\r\n console.log('Total lines', lines);\r\n const linesInRange = lines.filter((ln) => ln.DIST < range).map((ln) => ln.pointB);\r\n console.log('in range: ', range, linesInRange);\r\n console.log(unusedLines);\r\n }\r\n var data = [point];\r\n for (var pt of unusedLines) {\r\n allocatedIDs.add(pt);\r\n data.push(pt);\r\n }\r\n clusters.push({ point, data });\r\n }\r\n }\r\n return clusters;\r\n};\r\nexport { clusterMapByDensityAndRange };\r\n\r\nconst bubbleMapByDistance = (distance, densityMap) => {\r\n var allocatedIDs = new Set();\r\n for (var row of densityMap) {\r\n const { point, lines } = row;\r\n if (!allocatedIDs.has(point)) {\r\n allocatedIDs.add(point);\r\n const linesInRange = lines.filter((ln) => {\r\n return ln.DIST < distance && !allocatedIDs.has(ln.pointB);\r\n });\r\n for (var ln in linesInRange) {\r\n allocatedIDs.add(ln.pointB);\r\n }\r\n }\r\n }\r\n};\r\n\r\nconst getCoordsFromList = (list) => list.map((poi) => [poi.x, poi.y]);\r\nexport { getCoordsFromList };\r\n\r\nconst findCenterOfList = (list) => {\r\n return findCenter(getCoordsFromList(list));\r\n};\r\nexport { findCenterOfList };\r\n\r\nconst findCenterPixelFromList = (list, map) => {\r\n const center = findCenterOfList(list);\r\n return map.getPixelFromCoordinate(center).map((i) => Math.floor(i));\r\n};\r\nexport { findCenterPixelFromList };\r\n","import { OneMapApiDataService } from '../model/OneMapApiDataService';\r\nimport { useState, useEffect, useContext, useCallback } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport MapContext from '../controller/MapProvider';\r\nimport { staticPOIList } from '../model/StaticVariables';\r\nimport CircleFeature, { PoiBubble, bubbleZoomSizeMatrix } from './CircleFeature';\r\nimport * as DT from '../model/DataTransformation';\r\nimport { VectorLayer } from './Layer';\r\nimport { DevDataService } from '../model/DevDataService';\r\nimport { convertGeometryToFeatures } from '../controller/LayerQueries';\r\nimport * as POI from '../model/POI_model';\r\nimport * as DM from '../model/DistanceMap';\r\n\r\nvar state_data_cache = false;\r\nvar cached_poilookups = {};\r\n\r\nconst PoiLayer = (props) => {\r\n const { map, type, minZoom, onLoadStatus = () => {}, zIndex } = props;\r\n const context = useContext(InterfaceContext);\r\n const { year } = context;\r\n const { tiles, zoomRead: zoom } = useContext(MapContext);\r\n const visible = context[type];\r\n const [features, setFeatures] = useState([]);\r\n const title = 'poi_' + type;\r\n const [loadStatus, setLoadStatus] = useState(1);\r\n const poiInfo = staticPOIList.find((poi) => poi.slug === type);\r\n const DS = new OneMapApiDataService();\r\n const DDS = new DevDataService();\r\n\r\n // Create POI cache for type\r\n if (!(type in cached_poilookups)) {\r\n cached_poilookups[type] = {};\r\n }\r\n const loadStateGeometry = async () => {\r\n if (state_data_cache) return state_data_cache;\r\n var json = await DDS.getGeometryData({ scope: 'state' });\r\n state_data_cache = convertGeometryToFeatures(json[0], 'topojson');\r\n };\r\n const getStateGeometry = (ST) => {\r\n if (!ST) return false;\r\n return state_data_cache.find((f) => f.get('STUSPS') === ST);\r\n };\r\n\r\n const poiDataLookups = {\r\n tiles: async () => {\r\n return await fetchGeometry({ scope: type, tilesObj: tiles });\r\n },\r\n tileListFilteredByDistanceMap: async (distanceMap) => {\r\n var useIDs = POI.getAllIdsFromDistanceMap(distanceMap);\r\n const tileLookupData = await fetchGeometry({ scope: type, tilesObj: tiles });\r\n return POI.reduceTileLookupData(tileLookupData, (poi) => {\r\n return useIDs.has(poi.ID) && poi;\r\n });\r\n },\r\n poiListFilterdBuDistanceMap: async (distanceMap) => {\r\n var useIDs = POI.getAllIdsFromDistanceMap(distanceMap);\r\n var tileLookupData = await fetchGeometry({ scope: type, tilesObj: tiles });\r\n return tileLookupData\r\n .map((tile) => tile.list)\r\n .flat()\r\n .filter((row) => useIDs.has(row.ID));\r\n }\r\n };\r\n\r\n const generateFeatures = async () => {\r\n var tileLookupData = await fetchGeometry({ scope: type, tilesObj: tiles });\r\n const formattedPoiData = formatGeometry(tileLookupData);\r\n const features = poiClusterToFeatures(formattedPoiData);\r\n return features;\r\n };\r\n\r\n //##@@\r\n const generateFeaturesMergeUsingDistanceMap = async () => {\r\n const distances = await DM.loadSqlDistanceMap(type);\r\n if (!cached_poilookups) {\r\n // cached_poilookups = await fetchGeometry({ scope: type, tilesObj: tiles });\r\n cached_poilookups = await poiDataLookups.tileListFilteredByDistanceMap(distances);\r\n }\r\n var tileLookupData = cached_poilookups;\r\n const formattedPoiData = formatGeometryWithDistanceMap(tileLookupData, distances);\r\n console.log('formatteddata', formattedPoiData);\r\n const features = poiClusterToFeatures(formattedPoiData);\r\n return features;\r\n };\r\n\r\n const pointIsWithinUsState = (point) => {\r\n var states = point.data.reduce((list, p) => {\r\n list.add(p.STATE);\r\n return list;\r\n }, new Set());\r\n return Array.from(states).find((s) => {\r\n var stateFeature = getStateGeometry(s);\r\n if (!stateFeature) return false;\r\n var stgeo = stateFeature.getGeometry();\r\n var isIntersecting = stgeo.intersectsCoordinate([point.x, point.y]);\r\n return isIntersecting;\r\n });\r\n };\r\n const movePointToState = (point) => {\r\n var stategeo = getStateGeometry(point.data[0].STATE).getGeometry();\r\n var newCenter = stategeo.getClosestPoint([point.x, point.y]);\r\n point.x = newCenter[0];\r\n point.y = newCenter[1];\r\n return point;\r\n };\r\n const preventPointsFromBeingInWater = (points) => {\r\n // for now we are going to loop through all US states;\r\n // ideally use a single US feature\r\n const keepPointOnDryLand = (point) => {\r\n const stateWithin = pointIsWithinUsState(point);\r\n if (stateWithin) return point;\r\n return movePointToState(point);\r\n };\r\n return points.map((point) => keepPointOnDryLand(point));\r\n };\r\n\r\n const refreshLayer = async () => {\r\n if (!map || !Object.keys(tiles).length || loadStatus === 0) return;\r\n setLoadStatus(0);\r\n const features = await generateFeatures();\r\n // const features = await generateFeaturesDistMapSimple();\r\n // const features = await generateFeaturesDistMap();\r\n // const features = await generateFeaturesDistMapDevVersion();\r\n // const features = await generateFeaturesFromSqlDistanceMaps();\r\n // const features = await generateFeaturesMergeUsingDistanceMap();\r\n setFeatures(features);\r\n setLoadStatus(1);\r\n };\r\n\r\n const poiClusterToFeatures = (poiClusters = []) => {\r\n if (!poiClusters.length) return [];\r\n\r\n return poiClusters.reduce((output, poiGroup) => {\r\n if (poiGroup.data.length) {\r\n const { x, y, data } = poiGroup;\r\n output.push(PoiBubble({ x, y, data, poiInfo, map }));\r\n }\r\n return output;\r\n }, []);\r\n };\r\n const mergePointsByPixel = (clusters, pixelRange = 20) => {\r\n //expect input [{x,y,data:[]}]\r\n let restClusters = [...clusters];\r\n let clusterA = restClusters.pop();\r\n let loop = 0;\r\n const boundary = 1000;\r\n const outputClusters = [];\r\n\r\n while (clusterA && loop < boundary) {\r\n let clusterResults = separatePointsByRange(clusterA, restClusters, pixelRange);\r\n let merged = mergeClusters([clusterA, ...clusterResults[0]]);\r\n outputClusters.push(merged);\r\n restClusters = clusterResults[1];\r\n clusterA = restClusters.pop();\r\n loop++;\r\n }\r\n return outputClusters;\r\n };\r\n //merge by pixel, loops through clusters (tiles made to clusters) works recusively\r\n //uses separatePointsByRange => is actually separate clusters by range\r\n //mergeClusters => just taking points and putting together no distance matching\r\n //##@@\r\n const mergePointsByDistanceMap = (clusters, pixelRange, distances) => {\r\n //expect input [{x,y,data:[]}]\r\n let restClusters = [...clusters.slice(0, 1000)];\r\n let clusterA = restClusters.pop();\r\n let loop = 0;\r\n const boundary = clusters.length;\r\n const outputClusters = [];\r\n console.log('=======================================');\r\n console.log('>>> Start merge: cluster#', restClusters.length);\r\n console.time('merge');\r\n while (clusterA && loop < boundary) {\r\n let clusterResults = findClustersInOutOfRange(clusterA, restClusters, pixelRange, distances);\r\n let merged = mergeClusters([clusterA, ...clusterResults[0]]);\r\n outputClusters.push(merged);\r\n restClusters = clusterResults[1];\r\n clusterA = restClusters.pop();\r\n loop++;\r\n }\r\n console.log('>>> End Merge');\r\n console.timeEnd('merge');\r\n // console.log('max loop', loop);\r\n return outputClusters;\r\n };\r\n //##@@\r\n const getMeterRange = (pixelRange, map) => map.getView().getResolution() * pixelRange;\r\n\r\n const findClustersInOutOfRange = (cluster, rest, pixelRange, distances, skipsql = false) => {\r\n /*\r\n fn goal: cluster is a cluster, rest is a cluster, \r\n compare the distances between cluster and each item in rest\r\n sort the items in rest into 2 arrays, within and without\r\n return within and without\r\n\r\n */\r\n let within = [];\r\n let without = [];\r\n let withinDist = 0;\r\n let meterRange = getMeterRange(pixelRange, map);\r\n console.log('zoom', Math.floor(map.getView().getZoom()), 'meter range', meterRange);\r\n const pAID = cluster.data[0].ID;\r\n const lineHasPoint = (ln, pt) => ln.pointA === pt || ln.pointB === pt;\r\n const linesWithA = distances.filter((ln) => lineHasPoint(ln, pAID));\r\n // console.log('Lines with A', pAID, linesWithA);\r\n\r\n /*\r\n need to compare distance calclations here.\r\n - all matching points when using distance map are outside of the range\r\n - this doesn't happen for pixel comparisons\r\n - if we didn't use pixel ranges would we get the same results?\r\n - lets take some samples and\r\n 0. compare results using non-square root and range * range vs square root + range\r\n 1. compare pixel distances to meter distances, see how many are in vs out, check IDS\r\n 2. compare meter distances from DT fn to the results in distance map\r\n 3. Filter inital data using distance map mathing IDs only\r\n */\r\n\r\n for (var i = 0; i < rest.length; i++) {\r\n let pointB = rest[i];\r\n let pBID = rest[i].data[0].ID;\r\n\r\n // let matchingLine = false;\r\n // let matchingLine = linesWithA.find((ln) => lineHasPoint(ln, pBID));\r\n\r\n const pointIsWithinRangeInDistanceMap = (point, range, distanceMap) => {\r\n let matchingLine = distanceMap.find((ln) => lineHasPoint(ln, pBID));\r\n //sql generated distances are sqrt so range is not multiplied by itself\r\n return matchingLine.DIST < range;\r\n };\r\n\r\n let matchingLine = linesWithA.find((ln) => lineHasPoint(ln, pBID));\r\n\r\n // if (false) {\r\n if (matchingLine && !skipsql) {\r\n // let sqlD = Math.floor(matchingLine.DIST);\r\n // let sqlP = matchingLine.DIST * matchingLine.DIST;\r\n // let d = DT.distanceBetweenPoints([cluster.x, cluster.y], [pointB.x, pointB.y]);\r\n // // let D = DT.distanceBetweenPoints([cluster.x, cluster.y], [pointB.x, pointB.y], true);\r\n // // console.log('Calc D SQRT', D, 'nonsqrt', d, 'Pre-genD', matchingLine.DIST);\r\n // // console.log('Calc d', d, 'SQL d', sqlD, 'diff', d - sqlD, 'ratio', d / sqlD, 'Sql**', sqlP);\r\n if (matchingLine.DIST < meterRange) {\r\n within.push(pointB);\r\n // withinDist++;\r\n } else {\r\n without.push(pointB);\r\n }\r\n } else {\r\n if (DT.pointsAreWithinRange([cluster.x, cluster.y], [pointB.x, pointB.y], meterRange)) {\r\n within.push(pointB);\r\n } else {\r\n without.push(pointB);\r\n }\r\n }\r\n }\r\n // console.log('within', within.length, ' withinSQL', withinDist);\r\n // console.log('within', within.length);\r\n // console.log('mathcing', matching);\r\n // console.log('**********************************');\r\n return [within, without];\r\n };\r\n /*\r\n Results of distance comparrisons\r\n - when using square root method ie range is not multiplied by itself but sqrt is used, it's somewhat slower but not more accurate. Using range * itself is better\r\n - when using meters, out of 288 comparisons 207 clusters had the same number of points regardless of method of calc 81 were different\r\n - 43 clusters had more using meter calcs \r\n - 38 clusters had more using pixel calcs\r\n - \r\n //without sqrt 1.2sec\r\n //with sqrt 1.8sec\r\n //288 loops\r\n\r\n Results comparing calulations vs distance map\r\n - distances are very different when running calculations, but maybe that is because of the way that is it being called recusively? though it looks like its not calling recursively\r\n - even when comparing ranges, taking into account the sqrt vs pow issue it seems like the dstances are very different\r\n\r\n - The odd mismatch from above is because of a code type where pointA was not being matched, so it was just looking at point B\r\n - However the next issue is that when pulling all IDs from the distance map, not all those ids seem to match to each other\r\n \r\n \r\n */\r\n\r\n const getPixelCoordsFromCluster = (c) => {\r\n return map.getPixelFromCoordinate([c.x, c.y]).map((i) => Math.floor(i));\r\n };\r\n const mergeClusters = (clusters) => {\r\n const data = clusters.reduce((compiled, clust) => {\r\n return [...compiled, ...clust.data];\r\n }, []);\r\n const { x, y } = clusters[0];\r\n return { x, y, data }; //empty for now\r\n };\r\n\r\n const separatePointsByRange = (pointA, rest, range) => {\r\n let within = [];\r\n let without = [];\r\n let ca = getPixelCoordsFromCluster(pointA);\r\n let all = [];\r\n for (var i = 0; i < rest.length; i++) {\r\n let pointB = rest[i];\r\n let rrange = range * range;\r\n let cb = getPixelCoordsFromCluster(pointB);\r\n let d = DT.distanceBetweenPoints(ca, cb);\r\n if (d < rrange) {\r\n cb.push(1);\r\n within.push(pointB);\r\n } else {\r\n without.push(pointB);\r\n }\r\n all.push(cb);\r\n }\r\n\r\n return [within, without];\r\n };\r\n\r\n const groupSplit = (data, size) => {\r\n var statememo = {};\r\n data.map((tilePoiData) => DT.groupPoiByState(tilePoiData.list, statememo, 'object'));\r\n var output = [];\r\n for (let st of Object.keys(statememo)) {\r\n var chunks = DT.chunkArray(statememo[st].data, size);\r\n for (let i = 0; i < chunks.length; i++) {\r\n let chunk = chunks[i];\r\n let centers = chunk.map((c) => [c.x || c.geometry.x, c.y || c.geometry.y]);\r\n let center = DT.findCenter(centers);\r\n\r\n var obj = {\r\n x: center[0],\r\n y: center[1],\r\n data: chunk\r\n };\r\n output.push(obj);\r\n }\r\n }\r\n return output;\r\n };\r\n\r\n const separatePoiDataByZoom = (data) => {\r\n const zoom = Math.floor(map.getView().getZoom());\r\n const chunksize = bubbleZoomSizeMatrix[zoom].subdivide;\r\n if (chunksize !== 1) {\r\n // var split = separatePreClustersByState(data, chunk);\r\n // var splitClusters = convertPreClustersToClusters(split);\r\n // return splitClusters;\r\n return groupSplit(data, chunksize);\r\n } else {\r\n return data.reduce((output, tilePoiData) => (output = [...output, ...DT.groupAsSingle(tilePoiData, 'array')]), []);\r\n }\r\n };\r\n //##@@\r\n const separatePoiData = (data) => {\r\n return data.reduce((output, tilePoiData) => (output = [...output, ...DT.groupAsSingle(tilePoiData, 'array')]), []);\r\n };\r\n\r\n const formatGeometry = (data) => {\r\n if (!data.length) return;\r\n let grouped = separatePoiDataByZoom(data);\r\n const merged = mergePointsByPixel(grouped, 40);\r\n return preventPointsFromBeingInWater(merged);\r\n };\r\n const getAllMeterRanges = (pixels = 40) => {\r\n const ranges = [];\r\n for (var zoom = 2; zoom < 15 + 1; zoom++) {\r\n var res = map.getView().getResolutionForZoom(zoom);\r\n var range = res * pixels;\r\n ranges.push({ zoom, range });\r\n }\r\n return ranges;\r\n };\r\n //##@@\r\n const formatGeometryWithDistanceMap = (data, distances) => {\r\n if (!data.length) return;\r\n //convert tiles to clusters\r\n let grouped = separatePoiData(data);\r\n console.log('view', map.getView());\r\n console.log('ranges', getAllMeterRanges());\r\n // console.log('merged', grouped); //5 tiles = 5 clusters\r\n const merged = mergePointsByDistanceMap(grouped, 40, distances);\r\n return preventPointsFromBeingInWater(merged);\r\n };\r\n\r\n const fetchPoiDataByExtent = async (key, bbox) => {\r\n const onMapExtent = { x1: bbox[0], y1: bbox[1], x2: bbox[2], y2: bbox[3] };\r\n if (key in cached_poilookups) {\r\n return cached_poilookups[type][key];\r\n }\r\n const data = await DS.getPOIData({ scope: type, extent: onMapExtent, year, tileKey: key, blacklist: poiInfo.blacklist }).then((res) => {\r\n return {\r\n list: res.map((item) => {\r\n let {\r\n geometry: { x, y },\r\n attributes: { ID, NAME, ADDRESS, CITY, STATE, COUNTY, ZIP }\r\n } = item;\r\n return { x, y, ID, NAME, ADDRESS, CITY, STATE, COUNTY, ZIP };\r\n })\r\n };\r\n });\r\n cached_poilookups[type][key] = data;\r\n return data;\r\n };\r\n const fetchCoords = useCallback(\r\n async (usstate) => {\r\n return DS.getPOICoords({ scope: type, usstate }).then((res) => {\r\n return res.map((item) => {\r\n let {\r\n geometry: { x, y },\r\n attributes: { ID, OBJECTID }\r\n } = item;\r\n return { ID: ID || OBJECTID, x, y };\r\n });\r\n });\r\n },\r\n [type]\r\n );\r\n\r\n const fetchGeometry = useCallback(async () => {\r\n const promises = Object.keys(tiles).map((key) => {\r\n return fetchPoiDataByExtent(key, tiles[key]);\r\n });\r\n await loadStateGeometry();\r\n return Promise.all(promises).then((res) => {\r\n return res.flat().filter((call) => call.list.length > 0);\r\n });\r\n }, [tiles, type]);\r\n\r\n const validateZoom = () => {\r\n let floorZoom = Math.floor(zoom);\r\n let tileZ = Object.keys(tiles)[0];\r\n let iz = tileZ?.indexOf('x');\r\n let zt = tileZ?.substring(2, iz);\r\n return floorZoom + '' === zt || floorZoom < minZoom;\r\n };\r\n\r\n useEffect(() => onLoadStatus(loadStatus), [loadStatus]);\r\n useEffect(async () => {\r\n if (!tiles || !visible) return;\r\n if (!map || !Object.keys(tiles).length || loadStatus === 0) return;\r\n if (!validateZoom()) return;\r\n refreshLayer();\r\n }, [tiles, visible, zoom]);\r\n\r\n return ;\r\n};\r\nexport default PoiLayer;\r\n","import React from \"react\";\r\nconst MapControls = (props) => {\r\n const {children} = props;\r\n\r\n return
{ React.Children.map(children, (child, index) => {\r\n if (React.isValidElement(child)) {\r\n const ops = Object.assign({},props)\r\n delete ops.children;\r\n return React.cloneElement(child, { ...ops });\r\n }\r\n return child;\r\n })}
;\r\n};\r\nexport default MapControls;\r\n","import { useEffect } from 'react';\r\nimport Zoom from 'ol/control/Zoom';\r\n\r\nconst ZoomControl = ({ map, onChange }) => {\r\n useEffect(() => {\r\n if (!map) return;\r\n let zoomScreenControl = new Zoom();\r\n map.controls.push(zoomScreenControl);\r\n zoomScreenControl.on('change', () => {\r\n console.log('change');\r\n });\r\n return () => map.controls.remove(zoomScreenControl);\r\n }, [map]);\r\n return null;\r\n};\r\nexport default ZoomControl;\r\n","import { useEffect } from \"react\";\r\nimport { Control as olControl } from \"ol/control\";\r\nimport { renderToString } from \"react-dom/server\";\r\n\r\nconst Control = ({ className, map, onMount, clickHandler = () => {}, children }) => {\r\n\r\n const element = document.createElement(\"div\");\r\n element.setAttribute(\"class\", className + \" ol-unselectable ol-control\");\r\n element.onclick = (e) => clickHandler(e)\r\n\r\n useEffect(() => {\r\n if (!map) return;\r\n const tehcontrol = new olControl({\r\n element,\r\n render: () => {\r\n try {\r\n if(onMount){\r\n onMount(tehcontrol)\r\n }else{\r\n element.innerHTML = renderToString(children);\r\n }\r\n // onMount(tehcontrol)\r\n } catch (err) {}\r\n },\r\n });\r\n map.controls.push(tehcontrol);\r\n if(onMount) onMount(tehcontrol)\r\n return () => map.controls.remove(tehcontrol);\r\n }, [map]);\r\n\r\n return null;\r\n};\r\nexport default Control;\r\n","import TEXTS from '../controller/TextVariables';\r\nimport Control from '../controller/Control';\r\nimport { useContext } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\n\r\nconst DownloadControl = (props) => {\r\n const { map } = props;\r\n const { download } = TEXTS.controls;\r\n const className = 'download';\r\n const { showDownloadModal } = useContext(InterfaceContext);\r\n\r\n return (\r\n {\r\n showDownloadModal();\r\n }}\r\n >\r\n
\r\n \r\n
\r\n \r\n );\r\n};\r\nexport default DownloadControl;\r\n","import { useContext, useEffect, useState } from 'react';\r\nimport TEXTS from '../controller/TextVariables';\r\nimport Control from '../controller/Control';\r\nimport { renderToString } from 'react-dom/server';\r\nimport MapContext from '../controller/MapProvider';\r\n\r\nconst ZoomNumberControl = (props) => {\r\n const { zoomRead, map } = useContext(MapContext);\r\n const className = 'map-zoom-num';\r\n const [input, setInput] = useState(null);\r\n\r\n const sanitizeZoom = (z) => {\r\n let zoomStr = parseInt(z.replace(/[^0-9.]/g, ''));\r\n if (isNaN(zoomStr)) return '';\r\n return zoomStr;\r\n };\r\n const onInput = (e) => {\r\n let zoomStr = sanitizeZoom(e.target.value);\r\n if (zoomStr < 2) return;\r\n input.value = Math.floor(zoomStr);\r\n map.getView().setZoom(zoomStr * 1);\r\n // map.getView().dispatchEvent('change');\r\n // map.dispatchEvent('moveend');\r\n };\r\n const updateText = (z) => {\r\n if (!input) return;\r\n let zoomStr = sanitizeZoom(z);\r\n if (zoomStr < 2) return;\r\n input.value = Math.floor(zoomStr);\r\n };\r\n useEffect(() => updateText(zoomRead + ''), [zoomRead]);\r\n\r\n const controlAdded = (acontrol) => {\r\n const inp = acontrol.element.querySelector('input');\r\n if (input || inp) return;\r\n const inputSTR = renderToString(\r\n \r\n {}} />\r\n \r\n );\r\n acontrol.element.innerHTML = inputSTR;\r\n setInput(acontrol.element.querySelector('input'));\r\n };\r\n useEffect(() => {\r\n if (!input) return;\r\n input.addEventListener('input', onInput);\r\n return () => {\r\n input.removeEventListener('input', onInput);\r\n };\r\n }, [input]);\r\n\r\n return ;\r\n};\r\nexport default ZoomNumberControl;\r\n","import Control from '../controller/Control';\r\nimport TEXTS from '../controller/TextVariables';\r\n\r\nconst FullScreenControl = (props) => {\r\n const { map, onZoom = () => {}, initExtent } = props;\r\n const { reset_to_full_extent } = TEXTS.controls;\r\n\r\n const className = 'expand';\r\n\r\n const zoomTo = (e) => {\r\n map.getView().fit(initExtent, map.getSize());\r\n onZoom();\r\n };\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default FullScreenControl;\r\n","import { useContext, useEffect, useRef, useState } from 'react';\r\nimport TEXTS from '../controller/TextVariables';\r\nimport Control from '../controller/Control';\r\nimport { renderToString } from 'react-dom/server';\r\nimport { DragZoom } from 'ol/interaction';\r\nimport { click as mapclick } from 'ol/events/condition';\r\n\r\nconst ZoomSelect = (props) => {\r\n const { map } = props;\r\n const { zoom_select } = TEXTS.controls;\r\n const className = 'zoom-select';\r\n\r\n const boxZoomInInteraction = new DragZoom({\r\n className: 'zoom-select',\r\n condition: (e) => {\r\n return mapclick;\r\n },\r\n out: false\r\n });\r\n boxZoomInInteraction.values_.id = 'zoom-select';\r\n\r\n const enableDragZoom = () => {\r\n map.addInteraction(boxZoomInInteraction);\r\n document.querySelector('#panel-map').classList.add('zoom-select');\r\n };\r\n\r\n const disableDragZoom = () => {\r\n map.removeInteraction(boxZoomInInteraction);\r\n document.querySelector('#panel-map').classList.remove('zoom-select');\r\n };\r\n\r\n const toggleEnabled = (e) => {\r\n const btnCtrl = document.querySelector(`.${className} button.${className}`);\r\n btnCtrl.classList.toggle('on');\r\n if (btnCtrl.classList.contains('on')) {\r\n enableDragZoom();\r\n } else {\r\n disableDragZoom();\r\n }\r\n };\r\n\r\n const controlAdded = (acontrol) => {\r\n const inp = acontrol.element.querySelector('button');\r\n if (inp) return;\r\n const inputSTR = renderToString(\r\n \r\n );\r\n acontrol.element.innerHTML = inputSTR;\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n};\r\nexport default ZoomSelect;\r\n","import { mergeArcs } from 'topojson';\r\nimport { staticRegions } from '../model/StaticVariables';\r\n\r\n//json: topojson file\r\n//stateAbbbrArr: array of state abbreviations to whitelist ex: [\"NY\",\"NJ\"]\r\n//returns: original json altered, with geometry that matches state whitelist\r\nconst filterJsonByStates = (json, stateAbbrArr) => {\r\n var objectKeyName = Object.keys(json.objects)[0];\r\n var filteredObjects = json.objects[objectKeyName].geometries.reduce((out, st) => {\r\n const abbr = st.properties.STUSPS;\r\n if (stateAbbrArr.includes(abbr)) {\r\n out.push(st);\r\n }\r\n return out;\r\n }, []);\r\n const clonedData = JSON.parse(JSON.stringify(json));\r\n clonedData.objects[objectKeyName].geometries = filteredObjects;\r\n return clonedData;\r\n};\r\nexport { filterJsonByStates };\r\n//returns true if the geometry is in the specified region\r\nconst geometryIsWithinRegion = (geometry, regionID) => {\r\n const whiteListAbbr = staticRegions[regionID].states;\r\n const currentStAbbr = geometry.properties.STUSPS;\r\n return whiteListAbbr.includes(currentStAbbr);\r\n};\r\n//return a filtered array of all geometries that are within the specified region\r\nconst filterGeometryByRegion = (json, regionID) => {\r\n var objectKeyName = Object.keys(json.objects)[0];\r\n return json.objects[objectKeyName].geometries.reduce((out, geom) => {\r\n if (geometryIsWithinRegion(geom, regionID)) {\r\n out.push(geom);\r\n }\r\n return out;\r\n }, []);\r\n};\r\n//create a copy of a topojson that merges objects based on region.\r\n//each gometry object must have a STUSPS property that is a 2 digit state abbreviation\r\nconst mergeJsonByRegion = (json) => {\r\n const objectKeyName = Object.keys(json.objects)[0];\r\n const regions = staticRegions.filter((r) => r.hasOwnProperty('states')); //only state regions not hhs\r\n\r\n //clone data to prevent mutation\r\n const clonedJson = JSON.parse(JSON.stringify(json));\r\n clonedJson.objects[objectKeyName].geometries = [];\r\n\r\n //Loop through regions and merge states matching list in region\r\n for (let i = 0; i < regions.length; i++) {\r\n const regionGeometry = filterGeometryByRegion(json, i);\r\n const mergedRegion = mergeArcs(json, regionGeometry);\r\n mergedRegion.properties = { id: regions[i].id };\r\n clonedJson.objects[objectKeyName].geometries.push(mergedRegion);\r\n }\r\n return clonedJson;\r\n};\r\nexport { mergeJsonByRegion };\r\n","import { VectorLayer } from './Layer';\r\nimport { DevDataService } from '../model/DevDataService';\r\nimport { outlineState, outlineStateLow, outlineRegion, outlineRegionLow } from './MapVectorStyles.js';\r\nimport { useEffect, useState } from 'react';\r\nimport { convertGeometryToFeatures } from '../controller/LayerQueries';\r\nimport { mergeJsonByRegion, filterJsonByStates } from '../model/mergeFeatures';\r\n\r\nconst StateLayer = (props) => {\r\n const { map, zoom, zIndex, reportLoadStatus = () => {}, downloadRegion } = props;\r\n const [features, setFeatures] = useState([]);\r\n const [loadStatus, setLoadStatus] = useState(1);\r\n const [detail, setDetail] = useState('low');\r\n\r\n //Default: Convert all states to features\r\n const allStateFeatures = (json) => {\r\n return convertGeometryToFeatures(json, 'topojson');\r\n };\r\n //Filter states by abbreviation list, then convert to features\r\n const filteredStateFeatures = (json, stateAbbrArr = ['GA']) => {\r\n var statesJson = filterJsonByStates(json, stateAbbrArr);\r\n return convertGeometryToFeatures(statesJson, 'topojson');\r\n };\r\n //Convert state features to outlined regions\r\n const mergedRegionFeatures = (json) => {\r\n var regionJson = mergeJsonByRegion(json);\r\n console.log(regionJson); //output to console to save data\r\n return convertGeometryToFeatures(regionJson, 'topojson');\r\n };\r\n\r\n const fetchGeometry = async () => {\r\n setLoadStatus(0);\r\n const DS = new DevDataService();\r\n const json = await DS.getGeometryData({ scope: 'state' }).then((data) => data[0]);\r\n\r\n const shapes = allStateFeatures(json);\r\n // const shapes = filteredStateFeatures(json, ['GA', 'FL']);\r\n // const shapes = mergedRegionFeatures(json);\r\n styleFeatures(shapes);\r\n setFeatures(shapes);\r\n setLoadStatus(1);\r\n };\r\n const styleFeatures = (shapes) => {\r\n for (let shape of shapes) {\r\n if (downloadRegion === 'S_' + shape.get('STATEFP')) {\r\n shape.setStyle(detail === 'high' ? outlineRegion : outlineRegionLow);\r\n } else {\r\n shape.setStyle(detail === 'high' ? outlineState : outlineStateLow);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => reportLoadStatus(loadStatus), [loadStatus]);\r\n useEffect(() => map && fetchGeometry(), [map]);\r\n useEffect(() => map && setDetail(zoom > 6 ? 'high' : 'low'));\r\n useEffect(() => styleFeatures(features), [detail, downloadRegion]);\r\n\r\n return ;\r\n};\r\nexport { StateLayer };\r\n","import { VectorLayer } from './Layer';\r\nimport { DevDataService } from '../model/DevDataService';\r\nimport { outlineRegion, outlineRegionLow } from './MapVectorStyles.js';\r\nimport { useEffect, useState } from 'react';\r\nimport { convertGeometryToFeatures } from '../controller/LayerQueries';\r\nimport { mergeJsonByRegion, filterJsonByStates } from '../model/mergeFeatures';\r\n\r\nconst RegionLayer = (props) => {\r\n const { map, zoom, zIndex, reportLoadStatus = () => {}, downloadRegion } = props;\r\n const [features, setFeatures] = useState([]);\r\n const [loadStatus, setLoadStatus] = useState(1);\r\n const [style, setStyle] = useState(null);\r\n\r\n useEffect(() => reportLoadStatus(loadStatus), [loadStatus]);\r\n\r\n //Default: Convert all states to features\r\n const allStateFeatures = (json) => {\r\n return convertGeometryToFeatures(json, 'topojson');\r\n };\r\n //Filter states by abbreviation list, then convert to features\r\n const filteredStateFeatures = (json, stateAbbrArr = ['GA']) => {\r\n var statesJson = filterJsonByStates(json, stateAbbrArr);\r\n return convertGeometryToFeatures(statesJson, 'topojson');\r\n };\r\n //Convert state features to outlined regions\r\n const mergedRegionFeatures = (json) => {\r\n var regionJson = mergeJsonByRegion(json);\r\n console.log(regionJson); //output to console to save data\r\n return convertGeometryToFeatures(regionJson, 'topojson');\r\n };\r\n\r\n const fetchGeometry = async () => {\r\n setLoadStatus(0);\r\n const DS = new DevDataService();\r\n const json = await DS.getGeometryData({ scope: 'state' }).then((data) => data[0]);\r\n\r\n const shapes = mergedRegionFeatures(json);\r\n\r\n setFeatures(shapes);\r\n setLoadStatus(1);\r\n };\r\n\r\n useEffect(() => map && fetchGeometry(), [map]);\r\n useEffect(() => map && setStyle(zoom > 6 ? outlineRegion : outlineRegionLow));\r\n useEffect(() => {\r\n for (let shape of features) {\r\n if (shape.get('id') === downloadRegion) {\r\n shape.setStyle(style);\r\n } else {\r\n shape.setStyle(null);\r\n }\r\n }\r\n }, [style, downloadRegion, features]);\r\n\r\n return ;\r\n};\r\nexport { RegionLayer };\r\n","import { VectorLayer } from './Layer';\r\nimport Feature from 'ol/Feature';\r\nimport Point from 'ol/geom/Point';\r\nimport { DevDataService } from '../model/DevDataService';\r\nimport { outlineHHS, outlineHHSlow, hhsLabelStyle, outlineRegion, outlineRegionLow, outlineThick } from './MapVectorStyles.js';\r\nimport { useEffect, useContext, useState } from 'react';\r\nimport { convertGeometryToFeatures } from '../controller/LayerQueries';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\n\r\nconst HHSregionsLayer = (props) => {\r\n const { map, zoom, zIndex, onLoadStatus = () => {}, downloadRegion } = props;\r\n const [features, setFeatures] = useState([]);\r\n const { hhsregion } = useContext(InterfaceContext);\r\n const [loadStatus, setLoadStatus] = useState(1);\r\n const [detail, setDetail] = useState('low');\r\n\r\n const staticLabels = [\r\n { HHSRegID: 1, center: [-7830984.80896299, 5514214.3129521115] },\r\n { HHSRegID: 2, center: [-8439806.430084273, 5168945.352860589] },\r\n { HHSRegID: 3, center: [-8815061.51812163, 4788281.18751557] },\r\n { HHSRegID: 4, center: [-9300801.319483198, 3956239.4193884125] },\r\n { HHSRegID: 5, center: [-9893443.17087081, 5387651.668677275] },\r\n { HHSRegID: 6, center: [-11024755.784605857, 3809672.169827702] },\r\n { HHSRegID: 7, center: [-10751317.676106814, 4543894.631244634] },\r\n { HHSRegID: 8, center: [-11827965.782098817, 5556199.810650626] },\r\n { HHSRegID: 9, center: [-13032002.469755, 4461566.60398] },\r\n { HHSRegID: 9, center: [-17534684.163450003, 2342393.1768] },\r\n { HHSRegID: 10, center: [-17154880.7069, 9133851.8121] },\r\n { HHSRegID: 10, center: [-13138657.2565725, 5717115.48675] }\r\n ];\r\n\r\n const fetchGeometry = async () => {\r\n setLoadStatus(0);\r\n const DS = new DevDataService();\r\n const json = await DS.getGeometryData({ type: 'geometry', scope: 'hhs' });\r\n const shapes = createBoundaryFeatures(json[0]);\r\n const labels = createLabelFeatures();\r\n const features = [...shapes, ...labels];\r\n // getFeaturedBounds(shapes)\r\n styleFeatures(features);\r\n setFeatures(features);\r\n setLoadStatus(1);\r\n };\r\n //ΔVΔVΔ: Used to generate feature bounding boxes for hhs regions in static variables\r\n const getFeaturedBounds = (shapes) => {\r\n for (var i = 0; i < shapes.length; i++) {\r\n var ftr = shapes[i];\r\n var ext = ftr.getGeometry().getExtent();\r\n console.log('hhs ftr', ftr);\r\n console.log(ftr.get('HHSRegID'), ext.join(','));\r\n }\r\n };\r\n\r\n const createLabelFeatures = () => {\r\n return staticLabels.map((shape) => {\r\n const { HHSRegID, center } = shape;\r\n const cirFeat = new Feature({\r\n geometry: new Point(center)\r\n });\r\n cirFeat.set('HHSRegID', HHSRegID);\r\n cirFeat.set('featureType', 'label');\r\n return cirFeat;\r\n });\r\n };\r\n const createBoundaryFeatures = (json) => {\r\n const shapes = convertGeometryToFeatures(json, 'topojson');\r\n return shapes.map((shape) => {\r\n shape.set('featureType', 'border');\r\n return shape;\r\n });\r\n };\r\n const styleFeatures = (features) => {\r\n for (let shape of features) {\r\n shape.setStyle(null);\r\n const type = shape.get('featureType');\r\n const highlighted = downloadRegion === 100 + shape.get('HHSRegID');\r\n if (hhsregion || highlighted) {\r\n if (type === 'border' && highlighted) {\r\n shape.setStyle(zoom > 6 ? outlineRegion : outlineRegionLow);\r\n } else if (type === 'border') {\r\n shape.setStyle(zoom > 6 ? outlineHHS : outlineHHSlow);\r\n } else {\r\n shape.setStyle(hhsLabelStyle('HHS #' + shape.get('HHSRegID'), highlighted));\r\n }\r\n }\r\n }\r\n };\r\n useEffect(() => onLoadStatus(loadStatus), [loadStatus]);\r\n useEffect(() => map && fetchGeometry(), [map]);\r\n useEffect(() => map && setDetail(zoom > 6 ? 'high' : 'low'));\r\n useEffect(() => styleFeatures(features), [detail, hhsregion, downloadRegion]);\r\n\r\n return ;\r\n};\r\nexport { HHSregionsLayer };\r\n","import OLTileLayer from 'ol/layer/Tile';\r\nimport OLTileDebug from 'ol/source/TileDebug';\r\nimport { useEffect, useState } from 'react';\r\n\r\nconst GridDebugLayer = (props) => {\r\n const { zIndex, map, visible = true, onAdded = () => {} } = props;\r\n const [addedToMap, setAddedToMap] = useState(false);\r\n\r\n const [lyr] = useState(\r\n new OLTileLayer({\r\n source: new OLTileDebug()\r\n })\r\n );\r\n const setOpacity = () => {\r\n lyr.setOpacity(visible ? 1 : 0);\r\n };\r\n\r\n useEffect(() => {\r\n if (!map) return;\r\n if (addedToMap) return; //ΔVΔVΔ: Only Happens On local and testing, prevents re-adding\r\n map.addLayer(lyr);\r\n lyr.setZIndex(zIndex);\r\n setOpacity();\r\n setAddedToMap(true);\r\n onAdded(lyr); //ΔVΔVΔ: run passed in function\r\n return () => {\r\n if (map) {\r\n map.removeLayer(lyr);\r\n setAddedToMap(false);\r\n }\r\n };\r\n }, [map]);\r\n\r\n return null;\r\n};\r\n\r\nexport { GridDebugLayer };\r\n","import { VectorLayer } from './Layer';\r\nimport { outlineFeatureHighlightCounty, outlineFeatureHighlightCensus } from './MapVectorStyles.js';\r\nimport { useEffect, useContext, useState } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { FeatureContext } from '../model/FeatureProvider';\r\n\r\nconst FeatureOutlineLayer = (props) => {\r\n const { map, zIndex } = props;\r\n const { hoveredFeature } = useContext(FeatureContext);\r\n const { selectedFeature, selectedFeatureIsPinned: pinned } = useContext(InterfaceContext);\r\n const [localFeatures, setLocalFeatures] = useState([]);\r\n const [style, setStyle] = useState(outlineFeatureHighlightCounty);\r\n\r\n const updateFeature = (featr) => {\r\n if (featr) {\r\n const fips = featr.get('FIPS');\r\n const clonedFeature = featr.clone();\r\n var borderStyle = fips?.length > 5 ? outlineFeatureHighlightCensus : outlineFeatureHighlightCounty;\r\n clonedFeature.setStyle(borderStyle);\r\n setLocalFeatures([clonedFeature]);\r\n setStyle(borderStyle);\r\n } else {\r\n setLocalFeatures(null);\r\n }\r\n };\r\n // useEffect(() => setLocalFeatures([]), [tract]);\r\n useEffect(() => !pinned && updateFeature(hoveredFeature), [hoveredFeature]);\r\n useEffect(() => !pinned && setLocalFeatures([]), [pinned]);\r\n useEffect(() => pinned && selectedFeature && updateFeature(selectedFeature), [selectedFeature]);\r\n\r\n return ;\r\n};\r\nexport { FeatureOutlineLayer };\r\n","import { iconStyle } from './MapVectorStyles.js';\r\nimport Feature from 'ol/Feature';\r\nimport Point from 'ol/geom/Point';\r\n\r\nconst IconFeature = (props) => {\r\n const { x, y, icon, color, info, data, poi=true } = props;\r\n const coords = [x, y];\r\n\r\n const iconFeat = new Feature({\r\n geometry: new Point(coords),\r\n poi,\r\n info,\r\n data\r\n });\r\n\r\n iconFeat.setStyle(iconStyle(icon, color));\r\n return iconFeat;\r\n};\r\nexport default IconFeature;\r\n","import { VectorLayer } from './Layer';\r\nimport { useEffect, useState } from 'react';\r\nimport IconFeature from './IconFeature';\r\nimport { SCRIPT_URL } from '../model/StaticVariables';\r\n\r\nconst MapMarkerLayer = (props) => {\r\n const { map, zIndex, markerCoords = [] } = props;\r\n const [features, setFeatures] = useState([]);\r\n\r\n useEffect(() => {\r\n const addFeatures = [];\r\n for (let mark of markerCoords) {\r\n let { center } = mark;\r\n if (center) {\r\n const icon = SCRIPT_URL + '/map-marker.svg';\r\n var marker = IconFeature({\r\n poi: false,\r\n x: center[0],\r\n y: center[1],\r\n color: '#016c29',\r\n icon: icon\r\n });\r\n\r\n addFeatures.push(marker);\r\n }\r\n }\r\n setFeatures(addFeatures);\r\n }, [markerCoords]);\r\n\r\n return ;\r\n};\r\nexport { MapMarkerLayer };\r\n","import { VectorLayer } from './Layer';\r\nimport { DevDataService } from '../model/DevDataService';\r\nimport { outlineRegion, outlineRegionLow } from './MapVectorStyles.js';\r\nimport { useEffect, useState } from 'react';\r\nimport { convertGeometryToFeatures } from '../controller/LayerQueries';\r\n\r\nconst HighlightRegionLayer = (props) => {\r\n const { map, zoom, zIndex, reportLoadStatus = () => {}, downloadRegion } = props;\r\n const [features, setFeatures] = useState([]);\r\n const [loadStatus, setLoadStatus] = useState(1);\r\n const [detail, setDetail] = useState('low');\r\n\r\n const stateFeatures = async () => {\r\n const DS = new DevDataService();\r\n return DS.getGeometryData({ scope: 'state' })\r\n .then((data) => data[0])\r\n .then((json) => {\r\n const shapes = convertGeometryToFeatures(json, 'topojson');\r\n return shapes.map((f) => {\r\n f.set('regionSlug', 'S_' + f.get('STATEFP'));\r\n return f;\r\n });\r\n });\r\n };\r\n const hhsFeatures = async () => {\r\n const DS = new DevDataService();\r\n return DS.getGeometryData({ type: 'geometry', scope: 'hhs' }).then((json) => {\r\n const shapes = convertGeometryToFeatures(json[0], 'topojson');\r\n return shapes.map((f) => {\r\n f.set('regionSlug', 100 + f.get('HHSRegID'));\r\n return f;\r\n });\r\n });\r\n };\r\n\r\n const fetchGeometry = async () => {\r\n setLoadStatus(0);\r\n const states = stateFeatures();\r\n const hhsRegions = hhsFeatures();\r\n const shapes = (await Promise.all([states, hhsRegions])).flat();\r\n styleFeatures(shapes);\r\n setFeatures(shapes);\r\n setLoadStatus(1);\r\n };\r\n const styleFeatures = (shapes) => {\r\n for (let shape of shapes) {\r\n if (downloadRegion === shape.get('regionSlug')) {\r\n shape.setStyle(detail === 'high' ? outlineRegion : outlineRegionLow);\r\n } else {\r\n shape.setStyle(null);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => reportLoadStatus(loadStatus), [loadStatus]);\r\n useEffect(() => map && fetchGeometry(), [map]);\r\n useEffect(() => map && setDetail(zoom > 6 ? 'high' : 'low'));\r\n useEffect(() => styleFeatures(features), [detail, downloadRegion]);\r\n\r\n return ;\r\n};\r\nexport { HighlightRegionLayer };\r\n","import { useCallback, useRef, useContext, useEffect, useState } from 'react';\r\nimport { useAfterInit } from './useAfterInit';\r\nimport Layers from '../view/Layer';\r\nimport Map from '../view/Map';\r\nimport { DrawExtent, FipsTracker, getTilesInView } from '../view/MeasureLayer';\r\nimport { OLMSLayer } from '../view/OLMSLayer';\r\nimport CensusLayer from '../view/CensusLayer';\r\nimport CountyLayer from '../view/CountyLayer';\r\nimport PoiLayer from '../view/PoiLayer';\r\nimport MapControls from '../view/MapControls';\r\nimport ZoomControl from '../view/ZoomControls';\r\nimport DownloadControl from '../view/DownloadControl';\r\nimport ZoomNumberControl from '../view/ZoomNumberControl';\r\nimport FullScreenControl from '../view/FullScreenControl';\r\nimport ZoomSelect from '../view/ZoomSelect';\r\nimport { DATA_URL, debugMode, mapStaticVariables, minCensusZoom } from '../model/StaticVariables';\r\nimport { StateLayer } from '../view/StateLayer';\r\nimport { RegionLayer } from '../view/RegionLayer';\r\nimport { HHSregionsLayer } from '../view/HHSregionsLayer';\r\nimport { GridDebugLayer } from '../view/GridDebugLayer';\r\nimport { FeatureOutlineLayer } from '../view/FeatureOutlineLayer';\r\nimport MapContext from '../controller/MapProvider';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { FeatureContext } from '../model/FeatureProvider';\r\nimport { MapMarkerLayer } from '../view/MapMarkerLayer';\r\nimport { HighlightRegionLayer } from '../view/HighlightRegionLayer';\r\n\r\nconst MapController = (props) => {\r\n // const { streetmap, year, setLoadStatus, marker, unsetSearch, tract, usState, scope, updateHoveredFeature, updatePinnedFeature, pinWindow, setIMap, search, setCensusEnabled } = useContext(InterfaceContext);\r\n const { streetmap, year, setLoadStatus, marker, unsetSearch, tract, usState, scope, updatePinnedFeature, setIMap, search, setCensusEnabled, downloadRegion } = useContext(InterfaceContext);\r\n const { updateHoveredFeature, setPinnedFeature, pinWindow } = useContext(FeatureContext);\r\n const { zoomRead: zoom, setZoom, map, setFips, setReferenceAdded, setTiles, setWait, setMap, boundingBox, setBbox } = useContext(MapContext);\r\n const defaultBbox = mapStaticVariables.extents.contiguous_us_and_pr;\r\n const [homeBbox, setHomeBbox] = useState(() => (scope === 'state' && usState?.bounds ? usState.bounds : defaultBbox));\r\n const localStateRef = useRef(false);\r\n const localTractRef = useRef(() => tract);\r\n const localScopeRef = useRef(() => scope);\r\n const streetmapLabels = `${DATA_URL}/style/light-gray-labels2.json`;\r\n const streetmapLinesShapes = `${DATA_URL}/style/blue_non_labels.json`;\r\n const featureRef = useRef(0);\r\n\r\n useEffect(() => (localStateRef.current = usState?.id || false), [usState]);\r\n useEffect(() => {\r\n localTractRef.current = tract;\r\n updateHoveredFeature(false);\r\n featureRef.current = 0;\r\n }, [tract]);\r\n useEffect(() => (localScopeRef.current = scope), [scope]);\r\n\r\n //=========================\r\n // Layer Filters\r\n const defaultLayerFilter = (lyr) => {\r\n if (lyr.get('opacity') === 0 || !lyr.get('visible')) return false; //ΔVΔVΔ: No invisible layers\r\n return lyr;\r\n };\r\n const sviLayerFilter = (lyr) => {\r\n const layerName = localTractRef.current == 'county' ? 'NationalCounty' : 'Census';\r\n if (lyr.get('title') !== layerName) return false;\r\n return lyr;\r\n };\r\n const poiLayerFilter = (lyr) => {\r\n if (lyr.get('title')?.indexOf('poi') === -1) return false; //ΔVΔVΔ: Must be poi layer or selected svi layer\r\n return lyr;\r\n };\r\n const compositeFilter = (lyr) => {\r\n if (!defaultLayerFilter(lyr)) return false;\r\n return sviLayerFilter(lyr) || poiLayerFilter(lyr);\r\n };\r\n const featureIsWithinScope = (ftr) => {\r\n var stFIPS = ftr.get('FIPS')?.substring(0, 2);\r\n var mustBeState = localScopeRef.current === 'state';\r\n if (!mustBeState) return true;\r\n var matchingState = localStateRef.current === stFIPS;\r\n return matchingState;\r\n };\r\n // Layer Filters\r\n //===============================\r\n const validSviFeature = useCallback(\r\n (ftr, mustBeClickable = false) => {\r\n if (!ftr) return false;\r\n if (!featureIsWithinScope(ftr)) return false;\r\n if (mustBeClickable && !ftr.get('sviValues')) return false;\r\n return true;\r\n },\r\n [usState]\r\n );\r\n\r\n const validPoiFeature = (ftr, mustBeClickable = false) => {\r\n if (!ftr) return false;\r\n if (!ftr.get('poi')) return false;\r\n if (mustBeClickable && ftr.get('count') > 10) return false;\r\n return true;\r\n };\r\n const validateFeature = (ftr, mustBeClickable = false) => {\r\n return validPoiFeature(ftr, mustBeClickable) || validSviFeature(ftr, mustBeClickable);\r\n };\r\n\r\n const handleCensusEnabledStatus = (map) => {\r\n const zoom = map.getView().getZoom();\r\n const censusShouldBeEnabled = zoom >= minCensusZoom;\r\n setCensusEnabled(censusShouldBeEnabled);\r\n };\r\n // ΔVΔVΔ: Only update feature when ID has changed\r\n const hoverFeatureHandler = useCallback((feature) => {\r\n const prevID = featureRef.current;\r\n const nextID = validateFeature(feature) ? feature.get('FIPS') : 0;\r\n const ftrObject = nextID === 0 ? false : feature;\r\n featureRef.current = nextID;\r\n if (prevID !== nextID) {\r\n updateHoveredFeature(ftrObject);\r\n }\r\n });\r\n const handleFeatureClick = useCallback((feature) => {\r\n var ftr = validateFeature(feature, true) ? feature : false;\r\n setPinnedFeature(ftr);\r\n pinWindow(Boolean(ftr));\r\n });\r\n useAfterInit(() => {\r\n setHomeBbox(boundingBox);\r\n }, [boundingBox]);\r\n\r\n useAfterInit(() => {\r\n setHomeBbox(search?.length === 4 ? search : mapStaticVariables.extents.contiguous_us_and_pr);\r\n }, [search]);\r\n\r\n return (\r\n <>\r\n {\r\n setMap(olmap);\r\n setIMap(olmap);\r\n }}\r\n onMove={(args) => {\r\n handleCensusEnabledStatus(args.map);\r\n const tiles = getTilesInView(args);\r\n setTiles(tiles);\r\n }}\r\n layerFilter={compositeFilter}\r\n onHoverFeature={hoverFeatureHandler}\r\n onClickFeature={handleFeatureClick}\r\n onLoadStatus={(status) => {\r\n setLoadStatus(status);\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {debugMode && (\r\n <>\r\n \r\n {/* */}\r\n \r\n {/* */}\r\n \r\n )}\r\n {\r\n setReferenceAdded(true);\r\n setFips(fips);\r\n setWait(false);\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\nexport default MapController;\r\n","import { useContext } from 'react';\r\nimport Legend from './Legend';\r\nimport { debugMode } from '../model/StaticVariables';\r\nimport { HoveredFeatureModal } from './FeatureModal';\r\nimport { HoveredFeatureTitle } from './FeatureTitle';\r\nimport MapContext from '../controller/MapProvider';\r\nimport RemoveMapMarkerButton from './RemoveMapMarkerButton';\r\nimport { checkAdjustShortScreens } from './checkAdjustShortScreens';\r\nimport MapController from '../controller/MapController';\r\nimport { FeatureProvider } from '../model/FeatureProvider';\r\n\r\nconst ContentMap = () => {\r\n const { map } = useContext(MapContext);\r\n checkAdjustShortScreens(map);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n\r\n {debugMode &&
}\r\n \r\n
\r\n \r\n \r\n );\r\n};\r\nexport default ContentMap;\r\n","// ΔVΔVΔ: Accomidate screens that are short/wide\r\n// to test use a CDC laptops, go to settings > display > scale & layout & set to 150\r\n// at this time this doesn't see to actualy affect the app anymore. This may have been resolved by using grid css later in development\r\n\r\nconst checkAdjustShortScreens = (olmap) => {\r\n const inter = document.querySelector('#interface');\r\n if (!inter) return;\r\n if (inter.offsetWidth < 1200) return;\r\n\r\n const uiNodes = Array.from(document.querySelectorAll('#tabs, #view-controls, #data-controls, #cdc-header, #svi-banner'));\r\n var uiHeight = uiNodes.reduce((total, elem) => total + elem.offsetHeight, 0);\r\n\r\n if (inter.classList.contains('short')) {\r\n uiHeight += 80; //ΔVΔVΔ: There could be a non hardcoded way to get this number\r\n }\r\n const contentHeight = document.body.offsetHeight;\r\n const maxUIspace = contentHeight / 2;\r\n if (!inter) return;\r\n if (uiHeight > maxUIspace && !inter.classList.contains('short')) {\r\n olmap.updateSize();\r\n console.log('recalc size');\r\n } else if (inter.classList.contains('short')) {\r\n olmap.updateSize();\r\n console.log('recalc size');\r\n }\r\n};\r\n\r\nexport { checkAdjustShortScreens };\r\n","import { useReducer, createContext } from 'react';\r\nconst DownloadContext = new createContext();\r\nexport default DownloadContext;\r\n\r\nconst init = {\r\n downloading: false, //ΔVΔVΔ: true when map is in process of downloading\r\n csv: false, //csv checkbox\r\n map: true, //map checkbox\r\n filter: 'current',\r\n printState: false,\r\n printScope: 'national',\r\n // printZoom: false,\r\n csv_link: '',\r\n map_link: '',\r\n doc_link: '',\r\n center: [0, 0],\r\n zoom: 0\r\n};\r\n\r\nconst actions = (state, dispatch) => {\r\n return {\r\n setcsv_option: (csv) => dispatch({ type: 'setcsv_option', csv }),\r\n setmap_option: (map) => dispatch({ type: 'setmap_option', map }),\r\n init_download: () => dispatch({ type: 'init_download' }),\r\n completeDownload: () => dispatch({ type: 'completeDownload' }),\r\n setFilter_option: (value) => dispatch({ type: 'setFilter_option', value }),\r\n setState_option: (value) => dispatch({ type: 'setState_option', value }),\r\n set_csv_link: (value) => dispatch({ type: 'set_csv_link', value }),\r\n set_map_link: (value) => dispatch({ type: 'set_map_link', value }),\r\n set_doc_link: (value) => dispatch({ type: 'set_doc_link', value }),\r\n setPrintScope: (value) => dispatch({ type: 'setPrintScope', value })\r\n };\r\n};\r\nconst reducer = (state, action) => {\r\n switch (action.type) {\r\n case 'setcsv_option':\r\n return { ...state, csv: action.csv };\r\n case 'setmap_option':\r\n return { ...state, map: action.map };\r\n case 'init_download':\r\n return { ...state, downloading: true, csv_link: '', map_link: '', doc_link: '' };\r\n case 'completeDownload':\r\n return { ...state, downloading: false };\r\n case 'setFilter_option':\r\n return { ...state, filter: action.value };\r\n case 'setState_option':\r\n return { ...state, printState: action.value, printScope: action.value ? 'state' : 'national' };\r\n case 'set_csv_link':\r\n return { ...state, csv_link: action.value };\r\n case 'set_map_link':\r\n return { ...state, map_link: action.value };\r\n case 'set_doc_link':\r\n return { ...state, doc_link: action.value };\r\n case 'setPrintScope':\r\n return { ...state, printScope: action.value };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nconst DownloadProvider = ({ children }) => {\r\n const [state, dispatch] = useReducer(reducer, { ...init });\r\n const value = { ...state, ...actions(state, dispatch) };\r\n return {children};\r\n};\r\nexport { DownloadProvider };\r\n","import { useCallback, useContext, useEffect, useState, useRef } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { statesList, staticRegions } from '../model/StaticVariables';\r\nimport Modal, { ModalBackground } from './Modal';\r\nimport TEXTS from '../controller/TextVariables';\r\nimport MapContext from '../controller/MapProvider';\r\nimport DownloadContext from '../controller/DownloadProvider';\r\nimport Waiting from './Waiting';\r\nimport { useAfterInit } from '../controller/useAfterInit';\r\nimport DragContainer from './DragContainer';\r\nimport { useMouseDown } from '../controller/useMouseDown';\r\nimport { pointWithinDomElement } from '../controller/CollisionDetection';\r\n\r\nconst DownloadModal = (props) => {\r\n const { setBbox } = useContext(MapContext);\r\n const regionDropdownElement = useRef();\r\n const { scope, download_modal, closeDownloadModal, setForceMap, tab, loadStatus, usState, tract, setSelectedState, setDownloadRegion } = useContext(InterfaceContext);\r\n const { label, maplabel, datalabel, titleCheck, legendCheck, currentMap, currentData, select_state, usmap, button } = TEXTS.modals.download;\r\n const { csv, setcsv_option, map, setmap_option, filter, setFilter_option, setState_option, downloading, init_download, set_csv_link, set_map_link, set_doc_link, csv_link, map_link, doc_link } = useContext(DownloadContext);\r\n const [valid, setValid] = useState(true);\r\n const pixelCoords = [0, 0];\r\n const [localusState, setLocalusState] = useState(usState);\r\n const [localMapCheck, setLocalMapCheck] = useState(tab.slug === 'map');\r\n const [localDataCheck, setLocalDataCheck] = useState(tab.slug === 'data');\r\n const [localTitleCheck, setLocalTitleCheck] = useState(true);\r\n const [localLegendCheck, setLocalLegendCheck] = useState(true);\r\n const [disablePR, setDisablePR] = useState(false);\r\n const [isDragging, setIsDragging] = useState(false);\r\n const lastClick = useMouseDown();\r\n const windowRef = useRef();\r\n const [pose, setPose] = useState({ x: 0, y: 0 });\r\n const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });\r\n\r\n const validateForm = useCallback(() => {\r\n const validFilter = filter !== 'state' || localusState != '';\r\n return validFilter;\r\n }, [filter, localusState]);\r\n\r\n const onRadioClick = (e) => {\r\n clearLinks();\r\n setValid(true);\r\n setFilter_option(e.target.getAttribute('value'));\r\n setState_option(false);\r\n };\r\n const onMapClick = (e) => {\r\n clearLinks();\r\n setmap_option(!localMapCheck);\r\n setLocalMapCheck(!localMapCheck);\r\n };\r\n const onDataClick = (e) => {\r\n clearLinks();\r\n setcsv_option(!localDataCheck);\r\n setLocalDataCheck(!localDataCheck);\r\n };\r\n\r\n const getSelectedPrintArea = (value) => {\r\n const selectedRegion = staticRegions.find((r) => r.id == value);\r\n const selectedState = statesList.find((st) => st.id == value);\r\n return selectedRegion || selectedState;\r\n };\r\n const selectChange = (e) => {\r\n clearLinks();\r\n setValid(true);\r\n setSelectedRegion(e.target.value);\r\n };\r\n\r\n const setSelectedRegion = (id) => {\r\n const selectedArea = getSelectedPrintArea(id); // selectedRegion || selectedState;\r\n\r\n if (selectedArea && selectedArea.abbr) {\r\n setDownloadRegion('S_' + selectedArea.id);\r\n setState_option(selectedArea);\r\n scope === 'state' && setSelectedState(selectedArea);\r\n setBbox(selectedArea.bounds);\r\n } else if (selectedArea) {\r\n setDownloadRegion(selectedArea.id);\r\n setBbox(selectedArea.bounds);\r\n }\r\n };\r\n\r\n const clearLinks = () => {\r\n set_csv_link('');\r\n set_map_link('');\r\n set_doc_link('');\r\n };\r\n const closeWindow = () => {\r\n clearLinks();\r\n closeDownloadModal();\r\n setFilter_option('current');\r\n setLocalusState(usState);\r\n const int = document.querySelector('#panel-map');\r\n int.style.height = ''; //remove height ock when window close\r\n setDownloadRegion(false);\r\n setDragOffset({ x: 0, y: 0 });\r\n setIsDragging(false);\r\n };\r\n const initDownload = (e) => {\r\n const int = document.querySelector('#panel-map');\r\n int.style.height = int.offsetHeight + 'px'; //lock the height to prevent the resize when closing the download dialog\r\n clearLinks();\r\n if (validateForm()) {\r\n const useForce = map && tab.slug !== 'map'; //if the map is not in view force it to display\r\n setForceMap(useForce);\r\n init_download();\r\n } else {\r\n setValid(false);\r\n }\r\n };\r\n const onTitleCheckClick = () => {\r\n setLocalTitleCheck(!localTitleCheck);\r\n };\r\n const onLegnedCheckClick = () => {\r\n setLocalLegendCheck(!localLegendCheck);\r\n };\r\n const setStartingPose = () => {\r\n const modalBounds = document.querySelector('#mapContainer');\r\n const xcoord = modalBounds.clientWidth / 2 - 150;\r\n const ycoord = 250;\r\n console.log('x,y', xcoord, ycoord);\r\n setPose({ x: xcoord, y: ycoord });\r\n };\r\n useEffect(() => {\r\n setStartingPose();\r\n window.addEventListener('mouseup', () => setIsDragging(false));\r\n }, []);\r\n\r\n useEffect(() => {\r\n setDisablePR(scope === 'national');\r\n }, [scope, tract]);\r\n //ΔVΔVΔ: Reset the radio btn to current\r\n useEffect(() => {\r\n setState_option(false);\r\n setFilter_option('current');\r\n }, [scope]);\r\n useEffect(() => {\r\n setLocalusState(usState);\r\n }, [usState]);\r\n useEffect(() => {\r\n if (download_modal) {\r\n setTimeout(() => document.querySelector('#mapCheck').focus(), 300);\r\n setSelectedRegion(regionDropdownElement.current.value); //set the selected region\r\n setStartingPose();\r\n }\r\n }, [download_modal]);\r\n\r\n useAfterInit(() => {\r\n closeWindow();\r\n setLocalDataCheck(tab.slug === 'data');\r\n setLocalMapCheck(tab.slug === 'map');\r\n setcsv_option(tab.slug === 'data');\r\n setmap_option(tab.slug === 'map');\r\n }, [tab]);\r\n\r\n const getLastClickOffset = () => {\r\n const dragBarRect = windowRef.current.querySelector('.win-title').getBoundingClientRect();\r\n return { x: dragBarRect.x - lastClick.x, y: dragBarRect.y - lastClick.y };\r\n };\r\n useEffect(() => {\r\n if (download_modal) {\r\n if (!lastClick.x || !windowRef.current) return;\r\n const dragbarClicked = pointWithinDomElement(lastClick.x, lastClick.y, windowRef.current.querySelector('.win-title'));\r\n setDragOffset(getLastClickOffset());\r\n setIsDragging(dragbarClicked);\r\n }\r\n }, [lastClick]);\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n

Geographic Comparison

\r\n \r\n
\r\n
\r\n {tab.slug !== 'map' && (\r\n
\r\n \r\n \r\n
\r\n )}\r\n
\r\n

Print Area

\r\n \r\n
\r\n
\r\n {!valid &&
* Please select a state
}\r\n \r\n \r\n {(csv_link || map_link || doc_link) && (\r\n
\r\n

If download does not start, please use link(s) below:

\r\n {csv_link && (\r\n \r\n Download CSV\r\n \r\n )}\r\n {doc_link && (\r\n \r\n Documentation\r\n \r\n )}\r\n {map_link && (\r\n \r\n Download Map\r\n \r\n )}\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\nexport default DownloadModal;\r\n\r\nconst DownloadModalBackground = () => {\r\n const { download_modal } = useContext(InterfaceContext);\r\n return ;\r\n};\r\nexport { DownloadModalBackground };\r\n","import { useEffect } from 'react';\r\nimport { downloadString, downloadFile, printState } from './DownloadString';\r\nimport { OneMapApiDataService } from '../model/OneMapApiDataService';\r\nimport { tableDataMapping, tableDataMappingOrdered, jsonToCSVDownloadString } from '../model/DataTransformation';\r\nimport TableGridColumns from '../model/TableColumns';\r\n\r\n//ΔVΔVΔ: Just a demo of use\r\nconst DummyDownloader = () => {\r\n const dummyData = Object.values({\r\n template: { width: 200, minWidth: 50, hide: true, description: '', headerName: '' },\r\n Theme1_EP_POV: { width: 200, minWidth: 50, description: 'Percentage of persons below poverty', headerName: 'EP_POV' },\r\n Theme1_MP_POV: { width: 200, minWidth: 50, description: 'Percentage of persons below poverty estimate margin of error', headerName: 'MP_POV' },\r\n Theme1_EP_UNEMP: { width: 200, minWidth: 50, description: 'Unemployment Rate', headerName: 'EP_UNEMP' },\r\n Theme1_MP_UNEMP: { width: 200, minWidth: 50, description: 'Unemployment Rate estimate margin of error', headerName: 'MP_UNEMP' },\r\n Theme1_EP_PCI: { width: 200, minWidth: 50, description: 'Per capita income estimate', headerName: 'EP_PCI' }\r\n });\r\n return ;\r\n};\r\nexport { DummyDownloader };\r\n\r\n// ΔVΔVΔ: Component that downloads data when the json changes\r\nconst Downloader = (props) => {\r\n const { triggerDownload, onDownload, onDownloadDoc, filename, dataProps, year } = props;\r\n\r\n //download props empty when tab is map\r\n useEffect(() => {\r\n //ΔVΔVΔ: Runs when Json or filename is updated in props\r\n if (!triggerDownload) return;\r\n loadJsonForDownload(dataProps).then((json) => {\r\n const isLive = window.location.href.indexOf('https://www.atsdr.cdc.gov/') === 0;\r\n downloadFile(isLive ? year.docs : year.localdoc, year.filename, onDownloadDoc);\r\n downloadCSV(json, filename, onDownload);\r\n });\r\n }, [triggerDownload]);\r\n return null;\r\n};\r\nexport { Downloader };\r\n\r\nconst loadJsonForDownload = async (props) => {\r\n const DS = new OneMapApiDataService();\r\n const clonedp = Object.assign({}, props, { usState: props.csvState });\r\n return DS.getTableData(clonedp).then((res) => {\r\n const tableColumns = TableGridColumns[props.year == '2020' ? '2020' : 'before2020'];\r\n return tableDataMappingOrdered(res, tableColumns);\r\n });\r\n};\r\n// ΔVΔVΔ: Filename will be download.csv\r\nconst downloadCSV = (json, filename = 'download.csv', onDownload = () => {}) => {\r\n //ΔVΔVΔ: Support # and \" within values\r\n let csvLink = jsonToCSVDownloadString(json);\r\n downloadString(csvLink, filename, false, (link) => {\r\n onDownload(link); //use to prevent re-download\r\n });\r\n return null;\r\n};\r\nexport { downloadCSV };\r\n","import html2canvas from 'html2canvas';\r\n\r\n//ΔVΔVΔ: Convert legend html to canvas layer\r\n// const legendToCanvas = async (width, height) => {\r\n// var legend = document.getElementById('map-legend');\r\n// legend.classList.add('match-height');\r\n// return html2canvas(legend, {\r\n// scale: window.devicePixelRatio * 2\r\n// }).then(function (canvas) {\r\n// canvas.id = 'map-legend-canvas';\r\n// document.body.appendChild(canvas);\r\n// legend.classList.remove('match-height');\r\n// return document.body.querySelector('#map-legend-canvas');\r\n// });\r\n// };\r\n// const titleToCanvas = async () => {\r\n// var titleDom = document.querySelector('.printing #title');\r\n// var titleCopy = html2canvas(titleDom, {\r\n// scale: window.devicePixelRatio * 2\r\n// });\r\n// return titleCopy;\r\n// };\r\n\r\nconst convertMapToImage = async (mapdom, width, height, includeLegend = true, includeTitle = false) => {\r\n const mapCanvas = document.createElement('canvas');\r\n mapCanvas.style.background = 'white';\r\n mapCanvas.width = width;\r\n mapCanvas.height = height;\r\n\r\n const mapContext = mapCanvas.getContext('2d');\r\n mapContext.fillStyle = 'white';\r\n mapContext.fillRect(0, 0, width, height);\r\n\r\n var mapDom = document.querySelector('.printing');\r\n\r\n document.querySelector('#printCanvas').innerHTML = '';\r\n document.querySelector('#printCanvas').append(mapCanvas);\r\n mapDom.style.width = width + 'px';\r\n\r\n //ΔVΔVΔ: Draw each layer onto output canvas\r\n Array.prototype.forEach.call(mapdom.querySelectorAll('.ol-layer canvas'), function (canvas) {\r\n if (canvas.width > 0) {\r\n const opacity = canvas.parentNode.style.opacity;\r\n mapContext.globalAlpha = opacity === '' ? 1 : Number(opacity);\r\n const transform = canvas.style.transform;\r\n // Get the transform parameters from the style's transform matrix\r\n const matrix = transform\r\n .match(/^matrix\\(([^\\(]*)\\)$/)[1]\r\n .split(',')\r\n .map(Number);\r\n // Apply the transform to the export map context\r\n CanvasRenderingContext2D.prototype.setTransform.apply(mapContext, matrix);\r\n mapContext.drawImage(canvas, 0, 0);\r\n }\r\n });\r\n\r\n mapDom.classList.remove('hide-title');\r\n mapDom.classList.remove('hide-legend');\r\n if (!includeLegend) {\r\n mapDom.classList.add('hide-legend');\r\n }\r\n if (!includeTitle) {\r\n mapDom.classList.add('hide-title');\r\n }\r\n var mapCopy = await html2canvas(mapDom);\r\n\r\n // ΔVΔVΔ: Convert Canvas to 64 bit image url\r\n const converted = mapCopy.toDataURL('image/jpeg');\r\n document.querySelector('#printCanvas').innerHTML = '';\r\n return converted;\r\n};\r\nexport { convertMapToImage };\r\n","import { View } from 'ol';\r\nimport { mapStaticVariables } from '../model/StaticVariables';\r\nimport { useContext, useEffect } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { downloadString } from './DownloadString';\r\nimport { convertMapToImage } from './convertMapToImage';\r\n\r\nconst Downloader = (props) => {\r\n const { map, setSearch, setSelectedState, scope, tract } = useContext(InterfaceContext);\r\n const { filter, triggerDownload, onDownload, filename, restoreState, printState, dimensions = [11 * 71, 8 * 72], dpi } = props;\r\n useEffect(() => {\r\n //ΔVΔVΔ: Runs when pdf or filename is updated in props\r\n if (!triggerDownload) return;\r\n if (!map) return;\r\n\r\n downloadJPG({ map, filename, dimensions, dpi, restoreState, onDownload, printState, setSelectedState, scope, filter, tract });\r\n }, [triggerDownload, map]);\r\n return null;\r\n};\r\nexport { Downloader };\r\n\r\nconst getWebDimensions = (map) => {\r\n return { resolution: map.getView().getResolution() * 1, width: map.getSize()[0], height: map.getSize()[1] };\r\n};\r\n\r\nconst getPrintDimensions = (map, pageWidth, pageHeight, dpi = 72) => {\r\n const width = Math.round((pageWidth * dpi) / 35); //50 works well with a lot of states, but cuts some off\r\n const height = Math.round((pageHeight * dpi) / 35);\r\n const scaling = Math.min(width / map.getSize()[0], height / map.getSize()[1]);\r\n return { width: width, height: height, scaling };\r\n};\r\n\r\nconst getPrintExtent = (filter, printState) => {\r\n if ((filter === 'current' || filter === 'state') && printState?.bounds?.length) {\r\n return printState.bounds;\r\n }\r\n return mapStaticVariables.extents.contiguous_us_and_pr;\r\n};\r\n\r\nconst downloadJPG = (props) => {\r\n const { map, dpi = 72, filename = 'download.jpg', onDownload, restoreState = false, printState, filter, setSelectedState, dimensions = [72 * 10, 72 * 8], scope, tract } = props;\r\n\r\n //ΔVΔVΔ: Once map has rendered convert to jpg\r\n const createSendDownload = async () => {\r\n const addLegend = document.querySelector('[name=legendCheck]').checked;\r\n const addTitle = document.querySelector('[name=titleCheck]').checked;\r\n const mapImgUrl = await convertMapToImage(document.querySelector('#mapContainer'), print.width, print.height, addLegend, addTitle);\r\n downloadString(mapImgUrl, filename, false, (link) => {\r\n onDownload(link);\r\n });\r\n };\r\n\r\n // ΔVΔVΔ: Reset Map View to pre-print view\r\n const resoreMapView = () => {\r\n map.setSize([web.width, web.height]);\r\n map.setView(webView);\r\n // setSelectedState(restoreState);\r\n };\r\n\r\n //ΔVΔVΔ: Transform Map to print view\r\n const web = getWebDimensions(map);\r\n const print = getPrintDimensions(map, dimensions[0], dimensions[1], dpi);\r\n let webView = map.getView();\r\n var printView = new View({\r\n center: webView.getCenter(),\r\n projection: webView.getProjection(),\r\n zoom: webView.getZoom(),\r\n resolution: web.resolution / print.scaling,\r\n minZoom: 5,\r\n maxZoom: 15\r\n });\r\n\r\n //ΔVΔVΔ: Set map\r\n // map.setView(printView);\r\n // if (tract === 'county') {\r\n // var ext = getPrintExtent(filter, printState);\r\n // map.getView().fit(ext, map.getSize());\r\n // }\r\n\r\n // console.log('@@view set');\r\n // console.log('printState', printState);\r\n // console.log('the extent: ', ext);\r\n // console.log('@@fit set');\r\n\r\n //ΔVΔVΔ: Wait for map to be moved and positioned then change the usState\r\n map.once('rendercomplete', async function () {\r\n //ΔVΔVΔ: Wait for state to re-render\r\n // map.once('rendercomplete', () => {\r\n // setTimeout(async () => {\r\n await createSendDownload();\r\n resoreMapView(); //this isn't the zoom problem\r\n // });\r\n // });\r\n //ΔVΔVΔ: Initiate state render\r\n // setSelectedState(printState);\r\n });\r\n //ΔVΔVΔ: Initiate map rendering\r\n map.setSize([print.width, print.height]);\r\n console.log('@@size set');\r\n};\r\nexport default downloadJPG;\r\n// https://openlayers.org/en/latest/examples/export-pdf.html reference\r\n","import { countiesList } from '../model/StaticVariables';\r\nimport { useCallback, useContext, useEffect, useState } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { Downloader as CSVDown } from './DownloadCSV';\r\nimport { Downloader as JPGDown } from './DownloadJPG';\r\n\r\nimport DownloadContext, { DownloadProvider } from './DownloadProvider';\r\n\r\nconst AppDownloadController = () => {\r\n const countyFips = countiesList.map((a) => a.CC);\r\n const { scope, tract, theme, usState: aState, year, fipsInView } = useContext(InterfaceContext);\r\n const { csv, map, downloading, completeDownload, filter, printState, set_csv_link, set_map_link, set_doc_link, csv_link, map_link, doc_link } = useContext(DownloadContext);\r\n const [selectedFips, setSelectedFips] = useState(countyFips);\r\n const [selectedState, setSelectedState] = useState(false);\r\n const [csvComplete, set_csvComplete] = useState(true);\r\n const [mapComplete, set_mapComplete] = useState(true);\r\n const [docComplete, set_docComplete] = useState(true);\r\n const dataProps = { scope, tract, theme, usState: aState, csvState: printState || aState, filter, year: year.label };\r\n\r\n //ΔVΔVΔ: When downloading begins, set complete status to false\r\n useEffect(() => {\r\n if (!downloading) return;\r\n if (csv) set_csvComplete(false); //if csv is selected then set\r\n if (map) set_mapComplete(false);\r\n }, [downloading]);\r\n\r\n useEffect(() => {\r\n setFipsAndState();\r\n }, [scope, aState, filter, printState, fipsInView]);\r\n\r\n const setFipsAndState = () => {\r\n var tehState = printState ? printState : aState;\r\n if (scope === 'state') {\r\n setSelectedFips([tehState.id]);\r\n setSelectedState(tehState);\r\n return;\r\n }\r\n if (filter === 'current') {\r\n setSelectedFips(fipsInView);\r\n } else if (filter === 'usmap') {\r\n setSelectedFips(countyFips);\r\n } else if (filter === 'state') {\r\n setSelectedFips([printState.id]);\r\n setSelectedState(filter === 'state' ? tehState : false);\r\n }\r\n };\r\n //ΔVΔVΔ: When each download action completes, check to see if both are done then set loading to false\r\n useEffect(() => {\r\n if (!downloading || !csvComplete || !mapComplete || !docComplete) return;\r\n completeDownload();\r\n }, [csvComplete, mapComplete, docComplete]);\r\n\r\n // when csv is selected, delay trigger download until after csv\r\n\r\n return (\r\n <>\r\n {\r\n set_csv_link(link);\r\n set_csvComplete(true);\r\n }}\r\n onDownloadDoc={(link) => {\r\n set_doc_link(link);\r\n set_docComplete(true);\r\n }}\r\n />\r\n {\r\n // setPDF(false);\r\n set_map_link(link);\r\n set_mapComplete(true);\r\n }}\r\n />\r\n \r\n );\r\n};\r\n\r\nconst AppDownloader = ({ children }) => {\r\n return (\r\n \r\n \r\n {children}\r\n \r\n );\r\n};\r\nexport default AppDownloader;\r\n","import { memo, useContext } from 'react';\r\nimport ContentData from './ContentData';\r\nimport ContentInformation from './ContentInformation';\r\nimport ContentMap from './ContentMap';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport DownloadModal, { DownloadModalBackground } from './DownloadModal';\r\nimport AppDownloader from '../controller/AppDownloader';\r\n\r\nconst tabs = [\r\n { id: 'map', obj: },\r\n { id: 'data', obj: },\r\n { id: 'info', obj: }\r\n];\r\n\r\nconst TabsContent = () => {\r\n //if downloading display the map no matter what\r\n const { tab } = useContext(InterfaceContext);\r\n const t = tabs.find((tc) => tc.id === tab.slug);\r\n return (\r\n <>\r\n
\r\n \r\n \r\n \r\n\r\n
\r\n \r\n
\r\n {t.id === 'data' && (\r\n
\r\n \r\n
\r\n )}\r\n {t.id === 'info' && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default memo(TabsContent);\r\n","import TEXTS from \"../controller/TextVariables\";\r\n\r\nconst CDCheader = () => {\r\n return (\r\n
\r\n
\r\n
\r\n {TEXTS.cdc}\r\n {TEXTS.cdc_subtext}\r\n
\r\n
\r\n
\r\n );\r\n};\r\nexport default CDCheader;\r\n","import TEXTS from \"../controller/TextVariables\";\r\n\r\nconst SVIBanner = () => {\r\n return (\r\n
\r\n
\r\n

{TEXTS.cdc_banner}

\r\n

{TEXTS.svi}

\r\n
\r\n
\r\n
\r\n );\r\n};\r\nexport default SVIBanner;\r\n","import { useState } from 'react';\r\nimport { Tooltip, StandardTooltipWindow } from './Tooltip';\r\n\r\nconst DropDownLabel = (props) => {\r\n const { toggleOpen, classStr = 'drop', selected } = props;\r\n return (\r\n
\r\n
{selected.label}
\r\n
\r\n );\r\n};\r\n\r\nconst DropCheck = (props) => {\r\n const { onChange, classStr = 'drop', label, tooltip, list, placeholder, tooltipPlace } = props;\r\n const [open, setOpen] = useState(false);\r\n const toggleOpen = () => {\r\n setOpen(true);\r\n };\r\n\r\n const onSelectItem = (e) => {\r\n const val = !e.target.getAttribute('value');\r\n const name = e.target.getAttribute('name');\r\n onChange(name, val);\r\n };\r\n const onKeyDown = (e) => {\r\n if (e.code == 'Space') {\r\n onSelectItem(e);\r\n e.preventDefault();\r\n }\r\n };\r\n return (\r\n {\r\n setOpen(false);\r\n }}\r\n onFocus={() => setOpen(true)}\r\n onBlur={() => setOpen(false)}\r\n >\r\n }>\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n {list.map((t, i) => {\r\n return (\r\n
\r\n \r\n {t.label}\r\n \r\n
\r\n );\r\n })}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DropCheck;\r\n","import React from 'react';\r\nimport TEXTS from '../controller/TextVariables';\r\nimport DropCheck from './DropCheck';\r\nimport { staticPOIList } from '../model/StaticVariables';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { StandardTooltipWindow } from './Tooltip';\r\n\r\nexport default function PointOfInterestUI() {\r\n const context = React.useContext(InterfaceContext);\r\n const { label, placeholder, tooltip } = TEXTS.controls.poi_select;\r\n\r\n const list = staticPOIList.map((poi) => {\r\n return Object.assign(poi, { selected: context[poi.slug] });\r\n });\r\n const onChange = (name, val) => {\r\n context.setToggle(name);\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n}\r\n\r\nconst PointOfInterestUITooltip = () => {\r\n const { label, tooltip } = TEXTS.controls.poi_select;\r\n\r\n return ;\r\n};\r\n\r\nexport { PointOfInterestUITooltip };\r\n","// import { debounceAxios } from \"../controller/DebounceAxios\";\r\nimport axios from 'axios';\r\n\r\nconst paramsSerializer = (params) => {\r\n return Object.entries(Object.assign({}, params))\r\n .map(([key, value]) => `${key}=${value}`)\r\n .join('&');\r\n};\r\n\r\nconst nominatimSearch = async (searchString, signal) => {\r\n const config = {\r\n url: 'https://nominatim.openstreetmap.org/search',\r\n signal,\r\n paramsSerializer,\r\n params: {\r\n format: 'json',\r\n countrycodes: 'US',\r\n q: searchString,\r\n limit: 10\r\n }\r\n };\r\n return searchLookup(config);\r\n};\r\nexport { nominatimSearch };\r\n\r\nconst nominatimSearchStreet = async (searchString, signal) => {\r\n const config = {\r\n url: 'https://nominatim.openstreetmap.org/search',\r\n signal,\r\n paramsSerializer,\r\n params: {\r\n format: 'json',\r\n countrycodes: 'US',\r\n street: searchString,\r\n limit: 1\r\n }\r\n };\r\n return searchLookup(config);\r\n};\r\nexport { nominatimSearchStreet };\r\n\r\nconst nominatimLookup = async (id, type, signal) => {\r\n const config = {\r\n url: 'https://nominatim.openstreetmap.org/lookup',\r\n signal,\r\n paramsSerializer,\r\n params: {\r\n format: 'json',\r\n osm_ids: type.substring(0, 1) + id\r\n }\r\n };\r\n return axios(config).then((res) => {\r\n return res.data?.[0];\r\n });\r\n};\r\nexport { nominatimLookup };\r\n\r\nconst photonSearch = async (searchString, boundingbox, signal) => {\r\n const config = {\r\n url: 'https://photon.komoot.io/api/',\r\n signal,\r\n paramsSerializer,\r\n params: {\r\n q: searchString,\r\n bbox: boundingbox.join(','),\r\n // osm_tag: \"place:state\",\r\n osm_tag: '!amenity&osm_tag=!convenience&osm_tag=!natural',\r\n limit: 10\r\n }\r\n };\r\n //https://photon.komoot.io/api/?q=walm&bbox=-172.96875,14.604847,-60.117188,72.711903&osm_tag=!amenity&osm_tag=!natural&limit=10\r\n return axios(config).then((res) => {\r\n return res.data;\r\n });\r\n};\r\nexport { photonSearch };\r\n\r\nconst mapboxSearch = async (searchString, boundingbox, signal) => {\r\n const config = {\r\n url: `https://api.mapbox.com/geocoding/v5/mapbox.places/${searchString}.json`,\r\n signal,\r\n paramsSerializer,\r\n params: {\r\n country: 'us',\r\n proximity: 'ip',\r\n autocomplete: true,\r\n types: 'place%2Cpostcode%2Caddress',\r\n access_token: 'pk.eyJ1IjoicXlwMyIsImEiOiJjbGJ2M3MzbTAwNTNxM25yOXh1ZHAyeGhsIn0.ha-q25qjBmsPVAsAMsa8RA'\r\n }\r\n };\r\n if (boundingbox) {\r\n config.params.bbox = boundingbox.join('%2C');\r\n config.params.limit = 10;\r\n }\r\n return axios(config).then((res) => {\r\n return res.data;\r\n });\r\n};\r\n\r\n/**\r\n *GET \r\n /geocoding/v5/mapbox.places/au.json?country=us&proximity=ip&types=place%2Cpostcode%2Caddress&access_token=pk.eyJ1IjoicXlwMyIsImEiOiJjbGJ2M3MzbTAwNTNxM25yOXh1ZHAyeGhsIn0.ha-q25qjBmsPVAsAMsa8RA HTTP/1.1\r\n\r\n */\r\nexport { mapboxSearch };\r\n\r\nconst searchLookup = async (config) => {\r\n if (!config.params.q && !config.params.street) return [];\r\n\r\n return axios(config).then((res) => {\r\n return res.data;\r\n });\r\n};\r\nexport { searchLookup };\r\n","import axios from 'axios';\r\nwindow.onemapSuggestToken = false;\r\n\r\nconst client_id = `4G1256MAuEkMv5is`;\r\nconst client_secret = `2b0c0f2c599c417ab03f3e90bce9cbdf`;\r\nconst credentialsUrl = `https://onemap.cdc.gov/portal/sharing/rest/oauth2/token?client_id=${client_id}&client_secret=${client_secret}&grant_type=client_credentials`;\r\nconst geoCodeServerUrl = `https://onemap.cdc.gov/OneMapServices/rest/services/Geocode/NorthAmerica/GeocodeServer`;\r\n\r\nconst getCredentials = async () => {\r\n var token = window.onemapSuggestToken;\r\n if (token !== false) return token;\r\n return getCredentialsFromAPI().then((obj) => {\r\n window.onemapSuggestToken = obj.access_token;\r\n return window.onemapSuggestToken;\r\n });\r\n};\r\n\r\nconst getCredentialsFromAPI = async () => {\r\n return axios\r\n .get(credentialsUrl)\r\n .then((res) => {\r\n if (res.data.error?.error) {\r\n throw new Error(res.data.error.error);\r\n } else {\r\n const { access_token, expires_in: expires_in_seconds } = res.data; //expiration is in seconds\r\n return { access_token, expires: expires_in_seconds * 1000 + new Date().getTime() };\r\n }\r\n })\r\n .catch((err) => {\r\n return { access_token: false, expires: 0 };\r\n });\r\n};\r\n\r\nexport const onemapSuggest = async (text, extent) => {\r\n const creds = await getCredentials();\r\n return axios.get(`${geoCodeServerUrl}/suggest?f=json&countryCode=USA&category=Address,Primary Postal,City,Subregion,Region&maxSuggestions=10&text=${text}&searchExtent=${extent}&token=${creds}`).then((data) => {\r\n //https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer/findAddressCandidates\r\n return data;\r\n });\r\n};\r\n\r\nexport const onemapFindAddress = async (magicKey, extent) => {\r\n const creds = await getCredentials();\r\n return axios.get(`${geoCodeServerUrl}/findAddressCandidates?f=json&countryCode=USA&magicKey=${magicKey}&searchExtent=${extent}&token=${creds}`).then((data) => {\r\n return data;\r\n });\r\n};\r\n","import { useCallback, useContext, useEffect, useState } from 'react';\r\nimport TEXTS from '../controller/TextVariables';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { searchLookup, nominatimSearch, nominatimSearchStreet, photonSearch, nominatimLookup, mapboxSearch } from '../model/SearchLookup';\r\nimport { onemapSuggest, onemapFindAddress } from '../model/OnemapSearchLookup';\r\nimport ReactAutocomplete from 'react-autocomplete';\r\nimport { fromLonLat, toLonLat } from 'ol/proj';\r\nimport { featureProjection } from '../model/StaticVariables';\r\nimport { Tooltip, StandardTooltipWindow } from './Tooltip';\r\nimport { transformExtent } from 'ol/proj';\r\n\r\nconst SearchUI = () => {\r\n const { setSearch, usState } = useContext(InterfaceContext);\r\n const usExtent = [-172.96875, 14.604847, -60.117188, 72.711903];\r\n const [extent, setExtent] = useState(usExtent);\r\n const [useMapBox, setUseMapBox] = useState(true);\r\n let controller;\r\n\r\n const [value, setvalue] = useState('');\r\n const [items, setItems] = useState([]);\r\n const [justScrolled, setJustScrolled] = useState(false);\r\n\r\n const convertBBoxToLonLat = (bounds) => {\r\n if (!bounds) return null;\r\n const coord1 = bounds.slice(0, 2);\r\n const coord2 = bounds.slice(2);\r\n const coord1LL = toLonLat(coord1, featureProjection);\r\n const coord2LL = toLonLat(coord2, featureProjection);\r\n return [...coord1LL, ...coord2LL];\r\n };\r\n\r\n const convertBBoxFromLonLat = useCallback((bounds) => {\r\n if (!bounds) return null;\r\n const center1 = [bounds[2] * 1, bounds[0] * 1];\r\n const center2 = [bounds[3] * 1, bounds[1] * 1];\r\n const center1CV = fromLonLat(center1, featureProjection);\r\n const center2CV = fromLonLat(center2, featureProjection);\r\n const extent = [...center1CV, ...center2CV];\r\n return extent;\r\n });\r\n const map_nominatim = useCallback((list) => {\r\n return list.map((item, i) => {\r\n return { id: i, label: item.display_name, extent: convertBBoxFromLonLat(item.boundingbox), bounds: item.boundingbox, value: [item.lat * 1, item.lon * 1] };\r\n });\r\n });\r\n const map_onemap = useCallback((list) => {\r\n if (!list) return [];\r\n let i = -1;\r\n return list.map((item) => {\r\n i++;\r\n return {\r\n id: i,\r\n origin: 'onemap',\r\n label: item.text,\r\n value: item.magicKey\r\n };\r\n });\r\n });\r\n const map_mapbox = useCallback((list, usState = false) => {\r\n if (!list) return [];\r\n return list.reduce((out, item, i) => {\r\n let bbox = item?.bbox ? item.bbox : [...item.center, ...item.center];\r\n let newBBox = [bbox[1], bbox[3], bbox[0], bbox[2]];\r\n if (usState) {\r\n let context = item.context.find((ctx) => ctx.id.substring(0, 6) === 'region');\r\n if (context.text !== usState.label) return out;\r\n }\r\n let newObj = {\r\n id: i + 1,\r\n origin: 'mapbox',\r\n placeID: item.id,\r\n type: item.place_type,\r\n label: item.place_name,\r\n extent: convertBBoxFromLonLat(newBBox),\r\n bounds: newBBox,\r\n value: item.center\r\n };\r\n out.push(newObj);\r\n return out;\r\n }, []);\r\n });\r\n const map_photon = useCallback((list) => {\r\n if (!list) return [];\r\n return list\r\n .filter((place) => {\r\n return place.properties.countrycode === 'US';\r\n })\r\n .map((item, i) => {\r\n const { city = '', postcode = '', housenumber = '', street = '', name = '', extent = false, osm_key = '', state = '', osm_id: id, osm_type: type } = item.properties;\r\n let address1 = name + [housenumber || '', street || ''].join(' ') || '';\r\n let cityState = [city, state].filter((e) => e).join(', ');\r\n let label = [address1, cityState, postcode || '']\r\n .filter((i) => i)\r\n .join(', ')\r\n .replace(' ,', ',');\r\n let newext = extent ? [extent[3], extent[1], extent[0], extent[2]] : [];\r\n return {\r\n id: i + 1,\r\n origin: 'photo',\r\n placeID: id,\r\n type,\r\n label,\r\n bounds: convertBBoxFromLonLat(newext),\r\n value: item.geometry.coordinates\r\n };\r\n });\r\n });\r\n const couldBeZipCode = (val) => {\r\n val = val.trim();\r\n if (val.length > 5) return false;\r\n if (isNaN(val)) return false;\r\n return true;\r\n };\r\n const couldBeHouse = (val) => {\r\n const regex = /[a-zA-Z]/g;\r\n val = val.trim();\r\n let firstLet = val.substring(0, 1);\r\n if (isNaN(firstLet) || val.length < 5) return false; //5 is arbitrary number here\r\n if (val.search(regex) < 1) return false; //must have a letter not at the beginning\r\n return true;\r\n };\r\n\r\n const fallbackSearch = async (value, extent, signal) => {\r\n photonSearch(value, extent, controller.signal)\r\n // searchLookup(value, extent, controller.signal)\r\n .then(async (list) => {\r\n if (!list) return;\r\n var lookups = map_photon(list.features);\r\n const zipItem = couldBeZipCode(value) ? await nominatimSearch(value) : false;\r\n const houseItem = couldBeHouse(value) ? await nominatimSearchStreet(value) : false;\r\n if (zipItem) {\r\n let mzip = map_nominatim(zipItem);\r\n lookups = [mzip[0], ...lookups];\r\n }\r\n if (houseItem?.length) {\r\n let mhouse = map_nominatim(houseItem);\r\n lookups = [mhouse[0], ...lookups];\r\n }\r\n setItems(lookups);\r\n })\r\n .catch((err) => {\r\n console.log(err);\r\n console.log('error on lookup');\r\n setItems([]);\r\n });\r\n };\r\n const getSelectionBBox = async (obj) => {\r\n //Onemap\r\n if (obj.origin === 'onemap') {\r\n const onemapBoundingBox = await onemapFindAddress(obj.value, extent).then((res) => {\r\n const foundItem = res.data.candidates[0].extent;\r\n return [foundItem.xmin, foundItem.ymin, foundItem.xmax, foundItem.ymax];\r\n });\r\n const converted = transformExtent(onemapBoundingBox, 'EPSG:4326', 'EPSG:3857');\r\n return converted;\r\n }\r\n //mapbox\r\n if (obj.extent) return obj.extent;\r\n //photon/nominatim\r\n const precise = await nominatimLookup(obj.placeID, obj.type);\r\n return convertBBoxFromLonLat(precise.boundingbox);\r\n };\r\n const onInputEnter = (e) => {\r\n if (e.key == 'Enter') {\r\n getSelectionBBox(items[0]).then((preExtent) => setSearch(preExtent));\r\n setvalue('');\r\n e.target.blur();\r\n }\r\n };\r\n useEffect(() => {\r\n window.addEventListener('scroll', () => {\r\n //close the menu and remove focus from dropdown\r\n setJustScrolled(true);\r\n document.activeElement.blur();\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n setExtent(convertBBoxToLonLat(usState?.bounds) || usExtent);\r\n }, [usState]);\r\n useEffect(() => {\r\n if (!value) {\r\n setItems([]);\r\n return;\r\n }\r\n\r\n if (controller) {\r\n controller.abort();\r\n }\r\n controller = new AbortController();\r\n\r\n var useOneMap = false; //!!! When ready to switch back to using onemapsuggest change to true\r\n if (useOneMap) {\r\n onemapSuggest(value, extent.join(',')).then((res) => {\r\n const mappedItems = map_onemap(res.data.suggestions);\r\n setItems(mappedItems);\r\n });\r\n } else if (useMapBox) {\r\n mapboxSearch(value, extent, controller.signal)\r\n .then((list) => {\r\n var lookups = map_mapbox(list.features, usState);\r\n setItems(lookups);\r\n })\r\n .catch((err) => {\r\n console.log('>>> err', err);\r\n setUseMapBox(false);\r\n fallbackSearch(value, extent, controller.signal);\r\n });\r\n } else {\r\n fallbackSearch(value, extent, controller.signal);\r\n }\r\n }, [value]);\r\n return (\r\n <>\r\n
\r\n
\r\n \r\n \r\n item.label}\r\n renderItem={(item, highlighted) =>\r\n item && (\r\n
\r\n {item.label}\r\n
\r\n )\r\n }\r\n value={value}\r\n open={!justScrolled && items.length > 0}\r\n renderInput={(props) => {\r\n return ;\r\n }}\r\n onChange={async (e) => {\r\n if (controller) {\r\n controller.abort();\r\n }\r\n setvalue(e.target.value);\r\n return e.target.value;\r\n }}\r\n onSelect={async (value, obj) => {\r\n const preExtent = await getSelectionBBox(obj);\r\n setvalue('');\r\n setSearch(preExtent);\r\n return value;\r\n }}\r\n onMenuVisibilityChange={(e) => {\r\n //Reset scroll tracker when user clicks inside the input\r\n setJustScrolled(false);\r\n }}\r\n />\r\n }>\r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default SearchUI;\r\n","import TEXTS from '../controller/TextVariables';\r\nimport { useContext } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { Tooltip, StandardTooltipWindow } from './Tooltip';\r\n\r\nconst OpacitySlider = (props) => {\r\n const { setThemeOpacity, opacity, theme } = useContext(InterfaceContext);\r\n const onChangeOpacity = (e) => {\r\n setThemeOpacity(e.target.value);\r\n };\r\n const { label, tooltip } = TEXTS.controls.svi_opacity;\r\n const id = 'theme-opacity';\r\n\r\n return (\r\n //
\r\n
\r\n }>\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\nexport default OpacitySlider;\r\n\r\nconst OpacitySliderTooltip = () => {\r\n const { tooltip } = TEXTS.controls.svi_opacity;\r\n return ;\r\n};\r\nexport { OpacitySliderTooltip };\r\n","import { useContext } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport TEXTS from '../controller/TextVariables';\r\n\r\n// Theme name, Dekalb County Georgia\r\nexport default function MapTitle() {\r\n const { theme, scope, tract, year, usState } = useContext(InterfaceContext);\r\n const scopeText = scope === 'national' ? TEXTS.controls.comparison.option1 : TEXTS.controls.comparison.option2;\r\n const stateText = scope === 'state' ? (usState.label || '___') + ': ' : '';\r\n const capitalizeFirstLetter = (string) => {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n };\r\n const trackAdj = tract == 'census' ? 'Census Tract' : 'County';\r\n return (\r\n
\r\n

\r\n {theme.label}\r\n

\r\n

\r\n United States\r\n {stateText} {scopeText} Comparison\r\n

\r\n

\r\n By {trackAdj} | {year.label}\r\n

\r\n
\r\n );\r\n}\r\n","import { useContext } from 'react';\r\nimport MapContext from '../controller/MapProvider';\r\nimport { mapStaticVariables } from '../model/StaticVariables';\r\nimport { useEffect } from 'react';\r\nimport { useState } from 'react';\r\n\r\nexport default function AdminControls() {\r\n const { setZoom, map } = useContext(MapContext);\r\n const [localZoom, setLocalZoom] = useState(2);\r\n const [localCenter, setLocalCenter] = useState(mapStaticVariables.coordinates.usCenter3857);\r\n const changeZoom = (e) => {\r\n setZoom(e.target.value);\r\n };\r\n const updateUI = (e) => {\r\n var zoom = map.getView().getZoom();\r\n var center = map.getView().getCenter();\r\n setLocalZoom(zoom);\r\n setLocalCenter(center);\r\n };\r\n // useeffectmap, if map isn't null\r\n // add a listener to the map to listen to centerchange or zoom change\r\n useEffect(() => {\r\n if (!map) return;\r\n map.on('moveend', updateUI);\r\n return () => {\r\n map.un('movend', updateUI);\r\n };\r\n }, [map]);\r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n e.key === 'Enter' && changeZoom(e)} />\r\n
\r\n
\r\n );\r\n}\r\n","import PointOfInterestUI from './PointOfInterestUI';\r\nimport SearchUI from './SearchUI';\r\nimport OpacitySlider from './OpacitySlider';\r\nimport MapTitle from './MapTitle';\r\nimport AdminControls from './AdminControls';\r\nimport { debugMode } from '../model/StaticVariables';\r\n\r\nexport default function ViewControls(props) {\r\n const { type } = props;\r\n const tab = type.label.toLowerCase();\r\n if (tab === 'more info') return null;\r\n //overall_svi\r\n return (\r\n
\r\n
\r\n \r\n {tab === 'map' && (\r\n <>\r\n \r\n \r\n \r\n {debugMode && }\r\n \r\n )}\r\n
\r\n
\r\n );\r\n}\r\n","import { useContext, useEffect, useState } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { tabList } from '../model/StaticVariables';\r\n\r\nexport default function Tablist() {\r\n const { tab: selectedTab, setSelectedTab } = useContext(InterfaceContext);\r\n const [pageViewed, setPageViewed] = useState(false);\r\n\r\n const clickedTab = (e) => {\r\n const tabID = e.target.getAttribute('id').replace(/tab-/, '');\r\n setSelectedTab(tabList[tabID]);\r\n };\r\n return (\r\n
\r\n
\r\n {tabList.map((t) => {\r\n const isSelected = t.id === selectedTab.id;\r\n return (\r\n \r\n );\r\n })}\r\n
\r\n
\r\n );\r\n}\r\n","import { useContext } from 'react';\r\nimport MapContext from '../controller/MapProvider';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { Tooltip, StandardTooltipWindow } from './Tooltip';\r\nimport TEXTS from '../controller/TextVariables';\r\n\r\nconst MobileMenu = (props) => {\r\n const { tooltip } = TEXTS.controls.expandCollapse;\r\n const { openMenu, setOpenMenu } = useContext(InterfaceContext);\r\n const { map } = useContext(MapContext);\r\n const { type } = props;\r\n const tab = type.label.toLowerCase();\r\n const id = 'expand-collapse';\r\n if (tab === 'more info') return null;\r\n\r\n const toggleMenu = () => {\r\n setOpenMenu(!openMenu);\r\n setTimeout(function () {\r\n map.updateSize();\r\n }, 500);\r\n };\r\n return (\r\n <>\r\n
\r\n }>\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\nexport default MobileMenu;\r\n","import React from 'react';\nimport '../view/sass/App.scss';\nimport { InterfaceProvider } from '../model/InterfaceProvider';\nimport { MapProvider } from './MapProvider';\nimport { debugMode } from '../model/StaticVariables';\nimport Interface from '../view/Interface';\nimport { isIE } from './IfIE';\nrequire('ol/ol.css');\n\n//check if IE and if not remove fallback\nif (!isIE()) {\n document.getElementById('iefallback')?.remove();\n}\n\nfunction App() {\n return (\n
\n \n \n \n \n \n
\n );\n}\nexport default App;\n","import { useContext, useEffect, useState } from \"react\";\r\nimport { InterfaceContext } from \"../model/InterfaceProvider\";\r\nimport Modal, { ModalBackground } from \"./Modal\";\r\n\r\nconst ErrorModal = (props) => {\r\n const { errorMessage, setErrorMessage, err } = useContext(InterfaceContext);\r\n const pixelCoords = [0, 0];\r\n const [messageText, setMessageText] = useState(errorMessage);\r\n\r\n const closeWindow = () => {\r\n setErrorMessage(\"\", err);\r\n };\r\n useEffect(() => {\r\n if (errorMessage) {\r\n setMessageText(errorMessage);\r\n }\r\n }, [errorMessage]);\r\n\r\n return (\r\n <>\r\n
\r\n \r\n
An error occured loading the page
\r\n
\r\n {messageText}\r\n {JSON.stringify(err)}\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\nexport default ErrorModal;\r\n\r\nconst ErrorModalBackground = () => {\r\n const { errorMessage } = useContext(InterfaceContext);\r\n return ;\r\n};\r\nexport { ErrorModalBackground };\r\n","import { timeout } from 'd3';\r\nimport { useContext, useEffect, useState } from 'react';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport Modal, { ModalBackground } from './Modal';\r\n\r\nconst MessageModal = (props) => {\r\n const { errorMessage, setMessage, message } = useContext(InterfaceContext);\r\n const pixelCoords = [0, 0];\r\n // const [waiting, setWaiting] = useState(false);\r\n const [messageText, setMessageText] = useState(errorMessage);\r\n\r\n const closeWindow = () => {\r\n // setWaiting(false);\r\n setMessage('');\r\n };\r\n useEffect(() => {\r\n if (message) {\r\n setMessageText(message);\r\n setTimeout(() => {\r\n closeWindow();\r\n }, 5000); \r\n }\r\n }, [message]);\r\n\r\n const vis = message && message !== 'hide' ? 'show' : '';\r\n const visClass = message && message !== 'hide' ? 'show' : '';\r\n\r\n return (\r\n <>\r\n
\r\n \r\n
{message}
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\nexport default MessageModal;\r\n\r\nconst MessageModalBackground = () => {\r\n const { message } = useContext(InterfaceContext);\r\n return ;\r\n};\r\nexport { MessageModalBackground };\r\n","const isIE = () => {\r\n let ua = window.navigator.userAgent;\r\n let is = /MSIE|Trident/.test(ua);\r\n return is;\r\n};\r\nexport { isIE };\r\n\r\nconst IfIE = ({ children }) => {\r\n if (!isIE()) return null;\r\n return <>{children};\r\n};\r\nexport { IfIE };\r\n\r\nconst UnlessIE = ({ children }) => {\r\n if (isIE()) return null;\r\n return <>{children};\r\n};\r\nexport { UnlessIE };\r\n","export const AdobeAnalytics = {\r\n get satelite() {\r\n return window?._satellite || false;\r\n },\r\n get config() {\r\n return {\r\n ch: 'OADC',\r\n prop3: window.location.host,\r\n prop5: 'eng',\r\n prop16: window.location.host + window.location.pathname,\r\n prop41: 'SVI Interactive Map',\r\n prop8: 'App'\r\n };\r\n },\r\n sendPageView(str) {\r\n const _satellite = this.satelite;\r\n if (!_satellite) return;\r\n\r\n var dataObject = this.config;\r\n dataObject.pageName = str;\r\n dataObject.prop2 = str;\r\n\r\n _satellite.track('pageview', dataObject);\r\n },\r\n sendInteraction(eventLabel, eventValue) {\r\n const _satellite = this.satelite;\r\n if (!_satellite) return;\r\n\r\n var dataObject = this.config;\r\n dataObject.pageName = document.title;\r\n dataObject.label = eventLabel;\r\n dataObject.interactionType = 'o';\r\n dataObject.interactionValue = eventValue;\r\n // console.log('track this...', dataObject);\r\n _satellite.track('interaction', dataObject);\r\n\r\n // var dataObject = {};\r\n // var eventType = 'o';\r\n // dataObject.ch = 'OADC';\r\n // dataObject.pageName = document.title;\r\n // dataObject.label = eventLabel;\r\n // dataObject.interactionType = eventType;\r\n // dataObject.interactionValue = 'ci-' + eventLabel + ': ' + eventValue;\r\n\r\n // console.log('track this...', dataObject);\r\n // _satellite.track('interaction', dataObject);\r\n }\r\n};\r\n","import { AdobeAnalytics } from './AdobeAnalytics';\r\nimport { InterfaceContext } from '../model/InterfaceProvider';\r\nimport { useContext, useEffect } from 'react';\r\n\r\nexport const Analytics = () => {\r\n const { tab, scope, theme, state, tract, year } = useContext(InterfaceContext);\r\n\r\n const dataToSlug = () => {\r\n // console.log(year, theme, scope, state, tract);\r\n return [year.label, theme.label, scope === 'national' ? 'US' : state?.label || '', tract].join('-').replace(' ', '-').toLowerCase();\r\n\r\n //2020-overall-US-Alabama-county\r\n };\r\n ////theme, scope, state, tract, year\r\n\r\n //create new hook, use legit hit (set a timeout in the hook 1 sec or 500 ms before tracking)\r\n useEffect(() => {\r\n AdobeAnalytics.sendPageView(tab.label);\r\n }, [tab]);\r\n\r\n useEffect(() => {\r\n const dataSlug = dataToSlug();\r\n // console.log('send data slug');\r\n AdobeAnalytics.sendInteraction('data-view', dataSlug);\r\n }, [year, theme, scope, state, tract]);\r\n\r\n return null;\r\n};\r\n","import React, { useContext } from 'react';\nimport { InterfaceContext } from '../model/InterfaceProvider';\nimport DataControls from './DataControls';\nimport TabsContent from './TabsContent';\nimport CDCHeader from './CDCHeader';\nimport SVIbanner from './SVIBanner';\nimport ViewControls from './ViewControls';\nimport Tablist from './Tablist';\nimport MobileMenu from './MobileMenu';\nimport ErrorModal from './ErrorModal';\nimport MessageModal from './MessageModal';\nimport { UnlessIE } from '../controller/IfIE';\nimport { Analytics } from '../controller/Analytics';\nimport MapTitle from './MapTitle';\nimport Legend from './Legend';\n\nvar scrolled = false;\n//ΔVΔVΔ: make update when interface loads\nconst Interface = () => {\n const { tab, openMenu } = useContext(InterfaceContext);\n\n if (window.location.hash === '#more-pcm' && !scrolled) {\n scrolled = true;\n setTimeout(() => {\n var link = document.querySelector('[name=preparedcountymaps]');\n var y = link.getBoundingClientRect().y;\n document.body.scrollTop = y;\n\n window.scroll({\n top: y,\n behavior: 'smooth'\n });\n }, 500);\n }\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};\nexport default Interface;\n","import { staticYearList } from '../model/StaticVariables';\r\nimport axios from 'axios';\r\nimport { useEffect, useState } from 'react';\r\n\r\nconst App404 = () => {\r\n const style = {\r\n width: '100%',\r\n height: '45vh'\r\n };\r\n useEffect(() => {\r\n document.querySelector('#foundURL').innerHTML = ' ';\r\n document.querySelector('#fourUrl').innerHTML = ' ';\r\n // checkPreparedCountyMaps();\r\n checkDataDownloads();\r\n }, []);\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n );\r\n};\r\nexport default App404;\r\n\r\nconst preparedCountyMapUrl = (obj) => {\r\n const { yearName, stateName, countyName } = obj;\r\n const stateSlug = stateName.replace(/ /g, '');\r\n return `https://svi.cdc.gov/Documents/CountyMaps/2020/${stateName}/${stateSlug}${yearName}_${countyName}.pdf`;\r\n};\r\n\r\nconst readStatesCountiesFromXML = (xml, editFn) => {\r\n const outputArr = [];\r\n const states = xml.data.getElementsByTagName('State');\r\n for (var st of states) {\r\n const stateName = st.getAttribute('name');\r\n const counties = st.getElementsByTagName('County');\r\n for (var cnt of counties) {\r\n const countyName = cnt.getAttribute('name') || cnt.innerHTML;\r\n var obj = editFn({ stateName, countyName });\r\n\r\n outputArr.push(obj);\r\n }\r\n }\r\n return outputArr;\r\n};\r\nconst hasAllStrings = (searchStr, ...args) => {\r\n var outcome = true;\r\n for (var str of args) {\r\n if (searchStr.toLowerCase().indexOf(str.toLowerCase()) === -1) {\r\n outcome = false;\r\n }\r\n }\r\n return outcome;\r\n};\r\nconst checkDataDownloads = async () => {\r\n const stateList = await axios.get(`https://svi.cdc.gov/xmldata/SVI_StatesForDownload.xml`, { responseType: 'document' }).then((res) => {\r\n const states = res.data.getElementsByTagName('State');\r\n const out = [];\r\n for (var st of states) {\r\n var stName = st.getAttribute('value');\r\n if (stName !== 'US' && stName !== 'NA') out.push(stName);\r\n }\r\n return out;\r\n });\r\n\r\n var urlList = [];\r\n // var base = `https://svi.cdc.gov/Documents/Data`;\r\n var base = `https://grasp_internal_test.cdc.gov/svi2021/Documents_Data`;\r\n\r\n const generateDataFilesListByType = (type = 'db', ext = 'zip', year = 2000) => {\r\n var urlArr = [];\r\n\r\n urlArr.push(`${base}/${year}/${type}/SVI_${year}_US.${ext}`);\r\n urlArr.push(`${base}/${year}/${type}/SVI_${year}_US_COUNTY.${ext}`);\r\n for (var st of stateList) {\r\n var slug = st.replace(/ /g, '');\r\n urlArr.push(`${base}/${year}/${type}/states/${slug}.${ext}`);\r\n urlArr.push(`${base}/${year}/${type}/states_counties/${slug}_county.${ext}`);\r\n }\r\n return urlArr;\r\n };\r\n\r\n for (var year of staticYearList) {\r\n var zips = generateDataFilesListByType('db', 'zip', year.label);\r\n var csvs = generateDataFilesListByType('csv', 'csv', year.label);\r\n urlList = urlList.concat(zips, csvs);\r\n }\r\n urlList = urlList.filter((url) => {\r\n if (hasAllStrings(url, '2000', 'COUNTY')) return false;\r\n if (hasAllStrings(url, '2000', 'STATES', 'zip')) return false;\r\n if (hasAllStrings(url, '2000', 'PuertoRico.csv')) return false;\r\n\r\n if (hasAllStrings(url, '2010', 'COUNTY', 'csv')) return false;\r\n if (hasAllStrings(url, '2010', 'PuertoRico')) return false;\r\n if (hasAllStrings(url, '2010', 'states_counties')) return false;\r\n // if(hasAllStrings(url,'2010','zip')) return false\r\n return url;\r\n });\r\n\r\n const urlListz = await batch404Lookup(urlList);\r\n // const found404String = urlListz.found404.join(`\r\n // `);\r\n // const clearedStr = urlListz.cleared.join(`\r\n // `)\r\n // console.log('===> found 404s');\r\n // console.log(found404String);\r\n // document.querySelector('#foundURL').innerHTML=clearedStr\r\n // document.querySelector('#fourUrl').innerHTML=found404String\r\n};\r\n\r\nconst checkPreparedCountyMaps = async () => {\r\n var yearFiles = await loadYearData();\r\n var year_state_county_arr = [];\r\n for (var xml of yearFiles) {\r\n let yearName = xml.yearName;\r\n let state_county_arr = readStatesCountiesFromXML(xml, (obj) => {\r\n obj.yearName = yearName;\r\n return obj;\r\n });\r\n year_state_county_arr = year_state_county_arr.concat(state_county_arr);\r\n }\r\n\r\n const search404Arr = year_state_county_arr.slice(0, 100).map(preparedCountyMapUrl);\r\n const found404 = await batch404Lookup(search404Arr);\r\n\r\n const found404String = found404.join(`\r\n`);\r\n console.log('===> found 404s');\r\n console.log(found404String);\r\n};\r\n\r\nconst batch404Lookup = async (arr) => {\r\n const found404 = [];\r\n const cleared = [];\r\n await Promise.all(\r\n arr.map(async (url) => {\r\n await axios\r\n .head(url)\r\n .then((res) => {\r\n cleared.push(url);\r\n document.querySelector('#foundURL').append(\r\n url +\r\n `\r\n `\r\n );\r\n })\r\n .catch((err) => {\r\n found404.push(url);\r\n document.querySelector('#fourUrl').append(\r\n url +\r\n `\r\n `\r\n );\r\n });\r\n })\r\n );\r\n console.log('AFETR lookus');\r\n return { found404, cleared };\r\n};\r\n\r\nconst loadYearData = async () => {\r\n var yearFiles = staticYearList.slice(0, 1);\r\n\r\n const promises = yearFiles.map(async (yearFile) => {\r\n let yearName = yearFile.label;\r\n return axios.get(`/data/list/${yearName}_counties.xml`, { responseType: 'document' }).then((res) => {\r\n const xml = res.data;\r\n return { yearName, data: xml };\r\n });\r\n });\r\n return Promise.all(promises);\r\n};\r\n","import 'react-app-polyfill/ie9';\nimport 'react-app-polyfill/ie11';\nimport 'react-app-polyfill/stable';\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './controller/App';\nimport App404 from './controller/App404';\n\nconst USE_APP = process.env?.REACT_APP_BUILD?.replace(/ /g, '');\n\nif (!document.querySelector('#root')?.childNodes?.length) {\n switch (USE_APP) {\n case '404':\n case 404:\n ReactDOM.render(\n \n \n ,\n document.getElementById('root')\n );\n break;\n default:\n ReactDOM.render(\n \n \n ,\n document.getElementById('root')\n );\n }\n}\n"],"sourceRoot":""}