import * as React from 'react'; import AppBar from '@material-ui/core/AppBar'; import CssBaseline from '@material-ui/core/CssBaseline'; import Divider from '@material-ui/core/Divider'; import Drawer from '@material-ui/core/Drawer'; import Hidden from '@material-ui/core/Hidden'; import IconButton from '@material-ui/core/IconButton'; import UsersIcon from '@material-ui/icons/SupervisorAccount'; import List from '@material-ui/core/List'; import ListItem from '@material-ui/core/ListItem'; import ListItemIcon from '@material-ui/core/ListItemIcon'; import ListItemText from '@material-ui/core/ListItemText'; import DashboardIcon from '@material-ui/icons/Dashboard'; import MenuIcon from '@material-ui/icons/Menu'; import SettingsIcon from '@material-ui/icons/Settings'; import DevicesIcon from '@material-ui/icons/DevicesOther'; import LabelIcon from '@material-ui/icons/Label'; import DashboardManageIcon from '@material-ui/icons/ListAlt'; import TimeLineIcon from '@material-ui/icons/Timeline'; import CalendarIcon from '@material-ui/icons/CalendarToday'; import Toolbar from '@material-ui/core/Toolbar'; import Typography from '@material-ui/core/Typography'; import {ListSubheader, Menu} from '@material-ui/core'; import HrefLink from '@material-ui/core/Link'; import * as gqlUser from '../gql/user'; import * as gqlVersion from '../gql/version'; import Button from '@material-ui/core/Button'; import AccountCircle from '@material-ui/icons/AccountCircle'; import {Link} from 'react-router-dom'; import MenuItem from '@material-ui/core/MenuItem'; import {useMutation, useQuery} from '@apollo/react-hooks'; import {Logout} from '../gql/__generated__/Logout'; import {Version} from '../gql/__generated__/Version'; import {CurrentUser} from '../gql/__generated__/CurrentUser'; import * as gqlDashboard from '../gql/dashboard'; import {Dashboards} from '../gql/__generated__/Dashboards'; import makeStyles from '@material-ui/core/styles/makeStyles'; import {Route, RouteChildrenProps, Switch} from 'react-router'; const drawerWidth = 240; const useStyles = makeStyles((theme) => ({ root: { display: 'flex', height: '100%', }, drawer: { [theme.breakpoints.up('md')]: { width: drawerWidth, flexShrink: 0, }, }, appBar: { marginLeft: drawerWidth, [theme.breakpoints.up('md')]: { width: `calc(100% - ${drawerWidth}px)`, }, }, menuButton: { marginRight: 20, [theme.breakpoints.up('md')]: { display: 'none', }, }, toolbar: { ...theme.mixins.toolbar, display: 'flex', flexDirection: 'column', justifyContent: 'center', }, drawerPaper: { width: drawerWidth, }, content: { flexGrow: 1, paddingTop: theme.spacing(2), paddingBottom: theme.spacing(2), paddingLeft: theme.spacing(1), paddingRight: theme.spacing(1), }, grow: { flexGrow: 1, }, sectionDesktop: { display: 'none', [theme.breakpoints.up('xs')]: { display: 'flex', }, }, sectionMobile: { display: 'flex', [theme.breakpoints.up('xs')]: { display: 'none', }, }, })); // tslint:disable-next-line:no-any const routerLink = (to: string): any => { return React.forwardRef((props, ref) => ); }; export const Page: React.FC = ({children}) => { const classes = useStyles(); const {data} = useQuery(gqlUser.CurrentUser); const [mobileOpen, setMobileOpen] = React.useState(false); const [userMenuOpen, setUserMenuOpen] = React.useState(null); const [logout] = useMutation(gqlUser.Logout, {refetchQueries: [{query: gqlUser.CurrentUser}]}); const {data: {version = gqlVersion.VersionDefault.version} = gqlVersion.VersionDefault} = useQuery( gqlVersion.Version ); const dashboardsQuery = useQuery(gqlDashboard.Dashboards); const dashboards = (dashboardsQuery.data && dashboardsQuery.data.dashboards) || []; const username = (data && data.user && data.user.name) || 'unknown'; const admin = data && data.user && data.user.admin; const drawer = (
traggo {version.name}@{version.commit.slice(0, 8)}
Dashboards} dense={true}> {dashboards.map(({id, name}) => ( ))} {dashboards.length === 0 ? ( ) : null} Timesheet} dense={true}> User} dense={true}> {admin ? ( <> Admin} dense={true}> ) : null}
); return (
setMobileOpen(!mobileOpen)} className={classes.menuButton}> Timesheet / List Timesheet / Calendar User / Settings User / Devices User / Tags Admin / Users Dashboards / Manage {(props: RouteChildrenProps<{id: string}>) => { const db = dashboards.find( (dashboard) => dashboard.id === parseInt(props.match!.params.id, 10) ); return 'Dashboards / ' + (db ? db.name : '...'); }}
setUserMenuOpen(null)}> setUserMenuOpen(null)} component={routerLink('/user/settings')}> Settings { setUserMenuOpen(null); logout(); }}> Logout
{children}
); };