{"version":3,"sources":["style/theme.js","style/material.js","js/components/shared/ErrorIcon.js","js/config.js","js/configs/config.layerTitles.ts","store/slices/appSlice.ts","js/configs/config.zones.ts","js/configs/config.mainLayers.ts","js/configs/config.layers.js","js/configs/config.search.ts","js/components/shared/Search.js","js/components/shared/IconButton.js","js/components/map/controls/MapControlGroup.js","js/components/shared/ListWrapper.js","js/utils/layerFactory.js","store/slices/sketchSlice.ts","store/slices/uploadSlice.ts","store/slices/measurementSlice.ts","store/slices/lightStudySlice.ts","store/index.ts","js/utils/gpAddressInfo.utils.ts","js/utils/esri.js","css/images/map-location-icon.png","css/images/marker.png","js/utils/api.js","js/configs/config.sketch.ts","js/controllers/SketchController.ts","js/controllers/DimensionAnalysisController.ts","js/utils/geometry.utils.ts","js/controllers/MapController.js","js/components/map/controls/MapControlLayers.js","js/components/shared/DCBoundary.js","js/components/map/controls/MapControls.js","js/components/MapView.js","js/components/shared/StyledTooltip.js","js/components/SiteControls/SiteControls.tsx","js/components/site/controls/DeleteControl/DeleteControl.js","js/components/site/SiteInformation.js","js/components/shared/Button.js","js/components/site/controls/HelpControl.js","js/components/shared/Stepper.js","js/components/shared/icons/FileIcon.js","js/components/shared/icons/KmzFileIcon.js","js/components/shared/icons/SlpkFileIcon.js","js/utils/file.utils.tsx","js/components/shared/LinearProgressBar.js","js/components/site/controls/submitparts/FileCard.js","js/components/modals/DynamicModal.js","js/components/site/controls/submitparts/ErrorMessagesDetailsButton.tsx","js/components/site/controls/submitparts/EditView.js","js/components/shared/CompassIcon.js","js/components/shared/NumberCounter.js","js/configs/config.gpService.ts","js/utils/gpUpload.utils.ts","js/utils/gpEditBuildingLocation.utills.ts","js/components/site/controls/submitparts/EditPosition.js","js/components/site/controls/submitparts/EditPositionByAddress/EditPositionByAddress.tsx","js/components/site/controls/submitparts/EditActions.js","js/components/site/controls/submitparts/Edit.js","js/components/shared/icons/KmzSlpkFileIcon.js","js/components/shared/ErrorTriangleIcon.js","js/components/site/controls/submitparts/UploadView.js","js/components/site/controls/submitparts/UploadActions.js","js/components/site/controls/submitparts/Upload.js","js/components/site/controls/submitparts/Export.js","js/components/submit/Submit.js","js/utils/date.js","js/components/site/controls/LigthStudy/LightStudyDateSection/LightStudyDateSection.tsx","js/components/site/controls/LigthStudy/LightStudyTimeSelection/LightStudyTimeSelection.tsx","js/components/site/controls/LigthStudy/LightStudyAction/LightStudyAction.tsx","js/components/site/controls/LigthStudy/LightStudyShadowControls/LightStudyShadowControls.tsx","js/components/site/controls/ShadowCast/ShadowCast.tsx","js/components/site/controls/LigthStudy/LightStudy.tsx","js/components/site/controls/shadowReportPDF/pdfStyle.config.js","js/components/site/controls/shadowReportPDF/LotResults.js","css/images/logo.png","js/components/site/controls/shadowReportPDF/Header.js","js/components/site/controls/shadowReportPDF/ShadowPage.js","js/components/site/controls/shadowReportPDF/ShadowReportDocument.js","js/components/site/controls/shadowReportPDF/ShadowReport.tsx","js/components/site/controls/LineOfSight/LineOfSight.tsx","js/components/site/controls/Sketch/SketchEdit/SketchEdit.tsx","js/components/site/controls/Sketch/SketchList/SketchList.tsx","js/components/site/controls/Sketch/Sketch.tsx","js/components/site/controls/Measurement/MeasurementDimensionAnalysis/MeasurementDimensionAnalysis.tsx","js/components/site/controls/Measurement/MeasurementDirectLineWidget/MeasurementDirectLineWidget.tsx","js/components/site/controls/Measurement/MeasurementAreaWidget/MeasurementAreaWidget.tsx","js/components/site/controls/Measurement/MeasurementTypeButton/MeasurementTypeButton.tsx","js/components/site/controls/Measurement/Measurement.tsx","js/components/SitePanel.js","js/components/LayerListItem.js","js/components/LayersPanel.js","js/components/Logo.js","css/images/welcome.jpeg","js/components/modals/WelcomeModal/WelcomeModal.tsx","js/components/modals/NavigationModal.js","js/components/modals/DisclaimerModal.js","js/components/modals/UploadHelpModal.js","js/components/modals/ZoningStandardsModal.js","js/components/InteractiveHelp.js","js/components/InteractiveIntro.js","js/components/App.js","reportWebVitals.js","index.js","js/configs/config.basemaps.js","js/configs/config.view.js","js/configs/config.help.js","js/configs/config.mobileHelp.js"],"names":["defaultTheme","spacing","fontFamily","palette","primary1Color","colors","primary2Color","primary3Color","accent1Color","accent2Color","accent3Color","textColor","alternateTextColor","canvasColor","borderColor","colorManipulator","disabledColor","appBar","card","raisedButton","color","disabledTextColor","toolbar","backgroundColor","dialog","titleColor","bodyColor","calendarTheme","timePicker","accentColor","clockColor","clockCircleColor","headerColor","selectColor","selectTextColor","datePicker","calendarTextColor","calendarYearBackgroundColor","textField","stepper","materialStyle","iconButton","sitePanel","padding","siteControls","height","width","layer","upload","style","buttonStyle","borderRadius","labelStyle","fontWeight","textTransform","uploadNext","marginBottom","display","chooseFile","border","marginTop","lineHeight","mapControls","minWidth","maxWidth","welcome","cardMedia","backgroundSize","backgroundPosition","backgroundRepeat","overlay","bottom","cardTitle","titleStyle","fontSize","cardHeader","title","subtitle","dateTimePicker","margin","input","cursor","radioButtonGroup","radioButton","paddingRight","paper","flexDirection","transition","position","zIndex","right","top","toolbarGroup","justifyContent","list","listItem","cardText","cardTextWelcomeBody","primary","paddingTop","paddingBottom","secondary","cardAction","alignItems","cardActionWelcome","icon","dialogTitleNavigation","dialogWelcomeBody","overflowY","hint","edit","menu","menuItem","ErrorIcon","xmlns","viewBox","fill","fillRule","stroke","strokeWidth","d","transform","cx","cy","r","x","rx","gpUrl","LAYER_TITLES","DC_DARK_GRAY","ZONING_DEVELOPMENT_STANDARD","ZONING","BUILDINGS","TREES","NEIGHBORHOODS","PLANNED_UNIT_DEVELOPMENT","METRO_RAIL","METRO_STATIONS","NEIGHBORHOOD_CLUSTERS","initialState","activeTool","siteExpanded","mobile","displayDisclaimer","displayUploadHelp","displayZoningStandard","hasDisplayed","displayNavigation","enableHelp","enableIntro","zones","type","districts","id","visible","mainLayers","date","Date","view3DReady","displayShadowHighlighted","highlightColor","removedBuildings","activeWidget","isShadowCastLoaded","appSlice","createSlice","name","reducers","setActiveTool","state","action","payload","setSiteExpanded","setMobile","setDisplayDisclaimer","setDisplayUploadHelp","toggleZoningStandard","setEnableHelp","setEnableIntro","setDisplayNavigation","setDate","setView3DCompare","view3DCompare","setMapCompare","mapCompare","setView3DReady","setDisplayShadowHighlighted","setHighlightColor","setSite","site","setCurrentBuilding","currentBuilding","setRemovedBuildings","addRemovedBuilding","push","popRemovedBuilding","pop","setView3D","view3D","setMap","map","setAllDistrictsVisibility","i","length","districtIndex","setDistrictVisibility","zoneType","districtId","zoneIndex","findIndex","zone","district","listenMainLayersControl","setZoneDistrictsVisibility","find","forEach","setMainLayerVisibility","layerId","layerIndex","setLitenMainLayersControl","setActiveWidget","setIsShadowCastLoaded","actions","activeToolState","appReducer","siteExpandedState","mobileState","displayDisclaimerState","displayUploadHelpState","displayZoningStandardState","enableHelpState","enableIntroState","displayNavigationState","zonesState","mainLayersState","view3DReadyState","displayShadowHighlightedState","highlightColorState","siteState","currentBuildingState","removedBuildingsState","view3DState","isShadowCastLoadedState","activeWidgetState","layers","options","url","popupEnabled","renderer","symbol","symbolLayers","material","edges","imageFormat","sublayers","labelsVisible","labelingInfo","minScale","labelExpressionInfo","expression","halo","size","basemaps","basemapConfig","layersConfig","viewOptions","viewConfig","helpSteps","helpConfig","mobileHelpSteps","mobileHelpConfig","portalId","GP_SERVICE_STAGING","GP_SERVICE_PROD","process","REACT_APP_ENV","gp","kmzToMultipatch","reverseGeocodeKMZ","editBuildingLocation","publishSLPK","urls","address","encodeURIComponent","latlon","zoom","join","y","l","staticText","desciption","closing","searchAllEnabled","resultGraphicEnabled","includeDefaultSources","sources","singleLineFieldName","exactMatch","outFields","maxResults","maxSuggestions","enableSuggestions","minSuggestCharacters","autoNavigate","placeholder","Search","props","containerClass","searchClass","error","onSearchComplete","onSelectResult","onSuggestComplete","useState","initialized","setInitialized","searchRef","useRef","useSelector","useEffect","hasOwnProperty","ready","loadModules","EsriSearch","esriSearch","view","container","current","searchConfig","on","className","ref","IconButton","this","callback","svg","children","onEnter","onExit","onClick","disableButton","onMouseEnter","onMouseLeave","alt","src","Component","MapControlGroup","ListWrapper","List","layerFactory","createLayer","SceneLayer","MapImageLayer","WebScene","GraphicsLayer","FeatureLayer","sketchSlice","status","isMagnifierOn","sketches","setSketchStatus","setSelectedSketch","selectedSketch","removeSketch","filter","sketch","uid","addSketch","updateSketch","targetSketchIndex","setIsMagnifierOn","sketchStatusState","sketchReducer","selectedSketchState","sketchesState","isMagnifierOnState","uploadSlice","uploading","uploadedFiles","step","isSelectLocationOnMapActive","setSelectedFileId","selectedFileId","setUploading","setUploadedFiles","setUploadedFile","uploadedFile","itemId","setError","setStep","incrementStep","decrementStep","setIsSelectLocationOnMapActive","resetSubmitWorkflow","undefined","selectedFileIdState","uploadReducer","uploadingState","uploadedFilesState","errorState","stepState","isSelectLocationOnMapActiveState","selectedFileState","MEASUREMENT_UNITS","selectedMeasurementType","dimensionAnalysis","isEmpty","directLineMeasurementStatus","areaMeasurementStatus","selectedMeasurementUnit","measurementSlice","setSelectedMeasurementType","setDimensionAnalysisStatus","setDimensionAnalysisIsEmpty","setDirectLineMeasurementStatus","setAreaMeasurementStatus","setSelectedMeasurementUnit","selectedMeasurementTypeState","measurementReducer","dimensionAnalysisState","directLineMeasurementStatusState","areaMeasurementStatusState","selectedMeasurementUnitState","selectedDate","isLightStudyActive","isShadowCastActive","lightStudySlice","setSelectedDate","setIsLightStudyActive","setIsShadowCastActive","selectedDateState","isLightStudyActiveState","isShadowCastActiveState","rootReducer","combineReducers","middlewares","configureStore","reducer","middleware","getDefaultMiddleware","getSiteAddressInfoFromPoint","mapPoint","Query","query","locator","zoneQuery","geometry","returnGeometry","Promise","all","executeQueryJSON","locationToAddress","location","geocode","features","zoneFeature","attributes","Address","LongLabel","siteAddressInfo","longLabel","latitude","longitude","zoneCode","Zoning_Label","zoneDescription","Zone_Description","zoneDistrict","Zone_District","zoneWebUrl","Zoning_Web_URL","console","log","synchronizeViews","views","watchUtils","idx","others","concat","splice","viewpointWatchHandle","viewStationaryHandle","otherInteractHandlers","scheduleId","Array","isArray","clear","handle","remove","clearTimeout","watch","newValue","setTimeout","otherView","viewpoint","value","whenTrue","synchronizeView","updateRenderer","clone","symbolLayer","getItemAt","colorMixMode","SolidEdges3D","addSceneLayer","sceneLayerUrl","store","getState","sceneLayerId","previousLayer","findLayerById","LayerFactory","elevationInfo","mode","load","textureSetDefinitions","add","addFootprintGraphic","footprint","Graphic","Polygon","footprintGraphicId","previousGraphic","graphics","items","graphic","polygon","footprintGraphic","outline","addUploadLayer","selectedFile","slpk","mapController","highlightHandler","sceneLayer","dispatch","z","fullExtent","goTo","target","tilt","duration","replaceUploadLayer","updatedPosition","centroid","LATITUDE","LONGITUDE","FULLADDRESS","takeScreenshot","loadAll","when","whenTrueOnce","whenFalseOnce","screenshot","getInsetMapUrl","PrintTemplate","print","PrintParameters","printTemplate","format","layout","exportOptions","dpi","printParameters","template","outSpatialReference","spatialReference","execute","generateInsetMap","extent","WebMap","MapView","insetMap","basemap","insetMapview","constraints","rotationEnabled","ui","getLotData","uploadGeometry","getQueryResults","lotQuery","catch","e","results","feature","generateCurrentBuildingGraphic","Point","point","generatePdfInsetMapCircleArea","buildingCircle","generatePdfInsetMapGraphic","buildingGraphic","apiUtils","generateZoneDefinitionExpression","expressions","generateBuildingDefinitionExpression","buildings","definition","convertFeetToMeters","number","convertNumber","sign","isNaN","Math","abs","bytesToSize","bytes","sizes","parseInt","floor","toFixed","SKETCH_INITIAL_HEIGHT","SKETCH_INITIAL_UNIT","SKETCH_DEFAULT_TITLE","sketchViewModelProperties","defaultUpdateOptions","tool","enableZ","multipleSelectionEnabled","reshapeOptions","edgeOperation","vertexOperation","polygonSymbol","snappingOptions","enabled","distance","featureSources","buildingsLayer","tooltipOptions","labelOptions","SketchController","initializeSketchViewModel","SketchViewModel","event","unit","removeLocationPinGraphic","mapClick","update","updateMapUnitBasedOnSelectedSketch","setMagnifierVisibility","prevSketch","updateMeasurementUnit","setSketchColor","cloneSymbol","startSketch","setSketchLabelsVisibility","create","deleteSelectedSketch","delete","cancelSketch","cancel","updateSketchHeight","setSketchLayerVisibility","toggleSketchLayerVisibility","visibility","setSketchVisibility","getSketchGraphicByUid","setSelectedSketchShadow","symbolClone","castShadows","setSelectedSketchShadowHighlight","highlighted","whenLayerView","layerView","highlightOptions","shadowColor","shadowOpacity","shadowDifference","highlight","sketchController","DimensionAnalysisController","initializeDimensionAnalysis","DimensionAnalysis","DimensionLayer","reactiveUtils","textBackgroundColor","source","dimensions","dimensionsCount","onComplete","interactive","start","createLengthDimensions","then","updateLangthDimensions","removeAll","selectedDimension","dimensionAnalysisController","INITIAL_EDIT_POSITION","FEET_TO_METERS_VALUE","convertXYCoordinatesToDegrees","buildingPositionParameters","deg","xPositionMeters","yPositionMeters","rad","atan2","PI","getXYDistanceFromCenter","feetDistance","sqrt","feet","meters","movePolygon","distanceMeters","directionAngleClockwiseNorth","geoJSONPolygon","arcgisToGeoJSON","toJSON","updatedGeoJSONPolygon","transformTranslate","units","updatedPolygon","geojsonToArcGIS","fromJSON","getUpdatedBuildingFootprintGeometry","getUpdatedFilePosition","newPosition","prevPosition","Object","entries","key","prevValue","getXYDistanceBetweenPoints","originPoint","targetPoint","geodesicUtils","targetXDistance","targetYDistance","xDistance","geodesicDistance","yDistance","xDistanceValue","yDistanceValue","newXOffset","round","newYOffset","MapController","initialize","mapViewRef","compareViewRef","setDefaultOptions","version","css","SceneView","scene","portalItem","portal","filteredLayers","fixZoningLayerRendererValues","compareMap","filteredLayersCompare","esriLayersPromises","esriLayers","esriLayersPromisesCompare","esriLayersCompare","addMany","sceneView","window","layerViews","neighborhoodLayerView","item","setupMagnifier","handleURLParams","environment","lighting","allLayers","compareMapLayer","handleBasemapChange","basemapId","Basemap","selectedBasemapConfig","layerOptions","baselayerProperties","baselayer","baseLayers","fromId","waitViewUpdate","updateViewsLightning","hash","replace","startUpParams","JSON","parse","lat","lng","zoningLayer","updatedUniqueValueInfos","uniqueValueInfos","uniqueValueInfo","uviClone","updatedValue","initializeLineOfSightWidget","LineOfSight","lineOfSight","removeLineOfSight","destroy","stopLineOfSight","viewModel","stop","updateZoneLayerExpression","definitionExpression","g","addLocationPinGraphic","PictureMarkerSymbol","newGraphic","marker","replaceLocationGraphic","replaceSelectedFileFootprintGraphic","oldGraphic","newGeometry","setMapMeasurementUnit","setSelectedFileShadow","selectedFileLayer","rendererClone","setSelectedFileShadowHighlight","queryFeatures","OID","setHighlightShadowColor","highlightGraphic","mapIcon","Circle","center","radius","radiusUnit","setDirectLineMeasurementUnit","setAreaMearurementUnit","initializeAreaMeasurement","widgetRef","AreaMeasurement3D","removeAreaMeasurementWidget","unitOptions","newUnit","initializeDirectLineMeasurement","DirectLineMeasurement3D","removeDirectLineMeasurementWidget","getMeasurementWidgetAreaState","clearAreaMeasurement","getMeasurementWidgetDirectLineState","clearDirectLineMeasurement","magnifier","factor","offset","_throttle","findLayerByTitle","screenPoint","toScreen","button","buttons","sketchStatus","isSketchActive","hitTest","data","keys","includes","ShadowCast","whenEqualOnce","selectedStyle","unselectedStyle","MapControlLayers","useDispatch","hovered","setHovered","selectedBasemap","setSelectedBasemap","handleCheck","currentTarget","checked","zoneDevelopmentLayer","clusterLayer","handleListItemClick","evt","primaryText","leftCheckbox","Checkbox","onChange","thumbnail","hoverColor","leftAvatar","DCBoundary","MapControls","initializedOnce","setInitializedOnce","detailed","setDetailed","isButtonDisabled","setIsButtonDisabled","Compass","NavigationToggle","handleMapZoom","setDetailedTrue","setDetailedFalse","navigator","geolocation","getCurrentPosition","coords","initialViewProperties","splitPercentage","setSplitPercentage","showNoResults","setShowNoResults","compareToolActive","cleanup","shortid","generate","response","numResults","result","minSize","maxSize","split","allowResize","defaultSize","resizerStyle","StyledTooltip","withStyles","tooltip","arrow","Tooltip","SiteControls","selectedTab","setSelectedTab","displayCompare","displaySubmitNewFile","displayDelete","displayReport","TABS","label","callbackAction","HELP_TAB","currentTabs","tab","Tabs","selectedTool","variant","scrollButtons","Tab","onSelect","DeleteControl","api","disabled","OBJECTID","preventDefault","SiteInformation","setAddress","zoneInfo","setZoneInfo","googleStreetViewImage","setGoogleStreetViewImage","noCurrentSite","addressTemp","zoneInfoTemp","googleStreetViewImageTemp","handleOfficialZoning","webMercatorUtils","lngLatToXY","open","Card","backgroundImage","containerStyle","Button","React","forwardRef","active","helpOptions","HelpControl","handleHelpOption","helpStyle","red500","fullWhite","option","Stepper","FileIcon","KmzFileIcon","SlpkFileIcon","getFileType","file","getFileIcon","LinearProgressBar","min","max","message","messageFormatted","FileCard","hasFinishedUploading","showEditSearch","toggleShowEditSearch","currentFile","isSelectedFile","selectedFileSceneLayer","stopPropagation","DynamicModal","handleClose","Dialog","onClose","DialogTitle","DialogActions","DialogContent","DialogContentText","ErrorMessagesDetailsButton","modalOpen","setModalOpen","errorMessages","description","EditView","values","every","renderErrorContent","CompassIcon","fontStyle","NumberCounter","createRef","onInputChange","onIncrement","onDecrement","GP_SERVICE_REQUEST_TIMEOUT","itemID","geoprocessor","parameters","KMZ","stringify","submitJob","gpConfig","jobInfo","waitForJobCompletion","jobStatus","gpDataPromises","param","fetchResultData","handleError","timeout","handleReverseGeocodeKMZSuccess","addressResponse","kmzIDResponse","addressValue","kmzId","handlePublishSLPKSuccess","serviceResponse","slpkResponse","handleKMZToMultipatchSuccess","footprintResponse","processName","messages","handleEditBuildingLocationSuccess","obj","Number","args","config","EditPosition","tempPosition","setTempPosition","deriveNewPosition","increment","element","decrement","EditPositionByAddress","noResults","setNoResults","tempLocation","setTempLocation","surface","handleNewLocation","newLocation","prevLocation","newLocationPoint","prevLocationPoint","xyDistance","selectResult","Match_addr","searchOptions","GenericSearchConfig","htmlColor","EditActions","showEditPosition","reset","Edit","setShowEditSearch","setShowEditPosition","KmzSlpkFileIcon","strokeLinejoin","strokeLinecap","UploadView","dragFile","setDragFile","onDragFile","handleDrop","dataTransfer","files","handleUpload","File","draggable","onDrop","onDragOver","renderUploadView","UploadActions","inputRef","handleInput","handleNextClick","jsx","existingFile","click","accept","renderUploadActions","Upload","setCurrentFile","uploadFile","fileSize","validateSize","kmzUpload","csvUpload","slpkUpload","fd","FormData","append","esriRequest","body","success","reader","FileReader","onload","objectIds","objectid","removedBuildingsList","readAsText","formData","sizeString","parseFloat","Export","Submit","renderCurrentStep","seasonToEquinox","season","year","getFullYear","moment","month","getTime","hour","minute","period","trueHour","dateUtils","getDate","seasonDate","time","formatDate","getSeason","getMonth","day","dateTimeTheme","getMuiTheme","LightStudyDateSection","datePickerRef","DateUtil","setSeason","smallButtons","changeSeason","selectedSeason","getHours","toDate","muiTheme","hideCalendarDate","updatedDate","setHours","getMinutes","getSeconds","openDialog","LightStudyTimeSelection","hours","minutes","setMinutes","updateStates","changePeriod","updatedHour","getFormattedHoursAMPM","currentDate","subtract","toString","LightStudyAction","lightStudyInterval","setLightStudyInterval","stopLightStudy","clearInterval","startIcon","interval","setInterval","LightStudyShadowControls","highlightShadowColor","shadowOn","setShadowOn","selectedSketchGraphic","sketchGraphicsLayer","FormControlLabel","control","Switch","handleSelectedFileShadowToggle","handleSelectedSketchShadowToggle","labelPlacement","onCompositionEnd","onCompositionUpdate","shadowCastRef","initializeShadowCastWidget","cancelShadowCast","CircularProgress","LightStudy","headerDefault","paddingLeft","StyleSheet","document","page","headerRow","headerColumn","headerImagesColumn","flexWrap","headerText","flexGrow","alignSelf","logo","marginRight","subSection","marginLeft","capitalize","subHeaderText","devStandsRow","lotResultsWrapper","lotResultsSubwrapper","lotResultsText","itemText","noResultsText","detailText","pageContent","shadowSection","screenShotWrapper","objectFit","maxHeight","borderBottom","legendsContainer","singleLegendContainer","legendText","LotResults","lots","index","Header","insetScreenshotUrl","dcoz2DURL","toLowerCase","substring","lastIndexOf","quadrant","subHeaderTextCustom","toDateString","dcozLogo","ShadowPage","highlightShadow","shadowHighlightColor","screenshotData","buildingUpload","originalBuilding","dataUrl","Color","hex","opacity","alpha","mix","ShadowReport","screenshotsData","sslResults","zoneResults","stringDate","tz","insetMapRef","reportReady","setReportReady","generatingReport","setGeneratingReport","reportData","setReportData","getInsetScreenshot","insetMapView","getScreenshotsData","currentYear","monthDay","currentScreenshoot","prevData","restoreRemovedBuilding","removeCurrentBuilding","getGeometryLotData","lotData","zoneData","allSSLs","lot","Square","LotNum","zoneLabels","getZR16Url","longitute","handleSelectedFileShadowReport","firstRoundScreenshots","uploadBuildingLayer","zr16Url","handleSelectedSketchReport","centerPoint","scale","ShadowReportDocument","blob","loading","rel","href","download","ReactGA","category","lineOfSightRef","hidden","SketchEdit","editingTitle","setEditingTitle","editingTitleValue","setEditingTitleValue","setMagnifier","isOn","placement","targetInputElement","valueInMeters","InputLabel","FormControl","Select","labelId","MenuItem","FormGroup","SketchList","titlesMap","Map","titleCount","has","get","set","sketchGraphic","handleSketchSelection","handleVisibilityChange","Sketch","MeasurementDimensionAnalysis","isDimensionAnalysisEmpty","htmlFor","MeasurementDirectLineWidget","MeasurementDirectLineWidgetRef","showClearButton","MeasurementAreaWidget","MeasurementAreaWidgetRef","MeasurementTypeButton","selected","handleMeasurementTypeSelection","iconClass","MEASUREMENT_TYPES","Measurement","SitePanel","displayLeftPanelOnMobile","expandSitePanel","displayMoreInformationClass","getActiveTool","LayerListItem","currentDistrict","text","zoneDistrictAllOnSwitch","requireMapUpdate","setRequireMapUpdate","allDistrictsAreVisible","defaultToggled","toggled","onToggle","labelPosition","thumbStyle","thumbSwitchedStyle","LayersPanel","expandLayerPanel","setExpandLayerPanel","displayPopover","setDisplayPopover","setZoneDistrict","zoneDistrictAllOn","setZoneDistrictAllOn","paperSelected","setPaperSelected","mobileTopNavPanelExpand","setMobileTopNavPanelExpand","innerWidth","pageWidth","setPageWidth","mobileBreakPoint","updateWindowDimensions","addEventListener","removeEventListener","showSublayers","handleLayerPanel","buttonMobileTopNavPanelControl","layerPanelWidth","zonesMobileControlLabel","zonesMobileControlSwitch","displayLayerButton","colorBar","typeLabel","Paper","zDepth","selectPaper","districtsVisabillityAllClosed","sublayer","Toolbar","firstChild","left","render","Logo","WelcomeModal","displayModal","setDisplayModal","closeModal","instructions","viewInMobile","NavigationModal","autoScrollBodyContent","overflowX","instruction","ListItem","leftIcon","ListItemIcon","ListItemText","DisclaimerModal","modal","bodyStyle","actionsContainerStyle","UploadHelpModal","ZoningStandardsModal","InteractiveHelp","hints","hintPosition","steps","initialStep","keyboardNavigation","hidePrev","hideNext","showStepNumbers","doneLabel","skipLabel","nextLabel","showProgress","onAfterChange","elems","getElementsByClassName","classList","testMode","App","send","InteractiveIntro","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","StylesProvider","injectFirst","getElementById","module","exports","mapView","components","snapToZoom","directShadowsEnabled","cameraTrackingEnabled","atmosphere","quality","fillOpacity","haloOpacity","intro","tooltipClass"],"mappings":"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","file":"static/js/main.4c9e0f07.chunk.js","sourcesContent":["import * as colorManipulator from 'material-ui/utils/colorManipulator';\nimport spacing from 'material-ui/styles/spacing';\nimport * as colors from 'material-ui/styles/colors';\n\nexport const defaultTheme = {\n spacing: spacing,\n fontFamily: 'Roboto, sans-serif',\n palette: {\n // Primary Colors\n primary1Color: colors.indigo400,\n primary2Color: colors.indigo800,\n primary3Color: colors.indigo600,\n // Accent Colors\n accent1Color: colors.deepOrangeA100,\n accent2Color: colors.fullWhite,\n accent3Color: colors.pinkA600,\n // Text colors\n textColor: colors.fullWhite,\n alternateTextColor: colors.darkBlack,\n // Misc. Colors\n canvasColor: colors.grey50,\n borderColor: (0, colorManipulator.fade)(colors.fullWhite, 0.3),\n disabledColor: (0, colorManipulator.fade)(colors.fullWhite, 0.3)\n },\n\n appBar: { // Sample of component theme\n textColor: colors.fullWhite\n },\n card: {\n },\n raisedButton: {\n color: colors.indigo800,\n disabledColor: colors.grey500,\n disabledTextColor: colors.grey200\n },\n toolbar: {\n color: colors.indigo400,\n backgroundColor: colors.indigo400\n },\n dialog: {\n titleColor: colors.fullWhite,\n bodyColor: colors.fullWhite\n }\n};\n\nexport const calendarTheme = {\n palette: {\n primary1Color: colors.indigo400,\n textColor: colors.darkBlack\n },\n timePicker: {\n // ??\n color: colors.pink300,\n // Color of selected time\n textColor: colors.indigo50,\n // Color of the clock hand\n accentColor: colors.indigo900,\n // ??\n clockColor: colors.pink300,\n // Background color of clock\n clockCircleColor: colors.indigo50,\n // Background color of selected time\n headerColor: colors.indigo900,\n // Text color where hand is pointing to on clock\n selectColor: colors.indigo50,\n // Text color where hand is pointing to on clock\n selectTextColor: colors.indigo50\n },\n datePicker: {\n // Color of currently selected date\n color: colors.indigo800,\n // Color of the displayed date\n textColor: colors.indigo50,\n // Month, Year and Weekday Text\n calendarTextColor: colors.indigo800,\n // Colors both the backgroundColor of the displayed date and the circle background color of selected date\n selectColor: colors.indigo900,\n // Colors the selected date text\n selectTextColor: colors.indigo50,\n //Background color when selecting the year\n calendarYearBackgroundColor: colors.indigo600,\n // Background color for selected date\n headerColor: colors.indigo900\n },\n textField: {\n textColor: colors.fullWhite\n },\n stepper: {\n textColor: colors.fullWhite\n }\n};\n","import * as colors from 'material-ui/styles/colors';\n// Storing material-ui styles in this object\nexport const materialStyle = {\n iconButton: {\n sitePanel: {\n padding: '0px',\n },\n siteControls: {\n padding: 0,\n height: 30,\n width: 56,\n },\n layer: {\n padding: 0,\n width: 35,\n height: 35,\n color: 'red',\n },\n },\n raisedButton: {\n upload: {\n style: {\n width: '150px',\n backgroundColor: '#25497f',\n },\n buttonStyle: {\n backgroundColor: '#25497f',\n borderRadius: '3px',\n },\n labelStyle: {\n color: '#FFF',\n fontWeight: '300',\n textTransform: 'none',\n },\n },\n uploadNext: {\n style: {\n width: '160px',\n backgroundColor: '#FFF',\n marginBottom: '15px',\n display: 'block',\n },\n buttonStyle: {\n backgroundColor: '#FFF',\n borderRadius: '3px',\n },\n labelStyle: {\n color: '#202432',\n fontWeight: '300',\n textTransform: 'none',\n },\n },\n chooseFile: {\n style: {\n width: '160px',\n backgroundColor: '#202432',\n display: 'block',\n },\n buttonStyle: {\n backgroundColor: '#202432',\n borderRadius: '3px',\n border: '1.5px white solid',\n },\n labelStyle: {\n color: '#FFF',\n fontWeight: '300',\n textTransform: 'none',\n marginTop: '-3px',\n lineHeight: '15px',\n },\n },\n mapControls: {\n minWidth: '36px',\n maxWidth: '36px',\n borderRadius: '0px',\n backgroundColor: '#213159',\n },\n welcome: {\n width: '154px',\n height: '40px',\n borderRadius: '23px',\n },\n },\n cardMedia: {\n style: {\n backgroundSize: 'auto 100%',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n },\n overlay: {\n bottom: '50% !important',\n },\n },\n cardTitle: {\n style: {\n padding: '0 1em 1em 1em',\n },\n titleStyle: {\n color: colors.fullWhite,\n fontSize: '20px',\n },\n welcome: {\n color: '#273e69',\n fontWeight: 'bolder',\n fontSize: '30px',\n },\n },\n cardHeader: {\n title: {\n fontSize: '18px',\n color: '#fff',\n padding: '0px',\n },\n subtitle: {\n fontSize: '16px',\n },\n },\n dateTimePicker: {\n style: {\n margin: '0px 5px',\n },\n input: {\n width: '150px',\n cursor: 'pointer',\n },\n },\n radioButtonGroup: {\n // display: 'flex',\n // flexDirection: 'row'\n },\n radioButton: {\n width: 'auto',\n paddingRight: '15px',\n },\n paper: {\n display: 'flex',\n flexDirection: 'column',\n transition: 'display 0.5s ease-in',\n height: '75%',\n width: '200px',\n margin: '0 10px',\n backgroundColor: '#213159',\n },\n toolbar: {\n position: 'absolute',\n transition: 'width 0.5s ease-in',\n zIndex: 1005,\n padding: '0px',\n backgroundColor: '#3D6098',\n right: '0px',\n top: '17px',\n },\n toolbarGroup: {\n width: '100%',\n margin: '0px',\n justifyContent: 'initial',\n },\n list: {\n backgroundColor: '#213159',\n padding: '0px',\n },\n listItem: {\n fontSize: '14px',\n color: '#000',\n },\n card: {\n backgroundColor: '#273e69',\n borderRadius: '0px',\n display: 'flex',\n flexDirection: 'row',\n },\n cardText: {\n fontSize: '14px',\n },\n cardTextWelcomeBody: {\n primary: {\n color: '#000',\n fontSize: '18px',\n paddingTop: '8px',\n paddingBottom: '8px',\n },\n secondary: {\n color: '#5b6d76',\n fontSize: '16px',\n paddingTop: '8px',\n paddingBottom: '8px',\n },\n },\n cardAction: {\n display: 'flex',\n flexDirection: 'column',\n padding: '0px',\n alignItems: 'flex-end',\n },\n cardActionWelcome: {\n display: 'flex',\n justifyContent: 'flex-end',\n },\n icon: {\n width: '50px',\n height: '50px',\n },\n dialog: {\n backgroundColor: colors.fullWhite,\n color: '#000',\n },\n dialogTitleNavigation: {\n color: '#273e69',\n fontWeight: 'bolder',\n },\n dialogWelcomeBody: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n overflowY: 'inherit',\n },\n textField: {\n hint: {\n lineHeight: '36px',\n height: '36px',\n top: 0,\n },\n edit: {\n width: '150px',\n },\n },\n menu: {\n backgroundColor: colors.indigo800,\n },\n menuItem: {\n color: '#fff',\n },\n};\n","import React from 'react';\n\nexport default function ErrorIcon() {\n return (\n \n \n \n \n \n \n \n \n \n );\n}\n","import basemapConfig from './configs/config.basemaps';\nimport viewConfig from './configs/config.view';\nimport helpConfig from './configs/config.help';\nimport layersConfig from './configs/config.layers.js';\nimport mobileHelpConfig from './configs/config.mobileHelp';\nimport { LAYER_TITLES } from './configs/config.layerTitles';\n\nexport const basemaps = basemapConfig;\nexport const layers = layersConfig;\nexport const viewOptions = viewConfig;\nexport const helpSteps = helpConfig;\nexport const mobileHelpSteps = mobileHelpConfig;\n\nexport const GOOGLE_ANALYTICS_ID = 'G-BXfRFPJ6YWM';\n\n// NOTE: Current key not working. New API key needed\nconst GOOGLE_STREETVIEW_API_KEY = 'AIzaSyAd6si2aciZtpDv8Td1opBWW0vkQi15-10';\n\n// Portal ID to be consumed by Esri WebScene\nexport const portalId = '31d5436c746f4f35b647caac1a6619e1';\n\nexport const defaultCompareHiddenLayers = [\n LAYER_TITLES.ZONING_DEVELOPMENT_STANDARD,\n // LAYER_TITLES.ZONING,\n // LAYER_TITLES.TREES,\n LAYER_TITLES.NEIGHBORHOODS,\n];\n\n// NOTE: currently both PROD and STAGING GP services are the same (em.dcgis.dc.gov)\nconst GP_SERVICE_STAGING = 'https://em.dcgis.dc.gov/dcgis/rest/services/DCOZ/DCOZ_3D_Tools/GPServer';\nconst GP_SERVICE_PROD = GP_SERVICE_STAGING;\n// const GP_SERVICE_PROD = 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCOZ/DCOZ_3D_Tools/GPServer';\n\nlet gpUrl;\n\n// IMPORTANT NOTE: current GP server tasks are Asynchronous\n// For async tasks: add REACT_APP_GP_SERVER_TYPE=async to script\nif (process.env.REACT_APP_ENV === 'production') {\n gpUrl = GP_SERVICE_PROD;\n} else {\n gpUrl = GP_SERVICE_STAGING;\n}\n\nexport const gp = {\n upload: `${gpUrl}/uploads/upload`,\n kmzToMultipatch: `${gpUrl}/KMZMultipatch`,\n reverseGeocodeKMZ: `${gpUrl}/ReverseGeocodeKMZ`,\n editBuildingLocation: `${gpUrl}/EditBuildingLocation`,\n publishSLPK: `${gpUrl}/PublishSLPK`,\n};\n\nexport const urls = {\n googleStreetView: (address) =>\n `https://maps.googleapis.com/maps/api/streetview?size=375x250&location=${encodeURIComponent(\n address + ',Washington,D.C'\n )}&key=${GOOGLE_STREETVIEW_API_KEY}`,\n googleMap: (latlon, zoom) => `https://google.com/maps/@${latlon.join(',')},${zoom}z`,\n zr16: (x, y, l) => `http://maps.dcoz.dc.gov/zr16/#l=${l}&x=${x}&y=${y}&mms=18!26!21!24!22!4!8!1!2&dcb=0`,\n // Queries\n zoneQuery: 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCOZ/Zone_Mapservice/MapServer/24', //dcoz production service,\n queryLayer: 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCOZ/Zone_Mapservice/MapServer/25',\n geocodeServer: 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_APPS/DCGIS_MAR/GeocodeServer',\n};\n\nexport const staticText = {\n welcome: {\n title: \"Welcome to DCOZ's 3D Map!\",\n desciption:\n 'The DC Office of Zoning (DCOZ) is proud to present this interactive virtual map to help you visualize zoning data as well as curate potential development scenarios. The map offers 3D building and geospatial feature accuracy.',\n closing:\n 'We designed the map for you with the hopes of enhancing efficiency and transparency of zoning processes in the District. Note, visualizations are for illustrative purposes only using best available data.',\n },\n};\n\nexport const DISTANCE_WIDGET = 'DISTANCE';\n\nexport const AREA_WIDGET = 'AREA';\n","export const LAYER_TITLES = {\n DC_DARK_GRAY: 'DC Basemap DarkGray WebMercator',\n ZONING_DEVELOPMENT_STANDARD: 'Zoning Development Standard',\n ZONING: 'Zoning',\n BUILDINGS: 'Buildings',\n TREES: 'Trees',\n NEIGHBORHOODS: 'Neighborhoods',\n PLANNED_UNIT_DEVELOPMENT: 'Planned Unit Development',\n METRO_RAIL: 'Metro Rail',\n METRO_STATIONS: 'Metro Stations',\n NEIGHBORHOOD_CLUSTERS: 'Neighborhood Clusters',\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { RootState } from '../index';\nimport { zones } from '../../js/configs/config.zones';\nimport { mainLayers } from '../../js/configs/config.mainLayers';\n\nexport type ActiveTool =\n | 'none'\n | 'default'\n | 'compare'\n | 'submit'\n | 'measurement'\n | 'uploaded-files'\n | 'line-of-sight'\n | 'sketch'\n | 'light'\n | 'shadow-report'\n | 'help'\n | 'delete';\n\nexport interface AppState {\n activeTool: ActiveTool;\n siteExpanded: boolean;\n mobile: boolean;\n displayDisclaimer: boolean;\n displayUploadHelp: boolean;\n displayZoningStandard: {\n display: boolean;\n hasDisplayed: boolean;\n };\n displayNavigation: boolean;\n enableHelp: boolean;\n enableIntro: boolean;\n zones: {\n type: string;\n colors: string[];\n districts: {\n id: string;\n visible: boolean;\n color: string;\n }[];\n }[];\n mainLayers: {\n id: string;\n visible: boolean;\n color: string;\n }[];\n date: Date;\n view3DCompare?: any;\n mapCompare?: any;\n view3DReady: boolean;\n displayShadowHighlighted: boolean;\n highlightColor: string;\n site?: any;\n currentBuilding?: any;\n removedBuildings: any[];\n view3D?: any;\n map?: any;\n itemId?: string;\n listenMainLayersControl?: any;\n activeWidget: null | string;\n isShadowCastLoaded: boolean;\n}\n\nconst initialState: AppState = {\n activeTool: 'default',\n siteExpanded: false,\n mobile: false,\n displayDisclaimer: false,\n displayUploadHelp: false,\n displayZoningStandard: {\n display: false,\n hasDisplayed: false,\n },\n displayNavigation: false,\n enableHelp: false,\n enableIntro: false,\n zones,\n mainLayers,\n date: new Date(),\n view3DReady: false,\n displayShadowHighlighted: false,\n highlightColor: 'rgba(244,67,54,0.6)',\n removedBuildings: [],\n activeWidget: null,\n isShadowCastLoaded: false,\n};\n\nconst appSlice = createSlice({\n name: 'appSlice',\n initialState: initialState,\n reducers: {\n setActiveTool: (state: AppState, action: PayloadAction) => {\n state.activeTool = action.payload;\n },\n setSiteExpanded: (state: AppState, action: PayloadAction) => {\n state.siteExpanded = action.payload;\n },\n setMobile: (state: AppState, action: PayloadAction) => {\n state.mobile = action.payload;\n },\n setDisplayDisclaimer: (state: AppState, action: PayloadAction) => {\n state.displayDisclaimer = action.payload;\n },\n setDisplayUploadHelp: (state: AppState, action: PayloadAction) => {\n state.displayUploadHelp = action.payload;\n },\n toggleZoningStandard: (state: AppState, action: PayloadAction) => {\n state.displayZoningStandard = {\n display: action.payload,\n hasDisplayed: true,\n };\n },\n setEnableHelp: (state: AppState, action: PayloadAction) => {\n state.enableHelp = action.payload;\n },\n setEnableIntro: (state: AppState, action: PayloadAction) => {\n state.enableIntro = action.payload;\n },\n setDisplayNavigation: (state: AppState, action: PayloadAction) => {\n state.displayNavigation = action.payload;\n },\n setDate: (state: AppState, action: PayloadAction) => {\n state.date = action.payload;\n },\n setView3DCompare: (state: AppState, action: PayloadAction<__esri.SceneView>) => {\n state.view3DCompare = action.payload;\n },\n setMapCompare: (state: AppState, action: PayloadAction<__esri.Map>) => {\n state.mapCompare = action.payload;\n },\n setView3DReady: (state: AppState, action: PayloadAction) => {\n state.view3DReady = action.payload;\n },\n setDisplayShadowHighlighted: (state: AppState, action: PayloadAction) => {\n state.displayShadowHighlighted = action.payload;\n },\n setHighlightColor: (state: AppState, action: PayloadAction) => {\n state.highlightColor = action.payload;\n },\n setSite: (state: AppState, action: PayloadAction) => {\n state.site = action.payload;\n },\n setCurrentBuilding: (state: AppState, action: PayloadAction) => {\n state.currentBuilding = action.payload;\n },\n setRemovedBuildings: (state: AppState, action: PayloadAction) => {\n state.removedBuildings = action.payload;\n },\n addRemovedBuilding: (state: AppState, action: PayloadAction) => {\n state.removedBuildings.push(action.payload);\n },\n popRemovedBuilding: (state: AppState) => {\n state.removedBuildings.pop();\n },\n setView3D: (state: AppState, action: PayloadAction) => {\n state.view3D = action.payload;\n },\n setMap: (state: AppState, action: PayloadAction<__esri.WebScene>) => {\n state.map = action.payload;\n },\n setAllDistrictsVisibility: (state: AppState, action: PayloadAction) => {\n for (let i = 0; i < state.zones.length; i++) {\n for (let districtIndex = 0; districtIndex < state.zones[i].districts.length; districtIndex++) {\n state.zones[i].districts[districtIndex].visible = action.payload;\n }\n }\n },\n setDistrictVisibility: (\n state: AppState,\n action: PayloadAction<{ zoneType: string; districtId: string; visible: boolean }>\n ) => {\n const { zoneType, districtId, visible } = action.payload;\n\n const zoneIndex = state.zones.findIndex((zone) => zone.type === zoneType);\n if (zoneIndex !== -1) {\n const districtIndex = state.zones[zoneIndex].districts.findIndex((district) => district.id === districtId);\n if (districtIndex !== -1) {\n state.zones[zoneIndex].districts[districtIndex].visible = visible;\n state.listenMainLayersControl = districtId;\n }\n }\n },\n setZoneDistrictsVisibility: (state: AppState, action: PayloadAction<{ zoneType: string; visible: boolean }>) => {\n const { zoneType, visible } = action.payload;\n state.zones.find((zone) => zone.type === zoneType)?.districts.forEach((district) => (district.visible = visible));\n },\n setMainLayerVisibility: (state: AppState, action: PayloadAction<{ layerId: string; visible: boolean }>) => {\n const { layerId, visible } = action.payload;\n const layerIndex = state.mainLayers.findIndex((layer) => layer.id === layerId);\n\n if (layerIndex !== -1) {\n state.mainLayers[layerIndex].visible = visible;\n }\n },\n setLitenMainLayersControl: (state: AppState, action: PayloadAction) => {\n state.listenMainLayersControl = action.payload;\n },\n setActiveWidget: (state: AppState, action: PayloadAction) => {\n state.activeWidget = action.payload;\n },\n setIsShadowCastLoaded: (state: AppState, action: PayloadAction) => {\n state.isShadowCastLoaded = action.payload;\n },\n },\n});\n\n//Export actions\nexport const {\n setActiveTool,\n setSiteExpanded,\n setMobile,\n setDisplayDisclaimer,\n setDisplayUploadHelp,\n toggleZoningStandard,\n setDisplayNavigation,\n setEnableHelp,\n setEnableIntro,\n setDate,\n setMapCompare,\n setView3DCompare,\n setView3DReady,\n setDisplayShadowHighlighted,\n setHighlightColor,\n setSite,\n setCurrentBuilding,\n addRemovedBuilding,\n popRemovedBuilding,\n setRemovedBuildings,\n setView3D,\n setMap,\n setAllDistrictsVisibility,\n setDistrictVisibility,\n setZoneDistrictsVisibility,\n setMainLayerVisibility,\n setLitenMainLayersControl,\n setActiveWidget,\n setIsShadowCastLoaded,\n} = appSlice.actions;\n\n//Export individual pieces of state\nexport const activeToolState = (state: RootState) => state.appReducer.activeTool;\nexport const siteExpandedState = (state: RootState) => state.appReducer.siteExpanded;\nexport const mobileState = (state: RootState) => state.appReducer.mobile;\nexport const displayDisclaimerState = (state: RootState) => state.appReducer.displayDisclaimer;\nexport const displayUploadHelpState = (state: RootState) => state.appReducer.displayUploadHelp;\nexport const displayZoningStandardState = (state: RootState) => state.appReducer.displayZoningStandard;\nexport const enableHelpState = (state: RootState) => state.appReducer.enableHelp;\nexport const enableIntroState = (state: RootState) => state.appReducer.enableIntro;\nexport const displayNavigationState = (state: RootState) => state.appReducer.displayNavigation;\nexport const zonesState = (state: RootState) => state.appReducer.zones;\nexport const mainLayersState = (state: RootState) => state.appReducer.mainLayers;\nexport const dateState = (state: RootState) => state.appReducer.date;\nexport const mapCompareState = (state: RootState) => state.appReducer.mapCompare;\nexport const view3DCompareState = (state: RootState) => state.appReducer.view3DCompare;\nexport const view3DReadyState = (state: RootState) => state.appReducer.view3DReady;\nexport const displayShadowHighlightedState = (state: RootState) => state.appReducer.displayShadowHighlighted;\nexport const highlightColorState = (state: RootState) => state.appReducer.highlightColor;\nexport const siteState = (state: RootState) => state.appReducer.site;\nexport const currentBuildingState = (state: RootState) => state.appReducer.currentBuilding;\nexport const removedBuildingsState = (state: RootState) => state.appReducer.removedBuildings;\nexport const view3DState = (state: RootState) => state.appReducer.view3D;\nexport const mapState = (state: RootState) => state.appReducer.map;\nexport const listenMainLayersControlState = (state: RootState) => state.appReducer.listenMainLayersControl;\nexport const isShadowCastLoadedState = (state: RootState) => state.appReducer.isShadowCastLoaded;\n\nexport const activeWidgetState = (state: RootState) => state.appReducer.activeWidget;\n\n//Export default slice's reducer\nexport default appSlice.reducer;\n","export const zones = [\n {\n type: 'Residential Zones',\n colors: ['#FFFF00', '#FFFD6D', '#B2B000'],\n districts: [\n {\n id: 'Residential Flat Zone',\n visible: true,\n color: '#FFFF00',\n },\n {\n id: 'Residential Zone',\n visible: true,\n color: '#FFFD6D',\n },\n {\n id: 'Residential Apartment Zone',\n visible: true,\n color: '#B2B000',\n },\n ],\n },\n {\n type: 'Mixed Use Zones',\n colors: ['#73B2FF', '#FFAA00'],\n districts: [\n {\n id: 'Neighborhood Mixed-Use Zone',\n visible: true,\n color: '#73B2FF',\n },\n {\n id: 'Mixed-Use Zone',\n visible: true,\n color: '#FFAA00',\n },\n ],\n },\n {\n type: 'Other Zones',\n colors: ['#732600', '#DF73FF', '#75DA7E', '#FF7F7F'],\n districts: [\n {\n id: 'Downtown Zone',\n visible: true,\n color: '#FF7F7F',\n },\n {\n id: 'Unzoned',\n visible: true,\n color: '#732600',\n },\n {\n id: 'Production, Distribution, and Repair Zone',\n visible: true,\n color: '#DF73FF',\n },\n {\n id: 'Special Purpose Zone',\n visible: true,\n color: '#75DA7E',\n },\n ],\n },\n];\n","import { LAYER_TITLES } from './config.layerTitles';\n\nexport const mainLayers = [\n {\n id: LAYER_TITLES.ZONING_DEVELOPMENT_STANDARD,\n visible: false,\n color: '#EEEEEE',\n },\n {\n id: LAYER_TITLES.ZONING,\n visible: true,\n color: '#EEEEEE',\n },\n {\n id: LAYER_TITLES.BUILDINGS,\n visible: true,\n color: '#BDBDBD',\n },\n {\n id: LAYER_TITLES.TREES,\n visible: true,\n color: '#66BB6A',\n },\n {\n id: LAYER_TITLES.NEIGHBORHOODS,\n visible: false,\n color: '#4FC3F7',\n },\n {\n id: LAYER_TITLES.PLANNED_UNIT_DEVELOPMENT,\n visible: false,\n color: '#D32F2F',\n },\n {\n id: LAYER_TITLES.METRO_RAIL,\n visible: false,\n color: '#FFAB40',\n },\n];\n","import { LAYER_TITLES } from './config.layerTitles';\n\nconst layers = [\n {\n type: 'sceneLayer',\n options: {\n id: LAYER_TITLES.BUILDINGS,\n title: LAYER_TITLES.BUILDINGS,\n url: 'https://tiles.arcgis.com/tiles/neT9SoYxizqTHZPH/arcgis/rest/services/Buildings_SLP/SceneServer/layers/0',\n popupEnabled: false,\n renderer: {\n type: 'simple',\n symbol: {\n type: 'mesh-3d',\n symbolLayers: [\n {\n type: 'fill',\n material: { color: [255, 255, 255, 1] },\n edges: { type: 'solid', color: [0, 0, 0, 1] },\n },\n ],\n },\n },\n },\n },\n {\n type: 'dynamic',\n options: {\n id: LAYER_TITLES.METRO_RAIL,\n title: LAYER_TITLES.METRO_RAIL,\n visible: false,\n imageFormat: 'png32',\n url: 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/Transportation_Rail_Bus_WebMercator/MapServer',\n sublayers: [\n {\n id: 106,\n visible: true,\n },\n ],\n },\n },\n {\n type: 'feature',\n options: {\n id: LAYER_TITLES.METRO_STATIONS,\n url: 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/Transportation_Rail_Bus_WebMercator/MapServer/52',\n visible: false,\n title: LAYER_TITLES.METRO_STATIONS,\n labelsVisible: true,\n labelingInfo: [\n {\n minScale: 6300,\n labelExpressionInfo: {\n expression: '$feature.NAME',\n },\n symbol: {\n type: 'label-3d',\n symbolLayers: [\n {\n type: 'text',\n material: {\n color: '#fff',\n },\n halo: {\n color: '#333',\n size: 1,\n },\n size: 12,\n },\n ],\n },\n },\n ],\n },\n },\n];\n\nexport default layers;\n","import { urls } from '../config';\n\nconst MAR_LocatorSearchSource = {\n name: 'Address',\n url: urls.geocodeServer,\n singleLineFieldName: 'SingleLine',\n exactMatch: false,\n outFields: ['*'],\n maxResults: 5,\n maxSuggestions: 5,\n enableSuggestions: true,\n minSuggestCharacters: 2,\n autoNavigate: false,\n placeholder: 'Enter a D.C. address or location',\n};\n\nexport default {\n popupEnabled: false,\n searchAllEnabled: false,\n resultGraphicEnabled: false,\n includeDefaultSources: false,\n sources: [MAR_LocatorSearchSource],\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport ErrorIcon from './ErrorIcon';\nimport { loadModules } from 'esri-loader';\nimport '../../../css/components/Search.scss';\nimport { view3DState } from '../../../store/slices/appSlice';\nimport searchConfig from '../../configs/config.search';\n\nconst Search = (props) => {\n const { id, containerClass, searchClass, error, onSearchComplete, onSelectResult, onSuggestComplete } = props;\n\n const [initialized, setInitialized] = useState(false);\n const searchRef = useRef(null);\n const view3D = useSelector(view3DState);\n\n useEffect(() => {\n if (!initialized) {\n (async () => {\n if (view3D && view3D.hasOwnProperty('ready') && view3D.ready) {\n setInitialized(true);\n const [EsriSearch] = await loadModules(['esri/widgets/Search']);\n\n const esriSearch = new EsriSearch({\n id,\n view: view3D,\n container: searchRef.current,\n ...searchConfig,\n });\n\n esriSearch.on('search-complete', onSearchComplete);\n esriSearch.on('select-result', onSelectResult);\n esriSearch.on('suggest-complete', onSuggestComplete);\n }\n })();\n }\n }, [initialized, id, onSearchComplete, onSelectResult, onSuggestComplete, searchConfig, view3D]);\n\n return (\n
\n
\n {error && }\n
\n );\n};\n\nexport default Search;\n","import React, { Component } from 'react';\n\nimport '../../../css/components/iconButton.scss';\n\nexport default class IconButton extends Component {\n render() {\n const { callback, svg, children, onEnter, onExit, onClick, disableButton } = this.props;\n return (\n onEnter && onEnter()}\n onMouseLeave={() => onExit && onExit()}\n onClick={() => onClick && onClick()}\n >\n {children ? (\n
{children}
\n ) : (\n \n )}\n
\n );\n }\n}\n","import React from 'react';\n\nimport '../../../../css/components/mapControlGroup.scss';\n\nexport default function MapControlGroup(props) {\n return
{props.children}
;\n}\n","import React from 'react';\nimport { List } from 'material-ui/List';\n\nexport default function ListWrapper(props) {\n const { children } = props;\n return {children};\n}\n","import { loadModules } from 'esri-loader';\n\nconst layerFactory = {\n createLayer: async (layer) => {\n switch (layer.type) {\n case 'sceneLayer': {\n const [SceneLayer] = await loadModules(['esri/layers/SceneLayer']);\n return new SceneLayer({ ...layer.options });\n }\n\n case 'dynamic': {\n const [MapImageLayer] = await loadModules(['esri/layers/MapImageLayer']);\n return new MapImageLayer({ ...layer.options });\n }\n\n case 'webScene': {\n const [WebScene] = await loadModules(['esri/WebScene']);\n return new WebScene({ ...layer.options });\n }\n\n case 'graphic': {\n const [GraphicsLayer] = await loadModules(['esri/layers/GraphicsLayer']);\n return new GraphicsLayer({ ...layer.options });\n }\n\n case 'feature': {\n const [FeatureLayer] = await loadModules(['esri/layers/FeatureLayer']);\n return new FeatureLayer({ ...layer.options });\n }\n\n default:\n return {};\n }\n },\n};\n\nexport default layerFactory;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { RootState } from '../index';\nimport { SketchHeightUnit } from '../../js/configs/config.sketch';\n\nexport type SketchStatus = 'idle' | 'active' | 'editing' | 'sketching';\n\nexport interface ISketch {\n height: number;\n unit: SketchHeightUnit;\n title?: string;\n uid: string;\n visible: boolean;\n}\n\nexport interface SketchState {\n status: SketchStatus;\n selectedSketch?: any; // esri graphic\n sketches: ISketch[];\n isMagnifierOn: boolean;\n}\n\nconst initialState: SketchState = {\n status: 'idle',\n isMagnifierOn: false,\n sketches: [],\n};\n\nconst sketchSlice = createSlice({\n name: 'sketchSlice',\n initialState: initialState,\n reducers: {\n setSketchStatus: (state: SketchState, action: PayloadAction) => {\n state.status = action.payload;\n },\n setSelectedSketch: (state: SketchState, action: PayloadAction<__esri.Graphic | undefined>) => {\n state.selectedSketch = action.payload;\n },\n removeSketch: (state: SketchState, action: PayloadAction) => {\n state.sketches = state.sketches.filter((sketch) => sketch.uid !== action.payload);\n },\n addSketch: (state: SketchState, action: PayloadAction) => {\n state.sketches.push(action.payload);\n },\n updateSketch: (state: SketchState, action: PayloadAction) => {\n const targetSketchIndex = state.sketches.findIndex((sketch) => sketch.uid === action.payload.uid);\n if (targetSketchIndex !== -1) {\n state.sketches[targetSketchIndex] = action.payload;\n }\n },\n setIsMagnifierOn: (state: SketchState, action: PayloadAction) => {\n state.isMagnifierOn = action.payload;\n },\n },\n});\n\n//Export actions\nexport const { setSketchStatus, setSelectedSketch, addSketch, removeSketch, updateSketch, setIsMagnifierOn } =\n sketchSlice.actions;\n\n//Export individual pieces of state\nexport const sketchStatusState = (state: RootState) => state.sketchReducer.status;\nexport const selectedSketchState = (state: RootState) => state.sketchReducer.selectedSketch;\nexport const sketchesState = (state: RootState) => state.sketchReducer.sketches;\nexport const isMagnifierOnState = (state: RootState) => state.sketchReducer.isMagnifierOn;\n\n//Export default slice's reducer\nexport default sketchSlice.reducer;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { RootState } from '../index';\n\nexport type SketchStatus = 'idle' | 'active' | 'editing';\nexport interface IBuildingLocation {\n LATITUDE: number;\n LONGITUDE: number;\n FULLADDRESS: string;\n}\n\nexport const BUILDING_POSITION_AXIS = ['x', 'y', 'z'] as const;\n\nexport type BuildingPositionAxis = typeof BUILDING_POSITION_AXIS[number];\n\nexport type Position = {\n [axisPosition in BuildingPositionAxis]: number;\n};\n\nexport interface UploadedFile {\n itemId: string;\n file: any;\n location: IBuildingLocation;\n kmzId: string;\n slpk?: string;\n geometry?: any;\n sceneLayerUrl?: string;\n sceneLayerId?: string;\n footprintGraphicId?: string;\n position?: Position;\n}\n\nexport interface UploadState {\n selectedFileId?: string;\n uploadedFiles: {\n [itemId: string]: UploadedFile;\n };\n uploading: boolean;\n error?: any;\n step: number;\n isSelectLocationOnMapActive: boolean;\n}\n\nconst initialState: UploadState = {\n uploading: false,\n uploadedFiles: {},\n step: 0,\n isSelectLocationOnMapActive: false,\n};\n\nconst uploadSlice = createSlice({\n name: 'uploadSlice',\n initialState: initialState,\n reducers: {\n setSelectedFileId: (state: UploadState, action: PayloadAction) => {\n state.selectedFileId = action.payload;\n },\n setUploading: (state: UploadState, action: PayloadAction) => {\n state.uploading = action.payload;\n },\n setUploadedFiles: (state: UploadState, action: PayloadAction) => {\n state.uploadedFiles = action.payload;\n },\n setUploadedFile: (state: UploadState, action: PayloadAction) => {\n const uploadedFile = action.payload;\n state.uploadedFiles[uploadedFile.itemId] = uploadedFile;\n },\n setError: (state: UploadState, action: PayloadAction) => {\n state.error = action.payload;\n },\n setStep: (state: UploadState, action: PayloadAction) => {\n state.step = action.payload;\n },\n incrementStep: (state: UploadState) => {\n state.step++;\n },\n decrementStep: (state: UploadState) => {\n state.step--;\n },\n setIsSelectLocationOnMapActive: (\n state: UploadState,\n action: PayloadAction\n ) => {\n state.isSelectLocationOnMapActive = action.payload;\n },\n resetSubmitWorkflow: (state: UploadState) => {\n state.step = 0;\n state.error = undefined;\n state.selectedFileId = undefined;\n state.isSelectLocationOnMapActive = false;\n },\n },\n});\n\n//Export actions\nexport const {\n setSelectedFileId,\n setUploading,\n setUploadedFiles,\n setUploadedFile,\n setError,\n setStep,\n incrementStep,\n decrementStep,\n setIsSelectLocationOnMapActive,\n resetSubmitWorkflow,\n} = uploadSlice.actions;\n\n//Export individual pieces of state\nexport const selectedFileIdState = (state: RootState) => state.uploadReducer.selectedFileId;\nexport const uploadingState = (state: RootState) => state.uploadReducer.uploading;\nexport const uploadedFilesState = (state: RootState) => state.uploadReducer.uploadedFiles;\nexport const errorState = (state: RootState) => state.uploadReducer.error;\nexport const stepState = (state: RootState) => state.uploadReducer.step;\nexport const isSelectLocationOnMapActiveState = (state: RootState) => state.uploadReducer.isSelectLocationOnMapActive;\nexport const selectedFileState = (state: RootState) => {\n const selectedFileId = state.uploadReducer.selectedFileId;\n if (selectedFileId) {\n return state.uploadReducer.uploadedFiles[selectedFileId];\n }\n\n return undefined;\n};\n\n//Export default slice's reducer\nexport default uploadSlice.reducer;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport { RootState } from '../index';\n\nexport type MeasurementType = 'direct-line' | 'area' | 'dimension-analysis';\nexport type DimensionAnalysisStatus = 'idle' | 'active' | 'measuring';\nexport type MeasurementWidgetStatus = 'disabled' | 'ready' | 'measuring' | 'measured';\nexport const MEASUREMENT_UNITS = ['metric', 'imperial'] as const;\nexport type UnitType = (typeof MEASUREMENT_UNITS)[number];\n\nexport interface MeasurementState {\n selectedMeasurementType: MeasurementType | undefined;\n dimensionAnalysis: {\n status: DimensionAnalysisStatus;\n isEmpty: boolean;\n };\n directLineMeasurementStatus: MeasurementWidgetStatus;\n areaMeasurementStatus: MeasurementWidgetStatus;\n selectedMeasurementUnit: UnitType;\n}\n\nconst initialState: MeasurementState = {\n selectedMeasurementType: undefined,\n dimensionAnalysis: {\n status: 'idle',\n isEmpty: true,\n },\n directLineMeasurementStatus: 'disabled',\n areaMeasurementStatus: 'disabled',\n selectedMeasurementUnit: 'imperial',\n};\n\nconst measurementSlice = createSlice({\n name: 'measurementSlice',\n initialState: initialState,\n reducers: {\n setSelectedMeasurementType: (\n state: MeasurementState,\n action: PayloadAction\n ) => {\n state.selectedMeasurementType = action.payload;\n },\n setDimensionAnalysisStatus: (\n state: MeasurementState,\n action: PayloadAction\n ) => {\n state.dimensionAnalysis.status = action.payload;\n },\n setDimensionAnalysisIsEmpty: (\n state: MeasurementState,\n action: PayloadAction\n ) => {\n state.dimensionAnalysis.isEmpty = action.payload;\n },\n setDirectLineMeasurementStatus: (\n state: MeasurementState,\n action: PayloadAction\n ) => {\n state.directLineMeasurementStatus = action.payload;\n },\n setAreaMeasurementStatus: (\n state: MeasurementState,\n action: PayloadAction\n ) => {\n state.areaMeasurementStatus = action.payload;\n },\n setSelectedMeasurementUnit: (\n state: MeasurementState,\n action: PayloadAction\n ) => {\n state.selectedMeasurementUnit = action.payload;\n },\n },\n});\n\n//Export actions\nexport const {\n setSelectedMeasurementType,\n setDimensionAnalysisStatus,\n setDimensionAnalysisIsEmpty,\n setDirectLineMeasurementStatus,\n setAreaMeasurementStatus,\n setSelectedMeasurementUnit,\n} = measurementSlice.actions;\n\n//Export individual pieces of state\nexport const selectedMeasurementTypeState = (state: RootState) => state.measurementReducer.selectedMeasurementType;\nexport const dimensionAnalysisState = (state: RootState) => state.measurementReducer.dimensionAnalysis;\nexport const directLineMeasurementStatusState = (state: RootState) =>\n state.measurementReducer.directLineMeasurementStatus;\nexport const areaMeasurementStatusState = (state: RootState) => state.measurementReducer.areaMeasurementStatus;\nexport const selectedMeasurementUnitState = (state: RootState) => state.measurementReducer.selectedMeasurementUnit;\n\n//Export default slice's reducer\nexport default measurementSlice.reducer;\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport dateUtils from '../../js/utils/date';\nimport { RootState } from '../index';\n\nexport type SeasonType = 'Spring' | 'Summer' | 'Fall' | 'Winter';\n\nexport interface ILightStudyState {\n selectedDate: Date;\n isLightStudyActive: boolean;\n isShadowCastActive: boolean;\n}\n\nconst initialState: ILightStudyState = {\n selectedDate: new Date(),\n isLightStudyActive: false,\n isShadowCastActive: false,\n};\n\nconst lightStudySlice = createSlice({\n name: 'lightStudySlice',\n initialState: initialState,\n reducers: {\n setSelectedDate: (state: ILightStudyState, action: PayloadAction) => {\n state.selectedDate = action.payload;\n },\n setIsLightStudyActive: (state: ILightStudyState, action: PayloadAction) => {\n state.isLightStudyActive = action.payload;\n },\n setIsShadowCastActive: (state: ILightStudyState, action: PayloadAction) => {\n state.isShadowCastActive = action.payload;\n },\n },\n});\n\n//Export actions\nexport const { setSelectedDate, setIsLightStudyActive, setIsShadowCastActive } = lightStudySlice.actions;\n\n//Export individual pieces of state\nexport const selectedDateState = (state: RootState) => state.lightStudySlice.selectedDate;\nexport const isLightStudyActiveState = (state: RootState) => state.lightStudySlice.isLightStudyActive;\nexport const isShadowCastActiveState = (state: RootState) => state.lightStudySlice.isShadowCastActive;\n\n//Export default slice's reducer\nexport default lightStudySlice.reducer;\n","import { configureStore, combineReducers } from '@reduxjs/toolkit';\n\nimport appReducer from './slices/appSlice';\nimport sketchReducer from './slices/sketchSlice';\nimport uploadReducer from './slices/uploadSlice';\nimport measurementReducer from './slices/measurementSlice';\nimport lightStudySlice from './slices/lightStudySlice';\n\nconst rootReducer = combineReducers({\n appReducer,\n sketchReducer,\n uploadReducer,\n measurementReducer,\n lightStudySlice,\n});\n\nlet middlewares: any[] = [];\n\nif (process.env.NODE_ENV === 'development') {\n const { logger } = require('redux-logger');\n middlewares.push(logger);\n}\n\nexport type RootState = ReturnType;\n\nexport default configureStore({\n reducer: rootReducer,\n middleware: (getDefaultMiddleware) => [...middlewares, ...getDefaultMiddleware()],\n});\n","import { loadModules } from 'esri-loader';\nimport { urls } from '../config';\n\nexport const getSiteAddressInfoFromPoint = async (mapPoint: __esri.Point) => {\n const [Query, query, locator] = await loadModules([\n 'esri/rest/support/Query',\n 'esri/rest/query',\n 'esri/rest/locator',\n ]);\n\n const zoneQuery = new Query({\n geometry: mapPoint,\n outFields: ['*'],\n returnGeometry: false,\n });\n\n try {\n const [zone, geocode] = await Promise.all([\n query.executeQueryJSON(urls.zoneQuery, zoneQuery),\n locator.locationToAddress(urls.geocodeServer, { location: mapPoint }),\n ]);\n\n const [zoneFeature] = zone.features;\n const { Address, LongLabel } = geocode.attributes;\n\n const siteAddressInfo = {\n longLabel: LongLabel,\n address: Address,\n latlon: [mapPoint.latitude, mapPoint.longitude],\n zoneCode: zoneFeature.attributes.Zoning_Label, // * NOTE: was originally Zoning_ZRR, which returns undefined\n zoneDescription: zoneFeature.attributes.Zone_Description,\n zoneDistrict: zoneFeature.attributes.Zone_District,\n zoneWebUrl: zoneFeature.attributes.Zoning_Web_URL,\n };\n\n return siteAddressInfo;\n } catch (error) {\n console.log('getSiteAddressInfoFromPoint error', error);\n }\n};\n","import LayerFactory from './layerFactory';\n// import store from '../../appStore';\nimport store from '../../store';\nimport mapController from '../controllers/MapController';\n\nimport { loadModules } from 'esri-loader';\nimport { setUploadedFile } from '../../store/slices/uploadSlice';\nimport { getSiteAddressInfoFromPoint } from './gpAddressInfo.utils';\n\nconst synchronizeView = (view, others, watchUtils) => {\n others = Array.isArray(others) ? others : [others];\n let viewpointWatchHandle;\n let viewStationaryHandle;\n let otherInteractHandlers;\n let scheduleId;\n const clear = () => {\n if (otherInteractHandlers) {\n otherInteractHandlers.forEach((handle) => {\n handle.remove();\n });\n }\n viewpointWatchHandle && viewpointWatchHandle.remove();\n viewStationaryHandle && viewStationaryHandle.remove();\n scheduleId && clearTimeout(scheduleId);\n otherInteractHandlers = viewpointWatchHandle = viewStationaryHandle = scheduleId = null;\n };\n const interactWatcher = view.watch('interacting,animation', (newValue) => {\n if (!newValue) {\n return;\n }\n if (viewpointWatchHandle || scheduleId) {\n return;\n }\n // start updating the other views at the next frame\n scheduleId = setTimeout(() => {\n scheduleId = null;\n viewpointWatchHandle = view.watch('viewpoint', (newValue) => {\n others.forEach((otherView) => {\n otherView.viewpoint = newValue;\n });\n });\n }, 0);\n // stop as soon as another view starts interacting, like if the user starts panning\n otherInteractHandlers = others.map((otherView) => {\n return watchUtils.watch(otherView, 'interacting,animation', (value) => {\n if (value) {\n clear();\n }\n });\n });\n // or stop when the view is stationary again\n viewStationaryHandle = watchUtils.whenTrue(view, 'stationary', clear);\n });\n // return {\n // remove: () => {\n // this.remove = () => {};\n // clear();\n // interactWatcher.remove();\n // },\n // };\n};\n\nexport const synchronizeViews = (views, watchUtils) => {\n let handles = views.map((view, idx, views) => {\n const others = views.concat();\n others.splice(idx, 1);\n return synchronizeView(view, others, watchUtils);\n });\n // return {\n // remove: () => {\n // this.remove = () => {};\n // handles.forEach((h) => {\n // h.remove();\n // });\n // handles = null;\n // },\n // };\n};\n\n/**\n * @description Removes the geometry/texture color, applies the material color, and add edges\n * @param {__esri.SceneLayer} layer - target layer to remove texture\n */\nconst updateRenderer = async (layer) => {\n const renderer = layer.renderer.clone();\n const symbol = renderer.symbol.clone();\n const symbolLayer = symbol.symbolLayers.getItemAt(0).clone();\n\n const material = symbolLayer.material.clone();\n material.colorMixMode = 'replace';\n material.color = [180, 140, 100];\n symbolLayer.material = material;\n\n const [SolidEdges3D] = await loadModules(['esri/symbols/edges/SolidEdges3D']);\n const edges = new SolidEdges3D({\n color: [50, 50, 50, 0.5],\n });\n symbolLayer.edges = edges;\n\n symbol.symbolLayers = [symbolLayer];\n renderer.symbol = symbol;\n layer.renderer = renderer;\n};\n\nconst addSceneLayer = async (sceneLayerUrl, itemId) => {\n const view = store.getState().appReducer.view3D;\n\n if (view) {\n const sceneLayerId = `upload-${itemId}`;\n\n const previousLayer = view.map.findLayerById(sceneLayerId);\n if (previousLayer) {\n view.map.remove(previousLayer);\n }\n\n const layer = await LayerFactory.createLayer({\n type: 'sceneLayer',\n options: {\n id: sceneLayerId,\n url: sceneLayerUrl,\n popupEnabled: false,\n elevationInfo: { mode: 'on-the-ground' },\n },\n });\n\n await layer.load();\n\n if (layer.textureSetDefinitions === null) {\n // there is not texture\n updateRenderer(layer);\n }\n\n view.map.add(layer);\n\n return layer;\n }\n};\n\nconst addFootprintGraphic = async (footprint, itemId) => {\n const view = store.getState().appReducer.view3D;\n\n if (view && footprint) {\n const [Graphic, Polygon] = await loadModules(['esri/Graphic', 'esri/geometry/Polygon']);\n\n const footprintGraphicId = `footprint-${itemId}`;\n\n const previousGraphic = view.graphics.items.find((graphic) => graphic.attributes.id === footprintGraphicId);\n if (previousGraphic) {\n view.graphics.remove(previousGraphic);\n }\n\n const polygon = new Polygon({ type: 'polygon', ...footprint });\n const footprintGraphic = new Graphic({\n attributes: {\n id: footprintGraphicId,\n },\n geometry: polygon,\n symbol: {\n type: 'simple-fill',\n color: [202, 90, 199, 0.5],\n outline: {\n color: [202, 90, 199, 3],\n width: 1,\n },\n },\n });\n\n view.graphics.add(footprintGraphic);\n\n return footprintGraphic;\n }\n};\n\nexport const addUploadLayer = async (sceneLayerUrl, footprint, selectedFile, slpk) => {\n const itemId = selectedFile.itemId;\n\n mapController.highlightHandler?.remove();\n const sceneLayer = await addSceneLayer(sceneLayerUrl, itemId);\n const footprintGraphic = await addFootprintGraphic(footprint, itemId);\n\n store.dispatch(\n setUploadedFile({\n ...selectedFile,\n slpk,\n sceneLayerId: sceneLayer.id,\n sceneLayerUrl,\n footprintGraphicId: footprintGraphic?.attributes?.id,\n geometry: footprintGraphic?.geometry,\n position: { x: 0, y: 0, z: 0 },\n })\n );\n\n const view = store.getState().appReducer.view3D;\n if (sceneLayer.fullExtent) {\n view.goTo({ target: sceneLayer.fullExtent, tilt: 45 }, { duration: 3000 });\n } else if (footprintGraphic) {\n view.goTo({ target: footprintGraphic, tilt: 45 }, { duration: 3000 });\n }\n};\n\nexport const replaceUploadLayer = async (sceneLayerUrl, footprint, selectedFile, slpk, updatedPosition) => {\n if (selectedFile) {\n const { sceneLayerId } = selectedFile;\n\n if (sceneLayerId) {\n const sceneLayer = await addSceneLayer(sceneLayerUrl, selectedFile.itemId);\n const footprintGraphic = await addFootprintGraphic(footprint, selectedFile.itemId);\n\n const view = store.getState().appReducer.view3D;\n if (sceneLayer.fullExtent) {\n view.goTo({ target: sceneLayer.fullExtent, tilt: 45 }, { duration: 3000 });\n } else if (footprintGraphic) {\n view.goTo({ target: footprintGraphic, tilt: 45 }, { duration: 3000 });\n }\n\n let location;\n\n const geometry = footprintGraphic?.geometry;\n if (geometry?.centroid) {\n const siteAddressInfo = await getSiteAddressInfoFromPoint(geometry.centroid);\n const { address, latlon } = siteAddressInfo;\n const [LATITUDE, LONGITUDE] = latlon;\n const FULLADDRESS = address;\n location = { FULLADDRESS, LATITUDE, LONGITUDE };\n }\n\n store.dispatch(\n setUploadedFile({\n ...selectedFile,\n slpk,\n geometry,\n location,\n position: updatedPosition,\n sceneLayerUrl,\n })\n );\n }\n }\n};\n\nexport const takeScreenshot = async (view) => {\n const [watchUtils] = await loadModules(['esri/core/watchUtils']);\n\n await view.map.loadAll();\n await view.when();\n await watchUtils.whenTrueOnce(view, 'stationary');\n await watchUtils.whenFalseOnce(view, 'updating');\n const screenshot = await view.takeScreenshot();\n return screenshot;\n};\n\nexport const getInsetMapUrl = async (view) => {\n const [PrintTemplate, print, PrintParameters] = await loadModules([\n 'esri/rest/support/PrintTemplate',\n 'esri/rest/print',\n 'esri/rest/support/PrintParameters',\n ]);\n\n const printTemplate = new PrintTemplate({\n format: 'jpg',\n layout: 'map-only',\n exportOptions: {\n width: 300,\n height: 300,\n dpi: 96,\n },\n });\n\n const printParameters = new PrintParameters({\n view: view,\n template: printTemplate,\n outSpatialReference: view.spatialReference,\n });\n\n const { url } = await print.execute(\n 'https://utility.arcgisonline.com/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task',\n printParameters\n );\n\n if (url) {\n return url;\n }\n};\n\nexport const generateInsetMap = async (ref, extent) => {\n const [WebMap, MapView, Extent] = await loadModules(['esri/WebMap', 'esri/views/MapView', 'esri/geometry/Extent']);\n\n const insetMap = new WebMap({\n basemap: 'streets-vector',\n });\n\n const insetMapview = new MapView({\n map: insetMap,\n extent: extent,\n container: ref,\n constraints: {\n rotationEnabled: false,\n },\n });\n\n insetMapview.ui.remove('zoom');\n await insetMapview.when();\n\n return insetMapview;\n};\n\nexport const getLotData = async (uploadGeometry, url) => {\n const [Query, query] = await loadModules(['esri/rest/support/Query', 'esri/rest/query']);\n\n const getQueryResults = async () => {\n const lotQuery = new Query({\n geometry: uploadGeometry,\n outFields: ['*'],\n returnGeometry: false,\n });\n\n const results = await query\n .executeQueryJSON(url, lotQuery)\n .catch((e) => console.log('error in getQueryResults()', e));\n\n if (results.features.length) {\n return results.features.map((feature) => {\n return {\n ...feature.attributes,\n geometry: feature.geometry,\n };\n });\n } else {\n return null;\n }\n };\n\n return await getQueryResults();\n};\n\nexport const generateCurrentBuildingGraphic = async (latitude, longitude) => {\n const [Point] = await loadModules(['esri/geometry/Point']);\n\n const point = new Point({\n latitude: latitude,\n longitude: longitude,\n });\n\n const buildingCircle = await mapController.generatePdfInsetMapCircleArea(point);\n const buildingGraphic = await mapController.generatePdfInsetMapGraphic(point);\n\n return {\n buildingCircle,\n buildingGraphic,\n };\n};\n","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/marker.0640f547.png\";","/**\n * @function{generateZoneDefinitionExpression}\n * @function{generateBuildingDefinitionExpression}\n * @function{synchronizeView}\n * @function{updatePreviewBuilding}\n */\n\nconst apiUtils = {\n /**\n * @description Utility function to create layer defs for Zones\n * @param{Array} zones - array of zones\n */\n generateZoneDefinitionExpression: (zones) => {\n const layers = [];\n const expressions = [];\n zones.forEach((zone) => {\n zone.districts.forEach((district) => {\n layers.push(district);\n });\n });\n layers.forEach((layer) => {\n if (layer.visible === false) {\n const expression = `(Zone_District <> '${layer.id}')`;\n expressions.push(expression);\n }\n });\n const definitionExpression = expressions.join(' AND ');\n return definitionExpression;\n },\n\n /**\n * @description Utility function to create layer defs for 3D buildings\n * @param{Array} buildings - array of building objectids\n */\n generateBuildingDefinitionExpression: (buildings) => {\n // declare definition to be returned\n let definition = '';\n // join buildings array into string\n if (buildings) {\n definition = `OBJECTID NOT IN (${buildings.join(',')})`;\n }\n // return defintion to be set against the layer\n return definition;\n },\n\n convertFeetToMeters: (number) => number / 3.2808,\n\n convertNumber: (sign, value) => {\n // If the value is not a number\n if (isNaN(value)) {\n return 0;\n } else {\n if (sign === 'positive') {\n return Math.abs(value);\n }\n if (sign === 'negative') {\n switch (Math.sign(value)) {\n // Positive\n case 1:\n return value * -1;\n // Negative\n case -1:\n return value;\n // Positive or Negative Zero or NaN\n case 0:\n case -0:\n return 0;\n default:\n break;\n }\n }\n }\n },\n\n bytesToSize: (bytes) => {\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n if (bytes === 0) {\n return 'n/a';\n }\n const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10);\n if (i === 0) {\n return `${bytes} ${sizes[i]})`;\n }\n return `${(bytes / 1024 ** i).toFixed(1)} ${sizes[i]}`;\n },\n};\n\nexport default apiUtils;\n","import mapController from '../controllers/MapController';\nimport apiUtils from '../utils/api';\n\nexport type SketchHeightUnit = 'Feet' | 'Meters';\nexport const SKETCH_INITIAL_HEIGHT = 10;\nexport const SKETCH_INITIAL_UNIT: SketchHeightUnit = 'Feet';\n\nexport const SKETCH_DEFAULT_TITLE = 'My Sketch';\n\nexport const sketchViewModelProperties = (\n view: __esri.SceneView,\n layer: __esri.GraphicsLayer\n): __esri.SketchViewModelProperties => ({\n view,\n layer,\n defaultUpdateOptions: {\n tool: 'transform',\n enableZ: false,\n multipleSelectionEnabled: false,\n reshapeOptions: {\n edgeOperation: 'split', // Manipulators show up to offset the edges. (only 3D)\n // shapeOperation: 'move-xy', // Move manipulator show up to move in xy only. (only 3D)\n vertexOperation: 'move-xy', // Move manipulator show up to move in xy only.\n },\n },\n polygonSymbol: {\n type: 'polygon-3d',\n symbolLayers: [\n {\n type: 'extrude',\n size: apiUtils.convertFeetToMeters(SKETCH_INITIAL_HEIGHT),\n material: {\n color: [100, 130, 180],\n },\n edges: {\n // @ts-ignore\n type: 'sketch',\n color: [50, 50, 50, 0.5],\n },\n },\n ],\n },\n snappingOptions: {\n enabled: true,\n distance: 8,\n featureSources: [{ layer: mapController.buildingsLayer, enabled: true }],\n },\n tooltipOptions: { enabled: true },\n labelOptions: { enabled: true },\n});\n","import { loadModules } from 'esri-loader';\nimport store from '../../store';\nimport { setActiveTool, setDisplayShadowHighlighted, setHighlightColor } from '../../store/slices/appSlice';\nimport {\n addSketch,\n ISketch,\n removeSketch,\n setIsMagnifierOn,\n setSelectedSketch,\n setSketchStatus,\n updateSketch,\n} from '../../store/slices/sketchSlice';\nimport {\n sketchViewModelProperties,\n SKETCH_DEFAULT_TITLE,\n SKETCH_INITIAL_HEIGHT,\n SKETCH_INITIAL_UNIT,\n} from '../configs/config.sketch';\nimport mapController from './MapController';\n\nclass SketchController {\n #sketchViewModel?: __esri.SketchViewModel;\n #sketchGraphicsLayer?: __esri.GraphicsLayer;\n\n initializeSketchViewModel = async (view3D: __esri.SceneView) => {\n const [SketchViewModel, GraphicsLayer] = await loadModules([\n 'esri/widgets/Sketch/SketchViewModel',\n 'esri/layers/GraphicsLayer',\n ]);\n\n this.#sketchGraphicsLayer = new GraphicsLayer({\n id: 'sketch-layer',\n elevationInfo: { mode: 'relative-to-scene' },\n });\n\n view3D.map.add(this.#sketchGraphicsLayer!);\n\n view3D.when(() => {\n if (this.#sketchGraphicsLayer) {\n this.#sketchViewModel = new SketchViewModel(sketchViewModelProperties(view3D, this.#sketchGraphicsLayer));\n\n if (this.#sketchViewModel) {\n this.#sketchViewModel.on('create', (event) => {\n const { graphic, state } = event;\n\n if (state === 'start') {\n store.dispatch(setSketchStatus('sketching'));\n if (store.getState().sketchReducer.selectedSketch) {\n store.dispatch(setSelectedSketch());\n }\n } else if (state === 'complete') {\n // @ts-ignore\n const { uid } = graphic;\n\n const sketch = {\n uid,\n height: SKETCH_INITIAL_HEIGHT,\n unit: SKETCH_INITIAL_UNIT,\n title: SKETCH_DEFAULT_TITLE,\n visible: true,\n };\n\n store.dispatch(addSketch(sketch));\n store.dispatch(setSketchStatus('idle'));\n\n mapController.removeLocationPinGraphic();\n\n // @ts-ignore\n mapController.mapClick({ mapPoint: graphic.geometry.centroid });\n this.#sketchViewModel?.update([graphic]);\n } else if (state === 'cancel') {\n store.dispatch(setSketchStatus('idle'));\n }\n });\n\n this.#sketchViewModel.on('update', (event) => {\n const { graphics, state } = event;\n\n if (state === 'start') {\n if (store.getState().appReducer.activeTool !== 'sketch') {\n store.dispatch(setActiveTool('sketch'));\n }\n store.dispatch(setSketchStatus('editing'));\n\n mapController.highlightHandler?.remove();\n mapController.removeLocationPinGraphic();\n\n const graphic = graphics[0];\n this.updateMapUnitBasedOnSelectedSketch(graphic);\n\n store.dispatch(setSelectedSketch(graphic));\n store.dispatch(setDisplayShadowHighlighted(false));\n } else if (state === 'complete') {\n store.dispatch(setSketchStatus('idle'));\n store.dispatch(setSelectedSketch());\n }\n });\n\n this.#sketchViewModel.on('delete', (event) => {\n const { graphics, tool } = event;\n\n const [graphic] = graphics;\n // @ts-ignore\n const { uid } = graphic;\n\n store.dispatch(setSelectedSketch());\n store.dispatch(removeSketch(uid));\n\n mapController.setMagnifierVisibility(false);\n store.dispatch(setIsMagnifierOn(false));\n });\n }\n }\n });\n };\n\n private updateMapUnitBasedOnSelectedSketch = (graphic: __esri.Graphic) => {\n // @ts-ignore\n const uid = graphic.uid;\n const prevSketch = store.getState().sketchReducer.sketches.find((sketch) => sketch.uid === uid);\n\n if (prevSketch && prevSketch.unit === 'Meters') {\n mapController.updateMeasurementUnit('metric');\n } else if (prevSketch && prevSketch.unit === 'Feet') {\n mapController.updateMeasurementUnit('imperial');\n }\n };\n\n setSketchColor = (color: __esri.Color | string) => {\n const { selectedSketch } = store.getState().sketchReducer;\n\n const cloneSymbol = selectedSketch.symbol.clone();\n const symbolLayer = cloneSymbol.symbolLayers.getItemAt(0);\n symbolLayer.material = { ...symbolLayer.material, color };\n cloneSymbol.symbolLayers = [symbolLayer];\n selectedSketch.symbol = cloneSymbol;\n };\n\n startSketch = () => {\n this.setSketchLabelsVisibility(true);\n if (SKETCH_INITIAL_UNIT === 'Feet') {\n mapController.updateMeasurementUnit('imperial');\n } else if (SKETCH_INITIAL_UNIT === 'Meters') {\n mapController.updateMeasurementUnit('metric');\n }\n\n this.#sketchViewModel?.create('polygon');\n mapController.removeLocationPinGraphic();\n mapController.highlightHandler?.remove();\n };\n\n updateSketch = (graphic: __esri.Graphic) => {\n this.#sketchViewModel?.update([graphic], { tool: 'reshape' });\n };\n\n deleteSelectedSketch = () => {\n this.#sketchViewModel?.delete();\n // store.dispatch(setSelectedSketch());\n };\n\n cancelSketch = () => {\n this.#sketchViewModel?.update([]);\n this.#sketchViewModel?.cancel();\n };\n\n updateSketchHeight = (value: number) => {\n const { selectedSketch } = store.getState().sketchReducer;\n\n if (selectedSketch) {\n this.setSketchLabelsVisibility(true);\n const cloneSymbol = selectedSketch.symbol.clone();\n const symbolLayer = cloneSymbol.symbolLayers.getItemAt(0);\n symbolLayer.size = value;\n cloneSymbol.symbolLayers = [symbolLayer];\n selectedSketch.symbol = cloneSymbol;\n\n store.dispatch(setSelectedSketch(selectedSketch));\n }\n };\n\n setSketchLayerVisibility = (visible: boolean) => {\n if (this.#sketchViewModel?.layer) {\n this.#sketchViewModel.layer.visible = visible;\n }\n };\n\n toggleSketchLayerVisibility = () => {\n if (this.#sketchViewModel?.layer) {\n this.#sketchViewModel.layer.visible = !this.#sketchViewModel.layer.visible;\n }\n };\n\n setSketchLabelsVisibility = (visibility: boolean) => {\n if (this.#sketchViewModel) {\n this.#sketchViewModel.labelOptions.enabled = visibility;\n }\n };\n\n setSketchVisibility = (sketch: ISketch, visibility: boolean) => {\n const graphic = this.getSketchGraphicByUid(sketch.uid);\n if (graphic) {\n graphic.visible = visibility;\n }\n\n this.setSketchLabelsVisibility(visibility);\n\n store.dispatch(updateSketch({ ...sketch, visible: visibility }));\n };\n\n getSketchGraphicByUid = (uid: string) => {\n // @ts-ignore\n const graphic = this.#sketchGraphicsLayer?.graphics.find((graphic) => graphic.uid === uid);\n\n return graphic;\n };\n\n setSelectedSketchShadow = (visible: boolean) => {\n const { selectedSketch } = store.getState().sketchReducer;\n\n const graphic = this.getSketchGraphicByUid(selectedSketch.uid);\n if (graphic?.symbol.type === 'polygon-3d') {\n const symbolClone = (graphic.symbol as __esri.PolygonSymbol3D).clone();\n\n const symbolLayer = symbolClone.symbolLayers.getItemAt(0);\n if (symbolLayer.type === 'extrude') {\n (symbolLayer as __esri.ExtrudeSymbol3DLayer).castShadows = visible;\n graphic.symbol = symbolClone;\n }\n }\n };\n\n setSelectedSketchShadowHighlight = async (\n highlighted: boolean,\n color = store.getState().appReducer.highlightColor\n ) => {\n const { selectedSketch } = store.getState().sketchReducer;\n\n if (selectedSketch) {\n const layerView = await mapController.view3D.whenLayerView(this.#sketchGraphicsLayer);\n\n if (highlighted) {\n mapController.view3D.highlightOptions.color = [0, 0, 0, 0];\n mapController.view3D.highlightOptions.shadowColor = color;\n store.dispatch(setHighlightColor(color));\n mapController.view3D.highlightOptions.shadowOpacity = 1;\n mapController.view3D.highlightOptions.shadowDifference = 0.6;\n\n mapController.highlightHandler = layerView.highlight(selectedSketch);\n } else {\n mapController.highlightHandler?.remove();\n }\n }\n };\n\n get sketchGraphicsLayer() {\n return this.#sketchGraphicsLayer;\n }\n\n get sketchViewModel() {\n return this.#sketchViewModel;\n }\n}\n\nconst sketchController = new SketchController();\n\nexport default sketchController;\n\ndeclare global {\n interface Window {\n sketchController: SketchController;\n }\n}\n\nif (process.env.NODE_ENV === 'development') {\n window.sketchController = sketchController;\n}\n","import { loadModules } from 'esri-loader';\nimport store from '../../store';\nimport { setDimensionAnalysisIsEmpty, setDimensionAnalysisStatus } from '../../store/slices/measurementSlice';\n\nclass DimensionAnalysisController {\n #dimensionAnalysis?: __esri.DimensionAnalysis;\n #dimensionLayer?: __esri.DimensionLayer;\n #dimensionLayerView?: __esri.DimensionLayerView;\n\n initializeDimensionAnalysis = async (view: __esri.SceneView) => {\n const [DimensionAnalysis, DimensionLayer, reactiveUtils] = await loadModules([\n 'esri/analysis/DimensionAnalysis',\n 'esri/layers/DimensionLayer',\n 'esri/core/reactiveUtils',\n ]);\n\n view.when(async () => {\n this.#dimensionAnalysis = new DimensionAnalysis({\n style: {\n type: 'simple',\n color: [19, 70, 148],\n textBackgroundColor: [19, 70, 148, 0.8],\n textColor: 'white',\n },\n });\n\n this.#dimensionLayer = new DimensionLayer({\n title: 'Interactive dimensions',\n source: this.#dimensionAnalysis,\n });\n\n reactiveUtils.watch(\n () => this.#dimensionLayer!.source.dimensions.length,\n (dimensionsCount: number) => {\n store.dispatch(setDimensionAnalysisIsEmpty(dimensionsCount === 0));\n }\n );\n\n view.map.add(this.#dimensionLayer!);\n\n this.#dimensionLayerView = await view.whenLayerView(this.#dimensionLayer!);\n });\n };\n\n onComplete = () => {\n this.#dimensionLayerView!.interactive = false;\n store.dispatch(setDimensionAnalysisStatus('idle'));\n };\n\n start = async () => {\n if (!this.#dimensionLayerView?.interactive) {\n store.dispatch(setDimensionAnalysisStatus('active'));\n\n this.#dimensionLayerView?.createLengthDimensions().then(this.onComplete, this.onComplete);\n } else {\n this.onComplete();\n }\n };\n\n updateLangthDimensions = async () => {\n const dimensions = this.#dimensionAnalysis!.dimensions.clone();\n this.#dimensionAnalysis!.dimensions = dimensions;\n };\n\n clear = () => {\n this.#dimensionAnalysis?.dimensions.removeAll();\n this.#dimensionLayerView!.interactive = false;\n };\n\n cancel = () => {\n if (this.#dimensionLayerView) {\n this.#dimensionLayerView!.interactive = false;\n }\n };\n\n get selectedDimension() {\n return this.#dimensionLayerView?.selectedDimension;\n }\n\n get dimensionLayer() {\n return this.#dimensionLayer;\n }\n\n get dimensionAnalysis() {\n return this.#dimensionAnalysis;\n }\n}\n\nconst dimensionAnalysisController = new DimensionAnalysisController();\n\nexport default dimensionAnalysisController;\n\ndeclare global {\n interface Window {\n dimensionAnalysisController: typeof dimensionAnalysisController;\n }\n}\n\nif (process.env.NODE_ENV === 'development') {\n window.dimensionAnalysisController = dimensionAnalysisController;\n}\n","import { arcgisToGeoJSON, geojsonToArcGIS } from '@terraformer/arcgis';\nimport transformTranslate from '@turf/transform-translate';\nimport { loadModules } from 'esri-loader';\nimport { Polygon } from 'geojson';\nimport store from '../../store';\nimport { BuildingPositionAxis, Position } from '../../store/slices/uploadSlice';\n\nexport const INITIAL_EDIT_POSITION: Position = { x: 0, y: 0, z: 0 };\n\ninterface IBuildingPositionParameters {\n x: number;\n y: number;\n}\n\nconst FEET_TO_METERS_VALUE = 0.3048;\n\nconst convertXYCoordinatesToDegrees = (buildingPositionParameters: IBuildingPositionParameters) => {\n let xPositionMeters = buildingPositionParameters.x * FEET_TO_METERS_VALUE;\n let yPositionMeters = buildingPositionParameters.y * FEET_TO_METERS_VALUE;\n\n const rad = Math.atan2(yPositionMeters, xPositionMeters);\n\n let deg;\n if (rad >= 0) {\n deg = rad * (180 / Math.PI);\n } else {\n deg = (rad + 2 * Math.PI) * (180 / Math.PI);\n }\n\n deg = 360 - deg + 90;\n\n if (deg > 359) {\n deg -= 360;\n }\n\n return deg;\n};\n\nconst getXYDistanceFromCenter = (buildingPositionParameters: Position) => {\n const feetDistance = Math.sqrt(buildingPositionParameters.x ** 2 + buildingPositionParameters.y ** 2);\n\n return {\n feet: feetDistance,\n meters: feetDistance * FEET_TO_METERS_VALUE,\n };\n};\n\nconst movePolygon = async (polygon: __esri.Polygon, distanceMeters: number, directionAngleClockwiseNorth: number) => {\n const [Polygon] = await loadModules(['esri/geometry/Polygon']);\n\n const geoJSONPolygon = arcgisToGeoJSON(polygon.toJSON()) as Polygon;\n const updatedGeoJSONPolygon = transformTranslate(geoJSONPolygon, distanceMeters, directionAngleClockwiseNorth, {\n units: 'meters',\n });\n\n const updatedPolygon = geojsonToArcGIS(updatedGeoJSONPolygon);\n return Polygon.fromJSON(updatedPolygon);\n};\n\nexport const getUpdatedBuildingFootprintGeometry = async (\n polygon: __esri.Polygon,\n buildingPositionParameters: Position\n) => {\n const distance = getXYDistanceFromCenter(buildingPositionParameters);\n const distanceMeters = distance.meters;\n\n const directionAngleClockwiseNorth = convertXYCoordinatesToDegrees(buildingPositionParameters);\n\n const updatedPolygon = movePolygon(polygon, distanceMeters, directionAngleClockwiseNorth);\n return updatedPolygon;\n};\n\nexport const getUpdatedFilePosition = (newPosition: Position) => {\n const { uploadedFiles, selectedFileId } = store.getState().uploadReducer;\n\n if (selectedFileId) {\n const selectedFile = uploadedFiles[selectedFileId];\n\n if (selectedFile) {\n const prevPosition = selectedFile.position;\n\n const updatedPosition = {};\n\n if (!prevPosition) {\n return newPosition;\n }\n\n if (newPosition && prevPosition) {\n Object.entries(newPosition).forEach(([key, value]) => {\n const prevValue = prevPosition[key as BuildingPositionAxis];\n if (!isNaN(prevValue) && !isNaN(value)) {\n // @ts-ignore\n updatedPosition[key] = prevValue + value;\n }\n });\n\n return updatedPosition as Position;\n }\n }\n }\n\n return newPosition;\n};\n\nexport const getXYDistanceBetweenPoints = async (originPoint: __esri.Point, targetPoint: __esri.Point) => {\n const [Point, geodesicUtils] = (await loadModules([\n 'esri/geometry/Point',\n 'esri/geometry/support/geodesicUtils',\n ])) as [typeof __esri.Point, typeof __esri.geodesicUtils];\n\n const targetXDistance = new Point({\n latitude: originPoint.latitude,\n longitude: targetPoint.longitude,\n });\n\n const targetYDistance = new Point({\n longitude: originPoint.longitude,\n latitude: targetPoint.latitude,\n });\n\n const xDistance = geodesicUtils.geodesicDistance(originPoint, targetXDistance, 'feet');\n const yDistance = geodesicUtils.geodesicDistance(originPoint, targetYDistance, 'feet');\n\n const xDistanceValue = xDistance.distance;\n const yDistanceValue = yDistance.distance;\n\n if (xDistanceValue && yDistanceValue) {\n const newXOffset = Math.round(originPoint.longitude < targetPoint.longitude ? xDistanceValue : xDistanceValue * -1);\n const newYOffset = Math.round(originPoint.latitude < targetPoint.latitude ? yDistanceValue : yDistanceValue * -1);\n\n return {\n x: newXOffset,\n y: newYOffset,\n };\n } else {\n return {\n x: 0,\n y: 0,\n };\n }\n};\n","import { loadModules, setDefaultOptions } from 'esri-loader';\nimport { urls, portalId, viewOptions, defaultCompareHiddenLayers, layers, basemaps } from '../config';\nimport layerFactory from '../utils/layerFactory';\nimport { synchronizeViews } from '../utils/esri';\nimport _throttle from 'lodash/throttle';\n// import store from '../../appStore';\nimport store from '../../store';\nimport mapIcon from '../../css/images/map-location-icon.png';\nimport marker from '../../css/images/marker.png';\nimport {\n setSite,\n setActiveTool,\n setSiteExpanded,\n setCurrentBuilding,\n setView3D,\n setView3DCompare,\n setMapCompare,\n setMap,\n setView3DReady,\n setHighlightColor,\n setIsShadowCastLoaded,\n} from '../../store/slices/appSlice';\nimport { setSelectedFileId } from '../../store/slices/uploadSlice';\nimport apiUtils from '../utils/api';\nimport sketchController from './SketchController';\nimport dimensionAnalysisController from './DimensionAnalysisController';\nimport { getUpdatedBuildingFootprintGeometry } from '../utils/geometry.utils';\nimport { getSiteAddressInfoFromPoint } from '../utils/gpAddressInfo.utils';\nimport { LAYER_TITLES } from '../configs/config.layerTitles';\nimport {\n MEASUREMENT_UNITS,\n setAreaMeasurementStatus,\n setDirectLineMeasurementStatus,\n setSelectedMeasurementUnit,\n} from '../../store/slices/measurementSlice';\n\nclass MapController {\n #view3D;\n #view3DCompare;\n highlightHandler;\n #measurementWidgetArea;\n #measurementWidgetDirectLine;\n #lineOfSight;\n #shadowCast;\n #buidlingsLayer;\n\n initialize = async (mapViewRef, compareViewRef) => {\n setDefaultOptions({ version: '4.26', css: true });\n\n const [WebScene, SceneView, watchUtils, reactiveUtils] = await loadModules([\n 'esri/WebScene',\n 'esri/views/SceneView',\n 'esri/core/watchUtils',\n 'esri/core/reactiveUtils',\n ]);\n\n // init webscenes\n const scene = new WebScene({\n basemap: 'dark-gray-vector',\n portalItem: {\n id: portalId,\n portal: {\n units: 'english', // Options: 'english' | 'metric'\n },\n },\n });\n\n await scene.load();\n\n // Remove Buildings and dark gray layers from scene\n const filteredLayers = scene.layers.filter(\n (l) => l.title !== LAYER_TITLES.BUILDINGS && l.title !== LAYER_TITLES.DC_DARK_GRAY\n );\n\n scene.layers = filteredLayers;\n\n // init webscenes\n this.fixZoningLayerRendererValues(scene);\n\n const compareMap = new WebScene({\n basemap: 'dark-gray-vector',\n portalItem: { id: portalId },\n });\n await compareMap.load();\n\n // Remove Buildings and dark gray layers from scene\n const filteredLayersCompare = compareMap.layers.filter(\n (l) => l.title !== LAYER_TITLES.BUILDINGS && l.title !== LAYER_TITLES.DC_DARK_GRAY\n );\n compareMap.layers = filteredLayersCompare;\n\n this.fixZoningLayerRendererValues(compareMap);\n\n const esriLayersPromises = layers.map((layer) => layerFactory.createLayer(layer));\n const esriLayers = await Promise.all(esriLayersPromises);\n this.#buidlingsLayer = esriLayers.find((layer) => layer.id === LAYER_TITLES.BUILDINGS);\n\n const esriLayersPromisesCompare = layers.map((layer) => layerFactory.createLayer(layer));\n const esriLayersCompare = await Promise.all(esriLayersPromisesCompare);\n\n scene.addMany(esriLayers);\n compareMap.addMany(esriLayersCompare);\n\n // init scene views\n const view3D = new SceneView({\n container: mapViewRef.current,\n map: scene,\n ...viewOptions.sceneView,\n });\n\n const view3DCompare = new SceneView({\n container: compareViewRef.current,\n map: compareMap,\n ...viewOptions.sceneView,\n });\n\n this.#view3D = view3D;\n this.#view3DCompare = view3DCompare;\n\n // @ts-ignore\n window.view3D = view3D;\n\n view3D.layerViews.on('change', (event) => {\n // Check to see if all layers have loaded in the view\n if (event.target.items.length === 13) {\n //Hide neighborhood clusters on initial load\n const neighborhoodLayerView = view3D.layerViews.items.find(\n (layerView) => layerView.layer.title === LAYER_TITLES.NEIGHBORHOODS\n );\n if (neighborhoodLayerView) {\n const layer = neighborhoodLayerView.layer.layers.items.find(\n (item) => item.title === LAYER_TITLES.NEIGHBORHOOD_CLUSTERS\n );\n layer.visible = false;\n }\n }\n });\n\n // sync our views\n synchronizeViews([view3D, view3DCompare], watchUtils);\n\n // view 3d ready\n view3D.when(async () => {\n sketchController.initializeSketchViewModel(view3D);\n dimensionAnalysisController.initializeDimensionAnalysis(view3D);\n\n mapController.setupMagnifier(view3D);\n\n view3D.on('click', async (event) => {\n await this.mapClick(event);\n });\n\n await this.handleURLParams();\n\n store.dispatch(setView3D(view3D));\n store.dispatch(setView3DReady(true));\n\n view3DCompare.when(() => {\n // set initial lighting env to main view\n view3DCompare.environment.lighting.date = view3D.environment.lighting.date;\n\n compareMap.allLayers.forEach((layer) => {\n const sceneLayer = scene.findLayerById(layer.id);\n if (sceneLayer) {\n layer.visible = sceneLayer.visible;\n }\n });\n });\n\n reactiveUtils.watch(\n () => this.view3D.map.basemap,\n (basemap) => {\n compareMap.basemap = basemap;\n }\n );\n\n reactiveUtils.watch(\n () => {\n const layersVisibility = this.view3D.map.layers.map((l) => l.visible);\n return layersVisibility;\n },\n () => {\n this.view3D.map.layers.forEach((layer) => {\n const compareMapLayer = compareMap.findLayerById(layer.id);\n if (compareMapLayer) {\n if (compareMapLayer.visible !== layer.visible) {\n compareMapLayer.visible = layer.visible;\n }\n }\n });\n }\n );\n });\n\n store.dispatch(setView3DCompare(view3DCompare));\n store.dispatch(setMapCompare(compareMap));\n\n store.dispatch(setMap(scene));\n };\n\n handleBasemapChange = async (basemapId) => {\n const [Basemap] = await loadModules(['esri/Basemap']);\n\n let basemap;\n const selectedBasemapConfig = basemaps.find((basemap) => basemap.id === basemapId);\n\n if (selectedBasemapConfig.layerOptions) {\n const baselayerProperties = selectedBasemapConfig.layerOptions;\n const baselayer = await layerFactory.createLayer(baselayerProperties);\n\n basemap = new Basemap({\n baseLayers: [baselayer],\n });\n } else {\n // create basemap from esri basemap ID\n basemap = new Basemap.fromId(basemapId);\n }\n\n if (basemap) {\n this.#view3D.map.basemap = basemap;\n }\n };\n\n waitViewUpdate = async () => {\n const [watchUtils] = await loadModules(['esri/core/watchUtils']);\n return await watchUtils.whenFalseOnce(mapController.view3D, 'updating');\n };\n\n updateViewsLightning = (date) => {\n if (date) {\n if (this.view3D) {\n this.view3D.environment.lighting.date = date;\n }\n\n if (this.view3DCompare) {\n this.#view3DCompare.environment.lighting.date = date;\n }\n }\n };\n\n handleURLParams = async () => {\n const hash = window.location.hash.replace('#', '');\n const startUpParams =\n hash.length > 0\n ? JSON.parse('{\"' + hash.replace(/\"/g, '\\\\\"').replace(/&/g, '\",\"').replace(/=/g, '\":\"') + '\"}')\n : {};\n\n const latitude = startUpParams.lat;\n const longitude = startUpParams.lng;\n\n if (latitude && longitude) {\n const [Point, watchUtils] = await loadModules(['esri/geometry/Point', 'esri/core/watchUtils']);\n\n const point = new Point({\n latitude,\n longitude,\n });\n\n await this.#view3D.map.loadAll();\n\n await this.#view3D.goTo({ target: point, zoom: 18 });\n watchUtils.whenFalseOnce(this.#view3D, 'updating', () => {\n this.mapClick({ mapPoint: point });\n });\n }\n\n window.location.hash = '';\n };\n\n fixZoningLayerRendererValues = async (scene) => {\n await scene.load();\n const zoningLayer = scene.allLayers.find((l) => l.title === LAYER_TITLES.ZONING);\n\n if (zoningLayer) {\n const renderer = zoningLayer.renderer.clone();\n\n const updatedUniqueValueInfos = renderer.uniqueValueInfos.map((uniqueValueInfo) => {\n const uviClone = uniqueValueInfo.clone();\n const updatedValue = uviClone.value.replace('', '');\n uviClone.value = updatedValue;\n return uviClone;\n });\n\n renderer.uniqueValueInfos = updatedUniqueValueInfos;\n zoningLayer.renderer = renderer;\n }\n };\n\n initializeLineOfSightWidget = async (ref) => {\n if (!ref.current) return;\n\n const [LineOfSight] = await loadModules(['esri/widgets/LineOfSight']);\n\n const lineOfSight = new LineOfSight({\n view: this.view3D,\n container: ref.current,\n });\n\n this.#lineOfSight = lineOfSight;\n };\n\n removeLineOfSight = () => {\n this.#lineOfSight?.destroy();\n };\n\n stopLineOfSight = () => {\n this.#lineOfSight?.viewModel?.stop();\n };\n\n updateZoneLayerExpression = (zones) => {\n const definition = apiUtils.generateZoneDefinitionExpression(zones);\n\n const zoneLayer = this.map.allLayers.items.find((l) => l.title === LAYER_TITLES.ZONING);\n zoneLayer.definitionExpression = definition;\n\n const zoneDevelopmentLayer = this.map.allLayers.items.find(\n (l) => l.title === LAYER_TITLES.ZONING_DEVELOPMENT_STANDARD\n );\n zoneDevelopmentLayer.definitionExpression = definition;\n\n // Update compare map\n const zoneLayerCompare = this.#view3DCompare.map.allLayers.items.find((l) => l.title === LAYER_TITLES.ZONING);\n zoneLayerCompare.definitionExpression = definition;\n\n const zoneDevelopmentLayerCompare = this.#view3DCompare.map.allLayers.items.find(\n (l) => l.title === LAYER_TITLES.ZONING_DEVELOPMENT_STANDARD\n );\n zoneDevelopmentLayerCompare.definitionExpression = definition;\n };\n\n removeLocationPinGraphic = () => {\n const graphic = this.view3D.graphics.items.find((g) => g.attributes.id === 'view3D-location-pin');\n if (graphic) {\n this.view3D.graphics.remove(graphic);\n }\n };\n\n addLocationPinGraphic = (geometry) => {\n loadModules(['esri/Graphic', 'esri/symbols/PictureMarkerSymbol']).then(([Graphic, PictureMarkerSymbol]) => {\n // add elevation to geometry\n geometry.z = 100;\n const newGraphic = new Graphic({\n geometry,\n symbol: new PictureMarkerSymbol({\n url: marker,\n width: '45px',\n height: '45px',\n }),\n attributes: {\n id: 'view3D-location-pin',\n },\n });\n\n this.view3D.graphics.add(newGraphic);\n });\n };\n\n replaceLocationGraphic = (geometry) => {\n if (this.view3D.hasOwnProperty('ready') && this.view3D.ready) {\n if (this.view3D.graphics.length) {\n this.removeLocationPinGraphic();\n }\n this.addLocationPinGraphic(geometry);\n }\n };\n\n replaceSelectedFileFootprintGraphic = async (newPosition) => {\n const { uploadedFiles, selectedFileId } = store.getState().uploadReducer;\n const selectedFile = selectedFileId ? uploadedFiles[selectedFileId] : undefined;\n\n if (selectedFile && selectedFile.footprintGraphicId && selectedFile.geometry) {\n // obtain old graphic\n const oldGraphic = this.#view3D.graphics.items.find(\n (graphic) => graphic.attributes.id === selectedFile.footprintGraphicId\n );\n\n if (oldGraphic) {\n const newGeometry = await getUpdatedBuildingFootprintGeometry(selectedFile.geometry, newPosition);\n\n // set new graphic to new geometry\n const newGraphic = oldGraphic.clone();\n newGraphic.geometry = newGeometry;\n\n // remove old graphic and append new graphic\n this.#view3D.graphics.remove(oldGraphic);\n this.#view3D.graphics.add(newGraphic);\n this.#view3D.goTo(newGraphic);\n }\n }\n };\n\n async mapClick(event) {\n //get activeWidget from appSlice\n const { activeWidget } = store.getState().appReducer;\n\n // if there is no widget active, then query for map click event\n if (!activeWidget) {\n const { isSelectLocationOnMapActive } = store.getState().uploadReducer;\n const { mapPoint } = event;\n const siteExpanded = store.getState().appReducer.siteExpanded;\n\n // fake screenpoint if does not exist\n if (!event.hasOwnProperty('screenPoint')) {\n const screenPoint = this.#view3D.toScreen(mapPoint);\n screenPoint.z = undefined;\n event.screenPoint = screenPoint;\n event.type = 'click';\n event.x = screenPoint.x;\n event.y = screenPoint.y;\n event.button = 0;\n event.buttons = 0;\n }\n\n try {\n const site = await getSiteAddressInfoFromPoint(mapPoint);\n store.dispatch(setSite(site));\n\n const sketchStatus = store.getState().sketchReducer.status;\n const isSketchActive = sketchStatus === 'active' || sketchStatus === 'editing';\n\n if (!isSelectLocationOnMapActive && !isSketchActive) {\n // replace graphic\n this.replaceLocationGraphic(mapPoint);\n this.hitTest(event);\n\n if (!siteExpanded) {\n store.dispatch(setSiteExpanded(true));\n }\n }\n } catch (error) {\n console.log('Handle map click error', error);\n }\n }\n }\n\n async hitTest(event) {\n try {\n this.highlightHandler?.remove();\n\n const data = await this.#view3D.hitTest(event);\n const [feature] = data.results;\n\n if (data && feature) {\n if (feature.graphic === null) {\n store.dispatch(setCurrentBuilding());\n } else {\n const { graphic } = feature;\n const { uploadedFiles } = store.getState().uploadReducer;\n\n if (graphic.layer.id !== 'sketch-layer') {\n if (graphic.layer.title === LAYER_TITLES.BUILDINGS) {\n store.dispatch(setSelectedFileId(''));\n\n store.dispatch(setCurrentBuilding(graphic));\n this.highlightGraphic(graphic);\n this.#view3D.goTo(graphic);\n store.dispatch(setActiveTool('default'));\n } else if (Object.keys(uploadedFiles).includes(graphic.layer.id)) {\n store.dispatch(setCurrentBuilding());\n store.dispatch(setActiveTool('uploaded-files'));\n store.dispatch(setSelectedFileId(graphic.layer.id));\n this.highlightHandler.remove();\n }\n } else {\n this.highlightHandler.remove();\n this.removeLocationPinGraphic();\n }\n }\n }\n } catch (error) {\n console.log('Highlight error', error);\n }\n }\n\n /**\n * Set WebScene measurement unit\n * @param {string} units 'english' | 'metric'\n */\n setMapMeasurementUnit = (units) => {\n if (this.#view3D.map.portalItem.portal) {\n this.#view3D.map.portalItem.portal.units = units;\n }\n };\n\n setSelectedFileShadow = (visible) => {\n const { uploadedFiles, selectedFileId } = store.getState().uploadReducer;\n const selectedFile = uploadedFiles[selectedFileId];\n\n if (selectedFile) {\n const selectedFileLayer = this.#view3D.map.findLayerById(selectedFile.sceneLayerId);\n\n const rendererClone = selectedFileLayer?.renderer?.clone();\n rendererClone.symbol.symbolLayers.getItemAt(0).castShadows = visible;\n selectedFileLayer.renderer = rendererClone;\n }\n };\n\n setSelectedFileShadowHighlight = async (highlighted, color = store.getState().appReducer.highlightColor) => {\n const { selectedFileId, uploadedFiles } = store.getState().uploadReducer;\n const selectedFile = uploadedFiles[selectedFileId];\n\n if (selectedFile) {\n const selectedFileLayer = this.#view3D.map.findLayerById(selectedFile.sceneLayerId);\n\n if (selectedFileLayer) {\n const layerView = await this.view3D.whenLayerView(selectedFileLayer);\n\n const { features } = await layerView.queryFeatures({ OID: selectedFileId });\n\n if (features && features.length) {\n if (highlighted) {\n this.view3D.highlightOptions.color = [0, 0, 0, 0];\n this.view3D.highlightOptions.shadowColor = color;\n store.dispatch(setHighlightColor(color));\n this.view3D.highlightOptions.shadowOpacity = 1;\n this.view3D.highlightOptions.shadowDifference = 0.6;\n\n this.highlightHandler = layerView.highlight(features[0]);\n } else {\n this.highlightHandler?.remove();\n }\n }\n }\n }\n };\n\n setHighlightShadowColor = (color) => {\n this.view3D.highlightOptions.shadowColor = color;\n };\n\n highlightGraphic = async (graphic, color = [0, 255, 255, 1], shadowColor = [0, 0, 0, 0.5]) => {\n const layerView = await this.#view3D.whenLayerView(graphic.layer);\n\n if (layerView) {\n this.view3D.highlightOptions.color = color;\n this.view3D.highlightOptions.shadowColor = shadowColor;\n this.view3D.highlightOptions.shadowOpacity = 0.4;\n this.highlightHandler = layerView.highlight(graphic);\n }\n };\n\n generatePdfInsetMapGraphic = async (point) => {\n const [Graphic] = await loadModules(['esri/Graphic']);\n\n return new Graphic({\n geometry: point,\n symbol: {\n type: 'picture-marker',\n url: mapIcon,\n height: 30,\n width: 30,\n },\n });\n };\n\n generatePdfInsetMapCircleArea = async (point) => {\n const [Circle] = await loadModules(['esri/geometry/Circle']);\n\n return new Circle({\n center: point,\n radius: 0.5,\n radiusUnit: 'miles',\n });\n };\n\n updateMeasurementUnit = (unit) => {\n if (this.#view3D) {\n if (unit === 'metric') {\n this.setMapMeasurementUnit('metric');\n } else if (unit === 'imperial') {\n this.setMapMeasurementUnit('english');\n } else {\n return;\n }\n\n dimensionAnalysisController.updateLangthDimensions();\n this.setDirectLineMeasurementUnit(unit);\n this.setAreaMearurementUnit(unit);\n }\n };\n\n initializeAreaMeasurement = async (widgetRef) => {\n const [AreaMeasurement3D, reactiveUtils] = await loadModules([\n 'esri/widgets/AreaMeasurement3D',\n 'esri/core/reactiveUtils',\n ]);\n\n this.removeAreaMeasurementWidget(); // delete previous instances of measurement widget\n\n this.#measurementWidgetArea = new AreaMeasurement3D({\n view: this.#view3D,\n container: widgetRef.current,\n unitOptions: MEASUREMENT_UNITS,\n });\n\n reactiveUtils.watch(\n () => this.#measurementWidgetArea?.viewModel.state,\n (state) => {\n store.dispatch(setAreaMeasurementStatus(state));\n }\n );\n\n reactiveUtils.watch(\n () => this.#measurementWidgetArea?.unit,\n (newUnit) => {\n store.dispatch(setSelectedMeasurementUnit(newUnit));\n }\n );\n };\n\n initializeDirectLineMeasurement = async (widgetRef) => {\n const [DirectLineMeasurement3D, reactiveUtils] = await loadModules([\n 'esri/widgets/DirectLineMeasurement3D',\n 'esri/core/reactiveUtils',\n ]);\n\n this.removeDirectLineMeasurementWidget(); // delete previous instances of measurement widget\n\n this.#measurementWidgetDirectLine = new DirectLineMeasurement3D({\n view: this.#view3D,\n container: widgetRef.current,\n unitOptions: MEASUREMENT_UNITS,\n });\n\n reactiveUtils.watch(\n () => this.#measurementWidgetDirectLine?.viewModel.state,\n (state) => {\n store.dispatch(setDirectLineMeasurementStatus(state));\n }\n );\n\n reactiveUtils.watch(\n () => this.#measurementWidgetDirectLine?.unit,\n (newUnit) => {\n store.dispatch(setSelectedMeasurementUnit(newUnit));\n }\n );\n };\n\n getMeasurementWidgetAreaState = () => {\n return this.#measurementWidgetArea?.viewModel?.state;\n };\n\n clearAreaMeasurement = async () => {\n this.#measurementWidgetArea?.viewModel?.clear();\n };\n\n getMeasurementWidgetDirectLineState = () => {\n return this.#measurementWidgetDirectLine?.viewModel?.state;\n };\n\n clearDirectLineMeasurement = async () => {\n this.#measurementWidgetDirectLine?.viewModel?.clear();\n };\n\n removeDirectLineMeasurementWidget() {\n if (this.#measurementWidgetDirectLine) {\n this.#view3D.ui.remove(this.#measurementWidgetDirectLine);\n this.#measurementWidgetDirectLine.destroy();\n this.#measurementWidgetDirectLine = null;\n }\n }\n\n setDirectLineMeasurementUnit(unit) {\n if (this.#measurementWidgetDirectLine) {\n this.#measurementWidgetDirectLine.unit = unit;\n }\n }\n\n setAreaMearurementUnit(unit) {\n if (this.#measurementWidgetArea) {\n this.#measurementWidgetArea.unit = unit;\n }\n }\n\n removeAreaMeasurementWidget() {\n if (this.#measurementWidgetArea) {\n this.#view3D.ui.remove(this.#measurementWidgetArea);\n this.#measurementWidgetArea.destroy();\n this.#measurementWidgetArea = null;\n }\n }\n\n async initializeShadowCastWidget(ref) {\n if (!ref.current) {\n return;\n }\n\n const [ShadowCast, watchUtils] = await loadModules(['esri/widgets/ShadowCast', 'esri/core/watchUtils']);\n\n if (this.#view3D) {\n store.dispatch(setIsShadowCastLoaded(false));\n this.#shadowCast = new ShadowCast({ view: this.#view3D, container: ref.current });\n this.#shadowCast.viewModel.date = new Date();\n\n watchUtils.whenEqualOnce(this.#shadowCast.viewModel, 'state', 'ready', () => {\n store.dispatch(setIsShadowCastLoaded(true));\n });\n }\n }\n\n cancelShadowCast() {\n if (this.#shadowCast) {\n this.#shadowCast.viewModel.stop();\n }\n }\n\n setMagnifierVisibility = (visible) => {\n this.#view3D.magnifier.visible = visible;\n };\n\n setupMagnifier = () => {\n this.#view3D.when(() => {\n this.#view3D.magnifier.visible = false;\n this.#view3D.magnifier.factor = 2;\n this.#view3D.magnifier.offset.x = -75;\n this.#view3D.magnifier.offset.y = -75;\n this.#view3D.magnifier.size = 150;\n\n this.#view3D.on(\n 'pointer-move',\n _throttle((event) => {\n this.#view3D.magnifier.position = { x: event.x, y: event.y };\n }, 50)\n );\n });\n };\n\n findLayerByTitle = (title) => {\n return this.map.allLayers.items.find((layer) => layer.title === title);\n };\n\n get view3D() {\n return this.#view3D;\n }\n\n get view3DCompare() {\n return this.#view3DCompare;\n }\n\n get map() {\n return this.view3D.map;\n }\n\n get buildingsLayer() {\n return this.#buidlingsLayer;\n }\n}\n\nconst mapController = new MapController();\n\nexport default mapController;\n\nif (process.env.NODE_ENV === 'development') {\n window.mapController = mapController;\n window.store = store;\n}\n","import React, { useState } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { basemaps } from '../../../config';\nimport ListWrapper from '../../shared/ListWrapper';\nimport IconButton from '../../shared/IconButton';\nimport Avatar from 'material-ui/Avatar';\nimport Subheader from 'material-ui/Subheader';\nimport Layers from 'material-ui/svg-icons/maps/layers';\nimport { ListItem } from 'material-ui/List';\nimport { Checkbox } from '@material-ui/core';\nimport mapController from '../../../controllers/MapController';\nimport {\n displayZoningStandardState,\n mainLayersState,\n setAllDistrictsVisibility,\n setLitenMainLayersControl,\n setMainLayerVisibility,\n toggleZoningStandard,\n view3DState,\n zonesState,\n} from '../../../../store/slices/appSlice';\nimport { LAYER_TITLES } from '../../../configs/config.layerTitles';\nimport '../../../../css/components/mapControlLayers.scss';\nimport '../../../../css/components/iconButton.scss';\n\nconst selectedStyle = {\n backgroundColor: '#25497f',\n};\n\nconst unselectedStyle = {\n backgroundColor: '#202432',\n};\n\nconst MapControlLayers = ({ disableButton }) => {\n const dispatch = useDispatch();\n const [hovered, setHovered] = useState(false);\n const [selectedBasemap, setSelectedBasemap] = useState('dark-gray-vector');\n const displayZoningStandard = useSelector(displayZoningStandardState);\n const zones = useSelector(zonesState);\n const view3D = useSelector(view3DState);\n const mainLayers = useSelector(mainLayersState);\n\n const createLayerCheckbox = (layer, i) => {\n const { id, visible } = layer;\n return (\n } />\n );\n };\n\n const createBasemapOption = (basemap, i) => {\n const { id, thumbnail, title } = basemap;\n return (\n }\n >\n {title}\n \n );\n };\n\n const handleCheck = (event) => {\n const { id, checked } = event.currentTarget;\n\n if (id === LAYER_TITLES.ZONING_DEVELOPMENT_STANDARD && checked && !displayZoningStandard.hasDisplayed) {\n dispatch(toggleZoningStandard(true));\n }\n\n dispatch(setLitenMainLayersControl(id + '_' + checked));\n\n const layer = view3D.map.allLayers.items.find((l) => l.title === id);\n\n // If it matches the zoning layer - toggle off the selectors in the LayersPanel as well.\n if (layer.title === LAYER_TITLES.ZONING) {\n const zoneDevelopmentLayer = view3D.map.allLayers.items.find(\n (l) => l.title === LAYER_TITLES.ZONING_DEVELOPMENT_STANDARD\n );\n dispatch(setAllDistrictsVisibility(checked));\n if (checked) {\n layer.definitionExpression = '';\n zoneDevelopmentLayer.definitionExpression = '';\n }\n } else if (layer.title === LAYER_TITLES.METRO_RAIL) {\n const metroStations = view3D.map.allLayers.items.find((l) => l.title === LAYER_TITLES.METRO_STATIONS);\n metroStations.visible = checked;\n } else if (layer.title === LAYER_TITLES.NEIGHBORHOODS) {\n const neighborhoodLayer = view3D.map.allLayers.items.find((l) => l.title === LAYER_TITLES.NEIGHBORHOODS);\n const clusterLayer = neighborhoodLayer.layers.items.find((l) => l.title === LAYER_TITLES.NEIGHBORHOOD_CLUSTERS);\n // Neighborhood clusters hidden on initial load\n if (checked && !clusterLayer.visible) {\n clusterLayer.visible = true;\n }\n }\n layer.visible = checked;\n dispatch(setMainLayerVisibility({ layerId: id, visible: checked }));\n };\n\n const handleListItemClick = (evt) => {\n const { id } = evt.currentTarget;\n setSelectedBasemap(id);\n\n mapController.handleBasemapChange(id);\n };\n\n return (\n setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n {hovered && (\n
\n \n Layers\n {mainLayers.map(createLayerCheckbox)}\n \n\n
\n\n \n Basemap\n {basemaps.map(createBasemapOption)}\n \n
\n )}\n\n \n \n \n \n );\n};\n\nexport default MapControlLayers;\n","import React from 'react';\n\nexport default function DCBoundary({ className }) {\n return (\n \n DC\n Created with Sketch.\n \n\n \n \n \n \n \n \n );\n}\n","import { useEffect, useState } from 'react';\n\nimport '../../../../css/components/mapControls.scss';\n\nimport IconButton from '../../shared/IconButton';\nimport MapControlGroup from './MapControlGroup';\nimport MapControlLayers from './MapControlLayers';\n\nimport DCBoundary from '../../shared/DCBoundary';\n\nimport Remove from 'material-ui/svg-icons/content/remove';\nimport Add from 'material-ui/svg-icons/content/add';\nimport Location from 'material-ui/svg-icons/maps/my-location';\n\nimport { loadModules } from 'esri-loader';\nimport mapController from '../../../controllers/MapController';\nimport { useSelector } from 'react-redux';\nimport {\n displayZoningStandardState,\n mainLayersState,\n view3DState,\n zonesState,\n activeWidgetState,\n} from '../../../../store/slices/appSlice';\n\nconst MapControls = () => {\n const [initializedOnce, setInitializedOnce] = useState(false);\n const [detailed, setDetailed] = useState(false);\n const [isButtonDisabled, setIsButtonDisabled] = useState(false);\n const zones = useSelector(zonesState);\n const mainLayers = useSelector(mainLayersState);\n const displayZoningStandard = useSelector(displayZoningStandardState);\n const view3D = useSelector(view3DState);\n const activeWidget = useSelector(activeWidgetState);\n\n useEffect(() => {\n if (!initializedOnce && view3D?.ready) {\n (async () => {\n const [Compass, NavigationToggle] = await loadModules([\n 'esri/widgets/Compass',\n 'esri/widgets/NavigationToggle',\n ]);\n\n new Compass({\n view: view3D,\n container: 'esriCompass',\n });\n\n new NavigationToggle({\n view: view3D,\n container: 'esriNavigation',\n });\n })();\n\n setInitializedOnce(true);\n }\n }, [initializedOnce, view3D]);\n\n useEffect(() => {\n if (activeWidget) {\n setIsButtonDisabled(true);\n } else {\n setIsButtonDisabled(false);\n }\n }, [activeWidget]);\n\n const handleMapZoom = (event) => {\n const { id } = event.currentTarget;\n // only zoom if view is ready\n if (mapController.map.view3D) {\n let zoom = view3D.zoom;\n zoom = id === 'zoom-in' ? zoom + 1 : zoom - 1;\n view3D.goTo({ zoom });\n }\n };\n\n const handleLocate = () => {\n // check if geolocation services are available\n if ('geolocation' in navigator) {\n navigator.geolocation.getCurrentPosition((position) => {\n const { latitude, longitude } = position.coords;\n view3D.goTo([longitude, latitude]);\n });\n }\n };\n\n const goToInitialExtent = () => {\n if (view3D) {\n const { viewpoint } = view3D.map.initialViewProperties;\n // go to initial viewpoint\n view3D.goTo(viewpoint).then(() => {\n // once finished, zoom out to intial zoom\n view3D.goTo({ zoom: 14 });\n });\n }\n };\n\n const setDetailedTrue = () => setDetailed(true);\n const setDetailedFalse = () => setDetailed(false);\n\n return (\n
\n \n \n \n\n \n \n \n \n \n \n \n \n\n \n {detailed && (\n
\n
YOUR LOCATION
\n
DEFAULT VIEW
\n
PAN
\n
ROTATE
\n
COMPASS
\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 MapControls;\n","import { useEffect, useState, useRef } from 'react';\nimport { useSelector } from 'react-redux';\nimport SplitPane from 'react-split-pane';\nimport shortid from 'shortid';\nimport Search from './shared/Search';\nimport MapControls from './map/controls/MapControls';\nimport mapController from '../controllers/MapController';\nimport { activeToolState, view3DState } from '../../store/slices/appSlice';\nimport { selectedMeasurementUnitState } from '../../store/slices/measurementSlice';\nimport '../../css/components/_map.scss';\n\nconst MapView = () => {\n const [splitPercentage, setSplitPercentage] = useState('');\n const [showNoResults, setShowNoResults] = useState(false);\n const selectedMeasurementUnit = useSelector(selectedMeasurementUnitState);\n const view3D = useSelector(view3DState);\n const activeTool = useSelector(activeToolState);\n\n const compareToolActive = activeTool === 'compare';\n\n const compareViewRef = useRef(null);\n const mapViewRef = useRef(null);\n\n const initialize = async () => {\n await mapController.initialize(mapViewRef, compareViewRef);\n };\n\n const cleanup = () => {\n mapViewRef.current = null;\n compareViewRef.current = null;\n };\n\n useEffect(() => {\n (async () => await initialize())();\n return cleanup;\n }, []);\n\n useEffect(() => {\n mapController.updateMeasurementUnit(selectedMeasurementUnit);\n }, [selectedMeasurementUnit]);\n\n const searchSelectResult = (response) => {\n const { geometry } = response.result.feature;\n view3D.goTo({ target: geometry, zoom: 18 }).then(() => {\n mapClick({ mapPoint: geometry });\n });\n };\n\n const searchComplete = (response) => {\n const { numResults } = response;\n\n if (!numResults) {\n setShowNoResults(false);\n }\n };\n\n const mapClick = async (event) => {\n await mapController.mapClick(event);\n };\n\n return (\n
\n {view3D && view3D.ready && (\n \n )}\n\n {\n // no results modal\n showNoResults && (\n
\n
\n
No Results
\n
setShowNoResults(false)} />\n
\n
\n )\n }\n\n \n\n setSplitPercentage(size)}\n size={compareToolActive ? splitPercentage || '50%' : '100%'}\n resizerStyle={compareToolActive ? { width: '5px' } : { width: '0px' }}\n >\n
\n
\n

Before

\n
\n
\n
\n\n
\n
\n

After

\n
\n
\n
\n \n
\n );\n};\n\nexport default MapView;\n","import Tooltip from '@material-ui/core/Tooltip';\nimport { withStyles } from '@material-ui/core/styles';\n\nconst StyledTooltip = withStyles(() => ({\n tooltip: {\n backgroundColor: '#202432',\n color: 'white',\n maxWidth: 220,\n fontSize: 15,\n position: 'relative',\n right: '5px',\n },\n arrow: {\n color: '#202432',\n margin: '50px',\n },\n}))(Tooltip);\n\nexport default StyledTooltip;\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Tab, Tabs } from '@material-ui/core';\nimport UploadIcon from '@material-ui/icons/CloudUpload';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport ListIcon from '@material-ui/icons/List';\nimport LightIcon from '@material-ui/icons/BrightnessMedium';\nimport CompareIcon from '@material-ui/icons/StarHalf';\nimport LineOfSightIcon from '@material-ui/icons/LinearScale';\nimport SketchIcon from '@material-ui/icons/Create';\nimport ReportIcon from '@material-ui/icons/GetApp';\nimport HelpIcon from '@material-ui/icons/Help';\nimport MeasurementIcon from '@material-ui/icons/SquareFoot';\nimport StyledTooltip from '../shared/StyledTooltip';\nimport {\n ActiveTool,\n activeToolState,\n currentBuildingState,\n setActiveTool,\n setSiteExpanded,\n siteExpandedState,\n} from '../../../store/slices/appSlice';\nimport {\n resetSubmitWorkflow,\n selectedFileState,\n setStep,\n uploadedFilesState,\n uploadingState,\n} from '../../../store/slices/uploadSlice';\nimport { selectedSketchState, sketchesState } from '../../../store/slices/sketchSlice';\nimport sketchController from '../../controllers/SketchController';\nimport './SiteControls.scss';\n\ninterface ITab {\n tool: ActiveTool;\n label: string;\n visible: boolean;\n icon: JSX.Element;\n tooltip?: string;\n className?: string;\n callbackAction?: () => void;\n}\n\nconst SiteControls = () => {\n const dispatch = useDispatch();\n const activeTool = useSelector(activeToolState);\n const uploadedFiles = useSelector(uploadedFilesState);\n const sketches = useSelector(sketchesState);\n const selectedSketch = useSelector(selectedSketchState);\n const currentBuilding = useSelector(currentBuildingState);\n const selectedFile = useSelector(selectedFileState);\n const uploading = useSelector(uploadingState);\n const siteExpanded = useSelector(siteExpandedState);\n const [selectedTab, setSelectedTab] = useState();\n\n const displayCompare =\n activeTool === 'compare' ||\n (activeTool === 'uploaded-files' && selectedFile?.geometry && selectedFile?.geometry?.hasOwnProperty('type')) ||\n (activeTool === 'sketch' && sketches.length) ||\n (activeTool === 'light' && (!!selectedSketch || !!selectedFile));\n const displaySubmitNewFile = activeTool !== 'submit' && activeTool !== 'default' && Object.keys(uploadedFiles).length;\n const displayDelete =\n activeTool === 'delete' ||\n (!selectedSketch && activeTool !== 'sketch' && currentBuilding && currentBuilding.hasOwnProperty('attributes'));\n const displayReport =\n ((activeTool === 'uploaded-files' || activeTool === 'light') &&\n selectedFile?.geometry &&\n selectedFile?.geometry.hasOwnProperty('type') &&\n !uploading) ||\n selectedSketch ||\n activeTool === 'shadow-report';\n\n const TABS: ITab[] = [\n {\n tool: 'submit',\n label: displaySubmitNewFile ? 'Submit New 3D File' : 'Submit 3D File',\n visible: true,\n icon: ,\n tooltip:\n 'Submit a 3D KMZ file to render on the map to visualize new buildings or features. Once uploaded, edit the position and orientation as needed.',\n callbackAction: () => dispatch(resetSubmitWorkflow()),\n },\n {\n tool: 'uploaded-files',\n label: 'Uploaded Files',\n visible: !!Object.keys(uploadedFiles).length,\n icon: ,\n callbackAction: () => dispatch(setStep(1)),\n },\n {\n tool: 'delete',\n label: 'Delete Building',\n visible: displayDelete,\n icon: ,\n },\n {\n tool: 'light',\n label: 'Light Study',\n visible: true,\n icon: ,\n tooltip:\n 'Select time of year and start time. Click start to progress through the day from selected start time to observe light and shadows for the study area. Click stop to stop cycling through times.',\n },\n {\n tool: 'compare',\n label: 'Before & After',\n visible: displayCompare,\n icon: ,\n },\n {\n tool: 'measurement',\n label: 'Measurement',\n visible: true,\n icon: ,\n },\n {\n tool: 'line-of-sight',\n label: 'Line of Sight',\n visible: true,\n icon: ,\n tooltip: 'Click a point on the map and determine what is visible from that point.',\n },\n {\n tool: 'sketch',\n label: 'Sketch',\n visible: true,\n icon: ,\n tooltip:\n 'Sketch 3D shapes directly on the map and manipulate the object’s height to reflect proposed changes to a building or feature.',\n },\n {\n tool: 'shadow-report',\n label: 'Shadow Report',\n visible: displayReport,\n icon: ,\n },\n ];\n\n useEffect(() => {\n if (activeTool === 'default') {\n setSelectedTab(undefined);\n } else if (selectedTab !== activeTool) {\n setSelectedTab(activeTool);\n }\n }, [activeTool]);\n\n useEffect(() => {\n if (activeTool !== 'sketch' && activeTool !== 'light' && activeTool !== 'shadow-report') {\n sketchController.cancelSketch();\n }\n }, [activeTool]);\n\n const handleChange = (event: React.ChangeEvent<{}>, selectedTool: ActiveTool) => {\n setSelectedTab(selectedTool);\n dispatch(setActiveTool(selectedTool));\n\n if (selectedTool === 'compare') {\n dispatch(setSiteExpanded(false));\n } else if (!siteExpanded) {\n dispatch(setSiteExpanded(true));\n }\n\n const tab = TABS.find((tab) => tab.tool === selectedTool);\n\n if (tab?.callbackAction) {\n tab.callbackAction();\n }\n };\n\n const HELP_TAB: ITab = {\n tool: 'help',\n label: 'Help',\n visible: true,\n icon: ,\n className: 'SiteControls__tab--help',\n };\n\n const currentTabs = TABS.filter((tab) => tab.visible);\n\n return (\n
\n \n
\n {currentTabs.map((tab) => (\n (tab.callbackAction ? tab.callbackAction() : undefined)}\n className={`SiteControls__tab ${tab.className ?? ''}`}\n value={tab.tool}\n label={\n \n {tab.label}\n \n }\n icon={{tab.icon}}\n />\n ))}\n\n
\n\n \n {HELP_TAB.label}\n \n }\n icon={{HELP_TAB.icon}}\n />\n \n
\n );\n};\n\nexport default SiteControls;\n","import { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport api from '../../../../utils/api';\nimport {\n setActiveTool,\n currentBuildingState,\n removedBuildingsState,\n setCurrentBuilding,\n} from '../../../../../store/slices/appSlice';\nimport mapController from '../../../../controllers/MapController';\nimport { addRemovedBuilding } from '../../../../../store/slices/appSlice';\nimport { popRemovedBuilding } from '../../../../../store/slices/appSlice';\nimport { LAYER_TITLES } from '../../../../configs/config.layerTitles';\nimport './DeleteControl.scss';\n\nconst DeleteControl = () => {\n const dispatch = useDispatch();\n const removedBuildings = useSelector(removedBuildingsState);\n const currentBuilding = useSelector(currentBuildingState);\n\n useEffect(() => {\n // Create new definition expression off of new list\n const definition = api.generateBuildingDefinitionExpression(removedBuildings);\n // Set the definition expression\n const layer = mapController.map.allLayers.items.find((l) => l.title === LAYER_TITLES.BUILDINGS);\n layer.definitionExpression = definition;\n\n if (!currentBuilding && !removedBuildings.length) {\n dispatch(setActiveTool('default'));\n }\n }, [removedBuildings]);\n\n const cancelDelete = (event) => {\n dispatch(setActiveTool('default'));\n };\n\n const removeBuilding = (event) => {\n if (currentBuilding) {\n // Push the new building to be removed to the list\n dispatch(addRemovedBuilding(currentBuilding.attributes.OBJECTID));\n\n // Clear out current building\n dispatch(setCurrentBuilding());\n mapController.highlightHandler?.remove();\n }\n };\n\n const undoRemoval = (event) => {\n event.preventDefault();\n\n if (removedBuildings.length > 0) {\n // Removed the last pushed building from array\n dispatch(popRemovedBuilding());\n\n // Clear out current building\n dispatch(setCurrentBuilding());\n }\n };\n\n // if there removedBuildings in the list, do not disable the undo function\n return (\n
\n {currentBuilding && (currentBuilding?.attributes || !removedBuildings.length) ? (\n
\n \n Delete Building\n \n\n \n
\n ) : (\n
\n

Building Deleted

\n \n
\n )}\n
\n );\n};\n\nexport default DeleteControl;\n","import { useEffect, useState } from 'react';\nimport { urls } from '../../config';\nimport { useSelector } from 'react-redux';\n\nimport { Card, CardMedia } from 'material-ui/Card';\nimport { materialStyle } from '../../../style/material';\n\nimport DeleteControl from './controls/DeleteControl/DeleteControl';\nimport { loadModules } from 'esri-loader';\nimport { activeToolState, siteState } from '../../../store/slices/appSlice';\nimport mapController from '../../controllers/MapController';\n\nconst SiteInformation = () => {\n const site = useSelector(siteState);\n const activeTool = useSelector(activeToolState);\n const [address, setAddress] = useState();\n const [zoneInfo, setZoneInfo] = useState();\n const [googleStreetViewImage, setGoogleStreetViewImage] = useState();\n\n const getAddress = () => {\n return site?.address ? site.address : `${site?.latlon[0].toFixed(3)}, ${site?.latlon[1].toFixed(3)}`;\n };\n\n useEffect(() => {\n const noCurrentSite = site?.latlon?.length === 0 ? true : false;\n const addressTemp = noCurrentSite ? '' : getAddress();\n const zoneInfoTemp = noCurrentSite ? '' : `${site?.zoneCode} ${site?.zoneDistrict}`;\n const googleStreetViewImageTemp = site?.address ? `url(${urls.googleStreetView(site?.address)})` : '';\n\n setAddress(addressTemp);\n setZoneInfo(zoneInfoTemp);\n setGoogleStreetViewImage(googleStreetViewImageTemp);\n }, [site]);\n\n if (!site) {\n return null;\n }\n\n const handleAdditionalZoning = (event) => {\n event.preventDefault();\n window.open(site.zoneWebUrl, '_blank');\n };\n\n const handleOfficialZoning = async (event) => {\n event.preventDefault();\n const [webMercatorUtils] = await loadModules(['esri/geometry/support/webMercatorUtils']);\n\n const view3D = mapController.view3D;\n const [x, y] = webMercatorUtils.lngLatToXY(site.latlon[1], site.latlon[0]);\n const zoom = Math.round(view3D.zoom) > 18 ? 18 : Math.round(view3D.zoom);\n const url = urls.zr16(x, y, zoom);\n window.open(url, '_blank');\n };\n\n const getZoomLevel = () => {\n return mapController.view3D.zoom;\n };\n\n const openGoogleMaps = () => {\n if (Array.isArray(site.latlon) && site.latlon.length === 2) {\n // add 2 to zoom since zoom scale on google maps is larger\n const url = urls.googleMap(site.latlon, getZoomLevel() + 2);\n window.open(url, '_blank');\n }\n };\n\n return (\n
\n \n \n \n \n
\n {address}\n
\n {zoneInfo}\n \n \n {activeTool === 'delete' ? (\n \n ) : (\n
\n Additional Resources:\n \n Zoning Information\n \n \n Official Zoning Map\n \n
\n )}\n \n
\n );\n};\n\nexport default SiteInformation;\n","import React from 'react';\nimport './Button.scss';\n\nconst Button = React.forwardRef(function Button(props, ref) {\n return (\n \n {props.icon &&
{props.icon}
}\n {props.label && `${props.label}`}\n \n );\n});\n\nexport default Button;\n","import shortid from 'shortid';\nimport { useSelector, useDispatch } from 'react-redux';\n\nimport HelpIcon from 'material-ui/svg-icons/action/help';\nimport InfoIcon from 'material-ui/svg-icons/action/info';\nimport Keyboard from 'material-ui/svg-icons/hardware/keyboard';\nimport Comment from 'material-ui/svg-icons/communication/chat-bubble';\nimport Folder from 'material-ui/svg-icons/file/folder-open';\nimport TutorialIcon from '@material-ui/icons/MenuBook';\nimport { red500, fullWhite } from 'material-ui/styles/colors';\nimport Button from '../../shared/Button';\nimport {\n enableHelpState,\n setEnableHelp,\n setDisplayNavigation,\n setDisplayDisclaimer,\n} from '../../../../store/slices/appSlice';\nimport './HelpControl.scss';\n\nconst helpOptions = [\n {\n id: 'keyboard-shortcuts',\n label: 'Navigation',\n icon: ,\n },\n {\n id: 'tutorials',\n label: 'Tutorials',\n icon: ,\n },\n {\n id: 'about',\n label: 'About DCOZ',\n icon: ,\n },\n {\n id: 'disclaimer',\n label: 'Disclaimer',\n icon: ,\n },\n {\n id: 'feedback',\n label: 'Feedback',\n icon: ,\n },\n];\n\nconst HelpControl = () => {\n const dispatch = useDispatch();\n const enableHelp = useSelector(enableHelpState);\n\n const handleHelpOption = (event) => {\n const { id } = event.currentTarget;\n switch (id) {\n case 'interactive-help':\n dispatch(setEnableHelp(!enableHelp));\n break;\n case 'keyboard-shortcuts':\n dispatch(setDisplayNavigation(true));\n break;\n case 'about':\n window.open('http://maps.dcoz.dc.gov', '_blank');\n break;\n case 'disclaimer':\n dispatch(setDisplayDisclaimer(true));\n break;\n case 'feedback':\n window.open('https://app.dcoz.dc.gov/Contact/Home.aspx', '_blank');\n break;\n case 'tutorials':\n window.open('https://maps.dcoz.dc.gov/?page=3D-Zoning-Map-Tutorial', '_blank');\n break;\n default:\n break;\n }\n };\n\n const helpStyle = enableHelp ? red500 : fullWhite;\n\n return (\n
\n }\n className='HelpControl-item__button'\n onClick={handleHelpOption}\n />\n {helpOptions.map((option) => (\n \n ))}\n
\n );\n};\n\nexport default HelpControl;\n","import React from 'react';\n\nexport default function Stepper(props) {\n const { step } = props;\n return (\n
\n

Submit a File

\n\n
\n
0 ? 'completed-step' : ''}`}>\n
\n
\n
\n
Upload
\n
\n
\n\n
\n
\n
0 ? 'active' : ''}`}>
\n
\n\n
1 ? 'completed-step' : ''}`}>\n
\n
\n
\n
Edit
\n
\n
\n\n
\n
\n
1 ? 'active' : ''}`}>
\n
\n\n
2 ? 'completed-step' : ''}`}>\n
\n
\n
\n
Finish
\n
\n
\n
\n
\n );\n}\n","import * as React from 'react';\n\nconst FileIcon = (props) => (\n \n \n \n \n);\n\nexport default FileIcon;\n","const KmzFileIcon = (props) => (\n \n \n \n \n);\n\nexport default KmzFileIcon;\n","const SlpkFileIcon = (props) => (\n \n \n \n \n);\n\nexport default SlpkFileIcon;\n","import FileIcon from '../components/shared/icons/FileIcon';\nimport KmzFileIcon from '../components/shared/icons/KmzFileIcon';\nimport SlpkFileIcon from '../components/shared/icons/SlpkFileIcon';\n\nexport const getFileType = (file: File) => {\n return file.name.split('.')[file.name.split('.').length - 1];\n};\n\nexport const getFileIcon = (file: File) => {\n const type = getFileType(file);\n\n switch (type) {\n case 'kmz':\n return ;\n case 'slpk':\n return ;\n default:\n return ;\n }\n};\n","import LinearProgress from 'material-ui/LinearProgress';\nimport { useSelector } from 'react-redux';\nimport { selectedFileIdState, uploadedFilesState } from '../../../store/slices/uploadSlice';\nimport { getFileIcon } from '../../utils/file.utils';\n\nconst LinearProgressBar = (props) => {\n const { value, mode, min, max, message, file } = props;\n const messageFormatted = message.replace('informative -', '').replace('UPDATE:', '');\n const uploadedFiles = useSelector(uploadedFilesState);\n const selectedFileId = useSelector(selectedFileIdState);\n const selectedFile = uploadedFiles[selectedFileId];\n\n return (\n
\n {(file || selectedFile?.file) && getFileIcon(file ?? selectedFile.file)}\n

\n {messageFormatted && messageFormatted.length ? messageFormatted : 'Uploading...'}\n

\n \n
\n );\n};\n\nexport default LinearProgressBar;\n","import { useSelector, useDispatch } from 'react-redux';\nimport api from '../../../../utils/api';\nimport mapController from '../../../../controllers/MapController';\nimport { selectedFileIdState, setSelectedFileId, uploadedFilesState } from '../../../../../store/slices/uploadSlice';\nimport { view3DState } from '../../../../../store/slices/appSlice';\nimport { getFileIcon } from '../../../../utils/file.utils';\n\nconst FileCard = ({ hasFinishedUploading, itemId, location, file, showEditSearch, toggleShowEditSearch }) => {\n const dispatch = useDispatch();\n const uploadedFiles = useSelector(uploadedFilesState);\n const selectedFileId = useSelector(selectedFileIdState);\n const currentFile = uploadedFiles[itemId];\n const view3D = useSelector(view3DState);\n\n const handleClick = (e) => {\n if (currentFile) {\n const geometry = currentFile.geometry;\n\n if (geometry) {\n view3D.goTo({ target: geometry, tilt: 45 });\n if (itemId !== selectedFileId) {\n mapController.highlightHandler?.remove();\n if (showEditSearch) {\n toggleShowEditSearch();\n }\n }\n } else {\n const sceneLayerId = currentFile.sceneLayerId;\n const selectedFileSceneLayer = mapController.map.findLayerById(sceneLayerId);\n\n if (selectedFileSceneLayer && selectedFileSceneLayer.fullExtent) {\n view3D.goTo({ target: selectedFileSceneLayer.fullExtent, tilt: 45 });\n }\n }\n\n dispatch(setSelectedFileId(itemId));\n }\n };\n\n const handleToggleShowEditSearch = (e) => {\n e.stopPropagation();\n toggleShowEditSearch();\n };\n\n const isSelectedFile = selectedFileId && selectedFileId === itemId;\n\n return !file ? null : (\n \n
\n {file && getFileIcon(file)}\n
\n
{file.name || 'Undefined'}
\n
{api.bytesToSize(file.size)}
\n
\n
\n\n
\n\n
\n
\n
Location:
\n {location?.hasOwnProperty('FULLADDRESS') && isSelectedFile && (\n
\n Edit\n
\n )}\n
\n

\n {location?.hasOwnProperty('FULLADDRESS') ? location.FULLADDRESS : 'No location attached to the file'}\n

\n
\n
\n );\n};\n\nexport default FileCard;\n","import React from 'react';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport IconButton from '@material-ui/core/IconButton';\nimport CloseIcon from '@material-ui/icons/Close';\n\nconst DynamicModal = ({ children, id, title, open, handleClose }) => {\n return (\n \n
\n {title && {title}}\n \n \n \n \n \n
\n\n \n {children}\n \n
\n );\n};\n\nexport default DynamicModal;\n","import { useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { errorState } from '../../../../../store/slices/uploadSlice';\nimport DynamicModal from '../../../modals/DynamicModal';\nimport Button from '../../../shared/Button';\n\nconst ErrorMessagesDetailsButton = () => {\n const error = useSelector(errorState);\n const [modalOpen, setModalOpen] = useState(false);\n\n const handleCloseModal = () => setModalOpen(false);\n const handleOpenModal = () => setModalOpen(true);\n\n return error?.errorMessages?.length ? (\n <>\n
\n
\n ) : (\n \n );\n};\n\nexport default EditPosition;\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { loadModules } from 'esri-loader';\nimport shortid from 'shortid';\nimport LocationOnIcon from '@material-ui/icons/LocationOn';\nimport Search from '../../../../shared/Search';\nimport GenericSearchConfig from '../../../../../configs/config.search';\nimport {\n IBuildingLocation,\n Position,\n setIsSelectLocationOnMapActive,\n isSelectLocationOnMapActiveState,\n selectedFileIdState,\n uploadedFilesState,\n} from '../../../../../../store/slices/uploadSlice';\nimport { setSite, siteState } from '../../../../../../store/slices/appSlice';\nimport mapController from '../../../../../controllers/MapController';\nimport { getXYDistanceBetweenPoints, INITIAL_EDIT_POSITION } from '../../../../../utils/geometry.utils';\nimport { editBuildingLocation } from '../../../../../utils/gpEditBuildingLocation.utills';\nimport './EditPositionByAddress.scss';\n\nconst EditPositionByAddress = () => {\n const dispatch = useDispatch();\n const uploadedFiles = useSelector(uploadedFilesState);\n const selectedFileId = useSelector(selectedFileIdState);\n const [noResults, setNoResults] = useState(false);\n const [tempPosition, setTempPosition] = useState();\n const [tempLocation, setTempLocation] = useState();\n const selectedFile = selectedFileId ? uploadedFiles[selectedFileId] : undefined;\n const isSelectLocationOnMapActive = useSelector(isSelectLocationOnMapActiveState);\n const site = useSelector(siteState);\n\n useEffect(() => {\n dispatch(setSite(undefined));\n }, []);\n\n useEffect(() => {\n if (selectedFile) {\n if (tempPosition) {\n mapController.replaceSelectedFileFootprintGraphic(tempPosition);\n } else {\n mapController.replaceSelectedFileFootprintGraphic(INITIAL_EDIT_POSITION);\n }\n }\n }, [selectedFile, tempPosition]);\n\n useEffect(() => {\n if (!tempPosition) {\n // map controller: enable map click\n dispatch(setIsSelectLocationOnMapActive(true));\n mapController.view3D.surface.style.cursor = 'crosshair';\n } else {\n // map controller: disable map click\n dispatch(setIsSelectLocationOnMapActive(false));\n mapController.view3D.surface.style.cursor = '';\n }\n\n return () => {\n // map controller: disable map click\n dispatch(setIsSelectLocationOnMapActive(false));\n mapController.view3D.surface.style.cursor = '';\n };\n }, [tempPosition]);\n\n useEffect(() => {\n if (isSelectLocationOnMapActive && site) {\n const { address, latlon } = site;\n const [LATITUDE, LONGITUDE] = latlon;\n\n const newLocation = {\n FULLADDRESS: address,\n LATITUDE,\n LONGITUDE,\n };\n\n handleNewLocation(newLocation);\n }\n }, [site]);\n\n const confirmNewPosition = () => {\n if (selectedFile?.geometry && tempPosition) {\n editBuildingLocation(tempPosition);\n }\n };\n\n const cancelNewPosition = () => {\n setTempPosition(undefined);\n setTempLocation(undefined);\n };\n\n const handleNewLocation = async (newLocation: IBuildingLocation) => {\n if (selectedFileId) {\n const selectedFile = uploadedFiles[selectedFileId];\n if (selectedFile?.location && selectedFile?.position) {\n const [Point] = (await loadModules(['esri/geometry/Point'])) as [typeof __esri.Point];\n\n const prevLocation = selectedFile?.location;\n\n if (newLocation && prevLocation) {\n const newLocationPoint = new Point({\n latitude: newLocation.LATITUDE,\n longitude: newLocation.LONGITUDE,\n });\n\n const prevLocationPoint = new Point({\n latitude: prevLocation.LATITUDE,\n longitude: prevLocation.LONGITUDE,\n });\n\n const xyDistance = await getXYDistanceBetweenPoints(prevLocationPoint, newLocationPoint);\n const newPosition = { x: xyDistance.x, y: xyDistance.y, z: selectedFile.position.z };\n\n setTempPosition(newPosition);\n setTempLocation(newLocation);\n }\n }\n }\n };\n\n const selectResult = async (response: any) => {\n const { feature } = response.result;\n const FULLADDRESS = feature.attributes.Match_addr;\n const { latitude: LATITUDE, longitude: LONGITUDE } = feature.geometry;\n\n const newLocation = {\n FULLADDRESS,\n LATITUDE,\n LONGITUDE,\n };\n\n handleNewLocation(newLocation);\n };\n\n const searchComplete = (response: any) => {\n const { numResults } = response;\n setNoResults(!numResults);\n };\n\n return (\n
\n {tempPosition ? (\n
\n

Confirm new position?

\n

\n {tempLocation?.FULLADDRESS}\n

\n\n \n Confirm\n \n \n Cancel\n \n
\n ) : (\n <>\n

\n Where would you like to place your 3D building file?\n

\n \n
\n \n

or select a location on the map

\n
\n \n )}\n
\n );\n};\n\nexport default EditPositionByAddress;\n","import { useSelector, useDispatch } from 'react-redux';\nimport Button from '../../../shared/Button';\nimport EditPosition from './EditPosition';\nimport {\n errorState,\n resetSubmitWorkflow,\n selectedFileIdState,\n uploadedFilesState,\n uploadingState,\n} from '../../../../../store/slices/uploadSlice';\nimport { activeToolState } from '../../../../../store/slices/appSlice';\nimport EditPositionByAddress from './EditPositionByAddress/EditPositionByAddress';\n\nconst EditActions = ({ showEditSearch, showEditPosition }) => {\n const dispatch = useDispatch();\n const uploading = useSelector(uploadingState);\n const error = useSelector(errorState);\n const activeTool = useSelector(activeToolState);\n const uploadedFiles = useSelector(uploadedFilesState);\n const selectedFileId = useSelector(selectedFileIdState);\n const selectedFile = selectedFileId ? uploadedFiles[selectedFileId] : undefined;\n\n const reset = () => {\n dispatch(resetSubmitWorkflow());\n };\n\n const renderEditActions = () => {\n if (uploading) {\n return null;\n } else if (error) {\n return
\n );\n }\n return jsx;\n };\n\n return
{renderUploadView()}
;\n};\n\nexport default UploadView;\n","import { useSelector, useDispatch } from 'react-redux';\nimport { useRef } from 'react';\nimport {\n errorState,\n resetSubmitWorkflow,\n selectedFileIdState,\n uploadedFilesState,\n uploadingState,\n} from '../../../../../store/slices/uploadSlice';\nimport { kmzToMultipatch } from '../../../../utils/gpUpload.utils';\n\nconst UploadActions = (props) => {\n const dispatch = useDispatch();\n const uploading = useSelector(uploadingState);\n const selectedFileId = useSelector(selectedFileIdState);\n const uploadedFiles = useSelector(uploadedFilesState);\n const selectedFile = uploadedFiles[selectedFileId];\n const error = useSelector(errorState);\n const inputRef = useRef();\n\n const handleInput = (event) => {\n if (event.currentTarget.files.length) {\n const [file] = event.currentTarget.files;\n props.handleUpload(file);\n }\n };\n\n const handleNextClick = () => {\n kmzToMultipatch();\n };\n\n const reset = () => {\n dispatch(resetSubmitWorkflow());\n };\n\n const renderUploadActions = () => {\n let jsx;\n\n if (uploading) {\n jsx = null;\n } else {\n // const existingFile = file && file instanceof File;\n const existingFile = selectedFile?.file && selectedFile?.file instanceof File;\n jsx = error ? (\n \n ) : (\n
\n {existingFile && (\n \n )}\n\n \n\n {existingFile &&
Maximum file size is 15MB
}\n
\n );\n }\n return jsx;\n };\n\n return
{renderUploadActions()}
;\n};\n\nexport default UploadActions;\n","import { useState } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { gp as gpConfig } from '../../../../config';\nimport api from '../../../../utils/api';\nimport UploadView from './UploadView';\nimport UploadActions from './UploadActions';\nimport { errorState, setError, setUploading, uploadingState } from '../../../../../store/slices/uploadSlice';\n\n// import EsriRequest from 'esri/request';\nimport { loadModules } from 'esri-loader';\nimport { removedBuildingsState, setRemovedBuildings, view3DState } from '../../../../../store/slices/appSlice';\nimport { LAYER_TITLES } from '../../../../configs/config.layerTitles';\nimport { handleError, publishSLPK, reverseGeocodeKMZ } from '../../../../utils/gpUpload.utils';\nimport { getFileType } from '../../../../utils/file.utils';\n\nconst Upload = () => {\n const dispatch = useDispatch();\n const [message, setMessage] = useState('');\n\n const removedBuildings = useSelector(removedBuildingsState);\n const view3D = useSelector(view3DState);\n const error = useSelector(errorState);\n const uploading = useSelector(uploadingState);\n const [currentFile, setCurrentFile] = useState();\n\n const uploadFile = (file) => {\n const fileSize = api.bytesToSize(file.size);\n const valid = validateSize(fileSize);\n if (valid) {\n // ga('send', 'event', '3D Map Events', 'Upload File', 'Upload File');\n const type = getFileType(file);\n dispatch(setError(false));\n setCurrentFile(file);\n\n switch (type) {\n case 'kmz':\n return kmzUpload(file);\n case 'csv':\n return csvUpload(file);\n case 'slpk':\n return slpkUpload(file);\n default:\n return;\n }\n } else {\n setCurrentFile();\n }\n };\n\n const kmzUpload = async (file) => {\n const fd = new FormData();\n fd.append('file', file);\n fd.append('description', '');\n fd.append('f', 'pjson');\n\n try {\n dispatch(setUploading(true));\n const [esriRequest] = await loadModules(['esri/request']);\n const response = await esriRequest(gpConfig.upload, { body: fd });\n\n if (response.data.success) {\n await reverseGeocodeKMZ(response.data.item.itemID, file);\n }\n } catch (error) {\n handleError(error, 'kmzUpload');\n } finally {\n dispatch(setUploading(false));\n }\n };\n\n const csvUpload = (file) => {\n const reader = FileReader();\n reader.onload = (event) => {\n const objectIds = event.currentTarget.result.split(',').map((objectid) => parseInt(objectid));\n // evaluate against already removed buildings\n let i = objectIds.length;\n while (i--) {\n if (removedBuildings.includes(objectIds[i])) {\n objectIds.splice(i, 1);\n }\n }\n const removedBuildingsList = removedBuildings;\n removedBuildingsList.push(...objectIds);\n dispatch(setRemovedBuildings(removedBuildingsList));\n const definition = api.generateBuildingDefinitionExpression(removedBuildings);\n const layer = view3D.map.allLayers.items.find((l) => l.title === LAYER_TITLES.BUILDINGS);\n layer.definitionExpression = definition;\n };\n reader.readAsText(file);\n };\n\n const slpkUpload = async (file) => {\n const formData = new FormData();\n formData.append('file', file);\n formData.append('description', '');\n formData.append('f', 'pjson');\n\n try {\n dispatch(setUploading(true));\n const [esriRequest] = await loadModules(['esri/request']);\n const response = await esriRequest(gpConfig.upload, { body: formData });\n\n if (response.data.success) {\n await publishSLPK(response.data.item.itemID, file);\n }\n } catch (error) {\n handleError(error, 'slpkUpload');\n } finally {\n dispatch(setUploading(false));\n }\n };\n\n const validateSize = (sizeString) => {\n const [number, unit] = sizeString.split(' ');\n switch (unit) {\n case 'TB':\n case 'GB':\n dispatch(setError({ message: 'File size is too large.' }));\n return false;\n case 'MB': {\n const value = parseFloat(number);\n if (value >= 15) {\n dispatch(setError({ message: 'File size is too large.' }));\n return false;\n } else {\n return true;\n }\n }\n default:\n return true;\n }\n };\n\n return (\n
\n \n\n {!uploading && !error &&
or
}\n\n {!uploading && }\n
\n );\n};\n\nexport default Upload;\n","import { useSelector, useDispatch } from 'react-redux';\nimport { saveAs } from 'file-saver';\nimport Button from '../../../shared/Button';\nimport '../../../../../css/components/Export.scss';\nimport { decrementStep, resetSubmitWorkflow, selectedFileIdState, slpkState, uploadedFilesState } from '../../../../../store/slices/uploadSlice';\nimport { removedBuildingsState, setActiveTool } from '../../../../../store/slices/appSlice';\n\nconst Export = () => {\n const uploadedFiles = useSelector(uploadedFilesState);\n const selectedFileId = useSelector(selectedFileIdState);\n const selectedFile = uploadedFiles[selectedFileId];\n const dispatch = useDispatch();\n const removedBuildings = useSelector(removedBuildingsState);\n\n const exportSLPK = () => {\n if (selectedFile?.slpk) {\n // save scene layer package as well as csv of removed buildings\n window.open(selectedFile?.slpk, '_blank');\n // saveAs(new Blob([removedBuildings.join(',')], { type: 'text/csv;charset=utf-8' }), 'buildings.csv');\n }\n };\n\n const resetSubmit = () => {\n dispatch(setActiveTool('submit'));\n dispatch(resetSubmitWorkflow());\n };\n\n const continueEditing = () => dispatch(decrementStep());\n\n return (\n
\n
\n );\n};\n\nexport default Export;\n","import { useSelector } from 'react-redux';\nimport Stepper from '../shared/Stepper';\nimport Edit from '../site/controls/submitparts/Edit';\nimport Upload from '../site/controls/submitparts/Upload';\nimport Export from '../site/controls/submitparts/Export';\nimport { stepState } from '../../../store/slices/uploadSlice';\nimport '../../../css/components/_submit.scss';\n\nconst Submit = () => {\n const step = useSelector(stepState);\n\n const renderCurrentStep = (step) => {\n switch (step) {\n case 0:\n return ;\n case 1:\n return ;\n case 2:\n return ;\n default:\n return;\n }\n };\n\n return (\n
\n \n
{renderCurrentStep(step)}
\n
\n );\n};\n\nexport default Submit;\n","import moment from 'moment';\n\nconst seasonToEquinox = (season) => {\n const year = new Date().getFullYear();\n switch (season) {\n case 'Spring':\n return moment().year(year).month('March').date(20);\n case 'Summer':\n return moment().year(year).month('June').date(21);\n case 'Fall':\n return moment().year(year).month('September').date(22);\n case 'Winter':\n return moment().year(year).month('December').date(21);\n default:\n return moment();\n }\n};\n\nconst getTime = (hour, minute, period) => {\n const trueHour = period === 'PM' ? Number(hour) + 12 : Number(hour);\n return moment().hour(trueHour).minute(Number(minute));\n};\n\nconst getDate = (season, hour, minute, period) => {\n const seasonDate = seasonToEquinox(season);\n const time = getTime(hour, minute, period);\n return seasonDate.hour(time.hour()).minute(time.minute());\n};\n\nconst getSeason = (date = new Date()) => {\n const month = date.getMonth();\n const day = date.getDate();\n\n // Dec 21 - Mar 19\n const isWinter = month < 2 || (month === 2 && day < 20) || (month === 11 && day >= 21);\n\n // Mar 20 - Jun 20\n const isSpring = (month > 2 && month < 5) || (month === 2 && day >= 20) || (month === 5 && day < 21);\n\n // Jun 21 - Sep 21\n const isSummer = (month > 5 && month < 8) || (month === 5 && day >= 21) || (month === 8 && day < 22);\n\n // Sep 21 - Dec 20\n const isFall = (month > 8 && month < 11) || (month === 8 && day >= 22) || (month === 11 && day < 21);\n\n if (isWinter) {\n return 'Winter';\n } else if (isSpring) {\n return 'Spring';\n } else if (isSummer) {\n return 'Summer';\n } else if (isFall) {\n return 'Fall';\n }\n};\n\nconst formatDate = (date) => {\n return moment(date).format('dddd, MMMM Do YYYY');\n};\n\nconst dateUtils = {\n seasonToEquinox,\n getTime,\n getDate,\n formatDate,\n getSeason,\n};\n\nexport default dateUtils;\n","import { useEffect, useRef, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\n//@ts-ignore\nimport MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';\n//@ts-ignore\nimport getMuiTheme from 'material-ui/styles/getMuiTheme';\n//@ts-ignore\nimport DatePicker from 'material-ui/DatePicker';\nimport Button from '@material-ui/core/Button';\nimport { IconButton } from '@material-ui/core';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { calendarTheme } from '../../../../../../style/theme';\nimport { view3DReadyState } from '../../../../../../store/slices/appSlice';\nimport DateUtil from '../../../../../utils/date';\nimport { SeasonType, selectedDateState, setSelectedDate } from '../../../../../../store/slices/lightStudySlice';\nimport dateUtils from '../../../../../utils/date';\nimport { selectedFileIdState } from '../../../../../../store/slices/uploadSlice';\nimport { selectedSketchState } from '../../../../../../store/slices/sketchSlice';\nimport './LightStudyDateSection.scss';\n\n// To have black text on date/time pickers - must create a new theme provider which overwrites app themeprovider\nconst dateTimeTheme = getMuiTheme({ ...calendarTheme });\n\nconst LightStudyDateSection = () => {\n const datePickerRef = useRef();\n const dispatch = useDispatch();\n const view3DReady = useSelector(view3DReadyState);\n const selectedDate = useSelector(selectedDateState);\n const selectedFileId = useSelector(selectedFileIdState);\n const selectedSketch = useSelector(selectedSketchState);\n const [season, setSeason] = useState(DateUtil.getSeason(selectedDate));\n const smallButtons = selectedFileId || selectedSketch;\n\n useEffect(() => {\n if (selectedDate) {\n setSeason(DateUtil.getSeason(selectedDate));\n }\n }, [selectedDate]);\n\n const openDatePicker = () => {\n datePickerRef.current?.openDialog();\n };\n\n const changeSeason = (e: React.MouseEvent) => {\n const selectedSeason = e.currentTarget.id;\n\n const date = dateUtils.getDate(selectedSeason, selectedDate.getHours()).toDate();\n dispatch(setSelectedDate(date));\n };\n\n const datePickerChange = (event: any, date: any) => {\n if (view3DReady) {\n const updatedDate = date;\n\n // Passing over hours, minutes, and seconds from previous time\n updatedDate.setHours(selectedDate.getHours(), selectedDate.getMinutes(), selectedDate.getSeconds());\n dispatch(setSelectedDate(updatedDate));\n }\n };\n\n return (\n <>\n \n \n \n
\n
\n

\n {DateUtil.formatDate(selectedDate)}\n

\n\n \n \n \n {/* */}\n
\n\n
\n

Select time of year

\n
\n \n Spring\n \n \n Summer\n \n \n Fall\n \n \n Winter\n \n
\n
\n
\n \n );\n};\n\nexport default LightStudyDateSection;\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport moment from 'moment';\nimport { selectedDateState, setSelectedDate } from '../../../../../../store/slices/lightStudySlice';\nimport NumberCounter from '../../../../shared/NumberCounter';\nimport './LightStudyTimeSelection.scss';\n\nconst LightStudyTimeSelection = () => {\n const dispatch = useDispatch();\n const selectedDate = useSelector(selectedDateState);\n\n const [hours, setHours] = useState(selectedDate.getHours());\n const [minutes, setMinutes] = useState(selectedDate.getMinutes());\n\n useEffect(() => {\n if (hours !== selectedDate.getHours()) {\n setHours(selectedDate.getHours());\n }\n\n if (minutes !== selectedDate.getMinutes()) {\n setMinutes(selectedDate.getMinutes());\n }\n }, [selectedDate]);\n\n const updateStates = (date: Date) => {\n setHours(date.getHours());\n setMinutes(date.getMinutes());\n dispatch(setSelectedDate(date));\n };\n\n const onHourIncrement = () => {\n const currentDate = moment(selectedDate);\n let updatedDate = moment(selectedDate).add(1, 'hours');\n\n if (updatedDate.date() !== currentDate.date()) {\n updatedDate.subtract(1, 'days');\n }\n\n updateStates(updatedDate.toDate());\n };\n\n const onHourDecrement = () => {\n const currentDate = moment(selectedDate);\n let updatedDate = moment(selectedDate).subtract(1, 'hours');\n\n if (updatedDate.date() !== currentDate.date()) {\n updatedDate.add(1, 'days');\n }\n\n updateStates(updatedDate.toDate());\n };\n\n const onHourInputChange = (e: React.ChangeEvent) => {\n const value = e.target.value;\n const number = Number(value);\n if (number >= 0 && number <= 12) {\n let updatedDate;\n\n if (hours < 12) {\n updatedDate = moment(selectedDate).hours(number);\n } else {\n updatedDate = moment(selectedDate).hours(number + 12);\n }\n\n updateStates(updatedDate.toDate());\n }\n };\n\n const onMinuteIncrement = () => {\n const currentDate = moment(selectedDate);\n let updatedDate = moment(selectedDate).add(1, 'minutes');\n\n if (updatedDate.date() !== currentDate.date()) {\n updatedDate.subtract(1, 'days');\n }\n\n updateStates(updatedDate.toDate());\n };\n\n const onMinuteDecrement = () => {};\n\n const onMinuteInputChange = (e: React.ChangeEvent) => {\n const value = e.target.value;\n const number = Number(value);\n \n if (number >= 0 && number <= 59) {\n let updatedDate = moment(selectedDate).minutes(number);\n updateStates(updatedDate.toDate());\n }\n };\n\n const changePeriod = () => {\n let updatedHour;\n\n if (hours >= 12) {\n updatedHour = hours - 12;\n } else {\n updatedHour = (hours + 12) % 24;\n }\n\n let updatedDate = moment(selectedDate).hour(updatedHour);\n updateStates(updatedDate.toDate());\n };\n\n const getFormattedHoursAMPM = (hours: number) => (hours % 12 ? hours % 12 : 12);\n\n return (\n
\n

Select time of day

\n
\n \n \n
\n {/* {hours < 12 ? 'AM' : 'PM'} */}\n \n AM\n \n = 12 ? 'active' : ''}`}\n onClick={changePeriod}\n >\n PM\n \n
\n
\n
\n );\n};\n\nexport default LightStudyTimeSelection;\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport PlayArrowIcon from '@material-ui/icons/PlayArrowRounded';\nimport ShadowCastIcon from '@material-ui/icons/BrightnessMedium';\nimport StopIcon from '@material-ui/icons/StopRounded';\nimport Button from '@material-ui/core/Button';\nimport {\n isLightStudyActiveState,\n selectedDateState,\n setIsLightStudyActive,\n setIsShadowCastActive,\n setSelectedDate,\n} from '../../../../../../store/slices/lightStudySlice';\nimport './LightStudyAction.scss';\n\nconst LightStudyAction = () => {\n const dispatch = useDispatch();\n const selectedDate = useSelector(selectedDateState);\n const isLightStudyActive = useSelector(isLightStudyActiveState);\n const [lightStudyInterval, setLightStudyInterval] = useState(undefined);\n const INTERVAL_TIME = 500;\n\n useEffect(() => {\n return () => {\n if (lightStudyInterval) {\n stopLightStudy();\n }\n };\n }, [lightStudyInterval]);\n\n const startLightStudy = () => {\n let updatedDate = new Date(selectedDate);\n\n const interval = window.setInterval(() => {\n updatedDate = new Date(updatedDate);\n\n // increase the time by 30 minutes\n updatedDate.setMinutes(updatedDate.getMinutes() + 30);\n dispatch(setSelectedDate(updatedDate));\n }, INTERVAL_TIME);\n\n setLightStudyInterval(interval);\n dispatch(setIsLightStudyActive(true));\n };\n\n const stopLightStudy = () => {\n clearInterval(lightStudyInterval);\n setLightStudyInterval(undefined);\n dispatch(setIsLightStudyActive(false));\n };\n\n const startShadowCast = () => {\n dispatch(setIsShadowCastActive(true));\n };\n\n return (\n
\n {isLightStudyActive ? (\n }\n onClick={stopLightStudy}\n >\n Stop Light Study\n \n ) : (\n }\n onClick={startLightStudy}\n >\n Start Light Study\n \n )}\n\n }\n onClick={startShadowCast}\n >\n Shadow Cast\n \n
\n );\n};\n\nexport default LightStudyAction;\n","import { ChangeEvent, useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { FormControlLabel, Switch, Tooltip } from '@material-ui/core';\nimport ColorPicker from 'material-ui-color-picker';\nimport {\n displayShadowHighlightedState,\n highlightColorState,\n setDisplayShadowHighlighted,\n setHighlightColor,\n view3DState,\n} from '../../../../../../store/slices/appSlice';\nimport { selectedSketchState } from '../../../../../../store/slices/sketchSlice';\nimport { selectedFileIdState, selectedFileState } from '../../../../../../store/slices/uploadSlice';\nimport mapController from '../../../../../controllers/MapController';\nimport sketchController from '../../../../../controllers/SketchController';\nimport './LightStudyShadowControls.scss';\n\nconst LightStudyShadowControls = () => {\n const dispatch = useDispatch();\n const view3D = useSelector(view3DState);\n const selectedFileId = useSelector(selectedFileIdState);\n const selectedFile = useSelector(selectedFileState);\n const selectedSketch = useSelector(selectedSketchState);\n const displayShadowHighlighted = useSelector(displayShadowHighlightedState);\n const highlightShadowColor = useSelector(highlightColorState);\n\n const [shadowOn, setShadowOn] = useState(false);\n\n useEffect(() => {\n if (selectedFileId && view3D) {\n const selectedFileLayer = view3D?.map?.findLayerById(selectedFile?.sceneLayerId);\n if (selectedFileLayer) {\n const castShadows = selectedFileLayer?.renderer?.symbol?.symbolLayers?.getItemAt(0)?.castShadows;\n setShadowOn(castShadows);\n }\n } else if (selectedSketch) {\n const selectedSketchGraphic = sketchController.sketchGraphicsLayer?.graphics.find(\n // @ts-ignore\n (graphic) => graphic.uid === selectedSketch.uid\n );\n if (selectedSketchGraphic) {\n // @ts-ignore\n const castShadows = selectedSketchGraphic?.symbol?.symbolLayers?.getItemAt(0)?.castShadows;\n setShadowOn(castShadows);\n }\n }\n }, [selectedFileId, selectedSketch, view3D]);\n\n if (!selectedFileId && !selectedSketch) {\n return null;\n }\n\n const handleHighlightColorChange = (color: any) => {\n dispatch(setHighlightColor(color));\n mapController.setHighlightShadowColor(color);\n };\n\n const handleSelectedFileShadowToggle = (visible: boolean) => {\n mapController.setSelectedFileShadow(visible);\n setShadowOn(visible);\n\n if (!visible) {\n mapController.setSelectedFileShadowHighlight(false);\n dispatch(setDisplayShadowHighlighted(false));\n }\n };\n\n const handleSelectedSketchShadowToggle = (visible: boolean) => {\n sketchController.setSelectedSketchShadow(visible);\n setShadowOn(visible);\n\n if (!visible) {\n sketchController.setSelectedSketchShadowHighlight(false);\n dispatch(setDisplayShadowHighlighted(false));\n }\n };\n\n const handleShadowToggle = (event: ChangeEvent) => {\n const visible = event.target.checked;\n\n if (selectedFileId) {\n handleSelectedFileShadowToggle(visible);\n } else if (selectedSketch) {\n handleSelectedSketchShadowToggle(visible);\n }\n };\n\n const handleHighlightShadowToggle = (event: ChangeEvent) => {\n const highlighted = event.target.checked;\n\n if (selectedFileId) {\n mapController.setSelectedFileShadowHighlight(highlighted, highlightShadowColor);\n } else if (selectedSketch) {\n sketchController.setSelectedSketchShadowHighlight(highlighted, highlightShadowColor);\n }\n\n dispatch(setDisplayShadowHighlighted(highlighted));\n };\n\n return (\n
\n
\n \n }\n label={`New Building Shadow`}\n labelPlacement='end'\n />\n\n
\n \n }\n label='Highlight Shadow'\n labelPlacement='end'\n />\n {displayShadowHighlighted && (\n \n e.stopPropagation()}\n onCompositionUpdate={(e) => e.stopPropagation()}\n />\n \n )}\n
\n
\n
\n );\n};\n\nexport default LightStudyShadowControls;\n","import { useEffect, useRef } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport { isShadowCastLoadedState } from '../../../../../store/slices/appSlice';\nimport mapController from '../../../../controllers/MapController';\nimport { setIsShadowCastActive } from '../../../../../store/slices/lightStudySlice';\nimport './ShadowCast.scss';\n\nconst ShadowCast = () => {\n const dispatch = useDispatch();\n const shadowCastRef = useRef(null);\n const isShadowCastLoaded = useSelector(isShadowCastLoadedState);\n\n useEffect(() => {\n if (shadowCastRef.current) {\n mapController.initializeShadowCastWidget(shadowCastRef);\n }\n\n return () => mapController.cancelShadowCast();\n }, [shadowCastRef]);\n\n const handleReturnButtonClick = () => {\n dispatch(setIsShadowCastActive(false));\n };\n\n return (\n
\n
\n\n {isShadowCastLoaded ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nexport default ShadowCast;\n","import { useEffect } from 'react';\nimport { useSelector } from 'react-redux';\nimport LightStudyDateSection from './LightStudyDateSection/LightStudyDateSection';\nimport LightStudyTimeSelection from './LightStudyTimeSelection/LightStudyTimeSelection';\nimport LightStudyAction from './LightStudyAction/LightStudyAction';\nimport LightStudyShadowControls from './LightStudyShadowControls/LightStudyShadowControls';\nimport { isShadowCastActiveState, selectedDateState } from '../../../../../store/slices/lightStudySlice';\nimport mapController from '../../../../controllers/MapController';\nimport ShadowCast from '../ShadowCast/ShadowCast';\nimport './LightStudy.scss';\n\nconst LightStudy = () => {\n const selectedDate = useSelector(selectedDateState);\n const isShadowCastActive = useSelector(isShadowCastActiveState);\n\n useEffect(() => {\n mapController.updateViewsLightning(selectedDate);\n }, [selectedDate]);\n\n return (\n
\n {isShadowCastActive ? (\n \n ) : (\n <>\n \n \n \n \n \n )}\n
\n );\n};\n\nexport default LightStudy;\n","import { StyleSheet } from '@react-pdf/renderer';\n\nconst width = 555;\nconst margin = 20;\nconst headerPadding = 15;\n\nconst headerDefault = {\n display: 'flex',\n height: 100,\n width: '100%',\n backgroundColor: '#202c3c',\n color: 'white',\n paddingLeft: headerPadding,\n paddingRight: headerPadding,\n};\n\nexport default StyleSheet.create({\n document: {\n display: 'flex',\n flexDirection: 'column',\n },\n page: {\n display: 'flex',\n flexDirection: 'column',\n },\n headerRow: {\n flexDirection: 'row',\n justifyContent: 'space-between',\n ...headerDefault,\n paddingBottom: headerPadding,\n paddingTop: headerPadding,\n },\n headerColumn: {\n flexDirection: 'column',\n },\n headerImagesColumn: {\n position: 'relative',\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'nowrap',\n justifyContent: 'flex-end',\n },\n headerText: {\n fontSize: 18,\n flexGrow: 2,\n alignSelf: 'center',\n },\n logo: {\n marginRight: 10,\n height: '100%',\n width: 'auto',\n },\n subSection: {\n display: 'flex',\n flexWrap: 'wrap',\n flexDirection: 'column',\n marginTop: 0,\n marginLeft: margin + 5,\n marginRight: margin + 5,\n marginBottom: margin + 5,\n },\n capitalize: {\n textTransform: 'capitalize',\n },\n subHeaderText: {\n fontSize: 12,\n flexGrow: 2,\n width: width,\n },\n devStandsRow: {\n display: 'flex',\n flexDirection: 'row',\n height: 'auto',\n },\n lotResultsWrapper: {\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'wrap',\n marginTop: margin,\n marginBottom: 0,\n },\n lotResultsSubwrapper: {\n display: 'flex',\n flexWrap: 'wrap',\n flexDirection: 'row',\n maxWidth: width,\n marginTop: margin / 2,\n marginBottom: margin / 2,\n },\n lotResultsText: {\n marginTop: 7.5,\n marginBottom: 7.5,\n fontSize: 11,\n width: '23%',\n },\n itemText: {\n marginRight: 20,\n marginBottom: 20,\n width: '23%',\n fontSize: 11,\n },\n noResultsText: {\n fontSize: 11,\n marginRight: 'auto',\n },\n detailText: {\n fontSize: 12,\n flexGrow: 2,\n marginTop: 15,\n },\n pageContent: {\n display: 'flex',\n flexDirection: 'column',\n marginTop: 0,\n marginLeft: margin,\n marginRight: margin,\n marginBottom: margin,\n maxWidth: width,\n },\n shadowSection: {\n paddingTop: 10,\n },\n screenShotWrapper: {\n flexDirection: 'column',\n justifyContent: 'center',\n },\n screenshot: {\n objectFit: 'cover',\n height: 310,\n width: width,\n marginTop: 10,\n fontSize: 11,\n maxWidth: '100%',\n maxHeight: '100%',\n borderBottom: '2pt solid black',\n },\n legendsContainer: {\n marginTop: 4,\n marginBottom: 10,\n },\n singleLegendContainer: {\n display: 'flex',\n flexDirection: 'row',\n flexWrap: 'nowrap',\n justifyContent: 'flex-start',\n alignItems: 'center',\n },\n legendText: {\n fontSize: 9,\n flexGrow: 1,\n marginLeft: 2,\n },\n});\n","import React from 'react';\nimport {\n Text,\n View\n} from '@react-pdf/renderer';\n\nimport style from './pdfStyle.config';\n\n\nconst LotResults = ({results, title}) => {\n const lots = results.map((result, index) => {result});\n\n return (\n \n {title}:\n \n {lots}\n \n \n );\n};\n\nexport default LotResults;\n","export default __webpack_public_path__ + \"static/media/logo.f543fe65.png\";","import React from 'react';\nimport { Text, View, Image, Link } from '@react-pdf/renderer';\n\nimport dcozLogo from '../../../../../css/images/logo.png';\nimport style from './pdfStyle.config';\n\nconst Header = ({ location, insetScreenshotUrl, dcoz2DURL }) => {\n const date = new Date();\n const address = location && location.toLowerCase().substring(0, location.lastIndexOf(' '));\n const quadrant = location && location.substring(location.lastIndexOf(' ') + 1, location.length);\n\n const subHeaderTextCustom = {\n ...style.subHeaderText,\n width: 'auto',\n };\n\n return (\n \n \n \n DC Office of Zoning\n Shadow Report\n {date.toDateString()}\n {location ? (\n \n \n {address} {quadrant}\n \n \n ) : null}\n \n \n DCOZ logo\n \n \n \n \n );\n};\n\nexport default Header;\n","import React from 'react';\nimport { Page, Text, View, Image } from '@react-pdf/renderer';\n\nimport Header from './Header';\nimport Color from 'color';\n\nimport style from './pdfStyle.config';\n\nconst ShadowPage = ({\n highlightShadow,\n shadowHighlightColor,\n screenshotData,\n time,\n location,\n insetScreenshotUrl,\n dcoz2DURL,\n}) => {\n const [buildingUpload, originalBuilding] = screenshotData;\n\n return (\n \n
\n \n \n {time}:\n \n {buildingUpload && (\n <>\n \n\n {/* LEGENDS */}\n {highlightShadow && (\n \n \n \n NEW SHADOW CREATED BY PROJECT\n \n \n \n SHADOW CREATED BY EXISTING DEVELOPMENT\n \n \n \n \n AREAS OF OVERLAP BETWEEN EXISTING SHADOW AND NEW SHADOW CREATED BY PROJECT\n \n \n \n )}\n \n )}\n {originalBuilding && (\n \n )}\n {!buildingUpload || !originalBuilding ? (\n Unable to render {time} screenshot(s)\n ) : null}\n \n \n \n \n );\n};\n\nexport default ShadowPage;\n","import React from 'react';\nimport { Page, View, Document } from '@react-pdf/renderer';\n\nimport LotResults from './LotResults';\nimport Header from './Header';\nimport ShadowPage from './ShadowPage';\n\nimport style from './pdfStyle.config';\nimport moment from 'moment-timezone';\n\nconst ShadowReport = ({\n highlightShadow,\n shadowHighlightColor,\n screenshotsData,\n location,\n sslResults,\n zoneResults,\n insetScreenshotUrl,\n dcoz2DURL,\n}) => {\n return (\n \n {Object.entries(screenshotsData).map(([stringDate, data]) => {\n const date = new Date(stringDate);\n\n return (\n \n );\n })}\n\n {(sslResults?.length || zoneResults?.length) && (\n \n
\n \n {sslResults?.length && }\n {zoneResults?.length && }\n \n \n )}\n \n );\n};\n\nexport default ShadowReport;\n","import { useState, useEffect, useRef } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport ReactGA from 'react-ga4';\nimport { BlobProvider } from '@react-pdf/renderer';\nimport { urls } from '../../../../config';\nimport ShadowReportDocument from './ShadowReportDocument';\nimport LinearProgressBar from '../../../shared/LinearProgressBar';\nimport api from '../../../../utils/api';\nimport {\n generateInsetMap,\n getLotData,\n generateCurrentBuildingGraphic,\n takeScreenshot,\n getInsetMapUrl,\n} from '../../../../utils/esri';\nimport { loadModules } from 'esri-loader';\nimport mapController from '../../../../controllers/MapController';\nimport sketchController from '../../../../controllers/SketchController';\nimport {\n addRemovedBuilding,\n displayShadowHighlightedState,\n highlightColorState,\n popRemovedBuilding,\n removedBuildingsState,\n setCurrentBuilding,\n siteState,\n} from '../../../../../store/slices/appSlice';\nimport { selectedFileState } from '../../../../../store/slices/uploadSlice';\nimport { selectedSketchState } from '../../../../../store/slices/sketchSlice';\nimport { LAYER_TITLES } from '../../../../configs/config.layerTitles';\nimport './ShadowReport.scss';\n\nconst ShadowReport = () => {\n const dispatch = useDispatch();\n const insetMapRef = useRef(null);\n const [reportReady, setReportReady] = useState(false);\n const [generatingReport, setGeneratingReport] = useState(false);\n const selectedFile = useSelector(selectedFileState);\n const selectedSketch = useSelector(selectedSketchState);\n const removedBuildings = useSelector(removedBuildingsState);\n const displayShadowHighlighted = useSelector(displayShadowHighlightedState);\n const highlightColor = useSelector(highlightColorState);\n const site = useSelector(siteState);\n\n const [reportData, setReportData] = useState<{\n screenshotsData: any;\n sslResults: any;\n zoneResults: any;\n insetScreenshotUrl: string;\n zr16Url: any;\n }>();\n\n useEffect(() => {\n setReportReady(!!reportData);\n }, [reportData]);\n\n const getInsetScreenshot = async (latitude: number, longitude: number) => {\n const { buildingGraphic, buildingCircle } = await generateCurrentBuildingGraphic(latitude, longitude);\n const insetMapView = await generateInsetMap(insetMapRef.current, buildingCircle.extent);\n insetMapView.graphics.add(buildingGraphic);\n\n const insetScreenshotUrl = await getInsetMapUrl(insetMapView);\n\n return insetScreenshotUrl;\n };\n\n const getScreenshotsData = async (prevScreenshotsData: { [key: string]: any } = {}) => {\n const result = prevScreenshotsData;\n\n let date: Date;\n let currentScreenshoot;\n let prevData;\n const currentYear = new Date().getFullYear();\n\n const monthDayTuples = [\n [2, 20], // March 20,\n [5, 21], // June 21,\n [8, 23], // September 23,\n [11, 21], // December 21\n ];\n\n for (const monthDay of monthDayTuples) {\n for (let i = 0; i < 4; i++) {\n const hour = 9 + i * 3; //9, 12, 15, 18 hours\n date = new Date(currentYear, monthDay[0], monthDay[1], hour, 0, 0);\n mapController.view3D.environment.lighting.date = date;\n currentScreenshoot = await takeScreenshot(mapController.view3D);\n prevData = result[date.toString()] ?? [];\n result[date.toString()] = [...prevData, currentScreenshoot];\n }\n }\n\n return result;\n };\n\n const restoreRemovedBuilding = async () => {\n dispatch(popRemovedBuilding());\n\n const definition = api.generateBuildingDefinitionExpression(removedBuildings);\n const layer = mapController.findLayerByTitle(LAYER_TITLES.BUILDINGS);\n if (layer) {\n layer.definitionExpression = definition;\n }\n\n dispatch(setCurrentBuilding(undefined));\n };\n\n const removeCurrentBuilding = async () => {\n if (selectedFile) {\n const point = selectedFile.geometry?.centroid;\n\n if (point) {\n const screenPoint = mapController.view3D.toScreen(point);\n const data = await mapController.view3D.hitTest(screenPoint);\n const [feature] = data.results;\n\n if (feature?.graphic) {\n dispatch(setCurrentBuilding(feature.graphic));\n\n const attributes = feature.graphic.attributes;\n if (attributes.OBJECTID) {\n dispatch(addRemovedBuilding(attributes.OBJECTID));\n } else if (attributes.OID) {\n dispatch(addRemovedBuilding(attributes.OID));\n }\n\n const definition = api.generateBuildingDefinitionExpression(removedBuildings);\n const layer = mapController.findLayerByTitle(LAYER_TITLES.BUILDINGS);\n if (layer) {\n layer.definitionExpression = definition;\n }\n\n dispatch(setCurrentBuilding(undefined));\n } else {\n console.log('getAndSetCurrentBuilding() - Unable to generate feature.graphic');\n }\n }\n }\n };\n\n const getGeometryLotData = async (geometry: __esri.Geometry) => {\n const [lotData, zoneData] = await Promise.all([\n getLotData(geometry, urls.queryLayer),\n getLotData(geometry, urls.zoneQuery),\n ]);\n\n let allSSLs;\n if (Array.isArray(lotData)) {\n allSSLs = lotData?.map((lot) => `${lot.Square} ${lot.LotNum}`);\n }\n\n let zoneLabels;\n if (Array.isArray(zoneData)) {\n zoneLabels = zoneData?.map((result) => result.Zoning_Label);\n }\n\n return { sslResults: allSSLs, zoneResults: zoneLabels };\n };\n\n const getZR16Url = async (longitute: number, latitude: number) => {\n const [webMercatorUtils] = await loadModules(['esri/geometry/support/webMercatorUtils']);\n\n const [x, y] = webMercatorUtils.lngLatToXY(longitute, latitude);\n const zoom = Math.round(mapController.view3D.zoom) > 18 ? 18 : Math.round(mapController.view3D.zoom);\n\n const url = urls.zr16(x, y, zoom);\n\n return url;\n };\n\n const handleSelectedFileShadowReport = async () => {\n if (selectedFile) {\n await mapController.waitViewUpdate();\n\n const { geometry, location, itemId, sceneLayerId } = selectedFile;\n\n const insetScreenshotUrl = await getInsetScreenshot(location.LATITUDE, location.LONGITUDE);\n\n await mapController.view3D.goTo({ target: geometry, zoom: mapController.view3D.zoom, tilt: 0 });\n await removeCurrentBuilding();\n const firstRoundScreenshots = await getScreenshotsData();\n\n await restoreRemovedBuilding();\n const uploadBuildingLayer = mapController.view3D.map.findLayerById(sceneLayerId);\n uploadBuildingLayer.visible = false;\n sketchController.setSketchLayerVisibility(false);\n\n mapController.removeLocationPinGraphic();\n const screenshotsData = await getScreenshotsData(firstRoundScreenshots);\n\n uploadBuildingLayer.visible = true;\n\n const { sslResults, zoneResults } = await getGeometryLotData(geometry);\n\n const zr16Url = await getZR16Url(location.LONGITUDE, location.LATITUDE);\n\n mapController.view3D.environment.lighting.date = new Date();\n setReportData({\n screenshotsData,\n insetScreenshotUrl,\n sslResults,\n zoneResults,\n zr16Url,\n });\n }\n };\n\n const handleSelectedSketchReport = async () => {\n const view3D = mapController.view3D;\n const { geometry } = selectedSketch;\n\n await mapController.waitViewUpdate();\n\n const centerPoint = geometry.extent.center;\n const insetScreenshotUrl = await getInsetScreenshot(centerPoint.latitude, centerPoint.longitude);\n\n sketchController.cancelSketch();\n sketchController.setSketchLayerVisibility(true);\n await view3D.goTo({\n target: geometry,\n tilt: 0,\n scale: view3D.scale,\n zoom: view3D.zoom,\n });\n\n mapController.removeLocationPinGraphic();\n const firstRoundScreenshots = await getScreenshotsData();\n sketchController.setSketchLayerVisibility(false);\n const screenshotsData = await getScreenshotsData(firstRoundScreenshots);\n\n sketchController.setSketchLayerVisibility(true);\n\n const { sslResults, zoneResults } = await getGeometryLotData(geometry);\n const zr16Url = await getZR16Url(centerPoint.longitude, centerPoint.latitude);\n\n mapController.view3D.environment.lighting.date = new Date();\n\n setReportData({\n screenshotsData,\n insetScreenshotUrl,\n sslResults,\n zoneResults,\n zr16Url,\n });\n };\n\n const generateReport = () => {\n setGeneratingReport(true);\n if (selectedFile) {\n handleSelectedFileShadowReport();\n ReactGA.event({\n action: 'shadow_report',\n category: 'uploaded_file',\n });\n } else if (selectedSketch) {\n handleSelectedSketchReport();\n ReactGA.event({\n action: 'shadow_report',\n category: 'sketch',\n });\n }\n };\n\n return (\n
\n \n {reportData && reportReady ? (\n \n \n }\n >\n {({ blob, url, loading, error }) => {\n if (loading || !url) {\n return 'Loading PDF...';\n }\n if (url) {\n return (\n <>\n window.open(...) is the only way to open a Blob\n // * in a new tab via Safari - it also works in Chrome\n onClick={() => window.open(url as string, '_blank')}\n rel='noopener noreferrer'\n >\n Open\n \n \n Download\n \n \n );\n } else {\n return null;\n }\n }}\n \n \n ) : generatingReport ? (\n \n ) : (\n \n )}\n
\n );\n};\n\nexport default ShadowReport;\n","import { useEffect, useRef } from 'react';\nimport { useSelector } from 'react-redux';\nimport { activeToolState, view3DState } from '../../../../../store/slices/appSlice';\nimport mapController from '../../../../controllers/MapController';\nimport './LineOfSight.scss';\n\nconst LineOfSight = () => {\n const view3D = useSelector(view3DState);\n const activeTool = useSelector(activeToolState);\n const lineOfSightRef = useRef(null);\n\n const hidden = activeTool !== 'line-of-sight';\n\n useEffect(() => {\n if (view3D?.ready && lineOfSightRef.current) {\n mapController.initializeLineOfSightWidget(lineOfSightRef);\n }\n\n return () => {\n mapController.removeLineOfSight();\n };\n }, [lineOfSightRef, view3D?.ready]);\n\n useEffect(() => {\n if (hidden) {\n mapController.stopLineOfSight();\n }\n }, [hidden]);\n\n return (\n
\n
\n
\n );\n};\n\nexport default LineOfSight;\n","import { useEffect, useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n Select,\n InputLabel,\n Button,\n FormControl,\n MenuItem,\n FormGroup,\n FormControlLabel,\n Switch,\n IconButton,\n} from '@material-ui/core';\nimport EditIcon from '@material-ui/icons/Edit';\nimport CheckIcon from '@material-ui/icons/Check';\nimport VisibleIcon from '@material-ui/icons/Visibility';\nimport NotVisibleIcon from '@material-ui/icons/VisibilityOff';\nimport {\n ISketch,\n isMagnifierOnState,\n selectedSketchState,\n setIsMagnifierOn,\n setSketchStatus,\n sketchesState,\n updateSketch,\n} from '../../../../../../store/slices/sketchSlice';\nimport StyledTooltip from '../../../../shared/StyledTooltip';\nimport sketchController from '../../../../../controllers/SketchController';\nimport mapController from '../../../../../controllers/MapController';\nimport NumberCounter from '../../../../shared/NumberCounter';\nimport apiUtils from '../../../../../utils/api';\nimport { SketchHeightUnit } from '../../../../../configs/config.sketch';\nimport './SketchEdit.scss';\n\nconst SketchEdit = () => {\n const units: SketchHeightUnit[] = ['Feet', 'Meters'];\n const dispatch = useDispatch();\n const selectedSketchGraphic = useSelector(selectedSketchState);\n const sketches = useSelector(sketchesState);\n const selectedSketch = sketches.find((sketch) => sketch.uid === selectedSketchGraphic?.uid);\n const isMagnifierOn = useSelector(isMagnifierOnState);\n const [editingTitle, setEditingTitle] = useState(false);\n const [editingTitleValue, setEditingTitleValue] = useState(() => selectedSketch?.title ?? '');\n\n useEffect(() => {\n setEditingTitleValue(selectedSketch?.title ?? '');\n }, [selectedSketch?.title]);\n\n // TODO: same method is in Sketch component\n const setMagnifier = (isOn: boolean) => {\n mapController.setMagnifierVisibility(isOn);\n dispatch(setIsMagnifierOn(isOn));\n };\n\n if (!selectedSketch) {\n return null;\n }\n\n const unit = selectedSketch.unit;\n const height = selectedSketch.height;\n const title = selectedSketch.title;\n\n const handleDelete = () => {\n sketchController.deleteSelectedSketch();\n };\n\n const handleCancelSketch = () => {\n dispatch(setSketchStatus('idle'));\n setMagnifier(false);\n sketchController.cancelSketch();\n };\n\n const handleUnitChange = (\n event: React.ChangeEvent<{\n name?: string | undefined;\n value: unknown;\n }>\n ) => {\n if (event && height) {\n const newUnit = event.target.value as SketchHeightUnit;\n\n if (newUnit === 'Meters') {\n mapController.setMapMeasurementUnit('metric');\n sketchController.updateSketchHeight(height);\n } else if (newUnit === 'Feet') {\n mapController.setMapMeasurementUnit('english');\n const meters = apiUtils.convertFeetToMeters(height);\n sketchController.updateSketchHeight(meters);\n }\n\n if (selectedSketchGraphic) {\n sketchController.updateSketch(selectedSketchGraphic);\n }\n\n const { uid } = selectedSketchGraphic;\n\n if (newUnit) {\n dispatch(\n updateSketch({\n ...selectedSketch,\n uid,\n height,\n unit: newUnit,\n })\n );\n }\n }\n };\n\n const onHeightIncrement = (targetInputElement: HTMLInputElement) => {\n const { value } = targetInputElement;\n const newValue = Number(value) + 1;\n\n if (unit === 'Meters') {\n sketchController.updateSketchHeight(newValue);\n } else if (unit === 'Feet') {\n const meters = apiUtils.convertFeetToMeters(newValue);\n sketchController.updateSketchHeight(meters);\n }\n\n const { uid } = selectedSketchGraphic;\n\n if (unit) {\n dispatch(\n updateSketch({\n ...selectedSketch,\n uid,\n height: newValue,\n unit,\n })\n );\n }\n };\n\n const onHeightDecrement = (targetInputElement: HTMLInputElement) => {\n if (selectedSketchGraphic && unit) {\n const { value } = targetInputElement;\n const newValue = Number(value) - 1;\n\n if (newValue > 0) {\n if (unit === 'Meters') {\n mapController.updateMeasurementUnit('metric');\n sketchController.updateSketchHeight(newValue);\n } else if (unit === 'Feet') {\n mapController.updateMeasurementUnit('imperial');\n const meters = apiUtils.convertFeetToMeters(newValue);\n sketchController.updateSketchHeight(meters);\n }\n\n const { uid } = selectedSketchGraphic;\n dispatch(\n updateSketch({\n ...selectedSketch,\n uid,\n height: newValue,\n unit,\n })\n );\n }\n }\n };\n\n const handleHeightChange = (event: React.ChangeEvent) => {\n if (selectedSketchGraphic && unit) {\n const value = Number(event.target.value);\n\n if (value > 0) {\n let valueInMeters;\n\n if (unit === 'Meters') {\n valueInMeters = value;\n } else if (unit === 'Feet') {\n valueInMeters = apiUtils.convertFeetToMeters(value);\n }\n\n if (valueInMeters) {\n sketchController.updateSketchHeight(valueInMeters);\n }\n\n const { uid } = selectedSketchGraphic;\n dispatch(\n updateSketch({\n ...selectedSketch,\n uid,\n height: value,\n unit,\n })\n );\n }\n }\n };\n\n const handleMagnifierSwitch = (event: React.ChangeEvent, checked: boolean) => {\n setMagnifier(checked);\n };\n\n const handleEditTitleClick = () => {\n // EditingTitle ? save : edit\n if (editingTitle) {\n dispatch(\n updateSketch({\n ...selectedSketch,\n title: editingTitleValue.length ? editingTitleValue : selectedSketch?.title,\n })\n );\n }\n\n setEditingTitle(!editingTitle);\n };\n\n const handleVisibilityChange = (event: React.MouseEvent, sketch: ISketch) => {\n event.stopPropagation();\n sketchController.setSketchVisibility(sketch, !sketch.visible);\n };\n\n return (\n
\n
\n
\n {editingTitle ? (\n setEditingTitleValue(event.target.value)}\n type='text'\n id='fname'\n name='fname'\n />\n ) : (\n

{title}

\n )}\n \n {editingTitle ? (\n \n ) : (\n \n )}\n \n
\n \n handleVisibilityChange(e, selectedSketch!)}>\n {selectedSketch!.visible ? : }\n \n \n
\n\n
\n
\n
Height:
\n \n
\n\n
\n Unit:\n \n \n \n
\n\n
\n \n \n }\n label='Magnifier'\n />\n \n
\n
\n\n
\n \n \n
\n
\n );\n};\n\nexport default SketchEdit;\n","import { useDispatch, useSelector } from 'react-redux';\nimport IconButton from '@material-ui/core/IconButton';\nimport { ISketch, setSelectedSketch, setSketchStatus, sketchesState } from '../../../../../../store/slices/sketchSlice';\nimport mapController from '../../../../../controllers/MapController';\nimport sketchController from '../../../../../controllers/SketchController';\nimport VisibleIcon from '@material-ui/icons/Visibility';\nimport NotVisibleIcon from '@material-ui/icons/VisibilityOff';\nimport './SketchList.scss';\n\nconst SketchList = () => {\n const sketches = useSelector(sketchesState);\n const dispatch = useDispatch();\n const titlesMap = new Map();\n\n const handleSketchSelection = (sketch: ISketch) => {\n const { uid } = sketch;\n\n if (!sketch.visible) {\n sketchController.setSketchVisibility(sketch, true);\n }\n\n const sketchGraphic = sketchController.getSketchGraphicByUid(uid);\n\n dispatch(setSketchStatus('editing'));\n dispatch(setSelectedSketch(sketchGraphic));\n if (sketchGraphic) {\n sketchController.updateSketch(sketchGraphic);\n mapController.view3D.goTo(sketchGraphic);\n }\n };\n\n const handleVisibilityChange = (event: React.MouseEvent, sketch: ISketch) => {\n event.stopPropagation();\n sketchController.setSketchVisibility(sketch, !sketch.visible);\n };\n\n return sketches?.length ? (\n
\n

Current sketches:

\n
    \n {sketches.map((sketch) => {\n let titleCount = 0;\n\n if (titlesMap.has(sketch.title)) {\n titleCount = titlesMap.get(sketch.title) + 1;\n } else {\n titleCount = 1;\n }\n\n titlesMap.set(sketch.title, titleCount);\n\n return (\n
  • \n \n
  • \n );\n })}\n
\n
\n ) : null;\n};\n\nexport default SketchList;\n","import { useEffect } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { Button } from '@material-ui/core';\nimport sketchController from '../../../../controllers/SketchController';\nimport { setIsMagnifierOn, setSketchStatus, sketchStatusState } from '../../../../../store/slices/sketchSlice';\nimport mapController from '../../../../controllers/MapController';\nimport SketchEdit from './SketchEdit/SketchEdit';\nimport SketchList from './SketchList/SketchList';\nimport './Sketch.scss';\n\nconst Sketch = () => {\n const dispatch = useDispatch();\n const status = useSelector(sketchStatusState);\n\n useEffect(() => {\n return () => {\n dispatch(setSketchStatus('idle'));\n mapController.setMagnifierVisibility(false);\n dispatch(setIsMagnifierOn(false));\n };\n }, []);\n\n const setMagnifier = (isOn: boolean) => {\n mapController.setMagnifierVisibility(isOn);\n dispatch(setIsMagnifierOn(isOn));\n };\n\n const handleStartSketch = () => {\n dispatch(setSketchStatus('active'));\n sketchController.startSketch();\n };\n\n const handleCancelSketch = () => {\n dispatch(setSketchStatus('idle'));\n setMagnifier(false);\n sketchController.cancelSketch();\n };\n\n return (\n
\n {status === 'editing' ? (\n \n ) : (\n <>\n \n\n
\n {status === 'idle' && (\n \n )}\n\n {(status === 'active' || status === 'sketching') && (\n \n Cancel\n \n )}\n
\n \n )}\n
\n );\n};\n\nexport default Sketch;\n","import { useEffect } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { activeToolState } from '../../../../../../store/slices/appSlice';\nimport {\n dimensionAnalysisState,\n MEASUREMENT_UNITS,\n selectedMeasurementTypeState,\n selectedMeasurementUnitState,\n setSelectedMeasurementUnit,\n UnitType,\n} from '../../../../../../store/slices/measurementSlice';\nimport dimensionAnalysisController from '../../../../../controllers/DimensionAnalysisController';\nimport mapController from '../../../../../controllers/MapController';\nimport './MeasurementDimensionAnalysis.scss';\n\nconst MeasurementDimensionAnalysis = () => {\n const dispatch = useDispatch();\n const activeTool = useSelector(activeToolState);\n const selectedMeasurementUnit = useSelector(selectedMeasurementUnitState);\n const selectedMeasurementType = useSelector(selectedMeasurementTypeState);\n const hidden = activeTool !== 'measurement' || selectedMeasurementType !== 'dimension-analysis';\n const dimensionAnalysis = useSelector(dimensionAnalysisState);\n const isDimensionAnalysisEmpty = dimensionAnalysis.isEmpty;\n const { status } = dimensionAnalysis;\n\n useEffect(() => {\n mapController.removeAreaMeasurementWidget();\n mapController.removeDirectLineMeasurementWidget();\n\n return () => {\n dimensionAnalysisController.cancel();\n };\n }, []);\n\n useEffect(() => {\n if (hidden) {\n dimensionAnalysisController.cancel();\n }\n }, [hidden]);\n\n const handleNewMeasurementClick = () => {\n dimensionAnalysisController.start();\n };\n\n const handleClearMeasurementClick = () => {\n dimensionAnalysisController.clear();\n };\n\n const handleCancelMeasurementClick = () => {\n dimensionAnalysisController.cancel();\n };\n\n const handleUnitChange = (\n event: React.ChangeEvent<{\n name?: string | undefined;\n value: unknown;\n }>\n ) => {\n if (event) {\n const newUnit = event.target.value as UnitType;\n\n dispatch(setSelectedMeasurementUnit(newUnit));\n }\n };\n\n return (\n
\n
\n {(status === 'measuring' || status === 'active') && (\n
\n \n Unit\n \n \n {MEASUREMENT_UNITS.map((unit) => (\n \n ))}\n \n
\n )}\n\n {status === 'active' && (\n

\n Start to measure by clicking in the scene to place your first point\n

\n )}\n
\n {(status === 'measuring' || status === 'active') && (\n \n Cancel\n \n )}\n {status === 'idle' && (\n <>\n \n New measurement\n \n \n )}\n {!isDimensionAnalysisEmpty && (\n \n Clear\n \n )}\n
\n
\n
\n );\n};\n\nexport default MeasurementDimensionAnalysis;\n","import { useEffect, useRef } from 'react';\nimport { useSelector } from 'react-redux';\nimport { activeToolState, view3DState } from '../../../../../../store/slices/appSlice';\nimport {\n directLineMeasurementStatusState,\n selectedMeasurementTypeState,\n} from '../../../../../../store/slices/measurementSlice';\nimport mapController from '../../../../../controllers/MapController';\nimport '../MeasurementEsriWidgets.scss';\n\nconst MeasurementDirectLineWidget = () => {\n const activeTool = useSelector(activeToolState);\n const selectedMeasurementType = useSelector(selectedMeasurementTypeState);\n const hidden = activeTool !== 'measurement' || selectedMeasurementType !== 'direct-line';\n const view3D = useSelector(view3DState);\n const directLineMeasurementStatus = useSelector(directLineMeasurementStatusState);\n const MeasurementDirectLineWidgetRef = useRef(null);\n const showClearButton = directLineMeasurementStatus === 'measured';\n\n useEffect(() => {\n if (view3D?.ready && MeasurementDirectLineWidgetRef.current) {\n mapController.initializeDirectLineMeasurement(MeasurementDirectLineWidgetRef);\n } else {\n mapController.removeDirectLineMeasurementWidget();\n }\n }, [view3D, MeasurementDirectLineWidgetRef]);\n\n useEffect(() => {\n if (hidden) {\n if (directLineMeasurementStatus === 'ready') {\n mapController?.clearDirectLineMeasurement();\n }\n }\n }, [hidden]);\n\n const clearMeasurement = () => {\n mapController?.clearDirectLineMeasurement();\n };\n\n return (\n
\n \n \n Clear\n \n
\n
\n );\n};\n\nexport default MeasurementDirectLineWidget;\n","import { useEffect, useRef } from 'react';\nimport { useSelector } from 'react-redux';\nimport { activeToolState, view3DState } from '../../../../../../store/slices/appSlice';\nimport {\n areaMeasurementStatusState,\n selectedMeasurementTypeState,\n} from '../../../../../../store/slices/measurementSlice';\nimport mapController from '../../../../../controllers/MapController';\nimport '../MeasurementEsriWidgets.scss';\n\nconst MeasurementAreaWidget = () => {\n const activeTool = useSelector(activeToolState);\n const selectedMeasurementType = useSelector(selectedMeasurementTypeState);\n const areaMeasurementStatus = useSelector(areaMeasurementStatusState);\n const hidden = activeTool !== 'measurement' || selectedMeasurementType !== 'area';\n const view3D = useSelector(view3DState);\n const MeasurementAreaWidgetRef = useRef(null);\n const showClearButton = areaMeasurementStatus === 'measured';\n\n useEffect(() => {\n if (view3D?.ready && MeasurementAreaWidgetRef.current) {\n mapController.initializeAreaMeasurement(MeasurementAreaWidgetRef);\n } else {\n mapController.removeAreaMeasurementWidget();\n }\n }, [view3D, MeasurementAreaWidgetRef]);\n\n useEffect(() => {\n if (hidden) {\n if (areaMeasurementStatus === 'ready') {\n mapController?.clearAreaMeasurement();\n }\n }\n }, [hidden]);\n\n const clearMeasurement = () => {\n mapController?.clearAreaMeasurement();\n };\n\n return (\n
\n \n \n Clear\n \n
\n
\n );\n};\n\nexport default MeasurementAreaWidget;\n","import StyledTooltip from '../../../../shared/StyledTooltip';\nimport './MeasurementTypeButton.scss';\n\ninterface IProps {\n description: string;\n title: string;\n selected: boolean;\n type: 'initial' | 'measurement-active';\n iconClass: string;\n handleMeasurementTypeSelection: () => void;\n}\n\nconst MeasurementTypeButton = ({\n description,\n title,\n selected,\n handleMeasurementTypeSelection,\n type,\n iconClass,\n}: IProps) => {\n return (\n \n \n

\n \n {title}\n

\n

{description}

\n \n
\n );\n};\n\nexport default MeasurementTypeButton;\n","import { useEffect } from 'react';\nimport MeasurementDimensionAnalysis from './MeasurementDimensionAnalysis/MeasurementDimensionAnalysis';\nimport MeasurementDirectLineWidget from './MeasurementDirectLineWidget/MeasurementDirectLineWidget';\nimport MeasurementAreaWidget from './MeasurementAreaWidget/MeasurementAreaWidget';\nimport MeasurementTypeButton from './MeasurementTypeButton/MeasurementTypeButton';\nimport {\n MeasurementType,\n selectedMeasurementTypeState,\n setSelectedMeasurementType,\n} from '../../../../../store/slices/measurementSlice';\nimport { useDispatch, useSelector } from 'react-redux';\nimport mapController from '../../../../controllers/MapController';\nimport './Measurement.scss';\nimport { activeToolState } from '../../../../../store/slices/appSlice';\n\nconst DIRECT_LINE_DESCRIPTION = 'Click on the map to measure 3D distance between points.';\nconst AREA_DESCRIPTION = 'Draw a shape on the map and measure the 3D area of that shape.';\nconst DIMENSION_DESCRIPTION =\n 'Click on the map to measure building dimensions with assistance of snapping functionality.';\n\nconst MEASUREMENT_TYPES: {\n id: MeasurementType;\n title: string;\n description: string;\n iconClass: string;\n}[] = [\n {\n id: 'direct-line',\n title: 'Direct Line',\n description: DIRECT_LINE_DESCRIPTION,\n iconClass: 'esri-icon-measure-line',\n },\n {\n id: 'area',\n title: 'Area',\n description: AREA_DESCRIPTION,\n iconClass: 'esri-icon-measure-area',\n },\n {\n id: 'dimension-analysis',\n title: 'Dimension',\n description: DIMENSION_DESCRIPTION,\n iconClass: 'esri-icon-measure',\n },\n];\n\nconst Measurement = () => {\n const dispatch = useDispatch();\n const activeTool = useSelector(activeToolState);\n const selectedMeasurementType = useSelector(selectedMeasurementTypeState);\n\n const hidden = activeTool !== 'measurement';\n\n useEffect(() => {\n return () => {\n mapController.removeAreaMeasurementWidget();\n mapController.removeDirectLineMeasurementWidget();\n dispatch(setSelectedMeasurementType(undefined));\n };\n }, []);\n\n const renderMeasurementWidget = () => {\n switch (selectedMeasurementType) {\n case 'direct-line':\n return ;\n case 'area':\n return ;\n case 'dimension-analysis':\n return ;\n }\n };\n\n return (\n
\n \n {MEASUREMENT_TYPES.map(({ id, title, description, iconClass }) => {\n return (\n <>\n
\n dispatch(setSelectedMeasurementType(id))}\n type={selectedMeasurementType ? 'measurement-active' : 'initial'}\n iconClass={iconClass}\n />\n \n );\n })}\n\n
\n
\n\n <>\n \n \n \n \n
\n );\n};\n\nexport default Measurement;\n","import { useSelector, useDispatch } from 'react-redux';\nimport IconButton from '@material-ui/core/IconButton';\nimport MoreHorizIcon from '@material-ui/icons/MoreHoriz';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport SiteControls from './SiteControls/SiteControls';\nimport SiteInformation from './site/SiteInformation';\nimport HelpControl from './site/controls/HelpControl';\nimport Submit from './submit/Submit';\nimport LightStudy from './site/controls/LigthStudy/LightStudy';\nimport ShadowReport from './site/controls/shadowReportPDF/ShadowReport';\nimport LineOfSight from './site/controls/LineOfSight/LineOfSight';\nimport { materialStyle } from '../../style/material';\nimport Sketch from './site/controls/Sketch/Sketch';\nimport { activeToolState, setSiteExpanded, siteExpandedState, siteState } from '../../store/slices/appSlice';\nimport Measurement from './site/controls/Measurement/Measurement';\nimport '../../css/components/_controls.scss';\nimport '../../css/components/_sitepanel.scss';\nimport '../../css/components/_buttons.scss';\nimport './SitePanel.scss';\n\nconst SitePanel = () => {\n const dispatch = useDispatch();\n const siteExpanded = useSelector(siteExpandedState);\n const activeTool = useSelector(activeToolState);\n const site = useSelector(siteState);\n\n const displayLeftPanelOnMobile = (activeTool === 'uploaded-files') | (activeTool === 'light');\n\n const expandSitePanel = () => dispatch(setSiteExpanded(!siteExpanded));\n\n const getActiveTool = () => {\n switch (activeTool) {\n case 'submit':\n case 'uploaded-files':\n return ;\n case 'light':\n return ;\n case 'help':\n return ;\n case 'sketch':\n return ;\n case 'default':\n return ;\n case 'delete':\n return ;\n case 'shadow-report':\n return ;\n default:\n break;\n }\n };\n\n const displayMoreInformationClass = siteExpanded ? '' : 'hidden';\n\n return (\n <>\n {((activeTool === 'default' && site?.latlon) || activeTool !== 'default') && (\n
\n \n \n \n
\n )}\n
\n {((activeTool === 'default' && site?.latlon) || activeTool !== 'default') && (\n
\n \n \n \n
\n )}\n\n \n \n {getActiveTool()}\n {}\n {}\n
\n
\n \n );\n};\n\nexport default SitePanel;\n","import { useEffect, useState } from 'react';\nimport shortid from 'shortid';\nimport api from '../utils/api';\nimport Toggle from 'material-ui/Toggle';\nimport mapController from '../controllers/MapController';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { setDistrictVisibility, zonesState } from '../../store/slices/appSlice';\n\nconst LayerListItem = (props) => {\n const dispatch = useDispatch();\n const zones = useSelector(zonesState);\n const { currentDistrict, text, zoneDistrictAllOnSwitch } = props;\n const zone = zones.find((zone) => zone.type === currentDistrict);\n const [requireMapUpdate, setRequireMapUpdate] = useState(false);\n\n useEffect(() => {\n if (requireMapUpdate) {\n let allDistrictsAreVisible = zone.districts.every((district) => district.visible);\n zoneDistrictAllOnSwitch(allDistrictsAreVisible);\n\n mapController.updateZoneLayerExpression(zones);\n setRequireMapUpdate(false);\n }\n }, [zone, requireMapUpdate]);\n\n const handleToggle = (event, display) => {\n dispatch(setDistrictVisibility({ zoneType: currentDistrict, districtId: text, visible: display }));\n setRequireMapUpdate(true);\n };\n\n return (\n
\n \n
\n );\n};\n\nexport default LayerListItem;\n","/* @flow */\nimport { useEffect, useState } from 'react';\nimport shortid from 'shortid';\nimport { materialStyle } from '../../style/material';\nimport LayerListItem from './LayerListItem';\n\nimport Paper from '@material-ui/core/Paper';\nimport Switch from '@material-ui/core/Switch';\nimport IconButton from '@material-ui/core/IconButton';\nimport { List } from 'material-ui/List';\nimport { Toolbar, ToolbarGroup } from 'material-ui/Toolbar';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport MoreHorizIcon from '@material-ui/icons/MoreHoriz';\nimport * as colors from 'material-ui/styles/colors';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { setZoneDistrictsVisibility, zonesState } from '../../store/slices/appSlice';\nimport mapController from '../controllers/MapController';\n\nconst LayersPanel = () => {\n const dispatch = useDispatch();\n const zones = useSelector(zonesState);\n const [expandLayerPanel, setExpandLayerPanel] = useState(true);\n const [displayPopover, setDisplayPopover] = useState(false);\n const [zoneDistrict, setZoneDistrict] = useState('');\n const [zoneDistrictAllOn, setZoneDistrictAllOn] = useState(true);\n const [paperSelected, setPaperSelected] = useState();\n const [mobileTopNavPanelExpand, setMobileTopNavPanelExpand] = useState(false);\n const [pageWidth, setPageWidth] = useState(window.innerWidth);\n const mobileBreakPoint = 700;\n const [requireMapUpdate, setRequireMapUpdate] = useState(false);\n\n useEffect(() => {\n updateWindowDimensions();\n window.addEventListener('resize', updateWindowDimensions);\n\n return () => window.removeEventListener('resize', updateWindowDimensions);\n }, []);\n\n useEffect(() => {\n if (requireMapUpdate) {\n mapController.updateZoneLayerExpression(zones);\n setRequireMapUpdate(false);\n }\n }, [requireMapUpdate, zones]);\n\n const updateWindowDimensions = () => {\n setPageWidth(window.innerWidth);\n };\n\n const showSublayers = (label) => {\n if (zoneDistrict === label) {\n setDisplayPopover(!displayPopover);\n } else {\n setDisplayPopover(true);\n setZoneDistrict(label);\n }\n };\n\n const hideSublayers = () => {\n setDisplayPopover(false);\n };\n\n const handleLayerPanel = () => {\n setExpandLayerPanel(!expandLayerPanel);\n hideSublayers();\n };\n\n const toggleLayerCategory = (zoneType, visible) => {\n dispatch(setZoneDistrictsVisibility({ zoneType, visible }));\n setZoneDistrictAllOn(visible);\n setRequireMapUpdate(true);\n };\n\n const selectPaper = (index) => {\n if (pageWidth < mobileBreakPoint) {\n setMobileTopNavPanelExpand(true);\n }\n\n setPaperSelected(index);\n };\n\n const buttonMobileTopNavPanelControl = () => {\n setMobileTopNavPanelExpand(!mobileTopNavPanelExpand);\n };\n\n const labelMobileTopNavPanelExpand = (label) => {\n zones.map((zone) => {\n if (zone.type === label) {\n const districtsVisable = zone.districts.map((district) => {\n return district.visible;\n });\n const districtsVisabillityAllClosed = districtsVisable.every((visible) => visible === false);\n setZoneDistrictAllOn(!districtsVisabillityAllClosed);\n }\n });\n\n setMobileTopNavPanelExpand(true);\n };\n\n const zoneDistrictAllOnSwitch = (state) => {\n setZoneDistrictAllOn(state);\n };\n\n const render = () => {\n let layers = [];\n let sublayers = [];\n // Class determininations\n let layerPanelWidth;\n let zonesMobileControlLabel;\n let zonesMobileControlSwitch;\n\n if (pageWidth >= mobileBreakPoint) {\n layerPanelWidth = expandLayerPanel ? mobileBreakPoint : '30px';\n } else {\n layerPanelWidth = pageWidth;\n }\n const displayLayerButton = expandLayerPanel ? '' : 'hidden';\n // Return react components for each layer category and sublayers\n zones.forEach((zone, index) => {\n // For the color bars below layer button\n const colorBar = zone.colors.map((color) => {\n const width = 100 / zone.colors.length;\n return
;\n });\n\n // Layer button\n const typeLabel = zone.type;\n const layer = (\n \n
\n {pageWidth >= mobileBreakPoint ? (\n // Desktop\n {\n showSublayers(typeLabel);\n selectPaper(index);\n }}\n className='navigation__label-button'\n >\n {typeLabel}\n \n ) : (\n // Mobile\n {\n labelMobileTopNavPanelExpand(typeLabel);\n showSublayers(typeLabel);\n }}\n className='navigation__label-button mobile'\n >\n {typeLabel.replace(/ zones| purpose/i, '')}\n \n )}\n
\n
{colorBar}
\n \n );\n layers.push(layer);\n\n // Populates popover if there is a currently selected district\n if (zone.type === zoneDistrict) {\n zone.districts.forEach((district) => {\n zonesMobileControlLabel = (\n \n );\n zonesMobileControlSwitch = (\n
\n OFF\n {\n toggleLayerCategory(zone.type, !zoneDistrictAllOn);\n }}\n />\n ON\n
\n );\n\n const sublayer = (\n \n );\n sublayers.push(sublayer);\n });\n }\n });\n\n return (\n \n \n \n \n \n \n \n
\n\n \n \n
\n\n \n {layers}\n \n\n {displayPopover && (\n = mobileBreakPoint - 1 ? 40 + paperSelected * 220 : null,\n }}\n className={`popup-container__wraper ${mobileTopNavPanelExpand ? 'mobile__open' : 'mobile__closed'}`}\n >\n {pageWidth < mobileBreakPoint && (\n // Only on mobile\n
\n {zonesMobileControlLabel}\n {zonesMobileControlSwitch}\n
\n )}\n
\n \n {sublayers}\n \n
\n
\n )}\n \n );\n };\n\n return render();\n};\n\nexport default LayersPanel;\n","import React from 'react';\n\nexport default function Logo() {\n return (\n \n
\n
\n \n );\n}\n","export default __webpack_public_path__ + \"static/media/welcome.f3a92f96.jpeg\";","import { useState } from 'react';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Dialog } from '@material-ui/core';\nimport { mobileState, setEnableIntro } from '../../../../store/slices/appSlice';\nimport { staticText } from '../../../config';\nimport Logo from '../../../../css/images/welcome.jpeg';\nimport './WelcomeModal.scss';\n\nconst WelcomeModal = () => {\n const dispatch = useDispatch();\n const mobile = useSelector(mobileState);\n const [displayModal, setDisplayModal] = useState(true);\n\n const startInteractiveHelp = () => {\n closeModal();\n dispatch(setEnableIntro(true));\n };\n\n const closeModal = () => {\n setDisplayModal(false);\n };\n\n return (\n \n
\n \n
\n

{staticText.welcome.title}

\n
\n

{staticText.welcome.desciption}

\n

{staticText.welcome.closing}

\n
\n
\n \n {mobile ? null : }\n
\n
\n
\n
\n );\n};\n\nexport default WelcomeModal;\n","import Dialog from '@material-ui/core/Dialog';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport Button from '@material-ui/core/Button';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport shortid from 'shortid';\nimport { materialStyle } from '../../../style/material';\n// Icons\nimport ExploreIcon from '@material-ui/icons/Explore';\nimport ZoomInIcon from '@material-ui/icons/ZoomIn';\nimport ZoomOutIcon from '@material-ui/icons/ZoomOut';\nimport TouchAppIcon from '@material-ui/icons/TouchApp';\nimport RotateRightIcon from '@material-ui/icons/RotateRight';\nimport MouseIcon from '@material-ui/icons/Mouse';\nimport KeyboardIcon from '@material-ui/icons/Keyboard';\nimport './NavigationModal.scss';\nimport { useDispatch, useSelector } from 'react-redux';\nimport {\n displayNavigation,\n displayNavigationState,\n mobileState,\n setDisplayNavigation,\n} from '../../../store/slices/appSlice';\n\nconst instructions = [\n {\n icon: ,\n text: 'Click + to zoom in.',\n viewInMobile: true,\n },\n {\n icon: ,\n text: 'Click - to zoom out.',\n viewInMobile: true,\n },\n {\n icon: ,\n text:\n 'Click Pan to pan. Click and hold the left mouse button and drag the scene in the direction you want to move it. You can also pan by using the arrow keys on the keyboard.',\n viewInMobile: false,\n },\n {\n icon: ,\n text: 'Click and hold the left mouse button and drag the scene in the direction you want to rotate and tilt it.',\n viewInMobile: false,\n },\n {\n icon: ,\n text:\n 'You can also use your mouse and scroll wheel to zoom in and zoom out, or press and hold the middle mouse button and move down or up to zoom in or out.',\n viewInMobile: false,\n },\n {\n icon: ,\n text:\n 'If you have a two-button mouse, you can use the left mouse button for the primary navigation and the right mouse button for the secondary navigation. For example, if you click Rotate, you can use the left mouse button to rotate and the right mouse button to pan.',\n viewInMobile: false,\n },\n {\n icon: ,\n text:\n 'If you have a touch screen laptop or monitor, pinch zoom with two fingers and pan with one finger. You can also double-tap the scene to zoom in a step towards the tapped location. To rotate the scene, move two fingers in a clockwise or counterclockwise direction. To tilt the scene, drag two fingers up or down the screen.',\n viewInMobile: true,\n },\n {\n icon: ,\n text: 'The compass gives you the orientation of the scene. Click Compass to set your scene to North orientation.',\n viewInMobile: true,\n },\n];\n\nconst NavigationModal = () => {\n const dispatch = useDispatch();\n const mobile = useSelector(mobileState);\n const displayNavigation = useSelector(displayNavigationState);\n\n const closeModal = () => {\n dispatch(setDisplayNavigation(false));\n };\n\n const filterInstructions = (instruction) => {\n return mobile || instruction.viewInMobile;\n };\n\n return (\n \n 3D Scene Navigation\n \n \n {instructions.filter(filterInstructions).map((instruction) => (\n \n {instruction.icon}\n \n \n ))}\n \n \n \n \n Got it\n \n \n \n );\n};\n\nexport default NavigationModal;\n","import Dialog from 'material-ui/Dialog';\nimport Button from '@material-ui/core/Button';\nimport { materialStyle } from '../../../style/material';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { displayDisclaimerState, setDisplayDisclaimer } from '../../../store/slices/appSlice';\n\nconst DisclaimerModal = () => {\n const dispatch = useDispatch();\n const displayDisclaimer = useSelector(displayDisclaimerState);\n\n const closeModal = () => {\n dispatch(setDisplayDisclaimer(false));\n };\n\n return (\n \n Got it\n ,\n ]}\n open={displayDisclaimer}\n title='Disclaimer'\n titleStyle={{\n ...materialStyle.dialog,\n ...materialStyle.dialogTitleNavigation,\n color: 'black',\n }}\n bodyStyle={materialStyle.dialog}\n actionsContainerStyle={materialStyle.dialog}\n autoScrollBodyContent={true}\n >\n While DCOZ is committed to providing accurate and timely zoning information via the 3D Zoning App, DCOZ cannot\n guarantee the quality, content, accuracy, or completeness of the information, text, graphics, links, and other\n items contained therein. All data visualizations on the 3D Zoning App should be considered approximate.\n Information provided in the zoning map should not be used as a substitute for legal, accounting, real estate,\n business, tax, or other professional advice. DCOZ assumes no liability for any errors, omissions, or inaccuracies\n in the information provided regardless of the cause of such or for any upon any decision made, action taken, or\n action not taken by the user in reliance upon any maps or information provided herein. DCOZ retains the right to\n change any content on its zoning map without prior notice.\n \n );\n};\n\nexport default DisclaimerModal;\n","import { materialStyle } from '../../../style/material';\nimport Dialog from 'material-ui/Dialog';\nimport { List, ListItem } from 'material-ui/List';\nimport Button from '@material-ui/core/Button';\nimport Circle from 'material-ui/svg-icons/image/lens';\nimport { displayUploadHelpState, setDisplayUploadHelp } from '../../../store/slices/appSlice';\nimport { useDispatch, useSelector } from 'react-redux';\n\nconst UploadHelpModal = () => {\n const dispatch = useDispatch();\n const displayUploadHelp = useSelector(displayUploadHelpState);\n\n const closeModal = () => {\n dispatch(setDisplayUploadHelp(false));\n };\n\n return (\n \n Got it\n ,\n ]}\n title='3D Upload Help'\n titleStyle={{\n ...materialStyle.dialog,\n ...materialStyle.dialogTitleNavigation,\n }}\n bodyStyle={materialStyle.dialog}\n actionsContainerStyle={materialStyle.dialog}\n autoScrollBodyContent={true}\n >\n

Want to see how your building design looks next to its neighbors, including height and shadow analysis?

\n

Upload your KMZ file to this tool, but please note the following:

\n \n }>\n The file must be properly referenced for a location in Washington, DC\n \n }>\n The file must be under 15MB\n \n }>\n File sizes over 5MB may take longer to process\n \n \n

\n Please allow up to 5 minutes for larger file sizes to process. We are working on improvement to file upload\n speeds and expanded file upload types. Please check back for updates.\n

\n \n );\n};\n\nexport default UploadHelpModal;\n","import { materialStyle } from '../../../style/material';\nimport React from 'react';\nimport Dialog from 'material-ui/Dialog';\nimport RaisedButton from 'material-ui/RaisedButton';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { displayZoningStandardState, toggleZoningStandard } from '../../../store/slices/appSlice';\n\nconst ZoningStandardsModal = () => {\n const dispatch = useDispatch();\n const displayZoningStandard = useSelector(displayZoningStandardState);\n\n const closeModal = () => {\n dispatch(toggleZoningStandard(false));\n };\n\n return (\n ,\n ]}\n title='Zoning Development Standards Disclaimer'\n titleStyle={{\n ...materialStyle.dialog,\n ...materialStyle.dialogTitleNavigation,\n }}\n bodyStyle={materialStyle.dialog}\n actionsContainerStyle={materialStyle.dialog}\n autoScrollBodyContent={true}\n >\n

\n Zoning Development Standards represent the most common development standards for a particular zone. For more\n detailed height, yard, and set back requirements, please consult the{' '}\n \n Zoning Handbook\n \n .\n

\n \n );\n};\n\nexport default ZoningStandardsModal;\n","import { Hints } from 'intro.js-react';\nimport 'intro.js/introjs.css';\nimport { helpSteps } from '../config';\nimport { useSelector } from 'react-redux';\nimport { enableHelpState } from '../../store/slices/appSlice';\n\nconst InteractiveHelp = () => {\n const enableHelp = useSelector(enableHelpState);\n\n return (\n \n );\n};\n\nexport default InteractiveHelp;\n","import { Steps } from 'intro.js-react';\nimport 'intro.js/introjs.css';\nimport { helpSteps, mobileHelpSteps } from '../config';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { enableIntroState, mobileState, setEnableIntro } from '../../store/slices/appSlice';\n\nconst InteractiveHelp = () => {\n const dispatch = useDispatch();\n const mobile = useSelector(mobileState);\n const enableIntro = useSelector(enableIntroState);\n const steps = mobile ? mobileHelpSteps : helpSteps;\n\n const removeClasses = () => {\n const elems = document.getElementsByClassName('introjs-donebutton');\n if (elems[0]) {\n elems[0].classList = 'introjs-button';\n }\n };\n\n return (\n dispatch(setEnableIntro(false))}\n />\n );\n};\n\nexport default InteractiveHelp;\n","import { useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport ReactGA from 'react-ga4';\nimport MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';\nimport getMuiTheme from 'material-ui/styles/getMuiTheme';\nimport { defaultTheme } from '../../style/theme';\nimport { materialStyle } from '../../style/material';\n\nimport MapView from './MapView';\nimport SitePanel from './SitePanel';\nimport LayersPanel from './LayersPanel';\n\nimport Logo from './Logo';\n\nimport WelcomeModal from './modals/WelcomeModal/WelcomeModal';\nimport NavigationModal from './modals/NavigationModal';\nimport DisclaimerModal from './modals/DisclaimerModal';\nimport UploadHelpModal from './modals/UploadHelpModal';\nimport ZoningStandardsModal from './modals/ZoningStandardsModal';\nimport InteractiveHelp from './InteractiveHelp';\nimport InteractiveIntro from './InteractiveIntro';\nimport '../../css/_esri.scss';\nimport '../../css/_layout.scss';\nimport '../../css/introjs.scss';\nimport { GOOGLE_ANALYTICS_ID } from '../config';\n\nReactGA.initialize(GOOGLE_ANALYTICS_ID, { testMode: process.env.NODE_ENV !== 'production' });\n\nconst App = () => {\n const dispatch = useDispatch();\n\n useEffect(() => {\n ReactGA.send('pageview');\n }, []);\n\n return (\n \n
\n \n \n \n \n \n\n \n \n \n \n\n \n \n
\n
\n );\n};\n\nexport default App;\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.scss';\nimport App from './js/components/App';\nimport reportWebVitals from './reportWebVitals';\nimport { Provider } from 'react-redux';\nimport store from './store/index';\nimport { StylesProvider } from '@material-ui/core/styles';\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n","module.exports = [\n {\n id: 'dark-gray-vector',\n title: 'Dark Gray',\n thumbnail:\n 'https://www.arcgis.com/sharing/rest/content/items/25869b8718c0419db87dad07de5b02d8/info/thumbnail/DGCanvasBase.png',\n },\n {\n id: 'topo-vector',\n title: 'Topographic',\n thumbnail:\n 'https://www.arcgis.com/sharing/rest/content/items/6e03e8c26aad4b9c92a87c1063ddb0e3/info/thumbnail/topo_map_2.jpg',\n },\n {\n id: 'osm',\n title: 'Open Street Map',\n thumbnail:\n 'https://www.arcgis.com/sharing/rest/content/items/5d2bfa736f8448b3a1708e1f6be23eed/info/thumbnail/temposm.jpg',\n },\n {\n id: 'dcBasemap',\n title: 'DC Basemap',\n thumbnail:\n 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/DC_Basemap_WebMercator/MapServer/info/Thumbnail',\n layerOptions: {\n type: 'dynamic',\n options: {\n id: 'dcBasemap',\n title: 'DC Basemap',\n visible: true,\n imageFormat: 'png32',\n url: 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/DC_Basemap_WebMercator/MapServer',\n sublayers: [\n {\n id: 0,\n visible: true,\n },\n ],\n },\n },\n },\n {\n id: 'dcOrtho',\n title: 'DC Ortho',\n thumbnail:\n 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/Ortho2015_WebMercator/MapServer/info/Thumbnail',\n layerOptions: {\n type: 'dynamic',\n options: {\n id: 'dcOrtho',\n title: 'DC Ortho',\n visible: true,\n imageFormat: 'png32',\n url: 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/Ortho2015_WebMercator/MapServer',\n sublayers: [\n {\n id: 0,\n visible: true,\n },\n ],\n },\n },\n },\n {\n id: 'dcBasemapLightGray',\n title: 'DC Basemap (Light Gray)',\n thumbnail:\n 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/DC_Basemap_LightGray_WebMercator/MapServer/info/Thumbnail',\n layerOptions: {\n type: 'dynamic',\n options: {\n id: 'dcBasemapLightGray',\n title: 'DC Basemap (Light Gray)',\n visible: true,\n imageFormat: 'png32',\n url: 'https://maps2.dcgis.dc.gov/dcgis/rest/services/DCGIS_DATA/DC_Basemap_LightGray_WebMercator/MapServer',\n sublayers: [\n {\n id: 0,\n visible: true,\n },\n ],\n },\n },\n },\n];\n","module.exports = {\n mapView: {\n ui: {\n components: [\n 'logo',\n 'attribution'\n ]\n },\n center: [-77.0380427, 38.8993277],\n zoom: 14,\n constraints: { snapToZoom: false }\n },\n sceneView: {\n ui: {\n components: [\n 'attribution'\n ]\n },\n center: [-77.0380427, 38.8993277],\n zoom: 14,\n environment: {\n lighting: {\n date: new Date(),\n directShadowsEnabled: true,\n cameraTrackingEnabled: false\n },\n atmosphere: {\n quality: 'high'\n }\n },\n highlightOptions: {\n color: [244, 66, 241],\n fillOpacity: 0.6,\n haloOpacity: 1\n }\n }\n}","module.exports = [\n {\n element: '#ToolbarGroupID',\n intro: '

Zoning Categories

Turn on or off different zoning catagories for any property.',\n hint: '

Zoning Categories

Turn on or off different zoning catagories for any property.',\n tooltipClass: 'intro-tooltip-layers',\n position: 'bottom-middle-aligned'\n },\n {\n element: '#search-test',\n intro: '

Search

Search for location specific zoning information. You can choose what you want to see on the map to tailor your results.',\n hint: '

Search

Search for location specific zoning information. You can choose what you want to see on the map to tailor your results.',\n position: 'bottom',\n tooltipClass: 'intro-tooltip-search'\n },\n {\n element: '#submit',\n intro: '

Add a building

Upload your KMZ file and visualize your model building within any given space.',\n hint: '

Add a building

Upload your KMZ file and visualize your model building within any given space.',\n position: 'bottom',\n tooltipClass: 'intro-tooltip-submit'\n },\n {\n element: '#light',\n intro: '

Light Study

Day or night, pick the best time to view the map. You can even simulate light and shadow movements throughout the day.',\n hint: '

Light Study

Day or night, pick the best time to view the map. You can even simulate light and shadow movements throughout the day.',\n position: 'top',\n tooltipClass: 'intro-tooltip-light'\n },\n {\n element: '#compare',\n intro: '

View Before & After

Compare new additions side-by-side with an existing layout when you upload a 3D file.',\n hint: '

View Before & After

Compare new additions side-by-side with an existing layout when you upload a 3D file.',\n position: 'top',\n tooltipClass: 'intro-tooltip-compare'\n },\n {\n element: '#help',\n intro: '

Help

Ever have a question or a problem? Click Help to find your answers.',\n hint: '

Help

Ever have a question or a problem? Click Help to find your answers.',\n position: 'top',\n tooltipClass: 'intro-tooltip-help'\n }\n];\n","module.exports = [\n {\n element: '#expand-site-mobile',\n intro: '

Zoning Categories

Turn on or off different zoning catagories for any property.',\n hint: '

Zoning Categories

Turn on or off different zoning catagories for any property.',\n tooltipClass: 'intro-tooltip-mobile-layers',\n position: 'bottom-middle-aligned'\n },\n {\n element: '#search',\n intro: '

Search

Search for location specific zoning information. You can choose what you want to see on the map to tailor your results.',\n hint: '

Search

Search for location specific zoning information. You can choose what you want to see on the map to tailor your results.',\n position: 'bottom',\n tooltipClass: 'intro-tooltip-search'\n }\n];\n"],"sourceRoot":""}