Skip to content
This repository has been archived by the owner on Sep 13, 2023. It is now read-only.

Commit

Permalink
Merge pull request #19 from GispoCoding/15_basicui
Browse files Browse the repository at this point in the history
15_basicui
  • Loading branch information
Joonalai committed Aug 4, 2020
2 parents ccfe1a2 + 38bd67d commit 852b9ab
Show file tree
Hide file tree
Showing 10 changed files with 515 additions and 10 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,4 @@ yarn-debug.log*
yarn-error.log*

.vscode
.idea
4 changes: 4 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/styles": "^4.10.0",
"@material-ui/types": "^5.1.0",
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^10.4.5",
"@testing-library/user-event": "^7.2.1",
Expand Down
10 changes: 9 additions & 1 deletion src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React, { useState, useEffect } from 'react';
import './App.css';
import MapComponent from './components/mapcomponent';
import MainUI from './components/mainui';
import getCapabilities from './services/getcapabilities';
import { Capabilities, Basemaps, Tileset } from './types';

Expand All @@ -10,24 +11,31 @@ function App() {
const [basemaps, setBasemaps] = useState<Basemaps>();
const [tilesets, setTilesets] = useState<Tileset[]>([]);

// Get capabilities document from backend
useEffect(() => {
getCapabilities()
.then((response) => {
setCapabilities(response);
});
}, []);

// Set basemaps and tilesets
useEffect(() => {
if (capabilities) {
setBasemaps(capabilities!.basemaps);
setTilesets(capabilities!.tilesets);
setLoading(false);
}
}, [capabilities]);

// Unset loading when ready
useEffect(() => {
if (basemaps && tilesets) { setLoading(false); }
}, [basemaps, tilesets]);

if (loading) { return <div>Loading...</div>; }
return (
<div className="App">
<MainUI />
<MapComponent basemaps={basemaps!} tilesets={tilesets!} />
</div>
);
Expand Down
116 changes: 116 additions & 0 deletions src/components/header.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
import React from 'react';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import IconButton from '@material-ui/core/IconButton';
import Typography from '@material-ui/core/Typography';
import InputBase from '@material-ui/core/InputBase';
import {
createStyles, fade, Theme, makeStyles,
} from '@material-ui/core/styles';
import { Search, Settings } from '@material-ui/icons';
import { Grid } from '@material-ui/core';

const useStyles = makeStyles((theme: Theme) => createStyles({
root: {
backgroundColor: theme.palette.primary.main,
flexGrow: 1,
margin: '30px auto 0 auto',
pointerEvents: 'auto',
[theme.breakpoints.up('md')]: {
margin: '30px 30px 0 auto',
},
[theme.breakpoints.down('sm')]: {
paddingRight: 0,
},
},
menuButton: {
marginRight: theme.spacing(2),
},
title: {
marginLeft: '16px',
flexGrow: 1,
pointerEvents: 'none',
userSelect: 'none',
display: 'none',
[theme.breakpoints.up('sm')]: {
display: 'block',
},
},
search: {
position: 'relative',
borderRadius: theme.shape.borderRadius,
backgroundColor: fade(theme.palette.common.white, 0.15),
'&:hover': {
backgroundColor: fade(theme.palette.common.white, 0.25),
},
margin: '8px 0 8px 8px',
width: '100%',
[theme.breakpoints.up('sm')]: {
marginLeft: theme.spacing(1),
width: 'auto',
},
},
searchIcon: {
padding: theme.spacing(0, 2),
height: '100%',
position: 'absolute',
pointerEvents: 'none',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
},
inputRoot: {
color: 'inherit',
},
inputInput: {
padding: theme.spacing(2, 1, 2, 0),
// vertical padding + font size from searchIcon
paddingLeft: `calc(1em + ${theme.spacing(4)}px)`,
transition: theme.transitions.create('width'),
width: '100%',
[theme.breakpoints.up('sm')]: {
width: '12ch',
'&:focus': {
width: '20ch',
},
},
},
}));

export default function Header() {
const classes = useStyles();

return (
<Grid
className={classes.root}
item
md={6}
sm={11}
xs={12}
>
<AppBar position="static">
<Toolbar disableGutters>
<Typography className={classes.title} variant="h6" noWrap>
aukigo
</Typography>
<div className={classes.search}>
<div className={classes.searchIcon}>
<Search />
</div>
<InputBase
placeholder="Search…"
classes={{
root: classes.inputRoot,
input: classes.inputInput,
}}
inputProps={{ 'aria-label': 'search' }}
/>
</div>
<IconButton color="inherit">
<Settings />
</IconButton>
</Toolbar>
</AppBar>
</Grid>
);
}
78 changes: 78 additions & 0 deletions src/components/layerselector.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import React from 'react';
import {
Grid, makeStyles, createStyles, IconButton, Paper, Theme,
} from '@material-ui/core';
import {
AcUnit, Accessible, AccountBalance, AccountCircle, Apartment,
} from '@material-ui/icons';

const useStyles = makeStyles((theme: Theme) => (
createStyles({
root: {
backgroundColor: theme.palette.primary.main,
zIndex: 100,
margin: 'auto',
pointerEvents: 'auto',
flexGrow: 1,
[theme.breakpoints.up('md')]: {
position: 'absolute',
bottom: '30px',
right: '30px',
},
},
layerSelButton: {
minWidth: '100%',
},
})
));

export default function LayerSelector() {
const classes = useStyles();
return (
<Grid
alignItems="center"
className={classes.root}
container
direction="row"
justify="space-evenly"
spacing={3}
md={6}
sm={11}
xs={12}
>
<Grid item xs>
<Paper>
<IconButton className={classes.layerSelButton}>
<AcUnit />
</IconButton>
</Paper>
</Grid>
<Grid item xs>
<Paper>
<IconButton className={classes.layerSelButton}>
<Accessible />
</IconButton>
</Paper>
</Grid>
<Grid item xs>
<Paper>
<IconButton className={classes.layerSelButton}><AccountBalance /></IconButton>
</Paper>
</Grid>
<Grid item xs>
<Paper>
<IconButton className={classes.layerSelButton}>
<AccountCircle />
</IconButton>
</Paper>
</Grid>
<Grid item xs>
<Paper>
<IconButton className={classes.layerSelButton}>
<Apartment />
</IconButton>
</Paper>
</Grid>
</Grid>
);
}
47 changes: 47 additions & 0 deletions src/components/mainui.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import React from 'react';
import { Grid } from '@material-ui/core';
import { ThemeProvider, makeStyles, createStyles } from '@material-ui/core/styles';
import Header from './header';
import LayerSelector from './layerselector';
import theme from '../theme';

const useStyles = makeStyles(() => (
createStyles({
root: {
flexGrow: 1,
position: 'fixed',
top: 0,
left: 0,
minHeight: '100vh',
pointerEvents: 'none',
zIndex: 100,
},
header: {
flexGrow: 1,
},
})
));

export default function MainUI() {
const classes = useStyles();

return (
<ThemeProvider theme={theme}>
<Grid
container
className={classes.root}
direction="column"
justify="flex-start"
spacing={0}
xs={12}
>
<Grid item className={classes.header}>
<Header />
</Grid>
<Grid item>
<LayerSelector />
</Grid>
</Grid>
</ThemeProvider>
);
}
18 changes: 12 additions & 6 deletions src/components/mapcomponent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ function MapComponent({ basemaps, tilesets }: MapProps) {
const [activeTileLayer, setActiveTileLayer] = useState<Tileset>();
const mapContainerStyle = { height: '100%', width: '100%' };

const map = new Map({
const olMap = new Map({
target: undefined,
controls: [],
view: new View({
Expand All @@ -68,8 +68,14 @@ function MapComponent({ basemaps, tilesets }: MapProps) {
}),
});

// Set the ol map target on initial render
useEffect(() => {
olMap.setTarget('map');
return () => olMap.setTarget(undefined);
}, []);

// Set initial WMTS basemap and vectortilelayer
useEffect(() => {
map.setTarget('map');
const baseLayer = WMTSLayers[0];
const parser = new WMTSCapabilities();
fetch(baseLayer.url)
Expand All @@ -80,7 +86,7 @@ function MapComponent({ basemaps, tilesets }: MapProps) {
layer: baseLayer.layer,
matrixSet: baseLayer.tile_matrix_set,
});
map.addLayer(new TileLayer({
olMap.addLayer(new TileLayer({
source: new OLWMTS(options),
zIndex: -1,
}));
Expand All @@ -93,7 +99,7 @@ function MapComponent({ basemaps, tilesets }: MapProps) {
source: vectorTileSource,
style: mapStyles.pointStyle,
});
map.addLayer(vectorLayer);
olMap.addLayer(vectorLayer);
const layerCenter = transform(
[defaultLayer.center[0], defaultLayer.center[1]],
'EPSG:4326', 'EPSG:3857',
Expand All @@ -102,8 +108,8 @@ function MapComponent({ basemaps, tilesets }: MapProps) {
center: layerCenter,
zoom: defaultLayer.center[2],
});
map.setView(updatedView);
}, [map, WMTSLayers, tilesets]);
olMap.setView(updatedView);
}, [olMap, WMTSLayers, tilesets]);

return (
<div style={mapContainerStyle}>
Expand Down
27 changes: 27 additions & 0 deletions src/theme.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { createMuiTheme } from '@material-ui/core';
import { orange, blue } from '@material-ui/core/colors';

declare module '@material-ui/core/styles/createMuiTheme' {
interface Theme {
custom: {
variable: string,
},
}
interface ThemeOptions {
custom?: {
variable: string,
}
}
}

const defaultTheme = createMuiTheme({
palette: {
primary: blue,
secondary: orange,
},
custom: {
variable: '#000',
},
});

export default defaultTheme;
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"noImplicitAny": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"allowJs": false,
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
Expand Down
Loading

0 comments on commit 852b9ab

Please sign in to comment.