Compare commits

...

5 Commits

Author SHA1 Message Date
Christiaan Evers f8b0a2d0aa update status function added. 2021-11-10 01:18:21 +01:00
Christiaan Evers a887b0d690 changes to electionNeighbourhood with _id 2021-11-10 00:28:20 +01:00
Christiaan Evers 1b63c0136f changing the status % should also change the geo map statistics.. 2021-11-02 15:50:40 +01:00
Christiaan Evers 71a60a6822 small change in neighbourhoodinfo 2021-11-02 12:58:06 +01:00
Christiaan Evers a37e3596e9 header update 2021-10-31 22:48:09 +01:00
10 changed files with 379 additions and 238 deletions

View File

@ -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>

View File

@ -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",

View File

@ -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>
*/

View File

@ -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>
)
}

View File

@ -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>

View File

@ -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;
}

View File

@ -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
}
*/
}

View File

@ -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='&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
attribution='&copy; <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>

View File

@ -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
View File

@ -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"