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
125
126
127
128
129
|
import React, { useState, useEffect } 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 ReportSidebar from '../components/reports/ReportSidebar';
import ReportNavbar from '../components/reports/ReportNavbar';
import t from '../common/localization';
const useStyles = makeStyles((theme) => ({
root: {
display: 'flex',
height: '100%',
},
drawerContainer: {
width: theme.dimensions.drawerWidthDesktop,
},
drawer: {
width: theme.dimensions.drawerWidthDesktop,
[theme.breakpoints.down('md')]: {
width: theme.dimensions.drawerWidthTablet,
},
},
content: {
flex: 1,
padding: theme.spacing(5, 3, 3, 3),
},
drawerHeader: {
...theme.mixins.toolbar,
display: 'flex',
alignItems: 'center',
padding: theme.spacing(0, 1),
},
backArrowIconContainer: {
'&:hover': {
backgroundColor: 'transparent',
},
},
toolbar: {
[theme.breakpoints.down('md')]: {
...theme.mixins.toolbar,
},
},
}));
const routes = [
{ 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 /> },
];
const ReportLayoutPage = ({ children, filter }) => {
const classes = useStyles();
const history = useHistory();
const location = useLocation();
const [openDrawer, setOpenDrawer] = useState(false);
const [reportTitle, setReportTitle] = useState();
useEffect(() => {
routes.forEach((route) => {
switch (location.pathname) {
case `${route.href}`:
setReportTitle(route.name);
break;
default:
break;
}
});
}, [location]);
return (
<div className={classes.root}>
<Hidden only={['lg', 'xl']}>
<ReportNavbar setOpenDrawer={setOpenDrawer} reportTitle={reportTitle} />
<Drawer
variant="temporary"
open={openDrawer}
onClose={() => setOpenDrawer(!openDrawer)}
classes={{ paper: classes.drawer }}
>
<ReportSidebar routes={routes} />
</Drawer>
</Hidden>
<Hidden only={['xs', 'sm', 'md']}>
<div className={classes.drawerContainer}>
<Drawer
variant="permanent"
classes={{ paper: classes.drawer }}
>
<div className={classes.drawerHeader}>
<IconButton
onClick={() => history.push('/')}
className={classes.backArrowIconContainer}
disableRipple
>
<ArrowBackIcon />
</IconButton>
<Typography variant="h6" color="inherit" noWrap>
{t('reportTitle')}
</Typography>
</div>
<Divider />
<ReportSidebar routes={routes} />
</Drawer>
</div>
</Hidden>
<div className={classes.content}>
<div className={classes.toolbar} />
<Grid container direction="column" spacing={2}>
<Grid item>{filter}</Grid>
<Grid item>{children}</Grid>
</Grid>
</div>
</div>
);
};
export default ReportLayoutPage;
|