{"version":3,"sources":["store/WeatherForecasts.ts","store/index.ts","store/Counter.ts","components/ButtonAppBarCollapse.jsx","components/AppBarCollapse.jsx","components/NavMenu.jsx","components/Layout.jsx","components/BasicTable.jsx","components/PriceHistoryPopup.jsx","components/CrimePopup.jsx","theme.jsx","lib/Spiderify.jsx","components/hooks/useWindowDimensions.jsx","components/MapBox.jsx","components/QueryController.js","components/property/ProductView.jsx","components/ProductQuery.jsx","components/SimpleBackdrop.jsx","components/layout/SideView.jsx","components/layout/TopView.jsx","components/layout/BottomNav.jsx","components/myswiper/effect-carousel.esm.js","components/ResponsiveImage.jsx","components/myswiper/ProductTile.jsx","components/myswiper/SwiperV.jsx","components/PropSwiper.jsx","components/MapLayerDial.jsx","components/FadeModal.jsx","components/reusable/histoslider/components.jsx","components/reusable/histoslider/BarChart2.jsx","components/reusable/histoslider/HistoSlider2.jsx","components/filters/PriceSlider.jsx","components/filters/BedroomSlider.jsx","components/filters/BathroomSlider.jsx","components/filters/SqFtSlider.jsx","components/filters/AcreageSlider.jsx","components/filters/CrimeSlider.jsx","components/filters/DeprivationSlider.jsx","components/filters/PriceSqFtSlider.jsx","components/filters/RoomCntSlider.jsx","components/filters/BroadbandSpeedSlider.jsx","components/filters/SchoolFilter.jsx","components/reusable/BasicMultiSelect.jsx","components/filters/RecreationSelect.jsx","components/filters/FloodingSelect.jsx","components/filters/SubsidenceSelect.jsx","components/filters/NearbyAmenitiesFilter.jsx","components/filters/MainFilter.jsx","components/SchoolView.jsx","components/layercontrols/GradientBar.jsx","components/layercontrols/PriceHistoryControl.jsx","components/layercontrols/CrimeControl.jsx","components/layercontrols/SchoolsControl.jsx","components/layout/MobileSelector.jsx","components/layout/RightDrawer.jsx","components/layout/BottomSwipeableDrawer.jsx","components/layout/BottomSheetMobile.jsx","components/MiAccordion.jsx","components/swiperThumbs/swiperthumb.jsx","components/property/ProductHeader.jsx","components/property/DescriptionAndKey.jsx","components/reusable/KeyValue.jsx","components/reusable/IfThen.jsx","components/reusable/IfNullOrEmpty.jsx","components/property/HeroData.jsx","components/property/ProductSummary.jsx","components/property/SchoolDetail.jsx","components/NestedTable.jsx","components/property/CrimeDetail.jsx","components/property/AmenityDetail.jsx","components/property/DemographicDetail.jsx","components/property/AreaSummary.jsx","components/property/Neighbourhood.jsx","components/property/TabPanels.jsx","components/property/PropertyTabBar.jsx","components/layout/MainView.jsx","App.tsx","registerServiceWorker.ts","index.tsx","store/configureStore.ts"],"names":["unloadedState","forecasts","isLoading","reducers","counter","reducer","state","incomingAction","undefined","count","type","weatherForecasts","action","startDateIndex","withStyles","theme","buttonCollapse","breakpoints","up","display","margin","boxShadow","props","anchorEl","setAnchorEl","useState","open","Boolean","_jsxs","className","classes","children","_jsx","IconButton","onClick","e","currentTarget","HomeIcon","style","color","Menu","id","anchorOrigin","vertical","horizontal","transformOrigin","onClose","handleClose","root","position","right","buttonBar","down","paddingLeft","width","background","ButtonAppBarCollapse","Link","to","MenuItem","target","rel","Button","useStyles","makeStyles","flexGrow","grow","menuButton","marginLeft","marginRight","navigation","toggleDrawer","appTitle","toolBar","minHeight","NavMenu","AppBar","elevation","Toolbar","Typography","AppBarCollapse","Layout","_ref","isFilterOpen","setIsFilterOpen","height","flexFlow","flex","Container","overflow","memo","BasicTable","header","data","rows","setRows","headerData","setHeaderData","useEffect","length","tHeader","TableHead","TableRow","map","a","TableCell","console","log","Paper","TableContainer","component","Table","size","TableBody","row","i","col","scope","PriceHistoryPopup","agg","split","filter","address","replace","price","sqft","freehold","rooms","constructionage","date","columns","field","headerName","tabDataTemp","ChartJS","register","ArcElement","Tooltip","Legend","GetVal","prefix","sum","forEach","y","CrimePopup","x","name","value","raw","n","labels","datasets","label","backgroundColor","borderColor","borderWidth","Pie","options","responsive","plugins","tooltip","callbacks","d","legend","font","createTheme","values","xs","sm","md","lg","xl","phone","shadows","palette","default","primary","main","secondary","datavis","mapicons","alt","altBackground","overrides","MapboxglSpiderifier","mapboxgl","userOptions","React","util","each","eachFn","array","iterator","result","item","push","mapTimes","eachTimesFn","eachTimes","NULL_FUNCTION","animate","animationSpeed","customPin","initializeLeg","onUnclick","circleSpiralSwitchover","circleFootSeparation","spiralFootSeparation","spiralLengthStart","spiralLengthFactor","pinRadius","twoPi","Math","PI","previousSpiderLegs","attrname","unspiderfy","reverse","spiderLeg","index","elements","container","setTimeout","mapboxMarker","remove","createMarkerElements","spiderLegParam","feature","containerElem","document","createElement","pinElem","lineElem","innerHTML","priceStr","appendChild","isNullLeg","legLength","transform","angle","line","pin","this","spiderfy","latLng","features","marker","spiderLegs","spiderLegParams","pt","cos","sin","generateSpiralParams","circumference","angleStep","generateCircleParams","Marker","setLngLat","param","onclick","nullFeature","element","stopPropagation","centralPoint","addTo","callback","getCurrentLegs","getWindowDimensions","innerWidth","innerHeight","window","useWindowDimensions","windowDimensions","setWindowDimensions","handleResize","addEventListener","removeEventListener","Object","assign","globalThis","pip","maplibregl","workerClass","MapWorker","accessToken","MapBox","lng","setLng","lat","setLat","zoom","setZoom","bounds","setBounds","setData","setPropertyMarkerClicked","poly","crimes","schools","toggleFly","satView","productData","setClusterPoints","activePropertyCoords","setActivePropertyCoords","showHistoricPrices","showCrime","yearCrimeFilter","yearHistPriceFilter","priceDiffMode","showSchools","schoolsFilter","demographicsFilter","setPropertyCardClicked","showProps","setSelectedSchool","mapContainer","useRef","setMap","lastHash","setLastHash","init","setInit","spider","activeMarker","setActiveMarkerX","useTheme","crimeFilterRef","debounceTimer","setDebounceTimer","satMode","setSatMode","current","getLayer","removeLayer","getSource","removeSource","setLayoutProperty","addSource","sources","addLayer","layers","setActiveMarker","getElement","selectedId","lon2tile","lon","floor","pow","lat2tile","tan","renderPriceHist","isSourceLoaded","extraLng","_ne","_sw","extraLat","bnd","multiplier","dis","hexPolys","hexgrid","units","hexLookup","hx","geometry","coordinates","some","allowedYears","minYear","min","maxYear","max","gtrFil","yearFields","numFilter","setFilter","Date","getTime","priceDataPoints","querySourceFeatures","sourceLayer","fail","oob","firstTry","adjustment","f","inbounds","fLon","fLat","tile","hexLookupBin","pointInPolygon","p","properties","includes","year","point_count","Number","growth","cntmax","cntmin","cnt","denom","newAvg","centroids","point","centroid","maxAvg","minAvg","round","fc","src","emptySource","renderSchools","schoolPoints","schoolPolys","CatchmentMedProbMetres","center","radius","steps","Id","circlePoly","circle","schoolDataPoints","val","tot","pts","renderCrime","wcntFields","cntFields","text","crimeDataPoints","wcnt","additions","reduce","b","wcntScale","debounce","method","delayMs","clearTimeout","t","server","currentLegs","targetIsSpidered","selectedSpiderNode","iLoc","every","coords","project","queryRenderedFeatures","propArr","JSON","parse","collection","marginTop","placeholder","innerPlaceholder","emptySourceGeoJson","geojson","pol","String","Location","Longitude","Latitude","LocationDescription","Types","geojsonCatchments","CatchmentMetresMed","SchoolId","circleFeature","pointFeature","SchoolType","OfstedRatingString","PercentCapacity","SchoolSize","SchoolName","Sex","Denomination","Structure","loc","flyTo","padding","left","speed","longitude","latitude","clusterSource","cluster","clusterProperties","clusterRadius","clusterMaxZoom","AddLayers","oldHash","hash","isItemResult","mapLocal","source","paint","textAllowOverlap","layout","initMap","_ref2","Map","dark","maxBounds","markerWidth","markerHeight","on","getBounds","loadImage","error","image","addImage","popup","Popup","closeButton","closeOnClick","getCanvas","cursor","slice","crimetype","crimetypes","dataState","month","Name","TotalCount","tbl","ThemeProvider","ReactDOM","render","abs","lngLat","setDOMContent","setFeatureState","vis","offsted","schoolType","structure","tblData","capcity","sex","denomination","dom","Box","variant","getClusterExpansionZoom","clusterId","err","zoomX","targZoom","getZoom","toFixed","easeTo","duration","cluster_id","bbox","event","popupX","setPaintProperty","SetupMouseOver","detailLayer","Array","isArray","uniqueIds","Set","clusteredPoints","has","add","propData","j","propDataArr","SetClusterData","getCenter","scrollZoom","setWheelZoomRate","setZoomRate","ref","QueryController","filterTerms","timer","setTimer","GeoNormalizer","neLat","swLat","neLng","swLng","latDiff","lngDiff","latMag","LN10","lngMag","stepLat","stepLng","sigN","s","ceil","nsAdjust","sigS","w","sigW","rtn","payload","LatN","LatS","LonE","LonW","Zoom","FilterTerms","from","url","location","host","fetch","headers","redirect","body","stringify","then","resp","status","json","paper","ProductView","tabHeader","tabPanels","useProductQuery","product","setProduct","thing","backdrop","zIndex","drawer","SimpleBackdrop","Backdrop","CircularProgress","spacing","hide","flexShrink","drawerPaper","maxWidth","top","pointerEvents","spacer","visRight","visBottom","SideView","setOpen","setSideViewWidth","observer","ResizeObserver","entries","entry","contentRect","observe","disconnect","_Fragment","SwipeableDrawer","anchor","onOpen","swipeAreaWidth","PaperProps","sx","paddingBottom","Drawer","justifyContent","borderBottom","drawerHeader","alignItems","mixins","toolbar","TopView","Grid","direction","border","minWidth","BottomNav","forwardRef","CarouselSlider","swiper","params","effect","classNames","containerModifierClass","overwriteParams","watchSlidesProgress","centeredSlides","originalParams","zIndexMax","slides","slideEl","slideProgress","progress","absProgress","modify","opacityEls","querySelectorAll","translate","rtlTranslate","scale","opacity","opacityEl","transitionDuration","ResponsiveImage","fp","sizes","eager","isLoaded","setIsLoaded","makeSrcSet","format","onLoad","visibility","maxHeight","aspectRatio","objectFit","loading","srcSet","ProductTile","idx","setClicked","swip","activeIndex","clickedIndex","slideNext","slidePrev","images","MediaQuery","toLocaleString","bedrooms","bathrooms","sqFt","postCode","SwiperV","setSelectedPropId","propertyMarkerClicked","productOpen","setSwiper","lastActiveSlide","virtualData","setVirtualData","setActiveSlide","vData","activeIdx","findIndex","swiperRealIndex","realIndex","idxShift","dataIdx","dataItm","swiperParameters","modules","A11y","Mousewheel","EffectCarousel","slidesPerView","spaceBetween","lazy","enabled","loop","threshold","mousewheel","onSlideChange","onSlideNextTransitionStart","slideId","newDataIdx","newData","onSlidePrevTransitionStart","Swiper","destroyed","onInit","ev","SwiperSlide","bottom","PropSwiper","clusterPoints","setPropertyCardActive","latlon","setPropData","selectedPropId","getDistanceFromLatLonInKm","lat1","lon1","lat2","lon2","dLat","deg2rad","dLon","atan2","sqrt","deg","compare","latA","latB","latT","lonA","lonB","lonT","tData","concat","flatMap","sort","clusterResult","cords","propValue","find","propResult","activePropCoords","serverCluster","MapLayerDial","layerSetters","setShowSchools","setShowCrime","setShowHistoricPrices","setSatView","setShowProps","actions","icon","SatelliteAltIcon","click","handleSat","active","SchoolIcon","handleSchool","SecurityIcon","handleCrime","CurrencyPoundIcon","handlePrice","handleProps","SpeedDial","ariaLabel","LayersIcon","handleOpen","SpeedDialAction","tooltipTitle","tooltipOpen","tooltipPlacement","FabProps","modal","marginBottom","flexDirection","borderRadius","flexy","flexy0","footer","borderTop","overflowY","button","whiteSpace","blkColor","fontWeight","FadeModal","heading","restrict","setRestrict","Modal","keepMounted","BackdropComponent","disableRestoreFocus","BackdropProps","timeout","Slide","in","CancelIcon","align","Switch","checked","onChange","square","info","thumbHeight","MuiRail","rail","grey","railHotspot","getRailProps","Fragment","MuiHandle","content","domain","handle","percent","getHandleProps","role","track","trackHotspot","_ref3","getTrackProps","MuiTickComponent","_ref4","tick","defaultProps","textAlign","BarChart2","highlight","isRange","suffix","renderFactor","barData","setBarData","formatLabel","toString","dataSource","dataNoTail","normPrefix","normSuffix","bar","v","hoverBackgroundColor","Bar","maintainAspectRatio","animation","scales","HistoSlider2","setOutValue","leftLabel","rightLabel","setState","lookup","setLookup","setValue","renderedValue","setRenderedValue","normalized","start","end","endSuffix","endButOne","NumberFormatCustom","inputRef","other","NumberFormat","getInputRef","onValueChange","thousandSeparator","isNumericString","SetValueToNearestRendered","renderedVal","isFrom","parseInt","closestLower","closestUpper","paddingRight","Slider","mode","step","rootStyle","onUpdate","update","Rail","Handles","handles","TextField","fullWidth","disabled","evt","InputProps","inputComponent","PriceSlider","filterData","priceState","setPriceState","outValue","outValRef","exclusionFilters","priceData","tPrices","pd","f1","f2","newFilter","displayText","filters","BedroomSlider","bedroomState","setBedroomState","bedroomData","tBeds","highest","BathroomSlider","SqFtSlider","AcreageSlider","temp","CrimeSlider","DeprivationSlider","PriceSqftSlider","RoomCntSlider","BroadbandSlider","SchoolFilter","catchments","dataT","any","good","outstanding","none","handleChange","RadioGroup","FormControlLabel","control","Radio","CheckBoxOutlineBlankIcon","CheckBoxIcon","formControl","chips","flexWrap","chip","noLabel","fontSize","FloodingSelect","boxes","setBoxes","NoRisk","Medium","Low","VeryLow","High","rtnArr","makeFilter","getText","selector","FormGroup","Checkbox","SubsidenceSelect","data2030","setData2030","data2070","setData2070","risk2070","setRisk2070","Improbable","Possible","Probable","Unavailable","risk2030","setRisk2030","data2030Raw","data2070Raw","dataT2030","dataT2070","handleChange2030","handleChange2070","render2030","render2070","tags","buckets","textOverflow","lineHeight","NearbyAmenitiesFilter","selectedFields","setSelectedFields","autoValue","setAutoValue","autoRef","Autocomplete","disablePortal","blurOnSelect","newValue","onAutocompleteChange","renderInput","FormControl","InputLabel","NativeSelect","inputProps","onDistanceChange","MainFilter","setFilterTerms","setCnt","c","PriceSqFtSlider","tabPan","SchoolView","schoolData","setSchoolData","ChevronRightIcon","href","priceHistoryStops","crimeStops","priceDiffStops","barWidth","barHeight","GradientBar","gradientStops","setGradientStops","barStyle","setBarStyle","gradientString","stop","join","ackground","verticalAlign","paddingTop","PriceHistoryControl","visible","statePriceDiffMode","sliderValue","setSliderValue","sliderValues","setSliderValues","singleYearMode","setSingleYearMode","setPriceDiffMode","_","marks","marksDiff","valueLabelDisplay","getAriaValueText","newValues","CrimeControl","schoolLayers","demographics","SchoolsControl","schoolsState","demographicsState","setSchoolsFilter","setDemographicsFilter","htmlFor","defaultValue","MobileSelector","mobileComponent","desktopComponent","RightDrawer","BottomSheetMobile","triggerHalfOpen","sheetRef","snapTo","BottomSheet","blocking","onDismiss","snapPoints","defaultSnap","lastSnap","typography","pxToRem","fontWeightRegular","MiAccordion","contentArray","startExpanded","expanded","setExpanded","Accordion","panel","isExpanded","AccordionSummary","expandIcon","ExpandMoreIcon","AccordionDetails","SwiperThumb","thumbsSwiper","setThumbsSwiper","setImages","arr","pushToSecond","z","Images","FloorplanImages","thumbs","pagination","FreeMode","Navigation","Thumbs","Pagination","targ","currentSrc","clickImage","float","onSwiper","autoHeight","freeMode","ProductHeader","smallestHeight","setSmallestHeight","gutterBottom","Price","Title","DescriptionAndKey","createData","rowsData","FloodRisk","SubsidenceRisk2030","SubsidenceRisk2070","RoomsCnt","deprivationEngland","IndexMultipleDeprivation","depPercentile","depPercRound","KeyValue","keyx","Icon","adjustCase","setVal","charAt","toUpperCase","substring","toLowerCase","Stack","IfThen","condition","IfNullOrEmpty","trim","HeroData","propType","setPropType","urbanClass","setUrbanClass","broadband","setbroadband","cleanPropType","prop","cleanEpc","EpcData","CurrentEnergyRating","Broadbandcoverage","maxPredictedDown","PropType","BuiltForm","RuralUrbanClassification","str","IsSparse","Bedrooms","Bathrooms","SqFtParsed","PricePerSqFoot","Tenure","MaxBroadbandSpeed","OwnershipType","BedOutlinedIcon","BathtubOutlinedIcon","fromCharCode","SquareFootOutlinedIcon","CurrencyPoundOutlinedIcon","KeyOutlinedIcon","HomeWorkOutlinedIcon","EnergySavingsLeafOutlinedIcon","NetworkCheckOutlinedIcon","PlotAcres","LocationAccurate","cleanLand","FenceOutlinedIcon","LocationCityOutlinedIcon","IsPublicNotice","BalanceIcon","IsAuction","GavelOutlinedIcon","IsNewBuild","ConstructionOutlinedIcon","IsExLocalAuthority","AccountBalanceOutlinedIcon","IsNationalPark","ParkOutlinedIcon","Retirement","ElderlyIcon","cleanOwnership","PieChartIcon","ProductSummary","accordionContent","setAccordionContent","aContent","dangerouslySetInnerHTML","__html","Text","distStr","num","schoolSizeMax","re","RegExp","match","exec","groups","SchoolDetail","hideCatchment","setHideCatchment","hideIndependent","setHideIndependent","hideReligious","setHideReligious","schoolDataP","setSchoolDataP","headerDataP","setHeaderDataP","schoolDataS","setSchoolDataS","headerDataS","setHeaderDataS","Schools","headersS","schoolsP","schoolsS","DistanceInMetres","SchoolTypeSimple","ClassSizeAvgPrimary","KS2PercentExpectedStandard","KS2PercentHigherStandard","classSizeAvgSecondary","KS4Progress8","KS4Attainment8","KS5Best3AverageGrade","useRowStyles","NestedRow","subRows","subHeaderData","KeyboardArrowUpIcon","KeyboardArrowDownIcon","colSpan","Collapse","unmountOnExit","subRow","si","subcol","NestedTable","subHeader","subData","setSubRows","setSubHeaderData","CrimeDetail","crimeState","setCrimeState","crimeSubState","setCrimeSubState","seriousCrime","crimeCounts","setCrimeCounts","tCnts","CrimeCounts","tCrime","tSubCrime","Crime","DistanceM","sCnt","tSubRow","TimeBreakdown","k","NearestHelper","Distance","Tags","brand","religion","amenity","shop","healthcare","tourism","leisure","railway","highway","public_transport","AmenityDetail","places","setPlaces","PlacesOfInterest","NearestBarsAndRest","NearestSupermarkets","NearestGroceries","NearestGeneralShops","NearestTrains","NearestBus","NearestReligious","NearestMedical","NearestLeisure","NearestTourism","NearestHotels","NearestAirport","keys","DemographicDetail","someState","setSomeState","AreaSummary","setDataState","dState","OaClassificationName","SoaClassificationName","WorkplaceClassificationName","LocalAuthorityClassificationName","PercentQualifications4OrAbove","Neighbourhood","TabPanels","TabPanel","hidden","dir","JSONPretty","PropertyTabBar","setTriggerHalfOpen","a11yProps","Tabs","centered","Tab","GpsFixedIcon","fab","fabCont","MainView","showFilters","setShowFilters","propertyCardClicked","propertyCardActive","setProductOpen","productLoading","setProductLoading","setPoly","setProductData","setCrimes","setSchools","setToggleFly","prevLocation","setPrevLocation","swiperOpen","setSwiperOpen","sideNavRef","bottomNavRef","setYearHistPriceFilter","setYearCrimeFilter","sideViewWidth","selectedSchool","isFullscreen","setIsFullscreen","tabState","setTabState","prevLoc","requestFullscreen","fullscreenElement","exitFullscreen","onFullscreenChange","PolyJson","flyObj","offsetWidth","startIcon","TuneRoundedIcon","App","CssBaseline","Route","exact","path","isLocalhost","hostname","registerValidSW","swUrl","navigator","serviceWorker","registration","onupdatefound","installingWorker","installing","onstatechange","controller","catch","baseUrl","getElementsByTagName","getAttribute","history","createBrowserHistory","basename","store","initialState","middleware","thunk","routerMiddleware","rootReducer","combineReducers","router","connectRouter","enhancers","windowIfDefined","__REDUX_DEVTOOLS_EXTENSION__","createStore","compose","applyMiddleware","configureStore","Provider","ConnectedRouter","getElementById","URL","process","origin","response","contentType","get","indexOf","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.b3741fe6.chunk.js","sourcesContent":["import { Action, Reducer } from 'redux';\r\nimport { AppThunkAction } from './';\r\n\r\n// -----------------\r\n// STATE - This defines the type of data maintained in the Redux store.\r\n\r\nexport interface WeatherForecastsState {\r\n isLoading: boolean;\r\n startDateIndex?: number;\r\n forecasts: WeatherForecast[];\r\n}\r\n\r\nexport interface WeatherForecast {\r\n date: string;\r\n temperatureC: number;\r\n temperatureF: number;\r\n summary: string;\r\n}\r\n\r\n// -----------------\r\n// ACTIONS - These are serializable (hence replayable) descriptions of state transitions.\r\n// They do not themselves have any side-effects; they just describe something that is going to happen.\r\n\r\ninterface RequestWeatherForecastsAction {\r\n type: 'REQUEST_WEATHER_FORECASTS';\r\n startDateIndex: number;\r\n}\r\n\r\ninterface ReceiveWeatherForecastsAction {\r\n type: 'RECEIVE_WEATHER_FORECASTS';\r\n startDateIndex: number;\r\n forecasts: WeatherForecast[];\r\n}\r\n\r\n// Declare a 'discriminated union' type. This guarantees that all references to 'type' properties contain one of the\r\n// declared type strings (and not any other arbitrary string).\r\ntype KnownAction = RequestWeatherForecastsAction | ReceiveWeatherForecastsAction;\r\n\r\n// ----------------\r\n// ACTION CREATORS - These are functions exposed to UI components that will trigger a state transition.\r\n// They don't directly mutate state, but they can have external side-effects (such as loading data).\r\n\r\nexport const actionCreators = {\r\n requestWeatherForecasts: (startDateIndex: number): AppThunkAction => (dispatch, getState) => {\r\n // Only load data if it's something we don't already have (and are not already loading)\r\n const appState = getState();\r\n if (appState && appState.weatherForecasts && startDateIndex !== appState.weatherForecasts.startDateIndex) {\r\n fetch(`weatherforecast`)\r\n .then(response => response.json() as Promise)\r\n .then(data => {\r\n dispatch({ type: 'RECEIVE_WEATHER_FORECASTS', startDateIndex: startDateIndex, forecasts: data });\r\n });\r\n\r\n dispatch({ type: 'REQUEST_WEATHER_FORECASTS', startDateIndex: startDateIndex });\r\n }\r\n }\r\n};\r\n\r\n// ----------------\r\n// REDUCER - For a given state and action, returns the new state. To support time travel, this must not mutate the old state.\r\n\r\nconst unloadedState: WeatherForecastsState = { forecasts: [], isLoading: false };\r\n\r\nexport const reducer: Reducer = (state: WeatherForecastsState | undefined, incomingAction: Action): WeatherForecastsState => {\r\n if (state === undefined) {\r\n return unloadedState;\r\n }\r\n\r\n const action = incomingAction as KnownAction;\r\n switch (action.type) {\r\n case 'REQUEST_WEATHER_FORECASTS':\r\n return {\r\n startDateIndex: action.startDateIndex,\r\n forecasts: state.forecasts,\r\n isLoading: true\r\n };\r\n case 'RECEIVE_WEATHER_FORECASTS':\r\n // Only accept the incoming data if it matches the most recent request. This ensures we correctly\r\n // handle out-of-order responses.\r\n if (action.startDateIndex === state.startDateIndex) {\r\n return {\r\n startDateIndex: action.startDateIndex,\r\n forecasts: action.forecasts,\r\n isLoading: false\r\n };\r\n }\r\n break;\r\n }\r\n\r\n return state;\r\n};\r\n","import * as WeatherForecasts from './WeatherForecasts';\r\nimport * as Counter from './Counter';\r\n\r\n// The top-level state object\r\nexport interface ApplicationState {\r\n counter: Counter.CounterState | undefined;\r\n weatherForecasts: WeatherForecasts.WeatherForecastsState | undefined;\r\n}\r\n\r\n// Whenever an action is dispatched, Redux will update each top-level application state property using\r\n// the reducer with the matching name. It's important that the names match exactly, and that the reducer\r\n// acts on the corresponding ApplicationState property type.\r\nexport const reducers = {\r\n counter: Counter.reducer,\r\n weatherForecasts: WeatherForecasts.reducer\r\n};\r\n\r\n// This type can be used as a hint on action creators so that its 'dispatch' and 'getState' params are\r\n// correctly typed to match your store.\r\nexport interface AppThunkAction {\r\n (dispatch: (action: TAction) => void, getState: () => ApplicationState): void;\r\n}\r\n","import { Action, Reducer } from 'redux';\r\n\r\n// -----------------\r\n// STATE - This defines the type of data maintained in the Redux store.\r\n\r\nexport interface CounterState {\r\n count: number;\r\n}\r\n\r\n// -----------------\r\n// ACTIONS - These are serializable (hence replayable) descriptions of state transitions.\r\n// They do not themselves have any side-effects; they just describe something that is going to happen.\r\n// Use @typeName and isActionType for type detection that works even after serialization/deserialization.\r\n\r\nexport interface IncrementCountAction { type: 'INCREMENT_COUNT' }\r\nexport interface DecrementCountAction { type: 'DECREMENT_COUNT' }\r\n\r\n// Declare a 'discriminated union' type. This guarantees that all references to 'type' properties contain one of the\r\n// declared type strings (and not any other arbitrary string).\r\nexport type KnownAction = IncrementCountAction | DecrementCountAction;\r\n\r\n// ----------------\r\n// ACTION CREATORS - These are functions exposed to UI components that will trigger a state transition.\r\n// They don't directly mutate state, but they can have external side-effects (such as loading data).\r\n\r\nexport const actionCreators = {\r\n increment: () => ({ type: 'INCREMENT_COUNT' } as IncrementCountAction),\r\n decrement: () => ({ type: 'DECREMENT_COUNT' } as DecrementCountAction)\r\n};\r\n\r\n// ----------------\r\n// REDUCER - For a given state and action, returns the new state. To support time travel, this must not mutate the old state.\r\n\r\nexport const reducer: Reducer = (state: CounterState | undefined, incomingAction: Action): CounterState => {\r\n if (state === undefined) {\r\n return { count: 0 };\r\n }\r\n\r\n const action = incomingAction as KnownAction;\r\n switch (action.type) {\r\n case 'INCREMENT_COUNT':\r\n return { count: state.count + 1 };\r\n case 'DECREMENT_COUNT':\r\n return { count: state.count - 1 };\r\n default:\r\n return state;\r\n }\r\n};\r\n","import React, { useState } from \"react\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\nimport { Menu } from \"@material-ui/core\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport HomeIcon from \"@material-ui/icons/Home\";\r\n\r\nconst styles = theme => ({\r\n buttonCollapse: {\r\n [theme.breakpoints.up(\"sm\")]: {\r\n display: \"none\"\r\n },\r\n margin: \"10px\",\r\n boxShadow: \"none\"\r\n }\r\n});\r\n\r\nconst ButtonAppBarCollapse = (props) => {\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n\r\n const handleMenu = (e) => setAnchorEl(() => e.currentTarget);\r\n const handleClose = () => setAnchorEl(() => null);\r\n\r\n const open = Boolean(anchorEl);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n {props.children}\r\n \r\n
\r\n );\r\n\r\n}\r\nexport default withStyles(styles)(ButtonAppBarCollapse);\r\n","/**\r\n * Code from the below medium post, only updated for latest material UI, using a\r\n * Menu for the popup and with breakpoints that work.\r\n *\r\n * https://medium.com/@habibmahbub/create-appbar-material-ui-responsive-like-bootstrap-1a65e8286d6f\r\n */\r\nimport React from \"react\";\r\nimport { Button, MenuItem } from \"@material-ui/core\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\nimport ButtonAppBarCollapse from \"./ButtonAppBarCollapse\";\r\nimport { Link } from 'react-router-dom';\r\n\r\nconst styles = theme => ({\r\n root: {\r\n position: \"absolute\",\r\n right: 0\r\n },\r\n buttonBar: {\r\n [theme.breakpoints.down(\"xs\")]: {\r\n display: \"none\"\r\n },\r\n margin: \"10px\",\r\n paddingLeft: \"16px\",\r\n right: 0,\r\n position: \"relative\",\r\n width: \"100%\",\r\n background: \"transparent\"\r\n }\r\n});\r\n\r\nconst AppBarCollapse = props => (\r\n
\r\n \r\n \r\n Home\r\n \r\n \r\n About\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n);\r\n\r\nexport default withStyles(styles)(AppBarCollapse);\r\n","import React, { useState, memo, useRef } from 'react';\r\nimport './NavMenu.css';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport AppBarCollapse from \"./AppBarCollapse\";\r\n\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1\r\n },\r\n grow: {\r\n flexGrow: 1\r\n },\r\n menuButton: {\r\n marginLeft: -12,\r\n marginRight: 20\r\n },\r\n navigation: {},\r\n toggleDrawer: {},\r\n appTitle: {},\r\n toolBar: {\r\n [theme.breakpoints.up(\"xs\")]: {\r\n minHeight: \"48px\",\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n minHeight: \"32px\",\r\n },\r\n }\r\n}));\r\n\r\nconst NavMenu = (props) => {\r\n const classes = useStyles();\r\n return (\r\n
\r\n \r\n \r\n \r\n PropertyPiper (Alpha)\r\n \r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\n\r\nexport default NavMenu;","import { Container } from 'reactstrap';\r\nimport NavMenu from './NavMenu';\r\nimport React, { useState, memo, useRef } from 'react';\r\n\r\nconst Layout = ({ children }) => {\r\n\r\n const [isFilterOpen, setIsFilterOpen] = useState(false);\r\n\r\n return (\r\n
\r\n \r\n \r\n {children}\r\n \r\n
\r\n );\r\n}\r\n\r\n\r\nexport default memo(Layout);","import React, { useState, memo, useRef, Component, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TableRow from '@material-ui/core/TableRow';\r\n\r\nconst BasicTable = ({ header, data }) => {\r\n\r\n const [rows, setRows] = useState([]);\r\n const [headerData, setHeaderData] = useState(null);\r\n\r\n useEffect(() => {\r\n if (data != null) {\r\n setRows(data);\r\n }\r\n }, [data]);\r\n\r\n useEffect(() => {\r\n if (header != null && header.length > 0) {\r\n let tHeader = (\r\n \r\n \r\n {header.map(a => \r\n ({a})\r\n )}\r\n \r\n \r\n );\r\n setHeaderData(tHeader);\r\n console.log(\"tHeader\", tHeader, header);\r\n }\r\n }, [header]);\r\n\r\n return (\r\n \r\n \r\n \r\n {/**/}\r\n {/* */}\r\n {/* Feature*/}\r\n {/* Value*/}\r\n {/* */}\r\n {/**/}\r\n {headerData}\r\n \r\n {rows.map((row, i) => (\r\n \r\n {row.map((col) => (\r\n {col}\r\n ))}\r\n {/*{row.name}*/}\r\n {/*{row.value}*/}\r\n \r\n ))}\r\n \r\n
\r\n
\r\n\r\n\r\n
\r\n );\r\n}\r\n\r\n\r\nexport default memo(BasicTable);","import React, { memo } from 'react';\r\n//import { DataGrid } from '@mui/x-data-grid';\r\nimport BasicTable from './BasicTable';\r\n\r\nconst PriceHistoryPopup = ({ data }) => {\r\n\r\n let rows = data.agg.split('|').filter(a => a.length>3).map(a => {\r\n let row = a.split(';');\r\n return {\r\n address: `${row[2]}, ${row[3]}, ${data.address}`.replace(\", ,\", \",\").replace(/^(,\\s)+/g, ''),\r\n price: row[0],\r\n sqft: row[4],\r\n type: row[7],\r\n freehold: row[6],\r\n rooms: row[5],\r\n constructionage: row[8],\r\n date: row[1]\r\n };\r\n });\r\n\r\n const columns = [\r\n { field: 'date', headerName: 'Sold Date' },\r\n { field: 'address', headerName: 'Address' },\r\n { field: 'price', headerName: 'Price', type: 'number' },\r\n { field: 'sqft', headerName: 'Square Feet' },\r\n { field: 'type', headerName: 'Type' },\r\n { field: 'freehold', headerName: 'Freehold?' },\r\n { field: 'rooms', headerName: 'Num Major Rooms' },\r\n { field: 'constructionage', headerName: 'Age' }\r\n ];\r\n console.log(\"MEEEP\", data);\r\n let tabDataTemp = rows.map(a => [a.date, a.address, a.price, a.sqft, a.type, a.freehold, a.rooms, a.constructionage]);\r\n let header = [columns[0].headerName, columns[1].headerName, columns[2].headerName, columns[3].headerName, columns[4].headerName, columns[5].headerName, columns[6].headerName, columns[7].headerName];\r\n\r\n return (\r\n );\r\n //
\r\n // {/*\r\n //
);\r\n\r\n\r\n}\r\n\r\n\r\nexport default memo(PriceHistoryPopup);","import React, { memo } from 'react';\r\n//import { DataGrid } from '@mui/x-data-grid';\r\nimport BasicTable from './BasicTable';\r\nimport { Chart as ChartJS, ArcElement, Tooltip, Legend } from 'chart.js';\r\nimport { Pie } from 'react-chartjs-2';\r\n\r\nChartJS.register(ArcElement, Tooltip, Legend);\r\n\r\nconst GetVal = (prefix, data, filter) => {\r\n let sum = 0;\r\n filter.forEach(y => {\r\n sum += data[`${prefix}${y - 2000}`];\r\n });\r\n return sum;\r\n}\r\n\r\nconst CrimePopup = ({ data, filter }) => {\r\n\r\n console.log(data);\r\n console.log(filter);\r\n let x = [\r\n {\r\n name: \"Antisocial Behaviour\",\r\n value: GetVal(\"asb\", data, filter) * 1,\r\n raw: GetVal(\"asb\", data, filter)\r\n },\r\n {\r\n name: \"Burglary\",\r\n value: GetVal(\"b\", data, filter) * 10,\r\n raw: GetVal(\"b\", data, filter) \r\n },\r\n {\r\n name: \"Bicycle Theft\",\r\n value: GetVal(\"bt\", data, filter) * 5,\r\n raw: GetVal(\"bt\", data, filter) \r\n },\r\n {\r\n name: \"Criminal Damage\",\r\n value: GetVal(\"cda\", data, filter) * 3,\r\n raw: GetVal(\"cda\", data, filter) \r\n },\r\n {\r\n name: \"Drugs\",\r\n value: GetVal(\"d\", data, filter) * 5,\r\n raw: GetVal(\"d\", data, filter) \r\n },\r\n {\r\n name: \"Other Crime\",\r\n value: GetVal(\"oc\", data, filter) * 3,\r\n raw: GetVal(\"oc\", data, filter) \r\n },\r\n {\r\n name: \"Public Order\",\r\n value: GetVal(\"po\", data, filter) * 3,\r\n raw: GetVal(\"po\", data, filter) \r\n },\r\n {\r\n name: \"Possession of Weapons\",\r\n value: GetVal(\"pow\", data, filter) * 20,\r\n raw: GetVal(\"pow\", data, filter) \r\n },\r\n {\r\n name: \"Robbery\",\r\n value: GetVal(\"r\", data, filter) * 20,\r\n raw: GetVal(\"r\", data, filter) \r\n },\r\n {\r\n name: \"Shoplifting\",\r\n value: GetVal(\"s\", data, filter) * 3,\r\n raw: GetVal(\"s\", data, filter)\r\n },\r\n {\r\n name: \"Theft From A Person\",\r\n value: GetVal(\"tftp\", data, filter) * 10,\r\n raw: GetVal(\"tftp\", data, filter) \r\n\r\n },\r\n {\r\n name: \"Violence\",\r\n value: GetVal(\"vaso\", data, filter) * 1,\r\n raw: GetVal(\"vaso\", data, filter) \r\n },\r\n {\r\n name: \"Vehicle Crime\",\r\n value: GetVal(\"vc\", data, filter) * 5,\r\n raw: GetVal(\"vc\", data, filter) \r\n },\r\n {\r\n name: \"Other Theft\",\r\n value: GetVal(\"ot\", data, filter) * 1,\r\n raw: GetVal(\"ot\", data, filter)\r\n }\r\n ];\r\n\r\n console.log(x);\r\n\r\n x = x.filter(a => a.value > 0);\r\n\r\n let n = {\r\n labels: x.map(a => `${a.name} (${a.raw})`),\r\n datasets: [\r\n {\r\n label: '# of Votes',\r\n data: x.map(a => a.value),\r\n backgroundColor: [\r\n 'rgba(255, 99, 132, 0.9)',\r\n 'rgba(54, 162, 235, 0.9)',\r\n 'rgba(255, 206, 86, 0.9)',\r\n 'rgba(75, 192, 192, 0.9)',\r\n 'rgba(153, 102, 255, 0.9)',\r\n 'rgba(255, 159, 64, 0.9)',\r\n ],\r\n borderColor: [\r\n 'rgba(255, 99, 132, 1)',\r\n 'rgba(54, 162, 235, 1)',\r\n 'rgba(255, 206, 86, 1)',\r\n 'rgba(75, 192, 192, 1)',\r\n 'rgba(153, 102, 255, 1)',\r\n 'rgba(255, 159, 64, 1)',\r\n ],\r\n borderWidth: 1,\r\n },\r\n ],\r\n };\r\n\r\n var optionsPie = {\r\n responsive: true,\r\n plugins: {\r\n tooltip: {\r\n callbacks: {\r\n label: (d) => {\r\n const percentage = ` ${d.label}, contributes: ${d.raw}`\r\n return percentage\r\n },\r\n },\r\n },\r\n\r\n legend: {\r\n labels: {\r\n // This more specific font property overrides the global property\r\n font: {\r\n size: 12\r\n },\r\n color: \"black\"\r\n }\r\n }\r\n },\r\n };\r\n\r\n return ;\r\n}\r\n\r\n\r\nexport default memo(CrimePopup);","import { createTheme } from '@material-ui/core/styles'\r\nimport purple from '@material-ui/core/colors/purple';\r\nimport green from '@material-ui/core/colors/green';\r\nimport yellow from '@material-ui/core/colors/yellow';\r\nimport cyan from '@material-ui/core/colors/cyan';\r\nimport red from '@material-ui/core/colors/red';\r\nimport grey from '@material-ui/core/colors/grey';\r\nimport amber from '@material-ui/core/colors/amber';\r\nexport const theme = createTheme({\r\n breakpoints: {\r\n values: {\r\n xs: 0,\r\n sm: 600,\r\n md: 960,\r\n lg: 1600,\r\n xl: 1920,\r\n phone: 415,\r\n }\r\n },\r\n shadows: [\"none\"],\r\n palette: {\r\n //theme colors: 132a13 31572c 4f772d 90a955 ecf39e https://coolors.co/palette/132a13-31572c-4f772d-90a955-ecf39e\r\n //type: 'dark'\r\n \r\n background: {\r\n default: \"#4f772d\",\r\n },\r\n primary: {\r\n //main: purple[900],\r\n //main: yellow[700],\r\n //main: cyan[\"A200\"],\r\n main: \"#4f772d\",\r\n },\r\n secondary: {\r\n main: \"#90a955\",\r\n },\r\n datavis: {\r\n //main: grey[200]\r\n main: \"#31572c\"\r\n },\r\n mapicons: {\r\n primary: \"#31572c\",\r\n background: \"#fff\",\r\n alt: \"#4f772d\",\r\n altBackground: \"#ecf39e\"\r\n }\r\n //\"common\": {\r\n // \"black\": \"#000\",\r\n // \"white\": \"#fff\"\r\n //},\r\n //\"background\": {\r\n // \"paper\": \"#fff\",\r\n // \"default\": \"#fafafa\"\r\n //},\r\n //\"primary\": {\r\n // \"light\": \"rgba(89, 210, 188, 1)\",\r\n // \"main\": \"rgba(20, 160, 140, 1)\",\r\n // \"dark\": \"rgba(0, 113, 95, 1)\",\r\n // \"contrastText\": \"#fff\"\r\n //}\r\n\r\n },\r\n overrides: {\r\n //MuiButton: {\r\n // label: {\r\n // color: 'black',\r\n // }\r\n //},\r\n //MuiButton: {\r\n // containedPrimary: {\r\n // color: 'black',\r\n // },\r\n //},\r\n }\r\n});\r\nexport default theme;","//from https://github.com/bewithjonam/mapboxgl-spiderifier -> https://github.com/bewithjonam/mapboxgl-spiderifier/blob/master/index.js\r\n\r\nexport function MapboxglSpiderifier(map, mapboxgl, theme, userOptions, React) {\r\n var util = {\r\n each: eachFn,\r\n map: mapFn,\r\n mapTimes: mapTimesFn,\r\n eachTimes: eachTimesFn\r\n },\r\n NULL_FUNCTION = function () { },\r\n options = {\r\n animate: true, // to animate the spiral\r\n animationSpeed: 100, // animation speed in milliseconds\r\n customPin: false, // If false, sets a default icon for pins in spider legs.\r\n initializeLeg: NULL_FUNCTION,\r\n onClick: NULL_FUNCTION,\r\n onUnclick: NULL_FUNCTION,\r\n // --- \r\n // circleSpiralSwitchover: show spiral instead of circle from this marker count upwards\r\n // 0 -> always spiral; Infinity -> always circle\r\n circleSpiralSwitchover: 20,\r\n circleFootSeparation: 40, // related to circumference of circle\r\n spiralFootSeparation: 30, // related to size of spiral (experiment!)\r\n spiralLengthStart: 25, // ditto\r\n spiralLengthFactor: 4, // ditto\r\n // ---\r\n },\r\n pinRadius = 15,\r\n twoPi = Math.PI * 2,\r\n previousSpiderLegs = [];\r\n\r\n for (var attrname in userOptions) {\r\n options[attrname] = userOptions[attrname];\r\n }\r\n\r\n // Public:\r\n this.spiderfy = spiderfy;\r\n this.unspiderfy = unspiderfy;\r\n this.each = function (callback) {\r\n util.each(previousSpiderLegs, callback);\r\n };\r\n this.getCurrentLegs = getCurrentLegs;\r\n\r\n function getCurrentLegs() {\r\n return previousSpiderLegs;\r\n }\r\n\r\n // Private:\r\n function spiderfy(latLng, features, marker) {\r\n console.log(\"map\", map);\r\n console.log(\"mapboxgl\", mapboxgl);\r\n var spiderLegParams = generateSpiderLegParams(features.length);\r\n var spiderLegs;\r\n\r\n unspiderfy();\r\n\r\n spiderLegs = util.map(features, function (feature, index) {\r\n var spiderLegParam = spiderLegParams[index];\r\n var elements = createMarkerElements(spiderLegParam, feature);\r\n var mapboxMarker;\r\n var spiderLeg;\r\n\r\n mapboxMarker = new mapboxgl.Marker(elements.container)\r\n .setLngLat(latLng);\r\n\r\n spiderLeg = {\r\n feature: feature,\r\n elements: elements,\r\n mapboxMarker: mapboxMarker,\r\n param: spiderLegParam\r\n };\r\n\r\n options.initializeLeg(spiderLeg);\r\n\r\n elements.container.onclick = function (e) {\r\n options.onClick(e, spiderLeg);\r\n };\r\n\r\n return spiderLeg;\r\n });\r\n\r\n var nullLeg = {\r\n x: 0,\r\n y: 0,\r\n legLength: 0,\r\n angle: 0,\r\n isNullLeg: true\r\n };\r\n var nullFeature = { priceStr: features.length };\r\n let element = createMarkerElements(nullLeg, nullFeature);\r\n element.container.onclick = function (e) {\r\n e.stopPropagation();\r\n console.log(\"CLIX\");\r\n options.onUnclick();\r\n unspiderfy();\r\n };\r\n let centralPoint = {\r\n mapboxMarker: new mapboxgl.Marker(element.container).setLngLat(latLng),\r\n elements: element,\r\n }\r\n\r\n spiderLegs.push(centralPoint);\r\n\r\n util.each(spiderLegs.reverse(), function (spiderLeg) {\r\n console.log(\"spiderLeg\", spiderLeg);\r\n console.log(map);\r\n spiderLeg.mapboxMarker.addTo(map);\r\n });\r\n\r\n if (options.animate) {\r\n setTimeout(function () {\r\n util.each(spiderLegs.reverse(), function (spiderLeg, index) {\r\n spiderLeg.elements.container.className = (spiderLeg.elements.container.className || '').replace('initial', '');\r\n spiderLeg.elements.container.style['transitionDelay'] = ((options.animationSpeed / 1000) / spiderLegs.length * index) + 's';\r\n });\r\n });\r\n }\r\n\r\n previousSpiderLegs = spiderLegs;\r\n }\r\n\r\n function unspiderfy() {\r\n util.each(previousSpiderLegs.reverse(), function (spiderLeg, index) {\r\n if (options.animate) {\r\n spiderLeg.elements.container.style['transitionDelay'] = ((options.animationSpeed / 1000) / previousSpiderLegs.length * index) + 's';\r\n spiderLeg.elements.container.className += ' exit';\r\n setTimeout(function () {\r\n spiderLeg.mapboxMarker.remove();\r\n }, options.animationSpeed + 100); //Wait for 100ms more before clearing the DOM\r\n } else {\r\n spiderLeg.mapboxMarker.remove();\r\n }\r\n });\r\n previousSpiderLegs = [];\r\n }\r\n\r\n function generateSpiderLegParams(count) {\r\n if (count >= options.circleSpiralSwitchover) {\r\n return generateSpiralParams(count);\r\n } else {\r\n return generateCircleParams(count);\r\n }\r\n }\r\n\r\n function generateSpiralParams(count) {\r\n var legLength = options.spiralLengthStart,\r\n angle = 0;\r\n return util.mapTimes(count, function (index) {\r\n var pt;\r\n angle = angle + (options.spiralFootSeparation / legLength + index * 0.0005);\r\n pt = {\r\n x: legLength * Math.cos(angle),\r\n y: legLength * Math.sin(angle),\r\n angle: angle,\r\n legLength: legLength,\r\n index: index\r\n };\r\n legLength = legLength + (twoPi * options.spiralLengthFactor / angle);\r\n return pt;\r\n });\r\n }\r\n\r\n function generateCircleParams(count) {\r\n var circumference = options.circleFootSeparation * (4 + count),\r\n legLength = circumference / twoPi, // = radius from circumference\r\n angleStep = twoPi / count;\r\n\r\n return util.mapTimes(count, function (index) {\r\n var angle = index * angleStep;\r\n return {\r\n x: legLength * Math.cos(angle),\r\n y: legLength * Math.sin(angle),\r\n angle: angle,\r\n legLength: legLength,\r\n index: index\r\n };\r\n });\r\n }\r\n\r\n function createMarkerElements(spiderLegParam, feature) {\r\n console.log(\"spiderLegParam\", spiderLegParam);\r\n var containerElem = document.createElement('div'),\r\n pinElem = document.createElement('div'),\r\n lineElem = document.createElement('div');\r\n\r\n\r\n pinElem.innerHTML =\r\n '' +\r\n '' +\r\n '' +\r\n feature.priceStr +\r\n '' +\r\n '';\r\n\r\n\r\n containerElem.className = 'spider-leg-container' + (options.animate ? ' animate initial ' : ' ');\r\n lineElem.className = 'spider-leg-line';\r\n pinElem.className = 'spider-leg-pin' + (options.customPin ? '' : ' default-spider-pin');\r\n\r\n containerElem.appendChild(lineElem);\r\n containerElem.appendChild(pinElem);\r\n\r\n containerElem.style['margin-left'] = spiderLegParam.x + 'px';\r\n containerElem.style['margin-top'] = spiderLegParam.y + 'px';\r\n\r\n if (spiderLegParam.isNullLeg) {\r\n containerElem.style['z-index'] = 0;\r\n }\r\n\r\n lineElem.style.backgroundColor = theme.palette.mapicons.alt\r\n lineElem.style.height = (spiderLegParam.legLength - pinRadius) + 'px';\r\n // lineElem.style.transform = 'rotate(' + (2*Math.PI - spiderLegParam.angle) +'rad)';\r\n lineElem.style.transform = 'rotate(' + (spiderLegParam.angle - Math.PI / 2) + 'rad)';\r\n\r\n return { container: containerElem, line: lineElem, pin: pinElem };\r\n }\r\n\r\n // Utility\r\n function eachFn(array, iterator) {\r\n var i = 0;\r\n if (!array || !array.length) {\r\n return [];\r\n }\r\n for (i = 0; i < array.length; i++) {\r\n iterator(array[i], i);\r\n }\r\n }\r\n\r\n function eachTimesFn(count, iterator) {\r\n if (!count) {\r\n return [];\r\n }\r\n for (var i = 0; i < count; i++) {\r\n iterator(i);\r\n }\r\n }\r\n\r\n function mapFn(array, iterator) {\r\n var result = [];\r\n eachFn(array, function (item, i) {\r\n result.push(iterator(item, i));\r\n });\r\n return result;\r\n }\r\n\r\n function mapTimesFn(count, iterator) {\r\n var result = [];\r\n eachTimesFn(count, function (i) {\r\n result.push(iterator(i));\r\n });\r\n return result;\r\n }\r\n}\r\n\r\n// Returns Offset option for mapbox poup, so that the popup for pins in the spider\r\n// appears next to the pin, rather than at the center of the spider.\r\n// offset: Offset of the popup from the pin.\r\nexport function popupOffsetForSpiderLeg(spiderLeg, offset) {\r\n var pinOffsetX = spiderLeg.param.x;\r\n var pinOffsetY = spiderLeg.param.y;\r\n\r\n offset = offset || 0;\r\n return {\r\n 'top': offsetVariant([0, offset], pinOffsetX, pinOffsetY),\r\n 'top-left': offsetVariant([offset, offset], pinOffsetX, pinOffsetY),\r\n 'top-right': offsetVariant([-offset, offset], pinOffsetX, pinOffsetY),\r\n 'bottom': offsetVariant([0, -offset], pinOffsetX, pinOffsetY),\r\n 'bottom-left': offsetVariant([offset, -offset], pinOffsetX, pinOffsetY),\r\n 'bottom-right': offsetVariant([-offset, -offset], pinOffsetX, pinOffsetY),\r\n 'left': offsetVariant([offset, -offset], pinOffsetX, pinOffsetY),\r\n 'right': offsetVariant([-offset, -offset], pinOffsetX, pinOffsetY)\r\n };\r\n};\r\n\r\nfunction offsetVariant(offset, variantX, variantY) {\r\n return [offset[0] + (variantX || 0), offset[1] + (variantY || 0)];\r\n}\r\n\r\n","import { useState, useEffect } from 'react';\r\n\r\nfunction getWindowDimensions() {\r\n const { innerWidth: width, innerHeight: height } = window;\r\n return {\r\n width,\r\n height\r\n };\r\n}\r\n\r\nconst useWindowDimensions = () => {\r\n const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions());\r\n\r\n useEffect(() => {\r\n function handleResize() {\r\n setWindowDimensions(getWindowDimensions());\r\n }\r\n\r\n window.addEventListener('resize', handleResize);\r\n return () => window.removeEventListener('resize', handleResize);\r\n }, []);\r\n\r\n return windowDimensions;\r\n}\r\n\r\nexport default useWindowDimensions;","import React, { useRef, useEffect, useState, useCallback } from 'react';\r\nimport ReactDOM from 'react-dom';\r\n//import mapboxgl from 'mapbox-gl/dist/mapbox-gl-csp';\r\n//import MapboxWorker from 'worker-loader!mapbox-gl/dist/mapbox-gl-csp-worker';\r\n\r\nimport maplibregl from 'maplibre-gl/dist/maplibre-gl';\r\nimport MapWorker from 'worker-loader!maplibre-gl/dist/maplibre-gl-csp-worker';\r\nimport HomeIcon from '@material-ui/icons/Home';\r\nimport circle from '@turf/circle';\r\nimport hexgrid from '@turf/hex-grid';\r\nimport pointsWithinPolygon from '@turf/points-within-polygon';\r\nimport pointInPolygon from '@turf/boolean-point-in-polygon';\r\nimport pip from 'point-in-polygon-hao';\r\nimport centroid from '@turf/centroid';\r\nimport BasicTable from './BasicTable';\r\nimport PriceHistoryPopup from './PriceHistoryPopup';\r\nimport CrimePopup from './CrimePopup';\r\n\r\nimport { theme } from '../theme'\r\nimport { ThemeProvider } from '@material-ui/core/styles'\r\nimport { Paper, Typography, Box } from '@material-ui/core';\r\nimport { percentageWithCommas } from '../lib/ClusterRender';\r\nimport { MapboxglSpiderifier } from '../lib/Spiderify.jsx';\r\nimport \"../lib/Spiderify.css\";\r\n\r\nimport useWindowDimensions from \"./hooks/useWindowDimensions.jsx\";\r\nimport { useTheme } from '@material-ui/core/styles';\r\n\r\n/*import { Protocol } from 'pmtiles';*/\r\n\r\n\r\nObject.assign(globalThis, { pip });\r\n\r\nmaplibregl.workerClass = MapWorker;\r\nmaplibregl.accessToken = 'pk.eyJ1IjoiaG91c2VjODQiLCJhIjoiY2tsc2t3N3I4MDN4MDJubjgxYjNmODE5ZyJ9.BYgTwOrkMw3hEs9ypeLs8g';\r\n\r\nconst MapBox = ({ lng, setLng, lat, setLat, zoom, setZoom, bounds, setBounds, data, setData, setPropertyMarkerClicked, poly, crimes, schools,\r\n toggleFly, satView, productData, setClusterPoints, activePropertyCoords, setActivePropertyCoords, showHistoricPrices, showCrime, yearCrimeFilter,\r\n yearHistPriceFilter, priceDiffMode, showSchools, schoolsFilter, demographicsFilter, setPropertyCardClicked, showProps, setSelectedSchool }) => {\r\n\r\n const mapContainer = useRef();\r\n const [map, setMap] = useState(null);\r\n const [lastHash, setLastHash] = useState(\"\");\r\n const [init, setInit] = useState(false);\r\n const spider = useRef();\r\n const [activeMarker, setActiveMarkerX] = useState(null);\r\n const theme = useTheme();\r\n const crimeFilterRef = useRef(yearCrimeFilter)\r\n const { height, width } = useWindowDimensions();\r\n\r\n const [debounceTimer, setDebounceTimer] = useState(null);\r\n const [satMode, setSatMode] = useState(false);\r\n useEffect(() => {\r\n crimeFilterRef.current = yearCrimeFilter;\r\n }, [yearCrimeFilter]);\r\n\r\n\r\n useEffect(() => {\r\n if (satView != null && map != null && data != null) {\r\n console.log(\"STYLE CHANGE DETECTED\");\r\n setLastHash(\"\");\r\n\r\n let style = {\r\n 'sources': {\r\n 'raster-tiles': {\r\n 'type': 'raster',\r\n 'tiles': [\r\n 'https://khms3.google.com/kh/v=979?x={x}&y={y}&z={z}'\r\n ],\r\n 'tileSize': 256,\r\n }\r\n },\r\n 'layers': [\r\n {\r\n 'id': 'simple-tiles',\r\n 'type': 'raster',\r\n 'source': 'raster-tiles',\r\n 'minzoom': 0,\r\n 'maxzoom': 23\r\n }\r\n ]\r\n };\r\n\r\n if (!satMode) {\r\n map.addSource(\"raster-tiles\", style.sources[\"raster-tiles\"]);\r\n map.addLayer(style.layers[0], \"aeroway_fill\");\r\n map.setLayoutProperty(\"building-3d\", \"visibility\", \"none\");\r\n map.setLayoutProperty(\"building\", \"visibility\", \"none\");\r\n }\r\n else {\r\n if (map.getLayer(\"simple-tiles\")) {\r\n map.removeLayer(\"simple-tiles\");\r\n }\r\n if (map.getSource(\"raster-tiles\")) {\r\n map.removeSource(\"raster-tiles\");\r\n }\r\n map.setLayoutProperty(\"building-3d\", \"visibility\", \"visible\");\r\n map.setLayoutProperty(\"building\", \"visibility\", \"visible\");\r\n }\r\n setSatMode(a => !a);\r\n }\r\n }, [satView]);\r\n\r\n const setActiveMarker = (marker) => {\r\n setActiveMarkerX(a => {\r\n if (a != null) {\r\n a.remove();\r\n }\r\n return marker;\r\n });\r\n };\r\n\r\n useEffect(() => {\r\n if (activeMarker != null) {\r\n activeMarker.getElement().addEventListener('click', (e) => {\r\n setPropertyCardClicked(activePropertyCoords.selectedId); //deleberatly closing over, don't add to deps.\r\n });\r\n var n = activeMarker.addTo(map);\r\n console.log(\"Added \", activeMarker);\r\n }\r\n }, [activeMarker, map]);\r\n\r\n const lon2tile = (lon, zoom) => Math.floor((lon + 180) / 360 * Math.pow(2, zoom));\r\n const lat2tile = (lat, zoom) => Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, zoom));\r\n\r\n const renderPriceHist = (bounds, zoom, map, showHistoricPrices, yearHistPriceFilter, priceDiffMode, width) => {\r\n if (showHistoricPrices) {\r\n console.log(\"rendering price hist\");\r\n if (!map.isSourceLoaded('pricedata')) {\r\n setTimeout(() => renderPriceHist(bounds, zoom, map, showHistoricPrices, yearHistPriceFilter, priceDiffMode), 80);\r\n console.log(\"Waiting on data\");\r\n return;\r\n }\r\n\r\n\r\n let extraLng = (bounds._ne.lng - bounds._sw.lng) / 15; // 15;\r\n let extraLat = (bounds._ne.lat - bounds._sw.lat) / 8; // 8;\r\n let bnd = [bounds._sw.lng - extraLng, bounds._sw.lat - extraLat, bounds._ne.lng + extraLng, bounds._ne.lat + extraLat];\r\n\r\n //let latdiff\r\n let multiplier = 1;\r\n if (width < theme.breakpoints.width(\"sm\")) {\r\n multiplier = .5;\r\n } else if (width < theme.breakpoints.width(\"md\")) {\r\n multiplier = .75;\r\n }\r\n\r\n let dis = 0.06;\r\n if (zoom < 15) {\r\n let pow = 15 - zoom;\r\n dis = (Math.pow(2, pow) / (priceDiffMode ? 12.5 : 25)) * multiplier;\r\n }\r\n\r\n\r\n\r\n let hexPolys = hexgrid(bnd, dis, { units: 'miles' });\r\n let hexLookup = {};\r\n hexPolys.features.forEach(hx => {\r\n hx.geometry.coordinates[0].forEach(pt => {\r\n let x = lon2tile(pt[0], Math.floor(zoom));\r\n let y = lat2tile(pt[1], Math.floor(zoom));\r\n if (hexLookup[x] == undefined) {\r\n hexLookup[x] = {};\r\n }\r\n if (hexLookup[x][y] == undefined) {\r\n hexLookup[x][y] = [];\r\n hexLookup[x][y].push(hx);\r\n }\r\n else {\r\n if (!hexLookup[x][y].some(i => i.geometry.coordinates[0][0][0] == hx.geometry.coordinates[0][0][0] &&\r\n i.geometry.coordinates[0][0][1] == hx.geometry.coordinates[0][0][1] &&\r\n i.geometry.coordinates[0][1][0] == hx.geometry.coordinates[0][1][0] &&\r\n i.geometry.coordinates[0][1][1] == hx.geometry.coordinates[0][1][1] &&\r\n i.geometry.coordinates[0][2][0] == hx.geometry.coordinates[0][2][0] &&\r\n i.geometry.coordinates[0][2][1] == hx.geometry.coordinates[0][2][1] &&\r\n i.geometry.coordinates[0][3][0] == hx.geometry.coordinates[0][3][0] &&\r\n i.geometry.coordinates[0][3][1] == hx.geometry.coordinates[0][3][1] &&\r\n i.geometry.coordinates[0][4][0] == hx.geometry.coordinates[0][4][0] &&\r\n i.geometry.coordinates[0][4][1] == hx.geometry.coordinates[0][4][1] &&\r\n i.geometry.coordinates[0][5][0] == hx.geometry.coordinates[0][5][0] &&\r\n i.geometry.coordinates[0][5][1] == hx.geometry.coordinates[0][5][1] &&\r\n i.geometry.coordinates[0][6][0] == hx.geometry.coordinates[0][6][0] &&\r\n i.geometry.coordinates[0][6][1] == hx.geometry.coordinates[0][6][1]\r\n )) {\r\n hexLookup[x][y].push(hx);\r\n }\r\n }\r\n });\r\n });\r\n\r\n let allowedYears = yearHistPriceFilter;\r\n let minYear = Math.min(...allowedYears);\r\n let maxYear = Math.max(...allowedYears);\r\n\r\n //set filters on pricehistory points & labels.\r\n let gtrFil = [];\r\n let yearFields = [];\r\n if (map != null) {\r\n\r\n if (priceDiffMode) {\r\n yearFields = [`p${minYear - 2000}`, `p${maxYear - 2000}`];\r\n }\r\n else {\r\n yearFields = yearHistPriceFilter.map(a => `p${a - 2000}`);\r\n }\r\n //[\"all\", boolean, boolean]: boolean\r\n //[\"any\", boolean, boolean]: boolean\r\n let numFilter = [\"number\"];\r\n yearFields.forEach(a => numFilter.push([\"get\", a]));\r\n numFilter.push(0);\r\n gtrFil = [\"all\", [\">\", numFilter, 0], [\"<\", [\"get\", \"price\"], 50000000]];\r\n console.log(gtrFil);\r\n map.setFilter(\"pricehistorypoint\", gtrFil);\r\n map.setFilter(\"pricehistorylabel\", gtrFil);\r\n\r\n }\r\n\r\n if (priceDiffMode) {\r\n allowedYears = [minYear, maxYear];\r\n }\r\n let t1 = new Date().getTime();\r\n let priceDataPoints = [];\r\n\r\n if (zoom < 15 || gtrFil.length == 0) {\r\n priceDataPoints = map.querySourceFeatures('pricedata', {\r\n sourceLayer: 'outCluster',\r\n filter: ['in', [\"get\", \"year\"], [\"literal\", allowedYears]]\r\n });\r\n }\r\n else {\r\n priceDataPoints = map.querySourceFeatures('pricedata', {\r\n sourceLayer: 'outCluster',\r\n filter: gtrFil\r\n });\r\n }\r\n\r\n let slow = 0;\r\n let fail = 0;\r\n let oob = 0;\r\n let firstTry = 0;\r\n let adjustment = [[0, 0], [0, 1], [0, -1], [1, 0], [-1, 0], [-1, -1], [-1, 1], [1, 1], [1, -1]];\r\n priceDataPoints.forEach(f => {\r\n\r\n //bounds check\r\n let inbounds = true;\r\n\r\n let fLon = f.geometry.coordinates[0];\r\n let fLat = f.geometry.coordinates[1];\r\n inbounds = fLon < bounds._ne.lng && fLon > bounds._sw.lng && fLat < bounds._ne.lat && fLat > bounds._sw.lat\r\n\r\n\r\n if (inbounds) {\r\n let result = false;\r\n for (let i = 0; i < 9; i++) {\r\n if (hexLookup[f.tile.x + adjustment[i][0]] != undefined && hexLookup[f.tile.x + adjustment[i][0]][f.tile.y + adjustment[i][1]] != undefined) {\r\n\r\n let hexLookupBin = hexLookup[f.tile.x + adjustment[i][0]][f.tile.y + adjustment[i][1]];\r\n for (let i = 0; i < hexLookupBin.length; i++) {\r\n let a = hexLookupBin[i];\r\n result = pointInPolygon(f.geometry, a.geometry);\r\n\r\n if (result) {\r\n\r\n let p = f.properties;\r\n\r\n if (((zoom < 15 && allowedYears.includes(p.year) && p.point_count > 0) || (zoom >= 15 && yearFields.some(a => Number(p[a]) > 0))) && p.price > 0 && p.price < 50000000) {\r\n if (priceDiffMode && p.price < 5000000) {\r\n if (a.properties.growth == undefined) {\r\n a.properties.growth = 0;\r\n a.properties.max = 0;\r\n a.properties.cntmax = 0;\r\n a.properties.min = 0;\r\n a.properties.cntmin = 0;\r\n }\r\n //if (p[`p${minYear - 2000}`] > 0)\r\n if (zoom < 15 && p.year == minYear) {\r\n a.properties.cntmin += p.point_count\r\n a.properties.min += (p.price * p.point_count);\r\n }\r\n if (zoom < 15 && p.year == maxYear) {\r\n a.properties.cntmax += p.point_count\r\n a.properties.max += (p.price * p.point_count);\r\n }\r\n if (zoom >= 15 && p[`p${minYear - 2000}`] > 0) {\r\n a.properties.cntmin += 1;\r\n a.properties.min += p[`p${minYear - 2000}`];\r\n\r\n }\r\n if (zoom >= 15 && p[`p${maxYear - 2000}`] > 0) {\r\n a.properties.cntmax += 1\r\n a.properties.max += p[`p${maxYear - 2000}`];\r\n }\r\n }\r\n else if (p.price < 50000000 && zoom < 15) {\r\n if (a.properties.price == undefined) {\r\n a.properties.price = p.price;\r\n a.properties.cnt = p.point_count;\r\n }\r\n else {\r\n let denom = a.properties.cnt + p.point_count;\r\n let newAvg = (a.properties.cnt / (denom) * a.properties.price) + ((p.point_count / denom) * p.price);\r\n a.properties.price = newAvg;\r\n a.properties.cnt += p.point_count;\r\n }\r\n }\r\n else if (p.price < 50000000 && zoom >= 15) {\r\n if (a.properties.price == undefined) {\r\n a.properties.price = Math.max(...(yearFields.filter(x => Number(p[x]) > 0).map(y => Number(p[y]))));\r\n a.properties.cnt = 1;\r\n }\r\n else {\r\n let denom = a.properties.cnt + 1;\r\n let price = Math.max(...(yearFields.filter(x => Number(p[x]) > 0).map(y => Number(p[y]))));\r\n let newAvg = (a.properties.cnt / (denom) * a.properties.price) + ((1 / denom) * price);\r\n a.properties.price = newAvg;\r\n a.properties.cnt += 1;\r\n }\r\n }\r\n\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n if (result) {\r\n if (i == 0) {\r\n firstTry += 1;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (!result) {\r\n fail += 1;\r\n }\r\n }\r\n else {\r\n oob += 1;\r\n }\r\n\r\n });\r\n if (fail > 0)\r\n console.log(\"%cFAILS\", \"background: red; color: yellow; font-size: large\", fail);\r\n let centroids = [];\r\n if (priceDiffMode) {\r\n hexPolys.features = hexPolys.features.filter(a => a.properties.max > 0 || a.properties.min > 0);\r\n hexPolys.features.forEach(a => {\r\n let poly = {\r\n type: \"Feature\",\r\n properties: {},\r\n geometry: a.geometry\r\n };\r\n let point = centroid(poly);\r\n\r\n if (a.properties.max <= 0 || a.properties.min <= 0) {\r\n point.properties.label = a.properties.max <= 0 ? `No data for ${maxYear}` : `No data for ${minYear}`;\r\n a.properties.growth = undefined;\r\n }\r\n else if (a.properties.cntmax < 5 || a.properties.cntmin <= 5) {\r\n point.properties.label = a.properties.cntmax < 5 ? `Not enough data \\r\\nfor ${maxYear}` : `Not enough data \\r\\nfor ${minYear}`;\r\n a.properties.growth = undefined;\r\n }\r\n else {\r\n let maxAvg = a.properties.max / a.properties.cntmax;\r\n let minAvg = a.properties.min / a.properties.cntmin;\r\n a.properties.growth = ((100 * maxAvg) / minAvg) - 100;\r\n point.properties.label = `${(Math.round(a.properties.growth * 10) / 10)}%`\r\n }\r\n\r\n centroids.push(point);\r\n });\r\n let fc = {\r\n type: \"FeatureCollection\",\r\n features: centroids\r\n };\r\n map.getSource('pricehexcentroid').setData(fc);\r\n map.getSource('pricehex').setData(hexPolys);\r\n map.setLayoutProperty(\r\n 'pricehistoryhex',\r\n 'visibility',\r\n 'none');\r\n map.setLayoutProperty(\r\n 'pricediffhex',\r\n 'visibility',\r\n 'visible');\r\n map.setLayoutProperty(\r\n 'pricediffcentroid',\r\n 'visibility',\r\n 'visible');\r\n\r\n }\r\n else {\r\n hexPolys.features = hexPolys.features.filter(a => a.properties.price > 0);\r\n\r\n map.getSource('pricehex').setData(hexPolys);\r\n map.setLayoutProperty(\r\n 'pricehistoryhex',\r\n 'visibility',\r\n 'visible');\r\n map.setLayoutProperty(\r\n 'pricediffhex',\r\n 'visibility',\r\n 'none');\r\n map.setLayoutProperty(\r\n 'pricediffcentroid',\r\n 'visibility',\r\n 'none');\r\n }\r\n }\r\n else {\r\n if (map != null) {\r\n let src = map.getSource('pricehex');\r\n if (src != null) {\r\n src.setData(emptySource);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const renderSchools = (bounds, zoom, map, showSchools, schoolsFilter, demographicsFilter, width) => {\r\n\r\n if (showSchools && map != null) {\r\n if (!map.isSourceLoaded('schooldata')) {\r\n setTimeout(() => renderSchools(bounds, zoom, map, showSchools, schoolsFilter, demographicsFilter), 80);\r\n console.log(\"Waiting on data\");\r\n return;\r\n }\r\n let src = map.getSource('schoolcatch');\r\n if (src != null) {\r\n src.setData(emptySource);\r\n }\r\n\r\n if (zoom >= 13) {\r\n //calculate catchments.\r\n let schoolPoints = map.querySourceFeatures('schooldata', {\r\n sourceLayer: 'schoolpoints',\r\n });\r\n\r\n let schoolPolys = {\r\n 'type': 'FeatureCollection',\r\n 'features': []\r\n };\r\n\r\n schoolPoints.forEach(f => {\r\n\r\n let fLon = f.geometry.coordinates[0];\r\n let fLat = f.geometry.coordinates[1];\r\n\r\n let inbounds = fLon < bounds._ne.lng && fLon > bounds._sw.lng && fLat < bounds._ne.lat && fLat > bounds._sw.lat\r\n\r\n if (inbounds) {\r\n if (f.properties.CatchmentMedProbMetres > 0) {\r\n let center = [f.geometry.coordinates[0], f.geometry.coordinates[1]];\r\n let radius = f.properties.CatchmentMedProbMetres / 1000;\r\n let options = { steps: 120, units: 'kilometers', properties: { id: f.properties.Id } }\r\n let circlePoly = circle(center, radius, options);\r\n\r\n circlePoly['id'] = f.properties.Id;\r\n schoolPolys.features.push(circlePoly)\r\n\r\n }\r\n }\r\n });\r\n\r\n map.getSource('schoolcatch').setData(schoolPolys);\r\n }\r\n\r\n //hexes\r\n if (zoom <= 13) {\r\n let adjustment = [[0, 0], [0, 1], [0, -1], [1, 0], [-1, 0], [-1, -1], [-1, 1], [1, 1], [1, -1]];\r\n let extraLng = (bounds._ne.lng - bounds._sw.lng) / 15; // 15;\r\n let extraLat = (bounds._ne.lat - bounds._sw.lat) / 8; // 8;\r\n let bnd = [bounds._sw.lng - extraLng, bounds._sw.lat - extraLat, bounds._ne.lng + extraLng, bounds._ne.lat + extraLat];\r\n\r\n //let latdiff\r\n let multiplier = 1;\r\n if (width < theme.breakpoints.width(\"sm\")) {\r\n multiplier = .5;\r\n } else if (width < theme.breakpoints.width(\"md\")) {\r\n multiplier = .75;\r\n }\r\n\r\n let dis = 0.06;\r\n if (zoom < 15) {\r\n let pow = 15 - zoom;\r\n dis = (Math.pow(2, pow) / 20) * multiplier;\r\n }\r\n\r\n\r\n let hexPolys = hexgrid(bnd, dis, { units: 'miles' });\r\n let hexLookup = {};\r\n hexPolys.features.forEach(hx => {\r\n hx.geometry.coordinates[0].forEach(pt => {\r\n let x = lon2tile(pt[0], Math.floor(zoom));\r\n let y = lat2tile(pt[1], Math.floor(zoom));\r\n if (hexLookup[x] == undefined) {\r\n hexLookup[x] = {};\r\n }\r\n if (hexLookup[x][y] == undefined) {\r\n hexLookup[x][y] = [];\r\n hexLookup[x][y].push(hx);\r\n }\r\n else {\r\n if (!hexLookup[x][y].some(i => i.geometry.coordinates[0][0][0] == hx.geometry.coordinates[0][0][0] &&\r\n i.geometry.coordinates[0][0][1] == hx.geometry.coordinates[0][0][1] &&\r\n i.geometry.coordinates[0][1][0] == hx.geometry.coordinates[0][1][0] &&\r\n i.geometry.coordinates[0][1][1] == hx.geometry.coordinates[0][1][1] &&\r\n i.geometry.coordinates[0][2][0] == hx.geometry.coordinates[0][2][0] &&\r\n i.geometry.coordinates[0][2][1] == hx.geometry.coordinates[0][2][1] &&\r\n i.geometry.coordinates[0][3][0] == hx.geometry.coordinates[0][3][0] &&\r\n i.geometry.coordinates[0][3][1] == hx.geometry.coordinates[0][3][1] &&\r\n i.geometry.coordinates[0][4][0] == hx.geometry.coordinates[0][4][0] &&\r\n i.geometry.coordinates[0][4][1] == hx.geometry.coordinates[0][4][1] &&\r\n i.geometry.coordinates[0][5][0] == hx.geometry.coordinates[0][5][0] &&\r\n i.geometry.coordinates[0][5][1] == hx.geometry.coordinates[0][5][1] &&\r\n i.geometry.coordinates[0][6][0] == hx.geometry.coordinates[0][6][0] &&\r\n i.geometry.coordinates[0][6][1] == hx.geometry.coordinates[0][6][1]\r\n )) {\r\n hexLookup[x][y].push(hx);\r\n }\r\n }\r\n });\r\n });\r\n\r\n let schoolDataPoints = map.querySourceFeatures('schooldata', {\r\n sourceLayer: schoolsFilter, //'KS2PercentExpectedStandard',\r\n });\r\n\r\n let fail = 0;\r\n schoolDataPoints.forEach(f => {\r\n\r\n //bounds check\r\n let inbounds = true;\r\n\r\n let fLon = f.geometry.coordinates[0];\r\n let fLat = f.geometry.coordinates[1];\r\n\r\n inbounds = fLon < bounds._ne.lng && fLon > bounds._sw.lng && fLat < bounds._ne.lat && fLat > bounds._sw.lat\r\n\r\n if (inbounds) {\r\n\r\n let result = false;\r\n\r\n for (let i = 0; i < 9; i++) {\r\n if (hexLookup[f.tile.x + adjustment[i][0]] != undefined && hexLookup[f.tile.x + adjustment[i][0]][f.tile.y + adjustment[i][1]] != undefined) {\r\n\r\n let hexLookupBin = hexLookup[f.tile.x + adjustment[i][0]][f.tile.y + adjustment[i][1]];\r\n\r\n for (let i = 0; i < hexLookupBin.length; i++) {\r\n let a = hexLookupBin[i];\r\n result = pointInPolygon(f.geometry, a.geometry);\r\n if (result) {\r\n\r\n let p = f.properties;\r\n let val = p[schoolsFilter];\r\n if (schoolsFilter == \"Demographics\" && demographicsFilter != null && demographicsFilter.length > 0) {\r\n val = p[demographicsFilter];\r\n }\r\n if (a.properties.val == undefined) {\r\n a.properties.val = val;\r\n a.properties.cnt = p.point_count > 0 ? p.point_count : 1;\r\n a.properties.tot = a.properties.val * a.properties.cnt\r\n }\r\n else {\r\n let pts = p.point_count > 0 ? p.point_count : 1;\r\n a.properties.cnt += pts;\r\n a.properties.tot += pts * val;\r\n a.properties.val += a.properties.tot / a.properties.cnt;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n if (result) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!result) {\r\n fail += 1;\r\n }\r\n }\r\n });\r\n\r\n if (fail > 0)\r\n console.log(\"%cFAILS\", \"background: red; color: yellow; font-size: large\", fail);\r\n console.log(hexPolys);\r\n map.getSource('schoolhex').setData(hexPolys);\r\n map.setLayoutProperty(\r\n 'schoolhexlayer',\r\n 'visibility',\r\n 'visible');\r\n }\r\n }\r\n else {\r\n if (map != null) {\r\n let src = map.getSource('schoolhex');\r\n if (src != null) {\r\n src.setData(emptySource);\r\n }\r\n src = map.getSource('schoolcatch');\r\n if (src != null) {\r\n src.setData(emptySource);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const renderCrime = (bounds, zoom, map, showCrime, yearCrimeFilter, width) => {\r\n if (showCrime) {\r\n if (!map.isSourceLoaded('crimedata')) {\r\n setTimeout(() => renderCrime(bounds, zoom, map, showCrime, yearCrimeFilter), 80);\r\n console.log(\"Waiting on data\");\r\n return;\r\n }\r\n\r\n let gtrFil = [];\r\n let wcntFields = [];\r\n let cntFields = [];\r\n if (map != null) {\r\n\r\n wcntFields = yearCrimeFilter.map(a => `p${a - 2000}wcnt`);\r\n cntFields = yearCrimeFilter.map(a => `p${a - 2000}cnt`);\r\n let numFilter = [\"number\"];\r\n wcntFields.forEach(a => numFilter.push([\"get\", a]));\r\n numFilter.push(0);\r\n gtrFil = [\">\", numFilter, 0];\r\n map.setFilter(\"crimelabel\", gtrFil);\r\n map.setFilter(\"crimepoint\", gtrFil);\r\n\r\n let text = [\"+\"];\r\n wcntFields.forEach(a => text.push([\"to-number\", [\"get\", a], 0]));\r\n map.setLayoutProperty(\"crimelabel\", \"text-field\", [\"to-string\", text])\r\n\r\n }\r\n\r\n if (zoom >= 16)\r\n return;\r\n\r\n let extraLng = (bounds._ne.lng - bounds._sw.lng) / 15; // 15;\r\n let extraLat = (bounds._ne.lat - bounds._sw.lat) / 8; // 8;\r\n let bnd = [bounds._sw.lng - extraLng, bounds._sw.lat - extraLat, bounds._ne.lng + extraLng, bounds._ne.lat + extraLat];\r\n\r\n //let latdiff\r\n //let latdiff\r\n let multiplier = 1;\r\n if (width < theme.breakpoints.width(\"sm\")) {\r\n multiplier = .5;\r\n } else if (width < theme.breakpoints.width(\"md\")) {\r\n multiplier = .75;\r\n }\r\n\r\n let dis = 0.06;\r\n if (zoom < 15) {\r\n let pow = 15 - zoom;\r\n dis = (Math.pow(2, pow) / 20) * multiplier;\r\n }\r\n\r\n let hexPolys = hexgrid(bnd, dis, { units: 'miles' });\r\n let hexLookup = {};\r\n hexPolys.features.forEach(hx => {\r\n hx.geometry.coordinates[0].forEach(pt => {\r\n let x = lon2tile(pt[0], Math.floor(zoom));\r\n let y = lat2tile(pt[1], Math.floor(zoom));\r\n if (hexLookup[x] == undefined) {\r\n hexLookup[x] = {};\r\n }\r\n if (hexLookup[x][y] == undefined) {\r\n hexLookup[x][y] = [];\r\n hexLookup[x][y].push(hx);\r\n }\r\n else {\r\n if (!hexLookup[x][y].some(i => i.geometry.coordinates[0][0][0] == hx.geometry.coordinates[0][0][0] &&\r\n i.geometry.coordinates[0][0][1] == hx.geometry.coordinates[0][0][1] &&\r\n i.geometry.coordinates[0][1][0] == hx.geometry.coordinates[0][1][0] &&\r\n i.geometry.coordinates[0][1][1] == hx.geometry.coordinates[0][1][1] &&\r\n i.geometry.coordinates[0][2][0] == hx.geometry.coordinates[0][2][0] &&\r\n i.geometry.coordinates[0][2][1] == hx.geometry.coordinates[0][2][1] &&\r\n i.geometry.coordinates[0][3][0] == hx.geometry.coordinates[0][3][0] &&\r\n i.geometry.coordinates[0][3][1] == hx.geometry.coordinates[0][3][1] &&\r\n i.geometry.coordinates[0][4][0] == hx.geometry.coordinates[0][4][0] &&\r\n i.geometry.coordinates[0][4][1] == hx.geometry.coordinates[0][4][1] &&\r\n i.geometry.coordinates[0][5][0] == hx.geometry.coordinates[0][5][0] &&\r\n i.geometry.coordinates[0][5][1] == hx.geometry.coordinates[0][5][1] &&\r\n i.geometry.coordinates[0][6][0] == hx.geometry.coordinates[0][6][0] &&\r\n i.geometry.coordinates[0][6][1] == hx.geometry.coordinates[0][6][1]\r\n )) {\r\n hexLookup[x][y].push(hx);\r\n }\r\n }\r\n });\r\n });\r\n //////////\r\n\r\n\r\n\r\n\r\n\r\n let crimeDataPoints = [];\r\n if (zoom < 14 || gtrFil.length == 0) {\r\n crimeDataPoints = map.querySourceFeatures('crimedata', {\r\n sourceLayer: 'crimelayer',\r\n filter: ['in', [\"get\", \"year\"], [\"literal\", yearCrimeFilter]]\r\n });\r\n }\r\n else {\r\n crimeDataPoints = map.querySourceFeatures('crimedata', {\r\n sourceLayer: 'crimelayer',\r\n filter: gtrFil\r\n });\r\n }\r\n let slow = 0;\r\n let fail = 0;\r\n let oob = 0;\r\n let firstTry = 0;\r\n let adjustment = [[0, 0], [0, 1], [0, -1], [1, 0], [-1, 0], [-1, -1], [-1, 1], [1, 1], [1, -1]];\r\n crimeDataPoints.forEach(f => {\r\n\r\n //bounds check\r\n let inbounds = true;\r\n\r\n let fLon = f.geometry.coordinates[0];\r\n let fLat = f.geometry.coordinates[1];\r\n\r\n inbounds = fLon < bounds._ne.lng && fLon > bounds._sw.lng && fLat < bounds._ne.lat && fLat > bounds._sw.lat\r\n\r\n if (inbounds) {\r\n //adjust tiles if zoom above 14.\r\n if (zoom >= 14) {\r\n f.tile.x = lon2tile(f.geometry.coordinates[0], Math.floor(zoom));\r\n f.tile.y = lat2tile(f.geometry.coordinates[1], Math.floor(zoom));\r\n }\r\n let result = false;\r\n for (let i = 0; i < 9; i++) {\r\n if (hexLookup[f.tile.x + adjustment[i][0]] != undefined && hexLookup[f.tile.x + adjustment[i][0]][f.tile.y + adjustment[i][1]] != undefined) {\r\n\r\n let hexLookupBin = hexLookup[f.tile.x + adjustment[i][0]][f.tile.y + adjustment[i][1]];\r\n\r\n for (let i = 0; i < hexLookupBin.length; i++) {\r\n let a = hexLookupBin[i];\r\n result = pointInPolygon(f.geometry, a.geometry);\r\n if (result) {\r\n\r\n let p = f.properties;\r\n if (zoom < 14) {\r\n\r\n if (yearCrimeFilter.includes(p.year) && p.point_count > 0 && p.wcnt > 0) {\r\n if (a.properties.wcnt == undefined) {\r\n a.properties.wcnt = p.wcnt;\r\n a.properties.cnt = p.cnt;\r\n a.properties.additions = 1;\r\n }\r\n else {\r\n a.properties.wcnt += p.wcnt;\r\n a.properties.cnt += p.cnt;\r\n a.properties.additions += 1;\r\n }\r\n\r\n }\r\n }\r\n else if (zoom >= 14) {\r\n if (wcntFields.some(a => Number(p[a]) > 0)) {\r\n let wcnt = wcntFields.filter(x => Number(p[x]) > 0).reduce((a, b) => a + Number(p[b]), 0);\r\n let cnt = cntFields.filter(x => Number(p[x]) > 0).reduce((a, b) => a + Number(p[b]), 0);\r\n if (a.properties.wcnt == undefined) {\r\n a.properties.wcnt = wcnt;\r\n a.properties.cnt = cnt;\r\n }\r\n else {\r\n a.properties.wcnt += wcnt;\r\n a.properties.cnt += cnt;\r\n }\r\n }\r\n }\r\n\r\n break;\r\n }\r\n }\r\n }\r\n if (result) {\r\n if (i == 0) {\r\n firstTry += 1;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (!result) {\r\n fail += 1;\r\n }\r\n }\r\n else {\r\n oob += 1;\r\n }\r\n\r\n });\r\n if (fail > 0)\r\n console.log(\"%cFAILS\", \"background: red; color: yellow; font-size: large\", fail);\r\n // 6 7 8\r\n // /30 /15 /7.5\r\n // 64 128 256\r\n console.log(\"zoom\", zoom);\r\n hexPolys.features.forEach(a => a.properties.wcntScale = a.properties.wcnt / (6000 / Math.pow(2, zoom)));\r\n hexPolys.features = hexPolys.features.filter(a => a.properties.wcnt > 0);\r\n map.getSource('crimehex').setData(hexPolys);\r\n }\r\n else {\r\n if (map != null) {\r\n let src = map.getSource('crimehex');\r\n if (src != null) {\r\n src.setData(emptySource);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 500;\r\n setDebounceTimer(null);\r\n clearTimeout(debounceTimer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setDebounceTimer(t);\r\n }\r\n\r\n useEffect(() => {\r\n debounce(() => renderPriceHist(bounds, zoom, map, showHistoricPrices, yearHistPriceFilter, priceDiffMode, width), 100);\r\n }, [bounds, zoom, map, showHistoricPrices, yearHistPriceFilter, priceDiffMode, width]);\r\n\r\n useEffect(() => {\r\n debounce(() => renderCrime(bounds, zoom, map, showCrime, yearCrimeFilter, width), 100);\r\n }, [bounds, zoom, map, showCrime, yearCrimeFilter, width]);\r\n\r\n useEffect(() => {\r\n debounce(() => renderSchools(bounds, zoom, map, showSchools, schoolsFilter, demographicsFilter, width), 100);\r\n }, [bounds, zoom, map, showSchools, schoolsFilter, demographicsFilter, width]);\r\n\r\n useEffect(() => {\r\n console.log(\"clickity\", showHistoricPrices);\r\n if (showHistoricPrices != null && map != null) {\r\n if (showHistoricPrices) {\r\n map.setLayoutProperty(\r\n 'pricehistorypoint',\r\n 'visibility',\r\n 'visible');\r\n\r\n map.setLayoutProperty(\r\n 'pricehistorylabel',\r\n 'visibility',\r\n 'visible');\r\n }\r\n else {\r\n map.setLayoutProperty(\r\n 'pricehistorypoint',\r\n 'visibility',\r\n 'none');\r\n map.setLayoutProperty(\r\n 'pricehistorylabel',\r\n 'visibility',\r\n 'none');\r\n }\r\n }\r\n }, [showHistoricPrices, map]);\r\n\r\n useEffect(() => {\r\n if (showCrime != null && map != null) {\r\n if (showCrime) {\r\n map.setLayoutProperty(\r\n 'crimepoint',\r\n 'visibility',\r\n 'visible');\r\n\r\n map.setLayoutProperty(\r\n 'crimelabel',\r\n 'visibility',\r\n 'visible');\r\n }\r\n else {\r\n map.setLayoutProperty(\r\n 'crimepoint',\r\n 'visibility',\r\n 'none');\r\n map.setLayoutProperty(\r\n 'crimelabel',\r\n 'visibility',\r\n 'none');\r\n }\r\n }\r\n }, [showCrime, map]);\r\n\r\n useEffect(() => {\r\n console.log(showSchools);\r\n if (showSchools != null && map != null) {\r\n if (showSchools) {\r\n map.setLayoutProperty(\r\n 'schooltext',\r\n 'visibility',\r\n 'visible');\r\n\r\n map.setLayoutProperty(\r\n 'schoolpoint',\r\n 'visibility',\r\n 'visible');\r\n }\r\n else {\r\n map.setLayoutProperty(\r\n 'schooltext',\r\n 'visibility',\r\n 'none');\r\n map.setLayoutProperty(\r\n 'schoolpoint',\r\n 'visibility',\r\n 'none');\r\n }\r\n }\r\n }, [showSchools, map]);\r\n\r\n useEffect(() => {\r\n if (map != null && map.getSource('highlightPointData') != null) {\r\n if (activePropertyCoords == null || showProps == false) {\r\n map.getSource('highlightPointData').setData(emptySource);\r\n spider.current.unspiderfy();\r\n setActiveMarker(null);\r\n } else {\r\n\r\n console.log(\"activePropertyCoords\", activePropertyCoords);\r\n\r\n //3 cases: blue point selected, red point selected not spidered, red point selected; spidered.\r\n if (activePropertyCoords.server) {\r\n //is server point (red)\r\n let currentLegs = spider.current.getCurrentLegs();\r\n console.log(\"currentLegs\", currentLegs);\r\n let targetIsSpidered = false;\r\n let selectedSpiderNode = null;\r\n let iLoc = 0;\r\n currentLegs.every(a => {\r\n if (a.feature != null && a.feature.id != null) {\r\n if (a.feature.id == activePropertyCoords.selectedId) {\r\n targetIsSpidered = true;\r\n selectedSpiderNode = a;\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n\r\n if (targetIsSpidered) {\r\n //red point; spidered.\r\n console.log(\"WAS SPIDERED\");\r\n }\r\n else {\r\n //red point; not spidered.\r\n spider.current.unspiderfy();\r\n console.log(\"activePropertyCoords.coords\", activePropertyCoords.coords);\r\n let point = map.project([activePropertyCoords.coords[0], activePropertyCoords.coords[1]]);\r\n const features = map.queryRenderedFeatures(point, {\r\n layers: ['detailClusterLayer']\r\n });\r\n console.log(\"activePropertyFeatures\", features);\r\n\r\n\r\n let f = features[0];\r\n if (f) {\r\n console.log(f.geometry.coordinates);\r\n let propArr = JSON.parse(f.properties.collection);\r\n console.log(propArr);\r\n\r\n spider.current.spiderfy(f.geometry.coordinates, propArr);\r\n currentLegs = spider.current.getCurrentLegs();\r\n console.log(\"current legs post spider\", currentLegs);\r\n\r\n currentLegs.every((a, i) => {\r\n if (a.feature != null && a.feature.id != null) {\r\n if (a.feature.id == activePropertyCoords.selectedId) {\r\n selectedSpiderNode = a;\r\n iLoc = i;\r\n return false;\r\n }\r\n }\r\n return true;\r\n });\r\n }\r\n }\r\n\r\n if (selectedSpiderNode) {\r\n console.log(\"found node\");\r\n let style = {\r\n marginLeft: selectedSpiderNode.elements.container.marginLeft,\r\n marginTop: selectedSpiderNode.elements.container.marginTop,\r\n transform: selectedSpiderNode.elements.container.transform,\r\n };\r\n\r\n var placeholder = document.createElement('div')\r\n //const rendered = ReactDOM.render(markerHtml, placeholder);\r\n //let markerElement = { element: rendered };\r\n var innerPlaceholder = document.createElement(\"div\");\r\n\r\n innerPlaceholder.innerHTML =\r\n '' +\r\n '' +\r\n '' +\r\n selectedSpiderNode.feature.priceStr +\r\n '' +\r\n '';\r\n //console.log(\"MARG\",selectedSpiderNode.elements.container.marginLeft);\r\n placeholder.style['margin-left'] = selectedSpiderNode.elements.container.style.marginLeft;\r\n placeholder.style['margin-top'] = selectedSpiderNode.elements.container.style.marginTop;\r\n placeholder.style['z-index'] = 0;\r\n placeholder.style['cursor'] = 'pointer';\r\n\r\n if (!targetIsSpidered) {\r\n innerPlaceholder.className = 'spider-selected-marker animate initial';\r\n\r\n setTimeout(function () {\r\n innerPlaceholder.className = (innerPlaceholder.className || '').replace('initial', '');\r\n innerPlaceholder.style['transitionDelay'] = ((150 / 1000) / currentLegs.length * iLoc * 3) + 's';\r\n });\r\n }\r\n\r\n placeholder.appendChild(innerPlaceholder);\r\n\r\n let marker = new maplibregl.Marker(placeholder).setLngLat(activePropertyCoords.coords);\r\n //console.log(\"rendered\",rendered);\r\n console.log(\"MARKER\", marker);\r\n setActiveMarker(marker);\r\n }\r\n else {\r\n console.log(\"didn't find node\");\r\n }\r\n }\r\n else {\r\n\r\n\r\n //is blue point.\r\n console.log(\"BLUE POINT\");\r\n spider.current.unspiderfy();\r\n var placeholder = document.createElement(\"div\");\r\n\r\n placeholder.innerHTML =\r\n '' +\r\n '' +\r\n '' +\r\n activePropertyCoords.val +\r\n '' +\r\n '';\r\n placeholder.style['cursor'] = 'pointer';\r\n let marker = new maplibregl.Marker(placeholder).setLngLat(activePropertyCoords.coords);\r\n setActiveMarker(marker);\r\n //\r\n //let geojson = {\r\n // 'type': 'FeatureCollection',\r\n // 'features': []\r\n //};\r\n\r\n //let point = {\r\n // 'type': 'Feature',\r\n // 'geometry': {\r\n // \"coordinates\": [activePropertyCoords.coords[0], activePropertyCoords.coords[1]],\r\n // \"type\": \"Point\"\r\n // },\r\n // 'properties': {\r\n // 'val': activePropertyCoords.val\r\n // }\r\n //};\r\n\r\n //geojson.features.push(point);\r\n\r\n\r\n //map.getSource('highlightPointData').setData(geojson);\r\n }\r\n }\r\n\r\n }\r\n }, [activePropertyCoords, map, showProps]);\r\n\r\n\r\n const emptySourceGeoJson = {\r\n 'type': 'geojson',\r\n 'data': {\r\n 'type': 'FeatureCollection',\r\n 'features': []\r\n }\r\n };\r\n\r\n //pretty naff, do this better...\r\n const emptySource = {\r\n 'type': 'FeatureCollection',\r\n 'features': []\r\n };\r\n\r\n\r\n\r\n useEffect(() => {\r\n if (map != null && map.getSource('plotPoly') != null) {\r\n if (poly == null) {\r\n //remove source.\r\n map.getSource('plotPoly').setData(emptySource);\r\n }\r\n else {\r\n //overwrite source.\r\n let geojson = {\r\n 'type': 'FeatureCollection',\r\n 'features': []\r\n };\r\n let pol = {\r\n 'type': 'Feature',\r\n 'geometry': JSON.parse(poly),\r\n 'properties': {\r\n 'id': String(new Date().getTime())\r\n }\r\n };\r\n geojson.features.push(pol);\r\n map.getSource('plotPoly').setData(geojson);\r\n }\r\n }\r\n }, [poly, map]);\r\n\r\n useEffect(() => {\r\n if (map != null && map.getSource('crimes') != null) {\r\n if (poly == null) {\r\n //remove source.\r\n\r\n map.getSource('crimes').setData(emptySource);\r\n }\r\n else {\r\n //overwrite source.\r\n let geojson = {\r\n 'type': 'FeatureCollection',\r\n 'features': []\r\n };\r\n crimes.forEach(i => {\r\n let pol = {\r\n 'type': 'Feature',\r\n 'geometry': {\r\n \"coordinates\": [i.Location.Longitude, i.Location.Latitude],\r\n \"type\": \"Point\"\r\n },\r\n 'properties': {\r\n 'id': i.Id,\r\n 'location': i.LocationDescription,\r\n 'crimetypes': i.Types\r\n }\r\n };\r\n\r\n geojson.features.push(pol);\r\n });\r\n\r\n\r\n map.getSource('crimes').setData(geojson);\r\n }\r\n }\r\n }, [crimes, map]);\r\n\r\n useEffect(() => {\r\n if (map != null && map.getSource('schools') != null) {\r\n if (poly == null) {\r\n //remove source.\r\n map.getSource('schools').setData(emptySource);\r\n map.getSource('schoolCatchments').setData(emptySource);\r\n }\r\n else {\r\n //overwrite source.\r\n let geojson = {\r\n 'type': 'FeatureCollection',\r\n 'features': []\r\n };\r\n\r\n let geojsonCatchments = {\r\n 'type': 'FeatureCollection',\r\n 'features': []\r\n };\r\n schools.forEach(i => {\r\n let center = [i.Location.Longitude, i.Location.Latitude];\r\n let radius = i.CatchmentMetresMed / 1000;\r\n let options = { steps: 120, units: 'kilometers', properties: { id: i.SchoolId } }\r\n let circlePoly = circle(center, radius, options);\r\n //let circleFeature = {\r\n // 'type': 'Feature',\r\n // circlePoly,\r\n // //'geometry': {\r\n // // \"coordinates\": circlePoly,\r\n // // \"type\": \"Polygon\"\r\n // //},\r\n // 'properties': {\r\n // 'id':,\r\n // }\r\n //};\r\n\r\n let circleFeature = circlePoly;\r\n let pointFeature = {\r\n 'type': 'Feature',\r\n 'geometry': {\r\n \"coordinates\": [i.Location.Longitude, i.Location.Latitude],\r\n \"type\": \"Point\"\r\n },\r\n 'properties': {\r\n 'id': i.SchoolId,\r\n 'type': i.SchoolType,\r\n 'offsted': i.OfstedRatingString,\r\n 'capcity': i.PercentCapacity,\r\n 'size': i.SchoolSize,\r\n 'name': i.SchoolName,\r\n 'sex': i.Sex,\r\n 'denomination': i.Denomination,\r\n 'structure': i.Structure\r\n }\r\n };\r\n\r\n circlePoly['id'] = i.SchoolId;\r\n pointFeature['id'] = i.SchoolId;\r\n\r\n geojson.features.push(pointFeature);\r\n geojsonCatchments.features.push(circleFeature);\r\n\r\n });\r\n\r\n map.getSource('schools').setData(geojson);\r\n map.getSource('schoolCatchments').setData(geojsonCatchments);\r\n }\r\n }\r\n }, [schools, map]);\r\n\r\n useEffect(() => {\r\n if (map != null && toggleFly != null && toggleFly.loc != null) {\r\n console.log(\"TOGGLEFLY\", toggleFly);\r\n map.flyTo({\r\n padding: {\r\n left: toggleFly.left,\r\n right: toggleFly.right\r\n },\r\n speed: toggleFly.loc.zoom == null ? 1 : 1,\r\n zoom: toggleFly.loc.zoom == null ? 16 : Number(toggleFly.loc.zoom),\r\n center: [Number(toggleFly.loc.longitude), Number(toggleFly.loc.latitude)]\r\n });\r\n }\r\n }, [toggleFly, map]);\r\n\r\n\r\n //useEffect(() => {\r\n // if (init) {\r\n // if (productData) {\r\n // let geojson = {\r\n // 'type': 'FeatureCollection',\r\n // 'features': [{\r\n // 'type': 'Feature',\r\n // 'geometry': {\r\n // \"coordinates\": [productData.lon, productData.lat],\r\n // \"type\": \"Point\"\r\n // },\r\n // 'properties': {\r\n // 'id': productData.id,\r\n // }\r\n // }]\r\n // };\r\n\r\n // map.setFilter('detailLayer', [\"all\", ['!=', [\"get\", \"id\"], productData.id], [\"any\", ['==', \"grp\", false], ['has', 'point_count']]]);\r\n // map.getSource('selectedPoint').setData(geojson);\r\n // }\r\n // else {\r\n // map.setFilter('detailLayer', [\"any\", ['==', \"grp\", false], ['has', 'point_count']]);\r\n // map.getSource('selectedPoint').setData(emptySource);\r\n // }\r\n // }\r\n //}, [productData, map]);\r\n\r\n useEffect(() => {\r\n if (map != null) {\r\n if (typeof map.getSource('clusterData') === 'undefined' || typeof map.getSource('resultData') === 'undefined') {\r\n console.log(\"SETTING SOURCE\");\r\n //initial setup - not the best place to do this really...\r\n let clusterSource = emptySourceGeoJson;\r\n clusterSource.cluster = true;\r\n clusterSource.clusterProperties = { \"sum\": [\"+\", [\"get\", \"count\",]] };\r\n clusterSource.clusterRadius = 75;\r\n map.addSource('clusterData', clusterSource);\r\n clusterSource.cluster = true;\r\n clusterSource.clusterProperties = {\r\n \"sum\": [\"+\", [\"get\", \"cnt\",]],\r\n \"myids\": [\"concat\", [\"concat\", [\"get\", \"id\"], \",\"]],\r\n /*\"propData\": [\"concat\", [\"concat\", [\"get\", \"id\"], \";\", [\"get\", \"priceStr\"], \",\"]],*/\r\n \"propData\": [\"concat\",\r\n [\"case\",\r\n [\"has\", \"idPriceStr\"], [\"get\", \"idPriceStr\"],\r\n [\"concat\", [\"get\", \"id\"], \";\", [\"get\", \"priceStr\"], \",\"]\r\n ], \",\"\r\n ]\r\n };\r\n\r\n clusterSource.clusterRadius = 25;\r\n clusterSource.clusterMaxZoom = 23;\r\n map.addSource('resultData', emptySourceGeoJson);\r\n clusterSource.cluster = false;\r\n clusterSource.clusterProperties = null;\r\n map.addSource('plotPoly', emptySourceGeoJson);\r\n map.addSource('crimes', emptySourceGeoJson);\r\n map.addSource('schools', emptySourceGeoJson);\r\n map.addSource('schoolCatchments', emptySourceGeoJson);\r\n map.addSource('selectedPoint', emptySourceGeoJson);\r\n map.addSource('highlightPointData', emptySourceGeoJson);\r\n\r\n }\r\n\r\n if (typeof map.getLayer('detailLayer') === 'undefined') {\r\n //initial setup - not the best place to do this really...\r\n AddLayers(map);\r\n }\r\n\r\n setInit(true);\r\n }\r\n }, [map]);\r\n\r\n useEffect(() => {\r\n if (data != null && data.data != null && map != null) {\r\n //AddToLayer(map, data.data, productData);\r\n console.log(\"Data upd\");\r\n setLastHash(oldHash => {\r\n\r\n if (!showProps) {\r\n map.setLayoutProperty(\r\n 'clusters',\r\n 'visibility',\r\n 'none');\r\n map.setLayoutProperty(\r\n 'cluster-count',\r\n 'visibility',\r\n 'none');\r\n\r\n map.setLayoutProperty(\r\n 'detailLayer',\r\n 'visibility',\r\n 'none');\r\n\r\n map.setLayoutProperty(\r\n 'detailLayer-price',\r\n 'visibility',\r\n 'none');\r\n\r\n map.setLayoutProperty(\r\n 'detailClusterLayer',\r\n 'visibility',\r\n 'none');\r\n\r\n map.setLayoutProperty(\r\n 'detailClusterLayer-counts',\r\n 'visibility',\r\n 'none');\r\n\r\n return \"\";\r\n }\r\n\r\n if (oldHash === data.hash) {\r\n console.log(\"hash\", oldHash);\r\n return oldHash; //do nothing.\r\n }\r\n else {\r\n\r\n\r\n }\r\n\r\n //update data.\r\n if (data.data.data != null) {\r\n if (data.isItemResult) {\r\n console.log(\"setting result data\");\r\n map.getSource('resultData').setData(data.data.data);\r\n }\r\n else {\r\n map.getSource('clusterData').setData(data.data.data);\r\n }\r\n }\r\n\r\n //hide/show layers\r\n if (!data.isItemResult) {\r\n spider.current.unspiderfy();\r\n //aggregated\r\n map.setLayoutProperty(\r\n 'clusters',\r\n 'visibility',\r\n 'visible');\r\n map.setLayoutProperty(\r\n 'cluster-count',\r\n 'visibility',\r\n 'visible');\r\n\r\n map.setLayoutProperty(\r\n 'detailLayer',\r\n 'visibility',\r\n 'none');\r\n\r\n map.setLayoutProperty(\r\n 'detailLayer-price',\r\n 'visibility',\r\n 'none');\r\n\r\n map.setLayoutProperty(\r\n 'detailClusterLayer',\r\n 'visibility',\r\n 'none');\r\n\r\n map.setLayoutProperty(\r\n 'detailClusterLayer-counts',\r\n 'visibility',\r\n 'none');\r\n\r\n } else {\r\n //detail\r\n map.setLayoutProperty(\r\n 'clusters',\r\n 'visibility',\r\n 'none');\r\n map.setLayoutProperty(\r\n 'cluster-count',\r\n 'visibility',\r\n 'none');\r\n map.setLayoutProperty(\r\n 'detailLayer',\r\n 'visibility',\r\n 'visible');\r\n map.setLayoutProperty(\r\n 'detailLayer-price',\r\n 'visibility',\r\n 'visible');\r\n map.setLayoutProperty(\r\n 'detailClusterLayer',\r\n 'visibility',\r\n 'visible');\r\n map.setLayoutProperty(\r\n 'detailClusterLayer-counts',\r\n 'visibility',\r\n 'visible');\r\n }\r\n\r\n\r\n return data.hash;\r\n\r\n });\r\n console.log(\"Data upd done\");\r\n }\r\n }, [productData, map, data, showProps])\r\n\r\n const AddLayers = (mapLocal) => {\r\n\r\n console.log(\"Adding layers\");;\r\n mapLocal.addLayer({\r\n id: 'detailLayer',\r\n type: 'circle',\r\n source: 'resultData',\r\n filter: [\"any\", ['==', \"grp\", false], ['has', 'point_count']],\r\n paint: {\r\n 'circle-color': theme.palette.mapicons.background,\r\n 'circle-radius': 14,\r\n 'circle-stroke-width': [\r\n \"case\",\r\n ['has', 'point_count'],\r\n 2,\r\n 1,\r\n ],\r\n 'circle-stroke-color': theme.palette.mapicons.primary,\r\n }\r\n });\r\n\r\n mapLocal.addLayer({\r\n id: 'detailLayer-price',\r\n type: 'symbol',\r\n source: 'resultData',\r\n filter: [\"any\", ['==', \"grp\", false], ['has', 'point_count']],\r\n textAllowOverlap: true,\r\n paint: {\r\n \"text-color\": theme.palette.mapicons.primary\r\n },\r\n layout: {\r\n \"text-field\": [\r\n \"case\",\r\n ['has', 'point_count'],\r\n [\"get\", \"sum\"],\r\n [\"get\", \"priceStr\"],\r\n ],\r\n 'text-font': [\r\n 'Open Sans Semibold'\r\n ],\r\n 'text-size': 10\r\n }\r\n });\r\n\r\n mapLocal.addLayer({\r\n 'id': 'selectedPropertyDotLayer',\r\n type: 'circle',\r\n 'source': 'selectedPoint',\r\n paint: {\r\n 'circle-color': '#f00',\r\n 'circle-radius': 4,\r\n 'circle-stroke-width': 1,\r\n 'circle-stroke-color': theme.palette.mapicons.background\r\n }\r\n });\r\n\r\n mapLocal.addLayer({\r\n id: 'detailClusterLayer',\r\n type: 'circle',\r\n source: 'resultData',\r\n filter: ['==', \"grp\", true],\r\n paint: {\r\n 'circle-color': theme.palette.mapicons.altBackground,\r\n 'circle-radius': 14,\r\n 'circle-stroke-width': 2,\r\n 'circle-stroke-color': theme.palette.mapicons.alt,\r\n }\r\n });\r\n\r\n mapLocal.addLayer({\r\n id: 'detailClusterLayer-counts',\r\n type: 'symbol',\r\n source: 'resultData',\r\n filter: ['==', \"grp\", true],\r\n textAllowOverlap: true,\r\n paint: {\r\n \"text-color\": theme.palette.mapicons.alt,\r\n },\r\n layout: {\r\n \"text-field\": [\"concat\", [\"get\", \"cnt\"], \"...\"],\r\n 'text-font': [\r\n 'Open Sans Semibold'\r\n ],\r\n 'text-size': 10\r\n }\r\n });\r\n\r\n map.addLayer({\r\n id: 'clusters',\r\n type: 'circle',\r\n source: 'clusterData',\r\n //filter: ['has', 'point_count'],\r\n paint: {\r\n //'circle-color': \"#fee\",\r\n 'circle-color': theme.palette.mapicons.background,\r\n 'circle-radius': [\r\n 'step',\r\n [\"coalesce\", [\"get\", \"sum\"], [\"get\", \"count\"]],\r\n 30,\r\n 100,\r\n 40,\r\n 1000,\r\n 50\r\n ],\r\n //'circle-stroke-color': \"#8b0000\",\r\n 'circle-stroke-color': theme.palette.mapicons.primary,\r\n 'circle-stroke-width': 3,\r\n }\r\n });\r\n\r\n mapLocal.addLayer({\r\n id: 'cluster-count',\r\n type: 'symbol',\r\n source: 'clusterData',\r\n //filter: ['has', 'point_count'],\r\n layout: {\r\n //\"text-field\": [\"concat\", [\"coalesce\", [\"get\", \"sum\"], [\"get\", \"count\"]], \" - \", ['get', 'label']],\r\n \"text-field\": [\"coalesce\", [\"get\", \"sum\"], [\"get\", \"count\"]],\r\n 'text-font': [\r\n 'Open Sans Semibold'\r\n ],\r\n 'text-size': 12\r\n }\r\n });\r\n\r\n //selected point layer:\r\n mapLocal.addLayer({\r\n id: 'selectedPointLayer',\r\n type: 'circle',\r\n source: 'highlightPointData',\r\n paint: {\r\n 'circle-color': theme.palette.mapicons.primary,\r\n 'circle-radius': 18,\r\n 'circle-stroke-width': 3,\r\n 'circle-stroke-color': theme.palette.mapicons.background,\r\n }\r\n });\r\n\r\n\r\n mapLocal.addLayer({\r\n id: 'selectedPointLayer-price',\r\n type: 'symbol',\r\n source: 'highlightPointData',\r\n textAllowOverlap: true,\r\n paint: {\r\n \"text-color\": theme.palette.mapicons.background\r\n },\r\n layout: {\r\n \"text-field\": [\"get\", \"val\"],\r\n 'text-font': [\r\n 'Open Sans Bold'\r\n ],\r\n 'text-size': 12,\r\n }\r\n });\r\n\r\n //crimes\r\n mapLocal.addLayer({\r\n 'id': 'crimesLayer',\r\n 'type': 'symbol',\r\n 'source': 'crimes',\r\n 'layout': {\r\n 'icon-image': 'police',\r\n 'icon-size': 0.3,\r\n 'icon-allow-overlap': true,\r\n }\r\n });\r\n\r\n mapLocal.addLayer({\r\n 'id': 'schoolsLayer',\r\n 'type': 'symbol',\r\n 'source': 'schools',\r\n 'layout': {\r\n 'icon-image': 'school',\r\n 'icon-size': 0.3,\r\n 'icon-allow-overlap': true,\r\n }\r\n });\r\n\r\n //schoolCatchments\r\n mapLocal.addLayer({\r\n 'id': 'schoolCatchmentsLayer',\r\n 'type': 'fill',\r\n 'source': 'schoolCatchments', // reference the data source\r\n 'layout': {},\r\n 'paint': {\r\n 'fill-color': '#004080', // blue color fill\r\n //'fill-opacity': 0.05,\r\n //'visibility':\r\n // ['case',\r\n // ['==', ['feature-state', 'vis'], null], 'none', 'visible'\r\n // ],\r\n 'fill-opacity':\r\n ['case',\r\n ['==', ['feature-state', 'vis'], null], 0, 0.5\r\n ],\r\n 'fill-outline-color': '#000000'\r\n }\r\n });\r\n\r\n mapLocal.addLayer({\r\n 'id': 'plotLayer',\r\n 'type': 'fill',\r\n 'source': 'plotPoly', // reference the data source\r\n 'layout': {},\r\n 'paint': {\r\n 'fill-color': '#0080ff', // blue color fill\r\n 'fill-opacity': 0.2\r\n }\r\n });\r\n // Add a black outline around the polygon.\r\n mapLocal.addLayer({\r\n 'id': 'plotOutline',\r\n 'type': 'line',\r\n 'source': 'plotPoly',\r\n 'layout': {},\r\n 'paint': {\r\n 'line-color': '#000',\r\n 'line-width': 3\r\n }\r\n });\r\n }\r\n\r\n\r\n const SetupMouseOver = (mapLocal) => {\r\n\r\n var popup = new maplibregl.Popup({\r\n closeButton: false,\r\n closeOnClick: true,\r\n className: \"removeMapBoxPopupPadding maxWidth600\"\r\n });\r\n\r\n mapLocal.on('mouseenter', 'detailLayer', function (e) {\r\n // Change the cursor style as a UI indicator.\r\n mapLocal.getCanvas().style.cursor = 'pointer';\r\n });\r\n\r\n mapLocal.on('mouseenter', 'detailClusterLayer', function (e) {\r\n // Change the cursor style as a UI indicator.\r\n mapLocal.getCanvas().style.cursor = 'pointer';\r\n });\r\n\r\n mapLocal.on('mouseleave', 'detailClusterLayer', function () {\r\n mapLocal.getCanvas().style.cursor = '';\r\n });\r\n\r\n //mapLocal.on('mouseenter', 'detailLayer', function (e) {\r\n // // Change the cursor style as a UI indicator.\r\n // mapLocal.getCanvas().style.cursor = 'pointer';\r\n // var coordinates = e.features[0].geometry.coordinates.slice();\r\n // var description = e.features[0].properties.description;\r\n // var price = e.features[0].properties.price;\r\n // var sqFt = e.features[0].properties.sqFt;\r\n // var postCode = e.features[0].properties.postCode;\r\n\r\n // var tblData = [[\"Postcode\", postCode], [\"Sqft\", sqFt], [\"bathrooms\", e.features[0].properties.bathrooms], [\"bedrooms\", e.features[0].properties.bedrooms]];\r\n\r\n // var dom = (\r\n // \r\n // \r\n // {description}\r\n // £{price}\r\n // \r\n // \r\n // \r\n // )\r\n\r\n // var placeholder = document.createElement('div')\r\n // ReactDOM.render(dom, placeholder);\r\n\r\n // // Ensure that if the map is zoomed out such that multiple\r\n // // copies of the feature are visible, the popup appears\r\n // // over the copy being pointed to.\r\n // while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {\r\n // coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;\r\n // }\r\n\r\n // // Populate the popup and set its coordinates\r\n // // based on the feature found.\r\n // //popup.setLngLat(coordinates).setHTML(html).addTo(mapLocal);\r\n // popup.setLngLat(coordinates).setDOMContent(placeholder).addTo(mapLocal);\r\n //});\r\n\r\n mapLocal.on('mouseenter', 'crimesLayer', function (e) {\r\n // Change the cursor style as a UI indicator.\r\n mapLocal.getCanvas().style.cursor = 'pointer';\r\n var coordinates = e.features[0].geometry.coordinates.slice();\r\n var crimetype = JSON.parse(e.features[0].properties.crimetypes);\r\n var month = e.features[0].properties.month;\r\n //TODO: redo this at indexer - cluster by lat long, and then by crimetype to give counts and date array. render as pie?\r\n var dataState = [];\r\n crimetype.forEach(a => dataState.push([a.Name, a.TotalCount]));\r\n var placeholder = document.createElement('div')\r\n var tbl = (\r\n \r\n )\r\n ReactDOM.render(tbl, placeholder);\r\n\r\n // Ensure that if the map is zoomed out such that multiple\r\n // copies of the feature are visible, the popup appears\r\n // over the copy being pointed to.\r\n while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {\r\n coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;\r\n }\r\n\r\n // Populate the popup and set its coordinates\r\n // based on the feature found.\r\n popup.setLngLat(coordinates).setDOMContent(placeholder).addTo(mapLocal);\r\n });\r\n\r\n //schools\r\n mapLocal.on('mouseenter', 'schoolsLayer', function (e) {\r\n // Change the cursor style as a UI indicator.\r\n mapLocal.getCanvas().style.cursor = 'pointer';\r\n\r\n mapLocal.setFeatureState({\r\n source: 'schoolCatchments',\r\n id: e.features[0].id\r\n }, {\r\n vis: 1\r\n });\r\n\r\n\r\n var coordinates = e.features[0].geometry.coordinates.slice();\r\n var name = e.features[0].properties.name;\r\n var offsted = e.features[0].properties.offsted;\r\n var schoolType = e.features[0].properties.schoolType;\r\n var structure = e.features[0].properties.structure;\r\n var capacity = e.features[0].properties.capcity;\r\n var size = e.features[0].properties.size;\r\n var sex = e.features[0].properties.sex;\r\n var denomination = e.features[0].properties.denomination;\r\n //TODO: redo this at indexer - cluster by lat long, and then by crimetype to give counts and date array. render as pie?\r\n //var html = `
${name}

Offsted: ${offsted}
`\r\n //if (schoolType != undefined) {\r\n // html += `${schoolType} - ${structure}
`\r\n //}\r\n //else {\r\n // html += `${structure}
`\r\n //}\r\n //html += `${capcity}% capacity (${size})
Gender: ${sex}
Denomination: ${denomination}

`\r\n var tblData = [[\"Offsted\", offsted], [\"Capacity\", capacity], [\"Size\", size], [\"Gender\", sex], [\"Denomination\", denomination]];\r\n\r\n var dom = (\r\n \r\n \r\n {name}\r\n {schoolType != undefined && schoolType + \" - \"}{structure}\r\n \r\n \r\n \r\n )\r\n\r\n var placeholder = document.createElement('div')\r\n ReactDOM.render(dom, placeholder);\r\n\r\n // Ensure that if the map is zoomed out such that multiple\r\n // copies of the feature are visible, the popup appears\r\n // over the copy being pointed to.\r\n while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {\r\n coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;\r\n }\r\n\r\n // Populate the popup and set its coordinates\r\n // based on the feature found.\r\n //popup.setLngLat(coordinates).setHTML(html).addTo(mapLocal);\r\n popup.setLngLat(coordinates).setDOMContent(placeholder).addTo(mapLocal);\r\n });\r\n\r\n mapLocal.on('click', 'detailLayer', function (e) {\r\n var f = e.features[0];\r\n if (f.properties.cluster) {\r\n mapLocal.getSource('resultData').getClusterExpansionZoom(\r\n f.properties.clusterId,\r\n (err, zoomX) => {\r\n console.log(\"zoomX\", zoomX);\r\n if (err) return;\r\n let targZoom = Number(mapLocal.getZoom().toFixed(2)) + 1.5\r\n mapLocal.easeTo({\r\n center: f.geometry.coordinates,\r\n zoom: targZoom,\r\n duration: 1500\r\n });\r\n }\r\n );\r\n }\r\n else {\r\n setPropertyMarkerClicked(a => f.properties.id);\r\n }\r\n spider.current.unspiderfy();\r\n console.log(\"detail layer click\", e.features);\r\n });\r\n\r\n mapLocal.on('mouseleave', 'detailLayer', function () {\r\n mapLocal.getCanvas().style.cursor = '';\r\n popup.remove();\r\n });\r\n\r\n //TODO: This has a bug. zoom doesn't work second time around.\r\n mapLocal.on('click', 'clusters', (e) => {\r\n const features = mapLocal.queryRenderedFeatures(e.point, {\r\n layers: ['clusters']\r\n });\r\n const clusterId = features[0].properties.cluster_id;\r\n mapLocal.getSource('clusterData').getClusterExpansionZoom(\r\n clusterId,\r\n (err, zoomX) => {\r\n if (err) return;\r\n let targZoom = Number(mapLocal.getZoom().toFixed(2)) + 2.5\r\n mapLocal.easeTo({\r\n center: features[0].geometry.coordinates,\r\n zoom: targZoom\r\n });\r\n }\r\n );\r\n });\r\n\r\n mapLocal.on('click', 'detailClusterLayer', (e) => {\r\n const features = mapLocal.queryRenderedFeatures(e.point, {\r\n layers: ['detailClusterLayer']\r\n });\r\n console.log(\"CLICK\", features);\r\n\r\n\r\n let f = features[0];\r\n console.log(f.geometry.coordinates);\r\n let propArr = JSON.parse(f.properties.collection);\r\n console.log(propArr);\r\n //let pol = {\r\n // 'type': 'Feature',\r\n // 'geometry': {\r\n // \"coordinates\": [i.Location.Longitude, i.Location.Latitude],\r\n // \"type\": \"Point\"\r\n // },\r\n // 'properties': {\r\n // 'id': i.Id,\r\n // 'location': i.LocationDescription,\r\n // 'crimetypes': i.Types\r\n // }\r\n //};\r\n\r\n spider.current.unspiderfy();\r\n //spider.current.spiderfy(f.geometry.coordinates, propArr);\r\n setPropertyMarkerClicked(propArr[0].id)\r\n });\r\n\r\n mapLocal.on('mouseleave', 'schoolsLayer', function (e) {\r\n var bbox = [\r\n [e.point.x - 20, e.point.y - 20],\r\n [e.point.x + 20, e.point.y + 20]\r\n ];\r\n var features = mapLocal.queryRenderedFeatures(bbox, {\r\n layers: ['schoolsLayer']\r\n });\r\n\r\n if (features.length == 0) {\r\n //failed to grab so remove ALL catchments.\r\n var x = mapLocal.querySourceFeatures('schoolCatchments');\r\n x.forEach(a => {\r\n mapLocal.setFeatureState({\r\n source: 'schoolCatchments',\r\n id: a.id\r\n }, {\r\n vis: null\r\n });\r\n });\r\n }\r\n else {\r\n features.forEach(a => {\r\n mapLocal.setFeatureState({\r\n source: 'schoolCatchments',\r\n id: a.id\r\n }, {\r\n vis: null\r\n });\r\n });\r\n }\r\n\r\n mapLocal.getCanvas().style.cursor = '';\r\n popup.remove();\r\n });\r\n\r\n mapLocal.on('mouseleave', 'crimesLayer', function () {\r\n mapLocal.getCanvas().style.cursor = '';\r\n popup.remove();\r\n });\r\n\r\n mapLocal.on('click', 'crimehexlayer', (event) => {\r\n console.log(\"clicky\", event.features[0].properties);\r\n });\r\n\r\n mapLocal.on('click', 'pricediffhex', (event) => {\r\n console.log(\"clicky\", event.features[0].properties);\r\n });\r\n\r\n mapLocal.on('click', 'pricehistoryhex', (event) => {\r\n console.log(\"clicky\", event.features[0].properties);\r\n });\r\n\r\n mapLocal.on('click', 'pricehistorypoint', (event) => {\r\n console.log(event);\r\n console.log(event.features);\r\n const features = mapLocal.queryRenderedFeatures(event.point, {\r\n layers: ['pricehistorypoint']\r\n });\r\n console.log(\"CLICK\", features);\r\n\r\n let placeholder = document.createElement('div');\r\n let dom = (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n ReactDOM.render(dom, placeholder);\r\n\r\n popup.setLngLat(event.features[0].geometry.coordinates).setDOMContent(placeholder).addTo(mapLocal);\r\n });\r\n\r\n mapLocal.on('click', 'schoolpoint', (event) => {\r\n console.log(event);\r\n console.log(event.features);\r\n const features = mapLocal.queryRenderedFeatures(event.point, {\r\n layers: ['schoolpoint']\r\n });\r\n console.log(\"school-CLICK\", features);\r\n if (features.length > 0) {\r\n setSelectedSchool(features[0].properties.Id);\r\n }\r\n });\r\n\r\n mapLocal.on('click', 'crimepoint', (event) => {\r\n const features = mapLocal.queryRenderedFeatures(event.point, {\r\n layers: ['crimepoint']\r\n });\r\n let placeholder = document.createElement('div');\r\n let dom = ();\r\n ReactDOM.render(dom, placeholder);\r\n\r\n var popupX = new maplibregl.Popup({\r\n closeButton: false,\r\n closeOnClick: true,\r\n className: \"trans\"\r\n });\r\n\r\n popupX.on('close', () => {\r\n console.log('Popup was closed');\r\n mapLocal.setPaintProperty(\r\n 'crimepoint',\r\n 'circle-opacity',\r\n {\r\n \"stops\": [\r\n [14, 0],\r\n [15, 1]\r\n ]\r\n }\r\n );\r\n mapLocal.setPaintProperty(\r\n 'crimepoint',\r\n 'circle-stroke-width',\r\n 1\r\n );\r\n mapLocal.setPaintProperty(\r\n 'crimelabel',\r\n 'text-opacity',\r\n {\r\n \"stops\": [\r\n [15, 0],\r\n [16, 1]\r\n ]\r\n }\r\n );\r\n });\r\n\r\n popupX.setLngLat(event.features[0].geometry.coordinates).setDOMContent(placeholder).addTo(mapLocal);\r\n mapLocal.setPaintProperty(\r\n 'crimepoint',\r\n 'circle-opacity',\r\n 0.1\r\n );\r\n mapLocal.setPaintProperty(\r\n 'crimepoint',\r\n 'circle-stroke-width',\r\n 0\r\n );\r\n mapLocal.setPaintProperty(\r\n 'crimelabel',\r\n 'text-opacity',\r\n 0\r\n );\r\n\r\n });\r\n }\r\n\r\n const SetupCrimePoint = (mapLocal, yearCrimeFilter) => {\r\n console.log(\"SETTING UP CRIME POINT\");\r\n\r\n if (oldFilter != null) {\r\n console.log(\"CLEARING\");\r\n mapLocal.off('click', 'crimepoint', oldFilter);\r\n }\r\n oldFilter = crimeClickFunc(mapLocal, yearCrimeFilter);\r\n\r\n\r\n }\r\n\r\n\r\n const Add3d = (mapLocal) => {\r\n //var layers = mapLocal.getStyle().layers;\r\n\r\n //var labelLayerId;\r\n //for (var i = 0; i < layers.length; i++) {\r\n // if (layers[i].type === 'symbol' && layers[i].layout['text-field']) {\r\n // labelLayerId = layers[i].id;\r\n // break;\r\n // }\r\n //}\r\n\r\n //mapLocal.addLayer(\r\n // {\r\n // 'id': '3d-buildings',\r\n // 'source': 'composite',\r\n // 'source-layer': 'building',\r\n // 'filter': ['==', 'extrude', 'true'],\r\n // 'type': 'fill-extrusion',\r\n // 'minzoom': 12,\r\n // 'paint': {\r\n // 'fill-extrusion-color': '#aaa',\r\n\r\n // // use an 'interpolate' expression to add a smooth transition effect to the\r\n // // buildings as the user zooms in\r\n // 'fill-extrusion-height': [\r\n // 'interpolate',\r\n // ['linear'],\r\n // ['zoom'],\r\n // 13,\r\n // 0,\r\n // 13.1,\r\n // ['get', 'height']\r\n // ],\r\n // 'fill-extrusion-base': [\r\n // 'interpolate',\r\n // ['linear'],\r\n // ['zoom'],\r\n // 13,\r\n // 0,\r\n // 13.1,\r\n // ['get', 'min_height']\r\n // ],\r\n // 'fill-extrusion-opacity': 0.6\r\n // }\r\n // },\r\n // labelLayerId\r\n //);\r\n }\r\n\r\n const SetClusterData = (mapLocal) => {\r\n var mapLayer = mapLocal.getLayer('detailLayer');\r\n if (typeof mapLayer !== 'undefined') {\r\n let detailLayer = mapLocal.queryRenderedFeatures({\r\n layers: ['detailLayer']\r\n });\r\n if (detailLayer !== 'undefined' && Array.isArray(detailLayer)) {\r\n const uniqueIds = new Set();\r\n const clusteredPoints = [];\r\n detailLayer.forEach(i => {\r\n if (i.id != undefined && i.id > -1) {\r\n const id = i.id;\r\n if (!uniqueIds.has(id)) {\r\n uniqueIds.add(id);\r\n //uniqueFeatures.push(feature);\r\n console.log(\"uniqueClusterFeature\", i);\r\n i.properties.propData.split(',').filter(a => a.length > 0).forEach(j => {\r\n let propDataArr = j.split(';')\r\n clusteredPoints.push({\r\n \"id\": propDataArr[0],\r\n \"value\": propDataArr[1],\r\n \"cords\": i.geometry.coordinates,\r\n \"clusterId\": id,\r\n \"sum\": i.properties.sum\r\n });\r\n });\r\n }\r\n }\r\n });\r\n console.log(\"clusterPoints\", clusteredPoints);\r\n setClusterPoints(a => {\r\n if (clusteredPoints == null && a == null) {\r\n return a;\r\n }\r\n if (clusteredPoints.length != a.length) {\r\n return clusteredPoints;\r\n }\r\n\r\n for (var i = 0; i < a.length; ++i) {\r\n if (a[i].id !== clusteredPoints[i].id) return clusteredPoints;\r\n }\r\n return a;\r\n });\r\n }\r\n }\r\n };\r\n\r\n\r\n useEffect(() => {\r\n const initMap = ({ setMap, mapContainer }) => {\r\n //mapbox://styles/housec84/ckqccqfbe03r718o40dwed8e0?optimize=true sat\r\n //mapbox://styles/housec84/ckouk806n1vxr17lkaic8078y?optimize=true street\r\n\r\n var bounds = [[-15, 49], [3.4, 61]];\r\n const mapLocal = new maplibregl.Map({\r\n container: mapContainer.current,\r\n //style: 'mapbox://styles/mapbox/streets-v11',\r\n style: process.env.PUBLIC_URL + \"/style.json\",\r\n dark: false,\r\n center: [lng, lat],\r\n zoom: zoom,\r\n maxBounds: bounds\r\n });\r\n\r\n spider.current = new MapboxglSpiderifier(mapLocal, maplibregl, theme, {\r\n onClick: function (e, spiderLeg) {\r\n console.log('Clicked on ', spiderLeg);\r\n console.log(\"APC\", activePropertyCoords);\r\n setPropertyMarkerClicked(a => spiderLeg.feature.id);\r\n },\r\n onUnclick: () => {\r\n setPropertyMarkerClicked(-1);\r\n //setActivePropertyCoords(null);\r\n setActiveMarker(null);\r\n console.log(\"UNSET\");\r\n },\r\n markerWidth: 40,\r\n markerHeight: 40,\r\n }, React);\r\n\r\n //mapLocal.addControl(new maplibregl.ScaleControl({\r\n // maxWidth: 500,\r\n // unit: 'metric'\r\n //}), 'top-right');\r\n\r\n mapLocal.on(\"load\", () => {\r\n console.log(\"LOAD\");\r\n setMap(mapLocal);\r\n setBounds(mapLocal.getBounds());\r\n Add3d(mapLocal);\r\n mapLocal.loadImage(\r\n 'https://docs.mapbox.com/mapbox-gl-js/assets/custom_marker.png',\r\n function (error, image) {\r\n mapLocal.addImage('custom-marker', image);\r\n });\r\n SetupMouseOver(mapLocal);\r\n });\r\n\r\n\r\n\r\n mapLocal.on('idle', () => {\r\n console.log(\"idle\");\r\n SetClusterData(mapLocal);\r\n\r\n });\r\n\r\n //mapLocal.on('sourcedata', (e) => {\r\n // console.log(e);\r\n // if (e.isSourceLoaded && e.sourceId == \"pricedata\") {\r\n // if (showHistoricPricesRef.current) {\r\n // console.log(\"getting price data from map\");\r\n // //let xx = mapLocal.querySourceFeatures('pricedata', {\r\n // // sourceLayer: 'outCluster',\r\n // // filter: ['in', [\"get\", \"year\"], [\"literal\", priceHistFilter]]\r\n // //});\r\n // setPriceHistData(xx);\r\n // setPriceHistProc(true);\r\n // }\r\n // }\r\n //});\r\n\r\n mapLocal.on('moveend', () => {\r\n console.log(\"MOVE END\");\r\n setLng(mapLocal.getCenter().lng.toFixed(4));\r\n setLat(mapLocal.getCenter().lat.toFixed(4));\r\n setZoom(mapLocal.getZoom().toFixed(2));\r\n try {\r\n let bounds = mapLocal.getBounds();\r\n setBounds(bounds);\r\n\r\n\r\n }\r\n catch (err) {\r\n console.log(err);\r\n }\r\n });\r\n\r\n mapLocal.scrollZoom.setWheelZoomRate(1 / 300); //default 1/450\r\n mapLocal.scrollZoom.setZoomRate(1 / 75); //default 1/100\r\n };\r\n\r\n if (!map) {\r\n initMap({ setMap, mapContainer });\r\n }\r\n\r\n }, [map]);\r\n\r\n //const debounce = (method, delayMs) => {\r\n // delayMs = delayMs || 200;\r\n // setTimer(null);\r\n // clearTimeout(timer);\r\n // var t = setTimeout(() => {\r\n // method()\r\n // }, delayMs);\r\n // setTimer(t);\r\n //}\r\n\r\n return (\r\n
\r\n );\r\n};\r\n\r\nexport default MapBox;\r\n","import React, { useRef, useEffect, useState, memo } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport MapBox from './MapBox';\r\n\r\nconst GeoNormalizer = (neLat, swLat, neLng, swLng) => {\r\n let percent = 0.10; //10%\r\n let latDiff = neLat - swLat;\r\n let lngDiff = neLng - swLng;\r\n\r\n //get diff magnitudes.\r\n let latMag = Math.pow(10, Math.floor(Math.log(latDiff) / Math.LN10 + 0.000000001) * -1) * 10;\r\n let lngMag = Math.pow(10, Math.floor(Math.log(lngDiff) / Math.LN10 + 0.000000001) * -1) * 10;\r\n console.log(\"latMag\", latMag);\r\n console.log(\"lngMag\", lngMag);\r\n //normalize diffs\r\n let latDiffNorm = Math.round(latDiff * latMag) / latMag;\r\n let lngDiffNorm = Math.round(lngDiff * lngMag) / lngMag;\r\n\r\n let stepLat = 1 / (latDiffNorm * percent);\r\n let stepLng = 1 / (lngDiffNorm * percent);\r\n console.log(\"stepLat\", stepLat);\r\n console.log(\"stepLng\", stepLng);\r\n\r\n let n = Math.floor(neLat * stepLat) / stepLat;\r\n let sigN = Math.floor(n * latMag) / latMag;\r\n\r\n let s = Math.ceil(swLat * stepLat) / stepLat;\r\n let nsAdjust = (n - s) * .15;\r\n let sigS = Math.ceil((s+nsAdjust) * latMag) / latMag;\r\n\r\n let w = Math.ceil(swLng * stepLng) / stepLng;\r\n let sigW = Math.ceil(w * lngMag) / lngMag;\r\n\r\n let e = Math.floor(neLng * stepLng) / stepLng;\r\n let sigE = Math.floor(e * lngMag) / lngMag;\r\n\r\n let rtn = { n: sigN, s: sigS, e: sigE, w: sigW };\r\n console.log(neLat, swLat, neLng, swLng);\r\n console.log(\"rtn\", rtn);\r\n return rtn;\r\n}\r\n\r\n\r\n\r\nconst QueryController = ({ bounds, filterTerms, zoom, setData }) => {\r\n \r\n const [timer, setTimer] = useState(null);\r\n \r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 100;\r\n setTimer(null);\r\n clearTimeout(timer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setTimer(t);\r\n }\r\n\r\n useEffect(() => {\r\n\r\n if (bounds) {\r\n debounce(() => {\r\n console.log(\"QueryController running\");\r\n let x = GeoNormalizer(bounds._ne.lat, bounds._sw.lat, bounds._ne.lng, bounds._sw.lng);\r\n var payload = {\r\n LatN: x.n,\r\n LatS: x.s,\r\n LonE: x.e,\r\n LonW: x.w,\r\n Zoom: zoom,\r\n FilterTerms: filterTerms.map(a => ({ \"label\": a.label, \"field\": a.field, \"type\":a.type, \"from\":a.from, \"to\":a.to }))\r\n };\r\n let url = \"https://api.propertypiper.com/api/filter/box3\";\r\n if (window.location.host.includes(\"propertypiper.co.uk\")) {\r\n url = \"https://api.propertypiper.co.uk/api/filter/box3\";\r\n }\r\n fetch(url, {\r\n //fetch(\"http://localhost:8001/api/filter/box3\", {\r\n //\r\n method: 'POST', \r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n redirect: \"follow\",\r\n body: JSON.stringify(payload),\r\n }).then((resp) => {\r\n if (resp.status == 200 && resp) {\r\n return resp.json();\r\n }\r\n console.log(resp);\r\n }).then(body => {\r\n setData(body);\r\n });\r\n });\r\n }\r\n }, [bounds, filterTerms, setData ]);\r\n\r\n return null;\r\n\r\n}\r\n\r\nexport default memo(QueryController);","import React, { memo } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n\r\n root: {\r\n flexGrow: 1,\r\n backgroundColor: theme.palette.background.paper,\r\n },\r\n}));\r\n\r\nconst ProductView = ({ item, tabHeader, tabPanels }) => {\r\n const classes = useStyles();\r\n\r\n if (item) {\r\n\r\n return (\r\n
\r\n {tabHeader}\r\n {tabPanels}\r\n
);\r\n }\r\n\r\n return (null);\r\n}\r\n\r\nexport default memo(ProductView);","import React, { useEffect, memo, useState } from 'react';\r\nimport ReactJson from 'react-json-view';\r\n\r\nconst useProductQuery = () => {\r\n\r\n const [product, setProduct] = useState(null);\r\n const thing = (id) => {\r\n if (id) {\r\n let url = `https://api.propertypiper.com/api/index/${id}`;\r\n if (window.location.host.includes(\"propertypiper.co.uk\")) {\r\n url = `https://api.propertypiper.co.uk/api/index/${id}`;\r\n }\r\n fetch(url, {\r\n // fetch(`http://localhost:8001/api/index/${id}`, {\r\n method: 'GET',\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n },\r\n redirect: \"follow\",\r\n }).then((resp) => {\r\n if (resp.status == 200 && resp) {\r\n return resp.text();\r\n //return resp.json(); // wierdly grabbing text and converting using JSON.parse later seems faster? Can't be right though... validate this.\r\n }\r\n }).then(body => {\r\n let p = JSON.parse(body);\r\n setProduct(p);\r\n });\r\n } else {\r\n setProduct(null);\r\n }\r\n };\r\n\r\n \r\n return [\r\n product,\r\n a => thing(a)\r\n ];\r\n}\r\n\r\nexport default useProductQuery;","import React from 'react';\r\nimport Backdrop from '@material-ui/core/Backdrop';\r\nimport CircularProgress from '@material-ui/core/CircularProgress';\r\nimport Button from '@material-ui/core/Button';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n backdrop: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n color: '#fff',\r\n },\r\n}));\r\n\r\n\r\nconst SimpleBackdrop = ({ open }) => {\r\n const classes = useStyles();\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default SimpleBackdrop;","import React, { useRef, useEffect, memo } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Drawer } from '@material-ui/core';\r\nimport SwipeableDrawer from '@mui/material/SwipeableDrawer'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n menuButton: {\r\n marginRight: theme.spacing(2)\r\n },\r\n hide: {\r\n display: \"none\"\r\n },\r\n drawer: {\r\n flexShrink: 0,\r\n },\r\n drawerPaper: {\r\n [theme.breakpoints.up(\"xs\")]: {\r\n width: \"50vw\",\r\n maxWidth: \"1200px\",\r\n top: \"48px\"\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n width: \"100%\",\r\n top: \"36px\"\r\n },\r\n height: \"100%\",\r\n pointerEvents: \"auto\",\r\n overflow:\"visible\"\r\n },\r\n spacer: {\r\n height: \"64px\"\r\n },\r\n labels: {\r\n margin: \"0px\"\r\n },\r\n visRight: {\r\n flexShrink: 0,\r\n height: \"100%\",\r\n [theme.breakpoints.up(\"xs\")]: {\r\n display: \"block\",\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n display: \"none\",\r\n },\r\n },\r\n visBottom: {\r\n flexShrink: 0,\r\n height: \"100%\",\r\n [theme.breakpoints.up(\"xs\")]: {\r\n display: \"none\"\r\n\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n display: \"block\"\r\n },\r\n }\r\n}));\r\n\r\nconst SideView = ({ open, setOpen, children, cnt, setSideViewWidth }) => {\r\n\r\n const classes = useStyles();\r\n const drawerBleeding = 56;\r\n const ref = useRef();\r\n\r\n\r\n useEffect(() => {\r\n const observer = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n setSideViewWidth(entry.contentRect.width);\r\n }\r\n });\r\n\r\n if (ref.current) {\r\n observer.observe(ref.current);\r\n }\r\n\r\n return () => {\r\n observer.disconnect();\r\n };\r\n }, []);\r\n\r\n return (\r\n <>\r\n
\r\n\r\n { }}\r\n onClose={() => setOpen(false)}\r\n swipeAreaWidth={drawerBleeding}\r\n classes={{\r\n paper: classes.drawerPaper\r\n }}\r\n PaperProps={{\r\n sx: {\r\n height: 'calc(100% -64px)', // Adjust as needed\r\n top: 64, // Offset for app bar\r\n },\r\n }}\r\n >\r\n\r\n
\r\n {children}\r\n
\r\n \r\n \r\n
\r\n
\r\n setOpen(false)}\r\n classes={{\r\n paper: classes.drawerPaper\r\n }}\r\n >\r\n
\r\n {children}\r\n
\r\n \r\n
\r\n \r\n );\r\n}\r\n\r\nexport default memo(SideView);","import React, { useRef, useEffect, useState, memo, forwardRef } from 'react';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport { Drawer, Grid } from '@material-ui/core';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n menuButton: {\r\n marginRight: theme.spacing(2)\r\n },\r\n hide: {\r\n display: \"none\"\r\n },\r\n drawer: {\r\n flexShrink: 0,\r\n },\r\n drawerPaper: {\r\n width: \"100vw\",\r\n pointerEvents: \"none\",\r\n justifyContent: \"flex-End\",\r\n backgroundColor: \"rgba(255,0,0,0)\",\r\n borderBottom: \"0px solid rgba(0, 0, 0, 0)\"\r\n },\r\n drawerHeader: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n padding: theme.spacing(0, 1),\r\n // necessary for content to be below app bar\r\n ...theme.mixins.toolbar,\r\n justifyContent: \"flex-start\"\r\n },\r\n labels: {\r\n //padding: \"0px 16px 0px 16px\"\r\n margin: \"0px\"\r\n },\r\n vis: {\r\n flexShrink: 0,\r\n height: \"100%\",\r\n },\r\n spacer: {\r\n [theme.breakpoints.up(\"xs\")]: {\r\n height: \"48px\"\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n height: \"32px\"\r\n },\r\n }\r\n}));\r\n\r\nconst TopView = ({ open, setOpen, children }) => {\r\n\r\n const theme = useTheme();\r\n const classes = useStyles();\r\n const drawerBleeding = 156;\r\n //32/48\r\n return (\r\n <>\r\n
\r\n setOpen(false)}\r\n classes={{\r\n paper: classes.drawerPaper\r\n }}\r\n >\r\n \r\n \r\n
\r\n
\r\n {children}\r\n
\r\n \r\n \r\n
\r\n \r\n );\r\n}\r\n\r\nexport default memo(TopView);","import React, { useRef, useEffect, useState, memo, forwardRef } from 'react';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport { Drawer } from '@material-ui/core';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n menuButton: {\r\n marginRight: theme.spacing(2)\r\n },\r\n hide: {\r\n display: \"none\"\r\n },\r\n drawer: {\r\n flexShrink: 0,\r\n },\r\n drawerPaper: {\r\n border: \"none\",\r\n width: \"100%\",\r\n [theme.breakpoints.up(theme.breakpoints.values.phone)]: {\r\n minWidth: \"300px\",\r\n },\r\n [theme.breakpoints.down(theme.breakpoints.values.phone)]: {\r\n minWidth: \"100%\",\r\n },\r\n height: \"400px\",\r\n backgroundColor: 'rgba(255, 255, 255, 0)',\r\n }\r\n}));\r\n\r\nconst BottomNav = ({ open, setOpen, showProps, children }, ref) => {\r\n\r\n const classes = useStyles();\r\n console.log(\"bottom render\");\r\n return (\r\n\r\n setOpen(false)}\r\n classes={{\r\n paper: classes.drawerPaper\r\n }}\r\n >\r\n
\r\n {children}\r\n
\r\n \r\n );\r\n}\r\n\r\nexport default memo(forwardRef(BottomNav));","/**\r\n * UI Initiative Carousel Slider\r\n *\r\n * Infinite 3D carousel slider\r\n *\r\n * https://uiinitiative.com\r\n *\r\n * Copyright 2022 UI Initiative\r\n *\r\n * Released under the UI Initiative Regular License\r\n *\r\n */\r\n\r\nexport default function CarouselSlider({ swiper, on }) {\r\n on(\"beforeInit\", () => {\r\n if (swiper.params.effect !== \"carousel\") return;\r\n swiper.classNames.push(`${swiper.params.containerModifierClass}carousel`);\r\n const overwriteParams = {\r\n watchSlidesProgress: true,\r\n centeredSlides: true,\r\n };\r\n\r\n Object.assign(swiper.params, overwriteParams);\r\n Object.assign(swiper.originalParams, overwriteParams);\r\n });\r\n on(\"progress\", () => {\r\n if (swiper.params.effect !== \"carousel\") return;\r\n const scaleStep = 0.2;\r\n const zIndexMax = swiper.slides.length;\r\n for (let i = 0; i < swiper.slides.length; i += 1) {\r\n const slideEl = swiper.slides[i];\r\n const slideProgress = swiper.slides[i].progress;\r\n const absProgress = Math.abs(slideProgress);\r\n let modify = 1;\r\n if (absProgress > 1) {\r\n modify = (absProgress - 1) * 0.3 + 1;\r\n }\r\n const opacityEls = slideEl.querySelectorAll(\r\n \".swiper-carousel-animate-opacity\"\r\n );\r\n const translate = `${\r\n slideProgress * modify * 50 * (swiper.rtlTranslate ? -1 : 1)\r\n }%`;\r\n\r\n const scale = 1 - absProgress * scaleStep;\r\n const zIndex = zIndexMax - Math.abs(Math.round(slideProgress));\r\n slideEl.style.transform = `translateX(${translate}) scale(${scale})`;\r\n slideEl.style.zIndex = zIndex;\r\n if (absProgress > 3) {\r\n slideEl.style.opacity = 0;\r\n } else {\r\n slideEl.style.opacity = 1;\r\n }\r\n\r\n opacityEls.forEach((opacityEl) => {\r\n opacityEl.style.opacity = 1 - absProgress / 3;\r\n });\r\n }\r\n });\r\n\r\n on(\"setTransition\", (s, duration) => {\r\n if (swiper.params.effect !== \"carousel\") return;\r\n for (let i = 0; i < swiper.slides.length; i += 1) {\r\n const slideEl = swiper.slides[i];\r\n const opacityEls = slideEl.querySelectorAll(\r\n \".swiper-carousel-animate-opacity\"\r\n );\r\n slideEl.style.transitionDuration = `${duration}ms`;\r\n opacityEls.forEach((opacityEl) => {\r\n opacityEl.style.transitionDuration = `${duration}ms`;\r\n });\r\n }\r\n });\r\n}\r\n","import { useState, useEffect } from \"react\";\r\nimport \"./myswiper/MySwiper.css\";\r\n\r\nconst ResponsiveImage = ({ id, fp, sizes, className, eager }) => {\r\n\r\n const [isLoaded, setIsLoaded] = useState(false);\r\n\r\n //let exampleSize1 = \"(max-width: 420px) 90vw, (max-width: 768px) 76vw, 590px\";\r\n //let exampleSize2 = \"(max-width: 420px) 45vw, (max-width: 768px) 38vw, 320px\";\r\n function makeSrcSet(format) {\r\n return \"https://mihousegeneralstorage1.blob.core.windows.net/imageblob/\" + id + \"-320.\" + format + \" 320w,\" +\r\n \"https://mihousegeneralstorage1.blob.core.windows.net/imageblob/\" + id + \"-590.\" + format + \" 590w,\" +\r\n \"https://mihousegeneralstorage1.blob.core.windows.net/imageblob/\" + id + \"-768.\" + format + \" 768w,\" +\r\n \"https://mihousegeneralstorage1.blob.core.windows.net/imageblob/\" + id + \"-1024.\" + format + \" 1024w\"\r\n }\r\n\r\n useEffect(() => {\r\n if (id != null) {\r\n setIsLoaded(false);\r\n }\r\n }, [id]);\r\n\r\n\r\n if (fp) {\r\n return (\r\n {\r\n setIsLoaded(true);\r\n }}\r\n className={className + \" full\"}\r\n src={\"https://mihousegeneralstorage1.blob.core.windows.net/imageblob/\" + id}\r\n style={{\r\n opacity: isLoaded ? 1 : 0, visibility: isLoaded ? \"visible\" : \"none\",\r\n maxHeight: isLoaded ? \"1000px\" : \"0px\", aspectRatio: \"4/3\", objectFit: \"contain\",\r\n cursor:\"pointer\"\r\n }}\r\n loading={eager ? \"eager\" : \"lazy\"}\r\n\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n setIsLoaded(true);\r\n }}\r\n className={className + \" full\"}\r\n srcSet={makeSrcSet(\"jpeg\")}\r\n sizes={sizes}\r\n src={\"https://mihousegeneralstorage1.blob.core.windows.net/imageblob/\" + id}\r\n style={{\r\n opacity: isLoaded ? 1 : 0, visibility: isLoaded ? \"visible\" : \"none\", maxHeight: isLoaded ? \"1000px\" : \"0px\", cursor: \"pointer\",\r\n aspectRatio: \"4/3\", objectFit: \"cover\" }}\r\n loading={eager ? \"eager\" : \"lazy\"}\r\n\r\n />\r\n \r\n \r\n );\r\n};\r\n\r\nexport default ResponsiveImage;","import { memo } from \"react\";\r\nimport MediaQuery from 'react-responsive'\r\nimport ProgressiveImage from \"react-progressive-graceful-image\";\r\nimport ResponsiveImage from \"../ResponsiveImage.jsx\"; \r\nimport 'swiper/swiper.min.css'\r\nimport 'swiper/modules/a11y/a11y.min.css'\r\nimport 'swiper/modules/mousewheel/mousewheel.min.css'\r\nimport 'swiper/modules/virtual/virtual.min.css'\r\n\r\nimport \"./effect-carousel.css\";\r\nimport \"./MySwiper.css\";\r\n\r\n//export default function ProductTile({ product }) {\r\nconst ProductTile = ({ product, swiper, idx, setClicked }) => {\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
{\r\n console.log(swiper());\r\n let swip = swiper();\r\n if (swip != null) {\r\n if (swip.activeIndex < swip.clickedIndex) {\r\n swip.slideNext();\r\n } else if (swip.activeIndex > swip.clickedIndex) {\r\n swip.slidePrev();\r\n } else if (swip.activeIndex == swip.clickedIndex) {\r\n console.log(swip.activeIndex);\r\n console.log(product);\r\n setClicked(product.id);\r\n }\r\n }\r\n\r\n }} >\r\n
\r\n
\r\n
\r\n \r\n\r\n {/* */}\r\n {/* {(src, loading, srcSetData) => (*/}\r\n {/* */}\r\n {/* )}*/}\r\n {/**/}\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

£{Number(product.price).toLocaleString()}

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

Beds:{product.bedrooms}

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

Bath:{product.bathrooms}

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

Sqft:{product.sqFt}

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

Postcode:{product.postCode}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default memo(ProductTile);","import { useState, useEffect, useRef } from \"react\";\r\nimport { Swiper, SwiperSlide } from \"swiper/react\";\r\nimport { A11y, Mousewheel, Virtual } from \"swiper\";\r\nimport EffectCarousel from \"./effect-carousel.esm.js\";\r\nimport ProductTile from \"./ProductTile.jsx\";\r\n\r\nimport 'swiper/swiper.min.css'\r\nimport 'swiper/modules/a11y/a11y.min.css'\r\nimport 'swiper/modules/mousewheel/mousewheel.min.css'\r\n\r\nimport \"./effect-carousel.css\";\r\nimport \"./MySwiper.css\";\r\n\r\nexport default function SwiperV({ data, setPropertyCardClicked, setSelectedPropId, propertyMarkerClicked, setPropertyMarkerClicked, productOpen }) {\r\n\r\n const [swiper, setSwiper] = useState(null);\r\n const lastActiveSlide = useRef(null);\r\n const lastIdxSlide = useRef(0);\r\n const [virtualData, setVirtualData] = useState([]);\r\n const virtualSlideNumber = 9;\r\n //const forwardShift = 4; // #/2\r\n //const backwarddShift = 5; // #/2-1\r\n const shift = 4;\r\n\r\n const setActiveSlide = (id) => {\r\n let vData = [];\r\n if (id != null && swiper != null) {\r\n var activeIdx = data.findIndex(a => a.id == id);\r\n if (activeIdx >= 0) {\r\n let swiperRealIndex = swiper.realIndex;\r\n let idxShift = [0, 1, 2, 3, 4, -4, -3, -2, -1];\r\n for (let i = 0; i < virtualSlideNumber; i++) {\r\n let loc = (i + swiperRealIndex) % 9;\r\n let dataIdx = (activeIdx + idxShift[i] + (data.length * 8)) % data.length;\r\n let dataItm = data[dataIdx]\r\n dataItm.idx = dataIdx;\r\n vData[loc] = dataItm;\r\n }\r\n }\r\n }\r\n return vData;\r\n }\r\n\r\n useEffect(() => {\r\n //assuming on vdata change, real index is reset to 0. if this is not the case. capture what is current realindex from onslidechange, and use that value.\r\n if (data != null && data.length > 0) {\r\n let vData = setActiveSlide(lastActiveSlide.current)\r\n\r\n if (vData.length < 1) {\r\n vData.push(data[4 % data.length]);\r\n\r\n vData.push(data[5 % data.length]);\r\n vData.push(data[6 % data.length]);\r\n vData.push(data[7 % data.length]);\r\n vData.push(data[8 % data.length]);\r\n\r\n vData.push(data[0 % data.length]);\r\n vData.push(data[1 % data.length]);\r\n vData.push(data[2 % data.length]);\r\n vData.push(data[3 % data.length]);\r\n }\r\n\r\n setVirtualData(vData);\r\n console.log(\"Setting active slide for swiper\", lastActiveSlide.current, vData[0]);\r\n console.log(vData);\r\n if (swiper != null && swiper.realIndex > -1 && !productOpen) {\r\n setSelectedPropId(vData[swiper.realIndex].id);\r\n lastActiveSlide.current = (vData[swiper.realIndex].id);\r\n }\r\n } else {\r\n setVirtualData([]);\r\n }\r\n }, [data, swiper, productOpen]);\r\n\r\n useEffect(() => {\r\n //doesnt feel like this should live here (in this jsx)\r\n if (propertyMarkerClicked && data) {\r\n if (propertyMarkerClicked == -1) {\r\n console.log(\"Nulling SelectedPropId\");\r\n setSelectedPropId(null);\r\n }\r\n else {\r\n console.log(\"Active prop click\", propertyMarkerClicked);\r\n let vData = setActiveSlide(propertyMarkerClicked);\r\n setVirtualData(vData);\r\n setSelectedPropId(propertyMarkerClicked);\r\n lastActiveSlide.current = (propertyMarkerClicked);\r\n setPropertyMarkerClicked(null);\r\n }\r\n\r\n }\r\n\r\n }, [propertyMarkerClicked, data, swiper, productOpen]);\r\n\r\n const slideChangeFunc = (swiper) => {\r\n console.log(\"SWIPER CHANGE\", swiper.realIndex);\r\n if (virtualData[swiper.realIndex]) {\r\n setSelectedPropId(virtualData[swiper.realIndex].id);\r\n lastActiveSlide.current = (virtualData[swiper.realIndex].id);\r\n console.log(\"set lastIdx\", lastActiveSlide.current);\r\n } else {\r\n setSelectedPropId(null);\r\n }\r\n };\r\n\r\n const forwardChange = (swiper) => {\r\n console.log(\"FORWARD\", swiper.realIndex);\r\n console.log(swiper);\r\n let slideId = swiper.slides[swiper.activeIndex].id;\r\n let dataIdx = data.findIndex(a => a.id == slideId);\r\n let newDataIdx = (dataIdx + shift) % data.length\r\n let newData = data[newDataIdx];\r\n newData.idx = newDataIdx;\r\n setVirtualData(a => {\r\n console.log(newData);\r\n a[(swiper.realIndex + shift) % a.length] = newData;\r\n console.log(a);\r\n console.log(a.map(b => b.idx));\r\n return a;\r\n });\r\n\r\n\r\n //let dataIdx = (swiper.realIndex + idxShift[i] + (data.length * 8)) % data.length;\r\n //let dataItm = data[dataIdx]\r\n //let newVdata = [vData];\r\n\r\n }\r\n\r\n const backwardChange = (swiper) => {\r\n console.log(\"BACKWARD\", swiper.realIndex);\r\n console.log(swiper);\r\n let slideId = swiper.slides[swiper.activeIndex].id;\r\n let dataIdx = data.findIndex(a => a.id == slideId);\r\n let newDataIdx = (dataIdx - shift + (data.length * shift)) % data.length\r\n let newData = data[newDataIdx];\r\n newData.idx = newDataIdx;\r\n\r\n setVirtualData(a => {\r\n console.log(newData);\r\n a[(swiper.realIndex - shift + (a.length * shift)) % a.length] = newData;\r\n console.log(a);\r\n console.log(a.map(b => b.idx));\r\n return a;\r\n });\r\n }\r\n\r\n const swiperParameters = {\r\n modules: [A11y, Mousewheel, EffectCarousel],\r\n slidesPerView: 1.2,\r\n spaceBetween: 10,\r\n lazy: { enabled: true },\r\n centeredSlides: true,\r\n loop: true,\r\n threshold: 5,\r\n breakpoints: {\r\n 420: { spaceBetween: 20, slidesPerView: 1.4 },\r\n 768: { spaceBetween: 30, slidesPerView: 1.7 },\r\n 1024: { spaceBetween: 40, slidesPerView: 2 }\r\n },\r\n effect: \"carousel\",\r\n mousewheel: { enabled: true },\r\n\r\n onSlideChange: slideChangeFunc,\r\n onSlideNextTransitionStart: forwardChange,\r\n onSlidePrevTransitionStart: backwardChange,\r\n }\r\n\r\n if (Swiper && !Swiper.destroyed && !productOpen) {\r\n return (\r\n <>\r\n {\r\n setSwiper(ev);\r\n }} >\r\n {\r\n virtualData.map((f, i) => {\r\n return (\r\n \r\n swiper} idx={i} key={f.id} setClicked={setPropertyCardClicked} />\r\n \r\n )\r\n })}\r\n\r\n \r\n \r\n );\r\n }\r\n else {\r\n return(null);\r\n }\r\n}\r\n","import React, { useState, memo, useRef, Component, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport MySwiper from \"./myswiper/MySwiper.jsx\";\r\nimport SwiperWeb from \"./myswiper/SwiperWeb.jsx\";\r\nimport SwiperV from \"./myswiper/SwiperV.jsx\";\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n width: \"100vw\",\r\n position: \"absolute\",\r\n bottom: \"30px\",\r\n [theme.breakpoints.up(\"xs\")]: {\r\n\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n bottom: \"10px\",\r\n }\r\n }\r\n}));\r\n\r\nconst PropSwiper = ({ data, setPropertyCardClicked, setActivePropertyCoords, clusterPoints, setPropertyCardActive, propertyMarkerClicked,\r\n setPropertyMarkerClicked, latlon, productOpen }) => {\r\n\r\n const [propData, setPropData] = useState([]);\r\n const [selectedPropId, setSelectedPropId] = useState(null);\r\n const classes = useStyles();\r\n\r\n const getDistanceFromLatLonInKm = (lat1, lon1, lat2, lon2) => {\r\n var R = 6371; // Radius of the earth in km\r\n var dLat = deg2rad(lat2 - lat1); // deg2rad below\r\n var dLon = deg2rad(lon2 - lon1);\r\n var a =\r\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\r\n Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *\r\n Math.sin(dLon / 2) * Math.sin(dLon / 2)\r\n ;\r\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n var d = R * c; // Distance in km\r\n return d;\r\n }\r\n\r\n const deg2rad = (deg) => {\r\n return deg * (Math.PI / 180)\r\n }\r\n\r\n const compare = (a, b) => {\r\n let latA = a.coordinates[1];\r\n let latB = b.coordinates[1];\r\n let latT = latlon[0];\r\n\r\n let lonA = a.coordinates[0];\r\n let lonB = b.coordinates[0];\r\n let lonT = latlon[1];\r\n\r\n let aDist = getDistanceFromLatLonInKm(latT, lonT, latA, lonA);\r\n let bDist = getDistanceFromLatLonInKm(latT, lonT, latB, lonB);\r\n\r\n let dist = aDist - bDist;\r\n return dist;\r\n };\r\n\r\n useEffect(() => {\r\n if (data != null && data.isItemResult && data.data != null && data.data.data != null && data.data.data.features != null) {\r\n let tData = data.data.data.features.filter(f => f.properties.cnt == 1).map(f => ({ ...f.properties, ...f.geometry }))\r\n .concat(data.data.data.features.filter(f => f.properties.cnt > 1).flatMap(f => f.properties.collection.map(a => ({ ...a, ...f.geometry }))));\r\n tData.sort(compare);\r\n console.log(tData);\r\n setPropData(tData);\r\n }\r\n else {\r\n setPropData(null);\r\n if (!productOpen) {\r\n setSelectedPropId(null);\r\n }\r\n }\r\n }, [data, productOpen]);\r\n\r\n useEffect(() => {\r\n //lookup prop by id.\r\n //check propdata first.\r\n if (propData && selectedPropId) {\r\n let clusterResult = clusterPoints.filter(a => a.id === selectedPropId);\r\n if (clusterResult != null && clusterResult.length > 0) {\r\n if (clusterResult[0].value) {\r\n //if we have the value (i.e. a non-server clustered point in the cluster) do this as marginally faster.\r\n setActivePropertyCoords({ coords: clusterResult[0].cords, val: clusterResult[0].value, selectedId: selectedPropId });\r\n }\r\n else {\r\n //else is a server clustered point within the cluster\r\n let propValue = propData.find(a => a.id === selectedPropId).value;\r\n\r\n if (propValue == undefined) {\r\n //this is a cluster of non-server clustered points, AND server clustered points.\r\n }\r\n setActivePropertyCoords({ coords: clusterResult[0].cords, val: propValue, selectedId: selectedPropId });\r\n }\r\n console.log(\"y\", { coords: clusterResult[0].cords, val: clusterResult[0].sum });\r\n } else {\r\n let propResult = propData.filter(a => a.id == selectedPropId);\r\n if (propResult != null && propResult.length > 0) {\r\n let activePropCoords = { coords: propResult[0].coordinates, val: propResult[0].priceStr, selectedId: selectedPropId, server: propResult[0].serverCluster };\r\n setActivePropertyCoords(activePropCoords);\r\n } else {\r\n setActivePropertyCoords(null);\r\n }\r\n }\r\n setPropertyCardActive(selectedPropId);\r\n }\r\n else {\r\n setActivePropertyCoords(null);\r\n setPropertyCardActive(null);\r\n }\r\n\r\n\r\n //assuming match, see if need to update latlong due to clustering (check clusterPoints).\r\n\r\n //set activeProperty.\r\n\r\n }, [selectedPropId, clusterPoints, propData, productOpen]);\r\n\r\n if (propData) {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n else {\r\n return
;\r\n }\r\n}\r\n\r\nexport default memo(PropSwiper);","import React, { useState, memo } from 'react';\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport SpeedDial from '@material-ui/lab/SpeedDial';\r\nimport SpeedDialAction from '@material-ui/lab/SpeedDialAction';\r\nimport LayersIcon from '@material-ui/icons/Layers';\r\nimport SatelliteAltIcon from '@mui/icons-material/SatelliteAlt';\r\nimport SchoolIcon from '@mui/icons-material/School';\r\nimport CurrencyPoundIcon from '@mui/icons-material/CurrencyPound';\r\nimport SecurityIcon from '@mui/icons-material/Security';\r\nimport Box from '@material-ui/core/Box';\r\n\r\n\r\nconst MapLayerDial = ({ className, layerSetters }) => {\r\n const [open, setOpen] = useState(false);\r\n const theme = useTheme();\r\n const [setShowSchools, setShowCrime, setShowHistoricPrices, setSatView, setShowProps, showSchools, showCrime, showHistoricPrices, satView, showProps] = layerSetters;\r\n const handleOpen = () => setOpen(true);\r\n const handleClose = () => setOpen(false);\r\n\r\n const handleSat = () => {\r\n setSatView(a => !a)\r\n handleClose();\r\n }\r\n const handleSchool = () => {\r\n setShowSchools(a=>!a)\r\n setShowCrime(false)\r\n setShowHistoricPrices(false) \r\n handleClose();\r\n }\r\n const handleCrime = () => {\r\n setShowCrime(a => !a)\r\n setShowSchools(false)\r\n setShowHistoricPrices(false) \r\n handleClose();\r\n }\r\n const handlePrice = () => {\r\n setShowHistoricPrices(a => !a) \r\n setShowSchools(false)\r\n setShowCrime(false)\r\n handleClose();\r\n }\r\n\r\n const handleProps = () => {\r\n setShowProps(a => !a)\r\n handleClose();\r\n }\r\n\r\n const actions = [\r\n { icon: , name: 'Satellite', click: handleSat, active: satView },\r\n { icon: , name: 'Schools', click: handleSchool, active: showSchools },\r\n { icon: , name: 'Crime', click: handleCrime, active: showCrime },\r\n { icon: , name: 'Price History', click: handlePrice, active: showHistoricPrices },\r\n { icon: , name: 'Properties', click: handleProps, active: showProps },\r\n ];\r\n\r\n console.log(\"THEME\", theme);\r\n return (\r\n \r\n \r\n }\r\n onClose={handleClose}\r\n onOpen={handleOpen}\r\n open={open}\r\n direction=\"down\"\r\n >\r\n {actions.map((action) => (\r\n \r\n ))}\r\n \r\n \r\n );\r\n}\r\n\r\nexport default memo(MapLayerDial);","import React, { useEffect, useState, memo } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Modal from '@material-ui/core/Modal';\r\nimport Backdrop from '@material-ui/core/Backdrop';\r\nimport Fade from '@material-ui/core/Fade';\r\nimport Slide from '@material-ui/core/Slide';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Button from '@material-ui/core/Button';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport CancelIcon from '@material-ui/icons/Cancel';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Link from '@material-ui/core/Link';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport Switch from '@material-ui/core/Switch';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n modal: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n marginTop: \"32px\",\r\n marginBottom: \"10px\",\r\n marginLeft: \"auto\",\r\n marginRight: \"auto\",\r\n maxWidth: \"800px\",\r\n minWidth: \"320px\"\r\n //height: \"80%\",\r\n },\r\n paper: {\r\n backgroundColor: theme.palette.background.paper,\r\n //border: '2px solid #000',\r\n boxShadow: theme.shadows[8],\r\n //padding: theme.spacing(0, 0, 3),\r\n //overflowY: \"scroll\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n height: \"100%\",\r\n width: \"100%\",\r\n borderRadius: \"10px\",\r\n },\r\n flexy: {\r\n flex: 1,\r\n justifyContent: \"center\",\r\n flexDirection: \"column\",\r\n display: \"flex\"\r\n },\r\n flexy0: {\r\n flex: 0,\r\n justifyContent: \"center\",\r\n flexDirection: \"column\",\r\n display: \"flex\"\r\n },\r\n header: {\r\n backgroundColor: theme.palette.background.paper,\r\n width: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n padding: theme.spacing(1, 1, 1),\r\n borderRadius: \"10px\",\r\n //justifyContent: \"center\"\r\n },\r\n footer: {\r\n backgroundColor: theme.palette.background.paper,\r\n width: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"row\",\r\n padding: theme.spacing(1, 3, 1),\r\n borderRadius: \"10px\",\r\n //justifyContent: \"center\"\r\n },\r\n body: {\r\n backgroundColor: theme.palette.background.paper,\r\n borderBottom: '1px solid #000',\r\n borderTop: '1px solid #000',\r\n padding: theme.spacing(1, 5, 1),\r\n overflowY: \"auto\",\r\n flexGrow: 1,\r\n //height: \"100%\",\r\n width: \"100%\",\r\n },\r\n button: {\r\n whiteSpace: \"nowrap\",\r\n },\r\n blkColor: {\r\n fontWeight: 600,\r\n color: \"black\"\r\n }\r\n}));\r\n\r\n\r\n\r\nconst FadeModal = ({ children, open, setOpen, heading, cnt }) => {\r\n const classes = useStyles();\r\n const [restrict, setRestrict] = useState(true);\r\n //const [firstLoad, setFirstLoad] = useState(true);\r\n\r\n //useEffect(() => {\r\n // setOpen(toggle);\r\n //}, [toggle]);\r\n\r\n //const handleOpen = () => {\r\n // setOpen(true);\r\n //};\r\n\r\n //const handleClose = () => {\r\n // setOpen(false);\r\n //};\r\n\r\n return (\r\n
\r\n setOpen(false)}\r\n keepMounted\r\n BackdropComponent={Backdrop}\r\n disableRestoreFocus={true}\r\n BackdropProps={{\r\n timeout: 500,\r\n }}\r\n >\r\n \r\n \r\n \r\n
\r\n
\r\n setOpen(false)}\r\n >\r\n
\r\n
\r\n
\r\n
\r\n {heading}\r\n
\r\n
\r\n
\r\n
\r\n setRestrict(a=>!a)} name=\"checkedA\" />\r\n Restrict to map view\r\n \r\n
\r\n
\r\n
\r\n \r\n {children}\r\n \r\n \r\n
\r\n
\r\n {\r\n console.info(\"I'm a button.\");\r\n }}\r\n >Clear All\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default memo(FadeModal);","import React, { Fragment } from \"react\";\r\nimport PropTypes from \"prop-types\";\r\nimport Typography from \"@material-ui/core/Typography\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\n\r\n// Based on Material Design spec:\r\n// Styles by https://github.com/RafeSacks\r\n// https://material.io/design/components/sliders.html#spec\r\nconst trackHeight = 2;\r\nconst thumbHeight = 22;\r\n\r\n// *******************************************************\r\n// RAIL COMPONENT\r\n// *******************************************************\r\n\r\nconst muiRailStyle = theme => ({\r\n rail: {\r\n backgroundColor: theme.palette.grey[400],\r\n width: \"100%\",\r\n height: trackHeight,\r\n position: \"absolute\",\r\n pointerEvents: \"none\"\r\n },\r\n railHotspot: {\r\n // backgroundColor: \"green\", // for debugging\r\n width: \"100%\",\r\n height: thumbHeight + 2, // Invisible hotspot same size as thumb\r\n top: \"-2px\",\r\n position: \"absolute\",\r\n cursor: \"pointer\"\r\n }\r\n});\r\n\r\nfunction MuiRailComponent({ classes, getRailProps }) {\r\n return (\r\n \r\n
\r\n
\r\n \r\n );\r\n}\r\n\r\nMuiRailComponent.propTypes = {\r\n classes: PropTypes.object.isRequired,\r\n getRailProps: PropTypes.func.isRequired\r\n};\r\n\r\nexport const MuiRail = withStyles(muiRailStyle)(MuiRailComponent);\r\n\r\n// *******************************************************\r\n// HANDLE COMPONENT\r\n// *******************************************************\r\n\r\nconst muiHandleStyle = theme => ({\r\n root: {\r\n backgroundColor: theme.palette.secondary.main,\r\n marginLeft: thumbHeight * -0.5,\r\n marginTop: thumbHeight * -0.5,\r\n width: thumbHeight,\r\n height: thumbHeight,\r\n border: 0,\r\n borderRadius: \"50%\", // circle\r\n // boxShadow: \"1px 1px 1px 1px rgba(0, 0, 0, 0.2)\",\r\n whiteSpace: \"nowrap\", // for child display inline-block to work\r\n position: \"absolute\",\r\n zIndex: 2,\r\n cursor: \"pointer\",\r\n\r\n // Additional styles for the overlay element\r\n \"&::before\": {\r\n content: '\"\"',\r\n position: \"absolute\",\r\n top: \"-20px\",\r\n left: \"-20px\",\r\n width: thumbHeight + 40, // Increase the clickable area\r\n height: thumbHeight + 40,\r\n borderRadius: \"50%\",\r\n cursor: \"pointer\",\r\n opacity: 0, // Make it invisible\r\n zIndex: 1, // Lower than the visible circle\r\n },\r\n }\r\n});\r\n\r\nfunction MuiHandleComponent({\r\n domain: [min, max],\r\n handle: { id, value, percent },\r\n classes,\r\n getHandleProps\r\n}) {\r\n return (\r\n \r\n );\r\n}\r\n\r\nMuiHandleComponent.propTypes = {\r\n domain: PropTypes.array.isRequired,\r\n handle: PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n value: PropTypes.number.isRequired,\r\n percent: PropTypes.number.isRequired\r\n }).isRequired,\r\n classes: PropTypes.object.isRequired,\r\n getHandleProps: PropTypes.func.isRequired\r\n};\r\n\r\nexport const MuiHandle = withStyles(muiHandleStyle)(MuiHandleComponent);\r\n\r\n// *******************************************************\r\n// TRACK COMPONENT\r\n// *******************************************************\r\n\r\nconst muiTrackStyle = theme => ({\r\n track: {\r\n backgroundColor: theme.palette.secondary.main,\r\n height: trackHeight,\r\n position: \"absolute\",\r\n zIndex: 1,\r\n pointerEvents: \"none\"\r\n },\r\n trackHotspot: {\r\n // backgroundColor: \"grey\", // for debugging\r\n height: thumbHeight, // Invisible hotspot same size as thumb\r\n top: thumbHeight * -0.5,\r\n position: \"absolute\",\r\n cursor: \"pointer\"\r\n }\r\n});\r\n\r\nfunction MuiTrackComponent({ classes, source, target, getTrackProps }) {\r\n const left = `${source.percent}%`;\r\n const width = `${target.percent - source.percent}%`;\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n );\r\n}\r\n\r\nMuiTrackComponent.propTypes = {\r\n source: PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n value: PropTypes.number.isRequired,\r\n percent: PropTypes.number.isRequired\r\n }).isRequired,\r\n target: PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n value: PropTypes.number.isRequired,\r\n percent: PropTypes.number.isRequired\r\n }).isRequired,\r\n classes: PropTypes.object.isRequired,\r\n getTrackProps: PropTypes.func.isRequired\r\n};\r\n\r\nexport const MuiTrack = withStyles(muiTrackStyle)(MuiTrackComponent);\r\n\r\n// *******************************************************\r\n// TICK COMPONENT\r\n// *******************************************************\r\n\r\nconst muiTickStyle = theme => ({\r\n tick: {\r\n position: \"absolute\",\r\n marginTop: 14,\r\n width: 1,\r\n height: 5,\r\n backgroundColor: theme.palette.grey[400]\r\n },\r\n label: {\r\n position: \"absolute\",\r\n marginTop: 22,\r\n textAlign: \"center\"\r\n }\r\n});\r\n\r\nexport function MuiTickComponent({ classes, tick, count, format }) {\r\n return (\r\n
\r\n
\r\n \r\n {format(tick.value)}\r\n \r\n
\r\n );\r\n}\r\n\r\nMuiTickComponent.propTypes = {\r\n tick: PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n value: PropTypes.number.isRequired,\r\n percent: PropTypes.number.isRequired\r\n }).isRequired,\r\n classes: PropTypes.object.isRequired,\r\n count: PropTypes.number.isRequired,\r\n format: PropTypes.func.isRequired\r\n};\r\n\r\nMuiTickComponent.defaultProps = {\r\n format: d => d\r\n};\r\n\r\nexport const MuiTick = withStyles(muiTickStyle)(MuiTickComponent);\r\n","import React, { memo, useState, useEffect } from \"react\";\r\nimport { Bar } from \"react-chartjs-2\";\r\nimport { useTheme } from '@material-ui/styles';\r\n\r\n\r\nconst BarChart2 = ({ data, highlight, isRange, prefix, suffix, renderFactor }) => {\r\n\r\n const [barData, setBarData] = useState([]);\r\n\r\n const theme = useTheme();\r\n\r\n const formatLabel = (x) => {\r\n if (renderFactor != null && renderFactor != 0) {\r\n x = x * renderFactor;\r\n }\r\n let rtn = x.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\r\n return x;\r\n }\r\n\r\n useEffect(() => {\r\n if (data != null && data.length > 0) {\r\n //setBarData(data.map(a => a[1]));\r\n let dataSource = [];\r\n //if (isRange) {\r\n let dataNoTail = data.sort((a, b) => a[0] - b[0]).slice(0, -1);\r\n dataSource = dataNoTail;\r\n //}\r\n //else {\r\n // dataSource = data.sort((a, b) => a[0] - b[0]);\r\n //}\r\n let normPrefix = prefix ? prefix : \"\";\r\n let normSuffix = suffix ? suffix : \"\";\r\n\r\n //if (renderFactor == null && renderFactor > 1) {\r\n // start = start * renderFactor;\r\n // end = end * renderFactor;\r\n //}\r\n\r\n let bar = {\r\n labels: dataSource.map((v, i) => {\r\n if (isRange) {\r\n return `${normPrefix}${formatLabel(v[0])}${normSuffix}${i < (dataSource.length - 1) ? \"-\" + normPrefix + formatLabel(dataSource[i + 1][0]) + normSuffix : \"+\"}`;\r\n } \r\n else {\r\n //let n = `${i < (dataSource.length - 1) ? \"\" + numberWithCommas(dataSource[i + 1][0]) : \"+\"}`;\r\n return `${normPrefix}${formatLabel(v[0])}${normSuffix}`;\r\n }\r\n }),\r\n datasets: [\r\n {\r\n backgroundColor: dataSource.map((val, i) =>\r\n i >= highlight[0] && i < highlight[1]\r\n //? \"rgba(251, 192, 45, 1)\"\r\n //: \"rgba(156, 39, 176, 0.2)\"\r\n ? theme.palette.datavis.main\r\n : theme.palette.datavis.main + \"10\"\r\n ), \r\n hoverBackgroundColor: \"rgba(255,99,132,0.4)\",\r\n data: dataSource.map(a => a[1])\r\n }\r\n ]\r\n };\r\n setBarData(bar);\r\n }\r\n }, [data, highlight]);\r\n\r\n const options = {\r\n responsive: true,\r\n maintainAspectRatio: false,\r\n animation: {\r\n duration: 0\r\n },\r\n plugins: {\r\n legend: {\r\n display: false\r\n }\r\n },\r\n legend: {\r\n display: false\r\n },\r\n scales: {\r\n x: {\r\n display: false\r\n }\r\n ,\r\n y:\r\n {\r\n display: false,\r\n }\r\n }\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n );\r\n}\r\n\r\n\r\nexport default memo(BarChart2);\r\n","import React, { useEffect, useState, memo } from \"react\";\r\nimport { Grid, Button, TextField, InputAdornment } from \"@material-ui/core\";\r\nimport { Slider, Rail, Handles, Tracks, Ticks } from \"react-compound-slider\";\r\nimport { MuiRail, MuiHandle, MuiTrack, MuiTick } from \"./components\";\r\nimport BarChart2 from \"./BarChart2\";\r\nimport NumberFormat from 'react-number-format';\r\n\r\nconst HistoSlider2 = ({ data, setOutValue, prefix, suffix, isRange, leftLabel, rightLabel, renderFactor }) => {\r\n\r\n const [state, setState] = useState(null);\r\n const [lookup, setLookup] = useState([]);\r\n const [timer, setTimer] = useState(null);\r\n\r\n const [value, setValue] = useState([0, 0]);\r\n const [renderedValue, setRenderedValue] = useState([0, 0]);\r\n\r\n useEffect(() => {\r\n if (data != null) {\r\n let sorted = data.sort((a, b) => a[0] - b[0]);\r\n\r\n let normalized = sorted.map((a, i) => {\r\n return {\r\n value: i,\r\n cnt: a[1],\r\n from: a[0]\r\n };\r\n });\r\n\r\n if (value[0] == 0 && value[1] == 0) {\r\n setValue([0, normalized.length - 1]);\r\n }\r\n\r\n //this block may no logne be required? always call setLookup(normalized)?\r\n let n = JSON.stringify(lookup);\r\n let n2 = JSON.stringify(normalized);\r\n if (n != n2) {\r\n setLookup(normalized);\r\n }\r\n }\r\n }, [data]);\r\n\r\n useEffect(() => {\r\n if (lookup != null && lookup.length > 0 && value != null && (value[0] >= 0 || value[1] >= 0)) {\r\n let start = lookup[value[0]].from;\r\n let end = lookup[value[1]].from;\r\n\r\n setOutValue(() => [start, end]);\r\n\r\n if (renderFactor != null && renderFactor != 0) {\r\n start = start * renderFactor;\r\n end = end * renderFactor;\r\n }\r\n\r\n if (!isRange) { end = end - 1 }\r\n let lim = 10000000 * (renderFactor ? renderFactor : 1);\r\n\r\n let endSuffix = `${end}${suffix ? suffix : \"\"}`;\r\n start = `${start}${suffix ? suffix : \"\"}`;\r\n\r\n if (end >= lim) {\r\n if (lookup[value[1] - 1] != null) {\r\n let endButOne = lookup[value[1] - 1].from;\r\n if (renderFactor != null && renderFactor != 0) {\r\n endButOne = endButOne * renderFactor;\r\n }\r\n endSuffix = endButOne + (suffix ? `${suffix}` : \"\") + \"+\";\r\n }\r\n else {\r\n endSuffix = \"No Limit\";\r\n }\r\n }\r\n\r\n setRenderedValue(() => [start, endSuffix]);\r\n }\r\n }, [value, lookup])\r\n\r\n const NumberFormatCustom = (props) => {\r\n const { inputRef, onChange, ...other } = props;\r\n return (\r\n {\r\n onChange({\r\n target: {\r\n name: props.name,\r\n value: values.value,\r\n },\r\n });\r\n }}\r\n thousandSeparator\r\n isNumericString\r\n prefix={prefix}\r\n />\r\n );\r\n }\r\n\r\n const SetValueToNearestRendered = (renderedVal, isFrom) => {\r\n let i = parseInt(renderedVal); //enforce int;\r\n //let closest = lookup.sort((a, b) => Math.abs(i - a.from) - Math.abs(i - b.from))[0]\r\n if (isFrom) {\r\n //want the nearest element that is lower.\r\n let closestLower = lookup.slice().reverse().find(a => a.from <= i);\r\n setValue(a => [closestLower.value, a[1]]);\r\n } else {\r\n let closestUpper = lookup.find(a => a.from >= i);\r\n setValue(a => [a[0], closestUpper.value]);\r\n }\r\n };\r\n\r\n\r\n if (lookup == null) {\r\n return (<>);\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n \r\n 1 ? lookup.length - 1 : 1]}\r\n rootStyle={{\r\n position: \"relative\",\r\n width: \"100%\"\r\n }}\r\n //onUpdate={update => setState(a => ({ ...a, update, inputValues: update }))\r\n //}\r\n onUpdate={\r\n update => {\r\n if (update[0] != value[0] || update[1] != value[1]) {//not ideal but 'somewhat' reduces number of rerenders.\r\n setValue(update);\r\n }\r\n }\r\n }\r\n //onChange={change => { setValue(change) }}\r\n //onChange={values => setState(a => ({ ...a, values }))}\r\n values={value}\r\n >\r\n \r\n {({ getRailProps }) => }\r\n \r\n \r\n {({ handles, getHandleProps }) => (\r\n
\r\n {handles.map(handle => (\r\n \r\n ))}\r\n
\r\n )}\r\n
\r\n \r\n \r\n \r\n {\r\n const v = evt.target.value;\r\n setRenderedValue(a => [v, a[1]]);\r\n SetValueToNearestRendered(v, true);\r\n }}\r\n InputProps={{\r\n inputComponent: NumberFormatCustom,\r\n }}\r\n />\r\n \r\n \r\n -\r\n \r\n \r\n {\r\n const v = evt.target.value;\r\n setRenderedValue(a => [a[0], v]);\r\n SetValueToNearestRendered(v, false);\r\n }}\r\n InputProps={{\r\n inputComponent: NumberFormatCustom,\r\n }}\r\n />\r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n}\r\n\r\n\r\nexport default memo(HistoSlider2);\r\n","import React, { useState, memo, useEffect, useRef} from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\n\r\nconst PriceSlider = ({ filterData, setFilter }) => {\r\n const [priceState, setPriceState] = useState(null);\r\n const [outValue, setOutValue] = useState([]);\r\n const [timer, setTimer] = useState(null);\r\n const outValRef = useRef([0, 0]);\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n\r\n let priceData = filterData.exclusionFilters.children.find(a => a.label == \"price\").children;\r\n let tPrices = [];\r\n tPrices.push([100000000, 0]);\r\n priceData.forEach(pd => {\r\n \r\n tPrices.push([pd.from, pd.count]);\r\n });\r\n setPriceState(tPrices);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n if (outValue != null && outValue.length == 2 && outValue[0] >= 0 && outValue[1] > 0) {\r\n if (outValue[0] != outValRef.current[0] || outValue[1] != outValRef.current[1]) {\r\n outValRef.current = outValue;\r\n debounce(() => {\r\n let f1 = outValue[0];\r\n let f2 = outValue[1];\r\n let newFilter = {\r\n displayText: `${f1}-${f2}`,\r\n field: \"price\",\r\n from: f1,\r\n id: `xxx-slider-price`,\r\n label: `${f1}-${f2}`,\r\n to: f2,\r\n type: \"Range\",\r\n }\r\n if (f1 == 1 && f2 == 100000000) {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id))])\r\n }\r\n else {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\r\n }\r\n }, 500);\r\n }\r\n }\r\n }, [outValue]);\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 500;\r\n setTimer(null);\r\n clearTimeout(timer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setTimer(t);\r\n }\r\n\r\n\r\n return (\r\n \r\n Price range\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(PriceSlider);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\n\r\nconst BedroomSlider = ({ filterData, setFilter }) => {\r\n const [bedroomState, setBedroomState] = useState(null);\r\n const [outValue, setOutValue] = useState([]);\r\n const [timer, setTimer] = useState(null);\r\n const outValRef = useRef([0, 0]);\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n\r\n let bedroomData = filterData.exclusionFilters.children.find(a => a.label == \"bedrooms\").children;\r\n let tBeds = [];\r\n //tBeds.push([100000000, 0]);\r\n let highest =-1;\r\n bedroomData.forEach(pd => {\r\n if (pd.from > highest) {\r\n highest = pd.from;\r\n }\r\n tBeds.push([pd.from, pd.count]);\r\n });\r\n if (highest > 0) {\r\n tBeds.push([highest + 1, 0]);\r\n }\r\n setBedroomState(tBeds);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n if (outValue != null && outValue.length == 2 && outValue[0] >= 0 && outValue[1] > 0) {\r\n if (outValue[0] != outValRef.current[0] || outValue[1] != outValRef.current[1]) {\r\n outValRef.current = outValue;\r\n debounce(() => {\r\n let f1 = outValue[0];\r\n let f2 = outValue[1];\r\n let newFilter = {\r\n displayText: `${f1}-${f2}`,\r\n field: \"bedrooms\",\r\n from: f1,\r\n id: `xxx-slider-bedrooms`,\r\n label: `${f1}-${f2}`,\r\n to: f2,\r\n type: \"Range\",\r\n }\r\n if (f1 == 1 && f2 == 12) {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id))])\r\n }\r\n else {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\r\n }\r\n }, 500);\r\n }\r\n }\r\n }, [outValue]);\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 500;\r\n setTimer(null);\r\n clearTimeout(timer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setTimer(t);\r\n }\r\n\r\n\r\n return (\r\n \r\n Bedrooms\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(BedroomSlider);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\n\r\nconst BathroomSlider = ({ filterData, setFilter }) => {\r\n const [bedroomState, setBedroomState] = useState(null);\r\n const [outValue, setOutValue] = useState([]);\r\n const [timer, setTimer] = useState(null);\r\n const outValRef = useRef([0, 0]);\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n let bedroomData = filterData.exclusionFilters.children.find(a => a.label == \"bathrooms\").children;\r\n let tBeds = [];\r\n //tBeds.push([100000000, 0]);\r\n let highest = -1;\r\n bedroomData.forEach(pd => {\r\n if (pd.from > highest) {\r\n highest = pd.from;\r\n }\r\n tBeds.push([pd.from, pd.count]);\r\n });\r\n if (highest > 0) {\r\n tBeds.push([highest + 1, 0]);\r\n }\r\n setBedroomState(tBeds);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n if (outValue != null && outValue.length == 2 && outValue[0] >= 0 && outValue[1] > 0) {\r\n if (outValue[0] != outValRef.current[0] || outValue[1] != outValRef.current[1]) {\r\n outValRef.current = outValue;\r\n debounce(() => {\r\n let f1 = outValue[0];\r\n let f2 = outValue[1];\r\n let newFilter = {\r\n displayText: `${f1}-${f2}`,\r\n field: \"bathrooms\",\r\n from: f1,\r\n id: `xxx-slider-bathrooms`,\r\n label: `${f1}-${f2}`,\r\n to: f2,\r\n type: \"Range\",\r\n }\r\n if (f1 == 1 && f2 == 12) {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id))])\r\n }\r\n else {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\r\n }\r\n }, 500);\r\n }\r\n }\r\n }, [outValue]);\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 500;\r\n setTimer(null);\r\n clearTimeout(timer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setTimer(t);\r\n }\r\n\r\n\r\n return (\r\n \r\n Bathrooms\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(BathroomSlider);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\n\r\nconst SqFtSlider = ({ filterData, setFilter }) => {\r\n const [bedroomState, setBedroomState] = useState(null);\r\n const [outValue, setOutValue] = useState([]);\r\n const [timer, setTimer] = useState(null);\r\n const outValRef = useRef([0, 0]);\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n\r\n let bedroomData = filterData.exclusionFilters.children.find(a => a.label == \"SqFtParsed\").children;\r\n let tBeds = [];\r\n tBeds.push([100000000, 0]);\r\n let highest = -1;\r\n bedroomData.forEach(pd => {\r\n tBeds.push([pd.from, pd.count]);\r\n });\r\n setBedroomState(tBeds);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n if (outValue != null && outValue.length == 2 && outValue[0] >= 0 && outValue[1] > 0) {\r\n if (outValue[0] != outValRef.current[0] || outValue[1] != outValRef.current[1]) {\r\n outValRef.current = outValue;\r\n debounce(() => {\r\n let f1 = outValue[0];\r\n let f2 = outValue[1];\r\n let newFilter = {\r\n displayText: `${f1}-${f2}`,\r\n field: \"SqFtParsed\",\r\n from: f1,\r\n id: `xxx-slider-SqFtParsed`,\r\n label: `${f1}-${f2}`,\r\n to: f2,\r\n type: \"Range\",\r\n }\r\n if (f1 == 1 && f2 == 100000000) {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id))])\r\n }\r\n else {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\r\n }\r\n }, 500);\r\n }\r\n }\r\n }, [outValue]);\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 500;\r\n setTimer(null);\r\n clearTimeout(timer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setTimer(t);\r\n }\r\n\r\n\r\n return (\r\n \r\n Square Footage\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(SqFtSlider);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\n\r\nconst AcreageSlider = ({ filterData, setFilter }) => {\r\n const [state, setState] = useState(null);\r\n const [outValue, setOutValue] = useState([]);\r\n const [timer, setTimer] = useState(null);\r\n const outValRef = useRef([0, 0]);\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n let data = filterData.exclusionFilters.children.find(a => a.label == \"plotAcres\").children;\r\n let temp = [];\r\n temp.push([100000000, 0]);\r\n data.forEach(pd => {\r\n temp.push([pd.from, pd.count]);\r\n });\r\n \r\n setState(temp);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n if (outValue != null && outValue.length == 2 && outValue[0] >= 0 && outValue[1] > 0) {\r\n if (outValue[0] != outValRef.current[0] || outValue[1] != outValRef.current[1]) {\r\n outValRef.current = outValue;\r\n debounce(() => {\r\n let f1 = outValue[0];\r\n let f2 = outValue[1];\r\n let newFilter = {\r\n displayText: `${f1}-${f2}`,\r\n field: \"plotAcres\",\r\n from: f1,\r\n id: `xxx-slider-plotAcres`,\r\n label: `${f1}-${f2}`,\r\n to: f2,\r\n type: \"Range\",\r\n }\r\n if (f1 == 0 && f2 == 100000000) {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id))])\r\n }\r\n else {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\r\n }\r\n }, 500);\r\n }\r\n }\r\n }, [outValue]);\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 500;\r\n setTimer(null);\r\n clearTimeout(timer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setTimer(t);\r\n }\r\n\r\n\r\n return (\r\n \r\n Acres\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(AcreageSlider);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\n\r\nconst CrimeSlider = ({ filterData, setFilter }) => {\r\n const [state, setState] = useState(null);\r\n const [outValue, setOutValue] = useState([]);\r\n const [timer, setTimer] = useState(null);\r\n const outValRef = useRef([0, 0]);\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n let data = filterData.exclusionFilters.children.find(a => a.label == \"crimeTotal500M\").children;\r\n let temp = [];\r\n \r\n temp.push([100000000, 0]);\r\n data.forEach(pd => {\r\n temp.push([pd.from, pd.count]);\r\n });\r\n \r\n setState(temp);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n if (outValue != null && outValue.length == 2 && outValue[0] >= 0 && outValue[1] > 0) {\r\n if (outValue[0] != outValRef.current[0] || outValue[1] != outValRef.current[1]) {\r\n outValRef.current = outValue;\r\n debounce(() => {\r\n let f1 = outValue[0];\r\n let f2 = outValue[1];\r\n let newFilter = {\r\n displayText: `${f1}-${f2}`,\r\n field: \"crimeTotal500M\",\r\n from: f1,\r\n id: `xxx-slider-crimeTotal500M`,\r\n label: `${f1}-${f2}`,\r\n to: f2,\r\n type: \"Range\",\r\n }\r\n if (f1 == 0 && f2 == 100000000) {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id))])\r\n }\r\n else {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\r\n }\r\n }, 500);\r\n }\r\n }\r\n }, [outValue]);\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 500;\r\n setTimer(null);\r\n clearTimeout(timer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setTimer(t);\r\n }\r\n\r\n\r\n return (\r\n \r\n Reported crimes within 500m\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(CrimeSlider);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\n\r\nconst DeprivationSlider = ({ filterData, setFilter }) => {\r\n const [state, setState] = useState(null);\r\n const [outValue, setOutValue] = useState([]);\r\n const [timer, setTimer] = useState(null);\r\n const outValRef = useRef([0,0]);\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n let data = filterData.exclusionFilters.children.find(a => a.label == \"indexMultipleDeprivation\").children;\r\n let temp = [];\r\n temp.push([100000000, 0]);\r\n data.forEach(pd => {\r\n temp.push([pd.from, pd.count]);\r\n });\r\n setState(temp);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n if (outValue != null && outValue.length == 2 && outValue[0] >= 0 && outValue[1] > 0) {\r\n if (outValue[0] != outValRef.current[0] || outValue[1] != outValRef.current[1]) {\r\n outValRef.current = outValue;\r\n debounce(() => {\r\n let f1 = outValue[0];\r\n let f2 = outValue[1];\r\n let newFilter = {\r\n displayText: `${f1}-${f2}`,\r\n field: \"indexMultipleDeprivation\",\r\n from: f1,\r\n id: `xxx-slider-indexMultipleDeprivation`,\r\n label: `${f1}-${f2}`,\r\n to: f2,\r\n type: \"Range\",\r\n }\r\n if (f1 == 0 && f2 == 100000000) {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id))])\r\n }\r\n else {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\r\n }\r\n }, 500);\r\n }\r\n }\r\n }, [outValue]);\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 500;\r\n setTimer(null);\r\n clearTimeout(timer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setTimer(t);\r\n }\r\n\r\n\r\n return (\r\n \r\n Deprivation\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(DeprivationSlider);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\n\r\nconst PriceSqftSlider = ({ filterData, setFilter }) => {\r\n const [state, setState] = useState(null);\r\n const [outValue, setOutValue] = useState([]);\r\n const [timer, setTimer] = useState(null);\r\n const outValRef = useRef([0, 0]);\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n let data = filterData.exclusionFilters.children.find(a => a.label == \"pricePerSqFoot\").children;\r\n let temp = [];\r\n temp.push([100000000, 0]);\r\n data.forEach(pd => {\r\n temp.push([pd.from, pd.count]);\r\n });\r\n setState(temp);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n if (outValue != null && outValue.length == 2 && outValue[0] >= 0 && outValue[1] > 0) {\r\n if (outValue[0] != outValRef.current[0] || outValue[1] != outValRef.current[1]) {\r\n outValRef.current = outValue;\r\n debounce(() => {\r\n let f1 = outValue[0];\r\n let f2 = outValue[1];\r\n let newFilter = {\r\n displayText: `${f1}-${f2}`,\r\n field: \"pricePerSqFoot\",\r\n from: f1,\r\n id: `xxx-slider-pricePerSqFoot`,\r\n label: `${f1}-${f2}`,\r\n to: f2,\r\n type: \"Range\",\r\n }\r\n if (f1 == 1 && f2 == 100000000) {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id))])\r\n }\r\n else {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\r\n }\r\n }, 500);\r\n }\r\n }\r\n }, [outValue]);\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 500;\r\n setTimer(null);\r\n clearTimeout(timer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setTimer(t);\r\n }\r\n\r\n\r\n return (\r\n \r\n Price per SqFt\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(PriceSqftSlider);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\n\r\nconst RoomCntSlider = ({ filterData, setFilter }) => {\r\n const [state, setState] = useState(null);\r\n const [outValue, setOutValue] = useState([]);\r\n const [timer, setTimer] = useState(null);\r\n const outValRef = useRef([0, 0]);\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n let data = filterData.exclusionFilters.children.find(a => a.label == \"roomsCnt\").children;\r\n let temp = [];\r\n temp.push([100000000, 0]);\r\n data.forEach(pd => {\r\n temp.push([pd.from, pd.count]);\r\n });\r\n setState(temp);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n if (outValue != null && outValue.length == 2 && outValue[0] >= 0 && outValue[1] > 0) {\r\n if (outValue[0] != outValRef.current[0] || outValue[1] != outValRef.current[1]) {\r\n outValRef.current = outValue;\r\n debounce(() => {\r\n let f1 = outValue[0];\r\n let f2 = outValue[1];\r\n let newFilter = {\r\n displayText: `${f1}-${f2}`,\r\n field: \"roomsCnt\",\r\n from: f1,\r\n id: `xxx-slider-roomsCnt`,\r\n label: `${f1}-${f2}`,\r\n to: f2,\r\n type: \"Range\",\r\n }\r\n if (f1 == 0 && f2 == 100000000) {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id))])\r\n }\r\n else {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\r\n }\r\n }, 500);\r\n }\r\n }\r\n }, [outValue]);\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 500;\r\n setTimer(null);\r\n clearTimeout(timer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setTimer(t);\r\n }\r\n\r\n\r\n return (\r\n \r\n Number of Rooms\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(RoomCntSlider);","//maxBroadbandSpeed\r\n\r\nimport React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\n\r\nconst BroadbandSlider = ({ filterData, setFilter }) => {\r\n const [state, setState] = useState(null);\r\n const [outValue, setOutValue] = useState([]);\r\n const [timer, setTimer] = useState(null);\r\n const outValRef = useRef([0, 0]);\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n let bbData = filterData.exclusionFilters.children.find(a => a.label == \"maxBroadbandSpeed\");\r\n let data = bbData.children; //need to use this if filters not set?\r\n let temp = [];\r\n temp.push([100000000, 0]);\r\n data.forEach(pd => {\r\n temp.push([pd.from, pd.count]);\r\n });\r\n\r\n setState(temp);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n if (outValue != null && outValue.length == 2 && outValue[0] >= 0 && outValue[1] > 0) {\r\n if (outValue[0] != outValRef.current[0] || outValue[1] != outValRef.current[1]) {\r\n outValRef.current = outValue;\r\n debounce(() => {\r\n let f1 = outValue[0];\r\n let f2 = outValue[1];\r\n let newFilter = {\r\n displayText: `${f1}-${f2}`,\r\n field: \"maxBroadbandSpeed\",\r\n from: f1,\r\n id: `xxx-slider-maxBroadbandSpeed`,\r\n label: `${f1}-${f2}`,\r\n to: f2,\r\n type: \"Range\",\r\n }\r\n if (f1 == 0 && f2 == 100000000) {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id))])\r\n }\r\n else {\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\r\n }\r\n }, 500);\r\n }\r\n }\r\n }, [outValue]);\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 500;\r\n setTimer(null);\r\n clearTimeout(timer);\r\n var t = setTimeout(() => {\r\n method()\r\n }, delayMs);\r\n setTimer(t);\r\n }\r\n\r\n\r\n return (\r\n \r\n Broadband Speed\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(BroadbandSlider);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\nimport Radio from '@material-ui/core/Radio';\r\nimport RadioGroup from '@material-ui/core/RadioGroup';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\n\r\nconst SchoolFilter = ({ filterData, setFilter, label }) => {\r\n\r\n const [value, setValue] = React.useState(\"none\");\r\n const [data, setData] = useState(null);\r\n const labels = [`Any ${label}`, `Ofsted Good ${label}`, `Ofsted Outstanding ${label}`];\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n let catchments = filterData.exclusionFilters.children.find(a => a.label == \"school\" + label + \"CatchmentTerms\");\r\n let dataT = {};\r\n let f = catchments.children.find(a => a.label == `Any ${label}`);\r\n dataT.any = {\r\n text: `Any school in catchment (${f ? f.count : 0})`,\r\n filter: f,\r\n cnt: f ? f.count : 0\r\n };\r\n f = catchments.children.find(a => a.label == `Ofsted Good ${label}`);\r\n dataT.good = {\r\n text: `Ofsted good or better in catchment (${f ? f.count : 0})`,\r\n filter: f,\r\n cnt: f ? f.count : 0\r\n };\r\n f = catchments.children.find(a => a.label == `Ofsted Outstanding ${label}`);\r\n dataT.outstanding = {\r\n text: `Ofsted outstanding in catchment (${f ? f.count : 0})`,\r\n filter: f,\r\n cnt: f ? f.count : 0\r\n };\r\n dataT.none = {\r\n text: `Unrestricted (${catchments.count})`,\r\n filter: null,\r\n cnt: catchments.count\r\n };\r\n\r\n setData(dataT);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n if (data) {\r\n let filter = data[value].filter;\r\n\r\n setFilter(a => {\r\n //remove existing filter if exists.\r\n let newFilter = a.filter(b => !labels.includes(b.label));\r\n //re-add new filter if selected.\r\n if (filter) {\r\n return [...newFilter, filter];\r\n }\r\n else {\r\n return newFilter;\r\n }\r\n });\r\n\r\n }\r\n }, [value]);\r\n\r\n const handleChange = (event) => {\r\n setValue(event.target.value);\r\n };\r\n\r\n if (data) {\r\n return (\r\n \r\n {label} School Catchments\r\n \r\n } label={data.none.text} />\r\n } label={data.any.text} />\r\n } label={data.good.text} />\r\n } label={data.outstanding.text} />\r\n \r\n \r\n );\r\n }\r\n else {\r\n return (<>);\r\n }\r\n}\r\n\r\n\r\nexport default memo(SchoolFilter);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport Autocomplete from '@material-ui/lab/Autocomplete';\r\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\r\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport Input from '@material-ui/core/Input';\r\nimport Select from '@material-ui/core/Select';\r\nimport Chip from '@material-ui/core/Chip';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\n\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\n\r\nconst icon = ;\r\nconst checkedIcon = ;\r\n\r\nconst ITEM_HEIGHT = 48;\r\nconst ITEM_PADDING_TOP = 8;\r\n\r\nconst MenuProps = {\r\n PaperProps: {\r\n style: {\r\n maxHeight: ITEM_HEIGHT * 9 + ITEM_PADDING_TOP,\r\n //width: 250,\r\n },\r\n },\r\n anchorOrigin: {\r\n vertical: \"bottom\",\r\n horizontal: \"left\"\r\n },\r\n transformOrigin: {\r\n vertical: \"top\",\r\n horizontal: \"left\"\r\n },\r\n getContentAnchorEl: null\r\n};\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n formControl: {\r\n margin: theme.spacing(1),\r\n width: \"95%\"\r\n },\r\n chips: {\r\n display: 'flex',\r\n flexWrap: 'wrap',\r\n },\r\n chip: {\r\n margin: 2,\r\n },\r\n noLabel: {\r\n marginTop: theme.spacing(3),\r\n },\r\n label: {\r\n \"&.Mui-focused\": {\r\n color: theme.palette.text.secondary,\r\n },\r\n fontSize: \"1rem\",\r\n [theme.breakpoints.up(\"sm\")]: {\r\n fontSize: \"1.25rem\"\r\n },\r\n }\r\n}));\r\n\r\nconst getStyles = (name, theme) => {\r\n return {\r\n fontWeight:\r\n theme.typography.fontWeightRegular\r\n //theme.typography.fontWeightMedium,\r\n };\r\n}\r\n\r\nconst BasicMultiSelect = ({ data, onChange, label }) => {\r\n\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const [values, setValues] = React.useState([]);\r\n\r\n //useEffect(() => {\r\n // if (selectRef.current) {\r\n // selectRef.current.focus();\r\n // }\r\n // //let tempVal = [];\r\n // //values.forEach(a => tempVal.push(data.find(b=>a==b.name)));\r\n // //onChange(tempVal);\r\n //}, [values]);\r\n\r\n const handleChange = (event, v) => {\r\n let tempVal = [];\r\n event.target.value.forEach(a => tempVal.push(data.find(b => a == b.name)));\r\n onChange(tempVal);\r\n setValues(event.target.value);\r\n\r\n };\r\n\r\n const handleDelete = (value) => {\r\n let tempVal = [];\r\n values.forEach(a => tempVal.push(data.find(b => a == b.name)));\r\n tempVal = tempVal.filter(v => v.name != value);\r\n onChange(tempVal);\r\n setValues(a => a.filter(b => value != b));\r\n };\r\n\r\n return (\r\n \r\n {label}\r\n option.name === value.name}\r\n input={}\r\n renderValue={(selected) => (\r\n
\r\n {selected.map((value) => (\r\n {\r\n event.stopPropagation();\r\n }}\r\n onDelete={() => handleDelete(value)}\r\n className={classes.chip} />\r\n ))}\r\n
\r\n )}\r\n MenuProps={MenuProps}\r\n >\r\n {data.map((option) => (\r\n\r\n \r\n {/* -1} />*/}\r\n a == option.name) } />\r\n \r\n \r\n ))}\r\n \r\n
\r\n // option.name}\r\n // renderOption={(option, { selected }) => (\r\n // \r\n // \r\n // {option.title}\r\n // \r\n // )}\r\n // /*style={{ width: 500 }}*/\r\n // style={{ marginRight: \"10px\" }}\r\n // renderInput={(params) => (\r\n // \r\n // )}\r\n // onChange={(e, v) => onChange(v)}\r\n // getOptionSelected={(option, value) => option.name === value.name}\r\n ///>\r\n );\r\n}\r\n\r\n\r\nexport default memo(BasicMultiSelect);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HistoSlider2 from '../reusable/histoslider/HistoSlider2';\r\nimport BasicMultiSelect from '../reusable/BasicMultiSelect';\r\n\r\nconst RecreationSelect = ({ filterData, setFilter }) => {\r\n const [data, setData] = useState([]);\r\n const field = \"RecreationTerms\";\r\n useEffect(() => {\r\n if (filterData == null || filterData.filters == null || filterData.filters.children == null) {\r\n return;\r\n }\r\n\r\n let targetData = filterData.filters.children.find(a => a.label == \"amenities\");\r\n\r\n let tData = targetData.children.map(a => ({\r\n title: `${a.displayText} (${a.count})`,\r\n name: a.displayText,\r\n filter: a\r\n }));\r\n\r\n setData(tData);\r\n }, [filterData]);\r\n\r\n const filterChange = (val) => {\r\n setFilter(a => {\r\n //remove existing filters if exists.\r\n let newFilter = a.filter(b => b.field != field);\r\n //re-add filters if selected.\r\n if (val && val.length > 0) {\r\n val.forEach(v => newFilter.push(v.filter));\r\n }\r\n return newFilter;\r\n });\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(RecreationSelect);","import React, { useState, memo, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormGroup from '@material-ui/core/FormGroup';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\n\r\nconst FloodingSelect = ({ filterData, setFilter }) => {\r\n const [data, setData] = useState([]);\r\n const [boxes, setBoxes] = React.useState({\r\n NoRisk: { value: true, label: \"No Risk\" },\r\n Medium: { value: true, label: \"Medium\" },\r\n Low: { value: true, label: \"Low\" },\r\n VeryLow: { value: true, label: \"Very Low\" },\r\n High: { value: true, label: \"High\" }\r\n });\r\n\r\n\r\n //children: Array(4)\r\n //0: { label: 'No Risk/Data', field: 'FloodRisk', id: '228', count: 88, type: 'Term', … }\r\n //1: { label: 'Medium', field: 'FloodRisk', id: '229', count: 4, type: 'Term', … }\r\n //2: { label: 'Low', field: 'FloodRisk', id: '230', count: 3, type: 'Term', … }\r\n //3: { label: 'High', field: 'FloodRisk', id: '231', count: 1, type: 'Term', … }\r\n //length: 4\r\n\r\n\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n\r\n let dataT = filterData.exclusionFilters.children.find(a => a.label == \"FloodRisk\");\r\n\r\n setData(dataT);\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n setFilter(a => {\r\n //TODO: if any states are false, add the not filter. via setFilter.\r\n //remove existing filters if exists.\r\n let newFilter = a.filter(b => b.field != \"FloodRisk\");\r\n let rtnArr = Object.entries(boxes).filter(a => !a[1].value); //get false entries.\r\n //re-add filters if selected.\r\n if (rtnArr && rtnArr.length > 0) {\r\n rtnArr.forEach(v => {\r\n let f = data.children.find(a => a.label == v[1].label);\r\n if (!f)\r\n f = makeFilter(v[1].label);\r\n newFilter.push(f);\r\n });\r\n }\r\n return newFilter;\r\n });\r\n }, [boxes]);\r\n\r\n const handleChange = (event) => {\r\n setBoxes(state => {\r\n let label = state[event.target.name].label;\r\n let rtn = {\r\n ...state, [event.target.name]: { value: event.target.checked, label: label }\r\n };\r\n return rtn;\r\n });\r\n\r\n };\r\n\r\n const getText = (selector) => {\r\n if (data.children) {\r\n let f = data.children.find(a => a.label == selector);\r\n return `${selector} (${f ? f.count : 0})`;\r\n }\r\n }\r\n\r\n const makeFilter = (label) => {\r\n return {\r\n children: null,\r\n count: 0,\r\n displayText: label,\r\n field: \"FloodRisk\",\r\n from: null,\r\n id: \"fakedId\",\r\n label: label,\r\n to: null,\r\n type: \"NotTerm\"\r\n };\r\n }\r\n\r\n return (\r\n \r\n Flooding\r\n \r\n } label={getText(boxes.NoRisk.label)} />\r\n } label={getText(boxes.VeryLow.label)} />\r\n } label={getText(boxes.Low.label)} />\r\n } label={getText(boxes.Medium.label)} />\r\n } label={getText(boxes.High.label)} />\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(FloodingSelect);","import React, { useState, memo, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Radio from '@material-ui/core/Radio';\r\nimport RadioGroup from '@material-ui/core/RadioGroup';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormGroup from '@material-ui/core/FormGroup';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\n\r\nconst SubsidenceSelect = ({ filterData, setFilter }) => {\r\n const [data2030, setData2030] = useState(null);\r\n const [data2070, setData2070] = useState(null);\r\n //const [risk2030, setRisk2030] = React.useState(\"Improbable\");\r\n const [risk2070, setRisk2070] = React.useState({\r\n Improbable: true,\r\n Possible: true,\r\n Probable: true,\r\n Unavailable: true\r\n });\r\n const [risk2030, setRisk2030] = React.useState({\r\n Improbable: true,\r\n Possible: true,\r\n Probable: true,\r\n Unavailable: true\r\n });\r\n\r\n useEffect(() => {\r\n if (filterData == null || filterData.exclusionFilters == null || filterData.exclusionFilters.children == null) {\r\n return;\r\n }\r\n\r\n let data2030Raw = filterData.exclusionFilters.children.find(a => a.label == \"subsidenceRisk2030\");\r\n let data2070Raw = filterData.exclusionFilters.children.find(a => a.label == \"subsidenceRisk2070\");\r\n\r\n let dataT2030 = {};\r\n let f = data2030Raw.children.find(a => a.label == \"Improbable\");\r\n dataT2030.Improbable = {\r\n text: `Improbable by 2030 (${f ? f.count : 0})`,\r\n filter: f,\r\n cnt: f ? f.count : 0\r\n };\r\n f = data2030Raw.children.find(a => a.label == \"Probable\");\r\n dataT2030.Probable = {\r\n text: `Probable by 2030 (${f ? f.count : 0})`,\r\n filter: f,\r\n cnt: f ? f.count : 0\r\n };\r\n f = data2030Raw.children.find(a => a.label == \"Possible\");\r\n dataT2030.Possible = {\r\n text: `Possible by 2030 (${f ? f.count : 0})`,\r\n filter: f,\r\n cnt: f ? f.count : 0\r\n };\r\n f = data2030Raw.children.find(a => a.label == \"Unavailable\");\r\n dataT2030.Unavailable = {\r\n text: `Unavailable for 2030 (${f ? f.count : 0})`,\r\n filter: f,\r\n cnt: f ? f.count : 0\r\n };\r\n\r\n let dataT2070 = {};\r\n\r\n f = data2070Raw.children.find(a => a.label == \"Improbable\");\r\n dataT2070.Improbable = {\r\n text: `Improbable by 2070 (${f ? f.count : 0})`,\r\n filter: f,\r\n cnt: f ? f.count : 0\r\n };\r\n f = data2070Raw.children.find(a => a.label == \"Probable\");\r\n dataT2070.Probable = {\r\n text: `Probable by 2070 (${f ? f.count : 0})`,\r\n filter: f,\r\n cnt: f ? f.count : 0\r\n };\r\n f = data2070Raw.children.find(a => a.label == \"Possible\");\r\n dataT2070.Possible = {\r\n text: `Possible by 2070 (${f ? f.count : 0})`,\r\n filter: f,\r\n cnt: f ? f.count : 0\r\n };\r\n f = data2070Raw.children.find(a => a.label == \"Unavailable\");\r\n dataT2070.Unavailable = {\r\n text: `Unavailable for 2070 (${f ? f.count : 0})`,\r\n filter: f,\r\n cnt: f ? f.count : 0\r\n };\r\n\r\n setData2030(dataT2030);\r\n setData2070(dataT2070);\r\n\r\n }, [filterData]);\r\n\r\n useEffect(() => {\r\n setFilter(a => {\r\n //TODO: if any states are false, add the not filter. via setFilter.\r\n //remove existing filters if exists.\r\n let newFilter = a.filter(b => b.field != \"subsidenceRisk2030\");\r\n let rtnArr = Object.entries(risk2030).filter(a => !a[1]); //get false entries.\r\n //re-add filters if selected.\r\n if (rtnArr && rtnArr.length > 0) {\r\n rtnArr.forEach(v => {\r\n let f = data2030[v[0]].filter;\r\n if (!f)\r\n f = makeFilter(v[0], \"subsidenceRisk2030\");\r\n newFilter.push(f);\r\n });\r\n }\r\n return newFilter;\r\n });\r\n }, [risk2030]);\r\n\r\n useEffect(() => {\r\n setFilter(a => {\r\n //TODO: if any states are false, add the not filter. via setFilter.\r\n //remove existing filters if exists.\r\n let newFilter = a.filter(b => b.field != \"subsidenceRisk2070\");\r\n let rtnArr = Object.entries(risk2070).filter(a => !a[1]); //get false entries.\r\n //re-add filters if selected.\r\n if (rtnArr && rtnArr.length > 0) {\r\n rtnArr.forEach(v => {\r\n let f = data2070[v[0]].filter;\r\n if (!f)\r\n f = makeFilter(v[0], \"subsidenceRisk2070\");\r\n newFilter.push(f);\r\n });\r\n }\r\n return newFilter;\r\n });\r\n }, [risk2070]);\r\n\r\n const makeFilter = (label, field) => {\r\n return {\r\n children: null,\r\n count: 0,\r\n displayText: label,\r\n field: field,\r\n from: null,\r\n id: \"fakedId\",\r\n label: label,\r\n to: null,\r\n type: \"NotTerm\"\r\n };\r\n }\r\n\r\n const handleChange2030 = (event) => {\r\n setRisk2030(state => {\r\n let rtn = { ...state, [event.target.name]: event.target.checked };\r\n return rtn;\r\n });\r\n \r\n };\r\n\r\n const handleChange2070 = (event) => {\r\n setRisk2070(state => {\r\n let rtn = { ...state, [event.target.name]: event.target.checked };\r\n return rtn;\r\n });\r\n };\r\n\r\n\r\n //const { Improbable, Possible, Probable, Unavailable } = risk2030;\r\n\r\n let render2030 = data2030\r\n && (\r\n <>\r\n By 2030\r\n \r\n } label={data2030.Improbable.text} />\r\n } label={data2030.Possible.text} />\r\n } label={data2030.Probable.text} />\r\n } label={data2030.Unavailable.text} />\r\n \r\n \r\n );\r\n\r\n let render2070 = data2070\r\n && (\r\n <>\r\n By 2070\r\n \r\n } label={data2070.Improbable.text} />\r\n } label={data2070.Possible.text} />\r\n } label={data2070.Probable.text} />\r\n } label={data2070.Unavailable.text} />\r\n \r\n \r\n );\r\n\r\n return (\r\n \r\n Sudsidence Risks\r\n {render2030}\r\n\r\n {render2070}\r\n \r\n );\r\n}\r\n\r\nexport default memo(SubsidenceSelect);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport TextField from '@mui/material/TextField';\r\nimport Autocomplete from '@mui/material/Autocomplete';\r\nimport InputLabel from '@mui/material/InputLabel';\r\nimport FormControl from '@mui/material/FormControl';\r\nimport NativeSelect from '@mui/material/NativeSelect';\r\nimport IconButton from '@mui/material/IconButton';\r\nimport CancelIcon from '@mui/icons-material/Cancel';\r\nimport { Box } from '@mui/material';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\n\r\nconst tags = [\"10pin\", \"accessories\", \"accessorize\", \"admiral\", \"adult\", \"adult gaming centre\", \"adventist\", \"african\", \"age uk\", \"agrarian\", \"aib\", \"airport\", \"public airport\", \"private airport\", \"international airport\", \"continental airport\", \"major airport\", \"alcohol\", \"aldi\", \"ale\", \"all bar one\", \"allotment\", \"amazon\", \"amazon hub\", \"amazon locker\", \"amenity\", \"amplifon\", \"amusement arcade\", \"amusements\", \"an post\", \"anglican\", \"angling\", \"animal boarding\", \"animal breeding\", \"animal hitch\", \"animal shelter\", \"ann summers\", \"antiques\", \"anytime fitness\", \"apartments\", \"applegreen\", \"appliance\", \"aquarium\", \"aquatics\", \"archery\", \"argos\", \"art\", \"arts centre\", \"artwork\", \"asda\", \"asian\", \"ask italian\", \"astroturf\", \"athletic\", \"athletics\", \"atm\", \"ats euromaster\", \"attraction\", \"auchan\", \"audi\", \"autocentre\", \"automobiles\", \"b&m\", \"b&q\", \"baby goods\", \"badminton\", \"bag\", \"baker\", \"bakery\", \"bandstand\", \"bangladeshi\", \"bank\", \"bank of ireland\", \"bank of scotland\", \"baptist\", \"barber\", \"barclays\", \"bargain booze\", \"barnardos\", \"barracks\", \"baseball\", \"basketball\", \"bathroom\", \"bathroom furnishing\", \"baths\", \"bbq\", \"beachvolleyball\", \"beauty\", \"beach\", \"bed\", \"beefeater\", \"beer garden\", \"bella italia\", \"bensons for beds\", \"best-one\", \"betfred\", \"beverages\", \"bicycle\", \"bicycle rental\", \"bicycle repair station\", \"biergarten\", \"bike\", \"billiards\", \"bingo\", \"bird hide\", \"bleachers\", \"blenheim\", \"bmw\", \"bmx\", \"bnp paribas\", \"boat\", \"boat rental\", \"boat storage\", \"boathouse\", \"bonmarché\", \"bookmaker\", \"books\", \"bookshop\", \"booths\", \"boots\", \"boots opticians\", \"botanical\", \"boules\", \"boutique\", \"bowling\", \"bowling alley\", \"bowls\", \"boxing\", \"boylesports\", \"brewdog\", \"brewers\", \"brewers fayre\", \"brewery\", \"bridal\", \"bridle\", \"british heart foundation\", \"british red cross\", \"buddhist\", \"buddhist temple\", \"budgens\", \"builders merchant\", \"building materials\", \"bupa\", \"bureau de change\", \"burger king\", \"burgers\", \"bus\", \"bus garage\", \"bus station\", \"bus stop\", \"butcher\", \"cafe\", \"caffè nero\", \"camera\", \"campsite\", \"canal\", \"cancer research uk\", \"candles\", \"canoe\", \"canopy\", \"cantonese\", \"car parts\", \"car pooling\", \"car rental\", \"car repair\", \"car sharing\", \"car wash\", \"caravan\", \"card factory\", \"care home\", \"carpet\", \"carpetright\", \"carphone warehouse\", \"carvery\", \"cash converters\", \"casino\", \"catalogue\", \"cathedral\", \"catholic\", \"cemetery\", \"cex\", \"chapel\", \"charcuterie\", \"charging\", \"charging station\", \"charity\", \"cheese\", \"chemist\", \"chicken\", \"childcare\", \"chinese\", \"chip\", \"chiropractic\", \"chocolate\", \"christian\", \"church\", \"church hall\", \"church in wales\", \"church of scotland\", \"cic\", \"cinema\", \"cineworld\", \"circle k\", \"circus\", \"citizens advice\", \"citroën\", \"civic\", \"claires\", \"clarks\", \"climbing\", \"clinic\", \"clintons\", \"clock\", \"clothes\", \"club\", \"clubhouse\", \"coastline\", \"coccimarket\", \"coffee\", \"cohens chemist\", \"collector\", \"college\", \"common\", \"community centre\", \"community hall\", \"compressed air\", \"computer\", \"confectionery\", \"conference centre\", \"congregational\", \"construction\", \"convenience\", \"co-op\", \"co-op food\", \"cooplands\", \"copyshop\", \"coral\", \"cosmetics\", \"costa\", \"costco\", \"costcutter\", \"côte brasserie\", \"cotswold outdoor\", \"country store\", \"court yard\", \"courthouse\", \"craft\", \"creche\", \"crédit agricole\", \"crédit mutuel\", \"crematorium\", \"cricket\", \"cricket nets\", \"croquet\", \"crossfit\", \"ctd tiles\", \"curry\", \"currys\", \"curtain\", \"cycle\", \"cycling\", \"dairy\", \"dance\", \"danske bank\", \"day lewis pharmacy\", \"daybreak\", \"debenhams\", \"decathlon\", \"deichmann\", \"deli\", \"delicatessen\", \"dental\", \"dentist\", \"dentistry\", \"department store\", \"dessert\", \"detached\", \"dfs\", \"diner\", \"diocese\", \"disused\", \"dixy chicken\", \"doctor\", \"doctors\", \"dog park\", \"doityourself\", \"dojo\", \"dominos\", \"donut\", \"doors\", \"dreams\", \"dressing room\", \"drinking water\", \"drive through\", \"driving school\", \"dry cleaning\", \"dublinbikes\", \"dunelm\", \"dunnes stores\", \"e. leclerc\", \"e-cigarette\", \"education\", \"electrical\", \"electronics\", \"emergency\", \"empty\", \"enterprise\", \"equestrian\", \"ernest jones\", \"erotic\", \"escape game\", \"esso\", \"estate agent\", \"euro car parts\", \"eurochange\", \"europcar\", \"eurospar\", \"evangelical\", \"evangelist\", \"evans cycles\", \"events venue\", \"exercise\", \"f.hinds\", \"fabric\", \"fairway\", \"farm\", \"farm shop\", \"farmers\", \"farmers market\", \"farmfoods\", \"farmyard\", \"fashion accessories\", \"fast food\", \"fat face\", \"fencing\", \"ferry\", \"ferry terminal\", \"fiat\", \"field hockey\", \"field shelter\", \"fire station\", \"firepit\", \"fireplace\", \"fish\", \"fisheries\", \"fishing\", \"fishponds\", \"fitness\", \"fitness centre\", \"fitness station\", \"five guys\", \"five-a-side\", \"fiveguys\", \"flight centre\", \"flooring\", \"florist\", \"flowerbed\", \"flying tiger copenhagen\", \"food\", \"food court\", \"foodbank\", \"football\", \"footway\", \"ford\", \"forest\", \"fountain\", \"frame\", \"frankie & bennys\", \"french\", \"frozen food\", \"fuel\", \"fullers\", \"funeral\", \"funeral directors\", \"furniture\", \"gaelic games\", \"gallery\", \"gambling\", \"game\", \"games\", \"gaming\", \"gap\", \"garage\", \"garden centre\", \"garrison\", \"gas\", \"gazebo\", \"gelato\", \"general\", \"gift\", \"glaziery\", \"gluten free\", \"go outdoors\", \"goldsmiths\", \"golf\", \"golf course\", \"gourmet burger kitchen\", \"grape tree\", \"grass\", \"grave yard\", \"greene king\", \"greengrocer\", \"greggs\", \"grill\", \"grocer\", \"grocery\", \"guest house\", \"gulf\", \"gurdwara\", \"gym\", \"gymnastics\", \"h&m\", \"h&t pawnbrokers\", \"h.samuel\", \"haberdashery\", \"hairdresser\", \"hairdresser supply\", \"halal\", \"halfords\", \"halfords autocentre\", \"halifax\", \"hall & woodhouse\", \"hallmark\", \"handball\", \"harbour\", \"hardware\", \"harvester\", \"harveys\", \"hays travel\", \"health\", \"health centre\", \"health food\", \"healthcare\", \"hearing aids\", \"heath\", \"helipad\", \"herbalist\", \"heron foods\", \"hertz\", \"hifi\", \"hindu\", \"hindu temple\", \"hmv\", \"hobbs\", \"hobbycraft\", \"hockey\", \"holland & barrett\", \"home bargains\", \"homebase\", \"honda\", \"horse racing\", \"horse riding\", \"horses\", \"hospice\", \"hospital\", \"hostel\", \"hotel\", \"houseware\", \"howdens joinery\", \"hsbc\", \"hugo boss\", \"hungry horse\", \"hunting stand\", \"hut\", \"hyundai\", \"ice cream\", \"ice rink\", \"iceland\", \"ikea\", \"indian\", \"indoor play\", \"industrial\", \"information\", \"inn\", \"insomnia\", \"interior decoration\", \"intermarché\", \"internet cafe\", \"intersport\", \"islamic\", \"italian\", \"itsu\", \"japanese\", \"jd sports\", \"jehovah\", \"jehovahs witness\", \"jewelry\", \"jewish\", \"jewson\", \"jigsaw\", \"johnsons\", \"joules\", \"karting\", \"kebab\", \"kennels\", \"kfc\", \"kia\", \"kindergarten\", \"kiosk\", \"kitchen\", \"kreme\", \"krispy\", \"krispy kreme\", \"kwik fit\", \"la poste\", \"ladbrokes\", \"lake\", \"land rover\", \"language school\", \"launderette\", \"laundrette\", \"laundry\", \"lavoir\", \"lcl\", \"leather\", \"lebanese\", \"leisure\", \"leon\", \"letter box\", \"lexus\", \"libraries\", \"library\", \"lidl\", \"lifeboat station\", \"lifestyle express\", \"lighting\", \"little waitrose\", \"lloyds bank\", \"lloyds pharmacy\", \"loading dock\", \"locker inpost\", \"locksmith\", \"londis\", \"long jump\", \"lush\", \"m&co\", \"m&s foodhall\", \"m&s simply food\", \"mace\", \"magnet\", \"majestic\", \"mall\", \"mandir\", \"marie curie\", \"marina\", \"marketplace\", \"marks & spencer\", \"martial\", \"martial arts\", \"martins\", \"massage\", \"matalan\", \"maternity\", \"max spielmann\", \"maxol\", \"mazda\", \"maze\", \"mccolls\", \"mcdonalds\", \"meadow\", \"meat\", \"mecca\", \"medical supply\", \"mercedes-benz\", \"methodist\", \"metro bank\", \"miller & carter\", \"millets\", \"mind\", \"miniature golf\", \"mobile phone\", \"mobility\", \"model\", \"monastery\", \"money lender\", \"money transfer\", \"monsoon\", \"montessori\", \"mormon\", \"morrisons\", \"morrisons daily\", \"mosque\", \"moss bros\", \"motocross\", \"motor\", \"motorcycle\", \"motorcycle repair\", \"mountain warehouse\", \"multifaith\", \"murco\", \"museum\", \"music\", \"music school\", \"musical instrument\", \"muslim\", \"my dentist\", \"nameplate\", \"nandos\", \"national trust\", \"national tyres and autocare\", \"nationwide\", \"nature reserve\", \"natwest\", \"nepalese\", \"netball\", \"new look\", \"newsagent\", \"next\", \"nhs\", \"nightclub\", \"nisa\", \"nisa local\", \"nissan\", \"nondenominational\", \"notemachine\", \"nuffield\", \"nuffield health fitness & wellbeing\", \"nurseries\", \"nursery\", \"nursing home\", \"nutrition supplements\", \"oak furnitureland\", \"odeon\", \"office\", \"one stop\", \"optical express\", \"optician\", \"oriental\", \"orthodontics\", \"orthodox\", \"osteopathy\", \"outdoor\", \"outdoor seating\", \"oxfam\", \"paddling pool\", \"paddock\", \"paddy power\", \"paint\", \"pandora\", \"papa johns\", \"paperchase\", \"parcel locker\", \"parish\", \"party\", \"pasta\", \"pastry\", \"path\", \"patisserie\", \"patisserie valerie\", \"paul\", \"pavilion\", \"pawnbroker\", \"pay scale area\", \"pdsa\", \"peacocks\", \"pebblestone\", \"peking\", \"pentecostal\", \"perfumery\", \"permanent tsb\", \"pescetarian\", \"pet\", \"pet grooming\", \"petrol\", \"pets at home\", \"pets corner\", \"peugeot\", \"pharmacy\", \"phase eight\", \"photo\", \"photo booth\", \"physiotherapist\", \"physiotherapy\", \"picard\", \"picnic\", \"picnic shelter\", \"picnic site\", \"picnic table\", \"pier\", \"pilates\", \"piri\", \"pitch\", \"pizza\", \"pizza hut\", \"pizza hut delivery\", \"pizzaexpress\", \"pizzeria\", \"place of worship\", \"playground\", \"plumbing\", \"police\", \"polish\", \"polo\", \"pool\", \"pond\", \"post box\", \"post depot\", \"post office\", \"pottery\", \"poundland\", \"poundstretcher\", \"premier\", \"prep school\", \"presbyterian\", \"preschool\", \"pret\", \"pret a manger\", \"prezzo\", \"primark\", \"printer ink\", \"printing\", \"prison\", \"protestant\", \"psychiatry\", \"pub\", \"public bookcase\", \"public building\", \"public transport\", \"puregym\", \"quaker\", \"quakers\", \"railway\", \"ramsdens\", \"rbs\", \"reception desk\", \"recreation ground\", \"recycling\", \"reiss\", \"religious\", \"renault\", \"repair\", \"reservoir\", \"residential\", \"resort\", \"restaurant\", \"retail\", \"retail park\", \"retirement\", \"retirement home\", \"rifle\", \"river\", \"river island\", \"robert dyas\", \"roman catholic\", \"roof\", \"rowing\", \"rowlands pharmacy\", \"rspca\", \"rugby\", \"rugby league\", \"rugby union\", \"running\", \"ryman\", \"sailing\", \"sainsburys\", \"sainsburys bank\", \"sainsburys local\", \"salad\", \"salvation army\", \"samaritans\", \"sand\", \"sandwich\", \"sanitary dump station\", \"santander\", \"santander cycles\", \"sauna\", \"savers\", \"school\", \"schoolyard\", \"schuh\", \"science\", \"scope\", \"scotmid\", \"scottish episcopal\", \"scout hut\", \"scouts\", \"screwfix\", \"scrivens\", \"scs\", \"scuba diving\", \"sculpture\", \"seafood\", \"second hand\", \"service\", \"seventh day adventist\", \"sewing\", \"shawarma\", \"shed\", \"shell\", \"shell select\", \"shelter\", \"shingle\", \"shoe repair\", \"shoe zone\", \"shoes\", \"shooting\", \"shop\", \"shower\", \"sikh\", \"skateboard\", \"skiing\", \"skipton building society\", \"škoda\", \"slipway\", \"smiggle\", \"smoking area\", \"smyths\", \"snappy snaps\", \"snooker\", \"soccer\", \"social centre\", \"social club\", \"social facility\", \"société générale\", \"source london\", \"spa\", \"spanish\", \"spar\", \"specsavers\", \"spiritualist\", \"sports\", \"sports centre\", \"sports direct\", \"sports hall\", \"squash\", \"stables\", \"stadium\", \"starbucks\", \"station\", \"stationery\", \"steakhouse\", \"storage\", \"storage rental\", \"stream\", \"stripclub\", \"studio\", \"subway\", \"sue ryder\", \"sunni\", \"super u\", \"supercuts\", \"superdrug\", \"superdry\", \"supermacs\", \"supermarket\", \"supervalu\", \"surgery\", \"sushi\", \"suzuki\", \"swarovski\", \"swimming\", \"swimming area\", \"swimming pool\", \"synagogue\", \"tabernacle\", \"table tennis\", \"taco bell\", \"tailor\", \"takeaway\", \"tandoori\", \"tanning\", \"tanning salon\", \"tapas\", \"tapi carpets\", \"tarn\", \"tattoo\", \"taxi\", \"tea\", \"tearoom\", \"temple\", \"tennis\", \"tesco\", \"tesco express\", \"tesco extra\", \"tesla\", \"tesla supercharger\", \"texaco\", \"tgi fridays\", \"thai\", \"the body shop\", \"the co-operative bank\", \"the co-operative food\", \"the co-operative funeralcare\", \"the entertainer\", \"the food warehouse\", \"the fragrance shop\", \"the gym\", \"the perfume shop\", \"the range\", \"the salvation army\", \"the works\", \"theatre\", \"theme park\", \"therapy\", \"thomas cook\", \"thorntons\", \"three\", \"ticket\", \"ticket validator\", \"tiles\", \"timpson\", \"tk maxx\", \"tobacco\", \"toby carvery\", \"toni & guy\", \"tool hire\", \"toolstation\", \"topps tiles\", \"total\", \"tourism\", \"townhall\", \"toyota\", \"toys\", \"track\", \"trade\", \"train\", \"train station\", \"trampoline park\", \"transport for london\", \"travel agency\", \"travis perkins\", \"trespass\", \"trolley bay\", \"trophy\", \"tsb\", \"tui\", \"turkish\", \"tyres\", \"ulster bank\", \"unit\", \"unitarian\", \"united reformed\", \"university\", \"upper crust\", \"vacuum cleaner\", \"variety store\", \"vauxhall\", \"vegan\", \"vegetarian\", \"vehicle inspection\", \"vending machine\", \"veterinary\", \"vetinary\", \"vets4pets\", \"viaduct\", \"video\", \"video games\", \"viewpoint\", \"village green\", \"village hall\", \"virgin money\", \"vision express\", \"vodafone\", \"volkswagen\", \"volleyball\", \"volvo\", \"vue\", \"wacky warehouse\", \"wagamama\", \"waitrose\", \"warehouse\", \"warhammer\", \"warren james\", \"wasabi\", \"waste disposal\", \"waste transfer station\", \"watches\", \"water\", \"water park\", \"water point\", \"watering place\", \"waterstones\", \"weapons\", \"weather shelter\", \"wedding\", \"weighbridge\", \"well pharmacy\", \"westfield\", \"wetherspoon\", \"white stuff\", \"wholesale\", \"whsmith\", \"wickes\", \"wildlife hide\", \"wilko\", \"william hill\", \"wimpy\", \"window blind\", \"wine\", \"wolseley\", \"wood\", \"wool\", \"wren kitchens\", \"ymca\", \"yo sushi\", \"yoga\", \"yorkshire building society\", \"yves rocher\", \"zara\", \"zipcar\", \"zizzi\", \"zoo\"];\r\nconst buckets = [[250, \"250m\"], [500, \"500m\"], [1000, \"1km\"], [3000, \"3km\"], [5000, \"5km\"], [10000, \"10km\"], [15000, \"15km\"]];\r\n\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n layout: {\r\n padding: \"8px\",\r\n width: \"100%\",\r\n },\r\n container: {\r\n display: \"flex\",\r\n alignItems: \"baseline\",\r\n \r\n },\r\n element: {\r\n //{{ style: { backgroundColor: action.active ? theme.palette.secondary.main : theme.palette.mapicons.background } }\r\n padding: \"0px\",\r\n },\r\n icon: {\r\n color: theme.palette.secondary.main,\r\n },\r\n text: {\r\n padding: \"0px\",\r\n margin: \"0px\",\r\n textOverflow: 'ellipsis',\r\n maxWidth: \"60%\",\r\n lineHeight: \"30px\",\r\n overflow: \"hidden\",\r\n whiteSpace: \"nowrap\"\r\n }\r\n}));\r\n\r\nconst NearbyAmenitiesFilter = ({ filterData, setFilter }) => {\r\n const [data, setData] = useState([]);\r\n const [selectedFields, setSelectedFields] = useState([]);\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const [autoValue, setAutoValue] = useState(\"\");\r\n const autoRef = useRef()\r\n\r\n const onAutocompleteChange = (a) => {\r\n console.log(a);\r\n if (a != undefined && a.length > 1) {\r\n setSelectedFields(b => [...b, [a, 500]]);\r\n }\r\n setAutoValue(\"\");\r\n }\r\n\r\n const remove = (a) => {\r\n setSelectedFields(b => b.filter(i => i[0] != a));\r\n }\r\n\r\n const onDistanceChange = (a,b) => {\r\n console.log(a.target.value);\r\n console.log(b);\r\n setSelectedFields(x => x.map(y => y[0] == b[0] ? [y[0], parseInt(a.target.value)] : y));\r\n }\r\n\r\n useEffect(() => {\r\n console.log(selectedFields);\r\n //convert to filters:\r\n setFilter(a => {\r\n let newFilter = a.filter(b => b.type != \"Amenity\"); //remove existing amenity filters\r\n selectedFields.forEach(f => {\r\n newFilter.push({\r\n type: \"Amenity\",\r\n label: f[0],\r\n field: f[1].toString(),\r\n });\r\n }); //add amenities...\r\n return newFilter;\r\n });\r\n }, [selectedFields]);\r\n\r\n return (\r\n \r\n onAutocompleteChange(newValue)}\r\n sx={{ width: \"100%\" }}\r\n className={classes.layout}\r\n renderInput={(params) => }\r\n />\r\n\r\n {selectedFields.map(a => (\r\n \r\n {a[0]}\r\n
\r\n \r\n Within:\r\n\r\n onDistanceChange(x,a)}\r\n >\r\n {buckets.map(b => ())}\r\n\r\n \r\n \r\n remove(a[0])} >\r\n \r\n \r\n
\r\n ))}\r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(NearbyAmenitiesFilter);","import React, { useEffect, useState, memo, useRef } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Modal from '@material-ui/core/Modal';\r\nimport Backdrop from '@material-ui/core/Backdrop';\r\nimport Fade from '@material-ui/core/Fade';\r\nimport FadeModal from '../FadeModal';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport PriceSlider from './PriceSlider';\r\nimport BedroomSlider from './BedroomSlider';\r\nimport BathroomSlider from './BathroomSlider';\r\nimport SqFtSlider from './SqFtSlider';\r\n\r\nimport AcreageSlider from './AcreageSlider';\r\nimport CrimeSlider from './CrimeSlider';\r\nimport DeprivationSlider from './DeprivationSlider';\r\nimport PriceSqFtSlider from './PriceSqFtSlider';\r\nimport RoomCntSlider from './RoomCntSlider';\r\nimport BroadbandSlider from './BroadbandSpeedSlider';\r\nimport SchoolFilter from './SchoolFilter';\r\n//import BarsSelect from './BarsSelect';\r\n//import HotelsSelect from './HotelsSelect';\r\nimport RecreationSelect from './RecreationSelect';\r\n//import ShopsSelect from './ShopsSelect';\r\nimport FloodingSelect from './FloodingSelect';\r\nimport SubsidenceSelect from './SubsidenceSelect';\r\nimport NearbyAmenitiesFilter from './NearbyAmenitiesFilter';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n paper: {\r\n padding: theme.spacing(2),\r\n textAlign: 'center',\r\n color: theme.palette.text.secondary,\r\n },\r\n}));\r\n\r\nconst MainFilter = ({ open, setOpen, filterTerms, setFilterTerms, filterData }) => {\r\n const [cnt, setCnt] = useState(0);\r\n console.log(\"filterData\", filterData);\r\n\r\n useEffect(() => {\r\n if (filterData != null) {\r\n let c = filterData.exclusionFilters.children.sort((a,b)=>a.count-b.count).find(a => a.count >= 0).count;\r\n setCnt(c);\r\n }\r\n },[filterData])\r\n\r\n\r\n const classes = useStyles();\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Property Types\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Local Amenities\r\n \r\n {/**/}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}{/**/}\r\n {/* */}{/* */}\r\n {/* */}{/**/}\r\n {/* */}{/**/}\r\n {/* */}{/* */}\r\n {/* */}{/**/}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/**/}\r\n \r\n \r\n \r\n \r\n Property Types\r\n \r\n \r\n Tenures\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Ownership\r\n \r\n \r\n
\r\n\r\n\r\n\r\n
\r\n );\r\n}\r\n\r\nexport default memo(MainFilter);\r\n\r\n","import React, { useEffect, memo, useState } from 'react';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport ChevronRightIcon from \"@material-ui/icons/ChevronRight\";\r\nimport { Paper } from '@material-ui/core';\r\nimport Link from '@mui/material/Link';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n\r\n tabPan: {\r\n \"overflowY\": \"auto\",\r\n [theme.breakpoints.up(\"xs\")]: {\r\n \"maxHeight\": 'calc(100vh - 96px)' //48+48\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n \"maxHeight\": 'calc(100vh - 80px)' //32 + 48\r\n },\r\n },\r\n root: {\r\n flexGrow: 1,\r\n backgroundColor: theme.palette.background.paper,\r\n },\r\n}));\r\n\r\nconst SchoolView = ({ item, setOpen }) => {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const [schoolData, setSchoolData] = useState(null);\r\n\r\n useEffect(() => {\r\n if (item != null) {\r\n //go call api and get data.\r\n }\r\n }, [item]);\r\n\r\n if (item != null) {\r\n return (\r\n
\r\n \r\n
\r\n setOpen(a => !a)} style={{ \"align\": \"right\" }} color=\"secondary\">\r\n \r\n \r\n School name from data {item}\r\n
\r\n
\r\n \r\n School name from data {item}\r\n \r\n {'compare-school-performance.service.gov.uk'}\r\n \r\n \r\n
);\r\n }\r\n\r\n return (null);\r\n}\r\n\r\nexport default memo(SchoolView);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport { Grid, Typography, Slider } from '@mui/material';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport useWindowDimensions from \"../hooks/useWindowDimensions.jsx\";\r\n\r\nconst priceHistoryStops = [\r\n { position: 0, color: \"rgba(200,255,200,0.5)\", val: \"£0\" },\r\n { position: 45, color: \"rgba(100,255,100,0.5)\", val: \"£100K\" }, //100000\r\n { position: 90, color: \"rgba(50,255,50,0.5)\", val: \"£200K\" }, //200000\r\n { position: 135, color: \"rgba(128,255,50,0.5)\", val: \"£300K\" }, //300000\r\n { position: 180, color: \"rgba(255,255,50,0.5)\", val: \"£400K\" }, //400000\r\n { position: 225, color: \"rgba(255,128,50,0.5)\", val: \"£500K\" }, //500000\r\n { position: 270, color: \"rgba(255,0,50,0.5)\", val: \"£1M\" }, //1000000\r\n { position: 315, color: \"rgba(128,0,25,0.5)\", val: \"£1.5M\" }, //1500000\r\n { position: 360, color: \"rgba(64,0,0,0.5)\", val: \"£2M+\" }, //2000000\r\n];\r\n\r\nconst crimeStops = [\r\n { position: 0, color: \"rgba(200,255,200,0.6)\", val: \"0\" },\r\n { position: 90, color: \"rgba(25,255,25,0.6)\", val: \"100\" },\r\n { position: 180, color: \"rgba(255,255,50,0.6)\", val: \"1000\" },\r\n { position: 270, color: \"rgba(255,0,25,0.6)\", val: \"10000\" },\r\n { position: 360, color: \"rgba(0,0,0,0.6)\", val: \"30000\" }\r\n\r\n];\r\n\r\nconst priceDiffStops = [\r\n { position: 0, color: \"#0000ff\", val: \"-100%\" },\r\n { position: 33, color: \"#0073ff\", val: \"-50\" }, //100000\r\n { position: 66, color: \"#00a0ff\", val: \"-30%\" }, //200000\r\n { position: 99, color: \"#00c2f2\", val: \"-20%\" }, //300000\r\n { position: 132, color: \"#00dfd3\", val: \"-10%\" }, //400000\r\n { position: 165, color: \"#4de2b2\", val: \"0%\" }, //500000\r\n { position: 198, color: \"#81e28d\", val: \"10%\" }, //1000000\r\n { position: 231, color: \"#b1de6a\", val: \"20%\" }, //1500000\r\n { position: 264, color: \"#c4c026\", val: \"30%\" }, //2000000\r\n { position: 297, color: \"#da9b00\", val: \"50%\" }, //2000000\r\n { position: 330, color: \"#ef6c00\", val: \"100%\" }, //2000000\r\n { position: 360, color: \"#ff0000\", val: \"200%\" }, //2000000\r\n];\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n barWidth: {\r\n [theme.breakpoints.up(\"xs\")]: {\r\n width: '360px',\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n width: '180px',\r\n },\r\n },\r\n barHeight: {\r\n [theme.breakpoints.up(\"xs\")]: {\r\n height: '40px',\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n height: '20px',\r\n },\r\n }\r\n}));\r\n\r\nconst GradientBar = ({ type }) => {\r\n\r\n const [gradientStops, setGradientStops] = useState([priceHistoryStops, 1]);\r\n const [barStyle, setBarStyle] = useState({});\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const { width, height } = useWindowDimensions();\r\n useEffect(() => {\r\n if (type == \"pricehistory\") {\r\n setGradientStops([priceHistoryStops, 1]);\r\n }\r\n else if (type == \"pricediff\") {\r\n setGradientStops([priceDiffStops, 0.4]);\r\n }\r\n else if (type == \"crime\") {\r\n setGradientStops([crimeStops, 1]);\r\n }\r\n }, [type])\r\n\r\n useEffect(() => {\r\n\r\n let multiplier = 1;\r\n if (width < theme.breakpoints.width(\"sm\")) {\r\n multiplier = 0.5;\r\n }\r\n\r\n let gradientString = gradientStops[0]\r\n .map(stop => `${stop.color} ${stop.position * multiplier}px`)\r\n .join(', ');\r\n\r\n // Apply the gradient as a background\r\n let barStyle = {\r\n opacity: gradientStops[1],\r\n background: `linear-gradient(to right, ${gradientString})`,\r\n };\r\n\r\n setBarStyle(barStyle);\r\n }, [gradientStops])\r\n // Generate the gradient string\r\n\r\n\r\n return (\r\n \r\n {/* Add 9 labels */}\r\n {gradientStops[0].map((i, index) => (\r\n \r\n = theme.breakpoints.width(\"sm\") ? \"body1\" : \"body2\")} style={{ paddingLeft: \"5px\", paddingBottom: \"5px\", transform: 'rotate(315deg)' }}>\r\n {i.val}\r\n \r\n \r\n ))}\r\n\r\n {/* Add the div */}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
)\r\n\r\n}\r\n\r\n\r\nexport default memo(GradientBar);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Box from '@mui/material/Box';\r\nimport GradientBar from './GradientBar';\r\nimport { Grid, Typography, Slider } from '@mui/material';\r\nimport FormControlLabel from '@mui/material/FormControlLabel';\r\nimport Switch from '@mui/material/Switch';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n backgroundColor: 'rgba(255,255,255,0.8)',\r\n border: '1px solid gray',\r\n display: 'inline-flex',\r\n position: 'relative',\r\n alignItems: 'center',\r\n verticalAlign: 'middle',\r\n justifyContent: 'center',\r\n pointerEvents: 'auto',\r\n opacity: 1,\r\n \r\n\r\n [theme.breakpoints.up(\"xs\")]: {\r\n width: '400px',\r\n height: '220px',\r\n borderRadius: '10px',\r\n margin: '6px 16px',\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n width: '220px',\r\n height: '180px',\r\n borderRadius: '6px',\r\n margin: '3px 8px',\r\n paddingTop: \"20px\",\r\n },\r\n\r\n '& .content': {\r\n \r\n [theme.breakpoints.up(\"xs\")]: {\r\n width: '360px',\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n width: '180px',\r\n paddingTop: \"0px\",\r\n },\r\n }\r\n }\r\n}));\r\n\r\nconst PriceHistoryControl = ({ visible, setFilter, statePriceDiffMode }) => {\r\n\r\n const [sliderValue, setSliderValue] = useState([2024]);\r\n const [sliderValues, setSliderValues] = useState([2020, 2024]);\r\n const [singleYearMode, setSingleYearMode] = useState(false);\r\n const [priceDiffMode, setPriceDiffMode] = statePriceDiffMode;\r\n const classes = useStyles();\r\n\r\n useEffect(() => {\r\n if (singleYearMode) {\r\n setFilter(sliderValue);\r\n }\r\n else {\r\n let min = Math.min(...sliderValues);\r\n let max = Math.max(...sliderValues);\r\n let filter = Array.from({ length: max - min + 1 }, (_, i) => min + i);\r\n setFilter(filter);\r\n }\r\n\r\n }, [singleYearMode, sliderValue, sliderValues, setFilter]);\r\n\r\n useEffect(() => {\r\n if (priceDiffMode) {\r\n if (sliderValues[0] == 2024) {\r\n setSliderValues([2023, sliderValues[1]]);\r\n }\r\n if (sliderValues[1] == 2024) {\r\n setSliderValues([sliderValues[0], 2023]);\r\n }\r\n }\r\n }, [priceDiffMode, sliderValues]);\r\n\r\n const marks = [\r\n {\r\n value: 2006,\r\n label: '2006',\r\n },\r\n {\r\n value: 2009,\r\n label: '2009',\r\n },\r\n {\r\n value: 2012,\r\n label: '2012',\r\n },\r\n {\r\n value: 2015,\r\n label: '2015',\r\n },\r\n {\r\n value: 2018,\r\n label: '2018',\r\n },\r\n {\r\n value: 2021,\r\n label: '2021',\r\n },\r\n {\r\n value: 2024,\r\n label: '2024',\r\n },\r\n ]\r\n\r\n const marksDiff = [\r\n {\r\n value: 2005,\r\n label: '2005',\r\n },\r\n {\r\n value: 2008,\r\n label: '2008',\r\n },\r\n {\r\n value: 2011,\r\n label: '2011',\r\n },\r\n {\r\n value: 2014,\r\n label: '2014',\r\n },\r\n {\r\n value: 2017,\r\n label: '2017',\r\n },\r\n {\r\n value: 2020,\r\n label: '2020',\r\n },\r\n {\r\n value: 2023,\r\n label: '2023',\r\n },\r\n ]\r\n\r\n\r\n\r\n if (!visible) {\r\n return (<>);\r\n }\r\n\r\n\r\n console.log(\"singleYearMode\", singleYearMode);\r\n console.log(sliderValue);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n setSingleYearMode(a => !a)} />} label=\"Single Year\" />\r\n \r\n \r\n { setPriceDiffMode(a => !a); setSingleYearMode(false); }} />} label=\"Price Growth\" />\r\n \r\n \r\n\r\n {singleYearMode ? (\r\n setSliderValue(newValue)}\r\n marks={priceDiffMode ? marksDiff : marks}\r\n min={2005}\r\n max={priceDiffMode ? 2023 : 2024}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n getAriaValueText={a => `${a}`}\r\n />\r\n ) : (\r\n setSliderValues(newValues)}\r\n marks={priceDiffMode ? marksDiff : marks}\r\n min={2005}\r\n max={priceDiffMode ? 2023 : 2024}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n getAriaValueText={a => `${a}`}\r\n />\r\n )}\r\n\r\n\r\n \r\n \r\n )\r\n}\r\n\r\n\r\nexport default memo(PriceHistoryControl);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Box from '@mui/material/Box';\r\nimport GradientBar from './GradientBar';\r\nimport { Grid, Typography, Slider } from '@mui/material';\r\nimport FormControlLabel from '@mui/material/FormControlLabel';\r\nimport Switch from '@mui/material/Switch';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n backgroundColor: 'rgba(255,255,255,0.8)',\r\n border: '1px solid gray',\r\n display: 'inline-flex',\r\n position: 'relative',\r\n alignItems: 'center',\r\n verticalAlign: 'middle',\r\n justifyContent: 'center',\r\n pointerEvents: 'auto',\r\n opacity: 1,\r\n\r\n\r\n [theme.breakpoints.up(\"xs\")]: {\r\n width: '400px',\r\n height: '220px',\r\n borderRadius: '10px',\r\n margin: '6px 16px',\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n width: '220px',\r\n height: '180px',\r\n borderRadius: '6px',\r\n margin: '3px 8px',\r\n paddingTop: \"20px\",\r\n },\r\n\r\n '& .content': {\r\n\r\n [theme.breakpoints.up(\"xs\")]: {\r\n width: '360px',\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n width: '180px',\r\n paddingTop: \"0px\",\r\n },\r\n }\r\n }\r\n}));\r\n\r\nconst CrimeControl = ({ visible, setFilter }) => {\r\n\r\n const [sliderValue, setSliderValue] = useState([2024]);\r\n const [sliderValues, setSliderValues] = useState([2020, 2024]);\r\n const [singleYearMode, setSingleYearMode] = useState(false);\r\n const classes = useStyles();\r\n\r\n useEffect(() => {\r\n if (singleYearMode) {\r\n setFilter(sliderValue);\r\n }\r\n else {\r\n let min = Math.min(...sliderValues);\r\n let max = Math.max(...sliderValues);\r\n let filter = Array.from({ length: max - min + 1 }, (_, i) => min + i);\r\n console.log(\"crime filter set\", filter);\r\n setFilter(filter);\r\n }\r\n\r\n }, [singleYearMode, sliderValue, sliderValues, setFilter]);\r\n\r\n const marks = [\r\n {\r\n value: 2020,\r\n label: '2020',\r\n },\r\n {\r\n value: 2021,\r\n label: '2021',\r\n },\r\n {\r\n value: 2022,\r\n label: '2022',\r\n },\r\n {\r\n value: 2023,\r\n label: '2023',\r\n },\r\n {\r\n value: 2024,\r\n label: '2024',\r\n }\r\n ]\r\n\r\n\r\n\r\n if (!visible) {\r\n return (<>);\r\n }\r\n\r\n console.log(\"singleYearMode\", singleYearMode);\r\n console.log(sliderValue);\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n setSingleYearMode(a => !a)} />} label=\"Single Year\" />\r\n \r\n \r\n \r\n \r\n\r\n {singleYearMode ? (\r\n setSliderValue(newValues)}\r\n marks={marks}\r\n min={2020}\r\n max={2024}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n getAriaValueText={a => `${a}`}\r\n />\r\n ) : (\r\n setSliderValues(newValues) }\r\n marks={marks}\r\n min={2020}\r\n max={2024}\r\n step={1}\r\n valueLabelDisplay=\"auto\"\r\n getAriaValueText={a => `${a}`}\r\n />\r\n )}\r\n\r\n\r\n \r\n \r\n )\r\n}\r\n\r\n\r\nexport default memo(CrimeControl);","import React, { useState, memo, useEffect, useRef } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Box from '@mui/material/Box';\r\nimport GradientBar from './GradientBar';\r\nimport { Grid, Typography, Slider } from '@mui/material';\r\nimport FormControlLabel from '@mui/material/FormControlLabel';\r\nimport Switch from '@mui/material/Switch';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport InputLabel from '@mui/material/InputLabel';\r\nimport FormControl from '@mui/material/FormControl';\r\nimport NativeSelect from '@mui/material/NativeSelect';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n container: {\r\n backgroundColor: 'rgba(255,255,255,0.8)',\r\n border: '1px solid gray',\r\n display: 'inline-flex',\r\n position: 'relative',\r\n alignItems: 'center',\r\n verticalAlign: 'middle',\r\n justifyContent: 'center',\r\n pointerEvents: 'auto',\r\n opacity: 1,\r\n\r\n\r\n [theme.breakpoints.up(\"xs\")]: {\r\n width: '400px',\r\n height: '220px',\r\n borderRadius: '10px',\r\n margin: '6px 16px',\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n width: '220px',\r\n height: '180px',\r\n borderRadius: '6px',\r\n margin: '3px 8px',\r\n paddingTop: \"20px\",\r\n },\r\n\r\n '& .content': {\r\n\r\n [theme.breakpoints.up(\"xs\")]: {\r\n width: '360px',\r\n },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n width: '180px',\r\n paddingTop: \"0px\",\r\n },\r\n }\r\n }\r\n}));\r\n\r\nconst schoolLayers = [\r\n \"ClassSizeAvgPrimary\",\r\n \"ClassSizeAvgSecondary\",\r\n \"Diversity\",\r\n \"KS2AverageProgress\",\r\n \"KS2PercentExpectedStandard\",\r\n \"KS2PercentHigherStandard\",\r\n \"KS4Attainment8\",\r\n \"KS4Progress8\",\r\n \"KS5Best3AveragePoints\",\r\n \"Ofsted\", //busted\r\n \"PercentCapacity\",\r\n \"PercentFreeSchoolMeals\",\r\n \"PercentPupilsEnglishFirstlanguage\",\r\n \"Demographics\",\r\n];\r\n\r\nconst demographics = [\r\n \"PercentWhiteBritish\",\r\n \"PercentIrish\",\r\n \"PercentTravellerofIrishHeritage\",\r\n \"PercentAnyotherWhiteBackground\",\r\n \"PercentGypsyRoma\",\r\n \"PercentWhiteAndBlackCaribbean\",\r\n \"PercentWhiteAndBlackAfrican\",\r\n \"PercentWhiteAndAsian\",\r\n \"PercentAnyOtherMixedBackground\",\r\n \"PercentIndian\", //busted\r\n \"PercentPakistani\",\r\n \"PercentBangladeshi\",\r\n \"PercentAnyOtherAsianBackground\",\r\n \"PercentCaribbean\",\r\n \"PercentAfrican\",\r\n \"PercentAnyOtherBlackBackground\",\r\n \"PercentChinese\",\r\n \"PercentAnyOther\",\r\n];\r\n\r\nconst SchoolsControl = ({ visible, schoolsState, demographicsState }) => {\r\n\r\n const classes = useStyles();\r\n const [schoolsFilter, setSchoolsFilter] = schoolsState;\r\n const [demographicsFilter, setDemographicsFilter] = demographicsState;\r\n if (!visible) {\r\n return (<>);\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n Overlay\r\n \r\n setSchoolsFilter(e.target.value)}\r\n >\r\n {schoolLayers.map(a => ())}\r\n \r\n \r\n \r\n {schoolsFilter == \"Demographics\" ? (\r\n \r\n\r\n \r\n \r\n Demographic\r\n \r\n setDemographicsFilter(e.target.value)}\r\n >\r\n {demographics.map(a => ())}\r\n \r\n \r\n \r\n )\r\n : (<>)}\r\n\r\n \r\n )\r\n}\r\n\r\n\r\nexport default memo(SchoolsControl);","import React, { memo } from 'react';\r\nimport useWindowDimensions from \"../hooks/useWindowDimensions.jsx\";\r\nimport { useTheme } from '@material-ui/core/styles';\r\n\r\nconst MobileSelector = ({ mobileComponent, desktopComponent }) => {\r\n\r\n const { width } = useWindowDimensions();\r\n const theme = useTheme();\r\n console.log(\"theme.breakpoints.values.sm\", theme.breakpoints.values.sm);\r\n console.log(\"width\", width);\r\n if (width < theme.breakpoints.values.sm) {\r\n return mobileComponent;\r\n }\r\n else {\r\n return desktopComponent;\r\n }\r\n}\r\n\r\nexport default memo(MobileSelector);","import React, { useRef, useEffect, memo } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Drawer } from '@material-ui/core';\r\nimport SwipeableDrawer from '@mui/material/SwipeableDrawer'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n\r\n drawerPaper: {\r\n width: \"50vw\",\r\n maxWidth: \"1200px\",\r\n top: \"48px\",\r\n height: \"100%\",\r\n pointerEvents: \"auto\",\r\n overflow: \"visible\"\r\n },\r\n visRight: {\r\n flexShrink: 0,\r\n height: \"100%\",\r\n display: \"block\",\r\n }\r\n}));\r\n\r\nconst RightDrawer = ({ open, setOpen, children, setSideViewWidth }) => {\r\n\r\n const classes = useStyles();\r\n const ref = useRef();\r\n\r\n\r\n useEffect(() => {\r\n const observer = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n setSideViewWidth(entry.contentRect.width);\r\n }\r\n });\r\n\r\n if (ref.current) {\r\n observer.observe(ref.current);\r\n }\r\n\r\n return () => {\r\n observer.disconnect();\r\n };\r\n }, []);\r\n\r\n return (<>\r\n setOpen(false)}\r\n classes={{\r\n paper: classes.drawerPaper\r\n }}\r\n >\r\n
\r\n {children}\r\n
\r\n \r\n \r\n );\r\n}\r\n\r\nexport default memo(RightDrawer);","import React, { memo } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport SwipeableDrawer from '@mui/material/SwipeableDrawer'\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n\r\n drawerPaper: {\r\n width: \"100%\",\r\n top: \"36px\",\r\n height: \"100%\",\r\n pointerEvents: \"auto\",\r\n overflow: \"visible\"\r\n },\r\n visBottom: {\r\n flexShrink: 0,\r\n height: \"100%\",\r\n display: \"block\"\r\n }\r\n}));\r\n\r\nconst BottomSwipeableDrawer = ({ open, setOpen, children }) => {\r\n\r\n const classes = useStyles();\r\n const drawerBleeding = 56;\r\n\r\n return (\r\n\r\n { }}\r\n onClose={() => setOpen(false)}\r\n swipeAreaWidth={drawerBleeding}\r\n classes={{\r\n paper: classes.drawerPaper\r\n }}\r\n PaperProps={{\r\n sx: {\r\n height: 'calc(100% -64px)', // Adjust as needed\r\n top: 64, // Offset for app bar\r\n },\r\n }}\r\n >\r\n\r\n
\r\n {children}\r\n
\r\n \r\n\r\n );\r\n}\r\n\r\nexport default memo(BottomSwipeableDrawer);","import { useRef, memo, useEffect } from 'react'\r\nimport { BottomSheet } from 'react-spring-bottom-sheet'\r\n\r\n// if setting up the CSS is tricky, you can add this to your page somewhere:\r\n// \r\n//import 'react-spring-bottom-sheet/dist/style.css'\r\nimport '../../bottomSheet.css'\r\n\r\n\r\n\r\nconst BottomSheetMobile = ({ open, setOpen, header, content, triggerHalfOpen }) => {\r\n const sheetRef = useRef();\r\n useEffect(() => {\r\n console.log(\"called triggerhalfopen\");\r\n if (triggerHalfOpen && sheetRef.current) {\r\n sheetRef.current.snapTo(({ maxHeight }) => 0.25 * maxHeight);\r\n }\r\n }, [triggerHalfOpen])\r\n\r\n return (\r\n <>\r\n setOpen(false)}\r\n snapPoints={({ maxHeight }) => [\r\n maxHeight - maxHeight / 10,\r\n maxHeight * 0.25,\r\n ]}\r\n header={header}\r\n defaultSnap={({ lastSnap, snapPoints }) =>\r\n Math.max(...snapPoints)}\r\n >\r\n {content}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default memo(BottomSheetMobile);\r\n\r\n\r\n\r\n///const [value, setValue] = React.useState(0);","import React, { useState } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Accordion from '@mui/material/Accordion';\r\nimport AccordionActions from '@mui/material/AccordionActions';\r\nimport AccordionSummary from '@mui/material/AccordionSummary';\r\nimport AccordionDetails from '@mui/material/AccordionDetails';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\r\nimport Collapse from '@mui/material/Collapse';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n heading: {\r\n fontSize: theme.typography.pxToRem(15),\r\n fontWeight: theme.typography.fontWeightRegular,\r\n },\r\n}));\r\n\r\nconst MiAccordion = ({ contentArray, startExpanded }) => {\r\n const classes = useStyles();\r\n\r\n const [expanded, setExpanded] = React.useState(startExpanded);\r\n\r\n const handleChange = (panel) => (event, isExpanded) => {\r\n console.log(\"ack\");\r\n setExpanded(isExpanded ? panel : false);\r\n };\r\n\r\n //return (\r\n //
console.log(\"boop?\")} >\r\n // {contentArray.map((a) => (\r\n //
\r\n // handleToggle(a.id)}\r\n // style={{ cursor: 'pointer' }}\r\n // >\r\n // {a.heading}\r\n // \r\n // \r\n // \r\n //
{a.content}
\r\n //
\r\n //
\r\n // ))}\r\n //
\r\n //);\r\n\r\n return (\r\n
console.log(\"boop beep?\")}>\r\n {contentArray.map((a, i) => {\r\n return (\r\n \r\n }\r\n aria-controls=\"panel1a-content\"\r\n id=\"panel1a-header\"\r\n >\r\n {a.heading.length > 0 ? ({a.heading}) : null } \r\n \r\n \r\n {a.content}\r\n \r\n \r\n );\r\n })}\r\n
\r\n );\r\n}\r\n\r\nexport default MiAccordion;","import React, { useRef, useState, useEffect } from \"react\";\r\n// Import Swiper React components\r\nimport { Swiper, SwiperSlide } from \"swiper/react\";\r\nimport ResponsiveImage from \"../ResponsiveImage.jsx\";\r\n// Import Swiper styles\r\n//import \"swiper/css\";\r\n//import \"swiper/css/free-mode\";\r\n//import \"swiper/css/navigation\";\r\n//import \"swiper/css/thumbs\";\r\nimport useWindowDimensions from \"../hooks/useWindowDimensions.jsx\";\r\nimport 'swiper/swiper.min.css';\r\nimport \"./swiperthumb.css\";\r\n\r\n\r\n\r\n// import required modules\r\nimport { FreeMode, Navigation, Thumbs, Pagination } from \"swiper\";\r\n\r\n\r\n\r\nconst SwiperThumb = ({ data }) => {\r\n const [thumbsSwiper, setThumbsSwiper] = useState(null);\r\n const { height, width } = useWindowDimensions();\r\n const [images, setImages] = useState([]);\r\n\r\n const pushToSecond = ([x, ...y], [...z]) => [x, ...z, ...y];\r\n\r\n useEffect(() => {\r\n let arr = pushToSecond(data.Images.map(a => [a, false]), data.FloorplanImages.map(a => [a, true]));\r\n setImages(arr);\r\n }, [data]);\r\n\r\n const clickImage = (e) => {\r\n let targ = e.target.currentSrc.replace(/(-768)|(-590)|(-320)/, \"-1024\");\r\n window.open(targ, '_blank')\r\n }\r\n\r\n return (\r\n <>\r\n \r\n {images.map((a, i) => {\r\n return (\r\n \r\n
clickImage(e) } >\r\n
\r\n
\r\n \r\n {/**/}\r\n
\r\n \r\n )\r\n })}\r\n \r\n 1600 ? 8 : (width > 900 ? 6 : 4)}\r\n freeMode={true}\r\n lazy={{ enabled: true }}\r\n watchSlidesProgress={true}\r\n modules={[FreeMode, Navigation, Thumbs]}\r\n className=\"mySwiperX\"\r\n >\r\n {images.map((a, i) => {\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n {/*// 4/3 ratio inverse for margin = 75% */}\r\n {/*// (100/2)/8 = 100/16 = 6*/}\r\n {/**/}\r\n
\r\n \r\n )\r\n })}\r\n \r\n \r\n );\r\n}\r\n\r\nexport default SwiperThumb;","import { Container } from 'reactstrap';\r\nimport React, { useState, memo, useRef, Component, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ReactDOM from 'react-dom';\r\n//import \"react-responsive-carousel/lib/styles/carousel.min.css\"; // requires a loader\r\n//import { Carousel } from 'react-responsive-carousel';\r\nimport SwiperThumb from \"../swiperThumbs/swiperthumb\";\r\n\r\n\r\nconst ProductHeader = ({ data }) => {\r\n\r\n const [smallestHeight, setSmallestHeight] = useState(800);\r\n\r\n const onImgLoad = (x) => {\r\n if (x.target.clientHeight >= 200 && x.target.clientHeight < smallestHeight) {\r\n setSmallestHeight(x.target.clientHeight);\r\n }\r\n };\r\n\r\n return (\r\n \r\n \r\n £{Number(data.Price).toLocaleString()}\r\n \r\n \r\n {data.Title}\r\n \r\n\r\n {/**/}\r\n {/* {data.Images.map((a, i) => {*/}\r\n {/* return (*/}\r\n {/*
*/}\r\n {/* */}\r\n {/*
*/}\r\n {/* )*/}\r\n {/* })}*/}\r\n {/*
*/}\r\n\r\n \r\n
\r\n );\r\n}\r\n\r\n\r\nexport default memo(ProductHeader);","import React, { useState, memo, useRef, Component, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport \"react-responsive-carousel/lib/styles/carousel.min.css\"; // requires a loader\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TableRow from '@material-ui/core/TableRow';\r\n\r\nconst DescriptionAndKey = ({ data }) => {\r\n\r\n const [rows, setRows] = useState([]);\r\n\r\n function createData(name, value) {\r\n return { name, value };\r\n }\r\n\r\n useEffect(() => {\r\n\r\n if (data != null) {\r\n\r\n let rowsData = [\r\n createData('Flood risk', data.FloodRisk == \"No Risk/Data\" ? \"No known risk\" : data.FloodRisk),\r\n createData('Risk of subsidence by 2030', data.SubsidenceRisk2030),\r\n createData('Risk of subsidence by 2070', data.SubsidenceRisk2070),\r\n createData('Total rooms', data.RoomsCnt),\r\n ];\r\n\r\n const deprivationEngland = 32844;\r\n if (data.IndexMultipleDeprivation && data.IndexMultipleDeprivation > 0) {\r\n let depPercentile = 100 * data.IndexMultipleDeprivation / deprivationEngland;\r\n let depPercRound = 100 - Math.round(depPercentile); //.toFixed(1);\r\n if (depPercRound >= 95) {\r\n rowsData.push(createData(\"Deprivation\", `Very deprived (${depPercRound} percentile)`));\r\n } else if (depPercRound >= 80) {\r\n rowsData.push(createData(\"Deprivation\", `Deprived (${depPercRound} percentile)`));\r\n } else if (depPercRound >= 60) {\r\n rowsData.push(createData(\"Deprivation\", `Slightly deprived (${depPercRound} percentile)`));\r\n } else if (depPercRound >= 40) {\r\n rowsData.push(createData(\"Deprivation\", `Average (${depPercRound} percentile)`));\r\n } else if (depPercRound >= 20) {\r\n rowsData.push(createData(\"Deprivation\", `Below average deprivation (${depPercRound} percentile)`));\r\n } else if (depPercRound >= 5) {\r\n rowsData.push(createData(\"Deprivation\", `Significantly below average deprivation (${depPercRound} percentile)`));\r\n } else {\r\n rowsData.push(createData(\"Deprivation\", `Least deprived (${depPercRound} percentile)`));\r\n }\r\n\r\n\r\n }\r\n \r\n let allowedTenures = [\"unknown\", \"owner-occupied\"];\r\n //if (data.locationAccurate &&\r\n // (data.tenure == \"FREEHOLD\" ||\r\n // (data.epcData != null && allowedTenures.includes(data.epcData.tenure))\r\n // )\r\n //) {\r\n\r\n setRows(rowsData);\r\n }\r\n }, [data]);\r\n\r\n return (\r\n \r\n \r\n \r\n {/**/}\r\n {/* */}\r\n {/* Feature*/}\r\n {/* Value*/}\r\n {/* */}\r\n {/**/}\r\n \r\n {rows.map((row) => (\r\n \r\n {row.name}\r\n {row.value}\r\n \r\n ))}\r\n \r\n
\r\n
\r\n\r\n\r\n
\r\n );\r\n}\r\n\r\n\r\nexport default memo(DescriptionAndKey);","import React, { useState, memo, useEffect } from 'react';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\nimport Typography from '@mui/material/Typography';\r\nimport Box from '@material-ui/core/Box';\r\nimport Stack from '@mui/material/Stack';\r\n//import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\r\n//import { ReactComponent as Icon } from './icon.svg';\r\nimport { useTheme } from '@material-ui/core/styles';\r\n\r\nconst KeyValue = ({ keyx, value, Icon, adjustCase }) => {\r\n const theme = useTheme();\r\n const [val, setVal] = useState(value);\r\n\r\n useEffect(() => {\r\n if (adjustCase && (typeof value == \"string\") && value.length > 1) {\r\n setVal(value.charAt(0).toUpperCase() + value.substring(1).toLowerCase());\r\n }\r\n }, [adjustCase, value]);\r\n console.log(\"Icon\", Icon);\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n {val}\r\n \r\n \r\n \r\n {keyx}\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default KeyValue;","\r\nconst IfThen = ({ children, condition }) => {\r\n console.log(\"condition\", condition);\r\n return (\r\n <>\r\n {condition && children}\r\n \r\n );\r\n}\r\n\r\n\r\nexport default IfThen;","import IfThen from './IfThen';\r\n\r\nconst IfNullOrEmpty = ({ children, value }) => {\r\n return (\r\n 0 && value != \"null\"} >\r\n {children}\r\n \r\n );\r\n}\r\n\r\n\r\nexport default IfNullOrEmpty;","import React, { useState, memo, useRef, Component, useEffect } from 'react';\r\nimport { Paper, Grid } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport \"react-responsive-carousel/lib/styles/carousel.min.css\"; // requires a loader\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TableRow from '@material-ui/core/TableRow';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport KeyValue from '../reusable/KeyValue';\r\nimport IfNullOrEmpty from '../reusable/IfNullOrEmpty';\r\nimport Icon from '@mdi/react';\r\n\r\nimport BedOutlinedIcon from '@mui/icons-material/BedOutlined';\r\nimport SquareFootOutlinedIcon from '@mui/icons-material/SquareFootOutlined';\r\nimport BathtubOutlinedIcon from '@mui/icons-material/BathtubOutlined';\r\nimport KeyOutlinedIcon from '@mui/icons-material/KeyOutlined';\r\nimport HomeWorkOutlinedIcon from '@mui/icons-material/HomeWorkOutlined';\r\nimport FenceOutlinedIcon from '@mui/icons-material/FenceOutlined';\r\nimport LocationCityOutlinedIcon from '@mui/icons-material/LocationCityOutlined'; \r\nimport ConstructionOutlinedIcon from '@mui/icons-material/ConstructionOutlined';\r\nimport EnergySavingsLeafOutlinedIcon from '@mui/icons-material/EnergySavingsLeafOutlined';\r\nimport NetworkCheckOutlinedIcon from '@mui/icons-material/NetworkCheckOutlined';\r\nimport GavelOutlinedIcon from '@mui/icons-material/GavelOutlined';\r\nimport NewspaperOutlinedIcon from '@mui/icons-material/NewspaperOutlined';\r\nimport ParkOutlinedIcon from '@mui/icons-material/ParkOutlined';\r\nimport AccountBalanceOutlinedIcon from '@mui/icons-material/AccountBalanceOutlined';\r\nimport CurrencyPoundOutlinedIcon from '@mui/icons-material/CurrencyPoundOutlined';\r\nimport ElderlyIcon from '@mui/icons-material/Elderly';\r\nimport { mdiBed, mdiBedOutline, mdiShower, mdiArrowExpandAll, mdiCurrencyGbp } from '@mdi/js';\r\nimport BalanceIcon from '@mui/icons-material/Balance';\r\nimport PieChartIcon from '@mui/icons-material/PieChart';\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n paper: {\r\n padding: theme.spacing(2),\r\n textAlign: 'center',\r\n color: theme.palette.text.secondary,\r\n },\r\n}));\r\n\r\nconst HeroData = ({ data }) => {\r\n\r\n const [propType, setPropType] = useState(null);\r\n const [urbanClass, setUrbanClass] = useState(null);\r\n const [broadband, setbroadband] = useState(null);\r\n const [rows, setRows] = useState([]);\r\n const classes = useStyles();\r\n\r\n function createData(name, value) {\r\n return { name, value };\r\n }\r\n\r\n const cleanPropType = (prop) => {\r\n if (prop.toLowerCase() == \"semi-detached\") {\r\n return \"Semi\";\r\n }\r\n if (prop.toLowerCase() == \"end of terrace\") {\r\n return \"End Terrace\";\r\n }\r\n\r\n return prop;\r\n }\r\n\r\n const cleanEpc = (data) => {\r\n if (data.EpcData != null && data.EpcData.CurrentEnergyRating) {\r\n return data.EpcData.CurrentEnergyRating\r\n }\r\n return null;\r\n }\r\n\r\n const cleanLand = (data) => {\r\n if (data.Tenure != \"RENTAL\" && data.Tenure != \"LEASEHOLD\"\r\n && data.PropType.toLowerCase().includes(\"flat\") == false\r\n && data.PropType.toLowerCase().includes(\"apartment\") == false) {\r\n if (data.LocationAccurate) {\r\n return data.PlotAcres;\r\n }\r\n else {\r\n return `${data.PlotAcres}*`\r\n }\r\n }\r\n }\r\n\r\n const cleanOwnership = (data) => {\r\n return data.OwnershipType.toLowerCase().includes(\"non-shared\") ? \"No\" : \"Yes\";\r\n }\r\n\r\n useEffect(() => {\r\n\r\n if (data != null) {\r\n\r\n if (data.Broadbandcoverage != null && data.Broadbandcoverage.maxPredictedDown != null) {\r\n setbroadband(data.Broadbandcoverage.maxPredictedDown);\r\n }\r\n\r\n if (data.PropType != undefined && data.PropType != null && data.PropType != 0 && String(data.PropType).trim().length > 0 && data.PropType != \"null\") {\r\n setPropType(cleanPropType(data.PropType));\r\n }\r\n else if (data.EpcData != undefined && data.EpcData != null) {\r\n setPropType(cleanPropType(data.EpcData.BuiltForm));\r\n }\r\n\r\n if (data.RuralUrbanClassification) {\r\n let str = data.IsSparse ? \"Sparse \" : \"\";\r\n \r\n switch (data.RuralUrbanClassification) {\r\n case 1:\r\n setUrbanClass(str + \"Big City\");\r\n break;\r\n case 2:\r\n setUrbanClass(str + \"Small City\");\r\n break;\r\n case 3:\r\n setUrbanClass(str + \"Town\");\r\n break;\r\n case 4:\r\n setUrbanClass(str + \"Suburb\");\r\n break;\r\n case 5:\r\n setUrbanClass(str + \"Village\");\r\n break;\r\n case 6:\r\n setUrbanClass(str + \"Countryside\");\r\n break;\r\n default:\r\n setUrbanClass(\"\");\r\n }\r\n }\r\n //RuralUrbanClassification | IsSparse\r\n\r\n\r\n ///////////////////////\r\n\r\n let rowsData = [\r\n createData('Bedrooms', data.Bedrooms),\r\n createData('Bathrooms', data.Bathrooms),\r\n createData('Square feet', `${data.SqFtParsed} sqft`),\r\n createData('Price per sqft', `£${data.PricePerSqFoot}`),\r\n\r\n\r\n createData('Tenure', data.Tenure),\r\n //data.PropType ?? EpcData.BuiltForm\r\n\r\n //data.CurrentEnergyRating\r\n createData('Max broadband speed', `${Math.round(data.MaxBroadbandSpeed / 1000)}MB/S`),\r\n //PlotAcres\r\n //RuralUrbanClassification | IsSparse\r\n //optional gubbins.\r\n // Notable. \"IsPublicNotice\": false, \"IsAuction\": false, \"IsNewBuild\": false, \"IsExLocalAuthority\": false, \"IsNationalPark\": false,\r\n createData('Ownership', data.OwnershipType),\r\n //createData('Is retirement property', data.Retirement ? \"Yes\" : \"No\"),\r\n ];\r\n\r\n const deprivationEngland = 32844;\r\n if (data.IndexMultipleDeprivation && data.IndexMultipleDeprivation > 0) {\r\n let depPercentile = 100 * data.IndexMultipleDeprivation / deprivationEngland;\r\n let depPercRound = 100 - Math.round(depPercentile); //.toFixed(1);\r\n if (depPercRound >= 95) {\r\n rowsData.push(createData(\"Deprivation\", `Very deprived (${depPercRound} percentile)`));\r\n } else if (depPercRound >= 80) {\r\n rowsData.push(createData(\"Deprivation\", `Deprived (${depPercRound} percentile)`));\r\n } else if (depPercRound >= 60) {\r\n rowsData.push(createData(\"Deprivation\", `Slightly deprived (${depPercRound} percentile)`));\r\n } else if (depPercRound >= 40) {\r\n rowsData.push(createData(\"Deprivation\", `Average (${depPercRound} percentile)`));\r\n } else if (depPercRound >= 20) {\r\n rowsData.push(createData(\"Deprivation\", `Below average deprivation (${depPercRound} percentile)`));\r\n } else if (depPercRound >= 5) {\r\n rowsData.push(createData(\"Deprivation\", `Significantly below average deprivation (${depPercRound} percentile)`));\r\n } else {\r\n rowsData.push(createData(\"Deprivation\", `Least deprived (${depPercRound} percentile)`));\r\n }\r\n\r\n\r\n }\r\n\r\n let allowedTenures = [\"unknown\", \"owner-occupied\"];\r\n //if (data.locationAccurate &&\r\n // (data.tenure == \"FREEHOLD\" ||\r\n // (data.epcData != null && allowedTenures.includes(data.epcData.tenure))\r\n // )\r\n //) {\r\n }\r\n }, [data]);\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n
\r\n );\r\n}\r\n\r\n\r\nexport default memo(HeroData);","import { Container } from 'reactstrap';\r\nimport MiAccordion from '../MiAccordion';\r\nimport React, { useState, memo, useRef, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport ProductView from './ProductView';\r\nimport ProductHeader from './ProductHeader';\r\nimport DescriptionAndKey from './DescriptionAndKey';\r\nimport HeroData from './HeroData';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\n\r\nconst ProductSummary = ({ data }) => {\r\n\r\n const [accordionContent, setAccordionContent] = useState([]);\r\n const theme = useTheme();\r\n useEffect(() => {\r\n\r\n let aContent = [\r\n { heading: \"Overview\", content: (), id:\"ProductSummaryoverview\" },\r\n { heading: \"Risks and Other\", content: (), id: \"ProductSummaryrisks\" },\r\n { heading: \"Description\", content: (), id: \"ProductSummarydesc\" },\r\n { heading: \"Enviromental\", content: (
), id: \"ProductSummaryenv\" },\r\n /*{ heading: \"Info\", content: ({data.bedrooms}) },*/\r\n \r\n ];\r\n\r\n setAccordionContent(aContent)\r\n\r\n }, [data]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(ProductSummary);","import React, { useState, memo, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport BasicTable from '../BasicTable';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport Switch from '@material-ui/core/Switch';\r\n\r\nconst distStr = (num) => {\r\n if (num >= 1000) {\r\n let rnd = Math.round(num / 100) / 10;\r\n return `${rnd} km`\r\n }\r\n else {\r\n return `${num} m`\r\n }\r\n}\r\n\r\n\r\nconst schoolSizeMax = (str) => {\r\n let re = new RegExp('.+\\\\s(?\\\\d+.+)');\r\n if (str != null) {\r\n let match = re.exec(str);\r\n console.log(match);\r\n if (match != null && match.groups != null && match.groups.size != null && match.groups.size.length > 0) {\r\n return match.groups.size;\r\n }\r\n }\r\n return str;\r\n}\r\n\r\nconst SchoolDetail = ({ data }) => {\r\n\r\n const [hideCatchment, setHideCatchment] = React.useState(true);\r\n const [hideIndependent, setHideIndependent] = React.useState(true);\r\n const [hideReligious, setHideReligious] = React.useState(true);\r\n\r\n const [schoolDataP, setSchoolDataP] = useState(null);\r\n const [headerDataP, setHeaderDataP] = useState(null);\r\n\r\n const [schoolDataS, setSchoolDataS] = useState(null);\r\n const [headerDataS, setHeaderDataS] = useState(null);\r\n\r\n\r\n\r\n useEffect(() => {\r\n if (data != null && data.Schools != null && data.Schools.length > 0) {\r\n //no default sorting for. Apply default sorting later, and add a more functional table with sort and filter functionality.\r\n let headersP = [\"Name\", \"Distance\", \"Offsted\", \"Size\", \"Avg Class Size\", \"KS2 Expected Standard\", \"KS2 Higher Standard\"]\r\n let headersS = [\"Name\", \"Distance\", \"Offsted\", \"Size\", \"Avg Class Size\", \"KS4 Progres8\", \"KS4 Attainment8\", \"KS5 Average Grade\"]\r\n setHeaderDataP(headersP);\r\n setHeaderDataS(headersS);\r\n\r\n let schoolsP = [];\r\n let schoolsS = [];\r\n data.Schools.forEach(a => {\r\n if (!hideCatchment ||\r\n (a.DistanceInMetres <= a.CatchmentMetresMed\r\n || a.OfstedRatingString == \"Independent\" //include independent schools\r\n || (a.Denomination != null && a.Denomination != \"No religious character\") //include religious schools\r\n )) {\r\n\r\n if (!hideIndependent || a.OfstedRatingString != \"Independent\") {\r\n\r\n if (!hideReligious || a.Denomination == null || a.Denomination == \"No religious character\") {\r\n if (a.SchoolTypeSimple == \"Primary\" || a.SchoolTypeSimple == \"All-Through\") {\r\n schoolsP.push([a.SchoolName, distStr(a.DistanceInMetres), a.OfstedRatingString, schoolSizeMax(a.SchoolSize),\r\n a.ClassSizeAvgPrimary,\r\n a.KS2PercentExpectedStandard == null ? \"\" : `${a.KS2PercentExpectedStandard}%`,\r\n a.KS2PercentHigherStandard == null ? \"\" : `${a.KS2PercentHigherStandard}%`]);\r\n }\r\n\r\n if (a.SchoolTypeSimple == \"Secondary\" || a.SchoolTypeSimple == \"All-Through\") {\r\n schoolsS.push([a.SchoolName, distStr(a.DistanceInMetres), a.OfstedRatingString, schoolSizeMax(a.SchoolSize),\r\n a.classSizeAvgSecondary, a.KS4Progress8, a.KS4Attainment8, a.KS5Best3AverageGrade]);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n setSchoolDataS(schoolsS);\r\n setSchoolDataP(schoolsP);\r\n\r\n }\r\n }, [data, hideCatchment, hideIndependent, hideReligious]);\r\n\r\n return (\r\n \r\n setHideCatchment(a => !a)} />}\r\n label=\"Hide schools outside catchment area.\"\r\n />\r\n setHideIndependent(a => !a)} />}\r\n label=\"Hide Independent schools.\"\r\n />\r\n setHideReligious(a => !a)} />}\r\n label=\"Hide religious schools.\"\r\n />\r\n Primary Schools\r\n \r\n
\r\n Secondary Schools\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\n\r\nexport default memo(SchoolDetail);","import React, { memo, useEffect, useState } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Box from '@material-ui/core/Box';\r\nimport Collapse from '@material-ui/core/Collapse';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TableRow from '@material-ui/core/TableRow';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';\r\nimport KeyboardArrowUpIcon from '@material-ui/icons/KeyboardArrowUp';\r\n\r\nconst useRowStyles = makeStyles({\r\n root: {\r\n '& > *': {\r\n borderBottom: 'unset',\r\n },\r\n },\r\n});\r\n\r\nconst NestedRow = ({ row, i, subRows, subHeaderData }) => {\r\n const [open, setOpen] = useState(false);\r\n const classes = useRowStyles();\r\n\r\n return(\r\n <>\r\n \r\n \r\n setOpen(!open)}>\r\n {open ? : }\r\n \r\n \r\n {row.map((col) => (\r\n {col}\r\n ))}\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {subHeaderData}\r\n \r\n {subRows[i].map((subRow, si) => (\r\n \r\n {\r\n subRow.map((subcol) => (\r\n {subcol}\r\n ))\r\n }\r\n \r\n )\r\n )}\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\n\r\nconst NestedTable = ({ header, data, subHeader, subData }) => {\r\n const [rows, setRows] = useState([]);\r\n const [subRows, setSubRows] = useState([]);\r\n const [headerData, setHeaderData] = useState(null);\r\n const [subHeaderData, setSubHeaderData] = useState(null);\r\n\r\n useEffect(() => {\r\n if (data != null) {\r\n setRows(data);\r\n }\r\n }, [data]);\r\n\r\n useEffect(() => {\r\n if (header != null && header.length > 0) {\r\n let tHeader = (\r\n \r\n \r\n \r\n {header.map(a =>\r\n ({a})\r\n )}\r\n \r\n \r\n );\r\n setHeaderData(tHeader);\r\n }\r\n }, [header]);\r\n\r\n useEffect(() => {\r\n if (subData != null) {\r\n setSubRows(subData);\r\n }\r\n }, [subData]);\r\n\r\n useEffect(() => {\r\n if (subHeader != null && subHeader.length > 0) {\r\n let tHeader = (\r\n \r\n \r\n {subHeader.map(a =>\r\n ({a})\r\n )}\r\n \r\n \r\n );\r\n setSubHeaderData(tHeader);\r\n }\r\n }, [subHeader]);\r\n\r\n\r\n\r\n return (\r\n \r\n \r\n \r\n {headerData}\r\n \r\n {rows.map((row, i) => (\r\n \r\n ))}\r\n \r\n
\r\n
\r\n\r\n\r\n
\r\n );\r\n}\r\n\r\nexport default memo(NestedTable);\r\n\r\n","import React, { useState, memo, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport BasicTable from '../BasicTable';\r\nimport NestedTable from '../NestedTable';\r\n\r\nconst distStr = (num) => {\r\n if (num >= 1000) {\r\n let rnd = Math.round(num / 100) / 10;\r\n return `${rnd} km`\r\n }\r\n else {\r\n return `${num} m`\r\n }\r\n}\r\n\r\nconst CrimeDetail = ({ data }) => {\r\n\r\n const [crimeState, setCrimeState] = useState(null);\r\n const [crimeSubState, setCrimeSubState] = useState(null);\r\n const seriousCrime = [\"Violence and sexual offences\", \"Robbery\", \"Possession of weapons\", \"Burglary\"];\r\n const [crimeCounts, setCrimeCounts] = useState(null);\r\n\r\n useEffect(() => {\r\n if (data) {\r\n let tCnts = [];\r\n Object.entries(data.CrimeCounts).forEach(e => tCnts.push(e));\r\n setCrimeCounts(tCnts);\r\n\r\n let tCrime = [];\r\n let tSubCrime = [];\r\n \r\n data.Crime.sort((a, b) => a.DistanceM - b.DistanceM).forEach(c => {\r\n let sCnt = 0;\r\n let tSubRow = [];\r\n\r\n c.Types.forEach(t => {\r\n if (seriousCrime.includes(t.Name)) {\r\n sCnt += t.TotalCount;\r\n }\r\n\r\n Object.entries(t.TimeBreakdown).forEach(([k, v]) => {\r\n let subRow = [k, t.Name, v];\r\n tSubRow.push(subRow);\r\n });\r\n\r\n\r\n });\r\n console.log(tSubRow);\r\n\r\n let row = [c.LocationDescription, distStr(c.DistanceM), c.TotalCount, sCnt];\r\n tCrime.push(row);\r\n tSubCrime.push(tSubRow);\r\n\r\n });\r\n setCrimeState(tCrime);\r\n setCrimeSubState(tSubCrime);\r\n }\r\n }, [data]);\r\n\r\n return (\r\n \r\n Area Totals\r\n \r\n
\r\n\r\n Crimes by location\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\n\r\nexport default memo(CrimeDetail);","import React, { useState, memo, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport BasicTable from '../BasicTable';\r\n\r\n\r\nconst distStr = (num) => {\r\n if (num >= 1000) {\r\n let rnd = Math.round(num / 100) / 10;\r\n return `${rnd} km`\r\n }\r\n else {\r\n return `${num} m`\r\n }\r\n}\r\n\r\n\r\nconst NearestHelper = (label, data, content) => {\r\n if (data != null && data.length > 0) {\r\n data.sort((a, b) => a.Distance - b.Distance).forEach(a => {\r\n let name = a.Tags.name || a.Tags.brand || \"unknown\";\r\n (content[label] = content[label] ? content[label] : []).push([\r\n name,\r\n a.Tags.denomination || a.Tags.religion ||\r\n a.Tags.amenity || a.Tags.shop || a.Tags.healthcare || a.Tags.tourism ||\r\n a.Tags.leisure || a.Tags.railway || a.Tags.highway || a.Tags.public_transport ||\r\n \"??\",\r\n distStr(a.Distance)\r\n ]);\r\n });\r\n }\r\n};\r\n\r\nconst AmenityDetail = ({ data }) => {\r\n\r\n //const [nearestAirport, setNearestAirport] = useState({});\r\n //const [nearestBarsAndRest, setNearestBarsAndRest] = useState({});\r\n //const [nearestBus, setNearestBus] = useState({});\r\n //const [nearestGroceries, setNearestGroceries] = useState({});\r\n //const [nearestGeneralShops, setNearestGeneralShops] = useState({});\r\n //const [nearestHotels, setNearestHotels] = useState({});\r\n //const [nearestLeisure, setNearestLeisure] = useState({});\r\n //const [nearestMedical, setNearestMedical] = useState({});\r\n //const [nearestReligious, setNearestReligious] = useState({});\r\n //const [nearestSupermarkets, setNearestSupermarkets] = useState({});\r\n //const [nearestTourism, setNearestTourism] = useState({});\r\n //const [nearestTrains, setNearestTrains] = useState({});\r\n const [places, setPlaces] = useState({});\r\n\r\n const header = [\"Name\", \"Info\", \"Distance\"];\r\n useEffect(() => {\r\n if (data != null && data.PlacesOfInterest != null) {\r\n\r\n let content = {};\r\n NearestHelper(\"Nearest Bars and Restaurants\", data.PlacesOfInterest.NearestBarsAndRest, content);\r\n NearestHelper(\"Nearest Supermarkets\", data.PlacesOfInterest.NearestSupermarkets, content);\r\n NearestHelper(\"Nearest Grocery Stores\", data.PlacesOfInterest.NearestGroceries, content);\r\n NearestHelper(\"Nearest General Shops\", data.PlacesOfInterest.NearestGeneralShops, content);\r\n NearestHelper(\"Nearest Trains\", data.PlacesOfInterest.NearestTrains, content);\r\n NearestHelper(\"Nearest Bus Stops\", data.PlacesOfInterest.NearestBus, content);\r\n NearestHelper(\"Nearest Religious Places\", data.PlacesOfInterest.NearestReligious, content);\r\n NearestHelper(\"Nearest Medical\", data.PlacesOfInterest.NearestMedical, content);\r\n NearestHelper(\"Nearest Leisure Facilities\", data.PlacesOfInterest.NearestLeisure, content);\r\n NearestHelper(\"Nearest Tourism Facilities\", data.PlacesOfInterest.NearestTourism, content);\r\n NearestHelper(\"Nearest Hotels\", data.PlacesOfInterest.NearestHotels, content);\r\n NearestHelper(\"Nearest Airports\", data.PlacesOfInterest.NearestAirport, content);\r\n\r\n //if (data.PlacesOfInterest.NearestAirport != null && data.PlacesOfInterest.NearestAirport.length > 0) {\r\n // let cat = \"Nearest Aiports\";\r\n // data.PlacesOfInterest.NearestAirport.sort((a, b) => a.Distance - b.Distance).forEach(a => {\r\n // (content[cat] = content[cat] ? content[cat] : []).push([\r\n // a.Tags.name ?? a.Tags.brand ?? \"unknown\",\r\n // a.Tags.amenity ?? a.Tags.shop ?? a.Tags.healthcare ?? a.Tags.tourism ?? a.Tags.leisure ?? a.Tags.railway ?? a.Tags.highway ?? a.Tags.public_transport ?? a.Tags.denomination ?? a.Tags.religion ??\r\n // distStr(a.distanceM)\r\n // ]);\r\n // });\r\n //}\r\n\r\n //data.places.sort((a, b) => a.distanceM - b.distanceM).forEach(a => {\r\n // console.log(a);\r\n // (content[a.topLevelCategory] = content[a.topLevelCategory] ? content[a.topLevelCategory] : []).push([\r\n // a.name,\r\n // a.category,\r\n // distStr(a.distanceM)\r\n // ]);\r\n //});\r\n\r\n setPlaces(() => content);\r\n }\r\n }, [data]);\r\n\r\n\r\n return (\r\n \r\n {places ? Object.keys(places).map(a => (\r\n <>\r\n {console.log(a)}\r\n {a}\r\n \r\n
\r\n )\r\n ) : (<>)}\r\n
\r\n );\r\n}\r\n\r\n\r\nexport default memo(AmenityDetail);","import React, { useState, memo, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nconst DemographicDetail = ({ data }) => {\r\n\r\n const [someState, setSomeState] = useState(null);\r\n\r\n useEffect(() => {\r\n\r\n }, [data]);\r\n\r\n return (\r\n \r\n content\r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(DemographicDetail);","import React, { useState, memo, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport BasicTable from '../BasicTable';\r\n\r\nconst AreaSummary = ({ data }) => {\r\n\r\n const [dataState, setDataState] = useState(null);\r\n\r\n useEffect(() => {\r\n if (data != null) {\r\n let dState = [];\r\n\r\n if (data.OaClassificationName != null && data.OaClassificationName.length > 0) {\r\n dState.push([\"Local area classification\", data.OaClassificationName]);\r\n }\r\n\r\n if (data.SoaClassificationName != null && data.SoaClassificationName.length > 0) {\r\n dState.push([\"Wider area classification\", data.SoaClassificationName]);\r\n }\r\n\r\n if (data.WorkplaceClassificationName != null && data.WorkplaceClassificationName.length > 0) {\r\n dState.push([\"Workplace classification\", data.WorkplaceClassificationName]);\r\n }\r\n if (data.LocalAuthorityClassificationName != null && data.LocalAuthorityClassificationName.length > 0) {\r\n dState.push([\"Local authority classification\", data.LocalAuthorityClassificationName]);\r\n }\r\n if (data.PercentQualifications4OrAbove != null && data.PercentQualifications4OrAbove > 0) {\r\n dState.push([\"Percent degree educated\", data.PercentQualifications4OrAbove]);\r\n }\r\n \r\n setDataState(dState);\r\n }\r\n }, [data]);\r\n\r\n return (\r\n \r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(AreaSummary);","import { Container } from 'reactstrap';\r\nimport MiAccordion from '../MiAccordion';\r\nimport React, { useState, memo, useRef, useEffect } from 'react';\r\nimport { Paper } from '@material-ui/core';\r\nimport ProductView from './ProductView';\r\nimport ProductHeader from './ProductHeader';\r\nimport DescriptionAndKey from './DescriptionAndKey';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport SchoolDetail from './SchoolDetail';\r\nimport CrimeDetail from './CrimeDetail';\r\nimport AmenityDetail from './AmenityDetail';\r\nimport DemographicDetail from './DemographicDetail';\r\nimport AreaSummary from './AreaSummary';\r\n\r\nconst Neighbourhood = ({ data }) => {\r\n\r\n const [accordionContent, setAccordionContent] = useState([]);\r\n\r\n useEffect(() => {\r\n\r\n let aContent = [\r\n { heading: \"Area Summary\", content: (), id:\"AreaSummary\" },\r\n { heading: \"Schools\", content: (), id: \"SchoolDetail\" },\r\n { heading: \"Crime\", content: (), id: \"CrimeDetail\" },\r\n { heading: \"Amenities\", content: (), id: \"AmenityDetail\" },\r\n { heading: \"Demographics\", content: (), id: \"DemographicDetail\" },\r\n \r\n ];\r\n\r\n setAccordionContent(aContent)\r\n\r\n }, [data]);\r\n\r\n return (\r\n <>\r\n \r\n \r\n //\r\n // Area Summary\r\n // \r\n //
\r\n // Schools\r\n // \r\n //
\r\n // Crime\r\n // \r\n //
\r\n // Amenities\r\n // \r\n //
\r\n // Demographics\r\n // \r\n //
\r\n //
\r\n );\r\n}\r\n\r\n\r\nexport default memo(Neighbourhood);","import Box from '@material-ui/core/Box';\r\nimport ProductSummary from './ProductSummary';\r\nimport Neighbourhood from './Neighbourhood';\r\nimport JSONPretty from 'react-json-pretty';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport { memo } from 'react';\r\nconst useStyles = makeStyles((theme) => ({\r\n\r\n tabPan: {\r\n \"overflowY\": \"auto\",\r\n [theme.breakpoints.up(\"sm\")]: {\r\n \"maxHeight\": 'calc(100vh - 96px)' //48+48\r\n },\r\n //[theme.breakpoints.down(\"sm\")]: {\r\n // \"maxHeight\": 'calc(100vh - 80px)' //32 + 48\r\n //},\r\n }\r\n}));\r\n\r\nconst TabPanels = ({ value, item }) => {\r\n const classes = useStyles();\r\n const TabPanel = ({ children, value, index, ...other }) => {\r\n return (\r\n
\r\n );\r\n }\r\n\r\n TabPanel.propTypes = {\r\n children: PropTypes.node,\r\n index: PropTypes.any.isRequired,\r\n value: PropTypes.any.isRequired,\r\n };\r\n\r\n const theme = useTheme();\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default memo(TabPanels);\r\n","import Tabs from '@material-ui/core/Tabs';\r\nimport Tab from '@material-ui/core/Tab';\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport ChevronRightIcon from \"@material-ui/icons/ChevronRight\";\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport { memo } from 'react';\r\nimport CancelIcon from '@material-ui/icons/Cancel';\r\nimport GpsFixedIcon from '@mui/icons-material/GpsFixed';\r\n\r\nconst PropertyTabBar = ({ setOpen, setValue, value, setTriggerHalfOpen }) => {\r\n const handleChange = (event, newValue) => {\r\n setValue(newValue);\r\n };\r\n\r\n const a11yProps = (index) => {\r\n return {\r\n id: `simple-tab-${index}`,\r\n 'aria-controls': `simple-tabpanel-${index}`,\r\n };\r\n }\r\n\r\n const zoomToLocation = () => {\r\n setTriggerHalfOpen(true);\r\n }\r\n\r\n return (\r\n \r\n
\r\n setOpen(a => !a)}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n
\r\n zoomToLocation()} style={{ \"align\": \"right\" }} color=\"secondary\">\r\n \r\n \r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default memo(PropertyTabBar);\r\n","import React, { useRef, useEffect, useState, useCallback, useMemo } from 'react';\r\nimport Box from '@material-ui/core/Box';\r\nimport MapBox from '../MapBox';\r\nimport QueryController from '../QueryController';\r\nimport ProductView from '../property/ProductView';\r\nimport useProductQuery from '../ProductQuery';\r\nimport SimpleBackdrop from '../SimpleBackdrop';\r\nimport SideView from './SideView';\r\nimport TopView from './TopView';\r\nimport BottomNav from './BottomNav';\r\nimport PropSwiper from '../PropSwiper';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport MapLayerDial from '../MapLayerDial';\r\nimport Button from '@material-ui/core/Button';\r\nimport TuneRoundedIcon from '@material-ui/icons/TuneRounded';\r\nimport MainFilter from '../filters/MainFilter';\r\nimport SchoolView from '../SchoolView';\r\n\r\nimport PriceHistoryControl from '../layercontrols/PriceHistoryControl';\r\nimport CrimeControl from '../layercontrols/CrimeControl';\r\nimport SchoolsControl from '../layercontrols/SchoolsControl';\r\n\r\nimport MobileSelector from './MobileSelector';\r\nimport RightDrawer from './RightDrawer';\r\nimport BottomSwipeableDrawer from './BottomSwipeableDrawer';\r\nimport BottomSheetMobile from './BottomSheetMobile';\r\nimport TabPanels from '../property/TabPanels';\r\nimport PropertyTabBar from '../property/PropertyTabBar';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n fab: {\r\n marginLeft: \"10px\",\r\n pointerEvents: \"auto\",\r\n },\r\n fabCont: {\r\n marginLeft: \"10px\",\r\n marginTop: \"10px\",\r\n flexDirection: \"row\",\r\n display: \"flex\",\r\n justifyContent: \"flex-start\",\r\n alignItems: \"baseline\",\r\n }\r\n}));\r\n\r\nconst MainView = ({ }) => {\r\n const [showFilters, setShowFilters] = useState(false);\r\n const [showHistoricPrices, setShowHistoricPrices] = useState(false);\r\n const [showCrime, setShowCrime] = useState(false);\r\n const [showSchools, setShowSchools] = useState(false);\r\n const [showProps, setShowProps] = useState(true);\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n const [lng, setLng] = useState(-2.0);\r\n const [lat, setLat] = useState(52.50);\r\n const [bounds, setBounds] = useState(null);\r\n const [zoom, setZoom] = useState(6.5);\r\n const [data, setData] = useState(null);\r\n const [filterTerms, setFilterTerms] = useState([]);\r\n const [propertyCardClicked, setPropertyCardClicked] = useState(null);\r\n const [propertyMarkerClicked, setPropertyMarkerClicked] = useState(null);\r\n const [propertyCardActive, setPropertyCardActive] = useState(null);\r\n const [productOpen, setProductOpen] = useState(false);\r\n const [productLoading, setProductLoading] = useState(false);\r\n const [product, setProduct] = useProductQuery();\r\n const [cnt, setCnt] = useState(0);\r\n const [poly, setPoly] = useState(null);\r\n const [productData, setProductData] = useState(null);\r\n const [crimes, setCrimes] = useState(null);\r\n const [schools, setSchools] = useState(null);\r\n const [toggleFly, setToggleFly] = useState(null);\r\n const [prevLocation, setPrevLocation] = useState(null);\r\n const [swiperOpen, setSwiperOpen] = useState(true);\r\n const sideNavRef = useRef();\r\n const bottomNavRef = useRef();\r\n const statePriceDiffMode = useState(false);\r\n const [yearHistPriceFilter, setYearHistPriceFilter] = useState([]);\r\n const [yearCrimeFilter, setYearCrimeFilter] = useState([]);\r\n const schoolsState = useState('KS2PercentExpectedStandard');\r\n const [schoolsFilter, setSchoolsFilter] = schoolsState;\r\n const demographicsState = useState(\"PercentWhiteBritish\");\r\n const [demographicsFilter, setDemographicsFilter] = demographicsState;\r\n const [sideViewWidth, setSideViewWidth] = useState(0);\r\n const [selectedSchool, setSelectedSchool] = useState(null);\r\n const [triggerHalfOpen, setTriggerHalfOpen] = useState(false);\r\n const [satView, setSatView] = useState(false);\r\n\r\n\r\n const [clusterPoints, setClusterPoints] = useState([]);\r\n const [activePropertyCoords, setActivePropertyCoords] = useState(null);\r\n const [isFullscreen, setIsFullscreen] = React.useState(false);\r\n const [tabState, setTabState] = useState(0);\r\n const prevLoc = useRef(null);\r\n\r\n // Watch for fullscreenchange\r\n useEffect(() => {\r\n if (document) {\r\n if (isFullscreen) {\r\n document.body.requestFullscreen();\r\n }\r\n else if (Boolean(document.fullscreenElement)) {\r\n document.exitFullscreen();\r\n }\r\n }\r\n }, [isFullscreen]);\r\n\r\n React.useEffect(() => {\r\n function onFullscreenChange() {\r\n setIsFullscreen(Boolean(document.fullscreenElement));\r\n }\r\n\r\n document.addEventListener('fullscreenchange', onFullscreenChange);\r\n\r\n return () => document.removeEventListener('fullscreenchange', onFullscreenChange);\r\n }, []);\r\n\r\n\r\n useEffect(() => {\r\n if (propertyCardClicked) {\r\n setProductLoading(true);\r\n setProduct(propertyCardClicked);\r\n prevLoc.current = { longitude: lng, latitude: lat, zoom: zoom };\r\n }\r\n }, [propertyCardClicked]);\r\n\r\n useEffect(() => {\r\n prevLoc.current = { longitude: lng, latitude: lat, zoom: zoom };\r\n }, [propertyMarkerClicked]);\r\n\r\n useEffect(() => {\r\n if (productOpen && propertyCardActive) {\r\n setProductLoading(true);\r\n setProduct(propertyCardActive);\r\n }\r\n }, [propertyCardActive]);\r\n\r\n useEffect(() => {\r\n if (product) {\r\n setSwiperOpen(false);\r\n setPoly(product.PolyJson);\r\n setSchools(product.Schools);\r\n setCrimes(product.Crime);\r\n setProductData({ lon: product.Location.Longitude, lat: product.Location.Latitude, id: product.Id });\r\n setProductOpen(true);\r\n setProductLoading(false);\r\n }\r\n }, [product]);\r\n\r\n useEffect(() => {\r\n if (selectedSchool) {\r\n setSwiperOpen(false);\r\n }\r\n else if (!productOpen) {\r\n setSwiperOpen(true);\r\n }\r\n }, [selectedSchool, productOpen]);\r\n\r\n useEffect(() => {\r\n if (!productOpen) {\r\n setSwiperOpen(true);\r\n setProductData(null);\r\n setPoly(null);\r\n setSchools(null);\r\n setCrimes(null);\r\n setPropertyCardClicked(false);\r\n let flyObj = {\r\n left: sideNavRef.current ? sideNavRef.current.offsetWidth : 0,\r\n right: 0,\r\n loc: prevLoc.current\r\n }\r\n setToggleFly(flyObj);\r\n }\r\n else if(product != null) {\r\n let flyObj = {\r\n left: sideNavRef.current ? sideNavRef.current.offsetWidth : 0,\r\n right: sideViewWidth,\r\n loc: { longitude: product.Location.Longitude, latitude: product.Location.Latitude }\r\n }\r\n console.log(flyObj);\r\n setToggleFly(flyObj);\r\n }\r\n }, [productOpen, sideNavRef, product]);\r\n\r\n useEffect(() => {\r\n if (productOpen && triggerHalfOpen) {\r\n let flyObj = {\r\n left: sideNavRef.current ? sideNavRef.current.offsetWidth : 0,\r\n right: sideViewWidth,\r\n loc: { longitude: product.Location.Longitude, latitude: product.Location.Latitude }\r\n }\r\n setTriggerHalfOpen(false);\r\n setToggleFly(flyObj);\r\n }\r\n }, [triggerHalfOpen, product, productOpen])\r\n\r\n return (\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n \r\n\r\n \r\n\r\n\r\n\r\n\r\n
\r\n\r\n
\r\n \r\n { }} >\r\n \r\n \r\n { }}>\r\n \r\n \r\n { }} >\r\n \r\n \r\n\r\n {/**/}\r\n {/* */}\r\n {/*}*/}\r\n \r\n }\r\n content={\r\n \r\n }\r\n /> }\r\n desktopComponent={\r\n \r\n \r\n }\r\n tabPanels={\r\n \r\n } />\r\n \r\n }\r\n />\r\n\r\n\r\n {/**/}\r\n {/* */}\r\n {/**/}\r\n setSelectedSchool(null)} setSideViewWidth={setSideViewWidth}>\r\n setSelectedSchool(null)} />\r\n \r\n \r\n \r\n {console.log(\"yearCrimeFilter\", yearCrimeFilter)}\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n
\r\n );\r\n\r\n}\r\n\r\nexport default MainView;","\r\nimport React, { useEffect } from 'react';\r\nimport { Route } from 'react-router';\r\nimport Layout from './components/Layout';\r\nimport About from './components/About';\r\nimport MainView from './components/layout/MainView';\r\nimport { ThemeProvider } from '@material-ui/core/styles'\r\nimport { theme } from './theme'\r\nimport './custom.css'\r\nimport { CssBaseline } from '@material-ui/core';\r\n\r\nimport { register } from 'swiper/element/swiper-element';\r\n\r\n\r\nregister(); //move register inside ? \r\n\r\n\r\n\r\nconst App = () => (\r\n \r\n \r\n \r\n \r\n {\r\n window.location.href = 'https://www.moveista.com/';\r\n return null;\r\n }} />\r\n \r\n \r\n)\r\n\r\nexport default App;","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register() {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const url = process.env.PUBLIC_URL as string;\r\n const publicUrl = new URL(url, window.location.toString());\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl: string) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing as ServiceWorker;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl: string) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (response.status === 404 || (contentType && contentType.indexOf('javascript') === -1)) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl);\r\n }\r\n })\r\n .catch(() => {\r\n console.log('No internet connection found. App is running in offline mode.');\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import 'bootstrap/dist/css/bootstrap.css';\r\n\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport { Provider } from 'react-redux';\r\nimport { ConnectedRouter } from 'connected-react-router';\r\nimport { createBrowserHistory } from 'history';\r\nimport configureStore from './store/configureStore';\r\nimport App from './App';\r\nimport registerServiceWorker from './registerServiceWorker';\r\n\r\n// Create browser history to use in the Redux store\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href') as string;\r\nconst history = createBrowserHistory({ basename: baseUrl });\r\n\r\n// Get the application-wide store instance, prepopulating with state from the server where available.\r\nconst store = configureStore(history);\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root'));\r\n\r\nregisterServiceWorker();\r\n","import { applyMiddleware, combineReducers, compose, createStore } from 'redux';\r\nimport thunk from 'redux-thunk';\r\nimport { connectRouter, routerMiddleware } from 'connected-react-router';\r\nimport { History } from 'history';\r\nimport { ApplicationState, reducers } from './';\r\n\r\nexport default function configureStore(history: History, initialState?: ApplicationState) {\r\n const middleware = [\r\n thunk,\r\n routerMiddleware(history)\r\n ];\r\n\r\n const rootReducer = combineReducers({\r\n ...reducers,\r\n router: connectRouter(history)\r\n });\r\n\r\n const enhancers = [];\r\n const windowIfDefined = typeof window === 'undefined' ? null : window as any; // eslint-disable-line @typescript-eslint/no-explicit-any\r\n if (windowIfDefined && windowIfDefined.__REDUX_DEVTOOLS_EXTENSION__) {\r\n enhancers.push(windowIfDefined.__REDUX_DEVTOOLS_EXTENSION__());\r\n }\r\n\r\n return createStore(\r\n rootReducer,\r\n initialState,\r\n compose(applyMiddleware(...middleware), ...enhancers)\r\n );\r\n}\r\n"],"sourceRoot":""}