Compare commits
5 Commits
a20f0f4841
...
f8b0a2d0aa
Author | SHA1 | Date |
---|---|---|
Christiaan Evers | f8b0a2d0aa | |
Christiaan Evers | a887b0d690 | |
Christiaan Evers | 1b63c0136f | |
Christiaan Evers | 71a60a6822 | |
Christiaan Evers | a37e3596e9 |
|
@ -3,12 +3,8 @@
|
|||
<component name="ChangeListManager">
|
||||
<list default="true" id="ffab9a85-d9fb-41e5-9b26-b6bb18eb7f17" name="Default Changelist" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/package.json" beforeDir="false" afterPath="$PROJECT_DIR$/package.json" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/components/Header/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/Header/index.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/components/NeighbourhoodInfo/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/NeighbourhoodInfo/index.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/requests/updates/index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/src/requests/updates/index.ts" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/screens/GeoMap.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/screens/GeoMap.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/src/screens/Profile.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/screens/Profile.tsx" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/yarn.lock" beforeDir="false" afterPath="$PROJECT_DIR$/yarn.lock" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||
|
@ -73,7 +69,7 @@
|
|||
<workItem from="1629286329005" duration="875000" />
|
||||
<workItem from="1630189077321" duration="694000" />
|
||||
<workItem from="1635667952517" duration="2107000" />
|
||||
<workItem from="1635678316673" duration="684000" />
|
||||
<workItem from="1635678316673" duration="21523000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
|
|
|
@ -26,11 +26,12 @@
|
|||
"axios": "^0.21.1",
|
||||
"bootstrap": "^5.0.1",
|
||||
"leaflet": "^1.7.1",
|
||||
"material-ui-numeric-input": "^3.0.2",
|
||||
"react": "^17.0.2",
|
||||
"react-bootstrap": "^1.6.1",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-input-number": "^5.0.19",
|
||||
"react-leaflet": "^3.2.0",
|
||||
"react-numeric-input": "^2.2.3",
|
||||
"react-redux": "^7.2.4",
|
||||
"react-router-dom": "^5.2.0",
|
||||
"react-scripts": "4.0.3",
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
import {useDispatch, useSelector} from 'react-redux';
|
||||
import {Link as RouterLink} from 'react-router-dom';
|
||||
import {Link as RouterLink, useHistory} from 'react-router-dom';
|
||||
import {AppBar, Toolbar, Grid, List, ListItem, ListItemText, Menu, MenuItem, IconButton, Theme} from "@mui/material";
|
||||
import MenuIcon from '@mui/icons-material/Menu';
|
||||
import HomeIcon from '@mui/icons-material/Home';
|
||||
import {makeStyles} from "@material-ui/styles";
|
||||
import {logout} from '../../actions/user-actions';
|
||||
import {useState} from "react";
|
||||
|
@ -14,10 +15,23 @@ const useStyles = makeStyles((theme: Theme) => ({
|
|||
backgroundColor: '#3f51b5',
|
||||
position: 'static',
|
||||
},
|
||||
leftSideNavBarList: {
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
padding: 0
|
||||
},
|
||||
rightSideNavBarList: {
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
padding: 0
|
||||
},
|
||||
homeButton: {
|
||||
marginLeft: 1
|
||||
},
|
||||
appBarToolbar: {
|
||||
},
|
||||
menuButton: {
|
||||
marginRight: theme.spacing(2)
|
||||
//marginRight: 1
|
||||
},
|
||||
menuLoginButton: {
|
||||
position: 'relative',
|
||||
|
@ -28,6 +42,7 @@ const useStyles = makeStyles((theme: Theme) => ({
|
|||
}));
|
||||
|
||||
export const Header = () => {
|
||||
const history = useHistory();
|
||||
const userLogin = useSelector((state: any) => state.userLogin);
|
||||
const {userInfo} = userLogin;
|
||||
const dispatch = useDispatch();
|
||||
|
@ -57,37 +72,45 @@ export const Header = () => {
|
|||
{userInfo ? (
|
||||
<Grid container justifyContent='space-between'>
|
||||
<Grid item>
|
||||
<List>
|
||||
<IconButton
|
||||
edge="start"
|
||||
className={classes.menuButton}
|
||||
color="inherit"
|
||||
aria-label="menu"
|
||||
onClick={handleClick}
|
||||
>
|
||||
<MenuIcon></MenuIcon>
|
||||
</IconButton>
|
||||
<Menu
|
||||
id="fade-menu"
|
||||
anchorEl={anchorEl}
|
||||
keepMounted
|
||||
open={open}
|
||||
onClose={handleClose}
|
||||
>
|
||||
<MenuItem component={RouterLink} to={'/'} key={'home'} onClick={handleClose}>Home</MenuItem>
|
||||
<MenuItem component={RouterLink} to={'/user-details'} key={'user-details'} onClick={handleClose}>Profile</MenuItem>
|
||||
<MenuItem component={RouterLink} to={'/geo-map'} key={'geo-map'} onClick={handleClose}>Map</MenuItem>
|
||||
</Menu>
|
||||
<List className={classes.leftSideNavBarList}>
|
||||
<ListItem>
|
||||
<IconButton
|
||||
edge="start"
|
||||
className={classes.menuButton}
|
||||
color="inherit"
|
||||
aria-label="menu"
|
||||
onClick={handleClick}
|
||||
>
|
||||
<MenuIcon></MenuIcon>
|
||||
</IconButton>
|
||||
<Menu
|
||||
id="fade-menu"
|
||||
anchorEl={anchorEl}
|
||||
keepMounted
|
||||
open={open}
|
||||
onClose={handleClose}
|
||||
>
|
||||
<MenuItem component={RouterLink} to={'/'} key={'home'} onClick={handleClose}>Home</MenuItem>
|
||||
<MenuItem component={RouterLink} to={'/user-details'} key={'user-details'} onClick={handleClose}>Profile</MenuItem>
|
||||
<MenuItem component={RouterLink} to={'/geo-map'} key={'geo-map'} onClick={handleClose}>Map</MenuItem>
|
||||
</Menu>
|
||||
</ListItem>
|
||||
</List>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<List style={{ display: 'flex', flexDirection: 'row', padding: 0 }}>
|
||||
<ListItem button component={RouterLink} to={'/user-details'} key={'user-details'} >
|
||||
<ListItemText>Profile</ListItemText>
|
||||
</ListItem>
|
||||
<List className={classes.rightSideNavBarList}>
|
||||
<ListItem button component={RouterLink} to={'/login'} key={'login'} onClick={logoutHandler}>
|
||||
<ListItemText>Logout</ListItemText>
|
||||
</ListItem>
|
||||
<ListItem>
|
||||
<IconButton
|
||||
className={classes.homeButton}
|
||||
color="inherit"
|
||||
onClick={() => history.push({pathname: '/'})}
|
||||
>
|
||||
<HomeIcon></HomeIcon>
|
||||
</IconButton>
|
||||
</ListItem>
|
||||
</List>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
@ -109,16 +132,17 @@ export const Header = () => {
|
|||
}
|
||||
|
||||
/*
|
||||
<Grid container justify='space-between'>
|
||||
<Link color="inherit" className={classes.menuLoginButton}>Login</Link>
|
||||
<Grid item>
|
||||
<List style={{ display: 'flex', flexDirection: 'row', padding: 0 }}>
|
||||
<ListItem button component={RouterLink} to={'/user-details'} key={'user-details'} >
|
||||
<ListItemText>Profile</ListItemText>
|
||||
</ListItem>
|
||||
<ListItem button component={RouterLink} to={'/login'} key={'login'} onClick={logoutHandler}>
|
||||
<ListItemText>Logout</ListItemText>
|
||||
</ListItem>
|
||||
</List>
|
||||
</Grid>
|
||||
*/
|
||||
|
||||
/*
|
||||
<IconButton edge="start" className={classes.menuButton} color="inherit" aria-label="menu">
|
||||
<Menu/>
|
||||
</IconButton>
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -3,17 +3,19 @@ import {Spinner} from 'react-bootstrap';
|
|||
|
||||
export const Loader = () => {
|
||||
return (
|
||||
<Spinner
|
||||
animation={"border"}
|
||||
role={"status"}
|
||||
style={{
|
||||
height: '100px',
|
||||
width: '100px',
|
||||
margin: 'auto',
|
||||
display: 'block'
|
||||
}}
|
||||
>
|
||||
<span className={'sr-only'}>Loading...</span>
|
||||
</Spinner>
|
||||
<div style={{marginTop: '10vh'}}>
|
||||
<Spinner
|
||||
animation={"border"}
|
||||
role={"status"}
|
||||
style={{
|
||||
height: '100px',
|
||||
width: '100px',
|
||||
margin: 'auto',
|
||||
display: 'block'
|
||||
}}
|
||||
>
|
||||
<span className={'sr-only'}>Loading...</span>
|
||||
</Spinner>
|
||||
</div>
|
||||
)
|
||||
}
|
|
@ -1,98 +0,0 @@
|
|||
import {Grid, Button, Theme} from "@mui/material";
|
||||
import NumericInput from 'react-numeric-input';
|
||||
import React from "react";
|
||||
import {makeStyles} from "@material-ui/styles";
|
||||
import {useSelector} from "react-redux";
|
||||
|
||||
const useStyles = makeStyles((theme: Theme) => ({
|
||||
Neighbourhood: {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
padding: 0,
|
||||
marginLeft: "5vw",
|
||||
spacing: 0,
|
||||
justifyContent : 'center',
|
||||
direction: 'initial',
|
||||
marginTop: '4vh'
|
||||
},
|
||||
NeighbourhoodInfo: {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
},
|
||||
Status: {
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
},
|
||||
StatusInput: {
|
||||
|
||||
},
|
||||
Responsible: {
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
}
|
||||
}));
|
||||
|
||||
export const NeighbourhoodInfo = ({neighbourhood}: {neighbourhood: SelectedNeighbourhood}) => {
|
||||
|
||||
const latestElection = useSelector((state: State) => state.latestElection)
|
||||
const userLogin = useSelector((state: State) => state.userLogin);
|
||||
const {userInfo} = userLogin;
|
||||
const classes = useStyles();
|
||||
const subscribeToNeighbourhood = () => {
|
||||
console.log(`userInfo.username: ${userInfo.username}`);
|
||||
console.log(`selected neighbourhood: ${neighbourhood.code}`);
|
||||
console.log(`election id: ${latestElection.election._id}`);
|
||||
}
|
||||
|
||||
return (
|
||||
<Grid container className={classes.Neighbourhood}>
|
||||
<Grid item>
|
||||
<h2>geselecteerde buurt</h2>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<Grid container className={classes.NeighbourhoodInfo}>
|
||||
<Grid item>
|
||||
<h5>buurt: {neighbourhood.name}</h5>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<h5>code: {neighbourhood.code}</h5>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
{ neighbourhood.responsible && userInfo.username === neighbourhood.responsible ?
|
||||
<Grid container className={classes.Status}>
|
||||
<Grid item><h5>Status:</h5></Grid>
|
||||
<Grid style={{marginLeft: "1vw"}}><NumericInput min={0} max={100} value={Math.round(neighbourhood.status*100)} size={4}/></Grid>
|
||||
<Grid item><h5>%</h5></Grid>
|
||||
</Grid>
|
||||
:
|
||||
<Grid container className={classes.Status}>
|
||||
<Grid item><h5>Status: {neighbourhood.status} %</h5></Grid>
|
||||
</Grid>
|
||||
}
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<h5>inwoners: {neighbourhood.residents}</h5>
|
||||
</Grid>
|
||||
{
|
||||
neighbourhood.responsible ?
|
||||
<Grid item><h5>verantwoordelijke: {neighbourhood.responsible}</h5></Grid>
|
||||
:
|
||||
<Grid item className={classes.Responsible}>
|
||||
<h5>verantwoordelijke:</h5>
|
||||
<Button
|
||||
variant="contained"
|
||||
color="primary"
|
||||
style={{marginLeft: "1vw"}}
|
||||
onClick={subscribeToNeighbourhood}
|
||||
>inschrijven</Button>
|
||||
</Grid>
|
||||
}
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
)
|
||||
}
|
||||
|
||||
//ToDo 2. Nobody responsible -> option to become responsible for the leaflets (if leaflet == true)
|
||||
|
||||
//<Grid item><Input value={Math.round(neighbourhood.status*100)} placeholder="Placeholder" className={classes.StatusInput} /></Grid>
|
|
@ -0,0 +1,24 @@
|
|||
import axios from "axios";
|
||||
|
||||
export const updateElectionNeighbourhoodResponsible = async (userInfo: UserInfo, updateInfo: { electionNeighbourhoodId: number }) => {
|
||||
const config = {
|
||||
headers: {
|
||||
'Content-type': 'application/json',
|
||||
Authorization: `Bearer ${userInfo.access}`
|
||||
}
|
||||
}
|
||||
const {data} = await axios.post(`/api/update-responsible`, updateInfo, config)
|
||||
return data;
|
||||
}
|
||||
|
||||
export const updateElectionNeighbourhoodStatus = async (userInfo: UserInfo, updateInfo: { electionNeighbourhoodId: number, status: number }) => {
|
||||
const config = {
|
||||
headers: {
|
||||
'Content-type': 'application/json',
|
||||
Authorization: `Bearer ${userInfo.access}`
|
||||
}
|
||||
}
|
||||
const {data} = await axios.post(`/api/update-status`, updateInfo, config)
|
||||
return data;
|
||||
}
|
||||
|
|
@ -1,13 +1,13 @@
|
|||
import React, {useEffect} from 'react';
|
||||
import { BrowserRouter as Router, Route} from 'react-router-dom'; //Switch //Redirect
|
||||
import {CssBaseline, createMuiTheme, MuiThemeProvider, Container} from "@material-ui/core";
|
||||
import { BrowserRouter as Router, Route} from 'react-router-dom';
|
||||
import {CssBaseline, ThemeProvider, Container, Toolbar, createTheme} from '@mui/material';
|
||||
import 'bootstrap/dist/css/bootstrap.min.css'
|
||||
import {Header} from "../components/Header";
|
||||
import {Login} from "./Login";
|
||||
import {Profile} from "./Profile";
|
||||
import {GeoMap} from "./GeoMap";
|
||||
|
||||
const THEME = createMuiTheme({
|
||||
const THEME = createTheme({
|
||||
typography: {
|
||||
fontFamily: `"Roboto, sans-serif"`,
|
||||
fontSize: 12,
|
||||
|
@ -24,10 +24,11 @@ export const App = () => {
|
|||
}, [])
|
||||
|
||||
return (
|
||||
<MuiThemeProvider theme={THEME}>
|
||||
<ThemeProvider theme={THEME}>
|
||||
<Router>
|
||||
<CssBaseline />
|
||||
<Header />
|
||||
<Toolbar />
|
||||
<main>
|
||||
<Container>
|
||||
<Route path={'/login'} component={Login} exact/>
|
||||
|
@ -36,42 +37,6 @@ export const App = () => {
|
|||
</Container>
|
||||
</main>
|
||||
</Router>
|
||||
</MuiThemeProvider>
|
||||
</ThemeProvider>
|
||||
)
|
||||
}
|
||||
|
||||
/*
|
||||
import React, {useEffect} from "react";
|
||||
import {useDispatch, useSelector} from 'react-redux';
|
||||
import {listDepartments} from '../actions/test-actions';
|
||||
import {Loader} from "../components/Loader";
|
||||
import 'bootstrap/dist/css/bootstrap.min.css'
|
||||
import {AlertMessage} from "../components/Alert";
|
||||
|
||||
const dispatch = useDispatch();
|
||||
const departmentList: any = useSelector((state: any) => state.departmentList)
|
||||
const {error, loading, departments} = departmentList;
|
||||
|
||||
export const App = () => {
|
||||
useEffect(() => {
|
||||
dispatch(listDepartments)
|
||||
}, [dispatch])
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h1>Departments</h1>
|
||||
{
|
||||
loading ?
|
||||
<Loader />
|
||||
: error ?
|
||||
<AlertMessage variant={'danger'}>{error}</AlertMessage>
|
||||
:
|
||||
departments.map((department: any) => (
|
||||
<p key={department._id}>{department.name}</p>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
)
|
||||
//departments for the current user
|
||||
}
|
||||
*/
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
import React, {useEffect, useState} from 'react';
|
||||
import neighbourhoods from '../data/buurten-amsterdam.json';
|
||||
import {Grid, Theme} from "@mui/material";
|
||||
import {Button, Grid, Theme, TextField} from "@mui/material";
|
||||
import {makeStyles} from "@material-ui/styles";
|
||||
import {GeoJSON, MapContainer, TileLayer} from 'react-leaflet';
|
||||
import 'leaflet/dist/leaflet.css';
|
||||
|
@ -8,7 +8,7 @@ import {getLatestElection} from "../actions/election-actions";
|
|||
import {useDispatch, useSelector} from "react-redux";
|
||||
import {AlertMessage} from "../components/Alert";
|
||||
import {Loader} from "../components/Loader";
|
||||
import {NeighbourhoodInfo} from "../components/NeighbourhoodInfo";
|
||||
import {updateElectionNeighbourhoodResponsible, updateElectionNeighbourhoodStatus} from "../requests/updates";
|
||||
|
||||
const useStyles = makeStyles((theme: Theme) => ({
|
||||
GeoMapContainer: {
|
||||
|
@ -17,60 +17,109 @@ const useStyles = makeStyles((theme: Theme) => ({
|
|||
direction: 'initial',
|
||||
marginTop: '4vh'
|
||||
},
|
||||
Neighbourhood: {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
padding: 0,
|
||||
marginLeft: "5vw",
|
||||
spacing: 0,
|
||||
justifyContent : 'center',
|
||||
direction: 'initial',
|
||||
marginTop: '4vh'
|
||||
},
|
||||
NeighbourhoodInfo: {
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
},
|
||||
Status: {
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
},
|
||||
StatusInput: {
|
||||
|
||||
},
|
||||
Responsible: {
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
}
|
||||
}));
|
||||
|
||||
export const GeoMap = ({Location, history}: {Location: any, history: any}) => {
|
||||
|
||||
const [selectedNeighbourhood, setSelectedNeighbourhood] = useState<SelectedNeighbourhood>();
|
||||
|
||||
const dispatch = useDispatch();
|
||||
const userLogin = useSelector((state: State) => state.userLogin);
|
||||
const {userInfo} = userLogin;
|
||||
|
||||
const [selectedElectionNeighbourhood, setSelectedElectionNeighbourhood] = useState<ElectionNeighbourhood>();
|
||||
|
||||
const latestElection = useSelector((state: State) => state.latestElection)
|
||||
const {error, loading, election} = latestElection;
|
||||
|
||||
const mapData: any = neighbourhoods.features;
|
||||
const classes = useStyles();
|
||||
//const fillBlueOptions = { fillColor: 'blue' }
|
||||
|
||||
useEffect(() => {
|
||||
console.log(neighbourhoods);
|
||||
dispatch(getLatestElection)
|
||||
}, [history, dispatch])
|
||||
|
||||
useEffect(() => {
|
||||
console.log(selectedNeighbourhood);
|
||||
}, [selectedNeighbourhood])
|
||||
|
||||
const onEachNeighbourhood = (neighbourhood: any, layer: any) => {
|
||||
selectedElectionNeighbourhood && console.log(`selectedNeighbourhood id: ${selectedElectionNeighbourhood._id} responsible: ${selectedElectionNeighbourhood.responsible}`);
|
||||
if(selectedElectionNeighbourhood){
|
||||
election.election_to_neighbourhood = election.election_to_neighbourhood.filter(function( electionNeighbourhood: ElectionNeighbourhood ) {
|
||||
return electionNeighbourhood._id !== selectedElectionNeighbourhood._id;
|
||||
});
|
||||
election.election_to_neighbourhood.push(selectedElectionNeighbourhood);
|
||||
}
|
||||
}, [selectedElectionNeighbourhood, election]);
|
||||
|
||||
const onEachElectionNeighbourhood = (neighbourhood: any, layer: any) => {
|
||||
const electionNeighbourhood: ElectionNeighbourhood = election.election_to_neighbourhood.find(x => x.neighbourhood.code === neighbourhood.properties.Buurt_code) as ElectionNeighbourhood;
|
||||
if(electionNeighbourhood){
|
||||
layer.options.fillOpacity = Number(electionNeighbourhood.status)
|
||||
layer.bindPopup(`${neighbourhood.properties.Buurt} ${Math.round(Number(electionNeighbourhood.status)*100)}%`)
|
||||
layer.bindPopup(`${neighbourhood.properties.Buurt}`)
|
||||
}
|
||||
layer.on({
|
||||
click: (event: any) => {
|
||||
const code = event.target.feature.properties.Buurt_code;
|
||||
const electionNeighbourhood: ElectionNeighbourhood = election.election_to_neighbourhood.find(x => x.neighbourhood.code === code) as ElectionNeighbourhood;
|
||||
if(electionNeighbourhood){
|
||||
const {flyer, status, responsible, neighbourhood} = electionNeighbourhood;
|
||||
const {name, district, residents, township } = neighbourhood;
|
||||
const newSelectedNeighbourhood: SelectedNeighbourhood = {code, district, flyer, name, residents, responsible, status: Number(status), township};
|
||||
setSelectedNeighbourhood(newSelectedNeighbourhood);
|
||||
}
|
||||
setSelectedElectionNeighbourhood(electionNeighbourhood);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const subscribeToNeighbourhood = () => {
|
||||
if(selectedElectionNeighbourhood){
|
||||
const updateInfo: { electionNeighbourhoodId: number } = {
|
||||
electionNeighbourhoodId: selectedElectionNeighbourhood._id
|
||||
}
|
||||
updateElectionNeighbourhoodResponsible(userInfo, updateInfo).then((updatedElectionNeighbourhood: ElectionNeighbourhood) => {
|
||||
setSelectedElectionNeighbourhood(updatedElectionNeighbourhood);
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const changeNeighbourhoodStatus = (percentage: number, selectedElectionNeighbourhood: ElectionNeighbourhood) => {
|
||||
if(selectedElectionNeighbourhood) {
|
||||
const updateInfo: { electionNeighbourhoodId: number, status: number } = {
|
||||
electionNeighbourhoodId: selectedElectionNeighbourhood._id,
|
||||
status: Math.round(percentage)/100
|
||||
}
|
||||
updateElectionNeighbourhoodStatus(userInfo, updateInfo).then((updatedElectionNeighbourhood: ElectionNeighbourhood) => {
|
||||
setSelectedElectionNeighbourhood(updatedElectionNeighbourhood);
|
||||
})
|
||||
//setSelectedElectionNeighbourhood({...selectedElectionNeighbourhood, status: (Math.round(percentage) / 100)})
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<div>
|
||||
{error && <AlertMessage variant={'danger'}>{error}</AlertMessage>}
|
||||
{loading && <Loader />}
|
||||
{loading && <Loader/>}
|
||||
{election &&
|
||||
<Grid container className={classes.GeoMapContainer} style={{display: 'flex', flexDirection: 'row', padding: 0}}>
|
||||
<Grid item>
|
||||
<Grid item xs={8}>
|
||||
<Grid container className={classes.GeoMapContainer} style={{display: 'flex', flexDirection: 'column', padding: 0}}>
|
||||
<Grid item>
|
||||
<h2>{election.name}</h2>
|
||||
<Grid item marginBottom={'2vh'}>
|
||||
<h2><b>{election.name}</b></h2>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<MapContainer style={{height: "70vh", width: "70vh"}}
|
||||
|
@ -79,20 +128,95 @@ export const GeoMap = ({Location, history}: {Location: any, history: any}) => {
|
|||
scrollWheelZoom={false}
|
||||
>
|
||||
<TileLayer
|
||||
attribution='© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
|
||||
attribution='© <a href="https://osm.org/copyright">OpenStreetMap</a> contributors'
|
||||
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
|
||||
/>
|
||||
<GeoJSON
|
||||
data={mapData}
|
||||
onEachFeature={onEachNeighbourhood}
|
||||
onEachFeature={onEachElectionNeighbourhood}
|
||||
/>
|
||||
</MapContainer>
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<Grid item xs={4}>
|
||||
{
|
||||
selectedNeighbourhood && <NeighbourhoodInfo neighbourhood={selectedNeighbourhood} />
|
||||
selectedElectionNeighbourhood &&
|
||||
<Grid container className={classes.Neighbourhood}>
|
||||
<Grid item marginBottom={'2vh'}>
|
||||
<h2><b>geselecteerde buurt</b></h2>
|
||||
</Grid>
|
||||
<Grid item>
|
||||
<Grid container className={classes.NeighbourhoodInfo} spacing={3}>
|
||||
<Grid item xs={12}>
|
||||
<Grid container>
|
||||
<Grid item xs={4}><h5>Buurt:</h5></Grid>
|
||||
<Grid item xs={8}><h6>{selectedElectionNeighbourhood.neighbourhood.name}</h6></Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<Grid container>
|
||||
<Grid item xs={4}><h5>Code</h5></Grid>
|
||||
<Grid item xs={8}><h6>{selectedElectionNeighbourhood.neighbourhood.code}</h6></Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
{
|
||||
userInfo.username === selectedElectionNeighbourhood.responsible ?
|
||||
<Grid container className={classes.Status}>
|
||||
<Grid item xs={4}><h5>Status:</h5></Grid>
|
||||
<Grid item xs={8}>
|
||||
<TextField
|
||||
id={"standard-number"}
|
||||
label={"% done"}
|
||||
type={"number"}
|
||||
InputLabelProps={{
|
||||
shrink: true,
|
||||
}}
|
||||
size={'small'}
|
||||
variant={'standard'}
|
||||
value={(Math.round(selectedElectionNeighbourhood.status*100))}
|
||||
onChange={(event) => changeNeighbourhoodStatus(Number(event.target.value), selectedElectionNeighbourhood)}
|
||||
/>
|
||||
</Grid>
|
||||
</Grid>
|
||||
:
|
||||
<Grid container className={classes.Status}>
|
||||
<Grid item xs={4}><h5>Status:</h5></Grid>
|
||||
<Grid item xs={8}><h6>{Math.round(selectedElectionNeighbourhood.status*100)} %</h6></Grid>
|
||||
</Grid>
|
||||
}
|
||||
</Grid>
|
||||
<Grid item xs={12}>
|
||||
<Grid container>
|
||||
<Grid item xs={4}><h5>Inwoners</h5></Grid>
|
||||
<Grid item xs={8}><h6>{selectedElectionNeighbourhood.neighbourhood.residents}</h6></Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
{
|
||||
selectedElectionNeighbourhood.responsible ?
|
||||
<Grid item xs={12}>
|
||||
<Grid container>
|
||||
<Grid item xs={4}><h5>Eigenaar</h5></Grid>
|
||||
<Grid item xs={8}><h6>{selectedElectionNeighbourhood.responsible}</h6></Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
:
|
||||
<Grid item className={classes.Responsible} xs={12}>
|
||||
<Grid item xs={4}><h5>Eigenaar</h5></Grid>
|
||||
<Grid item xs={8}>
|
||||
<Button
|
||||
variant="contained"
|
||||
color="primary"
|
||||
style={{marginLeft: "1vw"}}
|
||||
onClick={subscribeToNeighbourhood}
|
||||
>inschrijven</Button>
|
||||
</Grid>
|
||||
</Grid>
|
||||
}
|
||||
</Grid>
|
||||
</Grid>
|
||||
</Grid>
|
||||
}
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
|
|
@ -19,10 +19,11 @@ type Election = {
|
|||
}
|
||||
|
||||
type ElectionNeighbourhood = {
|
||||
_id: number,
|
||||
neighbourhood: Neighbourhood,
|
||||
responsible: string | null,
|
||||
flyer: boolean,
|
||||
status: string
|
||||
status: number
|
||||
}
|
||||
|
||||
type Neighbourhood = {
|
||||
|
@ -34,16 +35,18 @@ type Neighbourhood = {
|
|||
township: string
|
||||
}
|
||||
|
||||
type UserInfo = {
|
||||
refresh: string,
|
||||
access: string,
|
||||
username: string,
|
||||
email: string,
|
||||
id: number
|
||||
}
|
||||
|
||||
type UserLogin = {
|
||||
loading: boolean,
|
||||
error: string
|
||||
userInfo: {
|
||||
refresh: string,
|
||||
access: string,
|
||||
username: string,
|
||||
email: string,
|
||||
id: number
|
||||
}
|
||||
userInfo: UserInfo
|
||||
}
|
||||
|
||||
type UserDetails = {
|
||||
|
@ -67,6 +70,7 @@ type Member = {
|
|||
}
|
||||
|
||||
type SelectedNeighbourhood = {
|
||||
_id: number,
|
||||
name: string,
|
||||
code: string,
|
||||
district: string,
|
||||
|
@ -75,4 +79,11 @@ type SelectedNeighbourhood = {
|
|||
responsible: string | null,
|
||||
flyer: boolean,
|
||||
status: number
|
||||
}
|
||||
|
||||
type UpdatedNeighbourhood = {
|
||||
neighbourhood: Neighbourhood,
|
||||
responsible: string,
|
||||
flyer: boolean,
|
||||
status: number
|
||||
}
|
112
yarn.lock
112
yarn.lock
|
@ -1193,6 +1193,16 @@
|
|||
source-map "^0.5.7"
|
||||
stylis "^4.0.3"
|
||||
|
||||
"@emotion/cache@^10.0.27":
|
||||
version "10.0.29"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0"
|
||||
integrity sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==
|
||||
dependencies:
|
||||
"@emotion/sheet" "0.9.4"
|
||||
"@emotion/stylis" "0.8.5"
|
||||
"@emotion/utils" "0.11.3"
|
||||
"@emotion/weak-memoize" "0.2.5"
|
||||
|
||||
"@emotion/cache@^11.5.0":
|
||||
version "11.5.0"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.5.0.tgz#a5eb78cbef8163939ee345e3ddf0af217b845e62"
|
||||
|
@ -1204,7 +1214,28 @@
|
|||
"@emotion/weak-memoize" "^0.2.5"
|
||||
stylis "^4.0.10"
|
||||
|
||||
"@emotion/hash@^0.8.0":
|
||||
"@emotion/core@^10.0.14":
|
||||
version "10.1.1"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/core/-/core-10.1.1.tgz#c956c1365f2f2481960064bcb8c4732e5fb612c3"
|
||||
integrity sha512-ZMLG6qpXR8x031NXD8HJqugy/AZSkAuMxxqB46pmAR7ze47MhNJ56cdoX243QPZdGctrdfo+s08yZTiwaUcRKA==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.5.5"
|
||||
"@emotion/cache" "^10.0.27"
|
||||
"@emotion/css" "^10.0.27"
|
||||
"@emotion/serialize" "^0.11.15"
|
||||
"@emotion/sheet" "0.9.4"
|
||||
"@emotion/utils" "0.11.3"
|
||||
|
||||
"@emotion/css@^10.0.27":
|
||||
version "10.0.27"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/css/-/css-10.0.27.tgz#3a7458198fbbebb53b01b2b87f64e5e21241e14c"
|
||||
integrity sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==
|
||||
dependencies:
|
||||
"@emotion/serialize" "^0.11.15"
|
||||
"@emotion/utils" "0.11.3"
|
||||
babel-plugin-emotion "^10.0.27"
|
||||
|
||||
"@emotion/hash@0.8.0", "@emotion/hash@^0.8.0":
|
||||
version "0.8.0"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
|
||||
integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
|
||||
|
@ -1216,6 +1247,11 @@
|
|||
dependencies:
|
||||
"@emotion/memoize" "^0.7.4"
|
||||
|
||||
"@emotion/memoize@0.7.4":
|
||||
version "0.7.4"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
|
||||
integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
|
||||
|
||||
"@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5":
|
||||
version "0.7.5"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50"
|
||||
|
@ -1234,6 +1270,17 @@
|
|||
"@emotion/weak-memoize" "^0.2.5"
|
||||
hoist-non-react-statics "^3.3.1"
|
||||
|
||||
"@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16":
|
||||
version "0.11.16"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad"
|
||||
integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==
|
||||
dependencies:
|
||||
"@emotion/hash" "0.8.0"
|
||||
"@emotion/memoize" "0.7.4"
|
||||
"@emotion/unitless" "0.7.5"
|
||||
"@emotion/utils" "0.11.3"
|
||||
csstype "^2.5.7"
|
||||
|
||||
"@emotion/serialize@^1.0.2":
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.2.tgz#77cb21a0571c9f68eb66087754a65fa97bfcd965"
|
||||
|
@ -1245,6 +1292,11 @@
|
|||
"@emotion/utils" "^1.0.0"
|
||||
csstype "^3.0.2"
|
||||
|
||||
"@emotion/sheet@0.9.4":
|
||||
version "0.9.4"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5"
|
||||
integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==
|
||||
|
||||
"@emotion/sheet@^1.0.3":
|
||||
version "1.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.0.3.tgz#00c326cd7985c5ccb8fe2c1b592886579dcfab8f"
|
||||
|
@ -1261,17 +1313,27 @@
|
|||
"@emotion/serialize" "^1.0.2"
|
||||
"@emotion/utils" "^1.0.0"
|
||||
|
||||
"@emotion/unitless@^0.7.5":
|
||||
"@emotion/stylis@0.8.5":
|
||||
version "0.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04"
|
||||
integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==
|
||||
|
||||
"@emotion/unitless@0.7.5", "@emotion/unitless@^0.7.5":
|
||||
version "0.7.5"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
|
||||
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
|
||||
|
||||
"@emotion/utils@0.11.3":
|
||||
version "0.11.3"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924"
|
||||
integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==
|
||||
|
||||
"@emotion/utils@^1.0.0":
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.0.0.tgz#abe06a83160b10570816c913990245813a2fd6af"
|
||||
integrity sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==
|
||||
|
||||
"@emotion/weak-memoize@^0.2.5":
|
||||
"@emotion/weak-memoize@0.2.5", "@emotion/weak-memoize@^0.2.5":
|
||||
version "0.2.5"
|
||||
resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
|
||||
integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
|
||||
|
@ -3005,6 +3067,22 @@ babel-plugin-dynamic-import-node@^2.3.3:
|
|||
dependencies:
|
||||
object.assign "^4.1.0"
|
||||
|
||||
babel-plugin-emotion@^10.0.27:
|
||||
version "10.2.2"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz#a1fe3503cff80abfd0bdda14abd2e8e57a79d17d"
|
||||
integrity sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==
|
||||
dependencies:
|
||||
"@babel/helper-module-imports" "^7.0.0"
|
||||
"@emotion/hash" "0.8.0"
|
||||
"@emotion/memoize" "0.7.4"
|
||||
"@emotion/serialize" "^0.11.16"
|
||||
babel-plugin-macros "^2.0.0"
|
||||
babel-plugin-syntax-jsx "^6.18.0"
|
||||
convert-source-map "^1.5.0"
|
||||
escape-string-regexp "^1.0.5"
|
||||
find-root "^1.1.0"
|
||||
source-map "^0.5.7"
|
||||
|
||||
babel-plugin-istanbul@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765"
|
||||
|
@ -3026,7 +3104,7 @@ babel-plugin-jest-hoist@^26.6.2:
|
|||
"@types/babel__core" "^7.0.0"
|
||||
"@types/babel__traverse" "^7.0.6"
|
||||
|
||||
babel-plugin-macros@2.8.0, babel-plugin-macros@^2.6.1:
|
||||
babel-plugin-macros@2.8.0, babel-plugin-macros@^2.0.0, babel-plugin-macros@^2.6.1:
|
||||
version "2.8.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138"
|
||||
integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==
|
||||
|
@ -3040,6 +3118,11 @@ babel-plugin-named-asset-import@^0.3.7:
|
|||
resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz#156cd55d3f1228a5765774340937afc8398067dd"
|
||||
integrity sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw==
|
||||
|
||||
babel-plugin-syntax-jsx@^6.18.0:
|
||||
version "6.18.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
|
||||
integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=
|
||||
|
||||
babel-plugin-syntax-object-rest-spread@^6.8.0:
|
||||
version "6.13.0"
|
||||
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
|
||||
|
@ -4305,7 +4388,7 @@ cssstyle@^2.2.0:
|
|||
dependencies:
|
||||
cssom "~0.3.6"
|
||||
|
||||
csstype@^2.5.2:
|
||||
csstype@^2.5.2, csstype@^2.5.7:
|
||||
version "2.6.18"
|
||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.18.tgz#980a8b53085f34af313410af064f2bd241784218"
|
||||
integrity sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ==
|
||||
|
@ -7638,6 +7721,11 @@ map-visit@^1.0.0:
|
|||
dependencies:
|
||||
object-visit "^1.0.0"
|
||||
|
||||
material-ui-numeric-input@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/material-ui-numeric-input/-/material-ui-numeric-input-3.0.2.tgz#dfc4ec5006d23b4f4416d487e6dbc35b53a11024"
|
||||
integrity sha512-PO+0hO4pNIiDWXlcQEJMi64BZOLXP4jjElBlSsPaXA//+6nIhgy65zAV7QL9/h5h/SlZazbFUsXeCqj8Df1w2A==
|
||||
|
||||
md5.js@^1.3.4:
|
||||
version "1.3.5"
|
||||
resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
|
||||
|
@ -9655,6 +9743,15 @@ react-error-overlay@^6.0.9:
|
|||
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a"
|
||||
integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==
|
||||
|
||||
react-input-number@^5.0.19:
|
||||
version "5.0.19"
|
||||
resolved "https://registry.yarnpkg.com/react-input-number/-/react-input-number-5.0.19.tgz#3ce3e9522190c908a0f616364ca735914648c83c"
|
||||
integrity sha512-Aa9RmOoOgzCn6b/RYyrKRkBtIWGum6v9sA73rJFtl9N0O3kjWrAdj9lk09n9QoOaxvyEHc3GQZwLcUrBEIH2Cw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.5.5"
|
||||
"@emotion/core" "^10.0.14"
|
||||
lodash "^4.17.15"
|
||||
|
||||
react-is@^16.13.1, react-is@^16.3.2, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1:
|
||||
version "16.13.1"
|
||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
|
||||
|
@ -9682,11 +9779,6 @@ react-lifecycles-compat@^3.0.4:
|
|||
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
|
||||
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
|
||||
|
||||
react-numeric-input@^2.2.3:
|
||||
version "2.2.3"
|
||||
resolved "https://registry.yarnpkg.com/react-numeric-input/-/react-numeric-input-2.2.3.tgz#4bf5918c3eafed851a80df1eb992d941002bb552"
|
||||
integrity sha1-S/WRjD6v7YUagN8euZLZQQArtVI=
|
||||
|
||||
react-overlays@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.0.1.tgz#7e2c3cd3c0538048b0b7451d203b1289c561b7f2"
|
||||
|
|
Loading…
Reference in New Issue