{"version":3,"sources":["components/admin/AdminStyles.js","components/auth/useAdminSettings.js","components/store/QuizSlice.js","components/auth/PrivateRoute.js","components/Account.js","components/NavMenu.js","components/Home.js","components/Notice.js","components/ScrollToTop.js","components/theme.js","App.js","components/store/store.js","registerServiceWorker.js","index.js","components/auth/useAuth.js","components/CustomButton.js","components/Services.js"],"names":["AdminStyles","makeStyles","theme","root","flexGrow","error","color","palette","main","heading","borderBottom","primary","selectedButton","background","dark","picker","marginTop","spacing","marginBottom","backdrop","zIndex","drawer","tablePaging","switchLabel","errorDismissButton","accordion","fontWeight","display","domainList","formGrid","disabled","backgroundColor","grey","light","AdminSettingsContext","React","createContext","ProvideAdminSettings","props","adminsettings","useState","adminRoles","setAdminRoles","institutions","setInstitutions","appURL","setAppURL","modules","setModules","useEffect","axios","get","withCredentials","then","response","data","catch","refreshInstitutions","useProvideAdminSettings","Provider","value","children","useAdminSettings","useContext","defaultQuizState","page","firstAttempt","answers","active","score","completion","updated","quizAdapter","createEntityAdapter","GetQuiz","getSelectors","id","createSelector","state","quizState","entities","quizStateSlice","createSlice","name","initialState","getInitialState","reducers","UpdateQuizState","action","upsertOne","payload","actions","NoAccess","path","auth","useAuth","user","Fragment","Typography","variant","component","Button","Link","to","aria-label","src","PrivateRoute","Component","isStudent","isSuperAdmin","isInstitutionSuperAdmin","isDataDownloadAdmin","isFeedbackAdmin","isRefreshAdmin","hideIfInvalid","location","rest","interceptors","use","status","signout","Promise","reject","canView","renderInside","canLogin","pathname","CircularProgress","render","AccountService","request","put","Account","classes","errors","setErrors","setError","useReducer","newState","formInput","setFormInput","handleEditConfirm","e","preventDefault","signin","onClose","title","handleInput","target","Dialog","open","fullWidth","maxWidth","aria-labelledby","DialogTitle","DialogContent","mustsave","className","noValidate","autoComplete","onSubmit","Alert","severity","givenName","TextField","label","defaultValue","onChange","required","surname","orgUnit","idNumber","FormControlLabel","control","Switch","checked","DialogActions","CustomButton","onClick","startIcon","useStyles","navbar","padding","paddingTop","paddingBottom","logo","maxHeight","margin","fg","button","boxShadow","fontSize","NavMenu","anchorEl","setAnchorEl","setOpen","firstTime","setFirstTime","useLocation","origin","setOrigin","process","build","handleClose","profileVerified","AppBar","position","elevation","Container","Toolbar","sx","flexWrap","disableGutters","Box","alt","event","currentTarget","Menu","getContentAnchorEl","anchorOrigin","vertical","horizontal","transformOrigin","keepMounted","Boolean","MenuItem","console","log","reason","tileStyles","border","borderRadius","height","details","flexDirection","flex","fontFamily","fontFamily1","grid","cover","width","flexShrink","chip","bottom","left","textTransform","whiteSpace","textOverflow","completedChip","breakpoints","down","chipRefresh","chipDuration","top","content","paddingLeft","justifyContent","desc","lineHeight","startButton","ModuleTile","image","description","url","allStaff","refreshCycle","refreshRequest","onSelfReset","estimate","startButtonText","setStartButtonText","actualUrl","setActualUrl","refreshRequired","setRefreshRequired","refreshDue","setRefreshDue","lastJourney","setLastJourney","branchURL","moment","utc","visitedDateTime","toDate","Date","diff","add","UserJourneyServices","Card","CardMedia","CardContent","gutterBottom","Chip","Tooltip","size","avatar","local","format","CheckRounded","CardActions","allowSelfReset","IconButton","Home","okToLoad","setOKToLoad","setCompletions","setRefreshRequest","completionTimes","setCompletionTimes","loading","setLoading","sessionStorage","getItem","goto","removeItem","window","ModuleCompletionServices","getLast","arr","forEach","i","moduleID","completionDateTime","loadRefresRequests","RefreshRequestServices","refreshRequestDate","selfReset","create","userID","Helmet","style","Grid","container","direction","alignItems","item","xs","sm","md","refreshCycles","Backdrop","Notice","processing","setProcessing","querystr","URLSearchParams","search","setItem","href","right","icon","ScrollToTop","trigger","useScrollTrigger","threshold","disableHysteresis","scroll","scrollTo","noScroll","Slide","appear","in","Fab","fontFamily2","fontSpacing","factor","secondary","tertiary","danger","red","A400","success","green","default","text","orange","typography","body1","body2","listItemText","h1","h2","subtitle1","h3","h4","createTheme","values","lg","xl","Admin","lazy","Module1","Module2","Module3","Module4","App","ThemeProvider","StylesProvider","CssBaseline","exact","fallback","store","configureStore","reducer","persistReducer","key","version","storage","localForage","combineReducers","quizStateReducer","middleware","getDefaultMiddleware","serializableCheck","ignoredActions","FLUSH","REHYDRATE","PAUSE","PERSIST","PURGE","REGISTER","isLocalhost","hostname","match","registerValidSW","swUrl","onUpdate","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","waiting","postMessage","type","baseUrl","document","getElementsByTagName","getAttribute","rootElement","getElementById","NewVersionAlert","Snackbar","this","setState","message","displayName","persistor","persistStore","ReactDOM","basename","URL","addEventListener","fetch","headers","indexOf","ready","unregister","reload","checkValidServiceWorker","registerServiceWorker","d","createElement","appendChild","authContext","ProvideAuth","setUser","loginURL","setLoginURL","setRefreshCycles","setAllowSelfReset","updateUser","u","localStorage","JSON","stringify","aafAuth","getLoginURL","stored","parse","ModuleRefreshSettingServices","getCycles","refreshSetting","InstitutionServices","getAllowSelfReset","useProvideAuth","isAuthenticated","customButton","marginRight","textTertiary","alpha","hoverOpacity","outlinedTertiary","containedTertiary","contrastText","forwardRef","ref","other","clsx","rooturl","post","getCert","moduleid","filename","responseType","QuizAttemptServices","FeedbackServices"],"mappings":"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","file":"static/js/main.a5482ef6.chunk.js","sourcesContent":["import { makeStyles } from '@material-ui/core/styles';\r\n\r\nconst AdminStyles = makeStyles((theme) => ({\r\n root: {\r\n flexGrow: 1,\r\n },\r\n error: {\r\n color: theme.palette.error.main\r\n },\r\n heading: {\r\n borderBottom: '1px solid ' + theme.palette.primary.main\r\n },\r\n\r\n selectedButton: {\r\n background: theme.palette.primary.dark\r\n },\r\n picker: {\r\n \"& .MuiTypography-body2\": {\r\n marginTop: '0',\r\n },\r\n \"& .MuiTypography-subtitle1\": {\r\n marginTop: theme.spacing(2), \r\n marginBottom: theme.spacing(0)\r\n }\r\n },\r\n backdrop: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n color: '#ffffffaa'\r\n },\r\n tablePaging: {\r\n \"& .MuiTablePagination-input\": {\r\n marginTop: theme.spacing(3)\r\n }\r\n },\r\n switchLabel: {\r\n \"& .MuiFormControlLabel-label\": {\r\n marginBottom: theme.spacing(0),\r\n \r\n }\r\n },\r\n errorDismissButton: {\r\n \"& .MuiButton-label\": {\r\n color: \"#fff\"\r\n }\r\n },\r\n accordion: {\r\n \"& .MuiAccordionSummary-content h4\": {\r\n fontWeight: \"bold\",\r\n marginTop: theme.spacing(1),\r\n marginBottom: theme.spacing(1),\r\n },\r\n \"& .MuiAccordionDetails-root\": {\r\n display: \"block\",\r\n }\r\n }, \r\n domainList: {\r\n \"& .MuiListItemText-primary\": {\r\n marginTop: theme.spacing(1),\r\n marginBottom: 0\r\n }\r\n },\r\n formGrid: {\r\n marginTop: theme.spacing(1),\r\n },\r\n disabled: {\r\n backgroundColor: theme.palette.grey.light,\r\n \r\n }\r\n}));\r\n\r\nexport default AdminStyles;","import React, { useState, useContext, createContext, useEffect } from \"react\";\r\nimport axios from 'axios';\r\n\r\nconst AdminSettingsContext = React.createContext();\r\n\r\nconst ProvideAdminSettings = (props) => {\r\n const adminsettings = useProvideAdminSettings();\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n}\r\nfunction useProvideAdminSettings() {\r\n const [adminRoles, setAdminRoles] = useState([]);\r\n const [institutions, setInstitutions] = useState([]);\r\n const [appURL, setAppURL] = useState('');\r\n const [modules, setModules] = useState([]);\r\n\r\n const refreshInstitutions = () => {\r\n axios.get(\"api/institution/list\", {}, { withCredentials: true }).then(response => {\r\n setInstitutions(response.data.data);\r\n }).catch(() => {\r\n setInstitutions([]);\r\n });\r\n }\r\n useEffect(() => {\r\n axios.get(\"api/util/adminroles\", {}, { withCredentials: true }).then(response => {\r\n setAdminRoles(response.data);\r\n }).catch(() => {\r\n setAdminRoles([]);\r\n });\r\n axios.get(\"api/util/appurl\", {}, { withCredentials: true }).then(response => {\r\n setAppURL(response.data);\r\n }).catch(() => {\r\n setAppURL('');\r\n });\r\n axios.get(\"api/module/all\", {}, { withCredentials: true }).then(response => {\r\n setModules(response.data);\r\n }).catch(() => {\r\n setModules([]);\r\n });\r\n axios.get(\"api/institution/list\", {}, { withCredentials: true }).then(response => {\r\n setInstitutions(response.data.data);\r\n }).catch(() => {\r\n setInstitutions([]);\r\n });\r\n }, []);\r\n \r\n return { adminRoles, institutions, appURL, modules, refreshInstitutions};\r\n}\r\nfunction useAdminSettings() {\r\n return useContext(AdminSettingsContext);\r\n\r\n}\r\n\r\nexport default useAdminSettings;\r\nexport { ProvideAdminSettings };","import { createSlice, createEntityAdapter } from '@reduxjs/toolkit';\r\nimport { createSelector } from 'reselect'\r\n\r\nexport const defaultQuizState = {\r\n page: 0,\r\n firstAttempt: true,\r\n answers: {},\r\n active: false,\r\n score: 0,\r\n completion: null,\r\n updated: null\r\n //displayFeedback: false,\r\n //refreshRequest: null\r\n};\r\n\r\n\r\nconst quizAdapter = createEntityAdapter();\r\nconst selectors = quizAdapter.getSelectors();\r\n\r\n//need our own selector so we can create the quiz if it does not exist\r\nexport const GetQuiz = id => createSelector(\r\n (state) => state.quizState,\r\n (state) => {\r\n var q;\r\n if (!(id in state.entities)) {\r\n q = { id: id, ...defaultQuizState };\r\n } else {\r\n q = state.entities[id];\r\n }\r\n return q;\r\n }\r\n);\r\n\r\nconst quizStateSlice = createSlice({\r\n name: 'quizState',\r\n initialState: quizAdapter.getInitialState(),\r\n reducers: {\r\n UpdateQuizState: (state, action) => {\r\n //, updated: new Date().toISOString()\r\n quizAdapter.upsertOne(state, { ...action.payload });\r\n }\r\n }\r\n});\r\n\r\nexport const { UpdateQuizState } = quizStateSlice.actions;\r\nexport default quizStateSlice.reducer;","import useAuth from '../auth/useAuth.js';\r\nimport axios from 'axios';\r\nimport React, { useState, useLocation, useEffect } from \"react\";\r\nimport { Route, Link} from \"react-router-dom\";\r\nimport { CircularProgress, Button, Typography } from '@material-ui/core';\r\n\r\nconst NoAccess = ({path }) => {\r\n let auth = useAuth();\r\n const login = () => { auth.signin(); }; \r\n\r\n return (
\r\n\r\n {!auth.user ?\r\n \r\n Log in\r\n Please log in to access EO Online.\r\n \r\n \r\n

\r\n
\r\n About\r\n EO Online is an equal opportunity professional development program for Australian Universities. This is the third version, completed in 2022.\r\n Every attempt has been made to meet WC3 international accessibility guidelines. \r\n
\r\n : \r\n No permission to view\r\n You do not have access to this area. Insufficient privileges.\r\n }\r\n
);\r\n};\r\n\r\nfunction PrivateRoute({ children, component: Component, isStudent, isSuperAdmin, isInstitutionSuperAdmin, isDataDownloadAdmin, isFeedbackAdmin, isRefreshAdmin, hideIfInvalid, location: location, ...rest }) {\r\n let auth = useAuth();\r\n\r\n axios.interceptors.response.use(function (response) {\r\n // Any status code that lie within the range of 2xx cause this function to trigger\r\n // Do something with response data\r\n return response;\r\n }, function (error) {\r\n // Any status codes that falls outside the range of 2xx cause this function to trigger\r\n // Do something with response error\r\n\r\n if (401 === error.response.status) {\r\n auth.signout()\r\n }\r\n\r\n return Promise.reject(error);\r\n });\r\n\r\n const canView = () => {\r\n if (auth.user) {\r\n if (isStudent && auth.user.isStudent) return true;\r\n if (isSuperAdmin && auth.user.isSuperAdmin) return true;\r\n if (isInstitutionSuperAdmin && auth.user.isInstitutionSuperAdmin) return true;\r\n if (isDataDownloadAdmin && auth.user.isDataDownloadAdmin) return true;\r\n if (isFeedbackAdmin && auth.user.isFeedbackAdmin) return true;\r\n if (isRefreshAdmin && auth.user.isRefreshAdmin) return true;\r\n\r\n if (!isStudent && !isSuperAdmin && !isInstitutionSuperAdmin && \r\n !isDataDownloadAdmin && !isFeedbackAdmin && !isRefreshAdmin) return true;\r\n }\r\n return false;\r\n };\r\n\r\n const renderInside = () => {\r\n //all good, display component if it is set (like normal routes can have), or display the children if not\r\n if (auth.user && canView()) {\r\n return (Component ? : children);\r\n }\r\n\r\n\r\n if (auth.user && canView()) {\r\n return (Component ? : children);\r\n }\r\n \r\n //need login to see\r\n if (!hideIfInvalid) {\r\n //but waiting for initial fetch of user data\r\n if (auth.user == null && !auth.canLogin())\r\n return ;\r\n else {\r\n return ;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n return (\r\n {\r\n return (\r\n { renderInside() }\r\n );\r\n }}\r\n />\r\n );\r\n}\r\n\r\nexport default PrivateRoute;","import React, { useState, useEffect, useReducer, useContext } from 'react';\r\nimport useAuth from './auth/useAuth.js';\r\nimport axios from 'axios';\r\nimport Check from '@material-ui/icons/Check';\r\nimport TextField from '@material-ui/core/TextField';\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 Switch from '@material-ui/core/Switch';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\r\nimport Alert from '@material-ui/lab/Alert';\r\nimport CustomButton from './CustomButton.js';\r\nimport AdminStyles from './admin/AdminStyles.js';\r\n\r\n\r\nconst AccountService = {\r\n get: (request) => {\r\n return axios.get(\"api/user\", {}, { withCredentials: true });\r\n },\r\n update: (request) => {\r\n return axios.put(\"api/user\", request, { withCredentials: true });\r\n },\r\n};\r\nconst Account = (props) => {\r\n const auth = useAuth();\r\n const classes = AdminStyles();\r\n const [errors, setErrors] = useState({});\r\n const [error, setError] = useState(null);\r\n const [formInput, setFormInput] = useReducer((state, newState) => ({ ...state, ...newState }), auth.user);\r\n \r\n const handleEditConfirm = (e) => {\r\n if (e) e.preventDefault();\r\n return AccountService.update(formInput).then((response) => {\r\n setFormInput({ [\"id\"]: response.data.id });\r\n let formInp = { ...formInput };\r\n formInp.id = response.data.id; \r\n setError(\"\");\r\n setErrors({});\r\n auth.signin().then(response => { props.onClose(); }); \r\n \r\n }).catch((error) => {\r\n if ('response' in error && 'data' in error.response) {\r\n setError(error.response.data.title);\r\n setErrors(error.response.data.errors);\r\n }\r\n });\r\n };\r\n const handleInput = (e) => { setFormInput({ [e.target.name]: e.target.value }); };\r\n const handleInputCheckbox = (e) => { setFormInput({ [e.target.name]: e.target.checked }); };\r\n return (\r\n <>\r\n \r\n Update my details\r\n \r\n {props.mustsave ?
This is the first time you have logged in to EO Online. Please complete your details below before you proceed. This information is used to record your EO Online completion.

: \"\"}\r\n
\r\n {error ? {error} : \"\"} \r\n
{formInput.givenName == \"\" ? First Name is required : null}
\r\n
\r\n
{formInput.orgUnit == \"\" ? Organisation unit is required : null}
\r\n
{formInput.idNumber == \"\" ? ID Number is required : null}
\r\n } />\r\n \r\n
\r\n \r\n }>Save\r\n {!props.mustsave ? { setFormInput(auth.user); props.onClose(); }} color=\"default\" variant=\"outlined\">Cancel : null}\r\n \r\n
\r\n \r\n )\r\n\r\n\r\n};\r\n\r\nexport default Account;\r\nexport { AccountService };\r\n","import useAuth from './auth/useAuth.js';\r\nimport CustomButton from './CustomButton.js';\r\n\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport { Link, useLocation } from 'react-router-dom';\r\nimport React, { useState, useEffect } from 'react';\r\nimport { Button, AppBar, Toolbar, Box, Container } from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport PersonIcon from '@material-ui/icons/Person';\r\nimport Account, { AccountService } from './Account';\r\nimport Dialog from '@material-ui/core/Dialog';\r\nconst useStyles = makeStyles((theme) => ({\r\n navbar: {\r\n background: theme.palette.primary.main,\r\n padding: 0,\r\n paddingTop: theme.spacing(2),\r\n paddingBottom: theme.spacing(2)\r\n },\r\n logo: {\r\n maxHeight: '60px',\r\n margin: theme.spacing(1)\r\n },\r\n fg: {\r\n flexGrow: \"1\"\r\n },\r\n button: {\r\n boxShadow: \"none\",\r\n color: \"#ffffff\",\r\n fontSize: \"1.2rem\"\r\n }\r\n}));\r\nconst NavMenu = () => {\r\n const classes = useStyles();\r\n const auth = useAuth();\r\n const login = () => { auth.signin(); };\r\n const logout = () => { auth.signout(); };\r\n const [anchorEl, setAnchorEl] = useState(null);\r\n const [open, setOpen] = useState(false);\r\n const [firstTime, setFirstTime] = useState(false);\r\n let location = useLocation();\r\n const [origin, setOrigin] = useState('/');\r\n const [build, setBuild] = useState(process.env.REACT_APP_BUILD_VERSION);\r\n useEffect(() => {\r\n if (location.pathname != \"/ip\")\r\n // remember where I was before redirected to login\r\n setOrigin(location.pathname);\r\n\r\n }, [location]);\r\n const handleMenu = (event) => {\r\n setAnchorEl(event.currentTarget);\r\n }\r\n const handleClose = () => {\r\n\r\n setAnchorEl(null);\r\n\r\n };\r\n const handleAccount = () => {\r\n console.log(open);\r\n setOpen(true);\r\n handleClose();\r\n };\r\n const handleAccountClose = (event, reason) => {\r\n \r\n // only allow close if it's not first time\r\n if (!firstTime) {\r\n setOpen(false);\r\n }\r\n };\r\n useEffect(() => {\r\n if (auth && auth.user) {\r\n if (!auth.user.profileVerified) {\r\n setOpen(true);\r\n setFirstTime(true);\r\n }\r\n else {\r\n setOpen(false);\r\n setFirstTime(false);\r\n }\r\n }\r\n \r\n }, [auth.user])\r\n return (\r\n \r\n \r\n \r\n \r\n \"equal\r\n \r\n \r\n {auth && auth.user ?\r\n \r\n :\r\n \r\n }\r\n \r\n \r\n \r\n \r\n \r\n {auth && auth.user ? : null}\r\n\r\n );\r\n}\r\nexport default NavMenu;","import useAuth from './auth/useAuth.js';\r\nimport CustomButton from './CustomButton.js';\r\nimport Moment from 'react-moment';\r\nimport moment from 'moment';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Typography, Button, Grid, Chip, Card, CardActions, CardMedia, CardContent, CircularProgress, Backdrop } from '@material-ui/core';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { alpha } from '@material-ui/core/styles/colorManipulator';\r\nimport { Helmet } from \"react-helmet\";\r\nimport { UserJourneyServices, ModuleCompletionServices, RefreshRequestServices } from './Services.js';\r\nimport { CheckRounded } from '@material-ui/icons';\r\nimport RotateLeftRoundedIcon from '@material-ui/icons/RotateLeftRounded';\r\nimport WatchLaterRoundedIcon from '@material-ui/icons/WatchLaterRounded';\r\nimport HourglassFullRoundedIcon from '@material-ui/icons/HourglassFullRounded';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\n\r\nconst tileStyles = makeStyles((theme) => ({\r\n root: {\r\n display: 'flex',\r\n border: \"1px solid \" + theme.palette.grey.main,\r\n position: 'relative',\r\n borderRadius: '0',\r\n height: \"100%\"\r\n },\r\n details: {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n flex: '1'\r\n },\r\n title: {\r\n fontFamily: theme.fontFamily1\r\n },\r\n grid: {\r\n marginTop: theme.spacing(2)\r\n },\r\n cover: {\r\n width: \"40%\",\r\n flexShrink: 0\r\n },\r\n chip: {\r\n position: 'absolute',\r\n bottom: theme.spacing(1),\r\n left: theme.spacing(1),\r\n borderRadius: \"0\",\r\n background: \"#FFF\",\r\n color: theme.palette.primary.dark,\r\n textTransform: \"uppercase\",\r\n fontWeight: \"bold\",\r\n maxWidth: 100,\r\n fontSize: \"0.9rem\",\r\n height: \"auto\",\r\n \"& .MuiChip-label\": {\r\n whiteSpace: \"normal\",\r\n textOverflow: \"unset\"\r\n }\r\n\r\n },\r\n completedChip: {\r\n borderRadius: \"0\",\r\n background: \"#FFF\",\r\n color: theme.palette.primary.dark,\r\n textTransform: \"uppercase\",\r\n fontWeight: \"bold\",\r\n fontSize: \"0.9rem\",\r\n height: \"auto\",\r\n \"& .MuiChip-label\": {\r\n [theme.breakpoints.down('md')]: {\r\n padding: 0\r\n },\r\n whiteSpace: \"normal\",\r\n textOverflow: \"unset\"\r\n },\r\n \"& .MuiChip-avatar\": {\r\n color: theme.palette.primary.dark,\r\n background: 'transparent',\r\n [theme.breakpoints.down('md')]: {\r\n display: 'none'\r\n }, \r\n },\r\n },\r\n chipRefresh: {\r\n flexShrink:\"0\",\r\n borderRadius: \"0\",\r\n background: \"#FFF\",\r\n color: theme.palette.primary.dark,\r\n textTransform: \"uppercase\",\r\n fontWeight: \"bold\",\r\n fontSize: \"0.9rem\",\r\n height: \"auto\",\r\n \"& .MuiChip-label\": {\r\n [theme.breakpoints.down('md')]: {\r\n padding: 0\r\n },\r\n whiteSpace: \"normal\",\r\n textOverflow: \"unset\",\r\n },\r\n \"& .MuiChip-avatar\": {\r\n color: theme.palette.primary.dark,\r\n background: 'transparent',\r\n [theme.breakpoints.down('md')]: {\r\n display: 'none'\r\n },\r\n },\r\n \"& .MuiChip-avatarSmall\": {\r\n\r\n }\r\n },\r\n chipDuration: {\r\n position: 'absolute',\r\n top: theme.spacing(1),\r\n left: theme.spacing(0),\r\n borderRadius: \"0\",\r\n background: \"#FFF\",\r\n color: theme.palette.primary.dark,\r\n textTransform: \"uppercase\",\r\n fontWeight: \"bold\",\r\n maxWidth: 150,\r\n fontSize: \"0.8rem\",\r\n height: \"auto\",\r\n \"& .MuiChip-label\": {\r\n whiteSpace: \"normal\",\r\n textOverflow: \"unset\"\r\n },\r\n \"& .MuiChip-avatar\": {\r\n color: theme.palette.primary.dark,\r\n background: 'transparent', \r\n },\r\n },\r\n content: {\r\n flex: '1 0 auto',\r\n paddingTop: 0\r\n },\r\n actions: {\r\n paddingBottom: theme.spacing(2),\r\n paddingLeft: 0,\r\n justifyContent: \"flex-end\",\r\n\r\n\r\n },\r\n desc: {\r\n fontSize: \"0.9rem\",\r\n lineHeight: \"1.3rem\"\r\n },\r\n startButton: {\r\n\r\n },\r\n backdrop: {\r\n zIndex: theme.zIndex.drawer + 1,\r\n color: '#ffffffaa'\r\n },\r\n}));\r\nconst ModuleTile = ({ title, image, description, url, alt, allStaff, completion, refreshCycle, refreshRequest, onSelfReset, estimate }) => {\r\n let auth = useAuth();\r\n const classes = tileStyles();\r\n const [startButtonText, setStartButtonText] = useState(\"Start module\");\r\n const [actualUrl, setActualUrl] = useState(url);\r\n const [refreshRequired, setRefreshRequired] = useState(false);\r\n const [refreshDue, setRefreshDue] = useState(null);\r\n const [lastJourney, setLastJourney] = useState(null);\r\n\r\n const login = () => { auth.signin(); };\r\n\r\n useEffect(() => { \r\n if (completion == null) {\r\n if (lastJourney == null) {\r\n // first time, never done this module before\r\n // start button\r\n setActualUrl(url);\r\n setStartButtonText(\"Start module\");\r\n \r\n } else {\r\n // has started but not yet completed\r\n //continue button\r\n setActualUrl(url + \"/\" + (lastJourney.branchURL != null ? lastJourney.branchURL : \"\"));\r\n setStartButtonText(\"Continue module\");\r\n\r\n }\r\n }\r\n else {\r\n if (lastJourney != null) {\r\n //console.log(refreshRequired);\r\n if (refreshRequired) {\r\n //console.log(url + \" refresh due: \" + refreshDue);\r\n //console.log(url + \" lastvisited: \" + moment.utc(lastJourney.visitedDateTime).toDate());\r\n // need to be in moment format as refreshDue is calculated in moment\r\n if (moment.utc(lastJourney.visitedDateTime).toDate() > refreshDue) {\r\n // need refresh and has started but not yet completed the refresh\r\n // continue\r\n setActualUrl(url + \"/\" + (lastJourney.branchURL != null ? lastJourney.branchURL : \"\") );\r\n setStartButtonText(\"Continue module\");\r\n } else {\r\n // need refresh but hasn't started \r\n // start\r\n setActualUrl(url);\r\n setStartButtonText(\"Start module\");\r\n }\r\n }\r\n else {\r\n if (lastJourney.visitedDateTime > completion) {\r\n // completed, don't need refresh, but has gone back in after completing, so need to remember where the user was last\r\n // review\r\n setActualUrl(url + \"/\" + (lastJourney.branchURL != null ? lastJourney.branchURL : \"\"));\r\n setStartButtonText(\"Review module\");\r\n } else {\r\n // completed, don't need refresh, and hasn't gone back in since, show restart button in case users want to restart at their own will\r\n // review\r\n setActualUrl(url);\r\n setStartButtonText(\"Review module\");\r\n }\r\n }\r\n }\r\n }\r\n \r\n \r\n }, [refreshRequired, refreshDue, lastJourney, completion]);\r\n useEffect(() => {\r\n if (refreshCycle != null) {\r\n if (completion != null) {\r\n var daylapse = moment.utc(new Date()).diff(moment.utc(completion), 'days');\r\n //console.log(\"daylapse:\" + daylapse);\r\n //console.log(\"utc time: \" + moment().utc().format());\r\n if (daylapse < refreshCycle) {\r\n setRefreshRequired(false);\r\n } else {\r\n setRefreshDue(moment.utc(completion).add(refreshCycle, 'd').toDate());\r\n //console.log(url + \" refresh due date set by cycle\");\r\n setRefreshRequired(true);\r\n\r\n }\r\n } else {\r\n // this is the first time user doing this module\r\n setRefreshRequired(false);\r\n }\r\n } else {\r\n setRefreshRequired(false);\r\n }\r\n //check for one-off refresh request\r\n if (refreshRequest != null) {\r\n if (completion != null) {\r\n //console.log(url + \" refresh request: \" + refreshRequest);\r\n //console.log(url + \" completion: \" + completion);\r\n if (refreshRequest > completion) {\r\n setRefreshRequired(true);\r\n setRefreshDue(moment.utc(refreshRequest).toDate());\r\n //console.log(url + \" refresh due date set by request\");\r\n \r\n }\r\n }\r\n }\r\n }, [refreshCycle, completion, refreshRequest]);\r\n\r\n //user has visited a page in the module, grab the last journey\r\n useEffect(() => {\r\n UserJourneyServices.get(url).then(response => {\r\n if (response.data) {\r\n setLastJourney(response.data);\r\n }\r\n });\r\n\r\n //var previous = localStorage.getItem(\"eo_progress_\" + url);\r\n //var prevDate = localStorage.getItem(\"eo_progress_date_\" + url);\r\n //if (previous && prevDate) {\r\n // var progressDate = new Date(parseInt(prevDate));\r\n // var diffDays = Math.round(Math.abs(((new Date()) - progressDate) / (24 * 60 * 60 * 1000)));\r\n // if (diffDays < 30) {\r\n // setActualUrl(url + \"/\" + previous);\r\n // setCont(true);\r\n // }\r\n //}\r\n }, [url]);\r\n return (\r\n \r\n {image ? : null}\r\n
\r\n \r\n {title ? {title} : null}\r\n \r\n \r\n {description}\r\n \r\n \r\n {!auth.user && auth.canLogin() ? null :\r\n <>\r\n {completion != null ?\r\n <>\r\n {refreshRequired ?\r\n } /> :\r\n } />}\r\n \r\n : null}\r\n \r\n \r\n \r\n }\r\n \r\n \r\n \r\n {!auth.user && auth.canLogin() ?\r\n Login to access :\r\n <>{auth.allowSelfReset && !refreshRequired && completion != null ? \r\n \r\n : null}{startButtonText}\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\nconst Home = () => {\r\n const classes = tileStyles();\r\n // flag to prevent homepage to flash before redirect\r\n const [okToLoad, setOKToLoad] = useState(false);\r\n const [completions, setCompletions] = useState([]);\r\n const [refreshRequest, setRefreshRequest] = useState([null, null, null, null]);\r\n const [completionTimes, setCompletionTimes] = useState([null, null, null, null]);\r\n const [loading, setLoading] = useState(false);//don't let user click when calling api\r\n\r\n let auth = useAuth();\r\n useEffect(() => { \r\n // send those who came here from path that's not '/' to where they were\r\n if (sessionStorage.getItem(\"redirectPath\") && sessionStorage.getItem(\"redirectPath\") != \"/\") { \r\n var goto = sessionStorage.getItem(\"redirectPath\");\r\n sessionStorage.removeItem(\"redirectPath\");\r\n window.location = process.env.PUBLIC_URL + goto;\r\n \r\n } else { setOKToLoad(true); }\r\n setLoading(true);\r\n ModuleCompletionServices.getLast().then(response => {\r\n setCompletions(response.data);\r\n var arr = [null, null, null, null];\r\n response.data.forEach((i) => {\r\n arr[i.moduleID - 1] = i.completionDateTime;\r\n });\r\n setCompletionTimes(arr);\r\n setLoading(false);\r\n });\r\n setLoading(true);\r\n loadRefresRequests();\r\n\r\n }, []);\r\n const loadRefresRequests = () => {\r\n\r\n RefreshRequestServices.getLast().then(response => {\r\n var arr = [null, null, null, null];\r\n response.data.forEach((i) => {\r\n arr[i.moduleID - 1] = i.refreshRequestDate;\r\n });\r\n setRefreshRequest(arr);\r\n setLoading(false);\r\n });\r\n }\r\n const selfReset = (moduleID) => {\r\n setLoading(true);\r\n RefreshRequestServices.create({ moduleID: moduleID, userID: auth.user.id}).then((response) => {\r\n loadRefresRequests(); \r\n });\r\n }\r\n return (\r\n \r\n {okToLoad ?\r\n
\r\n\r\n \r\n Equal Opportunity Online\r\n \r\n Equal Opportunity Online\r\n Diversity and Inclusion for All\r\n Welcome! Thanks for taking the time to engage with this important program.\r\n Our hope is that in completing these modules you will discover the rich\r\n benefits that flow to us as we pursue our objectives of being a diverse\r\n and inclusive workplace.\r\n This starts with you. You belong here. Diversity and inclusion\r\n acknowledges the unique combination of attributes that make up who\r\n you are and the value that your lived experiences bring to our\r\n University. Thanks for being you!\r\n This is also about us. It's about the things we do and say,\r\n and the policies and procedures that we implement to send the right messages\r\n every day to our colleagues that \"you belong here too!\"\r\n By completing this program, you will:\r\n
    \r\n understand the importance and value of a diverse and inclusive workplace;\r\n know your Equal Employment Opportunity (EEO) rights and responsibilities;\r\n identify different forms of discrimination including practical prevention strategies;\r\n understand the importance of positive workplace relationships; and\r\n understand the critical role that managers and leaders play through intentional inclusion.\r\n
\r\n\r\n Program Overview\r\n The program is divided into 4 modules.\r\n
    \r\n All staff members need to complete Modules 1 to 3.\r\n Module 4 is for Managers and Team Leaders (although staff without supervisory responsibility are welcome to complete it).\r\n
\r\n\r\n \r\n \r\n selfReset(1)} />\r\n \r\n \r\n selfReset(2)} />\r\n \r\n \r\n selfReset(3)} />\r\n \r\n \r\n selfReset(4)} />\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 Home;\r\n","import useAuth from './auth/useAuth.js';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Button, Typography } from '@material-ui/core';\r\nimport { useParams, useLocation } from 'react-router-dom';\r\nconst Notice = () => {\r\n let auth = useAuth();\r\n let location = useLocation();\r\n const [origin, setOrigin] = useState('/');\r\n const [processing, setProcessing] = useState(false);\r\n useEffect(() => {\r\n // remember where I was before redirected to login\r\n var querystr = new URLSearchParams(location.search).get(\"origin\");\r\n if (querystr != null) {\r\n setOrigin(querystr);\r\n }\r\n\r\n }, [location]);\r\n useEffect(() => {\r\n sessionStorage.setItem(\"redirectPath\", origin);\r\n }, [origin]);\r\n const login = () => {\r\n console.log(\"login\");\r\n setProcessing(true);\r\n auth.signin();\r\n //auth.signin().then(response => {\r\n // console.log(\"then\");\r\n // window.location = process.env.PUBLIC_URL + origin;\r\n // setProcessing(false);\r\n //}).catch(error => {\r\n // console.log(error);\r\n // setProcessing(false)\r\n //});\r\n };\r\n return (\r\n \r\n IP Notice and Disclaimer\r\n EO Online has been designed for educational purposes only and should not, under any circumstances, be regarded as or substituted for legal advice.\r\n\r\n Intellectual Property and Use of EO Online\r\n \r\n Use of EO Online is restricted to participating universities as a resource for staff training and referral within their university. \r\n \r\n Use by students is permitted for purposes such as pre-work-placement training, to aid grievance resolution or to prevent discrimination and harassment. However, EO Online may not be delivered as examinable course content.\r\n \r\n Please contact us if you are in doubt about permitted usage of EO Online.\r\n \r\n \r\n The information you provide as part of this registration is collected and held by the University of Wollongong for the purpose of:\r\n \r\n
    \r\n Processing your registration to use EO Online\r\n identifying you to enable your continued use of EO Online and\r\n providing completion data to your University. \r\n
\r\n \r\n Completion of EO Online may be a mandatory requirement at your University. If you do not provide all the requested information you will not be able to register with, or use EO Online.\r\n \r\n The information you supply will be downloadable by authorised officers from your University. It will be used by your University to identify you and to record that you have completed EO Online and when you completed it.\r\n \r\n \r\n You have both a right of access to the personal information we hold about you and to ask us to correct it if it is inaccurate or out of date.\r\n \r\n \r\n The University of Wollongong's Privacy Policy explains our commitment to the protection of your personal information and can be found at http://www.uow.edu.au/about/privacy.\r\n \r\n \r\n
\r\n );\r\n}\r\n\r\nexport default Notice;","import React, { useEffect } from \"react\";\r\nimport { useLocation } from \"react-router-dom\";\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport Box from '@material-ui/core/Box';\r\nimport Slide from '@material-ui/core/Slide';\r\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport useScrollTrigger from '@material-ui/core/useScrollTrigger';\r\nimport Fab from '@material-ui/core/Fab';\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n main: {\r\n position: \"fixed\",\r\n right: theme.spacing(1),\r\n bottom: theme.spacing(1),\r\n zIndex: 99,\r\n \"@media print\": {\r\n display: \"none !important\"\r\n }\r\n },\r\n button: {\r\n border: \"1px solid\",\r\n padding: theme.spacing(0.5)\r\n },\r\n icon: {\r\n fontSize: \"3em\"\r\n }\r\n}));\r\n\r\nconst ScrollToTop = function () {\r\n const classes = useStyles();\r\n const location = useLocation();\r\n\r\n const trigger = useScrollTrigger({ threshold: 1, disableHysteresis: true });\r\n\r\n const scroll = () => {\r\n window.scrollTo(0, 0);\r\n };\r\n\r\n useEffect(() => {\r\n if (location.state && location.state.noScroll == true) {\r\n \r\n } else {\r\n scroll();\r\n }\r\n }, [location.pathname]);\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\nexport default ScrollToTop;","import { red, green } from '@material-ui/core/colors';\r\nimport { createTheme } from '@material-ui/core/styles';\r\n\r\nconst fontFamily1 = 'Noto Serif, serif';\r\nconst fontFamily2 = 'Noto Sans, sans-serif';\r\nconst spacing = (factor) => 10 * factor;//default 8\r\nconst fontSpacing = (factor) => 1.25*factor + \"rem\";//lets us adjust the font spacing factor\r\n\r\nvar palette = {\r\n primary: {\r\n main: '#275daa',\r\n dark: '#0d2038'\r\n },\r\n secondary: {\r\n main: '#214545'\r\n },\r\n tertiary: {\r\n main: '#412FB3'\r\n },\r\n grey: {\r\n dark: '#666666',\r\n main: '#999999',\r\n light: '#ededed'\r\n },\r\n danger: {\r\n main: \"#9a0036\",\r\n },\r\n error: {\r\n main: red.A400,\r\n light: '#ffe5e5'\r\n },\r\n success: {\r\n main: green['500'],\r\n light: \"#d4edda\"\r\n },\r\n background: {\r\n default: '#fafafd',\r\n },\r\n text: {\r\n primary: \"#000\",\r\n secondary: \"#595959\"\r\n },\r\n orange: {\r\n main: \"#f0954e\"\r\n }\r\n};\r\n\r\nvar typography = {\r\n fontSize: 16,\r\n fontFamily: fontFamily2,\r\n body1: {\r\n marginTop: \"0rem\",\r\n marginBottom: fontSpacing(1),\r\n fontSize: \"1rem\"\r\n },\r\n body2: {\r\n fontSize: \"1rem\",\r\n marginTop: fontSpacing(0.4)\r\n },\r\n listItemText: {\r\n marginTop: fontSpacing(0.5),\r\n },\r\n h1: {\r\n fontFamily: fontFamily2,\r\n fontWeight: \"bold\",\r\n marginTop: \"0rem\",\r\n marginBottom: fontSpacing(1.2),\r\n fontSize: \"2.5rem\",\r\n fontWeight: \"700\",\r\n color: palette.primary.dark\r\n },\r\n h2: {\r\n fontFamily: fontFamily2,\r\n marginTop: fontSpacing(2.2),\r\n marginBottom: fontSpacing(1.2),\r\n fontSize: \"1.7rem\",\r\n fontWeight: \"700\",\r\n color: palette.primary.dark\r\n },\r\n subtitle1: {\r\n fontFamily: fontFamily2,\r\n marginTop: fontSpacing(0.2),\r\n marginBottom: fontSpacing(2.2),\r\n fontSize: \"1.3rem\"\r\n },\r\n h3: {\r\n fontFamily: fontFamily2,\r\n fontWeight: \"bold\",\r\n marginTop: fontSpacing(1),\r\n marginBottom: fontSpacing(1.2),\r\n fontSize: \"1.2rem\",\r\n fontWeight: \"700\"\r\n },\r\n h4: {\r\n fontFamily: fontFamily2,\r\n fontWeight: \"bold\",\r\n marginTop: fontSpacing(0.2),\r\n marginBottom: fontSpacing(1.2),\r\n fontSize: \"1.1rem\"\r\n }\r\n};\r\n\r\n\r\n// A custom theme for this app\r\nconst theme = createTheme({\r\n breakpoints: {\r\n values: {\r\n xs: 0,\r\n sm: 600,\r\n md: 960,\r\n lg: 1180,\r\n xl: 1920,\r\n },\r\n },\r\n typography: typography,\r\n palette: palette,\r\n spacing: spacing,\r\n fontSpacing: fontSpacing\r\n});\r\n\r\ntheme.fontFamily1 = fontFamily1;\r\ntheme.fontFamily2 = fontFamily2;\r\n\r\nexport default theme;","import { ProvideAuth } from './components/auth/useAuth.js';\r\nimport useAdminSettings, { ProvideAdminSettings } from './components/auth/useAdminSettings.js';\r\nimport PrivateRoute from './components/auth/PrivateRoute.js';\r\nimport NavMenu from './components/NavMenu.js';\r\nimport Home from './components/Home.js';\r\nimport Notice from './components/Notice.js';\r\nimport ScrollToTop from './components/ScrollToTop.js';\r\nimport theme from './components/theme';\r\nimport { SnackbarProvider } from 'notistack';\r\nimport { Route, Link, Switch } from 'react-router-dom';\r\nimport React, { lazy, useEffect, Suspense } from 'react';\r\nimport { CssBaseline, Typography, Button, CircularProgress, AppBar, Toolbar, Box, Container, Grid } from '@material-ui/core';\r\nimport { makeStyles, ThemeProvider, StylesProvider } from '@material-ui/core/styles';\r\nimport '@fontsource/noto-serif';\r\nimport '@fontsource/noto-sans';\r\n\r\nimport './custom.css';\r\n\r\nconst Admin = lazy(() => import('./components/admin/Admin.js'));\r\nconst Module1 = lazy(() => import('./components/modules/module1/module1.js'));\r\nconst Module2 = lazy(() => import('./components/modules/module2/module2.js'));\r\nconst Module3 = lazy(() => import('./components/modules/module3/module3.js'));\r\nconst Module4 = lazy(() => import('./components/modules/module4/module4.js'));\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n main: {\r\n paddingTop: theme.spacing(4),\r\n paddingBottom: theme.spacing(2)\r\n }\r\n}));\r\nconst App = () => {\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\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\n\r\nexport default App;\r\n","import { configureStore } from '@reduxjs/toolkit';\r\nimport { combineReducers } from \"redux\";\r\nimport { persistReducer, FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER, } from 'redux-persist';\r\nimport localForage from 'localforage';\r\nimport quizStateReducer from './QuizSlice';\r\n\r\n\r\nconst store = configureStore({\r\n reducer: persistReducer(\r\n {\r\n key: 'root',\r\n version: 0,\r\n storage: localForage\r\n },\r\n combineReducers({\r\n quizState: quizStateReducer\r\n })\r\n ),\r\n middleware: (getDefaultMiddleware) => getDefaultMiddleware({\r\n serializableCheck: {\r\n ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER]\r\n }\r\n })\r\n});\r\n\r\nexport default store;","// In production, we register a service worker to serve assets from local cache.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on the \"N+1\" visit to a page, since previously\r\n// cached resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.\r\n// This link also includes instructions on opting out of this behavior.\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.1/8 is considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport default function register(onUpdate) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebookincubator/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Lets check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, onUpdate);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl, onUpdate);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, onUpdate) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the old content will have been purged and\r\n // the fresh content will have been added to the cache.\r\n // It's the perfect time to display a \"New content is\r\n // available; please refresh.\" message in your web app.\r\n console.log('New content is available; please refresh.');\r\n registration.waiting.postMessage({ type: 'SKIP_WAITING' });\r\n if (onUpdate) onUpdate();\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, onUpdate) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl)\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n if (\r\n response.status === 404 ||\r\n response.headers.get('content-type').indexOf('javascript') === -1\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, onUpdate);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister () {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister();\r\n });\r\n }\r\n}\r\n","import React, { Component } from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport App from './App';\r\nimport store from './components/store/store'\r\nimport registerServiceWorker from './registerServiceWorker';\r\nimport Snackbar from '@material-ui/core/Snackbar';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport { SnackbarProvider } from 'notistack';\r\n\r\nimport { Provider } from 'react-redux';\r\nimport { PersistGate } from 'redux-persist/integration/react';\r\nimport { persistStore } from 'redux-persist';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\nclass NewVersionAlert extends Component {\r\n static displayName = App.name;\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n open: true\r\n };\r\n }\r\n render() {\r\n return (\r\n this.setState({ open: false })}\r\n message=\"A new version of the app is available, please refresh your browser.\"\r\n action={\r\n \r\n this.setState({ open: false })}>\r\n \r\n \r\n \r\n }\r\n />\r\n );\r\n }\r\n}\r\nconst onUpdate = () => {\r\n // show alert\r\n console.log(\"onUpdate\");\r\n const d = document.createElement(\"div\")\r\n d.id = \"newversion-alert\";\r\n rootElement.appendChild(d);\r\n ReactDOM.render(, document.getElementById(\"newversion-alert\"));\r\n}\r\n\r\nlet persistor = persistStore(store);\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n rootElement);\r\n\r\nregisterServiceWorker(onUpdate);\r\n","import React, { useState, useContext, createContext, useEffect } from \"react\";\r\nimport axios from 'axios';\r\nimport { useLocation } from \"react-router-dom\";\r\nimport { ModuleRefreshSettingServices, InstitutionServices } from '../Services.js';\r\n\r\nconst authContext = createContext();\r\n\r\nfunction ProvideAuth({ children }) {\r\n const auth = useProvideAuth();\r\n return (\r\n \r\n {children}\r\n \r\n );\r\n}\r\n\r\nconst aafAuth = {\r\n isAuthenticated: false,\r\n signin() {\r\n return axios.get('api/auth', {}, { withCredentials: true })\r\n .then(response => {\r\n aafAuth.isAuthenticated = true;\r\n return response.data;\r\n })\r\n .catch(error => {\r\n aafAuth.isAuthenticated = false;\r\n throw error.response;\r\n });\r\n },\r\n signout() {\r\n return axios.get('api/auth/logout', {}, { withCredentials: true })\r\n .then(response => {\r\n aafAuth.isAuthenticated = false;\r\n return response;\r\n });\r\n }\r\n};\r\n\r\nfunction useAuth() {\r\n return useContext(authContext);\r\n}\r\n\r\nfunction useProvideAuth() {\r\n const [user, setUser] = useState(null);\r\n const [loginURL, setLoginURL] = useState(null);\r\n const [refreshCycles, setRefreshCycles] = useState([null, null, null, null]);\r\n const [allowSelfReset, setAllowSelfReset] = useState(null);\r\n const location = useLocation();\r\n //store in local storage so user doesn't have to wait for login request before seeing logged in stuff\r\n const updateUser = (u) => {\r\n if (u)\r\n localStorage.setItem(\"eo_user\", JSON.stringify(u));\r\n else\r\n localStorage.removeItem(\"eo_user\");\r\n setUser(u);\r\n \r\n };\r\n\r\n //signin, if fails (401) then redirect user to aaf login url\r\n const signin = () => {\r\n return aafAuth.signin().then(response => {\r\n \r\n updateUser(response.user); \r\n return response;\r\n })\r\n .catch(response => { \r\n if (loginURL) { \r\n window.location = loginURL;\r\n }\r\n updateUser(null);\r\n throw response;\r\n });\r\n };\r\n\r\n //signout, get login url if it has not already been fetched so user can login again\r\n const signout = () => {\r\n return aafAuth.signout().then(response => {\r\n updateUser(null);\r\n if (!loginURL)\r\n getLoginURL();\r\n return response;\r\n });\r\n };\r\n\r\n //useful when preventing user signing in before login url has been fetched\r\n //(e.g.don't show login button unless user can safely click it)\r\n const canLogin = () => {\r\n return loginURL != null;\r\n };\r\n\r\n const getLoginURL = () => {\r\n axios.get('api/util/loginURL', {}, { withCredentials: true })\r\n .then(response => {\r\n setLoginURL(response.data);\r\n }).catch(response => {\r\n\r\n });\r\n };\r\n\r\n //on initialisation, load the previous user and then attempt to get the user's server authentication state.\r\n //if user is not logged in, then get the login url\r\n useEffect(() => {\r\n //if user has logged in, assume they are still logged in until the useffect has finished\r\n var stored = localStorage.getItem(\"eo_user\");\r\n try {\r\n stored = stored ? JSON.parse(stored) : null;\r\n }\r\n catch {\r\n stored = null;\r\n }\r\n updateUser(stored);\r\n\r\n\r\n //on first load, check if signed in. if not, then fetch login url and wait for user to request login\r\n signin().then(response => {\r\n //signin has taken care of setting user \r\n\r\n \r\n }).catch(() => {\r\n getLoginURL();\r\n });\r\n ModuleRefreshSettingServices.getCycles().then(response => { \r\n var arr = [null, null, null, null];\r\n response.data.forEach((i) => { \r\n arr[i.moduleID - 1] = i.refreshSetting == 0 ? null : i.refreshSetting;\r\n });\r\n setRefreshCycles(arr);\r\n // console.log(arr);\r\n });\r\n InstitutionServices.getAllowSelfReset().then(response => {\r\n setAllowSelfReset(response.data);\r\n });\r\n\r\n }, []);\r\n \r\n\r\n return {\r\n user,\r\n canLogin,\r\n signin,\r\n signout, \r\n refreshCycles,\r\n allowSelfReset\r\n };\r\n}\r\n\r\nexport default useAuth;\r\nexport { ProvideAuth };","import React from \"react\";\r\nimport { Button } from \"@material-ui/core\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport clsx from \"clsx\";\r\nimport { alpha } from \"@material-ui/core/styles/colorManipulator\";\r\n\r\n//this exists because you can only select primary or secondary as button colours in material v4\r\n//it also removes the shadows and rounded corners on all buttons without needs global css\r\n\r\nconst useStyles = makeStyles(theme => ({\r\n customButton: {\r\n borderRadius: theme.spacing(0.3),\r\n textTransform: \"none\",\r\n boxShadow: \"none\",\r\n paddingTop: theme.spacing(0.5),\r\n paddingBottom: theme.spacing(0.5),\r\n fontSize: \"1rem\",\r\n marginRight: theme.spacing(0.5)\r\n },\r\n textTertiary: {\r\n color: theme.palette.tertiary.main,\r\n \"&:hover\": {\r\n backgroundColor: alpha(\r\n theme.palette.tertiary.main,\r\n theme.palette.action.hoverOpacity\r\n ),\r\n // Reset on touch devices, it doesn't add specificity\r\n \"@media (hover: none)\": {\r\n backgroundColor: \"transparent\"\r\n }\r\n }\r\n },\r\n outlinedTertiary: {\r\n color: theme.palette.tertiary.main,\r\n border: `1px solid ${alpha(theme.palette.tertiary.main, 0.5)}`,\r\n \"&:hover\": {\r\n border: `1px solid ${theme.palette.tertiary.main}`,\r\n backgroundColor: alpha(\r\n theme.palette.tertiary.main,\r\n theme.palette.action.hoverOpacity\r\n ),\r\n // Reset on touch devices, it doesn't add specificity\r\n \"@media (hover: none)\": {\r\n backgroundColor: \"transparent\"\r\n }\r\n }\r\n },\r\n containedTertiary: {\r\n color: theme.palette.tertiary.contrastText,\r\n backgroundColor: theme.palette.tertiary.main,\r\n \"&:hover\": {\r\n backgroundColor: theme.palette.tertiary.dark,\r\n // Reset on touch devices, it doesn't add specificity\r\n \"@media (hover: none)\": {\r\n backgroundColor: theme.palette.tertiary.main\r\n }\r\n }\r\n }\r\n}));\r\n\r\nconst CustomButton = React.forwardRef(function({ variant = \"text\", color, className, ...other }, ref){\r\n const classes = useStyles();\r\n return (\r\n \r\n );\r\n});\r\nexport default CustomButton;","import axios from 'axios';\r\n\r\nconst UserJourneyServices = {\r\n get: (rooturl) => {\r\n return axios.get(\"api/userjourney/my/\" + rooturl, {}, { withCredentials: true });\r\n },\r\n post: (path, url) => {\r\n const request = { \"rootURL\": path, \"branchURL\": url };\r\n return axios.post(\"api/userjourney\", request, { withCredentials: true });\r\n }\r\n};\r\n\r\nconst ModuleCompletionServices = {\r\n getLast: () => {\r\n return axios.get(\"api/modulecompletion/my/last/all\", {}, { withCredentials: true });\r\n },\r\n getCert: (moduleid, filename) => {\r\n return axios.get(\"api/modulecompletion/my/cert/module/\" + moduleid + \"/\" + filename, { responseType: 'blob' })\r\n\r\n }\r\n \r\n};\r\nconst ModuleRefreshSettingServices = {\r\n getCycles: () => {\r\n return axios.get(\"api/modulerefreshsetting/cycles\", {}, { withCredentials: true });\r\n },\r\n\r\n};\r\nconst RefreshRequestServices = {\r\n getLast: () => {\r\n return axios.get(\"api/refreshrequest/my/last/all\" , {}, { withCredentials: true });\r\n },\r\n create: (request) => {\r\n return axios.post(\"api/refreshrequest\", request, { withCredentials: true });\r\n }\r\n\r\n};\r\nconst QuizAttemptServices = {\r\n post: (request) => {\r\n return axios.post(\"api/quizattempt\", request, { withCredentials: true });\r\n }\r\n};\r\nconst InstitutionServices = {\r\n getAllowSelfReset: () => {\r\n return axios.get(\"api/institution/selfreset\", {}, { withCredentials: true });\r\n },\r\n\r\n};\r\nconst FeedbackServices = {\r\n post: (request) => {\r\n return axios.post(\"api/feedback\", request, { withCredentials: true });\r\n }\r\n};\r\n\r\nexport { QuizAttemptServices };\r\nexport { UserJourneyServices };\r\nexport { ModuleCompletionServices };\r\nexport { ModuleRefreshSettingServices };\r\nexport { RefreshRequestServices };\r\nexport { InstitutionServices };\r\nexport { FeedbackServices };"],"sourceRoot":""}