{"version":3,"sources":["assets/logo.png","gql/auth.js","actions/auth.js","apollo.js","components/Apollo.js","components/layout/PageContainer.js","components/layout/Note.js","components/layout/AccessDenied.js","components/PrivateRoute.js","components/RedirectSSO.js","components/layout/Loading.js","components/Login.js","components/layout/NavbarListItem.js","components/layout/Navbar.js","components/Logout.js","gql/files.js","components/layout/PagePaper.js","components/Home.js","gql/categories.js","utils/handleArrayToggle.js","components/CategoryLoading.js","components/CategoriesItem.js","components/CategoryDelete.js","components/Categories.js","components/CategoryForm.js","components/CategoryAdd.js","components/CategoryEdit.js","gql/users.js","components/UsersItem.js","components/Users.js","components/UserForm.js","components/UserAdd.js","components/UserDelete.js","components/UserEdit.js","components/layout/Footer.js","components/Pages.js","App.js","index.js"],"names":["module","exports","gql","GET_TOKEN","REFRESH_TOKEN","DELETE_REFRESH_TOKEN","LOGIN","clearUser","client","writeQuery","query","data","token","isLoggedIn","loading","netId","role","cache","InMemoryCache","getNewToken","Promise","resolve","reject","a","mutate","mutation","update","refreshToken","me","name","loginLoading","errorLink","onError","graphQLErrors","networkError","operation","forward","err","message","locations","path","extensions","console","log","JSON","stringify","code","warn","history","push","fromPromise","then","catch","error","filter","value","Boolean","flatMap","authLink","ApolloLink","readQuery","setContext","headers","httpLink","createHttpLink","uri","process","credentials","ApolloClient","fetchOptions","fetch","link","from","resolvers","Apollo","children","useStyles","makeStyles","theme","content","flexGrow","overflow","container","paddingTop","spacing","paddingBottom","appBarSpacer","mixins","toolbar","paper","padding","display","flexDirection","title","marginBottom","paddingLeft","borderLeft","palette","primary","dark","PageContainer","classes","className","Container","maxWidth","Typography","component","variant","useStyle","note","marginTop","color","Note","props","AccessDenied","PrivateRoute","Component","adminOnly","rest","useQuery","location","useLocation","render","to","pathname","state","prevPath","defaultProps","RedirectSSO","loginUrl","escape","targetUrl","window","href","Webkitdisplay","WebkitFlex","flex","WebkitFlexDirection","WebkitFlexGrow","WebkitFlexShrink","flexShrink","height","WebkitAlignItems","alignItems","WebkitJustifyContent","justifyContent","Loading","useTheme","main","Login","useApolloClient","URLSearchParams","search","useState","setLoading","useMutation","onCompleted","login","loginUser","get","useEffect","variables","selected","NavbarListItem","icon","ListItem","button","NavLink","exact","activeClassName","ListItemIcon","ListItemText","root","paddingRight","toolbarIcon","letterSpacing","accountMenuList","marginRight","offset","appBar","zIndex","drawer","transition","transitions","create","easing","sharp","duration","leavingScreen","appBarShift","marginLeft","width","menuButton","menuButtonHidden","drawerOpen","breakpoints","up","drawerClose","drawerPaper","enteringScreen","drawerPaperClose","overflowX","logo","maxHeight","Navbar","useHistory","setDrawerOpen","React","mobileOpen","setMobileOpen","logout","matches","useMediaQuery","undefined","document","body","IconButton","onClick","Divider","List","ListSubheader","inset","AppBar","position","clsx","Toolbar","Hidden","smDown","smUp","edge","aria-label","handleMeunIconClick","fontSize","src","alt","Button","Drawer","anchor","open","onClose","ModalProps","keepMounted","xsDown","Logout","GET_MY_FILES","GET_DOWNLOAD_FILE_TOKEN","PagePaper","Paper","File","file","showLoading","setShowLoading","fetchPolicy","downloadFileToken","getDownloadFileToken","id","displayName","category","secondary","moment","updatedAt","fromNow","Home","files","length","Grid","item","xs","map","key","FRAGMENT_CATEGORIES_PAGE_CATEGORY","GET_CATEGORY","GET_ALL_CATEGORIES","TOGGLE_DISABLED","SORT_CATEGORY","ADD_CATEGORY","EDIT_CATEGORY","DELETE_CATEGORY","handle","checked","setChecked","currentIndex","indexOf","newChecked","splice","CategoryLoading","text","label","down","widerSecondaryAction","pendingIcon","grey","doneIcon","secondaryAction","CategoriesItem","sortLoading","setDeleteCategory","setOpenDelete","menuRef","useRef","folderName","desc","disabled","countPendingFiles","count","sortedFiles","refetchQueries","toggleDisabled","anchorEl","setAnchorEl","labelId","dense","handleArrayToggle","Checkbox","tabIndex","disableRipple","inputProps","md","wrap","zeroMinWidth","noWrap","direction","ListItemSecondaryAction","FormGroup","row","FormControlLabel","control","Switch","onChange","input","size","labelPlacement","ref","e","current","MenuItem","CategoryDelete","setOpen","deleteCategory","handleClose","Dialog","aria-labelledby","DialogTitle","DialogContent","gutterBottom","DialogActions","REACT_APP_UPLOAD_PATH","REACT_APP_SERVER_NAME","margin","Categories","setSortLoading","sortCategory","openDelete","Link","startIcon","categories","CategoryForm","formik","edit","submitErrors","setSubmitErrors","errors","onSubmit","handleSubmit","noValidate","TextField","required","type","getFieldProps","touched","helperText","InputProps","readOnly","fullWidth","values","active","multiline","goBack","CategoryAdd","addCategory","useFormik","initialValues","validationSchema","Yup","trim","FormWrapper","editCategory","CategoryEdit","useParams","editError","alert","GET_USERS","GET_USER","EDIT_USER","TOGGLE_USER_DISABLED","DELETE_USER","ADD_USER","UsersItem","user","Users","users","UserForm","FormControl","formControl","InputLabel","Select","FormHelperText","UserAdd","addUser","UserDelete","deleteUser","noteRoot","noteText","deleteButton","top","editUser","UserEdit","Copyright","Date","getFullYear","footer","backgroundColor","Footer","minHeight","Pages","init","getRefreshToken","CssBaseline","style","createMuiTheme","teal","typography","body1","body2","responsiveFontSizes","createBrowserHistory","basename","App","ThemeProvider","utils","MomentUtils","ReactDOM","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.cfd54a77.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/logo.54a97e7d.png\";","import { gql } from '@apollo/client';\r\n\r\nexport const IS_LOADING = gql`\r\n query isLoading {\r\n loading @client\r\n }\r\n`;\r\n\r\nexport const IS_LOGGED_IN = gql`\r\n query isLoggedIn {\r\n isLoggedIn @client\r\n }\r\n`;\r\n\r\nexport const GET_TOKEN = gql`\r\n query getToken {\r\n token @client\r\n isLoggedIn @client\r\n netId @client\r\n role @client\r\n loading @client\r\n loginLoading @client\r\n }\r\n`;\r\n\r\nexport const REFRESH_TOKEN = gql`\r\n mutation refreshToken($init: Boolean) {\r\n refreshToken(init: $init) {\r\n token\r\n me {\r\n netId\r\n role\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const INIT_REFRESH_TOKEN = gql`\r\n mutation initRefreshToken {\r\n refreshToken {\r\n token\r\n me {\r\n netId\r\n role\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const GET_ME = gql`\r\n query me {\r\n me {\r\n netId\r\n role\r\n }\r\n }\r\n`;\r\n\r\nexport const DELETE_REFRESH_TOKEN = gql`\r\n mutation DELETE_REFRESHTOKEN {\r\n deleteRefreshToken\r\n }\r\n`;\r\n\r\nexport const LOGIN = gql`\r\n mutation LOGIN($token: String!) {\r\n login(token: $token) {\r\n token\r\n me {\r\n netId\r\n id\r\n role\r\n }\r\n }\r\n }\r\n`;\r\n","import { GET_TOKEN } from '../gql/auth';\r\n\r\nexport const clearUser = ({ client }) => {\r\n client.writeQuery({\r\n query: GET_TOKEN,\r\n data: {\r\n token: '',\r\n isLoggedIn: false,\r\n loading: false,\r\n netId: '',\r\n role: '',\r\n },\r\n });\r\n};\r\n\r\nexport const loginUser = ({ client, login }) => {\r\n client.writeQuery({\r\n query: GET_TOKEN,\r\n data: {\r\n token: login.token,\r\n isLoggedIn: true,\r\n netId: login.me.netId,\r\n role: login.me.role,\r\n loginLoading: false,\r\n },\r\n });\r\n};\r\n","// apollo client\r\nimport { ApolloClient, InMemoryCache, gql } from '@apollo/client';\r\nimport fetch from 'unfetch';\r\nimport { ApolloLink, fromPromise } from 'apollo-link';\r\nimport { createHttpLink } from 'apollo-link-http';\r\nimport { onError } from 'apollo-link-error';\r\nimport { GET_TOKEN, REFRESH_TOKEN } from './gql/auth';\r\nimport { history } from './App';\r\nimport { clearUser } from './actions/auth';\r\n\r\nconst cache = new InMemoryCache();\r\n\r\nconst getNewToken = (client) => {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n const { data } = await client.mutate({\r\n mutation: REFRESH_TOKEN,\r\n update: (cache, { data }) => {\r\n cache.writeQuery({\r\n query: GET_TOKEN,\r\n data: {\r\n token: data.refreshToken.token,\r\n netId: data.refreshToken.me.name,\r\n role: data.refreshToken.me.role,\r\n isLoggedIn: true,\r\n loading: false,\r\n },\r\n });\r\n },\r\n });\r\n\r\n resolve({ token: data.refreshToken.token });\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n};\r\n\r\n// init cache\r\ncache.writeQuery({\r\n query: gql`\r\n query initCache {\r\n token\r\n isLoggedIn\r\n netId\r\n role\r\n loading\r\n loginLoading\r\n }\r\n `,\r\n data: {\r\n token: '',\r\n isLoggedIn: false,\r\n netId: '',\r\n role: '',\r\n loading: true,\r\n loginLoading: true,\r\n },\r\n});\r\n\r\nconst errorLink = onError(\r\n ({ graphQLErrors, networkError, operation, forward }) => {\r\n if (graphQLErrors) {\r\n // eslint-disable-next-line no-restricted-syntax\r\n for (const err of graphQLErrors) {\r\n const { message, locations, path, extensions } = err;\r\n console.log(\r\n `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}, Extensions: ${JSON.stringify(\r\n extensions\r\n )}`\r\n );\r\n\r\n if (extensions.code === 'UNAUTHENTICATED') {\r\n console.warn(message);\r\n switch (message) {\r\n case 'LOGIN FAIL':\r\n break;\r\n case 'NO ME':\r\n // don't do anything\r\n // history.push('/redirectSSO');\r\n return;\r\n case 'GO LOGIN':\r\n if (client) {\r\n clearUser({ client });\r\n }\r\n history.push('/redirectSSO');\r\n break;\r\n case 'SESSION TIMEOUT':\r\n if (client) {\r\n clearUser({ client });\r\n }\r\n history.push('/redirectSSO');\r\n break;\r\n default:\r\n //refresh token\r\n\r\n // eslint-disable-next-line consistent-return\r\n return fromPromise(\r\n getNewToken(client)\r\n .then(({ token }) => {\r\n return token;\r\n })\r\n .catch((error) => {\r\n if (client) {\r\n clearUser({ client });\r\n }\r\n //history.push('/redirectSSO');\r\n return;\r\n })\r\n )\r\n .filter((value) => {\r\n return Boolean(value);\r\n })\r\n .flatMap(() => {\r\n // retry the request, returning the new observable\r\n return forward(operation);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (networkError) console.log(`[Network error]: ${networkError}`);\r\n }\r\n);\r\n\r\nconst authLink = new ApolloLink((operation, forward) => {\r\n const { token } = cache.readQuery({ query: GET_TOKEN });\r\n\r\n if (token) {\r\n operation.setContext({\r\n headers: {\r\n 'x-auth-token': token,\r\n },\r\n });\r\n }\r\n return forward(operation);\r\n});\r\n\r\nconst httpLink = createHttpLink({\r\n uri: `${process.env.REACT_APP_SERVER_URI}/graphql`,\r\n credentials: 'include',\r\n});\r\n\r\nconst client = new ApolloClient({\r\n cache,\r\n fetchOptions: { fetch },\r\n link: ApolloLink.from([errorLink, authLink, httpLink]),\r\n resolvers: {},\r\n});\r\n\r\nexport const getRefreshToken = async () => {\r\n try {\r\n await client.mutate({\r\n mutation: REFRESH_TOKEN,\r\n variables: { init: true },\r\n update: (cache, { data }) => {\r\n cache.writeQuery({\r\n query: GET_TOKEN,\r\n data: {\r\n token: data.refreshToken.token,\r\n netId: data.refreshToken.me.netId,\r\n role: data.refreshToken.me.role,\r\n loading: false,\r\n isLoggedIn: true,\r\n },\r\n });\r\n },\r\n });\r\n } catch (error) {\r\n client.writeQuery({ query: GET_TOKEN, data: { loading: false } });\r\n throw error;\r\n }\r\n};\r\n\r\nexport default client;\r\n","import React from 'react';\r\nimport { ApolloProvider } from '@apollo/client';\r\nimport client, { getRefreshToken } from '../apollo';\r\nimport PropTypes from 'prop-types';\r\n\r\nconst Apollo = ({ children }) => {\r\n return {children};\r\n};\r\n\r\nApollo.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n};\r\n\r\nexport default Apollo;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Container from '@material-ui/core/Container';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n content: {\r\n flexGrow: 1,\r\n overflow: 'auto',\r\n },\r\n container: {\r\n paddingTop: theme.spacing(4),\r\n paddingBottom: theme.spacing(4),\r\n },\r\n appBarSpacer: {\r\n ...theme.mixins.toolbar,\r\n },\r\n paper: {\r\n padding: theme.spacing(2),\r\n display: 'flex',\r\n overflow: 'auto',\r\n flexDirection: 'column',\r\n },\r\n title: {\r\n marginBottom: theme.spacing(3),\r\n paddingLeft: theme.spacing(1),\r\n borderLeft: `4px solid ${theme.palette.primary.dark}`,\r\n },\r\n}));\r\n\r\nconst PageContainer = ({ title, children }) => {\r\n const classes = useStyles();\r\n\r\n return (\r\n
\r\n
\r\n \r\n \r\n {title}\r\n \r\n {children}\r\n \r\n
\r\n );\r\n};\r\n\r\nPageContainer.propTypes = {\r\n title: PropTypes.string.isRequired,\r\n children: PropTypes.node.isRequired,\r\n};\r\n\r\nexport default PageContainer;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles, Typography } from '@material-ui/core';\r\n\r\nconst useStyle = makeStyles((theme) => ({\r\n note: {\r\n marginTop: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n color: '#586069',\r\n },\r\n}));\r\n\r\nconst Note = ({ children, ...props }) => {\r\n const classes = useStyle();\r\n\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n};\r\n\r\nNote.propTypes = {\r\n children: PropTypes.node.isRequired,\r\n};\r\n\r\nexport default Note;\r\n","import React from 'react';\r\nimport PageContainer from './PageContainer';\r\nimport Note from './Note';\r\n\r\nconst AccessDenied = () => {\r\n return (\r\n \r\n Access Denied\r\n \r\n );\r\n};\r\n\r\nexport default AccessDenied;\r\n","import React from 'react';\r\nimport { Route, Redirect, useLocation } from 'react-router-dom';\r\nimport { useQuery } from '@apollo/client';\r\nimport PropTypes from 'prop-types';\r\nimport { GET_TOKEN } from '../gql/auth';\r\nimport AccessDenied from './layout/AccessDenied';\r\n\r\nconst PrivateRoute = ({ component: Component, adminOnly, ...rest }) => {\r\n const {\r\n data: { isLoggedIn, role },\r\n loading,\r\n } = useQuery(GET_TOKEN);\r\n const location = useLocation();\r\n\r\n return (\r\n {\r\n if (!isLoggedIn && !loading) {\r\n return (\r\n \r\n );\r\n }\r\n if (adminOnly && role !== 'Admin') {\r\n return ;\r\n }\r\n return ;\r\n }}\r\n />\r\n );\r\n};\r\n\r\nPrivateRoute.defaultProps = {\r\n adminOnly: false,\r\n};\r\n\r\nPrivateRoute.propTypes = {\r\n component: PropTypes.func.isRequired,\r\n adminOnly: PropTypes.bool,\r\n};\r\n\r\nexport default PrivateRoute;\r\n","import React, { Fragment } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\n\r\nconst RedirectSSO = () => {\r\n const location = useLocation();\r\n const rootUrl = process.env.REACT_APP_PUBLIC_URL;\r\n const loginUrl = escape(`${rootUrl}/login`);\r\n const targetUrl = escape(location.state.prevPath) || '/';\r\n\r\n window.location.href = `https://www2.polyu.edu.hk/edc/authws/auth/index.php?loginUrl=${loginUrl}&targetUrl=${targetUrl}`;\r\n return <>Redirecting...;\r\n};\r\n\r\nexport default RedirectSSO;\r\n","import React, { Fragment } from 'react';\r\nimport Spinner from 'react-spinkit';\r\nimport { useTheme, makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n loading: {\r\n Webkitdisplay: 'flex',\r\n display: 'flex',\r\n WebkitFlex: '0 1 auto',\r\n flex: '0 1 auto',\r\n WebkitFlexDirection: 'column',\r\n flexDirection: 'column',\r\n WebkitFlexGrow: 1,\r\n flexGrow: 1,\r\n WebkitFlexShrink: 0,\r\n flexShrink: 0,\r\n height: '200px',\r\n WebkitAlignItems: 'center',\r\n alignItems: 'center',\r\n WebkitJustifyContent: 'center',\r\n justifyContent: 'center',\r\n },\r\n}));\r\n\r\nconst Loading = () => {\r\n const classes = useStyles();\r\n const theme = useTheme();\r\n return (\r\n \r\n
\r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Loading;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { useLocation, Redirect } from 'react-router-dom';\r\nimport { useApolloClient, useMutation, useQuery } from '@apollo/client';\r\nimport { GET_TOKEN, LOGIN } from '../gql/auth';\r\nimport Loading from './layout/Loading';\r\nimport { loginUser } from '../actions/auth';\r\n\r\nconst useQueryParams = () => new URLSearchParams(useLocation().search);\r\n\r\nconst Login = () => {\r\n const client = useApolloClient();\r\n const query = useQueryParams();\r\n const [loading, setLoading] = useState(true);\r\n const { data } = useQuery(GET_TOKEN);\r\n const [login] = useMutation(LOGIN, {\r\n // eslint-disable-next-line no-shadow\r\n onCompleted({ login }) {\r\n loginUser({ client, login });\r\n },\r\n });\r\n const token = query.get('token');\r\n const targetUrl = query.get('targetUrl') || '/';\r\n useEffect(() => {\r\n login({ variables: { token } });\r\n }, []);\r\n useEffect(() => {\r\n if (data.loginLoading === false) {\r\n setLoading(false);\r\n }\r\n return () => {\r\n client.writeQuery({\r\n query: GET_TOKEN,\r\n data: {\r\n loginLoading: true,\r\n },\r\n });\r\n };\r\n }, [data]);\r\n\r\n if (loading) {\r\n return ;\r\n }\r\n return ;\r\n};\r\n\r\nexport default Login;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { NavLink, useLocation } from 'react-router-dom';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n selected: {\r\n color: theme.palette.primary.main,\r\n },\r\n}));\r\n\r\nconst NavbarListItem = ({ icon, path, title }) => {\r\n const { pathname } = useLocation();\r\n const classes = useStyles();\r\n\r\n return (\r\n \r\n \r\n {icon}\r\n \r\n \r\n \r\n );\r\n};\r\n\r\nNavbarListItem.propTypes = {\r\n path: PropTypes.string.isRequired,\r\n icon: PropTypes.element.isRequired,\r\n title: PropTypes.string.isRequired,\r\n};\r\n\r\nexport default NavbarListItem;\r\n","import React, { useState } from 'react';\r\nimport clsx from 'clsx';\r\nimport PropTypes from 'prop-types';\r\nimport { useQuery, useMutation } from '@apollo/client';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Hidden from '@material-ui/core/Hidden';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport List from '@material-ui/core/List';\r\nimport ListSubheader from '@material-ui/core/ListSubheader';\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport HomeIcon from '@material-ui/icons/Home';\r\nimport PersonIcon from '@material-ui/icons/Person';\r\nimport AssignmentIcon from '@material-ui/icons/Assignment';\r\nimport MenuIcon from '@material-ui/icons/Menu';\r\nimport Drawer from '@material-ui/core/Drawer';\r\nimport ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Button from '@material-ui/core/Button';\r\nimport NavbarListItem from './NavbarListItem';\r\nimport { GET_TOKEN, DELETE_REFRESH_TOKEN } from '../../gql/auth';\r\nimport logo from '../../assets/logo.png';\r\n\r\nconst drawerWidth = 240;\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n toolbar: {\r\n paddingRight: 24, // keep right padding when drawer closed\r\n },\r\n toolbarIcon: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'flex-end',\r\n padding: '0 8px',\r\n ...theme.mixins.toolbar,\r\n },\r\n title: {\r\n flexGrow: 1,\r\n letterSpacing: '1px',\r\n },\r\n accountMenuList: {\r\n marginRight: theme.spacing(2),\r\n },\r\n offset: theme.mixins.toolbar,\r\n appBar: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n transition: theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n },\r\n appBarShift: {\r\n marginLeft: drawerWidth,\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n transition: theme.transitions.create(['width', 'margin'], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: 'theme.transitions.duration.enteringScreen',\r\n }),\r\n },\r\n menuButton: {\r\n marginRight: 36,\r\n },\r\n menuButtonHidden: {\r\n display: 'none',\r\n },\r\n drawerOpen: {\r\n [theme.breakpoints.up('sm')]: {\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n },\r\n },\r\n drawerClose: {\r\n [theme.breakpoints.up('sm')]: {\r\n width: theme.spacing(9),\r\n flexShrink: 0,\r\n },\r\n },\r\n drawerPaper: {\r\n width: drawerWidth,\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n },\r\n drawerPaperClose: {\r\n overflowX: 'hidden',\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n width: theme.spacing(7),\r\n [theme.breakpoints.up('sm')]: {\r\n width: theme.spacing(9),\r\n },\r\n },\r\n selected: {\r\n color: theme.palette.primary.main,\r\n },\r\n name: {\r\n borderLeft: '1px solid white',\r\n paddingLeft: theme.spacing(2),\r\n marginLeft: theme.spacing(1),\r\n },\r\n logo: {\r\n width: 'auto',\r\n maxWidth: '100%',\r\n maxHeight: '64px',\r\n },\r\n}));\r\n\r\nconst Navbar = (props) => {\r\n const { window } = props;\r\n const history = useHistory();\r\n const classes = useStyles();\r\n const [drawerOpen, setDrawerOpen] = useState(true);\r\n const [mobileOpen, setMobileOpen] = React.useState(false);\r\n const { data } = useQuery(GET_TOKEN);\r\n const [logout] = useMutation(DELETE_REFRESH_TOKEN, {\r\n update: (cache) => {\r\n cache.writeQuery({\r\n query: GET_TOKEN,\r\n data: {\r\n token: '',\r\n isLoggedIn: false,\r\n netId: '',\r\n loading: true,\r\n role: '',\r\n },\r\n });\r\n },\r\n // refetchQueries: ['GET_TOKEN'],\r\n });\r\n const matches = useMediaQuery('(min-width:600px)');\r\n const { role } = data;\r\n\r\n const handleLogout = () => {\r\n logout();\r\n history.push('/logout');\r\n };\r\n\r\n const handleMobileDrawerToggle = () => {\r\n setMobileOpen(!mobileOpen);\r\n };\r\n\r\n const handleDrawerClose = () => {\r\n setDrawerOpen(false);\r\n setMobileOpen(false);\r\n };\r\n\r\n // eslint-disable-next-line no-shadow\r\n const handleMeunIconClick = (matches) => {\r\n if (matches) {\r\n setDrawerOpen(true);\r\n } else {\r\n setMobileOpen(!mobileOpen);\r\n }\r\n };\r\n\r\n const container =\r\n window !== undefined ? () => window().document.body : undefined;\r\n\r\n const drawer = (\r\n <>\r\n
\r\n \r\n \r\n \r\n
\r\n \r\n \r\n } />\r\n \r\n {data.role === 'Admin' ? (\r\n <>\r\n Setting\r\n }\r\n />\r\n } />\r\n \r\n ) : (\r\n ''\r\n )}\r\n \r\n \r\n );\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n handleMeunIconClick(matches)}\r\n className={clsx(\r\n classes.menuButton,\r\n drawerOpen && matches && classes.menuButtonHidden\r\n )}\r\n >\r\n \r\n \r\n \r\n \r\n \"logo\"\r\n \r\n \r\n \r\n {`Login as ${data.netId}`}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {drawer}\r\n \r\n \r\n \r\n \r\n {drawer}\r\n \r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nNavbar.propTypes = {\r\n // eslint-disable-next-line react/require-default-props\r\n window: PropTypes.func,\r\n};\r\n\r\nexport default Navbar;\r\n","import React from 'react';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nconst Logout = () => {\r\n return Please close all your browser;\r\n};\r\n\r\nexport default Logout;\r\n","import { gql } from '@apollo/client';\r\n\r\nexport const GET_ALL_FILES = gql`\r\n query GET_ALL_FILES {\r\n allFiles {\r\n id\r\n category {\r\n displayName\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const GET_MY_FILES = gql`\r\n query GET_MY_FILES {\r\n me {\r\n files {\r\n id\r\n updatedAt\r\n category {\r\n displayName\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const GET_DOWNLOAD_FILE_TOKEN = gql`\r\n mutation GET_DOWNLOAD_FILE_TOKEN($id: ID!, $displayName: String!) {\r\n downloadFileToken(id: $id, displayName: $displayName)\r\n }\r\n`;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Paper from '@material-ui/core/Paper';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n paper: {\r\n padding: theme.spacing(4),\r\n display: 'flex',\r\n overflow: 'auto',\r\n flexDirection: 'column',\r\n },\r\n}));\r\n\r\nconst PagePaper = ({ children }) => {\r\n const classes = useStyles();\r\n\r\n return {children};\r\n};\r\n\r\nPagePaper.propTypes = {\r\n children: PropTypes.node,\r\n};\r\n\r\nexport default PagePaper;\r\n","import React, { Fragment, useState } from 'react';\r\nimport { useQuery, useMutation } from '@apollo/client';\r\nimport { useTheme } from '@material-ui/core/styles';\r\nimport moment from 'moment';\r\nimport PropTypes from 'prop-types';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport List from '@material-ui/core/List';\r\nimport AttachFileIcon from '@material-ui/icons/AttachFile';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport Spinner from 'react-spinkit';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport Divider from '@material-ui/core/Divider';\r\nimport Loading from './layout/Loading';\r\nimport PageContainer from './layout/PageContainer';\r\nimport { GET_DOWNLOAD_FILE_TOKEN, GET_MY_FILES } from '../gql/files';\r\nimport Note from './layout/Note';\r\nimport PagePaper from './layout/PagePaper';\r\n\r\nconst File = ({ file }) => {\r\n const theme = useTheme();\r\n const serverUri = process.env.REACT_APP_SERVER_URI;\r\n const [showLoading, setShowLoading] = useState(false);\r\n const [getDownloadFileToken, { loading, error }] = useMutation(\r\n GET_DOWNLOAD_FILE_TOKEN,\r\n {\r\n fetchPolicy: 'no-cache',\r\n onCompleted({ downloadFileToken }) {\r\n window.open(\r\n `${serverUri}/download?token=${downloadFileToken}`,\r\n '_target'\r\n );\r\n setShowLoading(false);\r\n },\r\n }\r\n );\r\n\r\n return (\r\n <>\r\n {\r\n getDownloadFileToken({\r\n variables: { id: file.id, displayName: file.category.displayName },\r\n });\r\n if (loading) setShowLoading(true);\r\n if (error) {\r\n console.log(error);\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n {showLoading ? (\r\n \r\n ) : (\r\n ''\r\n )}\r\n \r\n \r\n \r\n );\r\n};\r\nconst Home = () => {\r\n const { loading, error, data } = useQuery(GET_MY_FILES, {\r\n fetchPolicy: 'network-only',\r\n });\r\n\r\n if (loading) return ;\r\n\r\n if (error) {\r\n return `Error! ${error}`;\r\n }\r\n const {\r\n me: { files },\r\n } = data;\r\n return (\r\n \r\n {files.length > 0 ? (\r\n <>\r\n Click to download\r\n \r\n \r\n \r\n \r\n {files.map((file) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n You do not have any certificate currently\r\n )}\r\n \r\n );\r\n};\r\n\r\nFile.propTypes = {\r\n file: PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n category: PropTypes.shape({\r\n displayName: PropTypes.string.isRequired,\r\n }),\r\n updatedAt: PropTypes.instanceOf(Date).isRequired,\r\n }).isRequired,\r\n};\r\n\r\nexport default Home;\r\n","import { gql } from '@apollo/client';\r\n\r\nconst FRAGMENT_CATEGORIES_PAGE_CATEGORY = gql`\r\n fragment CategoriesPageCategory on Category {\r\n id\r\n folderName\r\n displayName\r\n disabled\r\n desc\r\n countPendingFiles\r\n sortedFiles {\r\n count\r\n }\r\n }\r\n`;\r\n\r\nexport const GET_CATEGORY = gql`\r\n query GET_CATEGORY($id: ID!) {\r\n category(id: $id) {\r\n folderName\r\n displayName\r\n disabled\r\n desc\r\n }\r\n }\r\n`;\r\n\r\nexport const GET_ALL_CATEGORIES = gql`\r\n query GET_ALL_CATEGORIES {\r\n categories {\r\n ...CategoriesPageCategory\r\n }\r\n }\r\n ${FRAGMENT_CATEGORIES_PAGE_CATEGORY}\r\n`;\r\n\r\nexport const TOGGLE_DISABLED = gql`\r\n mutation TOGGLE_DISABLED($id: ID!, $input: UpdateCategoryInput!) {\r\n editCategory(id: $id, input: $input) {\r\n id\r\n disabled\r\n }\r\n }\r\n`;\r\n\r\nexport const SORT_CATEGORY = gql`\r\n mutation SORT_CATEGORY($id: ID!) {\r\n sortCategory(id: $id) {\r\n id\r\n }\r\n }\r\n`;\r\n\r\nexport const ADD_CATEGORY = gql`\r\n mutation ADD_CATEGORY($input: UpdateCategoryInput!) {\r\n addCategory(input: $input) {\r\n id\r\n }\r\n }\r\n`;\r\n\r\nexport const EDIT_CATEGORY = gql`\r\n mutation EDIT_CATEGORY($id: ID!, $input: UpdateCategoryInput!) {\r\n editCategory(id: $id, input: $input) {\r\n id\r\n }\r\n }\r\n`;\r\n\r\nexport const DELETE_CATEGORY = gql`\r\n mutation DELETE_CATEGORY($id: ID!) {\r\n deleteCategory(id: $id)\r\n }\r\n`;\r\n","const handle = (id, checked, setChecked) => {\r\n const currentIndex = checked.indexOf(id);\r\n const newChecked = [...checked];\r\n\r\n if (currentIndex === -1) {\r\n newChecked.push(id);\r\n } else {\r\n newChecked.splice(currentIndex, 1);\r\n }\r\n\r\n setChecked(newChecked);\r\n};\r\n\r\nexport default handle;\r\n","import React from 'react';\r\nimport Spinner from 'react-spinkit';\r\nimport { useTheme } from '@material-ui/core/styles';\r\n\r\nconst CategoryLoading = () => {\r\n const theme = useTheme();\r\n return (\r\n
\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default CategoryLoading;\r\n","import React, { useState, useRef } from 'react';\r\nimport { useMutation } from '@apollo/client';\r\nimport PropTypes from 'prop-types';\r\nimport { NavLink } from 'react-router-dom';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport FormGroup from '@material-ui/core/FormGroup';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport Switch from '@material-ui/core/Switch';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport HourglassEmptyIcon from '@material-ui/icons/HourglassEmpty';\r\nimport DoneIcon from '@material-ui/icons/Done';\r\nimport { ListItemSecondaryAction, makeStyles, Menu } from '@material-ui/core';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport grey from '@material-ui/core/colors/grey';\r\nimport { GET_ALL_CATEGORIES, TOGGLE_DISABLED } from '../gql/categories';\r\nimport handleArrayToggle from '../utils/handleArrayToggle';\r\nimport CategoryLoading from './CategoryLoading';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n text: {\r\n color: '#586069',\r\n },\r\n label: {\r\n color: '#586069',\r\n [theme.breakpoints.down('sm')]: {\r\n fontSize: '0.75rem',\r\n },\r\n fontSize: '0.875rem',\r\n },\r\n widerSecondaryAction: {\r\n paddingRight: '130px',\r\n },\r\n pendingIcon: {\r\n color: grey[500],\r\n },\r\n doneIcon: {\r\n color: theme.palette.primary.main,\r\n },\r\n secondaryAction: {\r\n marginTop: '4px',\r\n marginBottom: theme.spacing(1),\r\n },\r\n}));\r\n\r\nconst CategoriesItem = ({\r\n category,\r\n checked,\r\n setChecked,\r\n sortLoading,\r\n setDeleteCategory,\r\n setOpenDelete,\r\n}) => {\r\n const menuRef = useRef(null);\r\n const matches = useMediaQuery('(min-width:600px)');\r\n const {\r\n id,\r\n folderName,\r\n displayName,\r\n desc,\r\n disabled,\r\n countPendingFiles,\r\n sortedFiles: { count },\r\n } = category;\r\n const [toggleDisabled] = useMutation(TOGGLE_DISABLED, {\r\n refetchQueries: [{ query: GET_ALL_CATEGORIES }],\r\n });\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const classes = useStyles();\r\n const labelId = `category-label-${id}`;\r\n\r\n const handleSwitchToggle = () => {\r\n toggleDisabled({ variables: { id, input: { disabled: !disabled } } });\r\n };\r\n\r\n const handleMenuClick = (e) => {\r\n setAnchorEl(true);\r\n };\r\n const handleMenuClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n const handleDelete = () => {\r\n setDeleteCategory(category);\r\n setOpenDelete(true);\r\n };\r\n\r\n return (\r\n handleArrayToggle(id, checked, setChecked)}\r\n classes={{ secondaryAction: classes.widerSecondaryAction }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {displayName}\r\n \r\n {desc ? `${folderName} - ${desc}` : `${folderName}`}\r\n \r\n \r\n \r\n \r\n \r\n {sortLoading.indexOf(id) < 0 ? (\r\n \r\n ) : (\r\n \r\n )}\r\n \r\n \r\n \r\n {`${countPendingFiles} / ${count}`}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n labelPlacement=\"start\"\r\n classes={{ label: classes.label }}\r\n label=\"Active\"\r\n />\r\n \r\n \r\n \r\n menuRef.current}\r\n keepMounted\r\n open={Boolean(anchorEl)}\r\n onClose={handleMenuClose}\r\n >\r\n \r\n Edit\r\n \r\n Delete\r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nCategoriesItem.propTypes = {\r\n // eslint-disable-next-line react/forbid-prop-types\r\n category: PropTypes.object.isRequired,\r\n // eslint-disable-next-line react/forbid-prop-types\r\n checked: PropTypes.array.isRequired,\r\n setChecked: PropTypes.func.isRequired,\r\n // eslint-disable-next-line react/forbid-prop-types\r\n sortLoading: PropTypes.array.isRequired,\r\n setDeleteCategory: PropTypes.func.isRequired,\r\n setOpenDelete: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default CategoriesItem;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useMutation } from '@apollo/client';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport { Typography } from '@material-ui/core';\r\nimport { DELETE_CATEGORY, GET_ALL_CATEGORIES } from '../gql/categories';\r\n\r\nconst CategoryDelete = ({ category, open, setOpen }) => {\r\n const [deleteCategory] = useMutation(DELETE_CATEGORY, {\r\n refetchQueries: [{ query: GET_ALL_CATEGORIES }],\r\n onCompleted() {\r\n setOpen(false);\r\n },\r\n });\r\n const { id, folderName } = category;\r\n\r\n const handleDelete = () => {\r\n deleteCategory({\r\n variables: { id },\r\n });\r\n };\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n return (\r\n \r\n Confrim Delete\r\n \r\n This action CANNOT be reversed\r\n \r\n This will delete the folder and all the files inside, both\r\n upload & sorted folder. If you just want to hide the\r\n file from this category, please change it's active state.\r\n \r\n \r\n Do you confrim to delete folder: \r\n {folderName}\r\n ?\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nCategoryDelete.propTypes = {\r\n category: PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n folderName: PropTypes.string.isRequired,\r\n }).isRequired,\r\n open: PropTypes.bool.isRequired,\r\n setOpen: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default CategoryDelete;\r\n","import { useMutation, useQuery } from '@apollo/client';\r\nimport { Grid, List } from '@material-ui/core';\r\nimport React, { useState } from 'react';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { Link } from 'react-router-dom';\r\nimport Button from '@material-ui/core/Button';\r\nimport PublishIcon from '@material-ui/icons/Publish';\r\nimport AddIcon from '@material-ui/icons/Add';\r\nimport { GET_ALL_CATEGORIES, SORT_CATEGORY } from '../gql/categories';\r\nimport Note from './layout/Note';\r\nimport Loading from './layout/Loading';\r\nimport PageContainer from './layout/PageContainer';\r\nimport PagePaper from './layout/PagePaper';\r\nimport CategoriesItem from './CategoriesItem';\r\nimport handleArrayToggle from '../utils/handleArrayToggle';\r\nimport CategoryDelete from './CategoryDelete';\r\n\r\nconst { REACT_APP_UPLOAD_PATH, REACT_APP_SERVER_NAME } = process.env;\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n button: {\r\n margin: theme.spacing(1),\r\n },\r\n}));\r\n\r\nconst Categories = () => {\r\n const { loading, error, data } = useQuery(GET_ALL_CATEGORIES, {\r\n fetchPolicy: 'network-only',\r\n });\r\n const [sortLoading, setSortLoading] = useState([]);\r\n const [checked, setChecked] = useState([]);\r\n const [sortCategory] = useMutation(SORT_CATEGORY, {\r\n refetchQueries: [{ query: GET_ALL_CATEGORIES }],\r\n onCompleted({ sortCategory: { id } }) {\r\n handleArrayToggle(id, sortLoading, setSortLoading);\r\n setChecked([]);\r\n },\r\n });\r\n const classes = useStyles();\r\n const [deleteCategory, setDeleteCategory] = useState({\r\n id: '',\r\n folderName: '',\r\n });\r\n const [openDelete, setOpenDelete] = useState(false);\r\n const handleSort = () => {\r\n checked.map((id) => {\r\n sortCategory({\r\n variables: { id },\r\n });\r\n handleArrayToggle(id, sortLoading, setSortLoading);\r\n });\r\n };\r\n if (loading) return ;\r\n if (error) {\r\n console.log(`Error! ${error}`);\r\n return `Error! ${error}`;\r\n }\r\n return (\r\n <>\r\n \r\n \r\n {`Summary and mainenance of categories, to upload file, please put them\r\n into\r\n ${REACT_APP_UPLOAD_PATH}@${REACT_APP_SERVER_NAME}`}\r\n \r\n \r\n \r\n \r\n
\r\n }\r\n >\r\n add category\r\n \r\n }\r\n >\r\n sort files\r\n \r\n
\r\n \r\n {data.categories.map((category) => (\r\n \r\n ))}\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nexport default Categories;\r\n","import React, { Fragment, useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useHistory } from 'react-router-dom';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport FormGroup from '@material-ui/core/FormGroup';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport Switch from '@material-ui/core/Switch';\r\nimport { Button, Grid, makeStyles } from '@material-ui/core';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n label: {\r\n color: '#0000008a',\r\n marginLeft: '0px',\r\n },\r\n button: {\r\n marginRight: theme.spacing(2),\r\n },\r\n}));\r\n\r\nconst CategoryForm = ({ formik, error, edit }) => {\r\n const classes = useStyles();\r\n const history = useHistory();\r\n const [submitErrors, setSubmitErrors] = useState({\r\n folderName: '',\r\n });\r\n\r\n useEffect(() => {\r\n if (error) setSubmitErrors(error.graphQLErrors[0].extensions.errors);\r\n }, [error]);\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n label=\"Active\"\r\n className={classes.label}\r\n labelPlacement=\"start\"\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n submit\r\n \r\n {\r\n history.goBack();\r\n }}\r\n >\r\n cancel\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nCategoryForm.propTypes = {\r\n // eslint-disable-next-line react/forbid-prop-types\r\n formik: PropTypes.any.isRequired,\r\n // eslint-disable-next-line react/forbid-prop-types\r\n error: PropTypes.any.isRequired,\r\n edit: PropTypes.bool.isRequired,\r\n};\r\n\r\nexport default CategoryForm;\r\n","import { useMutation } from '@apollo/client';\r\nimport { Grid } from '@material-ui/core';\r\nimport React from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { ADD_CATEGORY, GET_ALL_CATEGORIES } from '../gql/categories';\r\nimport CategoryForm from './CategoryForm';\r\nimport Note from './layout/Note';\r\nimport PageContainer from './layout/PageContainer';\r\nimport PagePaper from './layout/PagePaper';\r\n\r\nconst CategoryAdd = () => {\r\n const history = useHistory();\r\n const [addCategory, { error }] = useMutation(ADD_CATEGORY, {\r\n refetchQueries: [{ query: GET_ALL_CATEGORIES }],\r\n onCompleted() {\r\n history.push('/categories');\r\n },\r\n });\r\n\r\n const formik = useFormik({\r\n initialValues: {\r\n folderName: '',\r\n displayName: '',\r\n active: true,\r\n desc: '',\r\n },\r\n validationSchema: Yup.object({\r\n folderName: Yup.string().trim().required('Please enter folder name'),\r\n displayName: Yup.string().trim().required('Please enter display name'),\r\n }),\r\n onSubmit: (input) => {\r\n input.disabled = !input.active;\r\n input.active = undefined;\r\n addCategory({ variables: { input } });\r\n },\r\n });\r\n\r\n return (\r\n \r\n Input info to add category\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CategoryAdd;\r\n","import { useMutation, useQuery } from '@apollo/client';\r\nimport { Grid } from '@material-ui/core';\r\nimport React from 'react';\r\nimport { useHistory, useParams } from 'react-router-dom';\r\nimport { useFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport {\r\n EDIT_CATEGORY,\r\n GET_ALL_CATEGORIES,\r\n GET_CATEGORY,\r\n} from '../gql/categories';\r\nimport CategoryForm from './CategoryForm';\r\nimport Note from './layout/Note';\r\nimport PageContainer from './layout/PageContainer';\r\nimport PagePaper from './layout/PagePaper';\r\nimport Loading from './layout/Loading';\r\n\r\nconst FormWrapper = ({ id, category, error, editCategory }) => {\r\n const { folderName, displayName, disabled, desc } = category;\r\n\r\n const formik = useFormik({\r\n initialValues: {\r\n folderName,\r\n displayName,\r\n active: !disabled,\r\n desc,\r\n },\r\n validationSchema: Yup.object({\r\n folderName: Yup.string().trim().required('Please enter folder name'),\r\n displayName: Yup.string().trim().required('Please enter display name'),\r\n }),\r\n onSubmit: (input) => {\r\n input.disabled = !input.active;\r\n input.active = undefined;\r\n editCategory({ variables: { id, input } });\r\n },\r\n });\r\n return ;\r\n};\r\n\r\nconst CategoryEdit = () => {\r\n const history = useHistory();\r\n const { id } = useParams();\r\n const { loading, error, data } = useQuery(GET_CATEGORY, {\r\n variables: { id },\r\n });\r\n const [editCategory, { error: editError }] = useMutation(EDIT_CATEGORY, {\r\n refetchQueries: [{ query: GET_ALL_CATEGORIES }],\r\n onCompleted() {\r\n history.push('/categories');\r\n },\r\n });\r\n\r\n if (loading) return ;\r\n if (error) {\r\n alert(JSON.stringify(error));\r\n return `Error! ${error}`;\r\n }\r\n\r\n return (\r\n \r\n Input info to edit category\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default CategoryEdit;\r\n","import { gql } from '@apollo/client';\r\n\r\nexport const GET_USERS = gql`\r\n query GET_USERS {\r\n users {\r\n id\r\n netId\r\n role\r\n disabled\r\n }\r\n }\r\n`;\r\n\r\nexport const GET_USER = gql`\r\n query GET_USER($id: ID!) {\r\n user(id: $id) {\r\n id\r\n netId\r\n role\r\n disabled\r\n }\r\n }\r\n`;\r\n\r\nexport const EDIT_USER = gql`\r\n mutation EDIT_USER($id: ID!, $input: UpdateUserInput!) {\r\n editUser(id: $id, input: $input) {\r\n id\r\n role\r\n netId\r\n disabled\r\n }\r\n }\r\n`;\r\n\r\nexport const TOGGLE_USER_DISABLED = gql`\r\n mutation TOGGLE_USER_DISABLED($id: ID!, $input: UpdateUserInput!) {\r\n editUser(id: $id, input: $input) {\r\n id\r\n disabled\r\n }\r\n }\r\n`;\r\n\r\nexport const DELETE_USER = gql`\r\n mutation DELETE_USER($id: ID!) {\r\n deleteUser(id: $id)\r\n }\r\n`;\r\n\r\nexport const ADD_USER = gql`\r\n mutation ADD_USER($input: UpdateUserInput!) {\r\n addUser(input: $input) {\r\n id\r\n }\r\n }\r\n`;\r\n","import React from 'react';\r\nimport { useMutation } from '@apollo/client';\r\nimport { NavLink } from 'react-router-dom';\r\nimport PropTypes from 'prop-types';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport PersonIcon from '@material-ui/icons/Person';\r\nimport Switch from '@material-ui/core/Switch';\r\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\r\nimport ListItemSecondaryAction from '@material-ui/core/ListItemSecondaryAction';\r\nimport { GET_USERS, TOGGLE_USER_DISABLED } from '../gql/users';\r\n\r\nconst UsersItem = ({ user }) => {\r\n const [toggleDisabled] = useMutation(TOGGLE_USER_DISABLED, {\r\n refetchQueries: [{ query: GET_USERS }],\r\n });\r\n const { id, netId, role, disabled } = user;\r\n const matches = useMediaQuery('(min-width:600px)');\r\n\r\n const handleSwitchToggle = () => {\r\n toggleDisabled({ variables: { id, input: { disabled: !disabled } } });\r\n };\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nUsersItem.propTypes = {\r\n user: PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n netId: PropTypes.string.isRequired,\r\n disabled: PropTypes.bool.isRequired,\r\n role: PropTypes.string.isRequired,\r\n }).isRequired,\r\n};\r\n\r\nexport default UsersItem;\r\n","import { useQuery } from '@apollo/client';\r\nimport React from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport List from '@material-ui/core/List';\r\nimport Button from '@material-ui/core/Button';\r\nimport PersonAddIcon from '@material-ui/icons/PersonAdd';\r\nimport PagePaper from './layout/PagePaper';\r\nimport Note from './layout/Note';\r\nimport PageContainer from './layout/PageContainer';\r\nimport { GET_USERS } from '../gql/users';\r\nimport Loading from './layout/Loading';\r\nimport UsersItem from './UsersItem';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n button: {\r\n margin: theme.spacing(1),\r\n },\r\n}));\r\n\r\nconst Users = () => {\r\n const classes = useStyles();\r\n const { loading, error, data } = useQuery(GET_USERS);\r\n\r\n if (loading) return ;\r\n if (error) {\r\n console.log(error);\r\n }\r\n\r\n return (\r\n <>\r\n \r\n Summary and mainenance of admin users\r\n \r\n \r\n \r\n
\r\n }\r\n >\r\n add user\r\n \r\n
\r\n \r\n {data.users.map((user) => (\r\n \r\n ))}\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Users;\r\n","import React, { Fragment, useState, useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useHistory } from 'react-router-dom';\r\nimport TextField from '@material-ui/core/TextField';\r\nimport Select from '@material-ui/core/Select';\r\nimport FormGroup from '@material-ui/core/FormGroup';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport FormHelperText from '@material-ui/core/FormHelperText';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport Switch from '@material-ui/core/Switch';\r\nimport { Button, Grid, makeStyles } from '@material-ui/core';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n label: {\r\n color: '#0000008a',\r\n marginLeft: '0px',\r\n },\r\n button: {\r\n marginRight: theme.spacing(2),\r\n },\r\n}));\r\n\r\nconst UserForm = ({ formik, error }) => {\r\n const classes = useStyles();\r\n const history = useHistory();\r\n const [submitErrors, setSubmitErrors] = useState({\r\n folderName: '',\r\n });\r\n\r\n useEffect(() => {\r\n if (error) setSubmitErrors(error.graphQLErrors[0].extensions.errors);\r\n }, [error]);\r\n\r\n return (\r\n <>\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n Role\r\n \r\n Admin\r\n \r\n Role (admin only)\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n label=\"Active\"\r\n className={classes.label}\r\n labelPlacement=\"start\"\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n submit\r\n \r\n {\r\n history.goBack();\r\n }}\r\n >\r\n cancel\r\n \r\n \r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nUserForm.propTypes = {\r\n // eslint-disable-next-line react/forbid-prop-types\r\n formik: PropTypes.any.isRequired,\r\n // eslint-disable-next-line react/forbid-prop-types\r\n error: PropTypes.any.isRequired,\r\n};\r\n\r\nexport default UserForm;\r\n","import { useMutation } from '@apollo/client';\r\nimport { Grid } from '@material-ui/core';\r\nimport React from 'react';\r\nimport { useHistory } from 'react-router-dom';\r\nimport { useFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { ADD_USER, GET_USERS } from '../gql/users';\r\nimport UserForm from './UserForm';\r\nimport Note from './layout/Note';\r\nimport PageContainer from './layout/PageContainer';\r\nimport PagePaper from './layout/PagePaper';\r\n\r\nconst UserAdd = () => {\r\n const history = useHistory();\r\n const [addUser, { error }] = useMutation(ADD_USER, {\r\n refetchQueries: [{ query: GET_USERS }],\r\n onCompleted() {\r\n history.push('/users');\r\n },\r\n });\r\n\r\n const formik = useFormik({\r\n initialValues: {\r\n netId: '',\r\n role: 'Admin',\r\n active: true,\r\n },\r\n validationSchema: Yup.object({\r\n netId: Yup.string().trim().required('Please enter NetID'),\r\n }),\r\n onSubmit: (input) => {\r\n // eslint-disable-next-line no-param-reassign\r\n input.disabled = !input.active;\r\n // eslint-disable-next-line no-param-reassign\r\n input.active = undefined;\r\n addUser({ variables: { input } });\r\n },\r\n });\r\n\r\n return (\r\n \r\n Input info to add user\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default UserAdd;\r\n","import React from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { useMutation } from '@apollo/client';\r\nimport { useHistory } from 'react-router-dom';\r\nimport Button from '@material-ui/core/Button';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nimport DialogActions from '@material-ui/core/DialogActions';\r\nimport DialogContent from '@material-ui/core/DialogContent';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport { Typography } from '@material-ui/core';\r\nimport { DELETE_USER, GET_USERS } from '../gql/users';\r\n\r\nconst UserDelete = ({ user, open, setOpen }) => {\r\n const history = useHistory();\r\n const [deleteUser] = useMutation(DELETE_USER, {\r\n refetchQueries: [{ query: GET_USERS }],\r\n onCompleted() {\r\n history.push('/users');\r\n },\r\n });\r\n const { id, netId } = user;\r\n\r\n const handleDelete = () => {\r\n deleteUser({\r\n variables: { id },\r\n });\r\n };\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n return (\r\n \r\n Confrim Delete\r\n \r\n This action CANNOT be reversed\r\n \r\n If you just want to remove admin right of this user, please change\r\n it's active state.\r\n \r\n \r\n Do you confrim to delete admin user:\r\n {netId}?\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nUserDelete.propTypes = {\r\n user: PropTypes.shape({\r\n id: PropTypes.string.isRequired,\r\n netId: PropTypes.string.isRequired,\r\n }).isRequired,\r\n open: PropTypes.bool.isRequired,\r\n setOpen: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default UserDelete;\r\n","import React, { useState } from 'react';\r\nimport { useMutation, useQuery } from '@apollo/client';\r\nimport PropTypes from 'prop-types';\r\nimport { useHistory, useParams } from 'react-router-dom';\r\nimport { useFormik } from 'formik';\r\nimport * as Yup from 'yup';\r\nimport { makeStyles } from '@material-ui/core';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport Button from '@material-ui/core/Button';\r\nimport UserForm from './UserForm';\r\nimport Note from './layout/Note';\r\nimport PageContainer from './layout/PageContainer';\r\nimport PagePaper from './layout/PagePaper';\r\nimport Loading from './layout/Loading';\r\nimport UserDelete from './UserDelete';\r\nimport { EDIT_USER, GET_USERS, GET_USER } from '../gql/users';\r\n\r\nconst useStyle = makeStyles((theme) => ({\r\n noteRoot: {\r\n display: 'flex',\r\n },\r\n noteText: {\r\n flex: '1',\r\n },\r\n deleteButton: {\r\n top: '-8px',\r\n },\r\n}));\r\n\r\nconst FormWrapper = ({ id, user, error, editUser }) => {\r\n const { netId, role, disabled } = user;\r\n\r\n const formik = useFormik({\r\n initialValues: {\r\n netId,\r\n role,\r\n active: !disabled,\r\n },\r\n validationSchema: Yup.object({\r\n netId: Yup.string().trim().required('Please enter NetID'),\r\n }),\r\n onSubmit: (input) => {\r\n // eslint-disable-next-line no-param-reassign\r\n input.disabled = !input.active;\r\n // eslint-disable-next-line no-param-reassign\r\n input.active = undefined;\r\n editUser({ variables: { id, input } });\r\n },\r\n });\r\n return ;\r\n};\r\n\r\nconst UserEdit = () => {\r\n const history = useHistory();\r\n const { id } = useParams();\r\n const classes = useStyle();\r\n const { loading, error, data } = useQuery(GET_USER, {\r\n variables: { id },\r\n });\r\n const [openDelete, setOpenDelete] = useState(false);\r\n const [editUser, { error: editError }] = useMutation(EDIT_USER, {\r\n refetchQueries: [{ query: GET_USERS }],\r\n onCompleted() {\r\n history.push('/users');\r\n },\r\n });\r\n\r\n if (loading) return ;\r\n if (error) {\r\n return `Error! ${error}`;\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n Input info to edit user\r\n {\r\n setOpenDelete(true);\r\n }}\r\n >\r\n Delete\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n );\r\n};\r\n\r\nFormWrapper.propTypes = {\r\n id: PropTypes.string.isRequired,\r\n user: PropTypes.shape({\r\n netId: PropTypes.string.isRequired,\r\n role: PropTypes.string.isRequired,\r\n disabled: PropTypes.bool.isRequired,\r\n }).isRequired,\r\n // eslint-disable-next-line react/forbid-prop-types\r\n error: PropTypes.any.isRequired,\r\n editUser: PropTypes.func.isRequired,\r\n};\r\n\r\nexport default UserEdit;\r\n","import React from 'react';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Container from '@material-ui/core/Container';\r\n\r\nconst Copyright = () => {\r\n return (\r\n \r\n {`Copyright © ${new Date().getFullYear()} The Hong Kong Polytechnic University. All Rights Reserved.`}\r\n \r\n );\r\n};\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n footer: {\r\n padding: theme.spacing(3, 2),\r\n marginTop: 'auto',\r\n backgroundColor:\r\n theme.palette.type === 'light'\r\n ? theme.palette.grey[200]\r\n : theme.palette.grey[800],\r\n },\r\n}));\r\n\r\nconst Footer = () => {\r\n const classes = useStyles();\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default Footer;\r\n","import React, { useEffect, useState } from 'react';\r\nimport { Route, Switch } from 'react-router-dom';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport CssBaseline from '@material-ui/core/CssBaseline';\r\nimport { useApolloClient, useQuery } from '@apollo/client';\r\nimport PrivateRoute from './PrivateRoute';\r\nimport RedirectSSO from './RedirectSSO';\r\nimport Login from './Login';\r\nimport Navbar from './layout/Navbar';\r\nimport Logout from './Logout';\r\nimport Home from './Home';\r\nimport Categories from './Categories';\r\nimport CategoryAdd from './CategoryAdd';\r\nimport CategoryEdit from './CategoryEdit';\r\nimport Users from './Users';\r\nimport UserAdd from './UserAdd';\r\nimport UserEdit from './UserEdit';\r\nimport Footer from './layout/Footer';\r\nimport { GET_TOKEN, REFRESH_TOKEN } from '../gql/auth';\r\nimport Loading from './layout/Loading';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n minHeight: '100vh',\r\n },\r\n}));\r\n\r\nconst Pages = () => {\r\n const [loading, setLoading] = useState(true);\r\n const { data } = useQuery(GET_TOKEN);\r\n const client = useApolloClient();\r\n const classes = useStyles();\r\n useEffect(() => {\r\n const getRefreshToken = async () => {\r\n try {\r\n await client.mutate({\r\n mutation: REFRESH_TOKEN,\r\n variables: { init: true },\r\n update: (cache, { data: { refreshToken } }) => {\r\n cache.writeQuery({\r\n query: GET_TOKEN,\r\n data: {\r\n token: refreshToken.token,\r\n netId: refreshToken.me.netId,\r\n role: refreshToken.me.role,\r\n loading: false,\r\n isLoggedIn: true,\r\n },\r\n });\r\n },\r\n });\r\n } catch (error) {\r\n client.writeQuery({ query: GET_TOKEN, data: { loading: false } });\r\n throw error;\r\n }\r\n };\r\n getRefreshToken();\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (data.loading === false) {\r\n setLoading(false);\r\n }\r\n }, [data]);\r\n\r\n if (loading) return ;\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n {\r\n return null;\r\n }}\r\n />\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Pages;\r\n","import React from 'react';\r\nimport { createBrowserHistory } from 'history';\r\nimport { Router } from 'react-router-dom';\r\n\r\n// material-ui\r\nimport {\r\n ThemeProvider,\r\n createMuiTheme,\r\n responsiveFontSizes,\r\n} from '@material-ui/core/styles';\r\nimport MomentUtils from '@date-io/moment';\r\nimport teal from '@material-ui/core/colors/teal';\r\nimport { MuiPickersUtilsProvider } from '@material-ui/pickers';\r\n\r\n// pages\r\nimport Apollo from './components/Apollo';\r\nimport Pages from './components/Pages';\r\n\r\n// material-ui theme\r\nlet theme = createMuiTheme({\r\n palette: {\r\n primary: teal,\r\n },\r\n typography: {\r\n body1: {\r\n fontSize: '0.875rem',\r\n '@media (min-width:960px)': {\r\n fontSize: '1rem',\r\n },\r\n },\r\n body2: {\r\n fontSize: '0.75rem',\r\n '@media (min-width:960px)': {\r\n fontSize: '0.875rem',\r\n },\r\n },\r\n },\r\n});\r\ntheme = responsiveFontSizes(theme);\r\n\r\nexport const history = createBrowserHistory({\r\n basename: process.env.REACT_APP_BASENAME,\r\n});\r\n\r\nconst App = () => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default App;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport 'react-app-polyfill/ie9';\r\nimport 'react-app-polyfill/ie11';\r\nimport 'react-app-polyfill/stable';\r\nimport './index.css';\r\nimport App from './App';\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n"],"sourceRoot":""}