{"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/About.jsx","components/BasicTable.jsx","theme.jsx","components/MapBox.jsx","components/FilterBar.jsx","components/FilterView.jsx","components/QueryController.js","components/FadeModal.jsx","components/MiAccordion.jsx","components/property/ProductHeader.jsx","components/property/DescriptionAndKey.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/ProductView.jsx","components/ProductQuery.jsx","components/SimpleBackdrop.jsx","components/SideNav.jsx","components/SideView.jsx","components/FilterBar2.jsx","components/FilterSimples.jsx","components/LeftFilter.jsx","components/MapLayerDial.jsx","components/reusable/histoslider/components.jsx","components/reusable/histoslider/BarChart.jsx","components/reusable/histoslider/HistoSlider.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/BarsSelect.jsx","components/reusable/BasicAutoSelect.jsx","components/filters/HotelsSelect.jsx","components/filters/RecreationSelect.jsx","components/filters/ShopsSelect.jsx","components/filters/MainFilter.jsx","components/MapView.jsx","App.tsx","registerServiceWorker.ts","index.tsx","store/configureStore.ts"],"names":["unloadedState","forecasts","isLoading","reducers","counter","state","incomingAction","undefined","count","type","weatherForecasts","action","startDateIndex","withStyles","theme","buttonCollapse","breakpoints","up","display","margin","boxShadow","props","useState","anchorEl","setAnchorEl","open","Boolean","className","classes","IconButton","onClick","e","currentTarget","style","color","Menu","id","anchorOrigin","vertical","horizontal","transformOrigin","onClose","children","root","position","right","buttonBar","down","paddingLeft","width","background","to","MenuItem","Button","useStyles","makeStyles","flexGrow","grow","menuButton","marginLeft","marginRight","navigation","toggleDrawer","appTitle","toolBar","minHeight","values","phone","NavMenu","WebkitTransform","AppBar","Toolbar","Typography","Layout","isFilterOpen","setIsFilterOpen","height","Container","memo","About","BasicTable","header","data","rows","setRows","headerData","setHeaderData","useEffect","length","tHeader","TableHead","TableRow","map","a","TableCell","Paper","TableContainer","component","Table","aria-label","size","TableBody","row","i","col","scope","createMuiTheme","xs","sm","md","lg","xl","palette","primary","main","grey","secondary","red","datavis","amber","overrides","mapboxgl","workerClass","MapboxWorker","accessToken","MapBox","lng","setLng","lat","setLat","zoom","setZoom","bounds","setBounds","setData","setClicked","poly","crimes","schools","toggleFly","mapStyle","mapContainer","useRef","setMap","styleChange","setStyleChange","sourceChange","setSourceChange","setStyle","emptySourceGeoJson","emptySource","getSource","geojson","pol","JSON","parse","String","Date","getTime","features","push","forEach","location","longitude","latitude","locationDescription","types","geojsonCatchments","center","radius","catchmentMetresMed","options","steps","units","properties","schoolId","circlePoly","circle","circleFeature","pointFeature","schoolType","ofstedRatingString","percentCapacity","schoolSize","schoolName","sex","denomination","structure","loc","flyTo","padding","left","speed","AddToLayer","mapLocal","addSource","AddSources","getLayer","addLayer","dark","AddLayers","setLayoutProperty","Map","container","current","on","getBounds","labelLayerId","layers","getStyle","layout","Add3d","loadImage","error","image","addImage","popup","Popup","closeButton","closeOnClick","getCanvas","cursor","coordinates","geometry","slice","description","price","sqFt","tblData","postCode","bathrooms","bedrooms","dom","ThemeProvider","Box","p","variant","placeholder","document","createElement","ReactDOM","render","Math","abs","lngLat","setLngLat","setDOMContent","addTo","crimetype","crimetypes","dataState","month","name","totalCount","tbl","setFeatureState","source","vis","offsted","capcity","f","remove","bbox","point","x","y","queryRenderedFeatures","querySourceFeatures","SetupMouseOver","getCenter","toFixed","getZoom","err","console","log","scrollZoom","setWheelZoomRate","setZoomRate","initMap","ref","justifyContent","flexWrap","listStyle","spacing","chip","QueryController","filterTerms","timer","setTimer","method","delayMs","clearTimeout","t","setTimeout","debounce","payload","LatN","_ne","LatS","_sw","LonE","LonW","FilterTerms","label","field","from","fetch","headers","redirect","body","stringify","then","resp","status","json","modal","alignItems","marginTop","marginBottom","maxWidth","minWidth","paper","backgroundColor","shadows","flexDirection","borderRadius","flexy","flex","flexy0","footer","borderBottom","borderTop","overflowY","button","whiteSpace","blkColor","fontWeight","FadeModal","setOpen","heading","cnt","restrict","setRestrict","Modal","aria-labelledby","aria-describedby","keepMounted","BackdropComponent","Backdrop","disableRestoreFocus","BackdropProps","timeout","Slide","direction","in","elevation","align","Switch","checked","onChange","square","Link","info","fontSize","typography","pxToRem","fontWeightRegular","MiAccordion","contentArray","expanded","Accordion","AccordionSummary","expandIcon","aria-controls","AccordionDetails","content","ProductHeader","smallestHeight","setSmallestHeight","onImgLoad","target","clientHeight","gutterBottom","title","infiniteLoop","useKeyboardArrows","autoPlay","swipeable","emulateTouch","images","src","onLoad","maxHeight","objectFit","DescriptionAndKey","createData","value","rowsData","sqFtParsed","pricePerSqFoot","floodRisk","round","maxBroadbandSpeed","ownershipType","tenure","roomsCnt","retirement","deprivationEngland","indexMultipleDeprivation","depPercentile","depPercRound","locationAccurate","epcData","propTypes","toLowerCase","includes","acres","plotMetres","ProductSummary","accordionContent","setAccordionContent","aContent","dangerouslySetInnerHTML","__html","text","distStr","num","rnd","schoolSizeMax","str","re","RegExp","match","exec","groups","SchoolDetail","React","hideCatchment","setHideCatchment","hideIndependent","setHideIndependent","hideReligious","setHideReligious","schoolDataP","setSchoolDataP","headerDataP","setHeaderDataP","schoolDataS","setSchoolDataS","headerDataS","setHeaderDataS","headersS","schoolsP","schoolsS","distanceInMetres","schoolTypeSimple","classSizeAvgPrimary","kS2PercentExpectedStandard","kS2PercentHigherStandard","classSizeAvgSecondary","kS4Progress8","kS4Attainment8","kS5Best3AverageGrade","FormControlLabel","control","useRowStyles","NestedRow","subRows","subHeaderData","paddingBottom","paddingTop","colSpan","Collapse","unmountOnExit","subRow","si","subcol","NestedTable","subHeader","subData","setSubRows","setSubHeaderData","CrimeDetail","crimeState","setCrimeState","crimeSubState","setCrimeSubState","seriousCrime","crimeCounts","setCrimeCounts","tCnts","Object","entries","tCrime","tSubCrime","crime","sort","b","distanceM","c","sCnt","tSubRow","timeBreakdown","k","v","AmenityDetail","places","setPlaces","topLevelCategory","category","keys","DemographicDetail","AreaSummary","setDataState","dState","oaClassificationName","soaClassificationName","workplaceClassificationName","localAuthorityClassificationName","percentQualifications4OrAbove","Neighbourhood","ProductView","item","TabPanel","index","other","role","hidden","a11yProps","useTheme","setValue","handleChange","event","newValue","view","Tabs","centered","Tab","dir","useProductQuery","product","setProduct","backdrop","zIndex","drawer","SimpleBackdrop","CircularProgress","hide","flexShrink","drawerPaper","pointerEvents","drawerHeader","mixins","toolbar","labels","SideNav","Drawer","anchor","Divider","forwardRef","SideView","accordionDetailsRoot","sliderRoot","thumb","border","track","rail","valueLabel","mark","Slider","LeftFilter","setFilterTerms","filterData","setCnt","transform","exampleWrapper","radioGroup","speedDial","bottom","top","MapLayerDial","setMapStyle","currentStyle","setCurrentStyle","actions","icon","Fab","newStyle","handleClick","thumbHeight","MuiRail","railHotspot","getRailProps","MuiHandle","domain","min","max","handle","percent","getHandleProps","aria-valuemin","aria-valuemax","aria-valuenow","trackHotspot","getTrackProps","MuiTickComponent","tick","format","defaultProps","d","textAlign","Component","BarChart2","highlight","isRange","prefix","suffix","renderFactor","barData","setBarData","formatLabel","toString","replace","dataSource","dataNoTail","normPrefix","normSuffix","bar","datasets","val","hoverBackgroundColor","responsive","maintainAspectRatio","animation","duration","plugins","legend","scales","HistoSlider2","setOutValue","leftLabel","rightLabel","lookup","setLookup","renderedValue","setRenderedValue","normalized","start","end","sum","lim","endSuffix","endButOne","NumberFormatCustom","inputRef","getInputRef","onValueChange","thousandSeparator","isNumericString","SetValueToNearestRendered","renderedVal","isFrom","parseInt","closestLower","reverse","find","closestUpper","Grid","paddingRight","mode","step","rootStyle","onUpdate","update","handles","justify","TextField","fullWidth","disabled","evt","InputProps","inputComponent","PriceSlider","setFilter","priceState","setPriceState","outValue","outValRef","exclusionFilters","priceData","tPrices","pd","f1","f2","newFilter","displayText","filters","filter","BedroomSlider","bedroomState","setBedroomState","bedroomData","tBeds","highest","BathroomSlider","SqFtSlider","AcreageSlider","setState","temp","CrimeSlider","DeprivationSlider","PriceSqftSlider","RoomCntSlider","BroadbandSlider","SchoolFilter","catchments","dataT","any","good","outstanding","none","RadioGroup","Radio","MenuProps","PaperProps","ITEM_HEIGHT","getContentAnchorEl","formControl","chips","noLabel","getStyles","BasicMultiSelect","setValues","FormControl","InputLabel","Select","labelId","multiple","tempVal","input","Input","renderValue","selected","Chip","onMouseDown","stopPropagation","onDelete","handleDelete","option","Checkbox","some","ListItemText","BarsSelect","tData","checkedIcon","BasicAutoSelect","Autocomplete","disableClearable","disableCloseOnSelect","getOptionLabel","renderOption","Fragment","renderInput","params","getOptionSelected","HotelsSelect","RecreationSelect","ShopsSelect","MainFilter","PriceSqFtSlider","fab","fabCont","MapView","showFilters","setShowFilters","clickedItem","productOpen","setProductOpen","productLoading","setProductLoading","setPoly","setCrimes","setSchools","setToggleFly","prevLocation","setPrevLocation","sideNavRef","sideViewRef","leftFilter","useMemo","polyJson","flyObj","offsetWidth","startIcon","App","exact","path","isLocalhost","window","hostname","registerValidSW","swUrl","navigator","serviceWorker","register","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","getElementById","URL","process","origin","addEventListener","response","contentType","get","indexOf","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker"],"mappings":"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","file":"static/js/main.f5fa741e.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 { Collapse, Container, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink } from 'reactstrap';\r\nimport { Link } from 'react-router-dom';\r\nimport './NavMenu.css';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport MenuIcon from '@material-ui/icons/Menu';\r\nimport clsx from 'clsx';\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 PropTypes from \"prop-types\";\r\nimport { withStyles } from \"@material-ui/core/styles\";\r\nimport AppBarCollapse from \"./AppBarCollapse\";\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\n\r\n\r\n//const NavMenu2 = ({ isFilterOpen, setIsFilterOpen }) => {\r\n\r\n// const [isOpen, setIsOpen] = useState(false);\r\n //const drawerWidth = 240;\r\n\r\n //const useStyles = makeStyles((theme) => ({\r\n // root: {\r\n // display: 'flex',\r\n // },\r\n // appBar: {\r\n // transition: theme.transitions.create(['margin', 'width'], {\r\n // easing: theme.transitions.easing.sharp,\r\n // duration: theme.transitions.duration.leavingScreen,\r\n // }),\r\n // },\r\n // appBarShift: {\r\n // width: `calc(100% - ${drawerWidth}px)`,\r\n // marginLeft: drawerWidth,\r\n // transition: theme.transitions.create(['margin', 'width'], {\r\n // easing: theme.transitions.easing.easeOut,\r\n // duration: theme.transitions.duration.enteringScreen,\r\n // }),\r\n // },\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 // width: drawerWidth,\r\n // flexShrink: 0,\r\n // },\r\n // drawerPaper: {\r\n // width: drawerWidth,\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-end',\r\n // },\r\n // content: {\r\n // flexGrow: 1,\r\n // padding: theme.spacing(3),\r\n // transition: theme.transitions.create('margin', {\r\n // easing: theme.transitions.easing.sharp,\r\n // duration: theme.transitions.duration.leavingScreen,\r\n // }),\r\n // marginLeft: -drawerWidth,\r\n // }\r\n //}));\r\n\r\n //const classes = useStyles();\r\n //console.log(\"MMM\");\r\n //console.log(isFilterOpen);\r\n //{/**/ }\r\n //{/* */ }\r\n //{/* setIsFilterOpen(true)}*/ }\r\n //{/* edge=\"start\"*/ }\r\n //{/* className={clsx(classes.menuButton, isFilterOpen && classes.hide)}*/ }\r\n //{/* >*/ }\r\n //{/* */ }\r\n //{/* */ }\r\n //{/* */ }\r\n //{/* Persistent drawer*/ }\r\n //{/* */ }\r\n //{/* */ }\r\n //{/**/ }\r\n\r\n// var alternate = (\r\n// \r\n// \r\n// \r\n// \r\n// \r\n// \r\n// News\r\n// \r\n// \r\n// \r\n// \r\n// )\r\n\r\n// var main = (\r\n//
\r\n// \r\n// \r\n// HouseMi Pre-Alpha\r\n// setIsOpen(a => !a)} className=\"mr-2\" />\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// return main;\r\n//}\r\n\r\n//export default memo(NavMenu);\r\n//const narrow = useMediaQuery(\"max-device-height:400\");\r\n\r\n//const styles = {\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 minHeight: 48,\r\n ['@media (max-height:' + theme.breakpoints.values.phone + 'px)']: {\r\n minHeight: 32,\r\n },\r\n ['@media (min-height' + theme.breakpoints.values.phone + 'px)']: {\r\n minHeight: 48, //don't this does anything...\r\n }\r\n }\r\n}));\r\n\r\nconst NavMenu = (props) => {\r\n const classes = useStyles();\r\n //const { classes } = props;\r\n return (\r\n
\r\n \r\n \r\n \r\n MOVEista (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, { useRef, useEffect, useState } from 'react';\r\n\r\nconst About = ({ }) => {\r\n \r\n\r\n return (\r\n
\r\n

Some text etc

\r\n
\r\n );\r\n\r\n}\r\n\r\nexport default About;","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 }\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 { createMuiTheme } 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 = createMuiTheme({\r\n breakpoints: {\r\n values: {\r\n xs: 0,\r\n sm: 600,\r\n md: 960,\r\n lg: 1280,\r\n xl: 1920,\r\n phone: 415,\r\n }\r\n },\r\n palette: {\r\n type: 'dark',\r\n primary: {\r\n //main: purple[900],\r\n //main: yellow[700],\r\n //main: cyan[\"A200\"],\r\n main: grey[900],\r\n },\r\n secondary: {\r\n main: red[500],\r\n },\r\n datavis: {\r\n //main: grey[200]\r\n main: amber[500]\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;","import React, { useRef, useEffect, useState, useCallback } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport mapboxgl from 'mapbox-gl/dist/mapbox-gl-csp';\r\nimport MapboxWorker from 'worker-loader!mapbox-gl/dist/mapbox-gl-csp-worker';\r\nimport HomeIcon from '@material-ui/icons/Home';\r\nimport circle from '@turf/circle';\r\nimport BasicTable from './BasicTable';\r\nimport { theme } from '../theme'\r\nimport { ThemeProvider } from '@material-ui/core/styles'\r\nimport { Paper, Typography, Box } from '@material-ui/core';\r\n\r\nmapboxgl.workerClass = MapboxWorker;\r\nmapboxgl.accessToken = 'pk.eyJ1IjoiaG91c2VjODQiLCJhIjoiY2tsc2t3N3I4MDN4MDJubjgxYjNmODE5ZyJ9.BYgTwOrkMw3hEs9ypeLs8g';\r\n\r\nconst MapBox = ({ lng, setLng, lat, setLat, zoom, setZoom, bounds, setBounds, data, setData, setClicked, poly, crimes, schools, toggleFly, mapStyle }) => {\r\n\r\n const mapContainer = useRef();\r\n const [map, setMap] = useState(null);\r\n const [styleChange, setStyleChange] = useState(false);\r\n const [sourceChange, setSourceChange] = useState(false);\r\n\r\n useEffect(() => {\r\n if (mapStyle != null && map != null && data != null) {\r\n map.setStyle('mapbox://styles/housec84/' + mapStyle.style);\r\n }\r\n }, [mapStyle]);\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, sourceChange]);\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, sourceChange]);\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, sourceChange]);\r\n\r\n useEffect(() => {\r\n if (map != null && toggleFly != null && toggleFly.loc != null) {\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.5,\r\n zoom: toggleFly.loc.zoom == null ? 16 : toggleFly.loc.zoom,\r\n center: [toggleFly.loc.longitude, toggleFly.loc.latitude]\r\n });\r\n }\r\n }, [toggleFly, map]);\r\n\r\n useEffect(() => {\r\n if (data != null) {\r\n AddToLayer(map, data.data);\r\n }\r\n }, [data, map, styleChange])\r\n\r\n const AddLayers = (mapLocal) => {\r\n mapLocal.addLayer({\r\n 'id': 'detailLayer',\r\n 'type': 'symbol',\r\n 'source': 'mainData',\r\n 'layout': {\r\n 'icon-image': '3dhouse1',\r\n 'icon-size': 0.7,\r\n 'icon-allow-overlap': true,\r\n 'text-field': ['get', 'label'],\r\n 'text-font': [\r\n 'Open Sans Semibold',\r\n 'Arial Unicode MS Bold'\r\n ],\r\n 'text-offset': [0, 1.25],\r\n 'text-anchor': 'top'\r\n }\r\n });\r\n\r\n mapLocal.addLayer({\r\n 'id': 'countsLayer',\r\n 'type': 'symbol',\r\n 'source': 'mainData',\r\n 'layout': {\r\n 'icon-image': 'simplehouse',\r\n 'icon-size': 0.3,\r\n 'icon-allow-overlap': true,\r\n 'text-field': ['get', 'label'],\r\n 'text-font': [\r\n 'Open Sans Semibold',\r\n 'Arial Unicode MS Bold'\r\n ],\r\n 'text-offset': [0, 1.25],\r\n 'text-anchor': 'top'\r\n },\r\n \"paint\": {\r\n \"text-color\": mapStyle.dark == false ? \"#000000\" : \"#ffffff\"\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 const AddSources = (mapLocal, data) => {\r\n\r\n mapLocal.addSource('mainData', data);\r\n mapLocal.addSource('plotPoly', emptySourceGeoJson);\r\n mapLocal.addSource('crimes', emptySourceGeoJson);\r\n mapLocal.addSource('schools', emptySourceGeoJson);\r\n mapLocal.addSource('schoolCatchments', emptySourceGeoJson);\r\n setSourceChange(a => !a);\r\n }\r\n\r\n const AddToLayer = (mapLocal, data) => {\r\n\r\n if (mapLocal != null && data != null) {\r\n\r\n if (typeof mapLocal.getSource('mainData') === 'undefined') {\r\n AddSources(mapLocal, data);\r\n }\r\n\r\n if (typeof mapLocal.getLayer('detailLayer') === 'undefined') {\r\n //initial setup - not the best place to do this really...\r\n AddLayers(mapLocal);\r\n }\r\n else {\r\n //update data.\r\n mapLocal.getSource('mainData').setData(data.data);\r\n }\r\n\r\n if (data.data && data.data.features[0] && data.data.features[0].properties.count) {\r\n //aggregated\r\n map.setLayoutProperty(\r\n 'countsLayer',\r\n 'visibility',\r\n 'visible');\r\n map.setLayoutProperty(\r\n 'detailLayer',\r\n 'visibility',\r\n 'none');\r\n\r\n } else {\r\n //detail\r\n map.setLayoutProperty(\r\n 'countsLayer',\r\n 'visibility',\r\n 'none');\r\n map.setLayoutProperty(\r\n 'detailLayer',\r\n 'visibility',\r\n 'visible');\r\n }\r\n }\r\n\r\n }\r\n\r\n const SetupMouseOver = (mapLocal) => {\r\n\r\n var popup = new mapboxgl.Popup({\r\n closeButton: false,\r\n closeOnClick: false,\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 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 setClicked(a => f.properties.id);\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 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\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 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 const mapLocal = new mapboxgl.Map({\r\n container: mapContainer.current,\r\n //style: 'mapbox://styles/mapbox/streets-v11',\r\n style: 'mapbox://styles/housec84/' + mapStyle.style,\r\n center: [lng, lat],\r\n zoom: zoom\r\n });\r\n\r\n mapLocal.on('style.load', function () {\r\n setStyleChange(a => !a);\r\n //if (data != null) {\r\n // AddSources(map, data.data);\r\n // AddLayers(map); //add custom layer and source to the new map style\r\n //}\r\n });\r\n\r\n mapLocal.on(\"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 mapLocal.on('move', () => {\r\n\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 catch (err) {\r\n console.log(err);\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\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 from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\nimport { fade, makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport TreeView from '@material-ui/lab/TreeView';\r\nimport TreeItem from '@material-ui/lab/TreeItem';\r\nimport Collapse from '@material-ui/core/Collapse';\r\nimport { useSpring, animated } from 'react-spring/web.cjs'; // web.cjs is required for IE 11 support\r\nimport { useRef, useEffect, useState, useCallback, memo } from 'react';\r\n//data\r\nconst FilterBar = ({ filterData, setFilter }) => {\r\n //const [data, setData] = useState({\r\n // id: 'root',\r\n // name: 'Parent',\r\n // children: [\r\n // {\r\n // id: '1',\r\n // name: 'Child - 1',\r\n // },\r\n // {\r\n // id: '3',\r\n // name: 'Child - 3',\r\n // children: [\r\n // {\r\n // id: '4',\r\n // name: 'Child - 4',\r\n // },\r\n // ],\r\n // },\r\n // ],\r\n //});\r\n\r\n const MinusSquare = () => {\r\n return (\r\n \r\n {/* tslint:disable-next-line: max-line-length */}\r\n \r\n \r\n );\r\n }\r\n\r\n const PlusSquare = () => {\r\n return (\r\n \r\n {/* tslint:disable-next-line: max-line-length */}\r\n \r\n \r\n );\r\n }\r\n\r\n const CloseSquare = () => {\r\n return (\r\n \r\n {/* tslint:disable-next-line: max-line-length */}\r\n \r\n \r\n );\r\n }\r\n\r\n //const TransitionComponent = (props) => {\r\n // const style = useSpring({\r\n // from: { opacity: 0, transform: 'translate3d(20px,0,0)' },\r\n // to: { opacity: props.in ? 1 : 0, transform: `translate3d(${props.in ? 0 : 20}px,0,0)` },\r\n // });\r\n\r\n // return (\r\n // \r\n // \r\n // \r\n // );\r\n //}\r\n\r\n //useEffect(() => {\r\n // TransitionComponent.propTypes = {\r\n // /**\r\n // * Show the component; triggers the enter or exit states\r\n // */\r\n // in: PropTypes.bool,\r\n // };\r\n //}, [filterData]);\r\n\r\n const StyledTreeItem = withStyles((theme) => ({\r\n\r\n iconContainer: {\r\n '& .close': {\r\n opacity: 0.3,\r\n },\r\n },\r\n group: {\r\n marginLeft: 7,\r\n paddingLeft: 18,\r\n borderLeft: `1px dashed ${fade(theme.palette.text.primary, 0.4)}`,\r\n },\r\n }))((props) => {\r\n return console.log(\"iconclick\")}\r\n onLabelClick={(event) => {\r\n event.preventDefault();\r\n if (props.node.children == null) {\r\n setFilter(filters => [...filters, props.node]);\r\n }\r\n }} />\r\n });\r\n\r\n\r\n const useStyles = makeStyles({\r\n root: {\r\n //height: 264,\r\n flexGrow: 1,\r\n maxWidth: 400,\r\n },\r\n });\r\n\r\n \r\n\r\n const renderTree = (nodes) => {\r\n if (nodes.count != 0 || nodes.count == null) {\r\n return (\r\n \r\n {Array.isArray(nodes.children) ? nodes.children.map((node) => renderTree(node)) : null}\r\n )\r\n }\r\n };\r\n\r\n const classes = useStyles();\r\n console.log(\"filter render\");\r\n \r\n if (filterData != null && filterData.filters != null) {\r\n return (\r\n
\r\n }\r\n defaultExpandIcon={}\r\n defaultEndIcon={}\r\n >\r\n {renderTree(filterData.filters)}\r\n \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(FilterBar);","import React, { useRef, useEffect, useState, memo } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Chip from '@material-ui/core/Chip';\r\nimport Paper from '@material-ui/core/Paper';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n justifyContent: 'center',\r\n flexWrap: 'wrap',\r\n listStyle: 'none',\r\n padding: theme.spacing(0.5),\r\n margin: 0,\r\n },\r\n chip: {\r\n margin: theme.spacing(0.5),\r\n },\r\n}));\r\n\r\nconst FilterView = ({ filterTerms, setFilterTerms }) => {\r\n\r\n const classes = useStyles();\r\n\r\n const removeItem = (item) => {\r\n if (filterTerms != null && item != null) {\r\n setFilterTerms(f => {\r\n return f.filter(a => a.label != item.label);\r\n });\r\n }\r\n };\r\n\r\n const old = (\r\n
\r\n { filterTerms && filterTerms.map((item, i) => (\r\n
removeItem(item)}>{item.displayText}
\r\n ))}\r\n
\r\n );\r\n\r\n return (\r\n \r\n {filterTerms && filterTerms.map((data, i) => {\r\n return (\r\n
  • \r\n removeItem(data)}\r\n className={classes.chip}\r\n />\r\n
  • \r\n );\r\n })}\r\n
    \r\n );\r\n\r\n}\r\n\r\nexport default memo(FilterView);","import React, { useRef, useEffect, useState, memo } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport MapBox from './MapBox';\r\n\r\n\r\n\r\n\r\nconst QueryController = ({ bounds, filterTerms, setData }) => {\r\n \r\n const [timer, setTimer] = useState(null);\r\n \r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 250;\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 var payload = {\r\n LatN: bounds._ne.lat,\r\n LatS: bounds._sw.lat,\r\n LonE: bounds._ne.lng,\r\n LonW: bounds._sw.lng,\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 console.log(payload);\r\n fetch(\"https://mihousesearchapi.azurewebsites.net/api/filter/box3\", {\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, { 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 from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Accordion from '@material-ui/core/Accordion';\r\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\r\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\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, expanded }) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n
    \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}\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 { 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\nimport \"react-responsive-carousel/lib/styles/carousel.min.css\"; // requires a loader\r\nimport { Carousel } from 'react-responsive-carousel';\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 £{data.price}\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\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('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 createData('Flood risk', data.floodRisk == \"No Data\" ? \"No risk / No data\" : data.floodRisk),\r\n createData('Max broadband speed', `${Math.round(data.maxBroadbandSpeed / 1000)}MB/S`),\r\n createData('Ownership', data.ownershipType),\r\n createData('Tenure', data.tenure),\r\n createData('Total rooms', data.roomsCnt),\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 console.log(\"MEEP\");\r\n\r\n console.log(data.tenure);\r\n console.log(data.locationAccurate);\r\n if (data.epcData != null) {\r\n console.log(data.epcData.tenure);\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 if (data.tenure != \"RENTAL\" && data.tenure != \"LEASEHOLD\"\r\n && data.propTypes.map(a => a.toLowerCase()).includes(\"flat\") == false\r\n && data.propTypes.map(a => a.toLowerCase()).includes(\"apartment\") == false) {\r\n\r\n let acres = (data.plotMetres / 4047).toFixed(2);\r\n if (data.locationAccurate) {\r\n rowsData.push(createData(\"Land\", `${acres} acres`));\r\n }\r\n else{\r\n rowsData.push(createData(\"Land\", `${acres} acres (estimate - location may be inaccurate)`));\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 { 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\n\r\nconst ProductSummary = ({ data }) => {\r\n\r\n const [accordionContent, setAccordionContent] = useState([]);\r\n\r\n useEffect(() => {\r\n\r\n let aContent = [\r\n { heading: \"Key Details\", content: () },\r\n { heading: \"Description\", content: () },\r\n { heading: \"Enviromental\", content: (
    ) },\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 AmenityDetail = ({ data }) => {\r\n\r\n const [places, setPlaces] = useState({});\r\n const header = [\"Name\", \"Category\", \"Distance\"];\r\n useEffect(() => {\r\n if (data != null && data.places != null) {\r\n let content = {};\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: \"Key Details\", content: () },\r\n { heading: \"Description\", content: () },\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 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 React, { useEffect, memo, useState } from 'react';\r\nimport ReactJson from 'react-json-view';\r\nimport JSONPretty from 'react-json-pretty';\r\n\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Tabs from '@material-ui/core/Tabs';\r\nimport Tab from '@material-ui/core/Tab';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Box from '@material-ui/core/Box';\r\nimport SwipeableViews from 'react-swipeable-views';\r\nimport ProductSummary from './ProductSummary';\r\nimport Neighbourhood from './Neighbourhood';\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport ChevronRightIcon from \"@material-ui/icons/ChevronRight\";\r\n\r\nconst ProductView = ({ item, setOpen }) => {\r\n\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\r\n const useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n backgroundColor: theme.palette.background.paper,\r\n },\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 const classes = useStyles();\r\n const theme = useTheme();\r\n const [value, setValue] = React.useState(0);\r\n\r\n const handleChange = (event, newValue) => {\r\n setValue(newValue);\r\n };\r\n\r\n const handleChangeIndex = (index) => {\r\n setValue(index);\r\n };\r\n\r\n let view =
    \r\n\r\n if (item) {\r\n //resp = //this is too damn slow...\r\n let resp = ();\r\n console.log(item);\r\n view = (\r\n
    \r\n \r\n {/*
    */}\r\n {/* setOpen(a => !a)}>*/}\r\n {/* */}\r\n {/* */}\r\n {/*
    */}\r\n
    \r\n setOpen(a => !a)} style={{ \"align\": \"right\" }} color=\"secondary\">\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 {/*

    epcData.tenure {resp.data.epcData.tenure}

    */}\r\n {/*

    plotMetres {resp.data?.plotMetres}

    */}\r\n {/*

    locationAccurate {resp.data?.locationAccurate}

    */}\r\n {/*

    address {resp.data?.address}

    */}\r\n {resp}\r\n
    \r\n

    \r\n
    );\r\n }\r\n\r\n return (\r\n
    \r\n {view}\r\n
    \r\n );\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 fetch(`https://mihousesearchapi.azurewebsites.net/api/index/${id}`, {\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, useState, memo, forwardRef } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport MapBox from './MapBox';\r\nimport FilterBar from './FilterBar';\r\nimport QueryController from './QueryController';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport { Drawer } from '@material-ui/core';\r\nimport ChevronLeftIcon from \"@material-ui/icons/ChevronLeft\";\r\nimport { SwipeableDrawer } from '@material-ui/core';\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport FilterView from './FilterView';\r\nimport List from \"@material-ui/core/List\";\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport ListItemIcon from \"@material-ui/core/ListItemIcon\";\r\nimport ListItemText from \"@material-ui/core/ListItemText\";\r\nimport InboxIcon from \"@material-ui/icons/MoveToInbox\";\r\nimport MailIcon from \"@material-ui/icons/Mail\";\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nconst drawerWidth = 340;\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\r\n //width: \"100%\",\r\n //height: \"100%\",\r\n flexShrink: 0,\r\n //color: theme.secondary,\r\n //backgroundColor: theme.palette.primary.light,\r\n //justifyContent:\"center\",\r\n //alignItems: \"center\"\r\n },\r\n drawerPaper: {\r\n width: \"15%\",\r\n maxWidth: \"400px\",\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: \"100%\",\r\n pointerEvents: \"auto\",\r\n //backgroundColor: theme.palette.primary.light,\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: \"space-between\"\r\n },\r\n labels: {\r\n //padding: \"0px 16px 0px 16px\"\r\n margin: \"0px\"\r\n }\r\n}));\r\n\r\nconst SideNav = ({ open, setOpen, children, cnt }, ref) => {\r\n\r\n //const theme = useTheme();\r\n const classes = useStyles();\r\n console.log(\"nav 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
    \r\n \r\n Total properties: {cnt}\r\n \r\n setOpen(a => !a)}>\r\n \r\n \r\n
    \r\n \r\n\r\n {children}\r\n
    \r\n \r\n );\r\n}\r\n\r\nexport default memo(forwardRef(SideNav));","import React, { useRef, useEffect, useState, memo, forwardRef } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport MapBox from './MapBox';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport { Drawer } from '@material-ui/core';\r\nimport Divider from \"@material-ui/core/Divider\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport ChevronRightIcon from \"@material-ui/icons/ChevronRight\";\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 },\r\n [theme.breakpoints.down(\"xs\")]: {\r\n width: \"100%\",\r\n },\r\n height: \"100%\",\r\n pointerEvents: \"auto\",\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}));\r\n\r\nconst SideView = ({ open, setOpen, children, cnt }, ref) => {\r\n\r\n //const theme = useTheme();\r\n const classes = useStyles();\r\n return (\r\n setOpen(false)}\r\n\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(SideView));","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\nimport { fade, makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport TreeView from '@material-ui/lab/TreeView';\r\nimport TreeItem from '@material-ui/lab/TreeItem';\r\nimport Collapse from '@material-ui/core/Collapse';\r\nimport { useRef, useEffect, useState, useCallback, memo } from 'react';\r\nimport Accordion from '@material-ui/core/Accordion';\r\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\r\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport Button from '@material-ui/core/Button';\r\nimport ButtonGroup from '@material-ui/core/ButtonGroup';\r\nimport Slider from '@material-ui/core/Slider';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n flexDirection: \"column\",\r\n whiteSpace: \"nowrap\"\r\n },\r\n heading: {\r\n fontSize: theme.typography.pxToRem(15),\r\n fontWeight: theme.typography.fontWeightRegular,\r\n },\r\n accordionDetailsRoot: {\r\n padding: \"1px 2px 2px\"\r\n },\r\n sliderRoot: {\r\n margin: \"30px 15px 2px 30px\",\r\n width: \"100%\",\r\n width: \"-moz-available\",\r\n width: \"-webkit-fill-available\",\r\n width: \"fill-available\",\r\n }\r\n}));\r\n\r\nconst FilterBar2 = ({ filterData, setFilter }) => {\r\n const classes = useStyles();\r\n \r\n console.log(\"filterbar2\");\r\n if (filterData != null && filterData.filters != null) {\r\n return (\r\n <>\r\n \r\n }\r\n aria-controls=\"panel1a-content\"\r\n id=\"panel1a-header\"\r\n >\r\n Advanced Filters\r\n \r\n \r\n {filterData.filters.children.map((data, i) => {\r\n return (\r\n \r\n }\r\n aria-controls=\"panel1a-content\"\r\n id=\"panel1a-header\"\r\n >\r\n {data.displayText}\r\n \r\n \r\n \r\n {data.children.map((data2, i2) => {\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 else {\r\n return
    \r\n }\r\n\r\n};\r\n\r\nexport default memo(FilterBar2);","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport SvgIcon from '@material-ui/core/SvgIcon';\r\nimport { fade, makeStyles, withStyles } from '@material-ui/core/styles';\r\nimport TreeView from '@material-ui/lab/TreeView';\r\nimport TreeItem from '@material-ui/lab/TreeItem';\r\nimport Collapse from '@material-ui/core/Collapse';\r\nimport { useRef, useEffect, useState, useCallback, memo } from 'react';\r\nimport Accordion from '@material-ui/core/Accordion';\r\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\r\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\r\nimport Button from '@material-ui/core/Button';\r\nimport ButtonGroup from '@material-ui/core/ButtonGroup';\r\nimport Slider from '@material-ui/core/Slider';\r\nimport NonLinearSlider from './NonLinearSlider';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n flexDirection: \"column\",\r\n whiteSpace: \"nowrap\"\r\n },\r\n heading: {\r\n fontSize: theme.typography.pxToRem(15),\r\n fontWeight: theme.typography.fontWeightRegular,\r\n },\r\n sliderRoot: {\r\n margin: \"8px 15px 2px 30px\",\r\n width: \"100%\",\r\n width: \"-moz-available\",\r\n width: \"-webkit-fill-available\",\r\n width: \"fill-available\",\r\n },\r\n labels: {\r\n padding: \"0px 16px 0px 16px\"\r\n }\r\n}));\r\n\r\nconst StyledSlider = withStyles({\r\n thumb: {\r\n height: 24,\r\n width: 24,\r\n backgroundColor: '#fff',\r\n border: '2px solid currentColor',\r\n marginTop: -6,\r\n marginLeft: -12,\r\n '&:focus, &:hover, &$active': {\r\n boxShadow: 'inherit',\r\n },\r\n },\r\n track: {\r\n height: 12,\r\n borderRadius: 4,\r\n },\r\n rail: {\r\n height: 12,\r\n borderRadius: 4,\r\n },\r\n valueLabel: {\r\n left: 'calc(-50% + 4px)',\r\n },\r\n mark: {\r\n height: 2,\r\n width: 1,\r\n marginTop: 5,\r\n }\r\n})(Slider);\r\n\r\nconst FilterSimples = ({ filterData, setFilter, label, setCnt }) => {\r\n const classes = useStyles();\r\n const [value, setValue] = React.useState([0, 0]);\r\n const [lookup, setLookup] = React.useState();\r\n \r\n const [timer, setTimer] = useState(null);\r\n\r\n const handleChange = (event, newValue) => {\r\n setValue(newValue);\r\n };\r\n\r\n useEffect(() => {\r\n if (filterData != null && filterData.exclusionFilters != null) {\r\n let prices = filterData.exclusionFilters.children.find(a => a.label == label);\r\n if (prices != null && prices.children != null) {\r\n let numericPrices = prices.children.map(a => { return { cnt: a.count, from: a.from, orig: a } });\r\n numericPrices.push({ from: 100000000, cnt: 0 });\r\n\r\n let normalized = numericPrices.sort((a, b) => a.origValue - b.origValue).map((a, i) => {\r\n return {\r\n value: i,\r\n cnt: a.cnt,\r\n from: a.from,\r\n orig: a.orig\r\n };\r\n });\r\n if (value[0] == 0 && value[1] == 0) {\r\n setValue([0, normalized.length - 1]);\r\n }\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 console.log(\"only fire on filters change\");\r\n }\r\n }\r\n }\r\n }, [filterData, lookup]);\r\n\r\n useEffect(() => {\r\n if (value != null && lookup != null && value[0] != value[1]) {\r\n let sum = 0;\r\n for (let i = value[0]; i < value[1]; i++) {\r\n sum += lookup[i].cnt;\r\n }\r\n setCnt(sum);\r\n debounce(() => {\r\n let f1 = lookup[value[0]].from;\r\n let f2 = lookup[value[1]].from;\r\n let newFilter = {\r\n displayText: `${f1}-${f2}`,\r\n field: label,\r\n from: f1,\r\n id: `xxx-slider-${label}`,\r\n label: `${f1}-${f2}`,\r\n to: f2,\r\n type: \"Range\",\r\n }\r\n setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\r\n }, 400);\r\n }\r\n }, [value, lookup]);\r\n\r\n const render = (v) => {\r\n if (lookup != null) {\r\n let l = lookup[v];\r\n if (l != null) {\r\n let a = l.from;\r\n if (a <= 1)\r\n return \"0\";\r\n if (a < 10000) {\r\n return `${a}`;\r\n }\r\n if (a < 1000000) {\r\n return `${a / 1000}K`\r\n }\r\n if (a > 10000000) {\r\n return '\\u221E';\r\n }\r\n return `${a / 1000000}M`\r\n }\r\n }\r\n }\r\n\r\n const debounce = (method, delayMs) => {\r\n delayMs = delayMs || 250;\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 if (filterData != null && filterData.filters != null && lookup != null) {\r\n return (\r\n <>\r\n
    \r\n \r\n {label}\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\n\r\nexport default memo(FilterSimples);\r\n\r\n","import React, { useRef, memo } from 'react';\r\nimport FilterBar from './FilterBar';\r\nimport FilterBar2 from './FilterBar2';\r\nimport FilterView from './FilterView';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport FilterSimples from './FilterSimples';\r\n\r\n\r\nconst LeftFilter = ({ filterTerms, setFilterTerms, filterData, setCnt }) => {\r\n \r\n const divRef = useRef(null);\r\n return (\r\n
    \r\n {/*
    */}\r\n {/*
    */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/*
    */}\r\n {/*
    */}\r\n {/*
    */}\r\n {/**/}\r\n {/* */}\r\n {/**/}\r\n
    \r\n );\r\n}\r\n\r\nexport default memo(LeftFilter);","import React, { useRef, useEffect, useState, memo, forwardRef } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport FormLabel from '@material-ui/core/FormLabel';\r\nimport Radio from '@material-ui/core/Radio';\r\nimport RadioGroup from '@material-ui/core/RadioGroup';\r\nimport Switch from '@material-ui/core/Switch';\r\nimport SpeedDial from '@material-ui/lab/SpeedDial';\r\nimport SpeedDialIcon from '@material-ui/lab/SpeedDialIcon';\r\nimport SpeedDialAction from '@material-ui/lab/SpeedDialAction';\r\nimport FileCopyIcon from '@material-ui/icons/FileCopyOutlined';\r\nimport SaveIcon from '@material-ui/icons/Save';\r\nimport PrintIcon from '@material-ui/icons/Print';\r\nimport ShareIcon from '@material-ui/icons/Share';\r\nimport FavoriteIcon from '@material-ui/icons/Favorite';\r\nimport SatelliteIcon from '@material-ui/icons/Satellite';\r\nimport MapIcon from '@material-ui/icons/Map';\r\nimport LayersIcon from '@material-ui/icons/Layers';\r\nimport Fab from '@material-ui/core/Fab';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n transform: 'translateZ(0px)',\r\n flexGrow: 1,\r\n },\r\n exampleWrapper: {\r\n position: 'relative',\r\n marginTop: theme.spacing(3),\r\n height: 380,\r\n },\r\n radioGroup: {\r\n margin: theme.spacing(1, 0),\r\n },\r\n speedDial: {\r\n position: 'absolute',\r\n '&.MuiSpeedDial-directionUp, &.MuiSpeedDial-directionLeft': {\r\n bottom: theme.spacing(2),\r\n right: theme.spacing(2),\r\n },\r\n '&.MuiSpeedDial-directionDown, &.MuiSpeedDial-directionRight': {\r\n top: theme.spacing(2),\r\n left: theme.spacing(2),\r\n },\r\n },\r\n}));\r\n\r\n\r\n\r\nconst MapLayerDial = ({ setMapStyle, className }) => {\r\n const classes = useStyles();\r\n const [open, setOpen] = useState(false);\r\n const [currentStyle, setCurrentStyle] = useState(1);\r\n\r\n const actions = [\r\n { icon: , name: 'Satellite', mapStyle: { style: \"ckqccqfbe03r718o40dwed8e0?optimize=true\", dark: true } },\r\n { icon: , name: 'Street Map', mapStyle: { style: \"ckouk806n1vxr17lkaic8078y?optimize=true\", dark: false } },\r\n ];\r\n\r\n const handleClose = (mapStyle) => {\r\n setOpen(false);\r\n };\r\n\r\n //const handleClick = (mapStyle) => {\r\n // setMapStyle(mapStyle);\r\n // setOpen(false);\r\n //};\r\n\r\n const handleClick = () => {\r\n let newStyle = currentStyle == 0 ? 1 : 0;\r\n setMapStyle(actions[newStyle].mapStyle);\r\n setCurrentStyle(newStyle);\r\n setOpen(false);\r\n };\r\n\r\n const handleOpen = () => {\r\n setOpen(true);\r\n };\r\n\r\n return (\r\n handleClick()} >\r\n \r\n \r\n );\r\n\r\n \r\n\r\n\r\n}\r\n\r\nexport default memo(MapLayerDial);","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 = 20;\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});\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 from \"react\";\r\nimport { Bar } from \"react-chartjs-2\";\r\n\r\nclass BarChart extends React.Component {\r\n render() {\r\n const { data, highlight, domain } = this.props;\r\n\r\n // calculate frequency of data\r\n var counts = {};\r\n for (var i = 0; i < data.length; i++)\r\n counts[data[i]] = counts[data[i]] + 1 || 1;\r\n\r\n // generate data\r\n const barDataValues = [];\r\n for (let i = 0; i < domain[1]; i++) {\r\n barDataValues.push(counts[i] || 0);\r\n }\r\n const barData = {\r\n labels: barDataValues.map((val, i) => i),\r\n datasets: [\r\n {\r\n backgroundColor: barDataValues.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 ),\r\n hoverBackgroundColor: \"rgba(255,99,132,0.4)\",\r\n data: barDataValues\r\n }\r\n ]\r\n };\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 return (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default BarChart;\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 BarChart from \"./BarChart\";\r\n\r\nconst HistoSlider = ({ data }) => {\r\n\r\n const [state, setState] = useState(null);\r\n\r\n useEffect(() => {\r\n let sortedData = data.slice().sort((a, b) => a - b);\r\n let range = [sortedData[0], sortedData[sortedData.length - 1]];\r\n const tState = {\r\n domain: range,\r\n update: range,\r\n values: range,\r\n inputValues: range\r\n };\r\n setState(tState);\r\n }, [data]);\r\n\r\n\r\n if (state == null) {\r\n return (<>);\r\n }\r\n\r\n console.log(\"histogram render\")\r\n return (\r\n \r\n \r\n
    \r\n \r\n setState(a => ({ ...a, update, inputValues: update}) )\r\n }\r\n\r\n //onUpdate={update =>\r\n // this.setState({ update, inputValues: update })\r\n //}\r\n onChange={values => setState(a => ({ ...a, values }))}\r\n //onChange={values => this.setState({ values })}\r\n values={state.values}\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 {/* {({ tracks, getTrackProps }) => (*/}\r\n {/*
    */}\r\n {/* {tracks.map(({ id, source, target }) => (*/}\r\n {/* */}\r\n {/* ))}*/}\r\n {/*
    */}\r\n {/* )}*/}\r\n {/*
    */}\r\n {/**/}\r\n {/* {({ ticks }) => (*/}\r\n {/*
    */}\r\n {/* {ticks.map(tick => (*/}\r\n {/* */}\r\n {/* ))}*/}\r\n {/*
    */}\r\n {/* )}*/}\r\n {/*
    */}\r\n \r\n \r\n \r\n {\r\n console.log(evt);\r\n const value = evt.target.value;\r\n console.log(value);\r\n setState(a => ({ ...a, inputValues: [value, a.inputValues[1]] }))\r\n //this.setState({ inputValues: newState });\r\n if (value && value >= state.domain[0]) {\r\n console.log(\"IF HIT\");\r\n setState(a => ({ ...a, values: [value, a.inputValues[1]] }))\r\n //this.setState({ values: newState });\r\n }\r\n }}\r\n InputProps={{\r\n startAdornment: (\r\n £\r\n )\r\n }}\r\n />\r\n \r\n \r\n -\r\n \r\n \r\n {\r\n const value = evt.target.value;\r\n setState(a => ({ ...a, inputValues: [state.inputValues[0], value] }))\r\n //this.setState({ inputValues: newState });\r\n if (value && value <= state.domain[1] && value >= state.values[0]) {\r\n\r\n setState(a => ({ ...a, values: [state.inputValues[0], value] }))\r\n //this.setState({ values: newState });\r\n }\r\n }}\r\n InputProps={{\r\n startAdornment: (\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(HistoSlider);\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, setCnt, 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 let sum = 0;\r\n for (let i = value[0]; i < value[1]; i++) {\r\n sum += lookup[i].cnt;\r\n }\r\n setCnt(sum);\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, setCnt }) => {\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 setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\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, setCnt }) => {\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 setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\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, setCnt }) => {\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 setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\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, setCnt }) => {\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 setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\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, setCnt }) => {\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 setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\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, setCnt }) => {\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 setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\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, setCnt }) => {\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 setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\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, setCnt }) => {\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 setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\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, setCnt }) => {\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 setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\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, setCnt }) => {\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 == \"maxBroadbandSpeed\").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: \"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 setFilter(filters => [...(filters.filter(a => a.id != newFilter.id)), newFilter])\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, setCnt, 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 //console.log(value);\r\n //console.log(data);\r\n let filter = data[value].filter;\r\n //console.log(filter);\r\n setCnt(data[value].cnt);\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 values.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 console.log(value);\r\n let tempVal = [];\r\n values.forEach(a => tempVal.push(data.find(b => a == b.name)));\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 BarsSelect = ({ filterData, setFilter, setCnt }) => {\r\n const [data, setData] = useState([]);\r\n const field = \"BarsAndRestaurantsTerms\";\r\n useEffect(() => {\r\n if (filterData == null || filterData.filters == null || filterData.filters.children == null) {\r\n return;\r\n }\r\n let targetData = filterData.filters.children.find(a => a.label == \"Nearby Bars and Restaurants\");\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 {/*Bars and Restaurants*/}\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(BarsSelect);","import React, { useState, memo, useEffect } 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\n\r\nconst icon = ;\r\nconst checkedIcon = ;\r\n\r\nconst BasicAutoSelect = ({ data, onChange }) => {\r\n return (\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 BasicAutoSelect;","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 BasicAutoSelect from '../reusable/BasicAutoSelect';\r\n\r\nconst HotelsSelect = ({ filterData, setFilter, setCnt }) => {\r\n const [data, setData] = useState([]);\r\n const field = \"TransportationTerms\";\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 == \"Nearby Transportation\");\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 Hotels and Travel\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(HotelsSelect);","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 BasicAutoSelect from '../reusable/BasicAutoSelect';\r\n\r\nconst RecreationSelect = ({ filterData, setFilter, setCnt }) => {\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 == \"Nearby Recreation\");\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 Recreation\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(RecreationSelect);","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 BasicAutoSelect from '../reusable/BasicAutoSelect';\r\n\r\nconst ShopsSelect = ({ filterData, setFilter, setCnt }) => {\r\n const [data, setData] = useState([]);\r\n const field = \"ShopsAndServicesTerms\";\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 == \"Nearby Shops and Services\");\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 Shops and Services\r\n \r\n \r\n );\r\n}\r\n\r\n\r\nexport default memo(ShopsSelect);","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 HistoSlider from '../reusable/histoslider/HistoSlider';\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\nimport BarsSelect from './BarsSelect';\r\nimport HotelsSelect from './HotelsSelect';\r\nimport RecreationSelect from './RecreationSelect';\r\nimport ShopsSelect from './ShopsSelect';\r\n\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 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 Ownership\r\n \r\n \r\n Tenures\r\n \r\n \r\n \r\n \r\n \r\n Subsidence Risk\r\n \r\n \r\n Flood Risk\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(MainFilter);\r\n\r\n","import React, { useRef, useEffect, useState, useCallback, useMemo } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport MapBox from './MapBox';\r\nimport FilterBar from './FilterBar';\r\nimport FilterView from './FilterView';\r\nimport QueryController from './QueryController';\r\nimport FadeModal from './FadeModal';\r\nimport ProductView from './property/ProductView';\r\nimport useProductQuery from './ProductQuery';\r\nimport SimpleBackdrop from './SimpleBackdrop';\r\nimport SideNav from './SideNav';\r\nimport SideView from './SideView';\r\nimport Fab from '@material-ui/core/Fab';\r\nimport FilterListIcon from '@material-ui/icons/FilterList';\r\nimport { makeStyles, useTheme } from '@material-ui/core/styles';\r\nimport LeftFilter from './LeftFilter';\r\nimport LayersIcon from '@material-ui/icons/Layers';\r\nimport MapLayerDial from './MapLayerDial';\r\nimport Button from '@material-ui/core/Button';\r\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\r\nimport TuneRoundedIcon from '@material-ui/icons/TuneRounded';\r\nimport MainFilter from './filters/MainFilter';\r\nconst useStyles = makeStyles((theme) => ({\r\n fab: {\r\n left: theme.spacing(2),\r\n top: theme.spacing(2),\r\n marginTop: \"10px\",\r\n marginRight: \"10px\",\r\n pointerEvents: \"auto\",\r\n },\r\n fabCont: {\r\n flexDirection: \"column\",\r\n display: \"flex\",\r\n justifyContent: \"flex-start\"\r\n }\r\n}));\r\n\r\nconst MapView = ({ }) => {\r\n const [showFilters, setShowFilters] = useState(false);\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);\r\n const [data, setData] = useState(null);\r\n const [filterTerms, setFilterTerms] = useState([]);\r\n const [open, setOpen] = useState(false);\r\n const [propViewOpen, setPropViewOpen] = useState(false);\r\n const [clickedItem, setClicked] = 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 [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 sideNavRef = useRef();\r\n const sideViewRef = useRef();\r\n const [mapStyle, setMapStyle] = useState({ style: \"ckouk806n1vxr17lkaic8078y?optimize=true\", dark: false });\r\n\r\n const leftFilter = useMemo(() => , [filterTerms, data]);\r\n\r\n //const memoMainFilter = useMemo(() => ,\r\n // [filterTerms, data]);\r\n\r\n useEffect(() => {\r\n if (clickedItem) {\r\n setProductOpen(false);\r\n setProductLoading(true);\r\n setProduct(clickedItem);\r\n setPrevLocation({ longitude: lng, latitude: lat, zoom: zoom });\r\n }\r\n }, [clickedItem]);\r\n\r\n useEffect(() => {\r\n if (product) {\r\n setPoly(product.data.polyJson);\r\n setSchools(product.data.schools);\r\n setCrimes(product.data.crime);\r\n setProductOpen(true);\r\n setProductLoading(false);\r\n }\r\n }, [product]);\r\n\r\n useEffect(() => {\r\n if (!productOpen) {\r\n setPoly(null);\r\n setSchools(null);\r\n setCrimes(null);\r\n setClicked(false);\r\n let flyObj = {\r\n left: sideNavRef.current && open ? sideNavRef.current.offsetWidth : 0,\r\n right: sideViewRef.current && productOpen ? sideViewRef.current.offsetWidth : 0,\r\n loc: prevLocation\r\n }\r\n setToggleFly(flyObj);\r\n }\r\n else {\r\n let flyObj = {\r\n left: sideNavRef.current && open ? sideNavRef.current.offsetWidth : 0,\r\n right: sideViewRef.current && productOpen ? sideViewRef.current.offsetWidth : 0,\r\n loc: product.data.location\r\n }\r\n console.log(flyObj);\r\n setToggleFly(flyObj);\r\n }\r\n }, [productOpen, sideNavRef, sideViewRef, prevLocation]);\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 {/* setShowFilters(true)} >*/}\r\n {/* */}\r\n {/**/}\r\n\r\n \r\n
    \r\n\r\n \r\n {leftFilter}\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 MapView;","import * as React from 'react';\r\nimport { Route } from 'react-router';\r\nimport Layout from './components/Layout';\r\nimport About from './components/About';\r\nimport MapView from './components/MapView';\r\nimport { ThemeProvider } from '@material-ui/core/styles'\r\nimport { theme } from './theme'\r\nimport './custom.css'\r\n\r\n//export default () => (\r\n// \r\n// \r\n// \r\n// \r\n//);\r\n\r\n\r\nconst App = () => (\r\n \r\n \r\n \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\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":""}