1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
import React, { useState, useEffect, useMemo } from 'react';
import { useHistory, useLocation } from 'react-router-dom';
import {
Grid, Typography, Divider, Drawer, makeStyles, IconButton, Hidden,
} from '@material-ui/core';
import TimelineIcon from '@material-ui/icons/Timeline';
import PauseCircleFilledIcon from '@material-ui/icons/PauseCircleFilled';
import PlayCircleFilledIcon from '@material-ui/icons/PlayCircleFilled';
import NotificationsActiveIcon from '@material-ui/icons/NotificationsActive';
import FormatListBulletedIcon from '@material-ui/icons/FormatListBulleted';
import TrendingUpIcon from '@material-ui/icons/TrendingUp';
import ArrowBackIcon from '@material-ui/icons/ArrowBack';
import SideNav from '../components/SideNav';
import NavBar from '../components/NavBar';
import { useTranslation } from '../LocalizationProvider';
const useStyles = makeStyles((theme) => ({
root: {
display: 'flex',
[theme.breakpoints.down('sm')]: {
flexDirection: 'column',
},
height: '100%',
},
drawerContainer: {
width: theme.dimensions.drawerWidthDesktop,
},
drawer: {
width: theme.dimensions.drawerWidthDesktop,
[theme.breakpoints.down('sm')]: {
width: theme.dimensions.drawerWidthTablet,
},
},
content: {
flex: 1,
padding: theme.spacing(3, 3, 3, 3),
},
drawerHeader: {
...theme.mixins.toolbar,
display: 'flex',
alignItems: 'center',
padding: theme.spacing(0, 1),
},
backArrowIconContainer: {
'&:hover': {
backgroundColor: 'transparent',
},
},
}));
const ReportLayout = ({ children, filter }) => {
const classes = useStyles();
const history = useHistory();
const location = useLocation();
const t = useTranslation();
const [openDrawer, setOpenDrawer] = useState(false);
const [reportTitle, setReportTitle] = useState();
const routes = useMemo(() => [
{ name: t('reportRoute'), href: '/reports/route', icon: <TimelineIcon /> },
{ name: t('reportEvents'), href: '/reports/event', icon: <NotificationsActiveIcon /> },
{ name: t('reportTrips'), href: '/reports/trip', icon: <PlayCircleFilledIcon /> },
{ name: t('reportStops'), href: '/reports/stop', icon: <PauseCircleFilledIcon /> },
{ name: t('reportSummary'), href: '/reports/summary', icon: <FormatListBulletedIcon /> },
{ name: t('reportChart'), href: '/reports/chart', icon: <TrendingUpIcon /> },
], [t]);
useEffect(() => {
routes.forEach((route) => {
switch (location.pathname) {
case `${route.href}`:
setReportTitle(route.name);
break;
default:
break;
}
});
}, [routes, location]);
const pageTitle = `${t('reportTitle')} / ${reportTitle}`;
return (
<div className={classes.root}>
<Hidden mdUp>
<NavBar setOpenDrawer={setOpenDrawer} title={pageTitle} />
<Drawer
variant="temporary"
open={openDrawer}
onClose={() => setOpenDrawer(!openDrawer)}
classes={{ paper: classes.drawer }}
>
<SideNav routes={routes} />
</Drawer>
</Hidden>
<Hidden smDown>
<Drawer
variant="permanent"
classes={{ root: classes.drawerContainer, paper: classes.drawer }}
>
<div className={classes.drawerHeader}>
<IconButton onClick={() => history.push('/')}>
<ArrowBackIcon />
</IconButton>
<Typography variant="h6" color="inherit" noWrap>
{t('reportTitle')}
</Typography>
</div>
<Divider />
<SideNav routes={routes} />
</Drawer>
</Hidden>
<div className={classes.content}>
<Grid container direction="column" spacing={2}>
<Grid item>{filter}</Grid>
<Grid item>{children}</Grid>
</Grid>
</div>
</div>
);
};
export default ReportLayout;
|