{"version":3,"sources":["assets/logo.png","components/Survey.tsx","registerServiceWorker.js","index.js","services/userService.ts","config/PlotlyConfig.js","components/ErrorMessage.tsx","config/AuthConfig.js","components/utils/loginUtils.ts","components/NavMenu.tsx","components/Layout.js","components/Home.js","components/Counter.js","components/PrivateRoute.jsx","components/LoginPage.jsx","components/PlotlyDash.tsx","components/PRIAdminCheckBox.tsx","components/PRIAdmin.tsx","components/Signatories.tsx","components/TransitionPage.jsx","components/TermsAndConditions.tsx","components/RoleCheckBoxes.tsx","components/Signatory.tsx","contexts/appContext.tsx","components/AccessRequests.tsx","components/DataSync.tsx","App.js"],"names":["module","exports","Survey","props","React","useContext","AuthContext","state","dispatch","useState","progress","surveyLink","setSurveyLink","signatoryName","setSignatoryName","setSignatoryId","setSignatoryGuid","useEffect","id","guid","signatoryId","user","affiliatedSignatories","undefined","axios","get","then","response","data","location","reportingContributorSignatory","find","x","role","reportingContributorSignatoryId","reportingContributorSignatoryGuid","type","payload","history","push","validSetResponse","prevFrom","toast","error","position","autoClose","hideProgressBar","closeOnClick","pauseOnHover","draggable","pathname","from","setTimeout","window","href","goBack","style","marginLeft","marginTop","marginBottom","marginRight","textAlign","className","color","src","isLocalhost","Boolean","hostname","match","registerValidSW","swUrl","navigator","serviceWorker","register","registration","onupdatefound","installingWorker","installing","onstatechange","controller","console","log","catch","baseUrl","document","getElementsByTagName","getAttribute","rootElement","getElementById","ReactDOM","render","basename","App","URL","process","origin","addEventListener","fetch","status","headers","indexOf","ready","unregister","reload","checkValidServiceWorker","username","password","a","post","authdata","btoa","localStorage","removeItem","resetUser","handleResponse","userService","login","logout","autoLogin","getAll","ErrorMessage","message","setMainSignatoryFromUsernames","userEmailDomainName","selectedSignatory","forEach","signatory","name","toLowerCase","split","word","includes","navigateToLogin","AuthConfig","host","runLogoutTimer","timer","getDashToken","NavMenu","useHistory","useLocation","collapsed","setCollapsed","affiliatedSignatoriesDropdown","setAffiliatedSignatoriesDropdown","signatoriesList","filter","isReportingContributor","dropdownComponent","isPriAdmin","length","margin","onChange","e","value","parseInt","handleAffiliateChanged","target","map","isAuthenticated","authenticated","Navbar","dark","padding","backgroundColor","Container","fluid","paddingRight","NavbarToggler","onClick","Collapse","isOpen","navbar","NavItem","NavLink","tag","plotlyConfig","Row","Col","sm","md","lg","xl","logo","paddingTop","hasSignatoryAdminPermissions","Button","as","Link","to","borderColor","errorMessage","Layout","this","children","Component","Home","displayName","Counter","currentCount","incrementCounter","bind","setState","aria-live","PrivateRoute","component","rest","getItem","LoginPage","PropTypes","configure","useStyles","makeStyles","theme","root","flexGrow","width","palette","background","paper","spacing","text","secondary","PlotlyDash","classes","dashToken","setDashToken","loadDash","setLoadDash","fetchData","Card","CardContent","config","url_base_pathname","auth_token","acceptedTnCs","PriAdminCheckBox","priAdminChecked","setPriAdminChecked","openPriAdminGrantCheck","setOpenPriAdminGrantCheck","openPriAdminRevokeCheck","setOpenPriAdminRevokeCheck","currentPriAdminChoice","setCurrentPriAdminChoice","row","handleChange","event","choice","doPriAdminCheck","stopPropagation","handlePriAdminChange","handleClosePriAdminGrantCheck","handleClosePriAdminRevokeCheck","FormControlLabel","control","Checkbox","checked","adminCheck","label","Dialog","open","onClose","aria-labelledby","DialogTitle","DialogContent","DialogContentText","DialogActions","descendingComparator","b","orderBy","headCells","numeric","disablePadding","EnhancedTableHead","order","onSelectAllClick","onRequestSort","numSelected","rowCount","TableHead","TableRow","TableCell","headCell","key","align","sortDirection","TableSortLabel","active","direction","property","visuallyHidden","EnhancedTableToolbar","useToolbarStyles","onSearchTermChanged","Toolbar","Typography","title","variant","Tooltip","IconButton","aria-label","fontSize","placeholder","table","minWidth","border","clip","height","overflow","top","buttonsContainer","formControl","PRIAdmin","setOrder","setOrderBy","selected","setSelected","page","setPage","dense","rowsPerPage","setRowsPerPage","priAdmin","setPriAdmin","searchTerm","setSearchTerm","setUserid","userGuid","setUserGuid","setIsPriAdmin","setValue","openTnCsResetCheck","setOpenTnCsResetCheck","emptyRows","Math","min","priAdmins","getPriAdmin","qs","parse","search","ignoreQueryPrefix","tab","isNaN","Number","resetAcceptedTnCs","showToast","success","handleResetTnCsClick","doTnCsCheck","handleCloseResetAcceptedTnCs","request","Id","result","Paper","TableContainer","Table","size","TableBody","array","comparator","stabilizedThis","el","index","sort","stableSort","getComparator","input","fullName","startsWith","slice","labelId","hover","email","handleClick","tabIndex","scope","InputLabel","colSpan","TablePagination","rowsPerPageOptions","count","onChangePage","newPage","onChangeRowsPerPage","paddingLeft","highlight","main","primary","flex","Signatories","rows","setRows","total","setTotal","selectedIndex","setSelectedIndex","category","setCategory","Array","signatories","handleIndexChanged","stickyHeader","Form","Control","categoryFilter","cursor","toString","str","n","substr","signatoryType","country","region","signatoryCategory","concat","lighten","light","flexShrink","TransitionPage","prevSignatoryId","newSignatoryId","TermsAndConditions","handleTermsAndConditionsClick","accept","previousAccepted","RoleCheckBoxes","reportingChecked","setReportingChecked","dataChecked","setDataChecked","adminDashChecked","setAdminChecked","reportingAndDataChecked","setReportingAndDataChecked","openAdminCheck","setOpenAdminCheck","openRemoveAdminCheck","setopenRemoveAdminCheck","currentRoleChoice","setCurrentRoleChoice","Roles","handleCloseAdminCheck","doAdminCheck","handleRoleChanged","Radio","permittedAssignableRoles","TabPanel","other","hidden","Box","p","a11yProps","activeUsersCount","Signatory","loading","setLoading","setSignatory","setGuid","setRole","setOpen","revokeOpen","setRevokeOpen","emailValid","setValidEmail","domainIsInvalid","setDomainIsInvalid","roleSelected","setRoleSelected","setEmail","users","getSignatory","managePermissionsSignatory","y","managePermissionsSignatoryId","managePermissionsSignatoryGuid","internal","handleClose","handleRevokeClose","handleInviteUser","checkEmailDomain","reg","RegExp","test","emailAddress","permissionType","checkEmailDomainAllowed","emailFailed","handleRevokeUser","userId","replace","handleCancelInviteUser","AppBar","Tabs","newValue","indicatorColor","textColor","scrollButtons","Tab","isItemSelected","aria-checked","inputProps","canUpdateRole","disabled","TextField","autoFocus","fullWidth","selectedRole","selectedRow","CircularProgress","selectedSignatoryId","changeHistoryItems","description","changeDate","changedBy","info","AppContext","AppDispatchContext","appReducer","action","currentAffiliate","Error","AppProvider","Provider","useAppState","context","AccessRequestType","AccessRequestStatus","AccessRequests","accessRequests","selectedItems","display","alignItems","alert","requestingSignatory","join","DataSync","createContext","interceptors","use","token","Promise","reject","initialState","JSON","reducer","clear","setItem","stringify","Cookies","set","expires","path","useReducer","useClearCache","isLatestVersion","emptyCacheStorage","preventDefault","maxSnack","exact"],"mappings":"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","file":"static/js/main.3f34f47c.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/logo.2e283c69.png\";","import React, { useEffect, useState } from \"react\"\r\nimport \"./Survey.css\"\r\nimport { AuthContext } from '../App';\r\nimport { Button, InputLabel, LinearProgress, Paper } from \"@material-ui/core\";\r\nimport InfoOutlinedIcon from '@material-ui/icons/InfoOutlined';\r\nimport axios from 'axios';\r\nimport * as signalr from '@microsoft/signalr';\r\nimport qs from \"qs\";\r\nimport { toast } from \"react-toastify\"\r\nimport { ISurveyInformationDTO } from \"../interfaces/ISurveyInformationDTO\";\r\nimport { LaptopWindowsOutlined } from \"@material-ui/icons\";\r\nimport { SSL_OP_EPHEMERAL_RSA } from \"constants\";\r\n\r\nexport function Survey(props: any) {\r\n\r\n const { state, dispatch } = React.useContext(AuthContext);\r\n const [ progress, setProgress ] = React.useState<any>(null);\r\n const [ surveyLink, setSurveyLink ] = React.useState<string>();\r\n const [ signatoryName, setSignatoryName ] = React.useState<string>();\r\n const [ signatoryId, setSignatoryId ] = React.useState<number>();\r\n const [ signatoryGuid, setSignatoryGuid ] = React.useState<number>();\r\n useEffect(() => {\r\n let id;\r\n let guid;\r\n if (state?.signatoryId && state.signatoryId > 0) {\r\n id = state.signatoryId; \r\n guid = state.guid;\r\n } else{ \r\n id = state.user.affiliatedSignatories[0].id;\r\n guid = state.user.affiliatedSignatories[0].guid;\r\n }\r\n\r\n if(id !== undefined) setSignatoryId(+id);\r\n if(guid !== undefined) setSignatoryGuid(id);\r\n \r\n axios.get<ISurveyInformationDTO>(\"/signatorydetail/getsurveyinformation?id=\" + guid).then(response => {\r\n \r\n if (response === null || response.data === null) {\r\n\r\n if (props.location?.state) {\r\n const affiliatedSignatories = state?.user?.affiliatedSignatories;\r\n const reportingContributorSignatory = affiliatedSignatories.find((x: { role: number; }) => x.role != 6);\r\n if (reportingContributorSignatory) {\r\n\r\n const reportingContributorSignatoryId = reportingContributorSignatory.id;\r\n const reportingContributorSignatoryGuid = reportingContributorSignatory.guid;\r\n dispatch({ type: \"SET_SIGNATORY_ID\", payload: reportingContributorSignatoryId });\r\n dispatch({ type: \"SET_SIGNATORY_GUID\", payload: reportingContributorSignatoryGuid });\r\n props.history.push(\"/survey?id=\" + reportingContributorSignatoryId);\r\n axios.get<ISurveyInformationDTO>(\"/signatorydetail/getsurveyinformation?id=\" + reportingContributorSignatoryGuid).then(validSetResponse => {\r\n setSurveyLink(validSetResponse.data.surveyLink);\r\n setSignatoryName(validSetResponse.data.signatoryName);\r\n })\r\n } else {\r\n\r\n if (props.location.state?.prevFrom) {\r\n\r\n toast.error('You are not authorized to access the permissions management application.', {\r\n position: \"bottom-right\",\r\n autoClose: 3333,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n progress: undefined,\r\n });\r\n props.history.push({ pathname: '/dataportalv2', state: { from: props.location.pathname } })\r\n } else {\r\n toast.error('You are not authorized to access the survey for any affiliated signatory.', {\r\n position: \"bottom-right\",\r\n autoClose: 3333,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n progress: undefined,\r\n });\r\n setTimeout(() => {\r\n window.location.href = 'https://unpri.org';\r\n }, 2000);\r\n }\r\n }\r\n } else {\r\n\r\n props.history.goBack()\r\n }\r\n } else {\r\n setSurveyLink(response.data.surveyLink);\r\n setSignatoryName(response.data.signatoryName);\r\n }\r\n })\r\n\r\n }, [state])\r\n\r\n\r\n function saveByteArray(reportName: any, byte: any) {\r\n var blob = new Blob([byte], { type: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" });\r\n var link = document.createElement('a');\r\n link.href = window.URL.createObjectURL(blob);\r\n var fileName = reportName;\r\n link.download = fileName;\r\n link.click();\r\n };\r\n\r\n const handleExportSurvey = async () => {\r\n\r\n setProgress(1);\r\n let connectionId = \"\"\r\n\r\n let request = {\r\n signatoryId: signatoryId && signatoryId !== 0 ? signatoryId : state.user.affiliatedSignatories[0].id,\r\n connectionId: connectionId\r\n }\r\n\r\n try{\r\n const connection = new signalr.HubConnectionBuilder()\r\n .withUrl(\"/surveyHub\")\r\n .configureLogging(signalr.LogLevel.Information)\r\n .withAutomaticReconnect()\r\n .build();\r\n\r\n connection.onclose(async() => await connection.start());\r\n\r\n connection.on('progressUpdated', (progress) => {\r\n setProgress(progress);\r\n });\r\n\r\n await connection.start();\r\n\r\n if(connection.connectionId){\r\n request.connectionId = connection.connectionId.toString();\r\n }\r\n }\r\n catch(e){\r\n console.log(e);\r\n }\r\n\r\n\r\n const prepareSurvey = await axios.post<any>(\"survey/preexport\", request);\r\n\r\n console.log(\"preexport\", prepareSurvey);\r\n\r\n const response = await axios.post<any>(\"survey/export\", request);\r\n\r\n if (response.data == null) {\r\n setProgress(null);\r\n toast.error(\"An error occurred exporting the survey\", {\r\n position: \"bottom-right\",\r\n autoClose: 3333,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n progress: undefined,\r\n })\r\n return;\r\n }\r\n\r\n saveByteArray(\"survey.docx\", Buffer.from(response.data, 'base64'));\r\n setProgress(null);\r\n }\r\n\r\n return (\r\n <>\r\n {progress && \r\n <div style={{ marginLeft: \"auto\", marginTop: 5, marginBottom: 10, marginRight: \"auto\", textAlign: \"center\" }} >Your export is being created, this may take up to 20 minutes. If you do not get a download after this time, please contact <a href=\"mailto:reporting@unpri.org\">reporting@unpri.org</a></div>\r\n }\r\n <div className=\"exportGroup\">\r\n {/*<Button className=\"exportButton\" variant=\"contained\" color=\"primary\" onClick={handleExportSurvey} disabled={progress}>\r\n Export Survey\r\n </Button>*/}\r\n { /*progress && \r\n <LinearProgress className=\"progressBar\" variant=\"determinate\" value={progress} />\r\n */}\r\n <br/>\r\n {/* <b>The reporting cycle is closed and access to the reporting tool is not available.</b> */}\r\n <span style={{color: \"#268cc8\"}}>The <b>2023 Reporting Tool</b> is currently under construction. In the meantime, please set up your reporting contacts. <br/>\r\n This can be done from the “USERS / ROLES†section. See our <a href=\"https://www.unpri.org/download?ac=12447\"><b>Permissions System guide</b></a> for more information.</span>\r\n \r\n </div>\r\n \r\n {/*<div className=\"userGuide\">\r\n <Button\r\n variant=\"text\"\r\n color=\"primary\"\r\n target=\"_blank\" href=\"https://www.unpri.org/download?ac=12446&adredir=1\"\r\n startIcon={<InfoOutlinedIcon />}\r\n >\r\n User Guide\r\n </Button>\r\n </div>*/}\r\n <h3 className=\"signatoryTitle\">{signatoryName}</h3>\r\n <div>\r\n <iframe src={surveyLink} className=\"iframe\">Your browser doesn't support iFrames.</iframe>\r\n </div>\r\n </>\r\n );\r\n}\r\n","// 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 () {\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);\r\n } else {\r\n // Is not local host. Just register service worker\r\n registerValidSW(swUrl);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW (swUrl) {\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 } 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) {\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);\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 'bootstrap/dist/css/bootstrap.css';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport App from './App';\r\nimport unregister from './registerServiceWorker';\r\n\r\nconst baseUrl = document.getElementsByTagName('base')[0].getAttribute('href');\r\nconst rootElement = document.getElementById('root');\r\n\r\nReactDOM.render(\r\n <BrowserRouter basename={baseUrl}>\r\n <App />\r\n </BrowserRouter>,\r\n rootElement);\r\n\r\nunregister();\r\n\r\n","import axios from 'axios';\r\nimport { IAuthenticationResponseDTO } from '../interfaces/IAuthenticationResponseDTO';\r\n\r\n\r\nasync function login(username: string, password: string): Promise<any> {\r\n const response = await axios.post<IAuthenticationResponseDTO>(\"/users/authenticate\", {username, password});\r\n const user = response.data;\r\n user.authdata = window.btoa(username + ':' + password);\r\n return user;\r\n}\r\n\r\nasync function autoLogin(): Promise<any> {\r\n const response = await axios.post<IAuthenticationResponseDTO>(\"/users/authenticate\", {username: \"\", password:\"\"});\r\n const user = response.data;\r\n if (typeof user != \"string\" && user !== null) {\r\n user.authdata = window.btoa(\"\" + ':' + \"\");\r\n }\r\n return user;\r\n}\r\n\r\nasync function logout(): Promise<any> {\r\n // remove user from local storage to log user out\r\n localStorage.removeItem('user');\r\n const response = await axios.post<IAuthenticationResponseDTO>(\"/users/logout\");\r\n const resetUser = response.data;\r\n return resetUser;\r\n}\r\n\r\nfunction handleResponse() {\r\n console.log('working');\r\n}\r\n\r\nfunction getAll() {\r\n return fetch(`https://localhost:5002/users`).then(handleResponse);\r\n}\r\n\r\nexport const userService = {\r\n login,\r\n logout,\r\n autoLogin,\r\n getAll,\r\n};","export default {\r\n plotlyUrl: \"#{plotlyUrl}#\",\r\n priApplicationURL: \"#{priApplicationURL}#\",\r\n registerUrl: \"#{registerUrl}#\"\r\n}","import React from 'react';\r\n\r\ninterface ErrorMessageProps {\r\n message: string;\r\n}\r\n\r\nconst ErrorMessage: React.FC<ErrorMessageProps> = ({ message }) => {\r\n return (\r\n <div className={'alert alert-danger'}>\r\n <p>{message}</p>\r\n </div>\r\n );\r\n};\r\n\r\nexport default ErrorMessage;","export default {\r\n authUrl: \"#{authUrl}#\",\r\n}","import { Dispatch } from 'react';\r\nimport AuthConfig from '../../config/AuthConfig';\r\nimport axios from 'axios';\r\n\r\n/**\r\n * Sets the main signatory based on the user's affiliated signatories and email domain name.\r\n *\r\n * @param {Object} user - The user object.\r\n * @param {Function} dispatch - The dispatch function from the AuthContext.\r\n */\r\nexport const setMainSignatoryFromUsernames = (user: any, dispatch: Dispatch<any>) => {\r\n const affiliatedSignatories = user?.affiliatedSignatories;\r\n const emailDomainNameRegexp = '(?<=@)[^.]+(?=\\\\.)'\r\n const userEmailDomainName = user?.username.match(emailDomainNameRegexp)[0];\r\n let selectedSignatory = affiliatedSignatories[0];\r\n affiliatedSignatories.forEach((signatory: any) => {\r\n let signatoryNameSplit = signatory.name.toLowerCase().split(' ')\r\n signatoryNameSplit.forEach((word: any) => {\r\n if (userEmailDomainName.includes(word))\r\n selectedSignatory = signatory;\r\n });\r\n });\r\n dispatch({ type: \"SET_SIGNATORY_ID\", payload: selectedSignatory?.id });\r\n dispatch({ type: \"SET_SIGNATORY_GUID\", payload: selectedSignatory?.guid });\r\n};\r\n\r\n/**\r\n * Navigates to the third party login page.\r\n * @param props - The props object containing the history object.\r\n */\r\nexport const navigateToLogin = (props: any) => {\r\n console.log(\"Navigating to third party login page\");\r\n const history = props.history.location.state?.from || '/'\r\n window.location.href = `${AuthConfig.authUrl}/login?retURL=https://${window.location.host}${history}`\r\n};\r\n\r\n/**\r\n * Runs a logout timer that dispatches a \"LOGOUT\" action after a specified time.\r\n * @param dispatch - The dispatch function from the Redux store.\r\n * @param timer - The time (in milliseconds) after which the \"LOGOUT\" action should be dispatched.\r\n */\r\nexport const runLogoutTimer = (dispatch: Dispatch<any>, timer: number) => {\r\n setTimeout(() => {\r\n dispatch({type :\"LOGOUT\"});\r\n }, timer);\r\n}\r\n\r\n\r\n\r\nexport const getDashToken = async (guid: string) => {\r\n \r\n if (guid === null || guid === \"\") {\r\n guid = '00000000-0000-0000-0000-000000000000';\r\n }\r\n const response = await axios.get<any>(\"/signatorydetail/GetDashToken?id=\" + guid);\r\n if (response !== null && response.data !== null && response.data !== \"\") {\r\n return response.data;\r\n }\r\n}","import React, { useEffect, useState } from 'react';\r\nimport { Collapse, Container, Navbar, NavbarToggler, NavItem, NavLink, Row, Col } from 'reactstrap';\r\nimport { Link } from 'react-router-dom';\r\nimport './NavMenu.css';\r\nimport logo from '../assets/logo.png'\r\nimport Button from 'react-bootstrap/Button'\r\nimport { AuthContext } from '../App';\r\nimport { useHistory, useLocation } from \"react-router-dom\";\r\nimport { userService } from '../services/userService';\r\nimport IAffiliatedSignatoryDTO from \"../interfaces/IAffiliatedSignatoryDTO\";\r\nimport plotlyConfig from '../config/PlotlyConfig';\r\nimport ErrorMessage from './ErrorMessage';\r\nimport { navigateToLogin } from './utils/loginUtils';\r\nimport createBreakpoints from '@material-ui/core/styles/createBreakpoints';\r\n\r\nexport function NavMenu(props: any) {\r\n const history = useHistory();\r\n const location = useLocation();\r\n const [collapsed, setCollapsed] = useState(true)\r\n const { state, dispatch } = React.useContext(AuthContext);\r\n const [affiliatedSignatoriesDropdown, setAffiliatedSignatoriesDropdown] = useState(<></>);\r\n\r\n\r\n const handleAffiliateChanged = (value: string) => {\r\n const user = state?.user;\r\n const affiliatedSignatories = user?.affiliatedSignatories;\r\n const selectedSignatory = affiliatedSignatories.find((x: { id: number; }) => x.id === parseInt(value));\r\n dispatch({ type: \"SET_SIGNATORY_ID\", payload: selectedSignatory.id })\r\n dispatch({ type: \"SET_SIGNATORY_GUID\", payload: selectedSignatory.guid })\r\n // history.push({pathname: \"/transition\", state: { from: history.location.pathname, prevSignatoryId: state?.signatoryId, newSignatoryId: parseInt(value) } });\r\n }\r\n\r\n useEffect(() => {\r\n var signatoriesList = [];\r\n if (location.pathname == '/dataportalv2') {\r\n signatoriesList = state?.user?.affiliatedSignatories\r\n } else {\r\n signatoriesList = state?.user?.affiliatedSignatories.filter(isReportingContributor)\r\n }\r\n\r\n var dropdownComponent = state?.user && !state?.user.isPriAdmin && signatoriesList.length > 0 ?\r\n signatoriesList.length == 1 ?\r\n <span style={{margin:\"0 20px 0 0\"}}>{signatoriesList.name}</span>\r\n :\r\n <select\r\n style={{ margin: \"0 20px 0 0\" }}\r\n onChange={e => handleAffiliateChanged(e.target.value)}\r\n value={state?.signatoryId}>\r\n {signatoriesList.map((signatory: any) => (<option value={signatory.id}>{signatory.name}</option>))}\r\n </select>\r\n :\r\n <></>;\r\n setAffiliatedSignatoriesDropdown(dropdownComponent);\r\n }, [location, state]);\r\n\r\n async function logoutUser (): Promise<any> {\r\n dispatch({ type: \"LOGOUT\" })\r\n await userService.logout();\r\n navigateToLogin(props)\r\n }\r\n\r\n const isAuthenticated = state?.user?.authenticated != null;\r\n\r\n const hasSignatoryAdminPermissions = () => {\r\n if (state?.user?.affiliatedSignatories?.length > 0 && state?.signatoryId) {\r\n const selectedSignatory = state.user.affiliatedSignatories.find((x: { id: number; }) => x.id === parseInt(state?.signatoryId));\r\n return (selectedSignatory?.role === 1 || selectedSignatory?.role === 2);\r\n }\r\n\r\n if (state?.user?.affiliatedSignatories) {\r\n const selectedSignatory = state.user.affiliatedSignatories[0];\r\n return (selectedSignatory?.role === 1 || selectedSignatory?.role === 2);\r\n }\r\n return false;\r\n }\r\n\r\n function isReportingContributor(signatory: IAffiliatedSignatoryDTO) {\r\n return signatory.role != 6\r\n }\r\n\r\n return (\r\n <header style={{marginBottom:20}}>\r\n <Navbar className=\"navbar-expand-sm navbar-toggleable-sm ng-white border-bottom box-shadow mb-3\" dark style={{ padding: 0, backgroundColor:\"#268cc8\"}}>\r\n <Container fluid={true} style={{ paddingRight: 0 }}>\r\n <NavbarToggler onClick={() => setCollapsed(!collapsed)} className=\"mr-2\" />\r\n <Collapse className=\"d-sm-inline-flex flex-sm-row-reverse\" isOpen={!collapsed} navbar>\r\n <ul className=\"navbar-nav flex-grow\">\r\n <NavItem className=\"navItem\">\r\n <NavLink tag=\"a\" className=\"navText\" href={plotlyConfig.priApplicationURL}>PRI Applications</NavLink>\r\n </NavItem>\r\n <NavItem className=\"navItem\">\r\n <NavLink tag=\"a\" className=\"navText\" href=\"https://priacademy.org/\">PRI Academy</NavLink>\r\n </NavItem>\r\n </ul>\r\n </Collapse>\r\n </Container>\r\n </Navbar>\r\n <Container>\r\n <Row>\r\n <Col sm=\"2\" md=\"2\" lg=\"2\" xl=\"2\" style={{textAlign:\"left\"}}><img src={logo} className=\"logoImage\" /></Col>\r\n <Col sm=\"10\" md=\"10\" lg=\"10\" xl=\"10\" style={{ textAlign: \"right\", paddingTop:10 }}>\r\n {isAuthenticated ?\r\n <>\r\n {/* if the user is authenticated show the logged in menu */}\r\n <span style={{ margin: \"0 20px 0 0\" }}>\r\n Hi {(state?.user?.username.split(\" \")[0])} {/* first name */}\r\n </span>\r\n\r\n {affiliatedSignatoriesDropdown}\r\n\r\n {state?.user && !state.user.isPriAdmin && hasSignatoryAdminPermissions() &&\r\n <Button as={Link} style={{ marginTop: -5 }} to=\"/signatory?tab=1\" >Manage Permissions</Button>\r\n }\r\n\r\n {state?.user?.isPriAdmin &&\r\n <>\r\n <Button as={Link} style={{ marginTop: -5 }} to=\"/signatories\">Signatory Search</Button>\r\n <Button as={Link} style={{ marginTop: -5 }} to=\"/priadmins\">Manage PRI Admins</Button>\r\n </>\r\n }\r\n\r\n <Button style={{ marginTop: -5 }} onClick={logoutUser}>Logout</Button>\r\n </>\r\n :\r\n <>\r\n {/* otherwise display the normal flow*/}\r\n <Button style={{ marginTop: -5, backgroundColor: 'lightgray', borderColor: 'lightgray', color: 'black' }} href={plotlyConfig.registerUrl}>Register</Button>\r\n <Button style={{ marginTop: -5 }}\r\n onClick={() => {history.push({pathname: \"/login\", state: { from: history.location.pathname} });}}>\r\n Sign in\r\n </Button>\r\n </>\r\n }\r\n </Col>\r\n {/* if there is an error, display it */}\r\n {state?.errorMessage &&\r\n <Col sm=\"10\" md=\"10\" lg=\"10\" xl=\"10\" style={{ textAlign: \"left\", paddingTop: 10 }}>\r\n <ErrorMessage message={state?.errorMessage} />\r\n </Col>\r\n }\r\n </Row>\r\n </Container>\r\n </header>\r\n )\r\n}\r\n","import React, { Component } from 'react';\r\nimport { Container } from 'reactstrap';\r\nimport { NavMenu } from './NavMenu';\r\n\r\nexport class Layout extends Component {\r\n static displayName = Layout.name;\r\n\r\n render () {\r\n return (\r\n <div>\r\n <NavMenu />\r\n <Container fluid={true}>\r\n {this.props.children}\r\n </Container>\r\n </div>\r\n );\r\n }\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport { AuthContext } from \"../App\";\r\nimport { useHistory } from \"react-router-dom\";\r\n\r\nexport function Home() {\r\n const { dispatch } = React.useContext(AuthContext);\r\n const history = useHistory();\r\n useEffect(() => {\r\n dispatch({ type: \"LOGOUT\" })\r\n }, []);\r\n\r\n history.push('/dataportalv2')\r\n return (\r\n <div></div>\r\n );\r\n}\r\n","import React, { Component } from 'react';\r\n\r\nexport class Counter extends Component {\r\n static displayName = Counter.name;\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = { currentCount: 0 };\r\n this.incrementCounter = this.incrementCounter.bind(this);\r\n }\r\n\r\n incrementCounter() {\r\n this.setState({\r\n currentCount: this.state.currentCount + 1\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n <div>\r\n <h1>Counter</h1>\r\n\r\n <p>This is a simple example of a React component.</p>\r\n\r\n <p aria-live=\"polite\">Current count: <strong>{this.state.currentCount}</strong></p>\r\n\r\n <button className=\"btn btn-primary\" onClick={this.incrementCounter}>Increment</button>\r\n </div>\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport { Route, Redirect } from 'react-router-dom';\r\n\r\nexport const PrivateRoute = ({ component: Component, ...rest }) => (\r\n <Route {...rest} render={props => (\r\n localStorage.getItem('user')\r\n ? <Component {...props} />\r\n : <Redirect to={{ pathname: '/login', state: { from: props.location.pathname } }} />\r\n )} />\r\n)","import React, { useEffect } from 'react';\r\nimport { userService } from '../services/userService';\r\nimport { AuthContext } from \"../App\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { navigateToLogin, runLogoutTimer, setMainSignatoryFromUsernames } from \"./utils/loginUtils\";\r\n\r\n\r\nexport function LoginPage(props) {\r\n\r\n const history = useHistory();\r\n const { dispatch } = React.useContext(AuthContext);\r\n\r\n useEffect(() => {\r\n // attempt to auto login to the service\r\n userService.autoLogin().then(user => {\r\n if (user !== null) {\r\n // if the user doesn't have the necessary permissions, return error\r\n if (!user.authenticated) {\r\n dispatch({ type: \"LOGOUT\" })\r\n navigateToLogin(props)\r\n } else {\r\n // otherwise, attempt to log in with that user\r\n dispatch({ type: \"LOGIN\", payload: user })\r\n\r\n // set the auto timeout\r\n runLogoutTimer(dispatch, 3600000)\r\n // get the relevant signatories\r\n setMainSignatoryFromUsernames(user, dispatch);\r\n\r\n // tidy up history for autologin around signatories\r\n if (history.location?.state) {\r\n if (history.location?.state?.from == \"/login\") {\r\n props.history.push({ pathname: '/signatory', state: { from: props.location.pathname } })\r\n } else {\r\n props.history.push({ pathname: history.location.state.from, state: { from: props.location.pathname } })\r\n }\r\n } else {\r\n props.history.push({ pathname: '/signatory', state: { from: props.location.pathname } })\r\n }\r\n }\r\n } else {\r\n navigateToLogin()\r\n }\r\n }).catch(error => {\r\n console.error('Error during auto login:', error);\r\n navigateToLogin(props);\r\n });;\r\n }, []);\r\n\r\n\r\n return <div>Loading...</div>;\r\n\r\n}","import { toast } from \"react-toastify\"\r\nimport \"react-toastify/dist/ReactToastify.css\"\r\nimport React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport { CardContent, Card } from '@material-ui/core';\r\nimport { AuthContext } from \"../App\";\r\nimport ReactDOM from \"react-dom\";\r\nimport { useHistory, Redirect } from \"react-router-dom\";\r\n// @ts-ignore\r\nimport { DashApp } from \"dash-embedded-component\";\r\nimport plotlyConfig from '../config/PlotlyConfig';\r\nimport { userService } from '../services/userService';\r\nimport { getDashToken, runLogoutTimer, setMainSignatoryFromUsernames } from \"./utils/loginUtils\";\r\n\r\n\r\nwindow.React = React;\r\nwindow.ReactDOM = ReactDOM;\r\n// @ts-ignore\r\nwindow.PropTypes = PropTypes;\r\n\r\ntoast.configure();\r\n\r\n\r\nconst useStyles = makeStyles((theme: any) => ({\r\n root: {\r\n flexGrow: 1,\r\n width: '100%',\r\n backgroundColor: theme.palette.background.paper,\r\n },\r\n paper: {\r\n padding: theme.spacing(2),\r\n textAlign: 'left',\r\n color: theme.palette.text.secondary,\r\n },\r\n}));\r\n\r\nexport function PlotlyDash(props: any) {\r\n\r\n const classes = useStyles();\r\n const { state, dispatch } = React.useContext(AuthContext);\r\n const [dashToken, setDashToken] = React.useState(\"\");\r\n const [loadDash, setLoadDash] = React.useState(false);\r\n const history = useHistory();\r\n\r\n\r\n // attempt to auto login on page load\r\n useEffect(() => {\r\n try {\r\n userService.autoLogin().then(user => {\r\n if (user !== null) {\r\n // if the user doesn't have the necessary permissions, return error\r\n if (!user.authenticated) {\r\n dispatch({type: \"SET_ERROR_MESSAGE\", payload: \"Sorry, it seems you don’t have the necessary permissions to access this platform. Please reach out to support@unpri.org for further assistance\"})\r\n dispatch({ type: \"LOGOUT\" })\r\n } else {\r\n // otherwise, attempt to log in with that user\r\n dispatch({ type: \"LOGIN\", payload: user })\r\n\r\n // set the auto timeout\r\n runLogoutTimer(dispatch, 3600000)\r\n\r\n // get the relevant signatories\r\n setMainSignatoryFromUsernames(user, dispatch);\r\n }\r\n }\r\n }).catch(error => {\r\n console.error('Error during auto login:', error);\r\n });\r\n } catch (error) {\r\n console.error('Error during auto login:', error);\r\n }\r\n }, [])\r\n\r\n\r\n // if the guid changes, attempt to get the dash token\r\n useEffect(() => {\r\n const fetchData = async () => {\r\n await getDashToken(state?.guid);\r\n setLoadDash(false);\r\n setDashToken(await getDashToken(state.guid));\r\n };\r\n\r\n fetchData();\r\n }, [state?.guid]);\r\n\r\n // if the dashtoken changes, reload the dash app\r\n useEffect(() => {\r\n if (dashToken.length > 0) {\r\n setTimeout(() => {\r\n setLoadDash(true);\r\n }, 1000);\r\n }\r\n }, [dashToken]);\r\n\r\n\r\n // set the timeout for the jwt expiration\r\n useEffect(() => {\r\n const jtwExpirationTime = 3600000;\r\n setTimeout(() => {\r\n // history.push(\"/transition\");\r\n }, jtwExpirationTime)\r\n }, [])\r\n\r\n\r\n\r\n return (\r\n <div className={classes.root}>\r\n <Card className={classes.paper} >\r\n <CardContent>\r\n {loadDash &&\r\n <DashApp\r\n config={{\r\n url_base_pathname: plotlyConfig.plotlyUrl,\r\n auth_token: dashToken\r\n }}\r\n />\r\n }\r\n </CardContent>\r\n </Card>\r\n {state?.user && !state?.user?.acceptedTnCs && history.location.state != '/termsandconditions' && <Redirect to='/termsandconditions'></Redirect>}\r\n </div>\r\n );\r\n}\r\n","import React, { useEffect } from 'react';\r\nimport './NavMenu.css';\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\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 DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport { Button} from '@material-ui/core';\r\n\r\nimport { Checkbox } from '@material-ui/core';\r\n\r\nexport function PriAdminCheckBox(props: any) {\r\n\r\n const [priAdminChecked, setPriAdminChecked] = React.useState(false);\r\n const [openPriAdminGrantCheck, setOpenPriAdminGrantCheck] = React.useState(false);\r\n const [openPriAdminRevokeCheck, setOpenPriAdminRevokeCheck] = React.useState(false);\r\n\r\n const [currentPriAdminChoice, setCurrentPriAdminChoice] = React.useState(true);\r\n \r\n useEffect(() => {\r\n if (props.row.isPriAdmin) {\r\n setPriAdminChecked(true); \r\n }\r\n else {\r\n setPriAdminChecked(false)\r\n }\r\n }, [])\r\n\r\n const handleChange = (event: any, choice: boolean, doPriAdminCheck: boolean) => {\r\n event.stopPropagation();\r\n\r\n if (choice && doPriAdminCheck) {\r\n setCurrentPriAdminChoice(choice)\r\n setOpenPriAdminGrantCheck(true);\r\n return;\r\n }\r\n else if (!choice && doPriAdminCheck) {\r\n setCurrentPriAdminChoice(choice)\r\n setOpenPriAdminRevokeCheck(true);\r\n }\r\n else if (choice) {\r\n setPriAdminChecked(true);\r\n props.handlePriAdminChange(true, props.row)\r\n }\r\n else {\r\n setPriAdminChecked(false);\r\n props.handlePriAdminChange(false, props.row)\r\n }\r\n \r\n };\r\n\r\n const handleClosePriAdminGrantCheck = (e: any) => {\r\n setOpenPriAdminGrantCheck(false);\r\n };\r\n\r\n const handleClosePriAdminRevokeCheck = (e: any) => {\r\n setOpenPriAdminRevokeCheck(false);\r\n };\r\n\r\n const handleClick = (event: any) => {\r\n event.stopPropagation();\r\n };\r\n \r\n return (\r\n <>\r\n\r\n\r\n <FormControlLabel\r\n value=\"PriAdmin\"\r\n control={<Checkbox checked={priAdminChecked} onChange={(e) => \r\n {\r\n if (priAdminChecked) {\r\n handleChange(e, false, props.adminCheck)\r\n } else {\r\n handleChange(e, true, props.adminCheck)\r\n } \r\n }\r\n } onClick={handleClick} />}\r\n label=\"PRI Admin\"\r\n />\r\n \r\n\r\n\r\n <Dialog open={openPriAdminGrantCheck} onClose={handleClosePriAdminGrantCheck} aria-labelledby=\"form-dialog-title\">\r\n <DialogTitle id=\"form-dialog-title\">PRI Admin User</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>\r\n By making this user a PRI Admin they will have access to all signatory's permission management pages, surveys and dashboards. \r\n Do you want to proceed? \r\n </DialogContentText>\r\n\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={handleClosePriAdminGrantCheck} color=\"primary\">\r\n Cancel\r\n </Button>\r\n <Button onClick={MakePriAdmin} color=\"primary\">\r\n Make PRI Admin\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog open={openPriAdminRevokeCheck} onClose={handleClosePriAdminRevokeCheck} aria-labelledby=\"form-dialog-title\">\r\n <DialogTitle id=\"form-dialog-title\">PRI Admin User</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>\r\n By revoking this user's PRI Admin permissions they will lose access to all signatory's permission management pages, surveys and dashboards. \r\n Do you want to proceed? \r\n </DialogContentText>\r\n\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={handleClosePriAdminRevokeCheck} color=\"primary\">\r\n Cancel\r\n </Button>\r\n <Button onClick={RevokePriAdmin} color=\"primary\">\r\n Revoke PRI Admin\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n </>)\r\n\r\n\r\n function MakePriAdmin(e: any) {\r\n handleChange(e, currentPriAdminChoice, false);\r\n handleClosePriAdminGrantCheck(e);\r\n }\r\n\r\n function RevokePriAdmin(e: any) {\r\n handleChange(e, currentPriAdminChoice, false);\r\n handleClosePriAdminRevokeCheck(e);\r\n }\r\n}\r\n","import { toast } from \"react-toastify\"\r\nimport \"react-toastify/dist/ReactToastify.css\"\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TablePagination from '@material-ui/core/TablePagination';\r\nimport TableRow from '@material-ui/core/TableRow';\r\nimport TableSortLabel from '@material-ui/core/TableSortLabel';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles } from '@material-ui/core/styles';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Box from '@material-ui/core/Box';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport { Paper } from '@material-ui/core';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport qs from \"qs\";\r\nimport axios from 'axios';\r\nimport { IPriAdminResponseDTO } from \"../interfaces/IPriAdminResponseDTO\";\r\nimport { ISetIsPriAdminDTO } from \"../interfaces/ISetIsPriAdminDTO\";\r\nimport { IPriAdminDTO } from '../interfaces/IPriAdminDTO'\r\nimport { AuthContext } from \"../App\";\r\nimport ReactDOM from \"react-dom\";\r\n// @ts-ignore\r\nimport { PriAdminCheckBox } from \"./PRIAdminCheckBox\";\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 DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport Button from 'react-bootstrap/Button'\r\nimport { Collapse, Container, Row, Col } from 'reactstrap';\r\n\r\n\r\nwindow.React = React;\r\nwindow.ReactDOM = ReactDOM;\r\n// @ts-ignore\r\nwindow.PropTypes = PropTypes;\r\n\r\ntoast.configure();\r\n\r\nfunction TabPanel(props: any) {\r\n const { children, value, index, ...other } = props;\r\n\r\n return (\r\n <div\r\n role=\"tabpanel\"\r\n hidden={value !== index}\r\n id={`scrollable-auto-tabpanel-${index}`}\r\n aria-labelledby={`scrollable-auto-tab-${index}`}\r\n {...other}\r\n >\r\n {value === index && (\r\n <Box p={3}>\r\n <Typography>{children}</Typography>\r\n </Box>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nTabPanel.propTypes = {\r\n children: PropTypes.node,\r\n index: PropTypes.any.isRequired,\r\n value: PropTypes.any.isRequired,\r\n};\r\n\r\nfunction a11yProps(index: any) {\r\n return {\r\n id: `scrollable-auto-tab-${index}`,\r\n 'aria-controls': `scrollable-auto-tabpanel-${index}`,\r\n };\r\n}\r\n\r\n \r\n function descendingComparator(a: any, b: any, orderBy: any) {\r\n if (b[orderBy] < a[orderBy]) {\r\n return -1;\r\n }\r\n if (b[orderBy] > a[orderBy]) {\r\n return 1;\r\n }\r\n return 0;\r\n }\r\n \r\n function getComparator(order: any, orderBy: any) {\r\n return order === 'desc'\r\n ? (a: any, b: any) => descendingComparator(a, b, orderBy)\r\n : (a: any, b: any) => -descendingComparator(a, b, orderBy);\r\n }\r\n \r\n function stableSort(array: any, comparator: any) {\r\n if(!array) return;\r\n const stabilizedThis = array.map((el: any, index: any,) => [el, index]);\r\n stabilizedThis.sort((a: any, b: any) => {\r\n const order = comparator(a[0], b[0]);\r\n if (order !== 0) return order;\r\n return a[1] - b[1];\r\n });\r\n return stabilizedThis.map((el: any) => el[0]);\r\n }\r\n \r\n const headCells = [\r\n { id: 'name', numeric: false, disablePadding: true, label: 'Full Name' },\r\n { id: 'username', numeric: true, disablePadding: false, label: 'Username (e-mail address)' },\r\n { id: 'priAdmin', numeric: true, disablePadding: false, label: 'Is PRI Admin?' },\r\n ];\r\n \r\n function EnhancedTableHead(props: any) {\r\n const { classes, onSelectAllClick, order, orderBy, numSelected, rowCount, onRequestSort } = props;\r\n const createSortHandler = (property: any) => (event: any) => {\r\n onRequestSort(event, property);\r\n };\r\n \r\n return (\r\n <TableHead>\r\n <TableRow>\r\n <TableCell padding=\"checkbox\">\r\n </TableCell>\r\n {headCells.map((headCell) => (\r\n <TableCell\r\n key={headCell.id}\r\n align={headCell.numeric ? 'right' : 'left'}\r\n padding={headCell.disablePadding ? 'none' : 'default'}\r\n sortDirection={orderBy === headCell.id ? order : false}>\r\n <TableSortLabel\r\n active={orderBy === headCell.id}\r\n direction={orderBy === headCell.id ? order : 'asc'}\r\n onClick={createSortHandler(headCell.id)}>\r\n {headCell.label}\r\n {orderBy === headCell.id ? (\r\n <span className={classes.visuallyHidden}>\r\n {order === 'desc' ? 'sorted descending' : 'sorted ascending'}\r\n </span>\r\n ) : null}\r\n </TableSortLabel>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n );\r\n }\r\n \r\n interface IEnhancedToolBarProps {\r\n onSearchTermChanged: (searchTerm: string) => void\r\n }\r\n\r\n const EnhancedTableToolbar = (props: IEnhancedToolBarProps) => {\r\n const classes = useToolbarStyles();\r\n const { onSearchTermChanged } = props;\r\n\r\n return (\r\n <Toolbar style={{ backgroundColor: '#07aeef', color: 'white' }}>\r\n <Typography className={classes.title} variant=\"h6\" id=\"tableTitle\" component=\"div\">\r\n PRI Users\r\n </Typography>\r\n <Tooltip title=\"Search\">\r\n <IconButton aria-label=\"filter list\">\r\n <input type=\"text\" style={{ fontSize: 20 }} onChange={e => onSearchTermChanged(e.target.value)} placeholder=\" Type here to Search\"></input>\r\n </IconButton>\r\n </Tooltip>\r\n </Toolbar>\r\n );\r\n};\r\n \r\nconst useStyles = makeStyles((theme: any) => ({\r\n root: {\r\n flexGrow: 1,\r\n width: '100%',\r\n backgroundColor: theme.palette.background.paper,\r\n },\r\n table: {\r\n minWidth: 750,\r\n },\r\n visuallyHidden: {\r\n border: 0,\r\n clip: 'rect(0 0 0 0)',\r\n height: 1,\r\n margin: -1,\r\n overflow: 'hidden',\r\n padding: 0,\r\n position: 'absolute',\r\n top: 20,\r\n width: 1,\r\n },\r\n buttonsContainer: {\r\n '& > *': {\r\n margin: theme.spacing(1),\r\n },\r\n '& > :first-child': {\r\n marginLeft: 0\r\n }\r\n },\r\n formControl: {\r\n margin: theme.spacing(1),\r\n minWidth: 120,\r\n },\r\n paper: {\r\n padding: theme.spacing(2),\r\n textAlign: 'left',\r\n color: theme.palette.text.secondary,\r\n },\r\n}));\r\n\r\nexport function PRIAdmin(props: any) {\r\n const classes = useStyles();\r\n const [order, setOrder] = React.useState('desc');\r\n const [orderBy, setOrderBy] = React.useState('role');\r\n const [selected, setSelected] = React.useState<any>(null);\r\n const [page, setPage] = React.useState(0);\r\n const [dense, setDense] = React.useState(false);\r\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\r\n const [priAdmin, setPriAdmin] = React.useState<IPriAdminResponseDTO>();\r\n const { state, dispatch } = React.useContext(AuthContext);\r\n const [searchTerm, setSearchTerm] = React.useState(\"\");\r\n const [userId, setUserid] = React.useState<any>();\r\n const [userGuid, setUserGuid] = React.useState<any>();\r\n const [isPriAdmin, setIsPriAdmin] = React.useState<any>('');\r\n const [value, setValue] = React.useState(0);\r\n const [openTnCsResetCheck, setOpenTnCsResetCheck] = React.useState(false);\r\n\r\n const emptyRows = rowsPerPage - Math.min(rowsPerPage, (priAdmin?.priAdmins?.length ?? 0) - page * rowsPerPage);\r\n\r\n useEffect(() => {\r\n if (state?.user.id && state.user.id > 0) {\r\n \r\n setUserid(state.user.id);\r\n setUserGuid(state.user.guid);\r\n getPriAdmin(state.user.guid);\r\n }\r\n }, [state?.user.id])\r\n\r\n useEffect(() => {\r\n let id = qs.parse(props.location.search, { ignoreQueryPrefix: true }).id\r\n let tab = qs.parse(props.location.search, { ignoreQueryPrefix: true }).tab\r\n console.log(id)\r\n\r\n if (tab && !isNaN(Number(tab)))\r\n setValue(Number(tab));\r\n\r\n if (id && +id > 0) {\r\n dispatch({ type: \"SET_SIGNATORY_ID\", payload: id });\r\n setUserid(id);\r\n getPriAdmin(id);\r\n }\r\n }, [])\r\n\r\n const getPriAdmin = async (id: any) => {\r\n //TODO: Need to include the requesting users auth token in every request (as this is used to validate permission to access this particular resource)\r\n const response = await axios.get<any>(\"/users?id=\" + id);\r\n\r\n if (response === null) {\r\n props.history.goBack()\r\n }\r\n\r\n if(response !== null && response.data !== null && response.data !== \"\"){\r\n setPriAdmin(response.data);\r\n }\r\n \r\n }\r\n\r\n const resetAcceptedTnCs = async () => {\r\n const response = await axios.post(\"/users/resetAcceptedTnCs\")\r\n if(response.data) {\r\n var message = \"Successfully reset users' T&Cs acceptance.\"\r\n } else {\r\n var message = \"Failed to reset users' T&Cs acceptance.\"\r\n }\r\n showToast(message, response.data);\r\n }\r\n\r\n const showToast = (message: string, success: boolean) => {\r\n if(success){\r\n toast.success(message, {\r\n position: \"bottom-right\",\r\n autoClose: 3333,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n progress: undefined,\r\n })\r\n }\r\n else{\r\n toast.error(message, {\r\n position: \"bottom-right\",\r\n autoClose: 3333,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n progress: undefined,\r\n })\r\n }\r\n };\r\n\r\n const handleRequestSort = (event: any, property: any) => {\r\n const isAsc = orderBy === property && order === 'asc';\r\n setOrder(isAsc ? 'desc' : 'asc');\r\n setOrderBy(property);\r\n };\r\n \r\n const handleClick = (event: any, row: any) => {\r\n if(selected && row.email == selected.username){\r\n setSelected(null);\r\n return;\r\n }\r\n setSelected(row);\r\n };\r\n\r\n const handleResetTnCsClick = (event: any, doTnCsCheck: boolean) => {\r\n event.stopPropagation();\r\n\r\n if (doTnCsCheck) {\r\n setOpenTnCsResetCheck(true);\r\n return;\r\n } \r\n else {\r\n setOpenTnCsResetCheck(false);\r\n resetAcceptedTnCs();\r\n }\r\n \r\n };\r\n const handleCloseResetAcceptedTnCs = (e: any) => {\r\n setOpenTnCsResetCheck(false);\r\n };\r\n\r\n const handleChangePage = (event: any, newPage: any) => {\r\n setPage(newPage);\r\n };\r\n\r\n const handleChangeRowsPerPage = (event: any) => {\r\n setRowsPerPage(parseInt(event.target.value, 10));\r\n setPage(0);\r\n };\r\n\r\n const handlePriAdminChange = async(isPriAdmin: boolean, row: any) => {\r\n\r\n let request : ISetIsPriAdminDTO = {\r\n Id: row.id,\r\n isPriAdmin: isPriAdmin\r\n };\r\n var result = await axios.post<boolean>(\"/users/setIsPriAdmin\",request);\r\n await getPriAdmin(userGuid);\r\n if(result.data){\r\n showToast(\"PRI Admin role updated\", true);\r\n setIsPriAdmin(isPriAdmin);\r\n }\r\n else{\r\n showToast(\"An error occurred updating PRI Admin role\", false);\r\n }\r\n };\r\n\r\n const handleSearchTermChanged = (searchTerm: string) => {\r\n setSearchTerm(searchTerm)\r\n };\r\n\r\n const handleFilter = (input: IPriAdminDTO) => {\r\n if(searchTerm.length > 2){\r\n if(input.fullName.toLowerCase().startsWith(searchTerm.toLowerCase())){\r\n return true;\r\n }\r\n\r\n if(input.username.toLowerCase().startsWith(searchTerm.toLowerCase())){\r\n return true;\r\n }\r\n }\r\n else{\r\n return input !== null;\r\n }\r\n return false;\r\n }\r\n\r\n return (\r\n <div className={classes.root}>\r\n \r\n <Paper className={classes.paper}>\r\n <>\r\n <EnhancedTableToolbar onSearchTermChanged={handleSearchTermChanged} />\r\n <TableContainer>\r\n <Table\r\n className={classes.table}\r\n aria-labelledby=\"tableTitle\"\r\n size='medium'\r\n aria-label=\"enhanced table\" \r\n >\r\n <EnhancedTableHead\r\n classes={classes}\r\n order={order}\r\n orderBy={orderBy}\r\n onRequestSort={handleRequestSort}\r\n rowCount={priAdmin?.priAdmins?.length ?? 0}\r\n />\r\n <TableBody>\r\n {priAdmin && priAdmin.priAdmins && stableSort(priAdmin?.priAdmins, getComparator(order, orderBy))\r\n .filter((x: IPriAdminDTO) => handleFilter(x))\r\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\r\n .map((row: IPriAdminDTO, index: number) => {\r\n\r\n const labelId = `enhanced-table-checkbox-${index}`;\r\n\r\n return (\r\n <TableRow\r\n hover\r\n onClick={(event) => handleClick(event, row)}\r\n role=\"checkbox\"\r\n tabIndex={-1}\r\n key={row.fullName}\r\n >\r\n <TableCell padding=\"checkbox\">\r\n </TableCell>\r\n <TableCell component=\"th\" id={labelId} scope=\"row\" padding=\"none\">\r\n {row.fullName}\r\n </TableCell>\r\n <TableCell align=\"right\">{row.username}</TableCell>\r\n <TableCell align=\"right\">\r\n\r\n\r\n \r\n {row.id ? \r\n (<PriAdminCheckBox row={ row } adminCheck={ true } handlePriAdminChange={ handlePriAdminChange }/>)\r\n :\r\n (<InputLabel>{row.isPriAdmin}</InputLabel>)}\r\n \r\n </TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n {emptyRows > 0 && (\r\n <TableRow style={{ height: (dense ? 33 : 53) * emptyRows }}>\r\n <TableCell colSpan={6} />\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </>\r\n <TablePagination\r\n rowsPerPageOptions={[5, 10, 25]}\r\n component=\"div\"\r\n count={priAdmin?.priAdmins?.length ?? 0}\r\n rowsPerPage={rowsPerPage}\r\n page={page}\r\n onChangePage={handleChangePage}\r\n onChangeRowsPerPage={handleChangeRowsPerPage}\r\n />\r\n </Paper>\r\n <Row>\r\n <Col style={{ textAlign: \"right\", paddingTop: 20 }}>\r\n <Button onClick={(e) => handleResetTnCsClick(e, true)}>Reset Accepted T&Cs</Button>\r\n </Col>\r\n </Row>\r\n <Dialog open={openTnCsResetCheck} onClose={handleCloseResetAcceptedTnCs} aria-labelledby=\"form-dialog-title\">\r\n <DialogTitle id=\"form-dialog-title\">Reset Accepted T&Cs?</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>\r\n By resetting the Terms and Conditions acceptance, all non-PRI users will have the reaccept the T&Cs.\r\n Do you want to proceed? \r\n </DialogContentText>\r\n\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={handleCloseResetAcceptedTnCs} color=\"primary\">\r\n Cancel\r\n </Button>\r\n <Button onClick={HandleResetAcceptedTnCs} color=\"primary\">\r\n Reset\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n </div>\r\n );\r\n \r\n function HandleResetAcceptedTnCs(e: any) {\r\n handleResetTnCsClick(e, false);\r\n handleCloseResetAcceptedTnCs(e);\r\n }\r\n \r\n}\r\nconst useToolbarStyles = makeStyles((theme) => ({\r\n root: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(1),\r\n },\r\n highlight:\r\n theme.palette.type === 'light'\r\n ? {\r\n color: theme.palette.secondary.main,\r\n backgroundColor: \"#333333\",\r\n }\r\n : {\r\n color: theme.palette.text.primary,\r\n backgroundColor: theme.palette.secondary.dark,\r\n },\r\n title: {\r\n flex: '1 1 100%',\r\n },\r\n}));","import React, { useEffect } from 'react';\r\nimport { makeStyles, useTheme, lighten } from '@material-ui/core/styles';\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TablePagination from '@material-ui/core/TablePagination';\r\nimport TableRow from '@material-ui/core/TableRow';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft';\r\nimport KeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight';\r\nimport FirstPageIcon from '@material-ui/icons/FirstPage';\r\nimport LastPageIcon from '@material-ui/icons/LastPage';\r\nimport Form from 'react-bootstrap/Form';\r\nimport axios from 'axios';\r\nimport { toast } from \"react-toastify\"\r\nimport \"react-toastify/dist/ReactToastify.css\"\r\nimport \"./Signatories.css\"\r\n\r\ntoast.configure()\r\n\r\nfunction TablePaginationActions(props: any) {\r\n const classes = useStyles1();\r\n const theme = useTheme();\r\n const { count, page, rowsPerPage, onChangePage } = props;\r\n\r\n const handleFirstPageButtonClick = (event: any) => {\r\n onChangePage(event, 0);\r\n };\r\n\r\n const handleBackButtonClick = (event: any) => {\r\n onChangePage(event, page - 1);\r\n };\r\n\r\n const handleNextButtonClick = (event: any) => {\r\n onChangePage(event, page + 1);\r\n };\r\n\r\n const handleLastPageButtonClick = (event: any) => {\r\n onChangePage(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1));\r\n };\r\n\r\n return (\r\n <div className={classes.root}>\r\n <IconButton\r\n onClick={handleFirstPageButtonClick}\r\n disabled={page === 0}\r\n aria-label=\"first page\"\r\n >\r\n {theme.direction === 'rtl' ? <LastPageIcon /> : <FirstPageIcon />}\r\n </IconButton>\r\n <IconButton onClick={handleBackButtonClick} disabled={page === 0} aria-label=\"previous page\">\r\n {theme.direction === 'rtl' ? <KeyboardArrowRight /> : <KeyboardArrowLeft />}\r\n </IconButton>\r\n <IconButton\r\n onClick={handleNextButtonClick}\r\n disabled={page >= Math.ceil(count / rowsPerPage) - 1}\r\n aria-label=\"next page\"\r\n >\r\n {theme.direction === 'rtl' ? <KeyboardArrowLeft /> : <KeyboardArrowRight />}\r\n </IconButton>\r\n <IconButton\r\n onClick={handleLastPageButtonClick}\r\n disabled={page >= Math.ceil(count / rowsPerPage) - 1}\r\n aria-label=\"last page\"\r\n >\r\n {theme.direction === 'rtl' ? <FirstPageIcon /> : <LastPageIcon />}\r\n </IconButton>\r\n </div>\r\n );\r\n}\r\n\r\ninterface IEnhancedToolBarProps {\r\n onSearchTermChanged: (searchTerm: string) => void\r\n}\r\n\r\nconst EnhancedTableToolbar = (props: IEnhancedToolBarProps) => {\r\n const classes = useToolbarStyles();\r\n const { onSearchTermChanged } = props;\r\n\r\n return (\r\n <Toolbar style={{ backgroundColor: '#07aeef', color: 'white' }}>\r\n <Typography className={classes.title} variant=\"h6\" id=\"tableTitle\" component=\"div\">\r\n Signatories\r\n </Typography>\r\n <Tooltip title=\"Search\">\r\n <IconButton aria-label=\"filter list\">\r\n <input type=\"text\" style={{ fontSize: 20 }} onChange={e => onSearchTermChanged(e.target.value)} placeholder=\" Type here to Search\"></input>\r\n </IconButton>\r\n </Tooltip>\r\n </Toolbar>\r\n );\r\n};\r\n\r\n\r\n// TODO: Move these interfaces out to separate files\r\ninterface ISignatory {\r\n id: number\r\n guid : string\r\n name: string\r\n signatoryType: string\r\n country: string\r\n region: string\r\n signatoryCategory: string\r\n isSelected: boolean\r\n}\r\n\r\ninterface ISignatoriesResponseDTO {\r\n signatories: Array<ISignatory>\r\n total: number\r\n}\r\n\r\nexport function Signatories(props: any) {\r\n\r\n const classes = useStyles();\r\n const [rows, setRows] = React.useState<Array<ISignatory>>([]);\r\n const [page, setPage] = React.useState(0);\r\n const [rowsPerPage, setRowsPerPage] = React.useState(10);\r\n const [total, setTotal] = React.useState(0);\r\n const [searchTerm, setSearchTerm] = React.useState(\"\")\r\n const [selectedIndex, setSelectedIndex] = React.useState(\"*\")\r\n const [category, setCategory] = React.useState(\"\")\r\n const [selectedItems, setSelectedItems] = React.useState<Array<ISignatory>>(new Array<ISignatory>())\r\n\r\n useEffect(() => {\r\n axios.get<ISignatoriesResponseDTO>(`/signatoriesdata?pageNumber=0&pageSize=${rowsPerPage}&searchTerm=&indexChar=`).then(x => {\r\n setTotal(x.data.total)\r\n setRows(x.data.signatories)\r\n })\r\n }, [])\r\n\r\n const handleChangePage = (event: any, newPage: number) => {\r\n axios.get<ISignatoriesResponseDTO>(`/signatoriesdata?pageNumber=${newPage}&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${category}`).then(x => {\r\n setTotal(x.data.total)\r\n setRows(rows.concat(x.data.signatories))\r\n setPage(newPage)\r\n })\r\n };\r\n\r\n const handleChangeRowsPerPage = (event: any) => {\r\n axios.get<ISignatoriesResponseDTO>(`/signatoriesdata?pageNumber=0&pageSize=${event.target.value}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${category}`).then(x => {\r\n setTotal(x.data.total)\r\n setRows(rows.concat(x.data.signatories))\r\n setRowsPerPage(event.target.value)\r\n setPage(0)\r\n })\r\n };\r\n\r\n const handleSearchTermChanged = (searchTerm: string) => {\r\n if(searchTerm.length > 2) {\r\n axios.get<ISignatoriesResponseDTO>(`/signatoriesdata?pageNumber=${page}&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${category}`).then(x => {\r\n setTotal(x.data.total)\r\n setRows(x.data.signatories)\r\n setPage(0)\r\n setSearchTerm(searchTerm)\r\n })\r\n } else {\r\n axios.get<ISignatoriesResponseDTO>(`/signatoriesdata?pageNumber=${page}&pageSize=${rowsPerPage}&searchTerm=&indexChar=`).then(x => {\r\n setTotal(x.data.total)\r\n setRows(x.data.signatories)\r\n setPage(0)\r\n setSearchTerm(\"\")\r\n })\r\n }\r\n };\r\n\r\n const handleIndexChanged = (index: string) => {\r\n axios.get<ISignatoriesResponseDTO>(`/signatoriesdata?pageNumber=0&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${index}&category=${category}`).then(x => {\r\n setTotal(x.data.total)\r\n setRows(x.data.signatories)\r\n setPage(0)\r\n setSelectedIndex(index)\r\n })\r\n }\r\n\r\n const handleCategoryFilterChanged = (categoryFilter: string) => {\r\n if(categoryFilter === \"All Categories\") categoryFilter = \"\"\r\n axios.get<ISignatoriesResponseDTO>(`/signatoriesdata?pageNumber=0&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${categoryFilter}`).then(x => {\r\n setTotal(x.data.total)\r\n setRows(x.data.signatories)\r\n setPage(0)\r\n setCategory(categoryFilter)\r\n })\r\n }\r\n\r\n const handleRowSelectionChanged = (signatory: ISignatory, value: boolean) => {\r\n alert('you click on signatory ' + signatory.id)\r\n }\r\n\r\n const emptyRows = rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage)\r\n\r\n function truncate(str: string, n: number){\r\n return (str.length > n) ? str.substr(0, n-1) + '...' : str;\r\n };\r\n\r\n function handleRowClicked(guid: string, id:string) {\r\n console.log('GUID CLICKED ON: ' + guid)\r\n console.log('ID CLICKED ON: ' + id)\r\n // TODO: CHANGE THIS TO PROPS.PUSH\r\n props.history.push(`/signatory?id=${guid}`)\r\n }\r\n\r\n return (\r\n <div className={classes.root}>\r\n <Paper className={classes.paper}>\r\n <EnhancedTableToolbar onSearchTermChanged={handleSearchTermChanged} />\r\n <TableContainer>\r\n <Table stickyHeader aria-label=\"sticky table\">\r\n <TableHead>\r\n <TableCell>Signatory</TableCell>\r\n <TableCell>Type</TableCell>\r\n <TableCell>Country</TableCell>\r\n <TableCell>Region</TableCell>\r\n <TableCell>\r\n <Form.Control as=\"select\" onChange={(e) => handleCategoryFilterChanged(e.target.value)}>\r\n <option selected>All Categories</option>\r\n <option>Investment Manager</option>\r\n <option>Asset Owner</option>\r\n <option>Service Provider</option>\r\n </Form.Control>\r\n </TableCell>\r\n </TableHead>\r\n <TableBody>\r\n {rows.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage).map((row) => {\r\n return (\r\n <TableRow style={{ cursor: \"pointer\" }} hover role=\"checkbox\" tabIndex={-1} key={row.id} onClick={() => handleRowClicked(row.guid, row.id.toString())}>\r\n <TableCell id={row.id.toString()}>\r\n {truncate(row.name, 40)}\r\n </TableCell>\r\n <TableCell>{row.signatoryType}</TableCell>\r\n <TableCell>{row.country}</TableCell>\r\n <TableCell>{row.region}</TableCell>\r\n <TableCell>{row.signatoryCategory}</TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n {emptyRows > 0 && (\r\n <TableRow style={{ height: 33 * emptyRows, cursor: \"pointer\" }}>\r\n <TableCell colSpan={6} />\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n <TablePagination\r\n rowsPerPageOptions={[5, 10, 25]}\r\n component=\"div\"\r\n count={total}\r\n rowsPerPage={rowsPerPage}\r\n page={page}\r\n onChangePage={handleChangePage}\r\n onChangeRowsPerPage={handleChangeRowsPerPage}\r\n />\r\n </Paper>\r\n {/* Convert this into a custom control */}\r\n <ul className=\"index\">\r\n <li className={selectedIndex === \"*\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"*\")} href=\"javascript:void(0)\">*</a></li>\r\n <li className={selectedIndex === \"A\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"A\")} href=\"javascript:void(0)\">A</a></li>\r\n <li className={selectedIndex === \"B\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"B\")} href=\"javascript:void(0)\">B</a></li>\r\n <li className={selectedIndex === \"C\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"C\")} href=\"javascript:void(0)\">C</a></li>\r\n <li className={selectedIndex === \"D\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"D\")} href=\"javascript:void(0)\">D</a></li>\r\n <li className={selectedIndex === \"E\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"E\")} href=\"javascript:void(0)\">E</a></li>\r\n <li className={selectedIndex === \"F\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"F\")} href=\"javascript:void(0)\">F</a></li>\r\n <li className={selectedIndex === \"G\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"G\")} href=\"javascript:void(0)\">G</a></li>\r\n <li className={selectedIndex === \"H\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"H\")} href=\"javascript:void(0)\">H</a></li>\r\n <li className={selectedIndex === \"I\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"I\")} href=\"javascript:void(0)\">I</a></li>\r\n <li className={selectedIndex === \"J\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"J\")} href=\"javascript:void(0)\">J</a></li>\r\n <li className={selectedIndex === \"K\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"K\")} href=\"javascript:void(0)\">K</a></li>\r\n <li className={selectedIndex === \"L\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"L\")} href=\"javascript:void(0)\">L</a></li>\r\n <li className={selectedIndex === \"M\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"M\")} href=\"javascript:void(0)\">M</a></li>\r\n <li className={selectedIndex === \"N\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"N\")} href=\"javascript:void(0)\">N</a></li>\r\n <li className={selectedIndex === \"O\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"O\")} href=\"javascript:void(0)\">O</a></li>\r\n <li className={selectedIndex === \"P\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"P\")} href=\"javascript:void(0)\">P</a></li>\r\n <li className={selectedIndex === \"Q\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"Q\")} href=\"javascript:void(0)\">Q</a></li>\r\n <li className={selectedIndex === \"R\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"R\")} href=\"javascript:void(0)\">R</a></li>\r\n <li className={selectedIndex === \"S\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"S\")} href=\"javascript:void(0)\">S</a></li>\r\n <li className={selectedIndex === \"T\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"T\")} href=\"javascript:void(0)\">T</a></li>\r\n <li className={selectedIndex === \"U\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"U\")} href=\"javascript:void(0)\">U</a></li>\r\n <li className={selectedIndex === \"V\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"V\")} href=\"javascript:void(0)\">V</a></li>\r\n <li className={selectedIndex === \"W\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"W\")} href=\"javascript:void(0)\">W</a></li>\r\n <li className={selectedIndex === \"X\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"X\")} href=\"javascript:void(0)\">X</a></li>\r\n <li className={selectedIndex === \"Y\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"Y\")} href=\"javascript:void(0)\">Y</a></li>\r\n <li className={selectedIndex === \"Z\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"Z\")} href=\"javascript:void(0)\">Z</a></li>\r\n </ul>\r\n </div>\r\n )\r\n}\r\n\r\nconst useToolbarStyles = makeStyles((theme) => ({\r\n root: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(1),\r\n },\r\n highlight:\r\n theme.palette.type === 'light'\r\n ? {\r\n color: theme.palette.secondary.main,\r\n backgroundColor: lighten(theme.palette.secondary.light, 0.85),\r\n }\r\n : {\r\n color: theme.palette.text.primary,\r\n backgroundColor: theme.palette.secondary.dark,\r\n },\r\n title: {\r\n flex: '1 1 100%',\r\n },\r\n}));\r\n\r\nconst useStyles1 = makeStyles((theme) => ({\r\n root: {\r\n flexShrink: 0,\r\n marginLeft: theme.spacing(2.5),\r\n },\r\n}));\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n paper: {\r\n width: '100%',\r\n marginBottom: theme.spacing(2),\r\n },\r\n table: {\r\n minWidth: 750,\r\n },\r\n visuallyHidden: {\r\n border: 0,\r\n clip: 'rect(0 0 0 0)',\r\n height: 1,\r\n margin: -1,\r\n overflow: 'hidden',\r\n padding: 0,\r\n position: 'absolute',\r\n top: 20,\r\n width: 1,\r\n },\r\n}));","import React, { useEffect, useState } from 'react';\r\n\r\nimport { useHistory } from \"react-router-dom\";\r\n\r\nexport function TransitionPage(props) {\r\n\r\n const history = useHistory();\r\n\r\n useEffect(() => \r\n { \r\n if (history.location?.state) {\r\n history.push({\r\n pathname: history.location.state.from, \r\n state: { \r\n from: history.location.state.from, \r\n prevSignatoryId: history.location.state.prevSignatoryId, \r\n newSignatoryId: history.location.state.newSignatoryId \r\n }\r\n })\r\n } else {\r\n history.goBack();\r\n }\r\n\r\n },[]);\r\n\r\n return (<div></div>);\r\n}","import React from \"react\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { Button } from \"@material-ui/core\";\r\nimport { IAcceptedTnCsDTO } from \"../interfaces/IAcceptedTnCsDTO\";\r\nimport axios from \"axios\";\r\nimport { AuthContext } from \"../App\";\r\n\r\nconst useStyles = makeStyles((theme: any) => ({\r\n root: {\r\n flexGrow: 1,\r\n width: \"100%\",\r\n backgroundColor: theme.palette.background.paper,\r\n },\r\n paper: {\r\n padding: theme.spacing(2),\r\n textAlign: \"left\",\r\n color: theme.palette.text.secondary,\r\n },\r\n buttonsContainer: {\r\n \"& > *\": {\r\n margin: theme.spacing(1),\r\n },\r\n \"& > :first-child\": {\r\n marginLeft: 0,\r\n },\r\n },\r\n}));\r\n\r\nexport function TermsAndConditions(props: any) {\r\n const { state, dispatch } = React.useContext(AuthContext);\r\n const css = `ol:not([className='navbar-nav']) { \r\n counter-reset: item \r\n }\r\n ol li { \r\n display: block; \r\n padding: 10px 0 10px 20px;\r\n }\r\n ol.roman{\r\n content: counter(item, lower-roman);\r\n }\r\n ol.roman li:before { \r\n content: counter(item, lower-roman);\r\n counter-increment: item; \r\n font-weight: bold; \r\n position: absolute; \r\n text-indent: -4em; \r\n }\r\n ol li:before { \r\n content: counter(item); \r\n counter-increment: item; \r\n font-weight: bold; \r\n position: absolute; \r\n text-indent: -4em; \r\n }\r\n p {\r\n text-indent: 1em;`;\r\n const handleTermsAndConditionsClick = async (\r\n id: any,\r\n accept: boolean,\r\n previousAccepted: boolean\r\n ) => {\r\n if (accept != previousAccepted) {\r\n let request: IAcceptedTnCsDTO = {\r\n Id: id,\r\n acceptedTnCs: accept,\r\n };\r\n state.user.acceptedTnCs = accept;\r\n console.log(\"request\", request);\r\n var result = await axios.post<boolean>(\"/users/setAcceptedTnCs\", request);\r\n dispatch({ type: \"SET_USER_ACCEPTED_TNCS\", payload: state.user });\r\n }\r\n props.history.push({\r\n pathname: `/dataportalv2`,\r\n state: \"/termsandconditions\",\r\n });\r\n };\r\n\r\n const classes = useStyles();\r\n return (\r\n <div className={classes.root}>\r\n <style>{css}</style>\r\n <div>\r\n <h1>Terms and Conditions</h1>\r\n <h2>PRI Data Portal</h2>\r\n <ol>\r\n <li>\r\n <b>AGREEMENT</b>\r\n </li>\r\n <ol>\r\n <li>\r\n This Agreement governs the use of PRI’s data portal (“Data\r\n Portalâ€) by signatories to the{\" \"}\r\n <a\r\n href=\"https://www.unpri.org/pri/what-are-the-principles-for-responsible-investment\"\r\n target=\"_blank\"\r\n >\r\n {\" \"}\r\n Principles for Responsible Investment\r\n </a>{\" \"}\r\n (“Signatoriesâ€) and their authorised representatives (“Authorised\r\n Usersâ€). Signatories and/or their Authorised Users are also\r\n referred to in this Agreement as “User(s)â€.\r\n </li>\r\n <li>\r\n This Agreement is a legally binding contract between PRI\r\n Association, a company incorporated in England under company\r\n number 07207947 (“PRIâ€) and the User.\r\n </li>\r\n <li>\r\n By using the Data Portal, the User confirms that they accept the\r\n terms and conditions set out herein and the PRI’s{\" \"}\r\n <a\r\n href=\"https://www.unpri.org/website-terms-of-use\"\r\n target=\"_blank\"\r\n >\r\n website terms of use\r\n </a>\r\n . The website terms of use are incorporated by reference into this\r\n Agreement, which means that the website terms of use form part of\r\n this Agreement. Users should also read the PRI’s{\" \"}\r\n <a href=\"https://www.unpri.org/privacy-policy\" target=\"_blank\">\r\n privacy policy\r\n </a>{\" \"}\r\n before using the Data Portal.\r\n </li>\r\n <li>\r\n Non-signatories may also be granted public access to the Data\r\n Portal. Non-signatories' use of the Data Portal is governed by the{\" \"}\r\n <a\r\n href=\"https://dwtyzx6upklss.cloudfront.net/uploads/l/s/e/publicuserguide_914408.pdf\"\r\n target=\"_blank\"\r\n >\r\n Public User Guide\r\n </a>\r\n .\r\n </li>\r\n </ol>\r\n <li>\r\n <b>ACCESSING THE DATA PORTAL</b>\r\n </li>\r\n <ol>\r\n <li>\r\n To access the Data Portal, you must have a login to a user account\r\n (“loginâ€). To be eligible for a login, you must be a Signatory\r\n named contact or authorised by a Signatory named contact (the\r\n “eligibility requirementsâ€).\r\n </li>\r\n <li>\r\n The PRI reserves the right to remove the login of a User who does\r\n not, in the PRI’s reasonable opinion, meet the eligibility\r\n requirements or if the Signatory associated with the login(s) is\r\n de-listed.\r\n </li>\r\n <li>\r\n Signatory named contacts may nominate one or more data portal\r\n administrators (“Data Portal Admin(s)â€).\r\n </li>\r\n </ol>\r\n <li>\r\n <b>DATA PORTAL</b>\r\n </li>\r\n <ol>\r\n <li>\r\n The Data Portal is an online platform through which Users can\r\n access reports and insights about Signatories’ responsible\r\n investment practices.\r\n </li>\r\n <li>\r\n Through the Data Portal, a User may access, subject to the terms\r\n of this Agreement:\r\n </li>\r\n <ol>\r\n <li>\r\n A report showing the Signatory’s score for each indicator and\r\n module and how this score compares to its peers (a “Private\r\n Assessment Reportâ€);\r\n </li>\r\n <li>\r\n A report presenting all core indicators, published in ranges if\r\n specified by the User, and responses (except for certain\r\n commercially sensitive indicators determined by PRI), “public\r\n indicatorsâ€, and indicators and responses that a Signatory has\r\n instructed PRI to publish, as more particularly described in\r\n clauses 5.3 and 5.4, relevant to a particular Signatory (a\r\n “Public Transparency Reportâ€); and/or\r\n </li>\r\n <li>\r\n A report presenting all public and private indicators relevant\r\n to a particular Signatory, and such Signatory’s responses to\r\n those indicators (a “Private Transparency Reportâ€).\r\n </li>\r\n </ol>\r\n <p>(each a “Report†and together, the “Reportsâ€)</p>\r\n <li>\r\n All use of the Data Portal and the Reports is subject to the terms\r\n and conditions set out in this Agreement and, in particular, the{\" \"}\r\n <a\r\n href=\"https://ctp.unpri.org/termsandconditions#permitted-purposes\"\r\n target=\"_blank\"\r\n >\r\n Permitted Purposes\r\n </a>\r\n .\r\n </li>\r\n </ol>\r\n <li>\r\n <b>PERMITTED PURPOSES</b>\r\n </li>\r\n <ol>\r\n <li>\r\n The User shall and shall ensure that its Authorised Users shall\r\n only use the Data Portal for the following permitted purposes\r\n (together, the “Permitted Purposesâ€), to the extent that the\r\n relevant functionality is available within the Data Portal:\r\n </li>\r\n <ol>\r\n <li>Viewing the Signatory’s own Reports;</li>\r\n <li>Viewing public responses to indicators;</li>\r\n <li>\r\n Creating lists of Signatories based on criteria such as\r\n geography, AUM (assets under management) size, Signatory type,\r\n and keyword search functionality;\r\n </li>\r\n <li>\r\n Viewing the distribution of Signatory scores for all available\r\n peer groups (provided that the size of the peer group does not\r\n compromise the Signatory’s confidentiality);\r\n </li>\r\n <li>\r\n Viewing aggregated Signatory responses for all available peer\r\n groups (provided that the size of the peer group does not\r\n compromise the Signatory’s confidentiality);\r\n </li>\r\n <li>\r\n Using the{\" \"}\r\n <a\r\n href=\"https://ctp.unpri.org/termsandconditions#pri-materials\"\r\n target=\"_blank\"\r\n >\r\n PRI Materials\r\n </a>{\" \"}\r\n subject to the limitations described in this Agreement; and\r\n </li>\r\n <li>\r\n Any other purposes notified to a User by PRI from time to time.\r\n </li>\r\n </ol>\r\n </ol>\r\n <li>\r\n <b>RIGHTS OF THE USER</b>\r\n </li>\r\n <ol>\r\n <li>\r\n Subject to the User’s and each Authorised User’s compliance with\r\n this Agreement, PRI hereby grants to the User and each Authorised\r\n User a non-exclusive, non-transferable, non-assignable licence to\r\n access and to use the{\" \"}\r\n <a\r\n href=\"https://ctp.unpri.org/termsandconditions#pri-materials\"\r\n target=\"_blank\"\r\n >\r\n PRI Materials\r\n </a>{\" \"}\r\n solely for the{\" \"}\r\n <a\r\n href=\"https://ctp.unpri.org/termsandconditions#permitted-purposes\"\r\n target=\"_blank\"\r\n >\r\n Permitted Purposes\r\n </a>{\" \"}\r\n and whilst the User is a Signatory or associated with a Signatory.\r\n </li>\r\n <li>\r\n Whether a given indicator is designated as “private†or “publicâ€\r\n is determined through the functionality of the Online Reporting\r\n Tool (as defined below) and the related responses, and such\r\n designation will not be changed except where PRI has taken the\r\n decision to make certain indicators private for all Signatories.\r\n </li>\r\n <li>\r\n The User may share data comprising a Public Transparency Report\r\n (the “Public Dataâ€) and the Private Reports obtained in accordance\r\n with this Agreement (together, the “Publishable Dataâ€) with other\r\n organisations provided that the following conditions are met:\r\n <ol>\r\n <li>The Publishable Data is shared free of charge;</li>\r\n <li>\r\n If the User intends to, or does, publish the Publishable Data\r\n online via a portal, application or other such platform (a\r\n “User Platformâ€) then the User shall ensure that:\r\n <ol>\r\n <li>\r\n Before the Publishable Data is published on the User\r\n Platform, the User obtains PRI’s prior written consent by\r\n sending a request to{\" \"}\r\n <a href=\"mailto:reporting@unpri.org\">\r\n reporting@unpri.org\r\n </a>{\" \"}\r\n and complies with PRI’s publishing guidelines given in\r\n such consent, if any;\r\n </li>\r\n <li>\r\n PRI and/or its appointed authorised representative(s) is\r\n given all necessary access, at no cost to PRI, to the User\r\n Platform for the purpose of auditing the User’s compliance\r\n with this Agreement and other internal purposes, and the\r\n User shall promptly on request provide PRI with all\r\n necessary login and access credentials required for these\r\n purposes;\r\n </li>\r\n <li>\r\n Access to the Publishable Data via the User Platform is\r\n not subject to additional charges, including licence\r\n and/or download fees, over and above the fees normally\r\n charged to access the User Platform;\r\n </li>\r\n <li>\r\n The Publishable Data is not presented in a way, or\r\n together with other materials, that is intended to and/or\r\n reasonably likely to misinform, confuse or deceive any\r\n person or to embarrass or bring PRI into disrepute;\r\n </li>\r\n <li>\r\n Without prejudice to the rights granted under this\r\n Agreement, the Private Reports and all private data\r\n (including indicator responses) contained in the Private\r\n Reports are not presented in a way, or provided with other\r\n data (including Public Data), that may be attributed to\r\n allow a specific Signatory to be identified;\r\n </li>\r\n <li>\r\n Unless PRI instructs the User to do otherwise, PRI is\r\n identified as the source of the Publishable Data in a\r\n suitably obvious place such that it is clearly linked to\r\n the published data, using the following wording, updated\r\n as necessary to refer to the current year: “Copyright ©\r\n 2024 PRI Association. All rights reserved.â€;\r\n </li>\r\n <li>\r\n The User shall provide PRI with anonymised data concerning\r\n the usage of the Publishable Data through the User\r\n Platform (“Usage Dataâ€) at least once every calendar year\r\n and no later than 31 December in any given year;\r\n </li>\r\n <li>\r\n The User shall ensure that the Usage Data is in a format\r\n reasonably requested by PRI and sufficiently detailed to\r\n allow PRI to extract insights by investor country, market,\r\n investor type and size; and\r\n </li>\r\n <li>\r\n The Publishable Data may not be downloaded on a\r\n consolidated basis.\r\n </li>\r\n </ol>\r\n </li>\r\n </ol>\r\n </li>\r\n <li>\r\n The User may, with the prior written consent of PRI, use\r\n Publishable Data as part of a product and/or service offering\r\n (except that clause 3.2 applies to all User Platforms) provided\r\n that the User:\r\n <ol>\r\n <li>\r\n Expressly states that the product and/or service offering and\r\n the methods used to process the Publishable Data have not been\r\n endorsed by PRI or any person representing PRI; and\r\n </li>\r\n <li>\r\n The Private Reports and any and all private indicator\r\n responses contained in the Private Reports are not presented\r\n in a way, or provided with other data (including Public Data),\r\n that may allow the private indicator responses of a specific\r\n Signatory to be identified or attributed to a specific\r\n Signatory.\r\n </li>\r\n </ol>\r\n </li>\r\n <li>\r\n The User may only share Private Reports of an asset manager\r\n (“Asset Manager Signatoryâ€) with the User’s asset owner customers\r\n (a “User Customerâ€) if:\r\n <ol>\r\n <li>\r\n The User is appointed as a provider of services to the User\r\n Customer; and\r\n </li>\r\n <li>\r\n The User Customer has appointed or intends to appoint the\r\n Asset Manager Signatory to provide services, including the\r\n management of assets, to the User Customer.\r\n </li>\r\n </ol>\r\n </li>\r\n <li>\r\n PRI will disclose all submitted Public Transparency Reports on the\r\n Data Portal and PRI’s website soon after each reporting cycle each\r\n year.\r\n </li>\r\n </ol>\r\n <li>\r\n <b>OBLIGATIONS OF THE USER</b>\r\n </li>\r\n <ol>\r\n <li>\r\n The User shall ensure that all of its Authorised Users are subject\r\n to a written contract containing appropriate confidentiality\r\n obligations that apply to the Reports.\r\n </li>\r\n <li>\r\n The User shall and shall ensure that each Authorised User shall:\r\n <ol>\r\n <li>\r\n Keep secure and confidential all passwords and other\r\n credentials used to access the Data Portal;\r\n </li>\r\n <li>\r\n Notify PRI immediately if it knows or suspects that any third\r\n party has unlawfully gained access to the Data Portal or the\r\n data on the Data Portal or a Report;\r\n </li>\r\n <li>\r\n Notify PRI immediately if it is inadvertently given access to\r\n another Signatory’s landing page on the Data Portal or Private\r\n Reports;\r\n </li>\r\n <li>\r\n Ensure that each Authorised User is internally authorised to\r\n access the Data Portal;\r\n </li>\r\n <li>\r\n Ensure that any data exported from the Data Portal is stored\r\n securely and, when shared internally, shared with appropriate\r\n levels of confidentiality and marking such as confidential\r\n folders with limited access;\r\n </li>\r\n <li>\r\n Ensure that all devices used to access the Data Portal are\r\n secure and password protected;\r\n </li>\r\n <li>\r\n Ensure that its use of any disclosed Private Reports ceases at\r\n the direction of the relevant Signatory and/or the removal of\r\n access rights via the Data Portal;\r\n </li>\r\n <li>\r\n Obtain and maintain all necessary licences, consents, and\r\n permissions necessary for the User to provide and/or make\r\n available any of its data, documents, and/or other materials\r\n (“User Materialsâ€) to PRI under this Agreement;\r\n </li>\r\n <li>\r\n At all times comply with the terms of this Agreement,\r\n particularly in relation to ensuring that it does not send,\r\n knowingly take receipt of, upload, download, use or re-use any\r\n material to which the applicable rights holder has not granted\r\n the User the necessary permissions to do; and\r\n </li>\r\n <li>\r\n Not access or use the Data Portal:\r\n <ol>\r\n <li>\r\n To build a product or service which competes with the Data\r\n Portal and/or the services that PRI provides;\r\n </li>\r\n <li>\r\n In any unlawful manner, for any unlawful purpose, or to\r\n act fraudulently or maliciously, for example, by hacking\r\n into or inserting malicious code, including viruses, or\r\n harmful data, into the Data Portal; and/or\r\n </li>\r\n <li>\r\n In a way that could damage, disable, overburden, impair,\r\n or compromise PRI’s systems or security or interfere with\r\n other Signatories’ use of the Data Portal.\r\n </li>\r\n </ol>\r\n </li>\r\n </ol>\r\n </li>\r\n </ol>\r\n <li>\r\n <b>RIGHTS OF PRI</b>\r\n </li>\r\n <ol>\r\n <li>\r\n PRI may terminate and/or suspend access to the Data Portal at any\r\n time at its discretion including if a potential, alleged or\r\n existing threat to data security is identified, or, if in PRI’s\r\n opinion the User is or is likely to be in breach of this\r\n Agreement.\r\n </li>\r\n <li>\r\n The User grants PRI and its employees, agents, consultants,\r\n contractors, sub-contractors and other authorised representatives\r\n a non-exclusive and non-transferrable right to use the User\r\n Materials for and in connection with the purposes described in\r\n this Agreement.\r\n </li>\r\n <li>\r\n PRI may:\r\n <ol>\r\n <li>\r\n As and when the applicable functionality becomes available on\r\n the Data Portal, share Reports between Signatories subject to\r\n the limitations described in clause 8 (Obligations of PRI);\r\n </li>\r\n <li>\r\n Remove and/or erase all data related to the User from the Data\r\n Portal and revoke all permissions applicable to Authorised\r\n Users in the event that the User becomes de-listed as a\r\n Signatory;\r\n </li>\r\n <li>\r\n Use the User Materials, including as part of an analytic\r\n exercise, to plan and implement improvements to the Data\r\n Portal and other of PRI’s products and services and for\r\n internal analysis and research purposes; and\r\n </li>\r\n <li>\r\n Collect and use user statistics related to the Data Portal’s\r\n functionalities, including most commonly searched, shared,\r\n requested and viewed Reports, for any purposes as it sees fit.\r\n </li>\r\n </ol>\r\n </li>\r\n </ol>\r\n <li>\r\n <b>OBLIGATIONS OF PRI</b>\r\n </li>\r\n <ol>\r\n <li>\r\n PRI makes the Data Portal and the{\" \"}\r\n <a\r\n href=\"https://ctp.unpri.org/termsandconditions#reports\"\r\n target=\"_blank\"\r\n >\r\n Reports\r\n </a>{\" \"}\r\n contained therein available for use by the User and its Authorised\r\n Users on an “as is†and “as available†basis.\r\n </li>\r\n <li>\r\n Without prejudice to the foregoing, PRI will use reasonable\r\n endeavours to:\r\n <ol>\r\n <li>\r\n As and when the applicable functionality becomes available on\r\n the Data Portal, publish the indicators in Public Data and the\r\n User’s responses to such indicators provided through the\r\n Online Reporting Tool;\r\n </li>\r\n <li>\r\n Process indicators in Private Reports and the User’s responses\r\n to such indicators provided through the Online Reporting Tool\r\n only in accordance with this Agreement and the terms of the\r\n Online Reporting Tool unless authorised to do otherwise by the\r\n Data Portal Admin;\r\n </li>\r\n <li>\r\n Provide reasonable guidance on the access and usage of the\r\n responses and peering scores; and\r\n </li>\r\n <li>\r\n Without prejudice to clause 8.1, take reasonable steps to\r\n address any technical problems and/or incidents in respect of\r\n the Data Portal as soon as is reasonably practicable to do so.\r\n </li>\r\n </ol>\r\n </li>\r\n <li>\r\n The Data Portal is provided for the purposes of information only.\r\n The content of the Data Portal is not intended to be investment,\r\n legal, tax or any other form of advice, nor is it intended to be\r\n relied upon in making an investment or other decision. All content\r\n is provided with the understanding that the authors and publishers\r\n are not providing advice. PRI is not responsible for any errors or\r\n omissions, for any decision made or action taken based on\r\n information provided by the Data Portal or for any loss or damage\r\n arising from or caused by such decision or action.\r\n </li>\r\n <li>\r\n Subject to clause 13.1 (Liability) and except as described in this\r\n Agreement, PRI does not give any warranties, representations or\r\n other commitments to the User, including as to the functionality,\r\n performance, availability, transmission speeds, content, latency\r\n and/or accuracy of the Data Portal, and all warranties,\r\n conditions, representations, and terms whether written or oral,\r\n express or implied by statute, common law, custom, trade usage,\r\n course of dealing or otherwise are hereby excluded.\r\n </li>\r\n </ol>\r\n <li>\r\n <b>SHARING OF REPORTS AND INDICATORS</b>\r\n </li>\r\n <ol>\r\n <li>\r\n The User agrees that with respect to:\r\n <ol>\r\n <li>\r\n Public indicators and the associated public responses (the\r\n “Public Transparency Dataâ€):\r\n <ol>\r\n <li>\r\n Such Public Transparency Data will:\r\n <ol className=\"roman\">\r\n <li>\r\n Once the User is in a mandatory reporting year; or\r\n </li>\r\n <li>\r\n With the User’s permission, if the User is a voluntary\r\n discloser (i.e., subject to a reporting grace period),\r\n be made publicly available in the form of a Public\r\n Transparency Report and hosted on the PRI website and\r\n Data Portal;\r\n </li>\r\n </ol>\r\n </li>\r\n <li>\r\n PRI has the right to delay or to refuse publication of the\r\n Public Transparency Report if PRI has reasonable reasons\r\n to doubt the accuracy and/or veracity of the Public\r\n Transparency Data;\r\n </li>\r\n <li>\r\n PRI has the right to publish a shortened version of a\r\n Public Transparency Report in order to change the\r\n indicator-response structure but not the meaning of the\r\n Public Transparency Data;\r\n </li>\r\n <li>\r\n PRI may use such data in connection with PRI’s\r\n accountability efforts including efforts to establish the\r\n minimum criteria that can result in a de-listing of a\r\n Signatory;\r\n </li>\r\n <li>\r\n PRI is entitled to:\r\n <ol className=\"roman\">\r\n <li>\r\n Retain the Public Transparency Report and the Public\r\n Transparency Data in its records;\r\n </li>\r\n <li>\r\n Retain the Public Transparency Report and the Public\r\n Transparency Data for re-analysis and re-publication\r\n in part or in whole to third-party organisations;\r\n </li>\r\n <li>\r\n Charge customers of PRI, including the User, a fee for\r\n a dataset comprised of the Public Transparency Data of\r\n the User and/or other Signatories; and\r\n </li>\r\n <li>\r\n Present the Public Transparency Data in a visual\r\n output;\r\n </li>\r\n </ol>\r\n </li>\r\n </ol>\r\n </li>\r\n <li>\r\n Private Reports and the associated private indicators and\r\n responses (the “Private Transparency Dataâ€):\r\n <ol>\r\n <li>\r\n PRI is entitled to:\r\n <ol>\r\n <li>\r\n Retain the Private Transparency Data in its records;\r\n </li>\r\n <li>\r\n Use an aggregate data set of all responses, including\r\n the Private Transparency Data, for purposes aligned to\r\n PRI’s objectives, including communicating externally\r\n the state of responsible investment practices,\r\n improving PRI’s reporting framework (“Reporting\r\n Frameworkâ€), and implementing support tools and\r\n assessment methodologies; and\r\n </li>\r\n <li>\r\n Publish reports and/or analysis (including top-level\r\n observations and asset class analyses based on\r\n Signatories’ responses to both the public and private\r\n indicators) and any such publication based on analysis\r\n of the Private Transparency Data will result in\r\n aggregate findings that do not, without the User’s\r\n consent, highlight the User’s own responses.\r\n </li>\r\n </ol>\r\n </li>\r\n </ol>\r\n </li>\r\n <li>\r\n PRI shall ensure that Public Transparency Data and Private\r\n Transparency Data will be handled in accordance with PRI’s\r\n information security policy, which is available on request by\r\n emailing{\" \"}\r\n <a href=\"mailto:reporting@unpri.org\">reporting@unpri.org</a>.\r\n </li>\r\n </ol>\r\n </li>\r\n </ol>\r\n\r\n <li>\r\n <b>PRI’S INTELLECTUAL PROPERTY RIGHTS</b>\r\n </li>\r\n <ol>\r\n <li>\r\n PRI and, where relevant, its licensors retain all rights,\r\n including all patents, know-how, trade secrets, trademarks,\r\n copyright, database and design rights, whether registered or not,\r\n and similar rights existing anywhere in the world (“IPRâ€) in:\r\n <ol>\r\n <li>\r\n The questionnaire, indicators and other materials and\r\n methodologies comprising PRI’s Reporting Framework;\r\n </li>\r\n <li>\r\n The “Online Reporting Tool,†which is the platform through\r\n which PRI collects responses from Signatories;\r\n </li>\r\n <li>The Data Portal;</li>\r\n <li>The Reports; and</li>\r\n <li>\r\n Any derivative works and/or enhancements created from any or\r\n all of the above, (the “PRI Materialsâ€).\r\n </li>\r\n </ol>\r\n </li>\r\n <li>\r\n PRI has the right to terminate in whole or in part the licence to\r\n use the{\" \"}\r\n <a\r\n href=\"https://ctp.unpri.org/termsandconditions#pri-materials\"\r\n target=\"_blank\"\r\n >\r\n PRI Materials\r\n </a>{\" \"}\r\n described in clause 5.1 at its discretion.\r\n </li>\r\n <li>\r\n The User shall have no right or interest in the{\" \"}\r\n <a\r\n href=\"https://ctp.unpri.org/termsandconditions#pri-materials\"\r\n target=\"_blank\"\r\n >\r\n PRI Materials\r\n </a>{\" \"}\r\n except as described in this Agreement.\r\n </li>\r\n </ol>\r\n\r\n <li>\r\n <b>CONTRACTORS</b>\r\n </li>\r\n <ol>\r\n <li>\r\n PRI will be entitled to exercise any of its rights under the\r\n Agreement by appointing contractors provided that such contractors\r\n shall be subject to a written confidentiality agreement covering\r\n the matters described in this Agreement.\r\n </li>\r\n </ol>\r\n\r\n <li>\r\n <b>COMPLIANCE AND DATA PROTECTION</b>\r\n </li>\r\n <ol>\r\n <li>\r\n Both parties warrant that they:\r\n <ol>\r\n <li>\r\n Will comply with all relevant data protection and privacy\r\n laws, including the General Data Protection Regulation,\r\n Regulation (EU) 2016/679, as it forms part of domestic law in\r\n the United Kingdom by virtue of section 3 of the European\r\n Union (Withdrawal) Act 2018; the Data Protection Act 2018 (and\r\n regulations made thereunder); and the Privacy and Electronic\r\n Communications Regulations 2003 (SI 2003/2426) (the “Privacy\r\n Lawsâ€) and in each case any updates to the same; and\r\n </li>\r\n <li>\r\n Will not perform their obligations under this Agreement in\r\n such a way as to cause the other party to this Agreement to\r\n breach any of its applicable obligations under the Privacy\r\n Laws.\r\n </li>\r\n </ol>\r\n </li>\r\n </ol>\r\n\r\n <li>\r\n <b>LIMITATION OF LIABILITY</b>\r\n </li>\r\n <ol>\r\n <li>\r\n Nothing in this Agreement shall limit or exclude either party's\r\n liability to the other to a greater extent than is permitted under\r\n applicable law for loss or damage resulting from:\r\n <ol>\r\n <li>Death or personal injury caused by negligence;</li>\r\n <li>Fraud or fraudulent misrepresentation; or</li>\r\n <li>\r\n Any matter in respect of which losses may not be limited or\r\n excluded under applicable laws.\r\n </li>\r\n </ol>\r\n </li>\r\n <li>\r\n Subject to clause 13.1, PRI shall not be liable to the User under\r\n any causes of action, whether such causes of action arise in\r\n contract (including under any indemnity or warranty), in tort\r\n (including negligence), for breach of statutory duty or otherwise\r\n (an “Actionâ€) for loss or damage that comprise:\r\n <ol>\r\n <li>Loss or corruption of data or information;</li>\r\n <li>Special, indirect or consequential loss;</li>\r\n <li>Loss of profit or revenue;</li>\r\n <li>Loss of contract or business opportunity; or</li>\r\n <li>Depletion of goodwill,</li>\r\n </ol>\r\n in each case, whether arising directly or indirectly under or in\r\n connection with this Agreement and whether or not reasonably\r\n foreseeable, reasonably contemplatable, actually foreseen or\r\n actually contemplated by a party on its entering into this\r\n Agreement.\r\n </li>\r\n <li>\r\n Subject to clause 13.1 and clause 13.2, PRI’s total aggregate\r\n liability to the User in respect of all Actions arising under\r\n and/or in connection with this Agreement shall not exceed the sum\r\n of £1,000.00.\r\n </li>\r\n <li>\r\n The parties agree that the provisions of this clause 13 are\r\n considered by them to be reasonable in all the circumstances,\r\n having taken into account section 11 and the guidelines in\r\n schedule 2 of the Unfair Contract Terms Act 1977 and the nature of\r\n the Data Portal.\r\n </li>\r\n <li>\r\n The User shall indemnify, defend, and hold harmless PRI against\r\n any loss, cost or damage, including direct, indirect, special or\r\n consequential loss, relating to or arising directly or indirectly\r\n as a result of the inaccuracy of any data inputted by the User in\r\n the Online Reporting Tool or the use of any Reports by other\r\n Signatories to the extent that disclosure of such Reports to other\r\n Signatories has been authorised by the User.\r\n </li>\r\n </ol>\r\n\r\n <li>\r\n <b>GENERAL</b>\r\n </li>\r\n <ol>\r\n <li>\r\n Variation:\r\n <ol>\r\n <li>\r\n PRI has sole discretion and control over, and may modify at\r\n any time, with or without notice to the User, the\r\n functionality, performance, configuration, appearance and\r\n content of the Data Portal.\r\n </li>\r\n <li>\r\n PRI may change the terms of the Agreement at any time by\r\n notifying the User of such change at the time the User next\r\n accesses the Data Portal, or by email.\r\n </li>\r\n <li>\r\n The date that this Agreement was last updated is 25 November\r\n 2024.\r\n </li>\r\n </ol>\r\n </li>\r\n <li>\r\n Entire Agreement: This Agreement is the entire agreement between\r\n the parties in relation to a User’s use of the Data Portal.\r\n </li>\r\n <li>\r\n No Partnership: This Agreement is not intended to nor will it\r\n create any agency, partnership or joint venture. Neither party\r\n will hold itself out as being entitled to represent or bind the\r\n other party in any way.\r\n </li>\r\n <li>\r\n Governing Law and Jurisdiction: This Agreement and any dispute or\r\n claim arising out of or in connection with it, including\r\n non-contractual disputes or claims, shall be governed by and\r\n construed in accordance with English law. Each party irrevocably\r\n agrees that the courts of England and Wales shall have exclusive\r\n jurisdiction to settle any dispute or claim arising out of or in\r\n connection with this Agreement, including non-contractual disputes\r\n or claims.\r\n </li>\r\n <li>\r\n Notices:\r\n <ol>\r\n <li>\r\n Notices from the User, except in connection with the\r\n commencement of legal proceedings, must be given by email to\r\n the appropriate address (\r\n <a href=\"mailto:reporting@unpri.org\">reporting@unpri.org</a>).\r\n </li>\r\n <li>\r\n Notices from PRI to the User, except in connection with the\r\n commencement of legal proceedings, will be given to the email\r\n accounts through which the User has received the login for the\r\n Data Portal unless the User provides in writing new email\r\n accounts.\r\n </li>\r\n </ol>\r\n </li>\r\n <li>\r\n Third Party Rights: This Agreement does not confer any rights on\r\n any person or party, other than the parties to this Agreement,\r\n pursuant to the Contracts (Rights of Third Parties) Act 1999.\r\n </li>\r\n <li>\r\n No Waiver: No failure or delay by a party to exercise any right or\r\n remedy provided under this Agreement or by applicable law shall\r\n constitute a waiver of that or any other right or remedy, nor\r\n shall it prevent or restrict the further exercise of that or any\r\n other right or remedy.\r\n </li>\r\n <li>\r\n Severability: If any provision or part of a provision of this\r\n Agreement is found by any court or administrative body of\r\n competent jurisdiction to be invalid, unenforceable or illegal,\r\n the other provisions shall remain in force. If any invalid,\r\n unenforceable or illegal provision would be valid, enforceable or\r\n legal if some part of it were deleted, the provision shall apply\r\n with whatever modification is necessary to give effect to the\r\n commercial intention of the parties.\r\n </li>\r\n <li>\r\n Interpretation\r\n <p>In this Agreement:</p>\r\n <ol>\r\n <li>\r\n The headings are for convenience only and shall not affect the\r\n interpretation of the Agreement;\r\n </li>\r\n <li>\r\n Any obligation in this Agreement on a party not to do\r\n something, includes an obligation not to agree, allow, permit\r\n or acquiesce to that thing being done;\r\n </li>\r\n <li>\r\n Any reference in this Agreement to any enactment or statutory\r\n provision or subordinate legislation will be construed as a\r\n reference to it as from time to time replaced, amended,\r\n consolidated or re-enacted, with or without modification, and\r\n includes all orders, rules or regulations made under such\r\n enactment;\r\n </li>\r\n <li>\r\n Any list, word, or phrase following the words including,\r\n include, in particular, for example, or any such similar\r\n expression shall be construed as having the phrase without\r\n limitation following them; and\r\n </li>\r\n <li>\r\n The rule known as eiusdem generis shall not apply and\r\n accordingly, words introduced by the word other shall not be\r\n given a restrictive meaning by reason of the fact that such\r\n words are preceded by words indicating a particular class of\r\n acts, matters or things.\r\n </li>\r\n </ol>\r\n </li>\r\n </ol>\r\n </ol>\r\n <h2>\r\n <b>CONTACT US</b>\r\n </h2>\r\n <p>\r\n Questions and comments regarding these terms should be sent to{\" \"}\r\n <a href=\"mailto:reporting@unpri.org\">reporting@unpri.org</a>. If you\r\n are having problems registering for an account or using the Data\r\n Portal, please contact{\" \"}\r\n <a href=\"mailto:helpdesk@unpri.org\">helpdesk@unpri.org</a> for\r\n assistance.\r\n </p>\r\n </div>\r\n <div className={classes.buttonsContainer}>\r\n <Button\r\n className=\"button\"\r\n variant=\"contained\"\r\n color=\"primary\"\r\n style={{ marginTop: -5 }}\r\n onClick={() =>\r\n handleTermsAndConditionsClick(\r\n state.user.id,\r\n true,\r\n state.user.acceptedTnCs\r\n )\r\n }\r\n >\r\n Accept\r\n </Button>\r\n\r\n <Button\r\n className=\"button\"\r\n variant=\"contained\"\r\n color=\"primary\"\r\n style={{ marginTop: -5 }}\r\n onClick={() =>\r\n handleTermsAndConditionsClick(\r\n state.user.id,\r\n false,\r\n state.user.acceptedTnCs\r\n )\r\n }\r\n >\r\n Reject\r\n </Button>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React, { useEffect, useState, useContext } from 'react';\r\nimport { Collapse, Container, Navbar, NavbarBrand, NavbarToggler, NavItem, NavLink, Row, Col } from 'reactstrap';\r\nimport { Link } from 'react-router-dom';\r\nimport './NavMenu.css';\r\nimport logo from '../assets/logo.png'\r\nimport Form from 'react-bootstrap/Form';\r\nimport { AuthContext } from '../App';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\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 DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport { Button, Radio} from '@material-ui/core';\r\n\r\nimport { Checkbox } from '@material-ui/core';\r\nimport { Console } from 'console';\r\n\r\nexport function RoleCheckBoxes(props: any) {\r\n \r\n \r\n const [reportingChecked, setReportingChecked] = React.useState(false); \r\n const [dataChecked, setDataChecked] = React.useState(false); \r\n const [adminDashChecked, setAdminChecked] = React.useState(false); \r\n\r\n const [reportingAndDataChecked, setReportingAndDataChecked] = React.useState(false);\r\n const [openAdminCheck, setOpenAdminCheck] = React.useState(false);\r\n const [openRemoveAdminCheck, setopenRemoveAdminCheck] = React.useState(false);\r\n const [currentRoleChoice, setCurrentRoleChoice] = React.useState(\"\");\r\n\r\n \r\n const Roles = {\r\n ReportingContributor:'Reporting Contributor', \r\n ReportingAndDataPortalContributor:'Reporting and Data Portal Contributor', \r\n Admin: 'Admin', \r\n DataPortalContributor: \"Data Portal Contributor\"};\r\n \r\n useEffect(() => {\r\n switch (props.row.role) {\r\n case Roles.ReportingContributor:\r\n setReportingChecked(true);\r\n break;\r\n case Roles.ReportingAndDataPortalContributor:\r\n\r\n setReportingAndDataChecked(true);\r\n break;\r\n case Roles.DataPortalContributor:\r\n\r\n setDataChecked(true);\r\n break;\r\n case Roles.Admin:\r\n setAdminChecked(true);\r\n break;\r\n default:\r\n break;\r\n \r\n }\r\n\r\n }, [])\r\n\r\n\r\n const handleCloseAdminCheck = (e: any) => {\r\n setOpenAdminCheck(false);\r\n setopenRemoveAdminCheck(false)\r\n }\r\n\r\n const handleChange = (event: any, choice: string, doAdminCheck: boolean) => {\r\n event.stopPropagation();\r\n\r\n\r\n\r\n\r\n if (choice === Roles.Admin && doAdminCheck) {\r\n \r\n setCurrentRoleChoice(choice);\r\n setOpenAdminCheck(true);\r\n return;\r\n }\r\n \r\n else if (props.row.role == Roles.Admin && currentRoleChoice == Roles.Admin || props.row.role == Roles.Admin && currentRoleChoice == \"\"){\r\n setCurrentRoleChoice(choice);\r\n setopenRemoveAdminCheck(true);\r\n return;\r\n }\r\n \r\n switch (choice) {\r\n case Roles.ReportingContributor:\r\n setDataChecked(false);\r\n setReportingAndDataChecked(false);\r\n setAdminChecked(false);\r\n setReportingChecked(true);\r\n props.handleRoleChanged( Roles.ReportingContributor, props.row);\r\n break;\r\n case Roles.DataPortalContributor:\r\n setReportingAndDataChecked(false);\r\n setAdminChecked(false);\r\n setReportingChecked(false);\r\n setDataChecked(true);\r\n props.handleRoleChanged(Roles.DataPortalContributor, props.row);\r\n break;\r\n case Roles.ReportingAndDataPortalContributor:\r\n setAdminChecked(false);\r\n setReportingChecked(false);\r\n setDataChecked(false);\r\n setReportingAndDataChecked(true);\r\n props.handleRoleChanged(Roles.ReportingAndDataPortalContributor, props.row);\r\n break;\r\n case Roles.Admin:\r\n\r\n setReportingChecked(false);\r\n setDataChecked(false);\r\n setReportingAndDataChecked(false);\r\n setAdminChecked( true);\r\n props.handleRoleChanged(Roles.Admin, props.row);\r\n break;\r\n\r\n \r\n default:\r\n break;\r\n }\r\n \r\n };\r\n\r\n const handleClick = (event: any) => {\r\n event.stopPropagation();\r\n };\r\n\r\n function MakeAdmin(e: any) {\r\n handleChange(e, currentRoleChoice, false);\r\n setOpenAdminCheck(false);\r\n //handleCloseAdminCheck(e);\r\n }\r\n\r\n function RemoveAdmin(e: any) {\r\n handleChange(e, currentRoleChoice, false);\r\n setopenRemoveAdminCheck(false);\r\n //handleCloseAdminCheck(e);\r\n }\r\n \r\n return (\r\n <>\r\n \r\n\r\n <FormControlLabel\r\n value=\"Reporting Contributor\"\r\n\r\n control={<Radio checked={reportingChecked} onChange={(e) => handleChange(e, Roles.ReportingContributor, props.adminCheck)} onClick={handleClick} />}\r\n label=\"Reporting Contributor\"\r\n />\r\n \r\n <FormControlLabel\r\n value=\"Data Portal Contributor\"\r\n\r\n control={<Radio checked={dataChecked} onChange={(e) => handleChange(e, Roles.DataPortalContributor, props.adminCheck)} onClick={handleClick} />}\r\n label=\"Data Portal Contributor\"\r\n />\r\n <FormControlLabel\r\n value=\"Reporting and Data Portal Contributor\"\r\n control={<Radio checked={reportingAndDataChecked} onChange={(e) => handleChange(e, Roles.ReportingAndDataPortalContributor, props.adminCheck)} onClick={handleClick} />}\r\n label=\"Reporting and Data Portal Contributor\"\r\n />\r\n\r\n {props.signatory && props.signatory.permittedAssignableRoles.includes(Roles.Admin) &&\r\n\r\n <FormControlLabel\r\n value=\"Admin\"\r\n\r\n control={<Radio checked={adminDashChecked} onChange={(e) => handleChange(e, Roles.Admin, props.adminCheck)} onClick={handleClick} />}\r\n label=\"Admin\"\r\n />\r\n }\r\n\r\n {/* {props.signatory && props.signatory.permittedAssignableRoles.includes(Roles.MainAdmin) &&\r\n\r\n <FormControlLabel\r\n value=\"Main Admin\"\r\n control={<Radio checked={mainAdminChecked} onChange={(e) => handleChange(e, Roles.MainAdmin, props.adminCheck)} onClick={handleClick} />}\r\n label=\"Main Admin\"\r\n />\r\n\r\n \r\n } */}\r\n\r\n\r\n <Dialog open={openAdminCheck} onClose={handleCloseAdminCheck} aria-labelledby=\"form-dialog-title\">\r\n <DialogTitle id=\"form-dialog-title\">Admin User</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>\r\n By making this user an admin they will have access to all areas of the application including managing permissions. \r\n Do you want to proceed? \r\n </DialogContentText>\r\n\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={handleCloseAdminCheck} color=\"primary\">\r\n Cancel\r\n </Button>\r\n <Button onClick={MakeAdmin} color=\"primary\">\r\n Make Admin\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n\r\n <Dialog open={openRemoveAdminCheck} onClose={handleCloseAdminCheck} aria-labelledby=\"form-dialog-title\">\r\n <DialogTitle id=\"form-dialog-title\">Remove Admin User</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>\r\n Are you sure you want remove this user from being admin? User will lose access to certain areas of the app.\r\n Do you want to proceed? \r\n </DialogContentText>\r\n\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={handleCloseAdminCheck} color=\"primary\">\r\n Cancel\r\n </Button>\r\n <Button onClick={RemoveAdmin} color=\"primary\">\r\n Remove Admin\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n </>)\r\n}\r\n","import { toast } from \"react-toastify\"\r\nimport \"react-toastify/dist/ReactToastify.css\"\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TablePagination from '@material-ui/core/TablePagination';\r\nimport TableRow from '@material-ui/core/TableRow';\r\nimport TableSortLabel from '@material-ui/core/TableSortLabel';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport { useHistory } from \"react-router-dom\";\r\nimport React, { useEffect } from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport { makeStyles, StylesProvider } from '@material-ui/core/styles';\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Tabs from '@material-ui/core/Tabs';\r\nimport Tab from '@material-ui/core/Tab';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport Box from '@material-ui/core/Box';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport { Button, CardContent, Checkbox, CircularProgress, Grid, Paper, Card, CardHeader } from '@material-ui/core';\r\nimport Form from 'react-bootstrap/Form';\r\nimport TextField from '@material-ui/core/TextField';\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 DialogContentText from '@material-ui/core/DialogContentText';\r\nimport DialogTitle from '@material-ui/core/DialogTitle';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport Select from '@material-ui/core/Select';\r\nimport qs from \"qs\";\r\nimport axios from 'axios';\r\nimport { ISignatoryResponseDTO } from \"../interfaces/ISignatoryResponseDTO\";\r\nimport { ISetRoleRequestDTO } from \"../interfaces/ISetRoleRequestDTO\";\r\nimport { IUserRoleDTO } from '../interfaces/IUserRoleDTO';\r\nimport { AuthContext } from \"../App\";\r\nimport { ISetPermissionsResponseDTO } from \"../interfaces/ISetPermissionsResponseDTO\";\r\nimport ReactDOM from \"react-dom\";\r\n// @ts-ignore\r\nimport { RoleCheckBoxes } from \"./RoleCheckBoxes\";\r\nimport { FullscreenExit } from \"@material-ui/icons\";\r\n\r\n\r\nwindow.React = React;\r\nwindow.ReactDOM = ReactDOM;\r\n// @ts-ignore\r\nwindow.PropTypes = PropTypes;\r\n\r\ntoast.configure();\r\n\r\nfunction TabPanel(props: any) {\r\n const { children, value, index, ...other } = props;\r\n\r\n return (\r\n <div\r\n role=\"tabpanel\"\r\n hidden={value !== index}\r\n id={`scrollable-auto-tabpanel-${index}`}\r\n aria-labelledby={`scrollable-auto-tab-${index}`}\r\n {...other}\r\n >\r\n {value === index && (\r\n <Box p={3}>\r\n <Typography>{children}</Typography>\r\n </Box>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nTabPanel.propTypes = {\r\n children: PropTypes.node,\r\n index: PropTypes.any.isRequired,\r\n value: PropTypes.any.isRequired,\r\n};\r\n\r\nfunction a11yProps(index: any) {\r\n return {\r\n id: `scrollable-auto-tab-${index}`,\r\n 'aria-controls': `scrollable-auto-tabpanel-${index}`,\r\n };\r\n}\r\n\r\nfunction descendingComparator(a: any, b: any, orderBy: any) {\r\n if (b[orderBy] < a[orderBy]) {\r\n return -1;\r\n }\r\n if (b[orderBy] > a[orderBy]) {\r\n return 1;\r\n }\r\n return 0;\r\n}\r\n\r\nfunction getComparator(order: any, orderBy: any) {\r\n return order === 'desc'\r\n ? (a: any, b: any) => descendingComparator(a, b, orderBy)\r\n : (a: any, b: any) => -descendingComparator(a, b, orderBy);\r\n}\r\n\r\nfunction stableSort(array: any, comparator: any) {\r\n if (!array) return;\r\n const stabilizedThis = array.map((el: any, index: any,) => [el, index]);\r\n stabilizedThis.sort((a: any, b: any) => {\r\n const order = comparator(a[0], b[0]);\r\n if (order !== 0) return order;\r\n return a[1] - b[1];\r\n });\r\n return stabilizedThis.map((el: any) => el[0]);\r\n}\r\n\r\nconst headCells = [\r\n { id: 'name', numeric: false, disablePadding: true, label: 'Full Name' },\r\n { id: 'username', numeric: true, disablePadding: false, label: 'Username (e-mail address)' },\r\n { id: 'role', numeric: true, disablePadding: false, label: 'Role' },\r\n];\r\n\r\nfunction EnhancedTableHead(props: any) {\r\n const { classes, onSelectAllClick, order, orderBy, numSelected, rowCount, onRequestSort } = props;\r\n const createSortHandler = (property: any) => (event: any) => {\r\n onRequestSort(event, property);\r\n };\r\n\r\n return (\r\n <TableHead>\r\n <TableRow>\r\n <TableCell padding=\"checkbox\">\r\n </TableCell>\r\n {headCells.map((headCell) => (\r\n <TableCell\r\n key={headCell.id}\r\n align={headCell.numeric ? 'right' : 'left'}\r\n padding={headCell.disablePadding ? 'none' : 'default'}\r\n sortDirection={orderBy === headCell.id ? order : false}\r\n >\r\n <TableSortLabel\r\n active={orderBy === headCell.id}\r\n direction={orderBy === headCell.id ? order : 'asc'}\r\n onClick={createSortHandler(headCell.id)}\r\n >\r\n {headCell.label}\r\n {orderBy === headCell.id ? (\r\n <span className={classes.visuallyHidden}>\r\n {order === 'desc' ? 'sorted descending' : 'sorted ascending'}\r\n </span>\r\n ) : null}\r\n </TableSortLabel>\r\n </TableCell>\r\n ))}\r\n </TableRow>\r\n </TableHead>\r\n );\r\n}\r\n\r\ninterface IEnhancedToolBarProps {\r\n onSearchTermChanged: (searchTerm: string) => void,\r\n signatoryName?: string \r\n activeUsersCount?: number\r\n}\r\n\r\nconst EnhancedTableToolbar = (props: IEnhancedToolBarProps) => {\r\n const classes = useToolbarStyles();\r\n const { onSearchTermChanged, signatoryName, activeUsersCount } = props;\r\n\r\n return (\r\n <Toolbar style={{ backgroundColor: '#07aeef', color: 'white' }}>\r\n <Typography className={classes.title} variant=\"h6\" id=\"tableTitle\" component=\"div\">\r\n {signatoryName}\r\n </Typography>\r\n <Typography className={classes.title} variant=\"h6\" id=\"tableTitle\" component=\"div\" align=\"right\">\r\n Active Users: {activeUsersCount}\r\n </Typography>\r\n <Tooltip title=\"Search\">\r\n <IconButton aria-label=\"filter list\">\r\n <input type=\"text\" style={{ fontSize: 20 }} onChange={e => onSearchTermChanged(e.target.value)} placeholder=\" Search User \"></input>\r\n </IconButton>\r\n </Tooltip>\r\n </Toolbar>\r\n );\r\n};\r\n\r\nconst useStyles = makeStyles((theme: any) => ({\r\n root: {\r\n flexGrow: 1,\r\n width: '100%',\r\n backgroundColor: theme.palette.background.paper,\r\n },\r\n table: {\r\n minWidth: 750,\r\n },\r\n visuallyHidden: {\r\n border: 0,\r\n clip: 'rect(0 0 0 0)',\r\n height: 1,\r\n margin: -1,\r\n overflow: 'hidden',\r\n padding: 0,\r\n position: 'absolute',\r\n top: 20,\r\n width: 1,\r\n },\r\n buttonsContainer: {\r\n '& > *': {\r\n margin: theme.spacing(1),\r\n },\r\n '& > :first-child': {\r\n marginLeft: 0\r\n }\r\n },\r\n formControl: {\r\n margin: theme.spacing(1),\r\n minWidth: 120,\r\n },\r\n paper: {\r\n padding: theme.spacing(2),\r\n textAlign: 'left',\r\n color: theme.palette.text.secondary,\r\n },\r\n}));\r\n\r\nexport function Signatory(props: any) {\r\n const classes = useStyles();\r\n const [order, setOrder] = React.useState('asc');\r\n const [orderBy, setOrderBy] = React.useState('username');\r\n const [selected, setSelected] = React.useState<any>(null);\r\n const [page, setPage] = React.useState(0);\r\n const [dense] = React.useState(false);\r\n const [rowsPerPage, setRowsPerPage] = React.useState(5);\r\n const [loading, setLoading] = React.useState(false);\r\n const [signatory, setSignatory] = React.useState<ISignatoryResponseDTO>();\r\n const { state, dispatch } = React.useContext(AuthContext);\r\n const [searchTerm, setSearchTerm] = React.useState(\"\");\r\n const [signatoryId, setSignatoryId] = React.useState<any>();\r\n const [guid, setGuid] = React.useState<any>();\r\n const [role, setRole] = React.useState<any>('');\r\n const [open, setOpen] = React.useState(false);\r\n const [showEditSurveyLink, setShowEditSurveyLink] = React.useState(false);\r\n const [revokeOpen, setRevokeOpen] = React.useState(false);\r\n const [value, setValue] = React.useState(0);\r\n const [emailValid, setValidEmail] = React.useState(true);\r\n const [domainIsInvalid, setDomainIsInvalid] = React.useState(false);\r\n const [roleSelected, setRoleSelected] = React.useState(true);\r\n const [email, setEmail] = React.useState(\"\");\r\n const [surveyLink, setSurveyLink] = React.useState(\"\");\r\n const [surveyLinkValidValid, setSurveyLinkValidValid] = React.useState(true);\r\n\r\n const emptyRows = rowsPerPage - Math.min(rowsPerPage, (signatory?.users?.length ?? 0) - page * rowsPerPage);\r\n const history = useHistory();\r\n\r\n // TODO USE EFFECT AS ONE FUNC\r\n useEffect(() => {\r\n let id = qs.parse(props.location.search, { ignoreQueryPrefix: true }).id\r\n let tab = qs.parse(props.location.search, { ignoreQueryPrefix: true }).tab\r\n ;\r\n\r\n if (tab && !isNaN(Number(tab)))\r\n setValue(Number(tab));\r\n\r\n if (id) {\r\n dispatch({ type: \"SET_SIGNATORY_GUID\", payload: id });\r\n setGuid(id);\r\n getSignatory(id);\r\n }\r\n else {\r\n if (state?.signatoryId && state.signatoryId > 0) {\r\n setSignatoryId(state.signatoryId);\r\n setGuid(state.guid);\r\n getSignatory(state.guid);\r\n }\r\n }\r\n }, [state?.signatoryId])\r\n\r\n\r\n // useEffect(() => {\r\n // console.log(\"FIRST USE AFFECT\")\r\n // // console.table(state);\r\n // if (state?.signatoryId && state.signatoryId > 0) {\r\n // setSignatoryId(state.signatoryId);\r\n // setGuid(state.guid);\r\n // getSignatory(state.guid);\r\n // }\r\n // }, [state?.signatoryId])\r\n\r\n\r\n\r\n const getSignatory = async (id: any) => {\r\n //TODO: Need to include the requesting users auth token in every request (as this is used to validate permission to access this particular resource)\r\n const response = await axios.get<any>(\"/signatorydetail?id=\" + id);\r\n if (response.data == null) {\r\n\r\n if (props.location?.state) {\r\n\r\n if (props.location.state?.prevSignatoryId) {\r\n\r\n props.history.push({ pathname: '/survey', state: { from: props.location.pathname } })\r\n } else {\r\n\r\n const affiliatedSignatories = state?.user?.affiliatedSignatories;\r\n const managePermissionsSignatory = affiliatedSignatories.find((x: { role: number; }, y: { id: number; }) =>\r\n x.role == 1 && y.id != state?.signatoryId);\r\n if (managePermissionsSignatory) {\r\n\r\n const managePermissionsSignatoryId = managePermissionsSignatory.id;\r\n const managePermissionsSignatoryGuid = managePermissionsSignatory.guid;\r\n dispatch({ type: \"SET_SIGNATORY_ID\", payload: managePermissionsSignatoryId });\r\n dispatch({ type: \"SET_SIGNATORY_GUID\", payload: managePermissionsSignatoryGuid });\r\n props.history.push(\"/signatory?id=\" + managePermissionsSignatoryGuid);\r\n } else {\r\n\r\n if (props.location.state?.internal) {\r\n props.history.push({ pathname: '/survey', state: { from: props.location.pathname, prevFrom: '/dataportalv2' } })\r\n } else {\r\n props.history.push({ pathname: '/survey', state: { from: props.location.pathname } })\r\n }\r\n }\r\n }\r\n } else {\r\n\r\n history.push({ pathname: '/survey', state: { from: props.location.pathname } })\r\n }\r\n }\r\n\r\n if (response !== null && response.data !== null && response.data !== \"\") {\r\n\r\n setSignatory(response.data);\r\n setSurveyLink(response.data.surveyLink);\r\n }\r\n }\r\n\r\n const showToast = (message: string, success: boolean) => {\r\n if (success) {\r\n toast.success(message, {\r\n position: \"bottom-right\",\r\n autoClose: 3333,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n progress: undefined,\r\n })\r\n }\r\n else {\r\n toast.error(message, {\r\n position: \"bottom-right\",\r\n autoClose: 3333,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n progress: undefined,\r\n })\r\n }\r\n };\r\n\r\n const handleRequestSort = (event: any, property: any) => {\r\n const isAsc = orderBy === property && order === 'asc';\r\n setOrder(isAsc ? 'desc' : 'asc');\r\n setOrderBy(property);\r\n };\r\n\r\n const handleClick = (event: any, row: any) => {\r\n if (selected && row.email == selected.username) {\r\n setSelected(null);\r\n return;\r\n }\r\n setSelected(row);\r\n };\r\n\r\n const handleChangePage = (event: any, newPage: any) => {\r\n setPage(newPage);\r\n };\r\n\r\n const handleChangeRowsPerPage = (event: any) => {\r\n setRowsPerPage(parseInt(event.target.value, 10));\r\n setPage(0);\r\n }; \r\n\r\n const handleChange = (event: any, newValue: any) => {\r\n setValue(newValue);\r\n };\r\n\r\n\r\n\r\n\r\n const handleClickShowEditSurveyLink = () => {\r\n console.log(\"show survey clicked\");\r\n setShowEditSurveyLink(true);\r\n console.log(showEditSurveyLink);\r\n };\r\n\r\n const handleCloseEditSurveyLink = () => {\r\n setShowEditSurveyLink(false);\r\n };\r\n\r\n const handleClickOpen = () => {\r\n setRole('')\r\n setOpen(true);\r\n };\r\n\r\n const handleClose = () => {\r\n setOpen(false);\r\n };\r\n\r\n const handleRevokeClickOpen = () => {\r\n setRevokeOpen(true);\r\n };\r\n\r\n const handleRevokeClose = () => {\r\n setRevokeOpen(false);\r\n };\r\n\r\n const handleEditSurveyLink = async () => {\r\n\r\n\r\n const reg = new RegExp(/\\b(https?|ftp|file):\\/\\/[\\-A-Za-z0-9+&@#\\/%?=~_|!:,.;]*[\\-A-Za-z0-9+&@#\\/%=~_|]/);\r\n var valid = reg.test(surveyLink);\r\n\r\n if (!valid || surveyLink === null || surveyLink.length === 0) {\r\n setSurveyLinkValidValid(false);\r\n return;\r\n }\r\n\r\n const response = await axios.put<any>(\"/SignatoryDetail\", { SignatoryId: guid, SurveyLink: surveyLink });\r\n\r\n console.log(\"put response\", response);\r\n\r\n if (response.data === true) {\r\n toast.success(\"Survey link updated\", {\r\n position: \"bottom-right\",\r\n autoClose: 3333,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n progress: undefined,\r\n });\r\n setSurveyLinkValidValid(true);\r\n setShowEditSurveyLink(false);\r\n }\r\n else {\r\n toast.error(\"Error updating survey link\", {\r\n position: \"bottom-right\",\r\n autoClose: 3333,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n progress: undefined,\r\n });\r\n\r\n setShowEditSurveyLink(false);\r\n }\r\n }\r\n\r\n const handleInviteUser = async (checkEmailDomain: boolean) => {\r\n const reg = new RegExp(/^\\S+@\\S+$/);\r\n var valid = reg.test(email);\r\n if (!valid || !email) {\r\n setValidEmail(false);\r\n return;\r\n }\r\n setValidEmail(true);\r\n\r\n if (!role) {\r\n setRoleSelected(false);\r\n return;\r\n }\r\n setRoleSelected(true);\r\n\r\n setLoading(true)\r\n var result = await axios.post<ISetPermissionsResponseDTO>(\"/signatorydetail/setpermissions\", { emailAddress: email, role: role, signatoryId: state?.guid.toString(), permissionType: \"grant\", checkEmailDomainAllowed: checkEmailDomain })\r\n\r\n if (result.data.success) {\r\n\r\n if (result.data.emailFailed) {\r\n showToast(result.data.errorMessage, false);\r\n }\r\n else {\r\n showToast('E-mail invitation successfully sent to ' + email, true);\r\n }\r\n setOpen(false);\r\n await getSignatory(guid);\r\n setDomainIsInvalid(false);\r\n }\r\n else if (result.data.errorMessage == \"This user does not have a matching email domain to your organisation\") {\r\n setDomainIsInvalid(true);\r\n setOpen(false);\r\n }\r\n else {\r\n showToast(result.data.errorMessage, false);\r\n }\r\n\r\n setLoading(false);\r\n }\r\n\r\n const handleRevokeUser = async () => {\r\n setLoading(true)\r\n var result = await axios.post<ISetPermissionsResponseDTO>(\"/signatorydetail/setpermissions\", { emailAddress: selected.email, role: selected.role, signatoryId: state?.guid, permissionType: \"revoke\" })\r\n\r\n if (result.data.success) {\r\n\r\n if (result.data.emailFailed) {\r\n showToast(result.data.errorMessage, false);\r\n setRevokeOpen(false)\r\n await getSignatory(guid);\r\n }\r\n else {\r\n showToast('Revocation E-mail successfully sent to ' + selected.email, true);\r\n setRevokeOpen(false)\r\n await getSignatory(guid);\r\n }\r\n }\r\n else {\r\n showToast(result.data.errorMessage, false);\r\n }\r\n setLoading(false);\r\n }\r\n\r\n const handleRoleChanged = async (role: any, row: any) => {\r\n\r\n let request: ISetRoleRequestDTO = {\r\n userId: row.id,\r\n guid: guid,\r\n role: role.replace(new RegExp(' ', 'g'), ''),\r\n signatoryId: signatoryId\r\n };\r\n console.log(\"request\", request);\r\n console.log(\"role\", role);\r\n var result = await axios.post<boolean>(\"/signatorydetail/setRole\", request);\r\n await getSignatory(guid);\r\n if (result.data) {\r\n showToast(\"Role updated\", true);\r\n setRole(role);\r\n }\r\n else {\r\n showToast(\"An error occurred updating role\", false);\r\n }\r\n };\r\n\r\n\r\n\r\n function getPermittedAssignableRolesForUserType2(row: any, signatory: any, index: number) {\r\n\r\n\r\n return <>\r\n <Checkbox checked={true} name=\"contributor-checkbox\" />\r\n <Checkbox checked={true} name=\"contributor-data-checkbox\" />\r\n <Checkbox checked={true} name=\"admin-checkbox\" />\r\n <Checkbox checked={true} name=\"main-admin-checkbox\" />\r\n </>\r\n }\r\n\r\n const handleSearchTermChanged = (searchTerm: string) => {\r\n setSearchTerm(searchTerm)\r\n };\r\n\r\n const handleFilter = (input: IUserRoleDTO) => {\r\n if (searchTerm.length > 2) {\r\n if (input.fullName.toLowerCase().startsWith(searchTerm.toLowerCase())) {\r\n return true;\r\n }\r\n\r\n if (input.username.toLowerCase().startsWith(searchTerm.toLowerCase())) {\r\n return true;\r\n }\r\n }\r\n else {\r\n return input !== null;\r\n }\r\n return false;\r\n }\r\n\r\n const handleCancelInviteUser = (e: any) => {\r\n setDomainIsInvalid(false);\r\n };\r\n\r\n return (\r\n <div className={classes.root}>\r\n <AppBar position=\"static\" color=\"default\">\r\n <Tabs\r\n value={value}\r\n onChange={handleChange}\r\n indicatorColor=\"primary\"\r\n textColor=\"primary\"\r\n variant=\"scrollable\"\r\n scrollButtons=\"auto\"\r\n >\r\n <Tab label=\"USERS / ROLES\" {...a11yProps(0)} />\r\n <Tab label=\"CHANGE HISTORY\" {...a11yProps(1)} />\r\n\r\n </Tabs>\r\n </AppBar>\r\n <TabPanel value={value} index={0}>\r\n <>\r\n <EnhancedTableToolbar onSearchTermChanged={handleSearchTermChanged} signatoryName={signatory?.name} activeUsersCount={signatory?.users.length}/>\r\n <TableContainer>\r\n <Table\r\n className={classes.table}\r\n aria-labelledby=\"tableTitle\"\r\n size='medium'\r\n aria-label=\"enhanced table\"\r\n >\r\n <EnhancedTableHead\r\n classes={classes}\r\n order={order}\r\n orderBy={orderBy}\r\n onRequestSort={handleRequestSort}\r\n rowCount={signatory?.users?.length ?? 0}\r\n />\r\n <TableBody>\r\n {signatory && signatory.users && stableSort(signatory?.users, getComparator(order, orderBy))\r\n .filter((x: IUserRoleDTO) => handleFilter(x))\r\n .slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage)\r\n .map((row: IUserRoleDTO, index: number) => {\r\n const isItemSelected = selected && selected.username == row.username;\r\n const labelId = `enhanced-table-checkbox-${index}`;\r\n\r\n return (\r\n <TableRow\r\n hover\r\n onClick={(event) => handleClick(event, row)}\r\n role=\"checkbox\"\r\n aria-checked={isItemSelected}\r\n tabIndex={-1}\r\n key={row.fullName}\r\n selected={isItemSelected}\r\n >\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n checked={isItemSelected}\r\n inputProps={{ 'aria-labelledby': labelId }}\r\n />\r\n </TableCell>\r\n <TableCell component=\"th\" id={labelId} scope=\"row\" padding=\"none\">\r\n {row.fullName}\r\n </TableCell>\r\n <TableCell align=\"right\">{row.username}</TableCell>\r\n <TableCell align=\"right\">\r\n\r\n\r\n\r\n {row.canUpdateRole ?\r\n (<RoleCheckBoxes row={row} adminCheck={true} signatory={signatory} handleRoleChanged={handleRoleChanged} />)\r\n :\r\n (<InputLabel>{row.role}</InputLabel>)}\r\n\r\n </TableCell>\r\n </TableRow>\r\n );\r\n })}\r\n {emptyRows > 0 && (\r\n <TableRow style={{ height: (dense ? 33 : 53) * emptyRows }}>\r\n <TableCell colSpan={6} />\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </>\r\n <TablePagination\r\n rowsPerPageOptions={[5, 10, 25]}\r\n component=\"div\"\r\n count={signatory?.users?.length ?? 0}\r\n rowsPerPage={rowsPerPage}\r\n page={page}\r\n onChangePage={handleChangePage}\r\n onChangeRowsPerPage={handleChangeRowsPerPage}\r\n />\r\n <div className={classes.buttonsContainer}>\r\n <Button variant=\"contained\" color=\"primary\" onClick={handleClickOpen}>\r\n Invite User\r\n </Button>\r\n <Button variant=\"contained\" color=\"primary\" onClick={handleRevokeClickOpen} disabled={!selected}>\r\n Revoke Access\r\n </Button>\r\n {/* \r\n ############################################\r\n Buttons to be reintroducted at a later stage\r\n ############################################ \r\n */}\r\n {/* <Button variant=\"contained\" color=\"primary\" disabled={true}>\r\n Delete User\r\n </Button>\r\n <Button variant=\"contained\" color=\"primary\" disabled={true}>\r\n Send Message\r\n </Button> */}\r\n </div>\r\n <div>\r\n\r\n <Dialog open={open} onClose={handleClose} aria-labelledby=\"form-dialog-title\">\r\n <DialogTitle id=\"form-dialog-title\">Invite User</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>\r\n To invite a user to join your organisation as an affiliate, enter their e-mail address below and choose the desired role from the drop down provided: -\r\n </DialogContentText>\r\n <TextField\r\n autoFocus\r\n margin=\"dense\"\r\n id=\"name\"\r\n label=\"Email Address\"\r\n type=\"email\"\r\n value={email}\r\n fullWidth\r\n onChange={(e) => setEmail(e.target.value)} />\r\n {!emailValid &&\r\n <InputLabel style={{ color: 'red' }}>Please enter a valid email</InputLabel>}\r\n\r\n <InputLabel style={{ marginTop: 10 }} id=\"demo-simple-select-label\">Role</InputLabel>\r\n <RoleCheckBoxes signatory={signatory} adminCheck={false} row={{ role: role }} handleRoleChanged={(selectedRole: any, selectedRow: any) => setRole(selectedRole)} />\r\n\r\n {!roleSelected &&\r\n <InputLabel style={{ color: 'red' }}>Please select a role</InputLabel>}\r\n {loading &&\r\n <CircularProgress />\r\n }\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={handleClose} color=\"primary\">\r\n Cancel\r\n </Button>\r\n <Button onClick={() => handleInviteUser(true)} color=\"primary\">\r\n Invite User\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n <Dialog open={domainIsInvalid} onClose={handleCancelInviteUser} aria-labelledby=\"form-dialog-title\">\r\n <DialogTitle id=\"form-dialog-title\">Warning</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>\r\n <strong>The email domain of this user is different from others at your organisation. \r\n This user will have access to data your organisation reports to PRI, including any confidential information. Are you sure you want to invite {email}?</strong>\r\n </DialogContentText>\r\n\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={handleCancelInviteUser} color=\"primary\">\r\n Cancel\r\n </Button>\r\n <Button onClick={() => handleInviteUser(false)} color=\"primary\">\r\n Invite User\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n <Dialog open={revokeOpen} onClose={handleRevokeClose} aria-labelledby=\"form-dialog-title\">\r\n <DialogTitle id=\"form-dialog-title\">Revoke Access</DialogTitle>\r\n <DialogContent>\r\n <DialogContentText>\r\n Are you sure you want to revoke access of user {selected?.email} to Signatory {state?.selectedSignatoryId}\r\n </DialogContentText>\r\n {loading &&\r\n <CircularProgress />\r\n }\r\n </DialogContent>\r\n <DialogActions>\r\n <Button onClick={handleRevokeClose} color=\"primary\">\r\n Cancel\r\n </Button>\r\n <Button onClick={handleRevokeUser} color=\"primary\">\r\n Revoke User\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n </div>\r\n </TabPanel>\r\n <TabPanel value={value} index={1}>\r\n <TableContainer component={Paper}>\r\n <Table className={classes.table} aria-label=\"simple table\">\r\n <TableHead>\r\n <TableRow>\r\n <TableCell>E-Mail Address (username)</TableCell>\r\n <TableCell align=\"left\">Full Name</TableCell>\r\n <TableCell align=\"left\">Description</TableCell>\r\n <TableCell align=\"left\">Change Date</TableCell>\r\n <TableCell align=\"left\">Changed By</TableCell>\r\n </TableRow>\r\n </TableHead>\r\n <TableBody>\r\n {signatory?.changeHistoryItems && signatory.changeHistoryItems.map((row: any) => (\r\n <TableRow key={row.username}>\r\n <TableCell component=\"th\" scope=\"row\">\r\n {row.username}\r\n </TableCell>\r\n <TableCell align=\"left\">{row.fullName}</TableCell>\r\n <TableCell align=\"left\">{row.description}</TableCell>\r\n <TableCell align=\"left\">{row.changeDate}</TableCell>\r\n <TableCell align=\"left\">{row.changedBy}</TableCell>\r\n </TableRow>\r\n ))}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n </TabPanel>\r\n </div>\r\n );\r\n}\r\n\r\nconst useToolbarStyles = makeStyles((theme) => ({\r\n root: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(1),\r\n },\r\n highlight:\r\n theme.palette.type === 'light'\r\n ? {\r\n color: theme.palette.secondary.main,\r\n backgroundColor: \"#333333\",\r\n }\r\n : {\r\n color: theme.palette.text.primary,\r\n backgroundColor: theme.palette.secondary.dark,\r\n },\r\n title: {\r\n flex: '1 1 200px',\r\n },\r\n info: {\r\n flex: '1 1 100%',\r\n },\r\n}));","import * as React from 'react'\r\n\r\ntype Action = {type: 'SEASDASDASASDASDFFILIAASDASDTE', payload: string}\r\ntype Dispatch = (action: Action) => void\r\ntype State = {currentAffiliate: string}\r\ntype CountProviderProps = {children: React.ReactNode}\r\n\r\nconst AppContext = React.createContext<State | undefined>(undefined)\r\nconst AppDispatchContext = React.createContext<Dispatch | undefined>(undefined,)\r\n\r\n// deprecated - to be removed\r\n\r\nfunction appReducer(state: State, action: Action) {\r\n switch (action.type) {\r\n case 'SEASDASDASASDASDFFILIAASDASDTE': {\r\n return {currentAffiliate: action.payload}\r\n }\r\n default: {\r\n throw new Error(`Unhandled action type: ${action.type}`)\r\n }\r\n }\r\n}\r\n\r\nfunction AppProvider({children}: CountProviderProps) {\r\n const [state, dispatch] = React.useReducer(appReducer, {currentAffiliate: \"1\" })\r\n return (\r\n <AppContext.Provider value={state}>\r\n <AppDispatchContext.Provider value={dispatch}>\r\n {children}\r\n </AppDispatchContext.Provider>\r\n </AppContext.Provider>\r\n )\r\n}\r\n\r\nfunction useAppState() {\r\n const context = React.useContext(AppContext)\r\n if (context === undefined) {\r\n throw new Error('useAppState must be used within a AppProvider')\r\n }\r\n return context\r\n}\r\n\r\nfunction useAppDispatch() {\r\n const context = React.useContext(AppDispatchContext)\r\n if (context === undefined) {\r\n throw new Error('useAppDispatch must be used within a AppProvider')\r\n }\r\n return context\r\n}\r\n\r\nexport {AppProvider, useAppState, useAppDispatch}\r\n","import React, { useEffect } from 'react';\r\nimport { makeStyles, useTheme, lighten } from '@material-ui/core/styles';\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TablePagination from '@material-ui/core/TablePagination';\r\nimport TableRow from '@material-ui/core/TableRow';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft';\r\nimport KeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight';\r\nimport FirstPageIcon from '@material-ui/icons/FirstPage';\r\nimport LastPageIcon from '@material-ui/icons/LastPage';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport Button from '@material-ui/core/Button';\r\nimport Box from '@material-ui/core/Box';\r\nimport Collapse from '@material-ui/core/Collapse';\r\nimport Form from 'react-bootstrap/Form';\r\nimport axios from 'axios';\r\nimport { toast } from \"react-toastify\"\r\nimport \"react-toastify/dist/ReactToastify.css\"\r\nimport \"./Signatories.css\"\r\nimport { ContactPhoneOutlined } from '@material-ui/icons';\r\nimport { useAppState } from \"../contexts/appContext\";\r\n\r\ntoast.configure()\r\n\r\nfunction TablePaginationActions(props: any) {\r\n const classes = useStyles1();\r\n const theme = useTheme();\r\n const { count, page, rowsPerPage, onChangePage } = props;\r\n\r\n const handleFirstPageButtonClick = (event: any) => {\r\n onChangePage(event, 0);\r\n };\r\n\r\n const handleBackButtonClick = (event: any) => {\r\n onChangePage(event, page - 1);\r\n };\r\n\r\n const handleNextButtonClick = (event: any) => {\r\n onChangePage(event, page + 1);\r\n };\r\n\r\n const handleLastPageButtonClick = (event: any) => {\r\n onChangePage(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1));\r\n };\r\n\r\n return (\r\n <div className={classes.root}>\r\n <IconButton\r\n onClick={handleFirstPageButtonClick}\r\n disabled={page === 0}\r\n aria-label=\"first page\"\r\n >\r\n {theme.direction === 'rtl' ? <LastPageIcon /> : <FirstPageIcon />}\r\n </IconButton>\r\n <IconButton onClick={handleBackButtonClick} disabled={page === 0} aria-label=\"previous page\">\r\n {theme.direction === 'rtl' ? <KeyboardArrowRight /> : <KeyboardArrowLeft />}\r\n </IconButton>\r\n <IconButton\r\n onClick={handleNextButtonClick}\r\n disabled={page >= Math.ceil(count / rowsPerPage) - 1}\r\n aria-label=\"next page\"\r\n >\r\n {theme.direction === 'rtl' ? <KeyboardArrowLeft /> : <KeyboardArrowRight />}\r\n </IconButton>\r\n <IconButton\r\n onClick={handleLastPageButtonClick}\r\n disabled={page >= Math.ceil(count / rowsPerPage) - 1}\r\n aria-label=\"last page\"\r\n >\r\n {theme.direction === 'rtl' ? <FirstPageIcon /> : <LastPageIcon />}\r\n </IconButton>\r\n </div>\r\n );\r\n}\r\n\r\ninterface IEnhancedToolBarProps {\r\n onSearchTermChanged: (searchTerm: string) => void\r\n}\r\n\r\nconst EnhancedTableToolbar = (props: IEnhancedToolBarProps) => {\r\n const classes = useToolbarStyles();\r\n const { onSearchTermChanged } = props;\r\n\r\n return (\r\n <Toolbar style={{ backgroundColor: '#07aeef', color: 'white' }}>\r\n <Typography className={classes.title} variant=\"h6\" id=\"tableTitle\" component=\"div\">\r\n Access Requests\r\n </Typography>\r\n <Tooltip title=\"Search\">\r\n <IconButton aria-label=\"filter list\">\r\n {/* <input type=\"text\" style={{ fontSize: 20 }} onChange={e => onSearchTermChanged(e.target.value)} placeholder=\" Type here to Search\"></input> */}\r\n </IconButton>\r\n </Tooltip>\r\n </Toolbar>\r\n );\r\n};\r\n\r\nenum AccessRequestType {\r\n Services,\r\n Data\r\n}\r\n\r\nenum AccessRequestStatus {\r\n Approved,\r\n Pending,\r\n Rejected,\r\n Muted\r\n}\r\n\r\ninterface IAccessRequest {\r\n id: number\r\n requestType: AccessRequestType\r\n requestedOn: Date\r\n requestingSignatory: string\r\n status: AccessRequestStatus\r\n yearsRequested: Array<number>\r\n rejectedReason: string\r\n serviceNamesRequested: Array<string>\r\n isSelected: boolean\r\n}\r\n\r\ninterface IAccessRequestsResponseDTO {\r\n accessRequests: Array<IAccessRequest>\r\n}\r\n\r\nexport function Row(props: any) {\r\n const { row, isSelected, onSelectionChanged } : { row: IAccessRequest, isSelected: boolean, onSelectionChanged: (value: boolean) => void } = props;\r\n\r\n function truncate(str: string, n: number){\r\n return (str.length > n) ? str.substr(0, n-1) + '...' : str;\r\n };\r\n\r\n const handleChange = (event: any) => {\r\n onSelectionChanged(event.target.checked)\r\n };\r\n\r\n return (\r\n <>\r\n <TableRow\r\n style={{ backgroundColor: 'white', color: 'white', }}\r\n hover\r\n role=\"checkbox\"\r\n tabIndex={-1}\r\n key={row.id}>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n style={{color: '#07aeef'}}\r\n checked={isSelected}\r\n onChange={e => handleChange(e)}\r\n />\r\n </TableCell>\r\n <TableCell component=\"th\" scope=\"row\" padding=\"none\">\r\n {row.requestingSignatory}\r\n </TableCell>\r\n <TableCell>{AccessRequestType[row.requestType]}</TableCell>\r\n <TableCell>{new Date(row.requestedOn).toLocaleDateString()}</TableCell>\r\n <TableCell>{row.requestType === AccessRequestType.Services ? row.serviceNamesRequested : row.yearsRequested}</TableCell>\r\n <TableCell>{AccessRequestStatus[row.status]} {row.status === AccessRequestStatus.Rejected ? \"(\" + row.rejectedReason + \")\" : \"\"}</TableCell>\r\n </TableRow>\r\n </>)\r\n}\r\n\r\n\r\n\r\nexport function AccessRequests() {\r\n\r\n const { currentAffiliate } = useAppState()\r\n\r\n useEffect(() => {\r\n if (currentAffiliate) {\r\n axios.get<IAccessRequestsResponseDTO>(\"/accessrequests?affiliateid=\" + currentAffiliate).then(x => {\r\n //setTotal(x.data.total)\r\n setRows(x.data.accessRequests)\r\n })\r\n }\r\n }, [currentAffiliate]);\r\n\r\n const classes = useStyles();\r\n const [rows, setRows] = React.useState<Array<IAccessRequest>>([]);\r\n const [page, setPage] = React.useState(0);\r\n const [rowsPerPage, setRowsPerPage] = React.useState(10);\r\n const [total, setTotal] = React.useState(0);\r\n const [searchTerm, setSearchTerm] = React.useState(\"\")\r\n const [selectedIndex, setSelectedIndex] = React.useState(\"*\")\r\n const [category, setCategory] = React.useState(\"\")\r\n const [selectedItems, setSelectedItems] = React.useState<Array<IAccessRequest>>(new Array<IAccessRequest>())\r\n\r\n useEffect(() => {\r\n axios.get<IAccessRequestsResponseDTO>(\"/accessrequests?affiliateid=1\").then(x => {\r\n //setTotal(x.data.total)\r\n setRows(x.data.accessRequests)\r\n })\r\n }, [])\r\n\r\n // const handleChangePage = (event: any, newPage: number) => {\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=${newPage}&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${category}`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(rows.concat(x.data.signatories))\r\n // setPage(newPage)\r\n // })\r\n // };\r\n\r\n // const handleChangeRowsPerPage = (event: any) => {\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=0&pageSize=${event.target.value}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${category}`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(rows.concat(x.data.signatories))\r\n // setRowsPerPage(event.target.value)\r\n // setPage(0)\r\n // })\r\n // };\r\n\r\n // const handleSearchTermChanged = (searchTerm: string) => {\r\n // if(searchTerm.length > 2) {\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=${page}&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${category}`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(x.data.signatories)\r\n // setPage(0)\r\n // setSearchTerm(searchTerm)\r\n // })\r\n // } else {\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=${page}&pageSize=${rowsPerPage}&searchTerm=&indexChar=`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(x.data.signatories)\r\n // setPage(0)\r\n // setSearchTerm(\"\")\r\n // })\r\n // }\r\n // };\r\n\r\n // const handleIndexChanged = (index: string) => {\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=0&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${index}&category=${category}`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(x.data.signatories)\r\n // setPage(0)\r\n // setSelectedIndex(index)\r\n // })\r\n // }\r\n\r\n // const handleCategoryFilterChanged = (categoryFilter: string) => {\r\n // if(categoryFilter === \"All Categories\") categoryFilter = \"\"\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=0&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${categoryFilter}`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(x.data.signatories)\r\n // setPage(0)\r\n // setCategory(categoryFilter)\r\n // })\r\n // }\r\n\r\n const handleRowSelectionChanged = (accessRequest: IAccessRequest, value: boolean) => {\r\n accessRequest.isSelected = value\r\n if(value === true)\r\n setSelectedItems(selectedItems.concat(accessRequest))\r\n else\r\n setSelectedItems(selectedItems.filter(x => x.id !== accessRequest.id))\r\n }\r\n\r\n // const qualtrics = () => {\r\n // toast.success('Access Request for Qualtrics has been sent to the Main Account Holders of ' + row.name, {\r\n // position: \"bottom-right\",\r\n // autoClose: 4000,\r\n \r\n // hideProgressBar: true,\r\n // closeOnClick: true,\r\n // pauseOnHover: true,\r\n // draggable: true,\r\n // progress: undefined,\r\n // })\r\n // }\r\n \r\n // const salesforce = () => {\r\n // toast.success('Access Request for SALES FORCE has been sent to the Main Account Holders of ' + row.name, {\r\n // position: \"bottom-right\",\r\n // autoClose: 4000,\r\n \r\n // hideProgressBar: true,\r\n // closeOnClick: true,\r\n // pauseOnHover: true,\r\n // draggable: true,\r\n // progress: undefined,\r\n // })\r\n // }\r\n\r\n const emptyRows = rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage)\r\n\r\n return (\r\n <div className={classes.root}>\r\n <Paper className={classes.paper}>\r\n \r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginTop: 200,\r\n marginBottom: 400}}>\r\n <Typography variant=\"h1\"> Coming Soon...</Typography>\r\n </div> \r\n \r\n {/*<EnhancedTableToolbar onSearchTermChanged={() => alert('search term changed')} />\r\n <TableContainer>\r\n <Table\r\n className={classes.table}\r\n aria-labelledby=\"tableTitle\"\r\n size=\"small\"\r\n aria-label=\"enhanced table\">\r\n <caption>{selectedItems.length > 0 ? `You have selected ${selectedItems.length} requests - click below to Approve/Reject/Mute the Request`: ''}</caption>\r\n requestingSignatory\r\n AccessRequestType\r\n Date\r\n Services/Data PermissionRequestedEvent\r\n sTatus\r\n <TableHead>\r\n <TableCell></TableCell>\r\n <TableCell>Requesting Signatory</TableCell>\r\n <TableCell>Request Type</TableCell>\r\n <TableCell>Requested On</TableCell>\r\n <TableCell>Services/Data Requested</TableCell>\r\n <TableCell>\r\n <Form.Control as=\"select\"> onChange={(e) => handleCategoryFilterChanged(e.target.value)\r\n <option selected>All Statuses</option>\r\n <option>Pending</option>\r\n <option>Approved</option>\r\n <option>Rejected</option>\r\n <option>Muted</option>\r\n </Form.Control>\r\n </TableCell>\r\n </TableHead>\r\n <TableBody>\r\n {selectedItems.map((row: IAccessRequest) => {\r\n return (<Row key={row.id} row={row} onSelectionChanged={(value: boolean) => handleRowSelectionChanged(row, value)} isSelected={true} />)\r\n })}\r\n {rows.filter(x => !selectedItems.map(x => x.id).includes(x.id)).slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage).map((row: IAccessRequest) => {\r\n return (<Row key={row.id} row={row} onSelectionChanged={(value: boolean) => handleRowSelectionChanged(row, value)} />)\r\n })}\r\n {emptyRows > 0 && (\r\n <TableRow style={{ height: 33 * emptyRows }}>\r\n <TableCell colSpan={6} />\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n <TablePagination\r\n rowsPerPageOptions={[5, 10, 25]}\r\n component=\"div\"\r\n count={total}\r\n rowsPerPage={rowsPerPage}\r\n page={page}\r\n onChangePage={handleChangePage}\r\n onChangeRowsPerPage={handleChangeRowsPerPage}\r\n /> */}\r\n </Paper>\r\n {/* Convert this into a custom control */}\r\n {/* <ul className=\"index\">\r\n <li className={selectedIndex === \"*\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"*\")} href=\"javascript:void(0)\">*</a></li>\r\n <li className={selectedIndex === \"A\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"A\")} href=\"javascript:void(0)\">A</a></li>\r\n <li className={selectedIndex === \"B\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"B\")} href=\"javascript:void(0)\">B</a></li>\r\n <li className={selectedIndex === \"C\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"C\")} href=\"javascript:void(0)\">C</a></li>\r\n <li className={selectedIndex === \"D\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"D\")} href=\"javascript:void(0)\">D</a></li>\r\n <li className={selectedIndex === \"E\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"E\")} href=\"javascript:void(0)\">E</a></li>\r\n <li className={selectedIndex === \"F\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"F\")} href=\"javascript:void(0)\">F</a></li>\r\n <li className={selectedIndex === \"G\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"G\")} href=\"javascript:void(0)\">G</a></li>\r\n <li className={selectedIndex === \"H\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"H\")} href=\"javascript:void(0)\">H</a></li>\r\n <li className={selectedIndex === \"I\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"I\")} href=\"javascript:void(0)\">I</a></li>\r\n <li className={selectedIndex === \"J\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"J\")} href=\"javascript:void(0)\">J</a></li>\r\n <li className={selectedIndex === \"K\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"K\")} href=\"javascript:void(0)\">K</a></li>\r\n <li className={selectedIndex === \"L\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"L\")} href=\"javascript:void(0)\">L</a></li>\r\n <li className={selectedIndex === \"M\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"M\")} href=\"javascript:void(0)\">M</a></li>\r\n <li className={selectedIndex === \"N\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"N\")} href=\"javascript:void(0)\">N</a></li>\r\n <li className={selectedIndex === \"O\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"O\")} href=\"javascript:void(0)\">O</a></li>\r\n <li className={selectedIndex === \"P\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"P\")} href=\"javascript:void(0)\">P</a></li>\r\n <li className={selectedIndex === \"Q\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"Q\")} href=\"javascript:void(0)\">Q</a></li>\r\n <li className={selectedIndex === \"R\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"R\")} href=\"javascript:void(0)\">R</a></li>\r\n <li className={selectedIndex === \"S\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"S\")} href=\"javascript:void(0)\">S</a></li>\r\n <li className={selectedIndex === \"T\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"T\")} href=\"javascript:void(0)\">T</a></li>\r\n <li className={selectedIndex === \"U\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"U\")} href=\"javascript:void(0)\">U</a></li>\r\n <li className={selectedIndex === \"V\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"V\")} href=\"javascript:void(0)\">V</a></li>\r\n <li className={selectedIndex === \"W\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"W\")} href=\"javascript:void(0)\">W</a></li>\r\n <li className={selectedIndex === \"X\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"X\")} href=\"javascript:void(0)\">X</a></li>\r\n <li className={selectedIndex === \"Y\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"Y\")} href=\"javascript:void(0)\">Y</a></li>\r\n <li className={selectedIndex === \"Z\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"Z\")} href=\"javascript:void(0)\">Z</a></li>\r\n </ul> */}\r\n <div className=\"buttonGroup\">\r\n <Button className=\"button\" variant=\"contained\" color=\"primary\" disabled={selectedItems.length === 0} onClick={() => alert('ISSUING APPROVAL TO FOLLOWING REQUESTING SIGNATORIES ' + selectedItems.map(x => x.requestingSignatory).join(\", \"))}>\r\n APPROVE\r\n </Button>\r\n <Button className=\"button\" variant=\"contained\" color=\"primary\" disabled={selectedItems.length === 0} onClick={() => alert('REJECTING REQUESTS FOR FOLLOWING REQUESTING SIGNATORIES ' + selectedItems.map(x => x.requestingSignatory).join(\", \"))}>\r\n REJECT (with reason)\r\n </Button>\r\n <Button className=\"button\" variant=\"contained\" color=\"primary\" disabled={selectedItems.length === 0} onClick={() => alert('MUTING REQUESTS FROM FOLLOWING SIGNATORIES ' + selectedItems.map(x => x.requestingSignatory).join(\", \"))}>\r\n MUTE\r\n </Button>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nconst useToolbarStyles = makeStyles((theme) => ({\r\n root: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(1),\r\n },\r\n highlight:\r\n theme.palette.type === 'light'\r\n ? {\r\n color: theme.palette.secondary.main,\r\n backgroundColor: lighten(theme.palette.secondary.light, 0.85),\r\n }\r\n : {\r\n color: theme.palette.text.primary,\r\n backgroundColor: theme.palette.secondary.dark,\r\n },\r\n title: {\r\n flex: '1 1 100%',\r\n },\r\n}));\r\n\r\nconst useStyles1 = makeStyles((theme) => ({\r\n root: {\r\n flexShrink: 0,\r\n marginLeft: theme.spacing(2.5),\r\n },\r\n}));\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n paper: {\r\n width: '100%',\r\n marginBottom: theme.spacing(2),\r\n },\r\n table: {\r\n minWidth: 750,\r\n },\r\n visuallyHidden: {\r\n border: 0,\r\n clip: 'rect(0 0 0 0)',\r\n height: 1,\r\n margin: -1,\r\n overflow: 'hidden',\r\n padding: 0,\r\n position: 'absolute',\r\n top: 20,\r\n width: 1,\r\n },\r\n}));","import React, { useEffect } from 'react';\r\nimport { makeStyles, useTheme, lighten } from '@material-ui/core/styles';\r\nimport Table from '@material-ui/core/Table';\r\nimport TableBody from '@material-ui/core/TableBody';\r\nimport TableCell from '@material-ui/core/TableCell';\r\nimport TableContainer from '@material-ui/core/TableContainer';\r\nimport TableHead from '@material-ui/core/TableHead';\r\nimport TablePagination from '@material-ui/core/TablePagination';\r\nimport TableRow from '@material-ui/core/TableRow';\r\nimport Paper from '@material-ui/core/Paper';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport IconButton from '@material-ui/core/IconButton';\r\nimport Tooltip from '@material-ui/core/Tooltip';\r\nimport KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft';\r\nimport KeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight';\r\nimport FirstPageIcon from '@material-ui/icons/FirstPage';\r\nimport LastPageIcon from '@material-ui/icons/LastPage';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport Button from '@material-ui/core/Button';\r\nimport Box from '@material-ui/core/Box';\r\nimport Collapse from '@material-ui/core/Collapse';\r\nimport Form from 'react-bootstrap/Form';\r\nimport axios from 'axios';\r\nimport { toast } from \"react-toastify\"\r\nimport \"react-toastify/dist/ReactToastify.css\"\r\nimport \"./Signatories.css\"\r\nimport { ContactPhoneOutlined } from '@material-ui/icons';\r\nimport { useAppState } from \"../contexts/appContext\";\r\n\r\ntoast.configure()\r\n\r\nfunction TablePaginationActions(props: any) {\r\n const classes = useStyles1();\r\n const theme = useTheme();\r\n const { count, page, rowsPerPage, onChangePage } = props;\r\n\r\n const handleFirstPageButtonClick = (event: any) => {\r\n onChangePage(event, 0);\r\n };\r\n\r\n const handleBackButtonClick = (event: any) => {\r\n onChangePage(event, page - 1);\r\n };\r\n\r\n const handleNextButtonClick = (event: any) => {\r\n onChangePage(event, page + 1);\r\n };\r\n\r\n const handleLastPageButtonClick = (event: any) => {\r\n onChangePage(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1));\r\n };\r\n\r\n return (\r\n <div className={classes.root}>\r\n <IconButton\r\n onClick={handleFirstPageButtonClick}\r\n disabled={page === 0}\r\n aria-label=\"first page\"\r\n >\r\n {theme.direction === 'rtl' ? <LastPageIcon /> : <FirstPageIcon />}\r\n </IconButton>\r\n <IconButton onClick={handleBackButtonClick} disabled={page === 0} aria-label=\"previous page\">\r\n {theme.direction === 'rtl' ? <KeyboardArrowRight /> : <KeyboardArrowLeft />}\r\n </IconButton>\r\n <IconButton\r\n onClick={handleNextButtonClick}\r\n disabled={page >= Math.ceil(count / rowsPerPage) - 1}\r\n aria-label=\"next page\"\r\n >\r\n {theme.direction === 'rtl' ? <KeyboardArrowLeft /> : <KeyboardArrowRight />}\r\n </IconButton>\r\n <IconButton\r\n onClick={handleLastPageButtonClick}\r\n disabled={page >= Math.ceil(count / rowsPerPage) - 1}\r\n aria-label=\"last page\"\r\n >\r\n {theme.direction === 'rtl' ? <FirstPageIcon /> : <LastPageIcon />}\r\n </IconButton>\r\n </div>\r\n );\r\n}\r\n\r\ninterface IEnhancedToolBarProps {\r\n onSearchTermChanged: (searchTerm: string) => void\r\n}\r\n\r\nconst EnhancedTableToolbar = (props: IEnhancedToolBarProps) => {\r\n const classes = useToolbarStyles();\r\n const { onSearchTermChanged } = props;\r\n\r\n return (\r\n <Toolbar style={{ backgroundColor: '#07aeef', color: 'white' }}>\r\n <Typography className={classes.title} variant=\"h6\" id=\"tableTitle\" component=\"div\">\r\n Access Requests\r\n </Typography>\r\n <Tooltip title=\"Search\">\r\n <IconButton aria-label=\"filter list\">\r\n {/* <input type=\"text\" style={{ fontSize: 20 }} onChange={e => onSearchTermChanged(e.target.value)} placeholder=\" Type here to Search\"></input> */}\r\n </IconButton>\r\n </Tooltip>\r\n </Toolbar>\r\n );\r\n};\r\n\r\nenum AccessRequestType {\r\n Services,\r\n Data\r\n}\r\n\r\nenum AccessRequestStatus {\r\n Approved,\r\n Pending,\r\n Rejected,\r\n Muted\r\n}\r\n\r\ninterface IAccessRequest {\r\n id: number\r\n requestType: AccessRequestType\r\n requestedOn: Date\r\n requestingSignatory: string\r\n status: AccessRequestStatus\r\n yearsRequested: Array<number>\r\n rejectedReason: string\r\n serviceNamesRequested: Array<string>\r\n isSelected: boolean\r\n}\r\n\r\ninterface IAccessRequestsResponseDTO {\r\n accessRequests: Array<IAccessRequest>\r\n}\r\n\r\nexport function Row(props: any) {\r\n const { row, isSelected, onSelectionChanged } : { row: IAccessRequest, isSelected: boolean, onSelectionChanged: (value: boolean) => void } = props;\r\n\r\n function truncate(str: string, n: number){\r\n return (str.length > n) ? str.substr(0, n-1) + '...' : str;\r\n };\r\n\r\n const handleChange = (event: any) => {\r\n onSelectionChanged(event.target.checked)\r\n };\r\n\r\n return (\r\n <>\r\n <TableRow\r\n style={{ backgroundColor: 'white', color: 'white', }}\r\n hover\r\n role=\"checkbox\"\r\n tabIndex={-1}\r\n key={row.id}>\r\n <TableCell padding=\"checkbox\">\r\n <Checkbox\r\n style={{color: '#07aeef'}}\r\n checked={isSelected}\r\n onChange={e => handleChange(e)}\r\n />\r\n </TableCell>\r\n <TableCell component=\"th\" scope=\"row\" padding=\"none\">\r\n {row.requestingSignatory}\r\n </TableCell>\r\n <TableCell>{AccessRequestType[row.requestType]}</TableCell>\r\n <TableCell>{new Date(row.requestedOn).toLocaleDateString()}</TableCell>\r\n <TableCell>{row.requestType === AccessRequestType.Services ? row.serviceNamesRequested : row.yearsRequested}</TableCell>\r\n <TableCell>{AccessRequestStatus[row.status]} {row.status === AccessRequestStatus.Rejected ? \"(\" + row.rejectedReason + \")\" : \"\"}</TableCell>\r\n </TableRow>\r\n </>)\r\n}\r\n\r\n\r\n\r\nexport function DataSync() {\r\n\r\n const { currentAffiliate } = useAppState()\r\n\r\n useEffect(() => {\r\n if (currentAffiliate) {\r\n axios.get<IAccessRequestsResponseDTO>(\"/accessrequests?affiliateid=\" + currentAffiliate).then(x => {\r\n //setTotal(x.data.total)\r\n setRows(x.data.accessRequests)\r\n })\r\n }\r\n }, [currentAffiliate]);\r\n\r\n const classes = useStyles();\r\n const [rows, setRows] = React.useState<Array<IAccessRequest>>([]);\r\n const [page, setPage] = React.useState(0);\r\n const [rowsPerPage, setRowsPerPage] = React.useState(10);\r\n const [total, setTotal] = React.useState(0);\r\n const [searchTerm, setSearchTerm] = React.useState(\"\")\r\n const [selectedIndex, setSelectedIndex] = React.useState(\"*\")\r\n const [category, setCategory] = React.useState(\"\")\r\n const [selectedItems, setSelectedItems] = React.useState<Array<IAccessRequest>>(new Array<IAccessRequest>())\r\n\r\n useEffect(() => {\r\n axios.get<IAccessRequestsResponseDTO>(\"/accessrequests?affiliateid=1\").then(x => {\r\n //setTotal(x.data.total)\r\n setRows(x.data.accessRequests)\r\n })\r\n }, [])\r\n\r\n // const handleChangePage = (event: any, newPage: number) => {\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=${newPage}&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${category}`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(rows.concat(x.data.signatories))\r\n // setPage(newPage)\r\n // })\r\n // };\r\n\r\n // const handleChangeRowsPerPage = (event: any) => {\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=0&pageSize=${event.target.value}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${category}`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(rows.concat(x.data.signatories))\r\n // setRowsPerPage(event.target.value)\r\n // setPage(0)\r\n // })\r\n // };\r\n\r\n // const handleSearchTermChanged = (searchTerm: string) => {\r\n // if(searchTerm.length > 2) {\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=${page}&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${category}`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(x.data.signatories)\r\n // setPage(0)\r\n // setSearchTerm(searchTerm)\r\n // })\r\n // } else {\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=${page}&pageSize=${rowsPerPage}&searchTerm=&indexChar=`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(x.data.signatories)\r\n // setPage(0)\r\n // setSearchTerm(\"\")\r\n // })\r\n // }\r\n // };\r\n\r\n // const handleIndexChanged = (index: string) => {\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=0&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${index}&category=${category}`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(x.data.signatories)\r\n // setPage(0)\r\n // setSelectedIndex(index)\r\n // })\r\n // }\r\n\r\n // const handleCategoryFilterChanged = (categoryFilter: string) => {\r\n // if(categoryFilter === \"All Categories\") categoryFilter = \"\"\r\n // axios.get<ISignatoriesResponseDTO>(`/signatories?pageNumber=0&pageSize=${rowsPerPage}&searchTerm=${searchTerm}&indexChar=${selectedIndex}&category=${categoryFilter}`).then(x => {\r\n // setTotal(x.data.total)\r\n // setRows(x.data.signatories)\r\n // setPage(0)\r\n // setCategory(categoryFilter)\r\n // })\r\n // }\r\n\r\n const handleRowSelectionChanged = (accessRequest: IAccessRequest, value: boolean) => {\r\n accessRequest.isSelected = value\r\n if(value === true)\r\n setSelectedItems(selectedItems.concat(accessRequest))\r\n else\r\n setSelectedItems(selectedItems.filter(x => x.id !== accessRequest.id))\r\n }\r\n\r\n // const qualtrics = () => {\r\n // toast.success('Access Request for Qualtrics has been sent to the Main Account Holders of ' + row.name, {\r\n // position: \"bottom-right\",\r\n // autoClose: 4000,\r\n \r\n // hideProgressBar: true,\r\n // closeOnClick: true,\r\n // pauseOnHover: true,\r\n // draggable: true,\r\n // progress: undefined,\r\n // })\r\n // }\r\n \r\n // const salesforce = () => {\r\n // toast.success('Access Request for SALES FORCE has been sent to the Main Account Holders of ' + row.name, {\r\n // position: \"bottom-right\",\r\n // autoClose: 4000,\r\n \r\n // hideProgressBar: true,\r\n // closeOnClick: true,\r\n // pauseOnHover: true,\r\n // draggable: true,\r\n // progress: undefined,\r\n // })\r\n // }\r\n\r\n const emptyRows = rowsPerPage - Math.min(rowsPerPage, rows.length - page * rowsPerPage)\r\n\r\n return (\r\n <div className={classes.root}>\r\n <Paper className={classes.paper}>\r\n \r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n marginTop: 200,\r\n marginBottom: 400}}>\r\n <Typography variant=\"h1\"> Coming Soon...</Typography>\r\n </div> \r\n \r\n {/*<EnhancedTableToolbar onSearchTermChanged={() => alert('search term changed')} />\r\n <TableContainer>\r\n <Table\r\n className={classes.table}\r\n aria-labelledby=\"tableTitle\"\r\n size=\"small\"\r\n aria-label=\"enhanced table\">\r\n <caption>{selectedItems.length > 0 ? `You have selected ${selectedItems.length} requests - click below to Approve/Reject/Mute the Request`: ''}</caption>\r\n requestingSignatory\r\n AccessRequestType\r\n Date\r\n Services/Data PermissionRequestedEvent\r\n sTatus\r\n <TableHead>\r\n <TableCell></TableCell>\r\n <TableCell>Requesting Signatory</TableCell>\r\n <TableCell>Request Type</TableCell>\r\n <TableCell>Requested On</TableCell>\r\n <TableCell>Services/Data Requested</TableCell>\r\n <TableCell>\r\n <Form.Control as=\"select\"> onChange={(e) => handleCategoryFilterChanged(e.target.value)\r\n <option selected>All Statuses</option>\r\n <option>Pending</option>\r\n <option>Approved</option>\r\n <option>Rejected</option>\r\n <option>Muted</option>\r\n </Form.Control>\r\n </TableCell>\r\n </TableHead>\r\n <TableBody>\r\n {selectedItems.map((row: IAccessRequest) => {\r\n return (<Row key={row.id} row={row} onSelectionChanged={(value: boolean) => handleRowSelectionChanged(row, value)} isSelected={true} />)\r\n })}\r\n {rows.filter(x => !selectedItems.map(x => x.id).includes(x.id)).slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage).map((row: IAccessRequest) => {\r\n return (<Row key={row.id} row={row} onSelectionChanged={(value: boolean) => handleRowSelectionChanged(row, value)} />)\r\n })}\r\n {emptyRows > 0 && (\r\n <TableRow style={{ height: 33 * emptyRows }}>\r\n <TableCell colSpan={6} />\r\n </TableRow>\r\n )}\r\n </TableBody>\r\n </Table>\r\n </TableContainer>\r\n <TablePagination\r\n rowsPerPageOptions={[5, 10, 25]}\r\n component=\"div\"\r\n count={total}\r\n rowsPerPage={rowsPerPage}\r\n page={page}\r\n onChangePage={handleChangePage}\r\n onChangeRowsPerPage={handleChangeRowsPerPage}\r\n /> */}\r\n </Paper>\r\n {/* Convert this into a custom control */}\r\n {/* <ul className=\"index\">\r\n <li className={selectedIndex === \"*\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"*\")} href=\"javascript:void(0)\">*</a></li>\r\n <li className={selectedIndex === \"A\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"A\")} href=\"javascript:void(0)\">A</a></li>\r\n <li className={selectedIndex === \"B\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"B\")} href=\"javascript:void(0)\">B</a></li>\r\n <li className={selectedIndex === \"C\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"C\")} href=\"javascript:void(0)\">C</a></li>\r\n <li className={selectedIndex === \"D\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"D\")} href=\"javascript:void(0)\">D</a></li>\r\n <li className={selectedIndex === \"E\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"E\")} href=\"javascript:void(0)\">E</a></li>\r\n <li className={selectedIndex === \"F\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"F\")} href=\"javascript:void(0)\">F</a></li>\r\n <li className={selectedIndex === \"G\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"G\")} href=\"javascript:void(0)\">G</a></li>\r\n <li className={selectedIndex === \"H\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"H\")} href=\"javascript:void(0)\">H</a></li>\r\n <li className={selectedIndex === \"I\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"I\")} href=\"javascript:void(0)\">I</a></li>\r\n <li className={selectedIndex === \"J\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"J\")} href=\"javascript:void(0)\">J</a></li>\r\n <li className={selectedIndex === \"K\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"K\")} href=\"javascript:void(0)\">K</a></li>\r\n <li className={selectedIndex === \"L\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"L\")} href=\"javascript:void(0)\">L</a></li>\r\n <li className={selectedIndex === \"M\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"M\")} href=\"javascript:void(0)\">M</a></li>\r\n <li className={selectedIndex === \"N\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"N\")} href=\"javascript:void(0)\">N</a></li>\r\n <li className={selectedIndex === \"O\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"O\")} href=\"javascript:void(0)\">O</a></li>\r\n <li className={selectedIndex === \"P\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"P\")} href=\"javascript:void(0)\">P</a></li>\r\n <li className={selectedIndex === \"Q\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"Q\")} href=\"javascript:void(0)\">Q</a></li>\r\n <li className={selectedIndex === \"R\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"R\")} href=\"javascript:void(0)\">R</a></li>\r\n <li className={selectedIndex === \"S\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"S\")} href=\"javascript:void(0)\">S</a></li>\r\n <li className={selectedIndex === \"T\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"T\")} href=\"javascript:void(0)\">T</a></li>\r\n <li className={selectedIndex === \"U\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"U\")} href=\"javascript:void(0)\">U</a></li>\r\n <li className={selectedIndex === \"V\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"V\")} href=\"javascript:void(0)\">V</a></li>\r\n <li className={selectedIndex === \"W\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"W\")} href=\"javascript:void(0)\">W</a></li>\r\n <li className={selectedIndex === \"X\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"X\")} href=\"javascript:void(0)\">X</a></li>\r\n <li className={selectedIndex === \"Y\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"Y\")} href=\"javascript:void(0)\">Y</a></li>\r\n <li className={selectedIndex === \"Z\" ? \"indexChar indexSelected\" : \"indexChar\"}><a onClick={() => handleIndexChanged(\"Z\")} href=\"javascript:void(0)\">Z</a></li>\r\n </ul> */}\r\n <div className=\"buttonGroup\">\r\n <Button className=\"button\" variant=\"contained\" color=\"primary\" disabled={selectedItems.length === 0} onClick={() => alert('ISSUING APPROVAL TO FOLLOWING REQUESTING SIGNATORIES ' + selectedItems.map(x => x.requestingSignatory).join(\", \"))}>\r\n APPROVE\r\n </Button>\r\n <Button className=\"button\" variant=\"contained\" color=\"primary\" disabled={selectedItems.length === 0} onClick={() => alert('REJECTING REQUESTS FOR FOLLOWING REQUESTING SIGNATORIES ' + selectedItems.map(x => x.requestingSignatory).join(\", \"))}>\r\n REJECT (with reason)\r\n </Button>\r\n <Button className=\"button\" variant=\"contained\" color=\"primary\" disabled={selectedItems.length === 0} onClick={() => alert('MUTING REQUESTS FROM FOLLOWING SIGNATORIES ' + selectedItems.map(x => x.requestingSignatory).join(\", \"))}>\r\n MUTE\r\n </Button>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nconst useToolbarStyles = makeStyles((theme) => ({\r\n root: {\r\n paddingLeft: theme.spacing(2),\r\n paddingRight: theme.spacing(1),\r\n },\r\n highlight:\r\n theme.palette.type === 'light'\r\n ? {\r\n color: theme.palette.secondary.main,\r\n backgroundColor: lighten(theme.palette.secondary.light, 0.85),\r\n }\r\n : {\r\n color: theme.palette.text.primary,\r\n backgroundColor: theme.palette.secondary.dark,\r\n },\r\n title: {\r\n flex: '1 1 100%',\r\n },\r\n}));\r\n\r\nconst useStyles1 = makeStyles((theme) => ({\r\n root: {\r\n flexShrink: 0,\r\n marginLeft: theme.spacing(2.5),\r\n },\r\n}));\r\n\r\nconst useStyles = makeStyles((theme) => ({\r\n root: {\r\n width: '100%',\r\n },\r\n paper: {\r\n width: '100%',\r\n marginBottom: theme.spacing(2),\r\n },\r\n table: {\r\n minWidth: 750,\r\n },\r\n visuallyHidden: {\r\n border: 0,\r\n clip: 'rect(0 0 0 0)',\r\n height: 1,\r\n margin: -1,\r\n overflow: 'hidden',\r\n padding: 0,\r\n position: 'absolute',\r\n top: 20,\r\n width: 1,\r\n },\r\n}));","import React from 'react';\r\nimport { useClearCache } from 'react-clear-cache';\r\nimport { Route } from 'react-router';\r\nimport { Layout } from './components/Layout';\r\nimport { Home } from './components/Home';\r\nimport { Counter } from './components/Counter';\r\nimport { Survey } from './components/Survey';\r\nimport { PrivateRoute } from './components';\r\nimport { LoginPage } from './components/LoginPage';\r\nimport { PlotlyDash } from './components/PlotlyDash';\r\nimport { PRIAdmin } from './components/PRIAdmin';\r\nimport './custom.css'\r\nimport { Signatories } from './components/Signatories';\r\nimport { TransitionPage } from './components/TransitionPage';\r\nimport { TermsAndConditions } from './components/TermsAndConditions';\r\nimport { Signatory } from './components/Signatory';\r\nimport { AccessRequests } from './components/AccessRequests';\r\nimport { DataSync } from './components/DataSync';\r\nimport { AppProvider } from './contexts/appContext'\r\nimport { SnackbarProvider } from 'notistack';\r\nimport axios from \"axios\";\r\nimport { toast } from \"react-toastify\"\r\nimport \"react-toastify/dist/ReactToastify.css\"\r\nimport Cookies from \"js-cookie\";\r\n\r\nexport const AuthContext = React.createContext();\r\n\r\naxios.interceptors.request.use(function (config) {\r\n const token = localStorage.getItem(\"token\");\r\n if(token)\r\n config.headers = { 'Authorization': 'Basic ' + token }\r\n return config;\r\n});\r\n\r\naxios.interceptors.response.use(null, function (error) {\r\n if (error.response.status === 401) {\r\n toast.error('You are not authorized to access this resource.', {\r\n position: \"bottom-right\",\r\n autoClose: 3333,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n progress: undefined,\r\n })\r\n setTimeout(() => {\r\n window.location.href = \"/\";\r\n }, 4000)\r\n }\r\n else if(error.response.status === 403){\r\n toast.error('You are not authorized to perform this action.', {\r\n position: \"bottom-right\",\r\n autoClose: 3333,\r\n hideProgressBar: true,\r\n closeOnClick: true,\r\n pauseOnHover: true,\r\n draggable: true,\r\n progress: undefined,\r\n })\r\n }\r\n return Promise.reject(error)\r\n})\r\n\r\nconst initialState = {\r\n isAuthenticated: false,\r\n user: localStorage.getItem(\"user\") ? JSON.parse(localStorage.getItem(\"user\")) : null,\r\n token: null,\r\n signatoryId: localStorage.getItem(\"signatoryId\"),\r\n guid : localStorage.getItem(\"guid\"),\r\n errorMessage: null\r\n};\r\n\r\n\r\n\r\nconst reducer = (state, action) => {\r\n switch (action.type) {\r\n case \"LOGIN\":\r\n if (action.payload) {\r\n localStorage.clear();\r\n localStorage.setItem(\"user\", JSON.stringify(action.payload));\r\n localStorage.setItem(\"token\", JSON.stringify(action.payload.authdata));\r\n return {\r\n ...state,\r\n isAuthenticated: true,\r\n user: action.payload,\r\n token: action.payload.authdata,\r\n errorMessage: null\r\n };\r\n } else {\r\n console.error(\"Invalid payload\");\r\n break;\r\n };\r\n case \"LOGOUT\":\r\n localStorage.clear();\r\n Cookies.set(\"ADFEAuthCookie\", \"\", {expires: -1, path: ''});\r\n return {\r\n ...state,\r\n guid: null,\r\n signatoryId: null,\r\n isAuthenticated: false,\r\n user: null\r\n };\r\n case \"SET_SIGNATORY_ID\":\r\n localStorage.setItem(\"signatoryId\", action.payload)\r\n return {\r\n ...state,\r\n signatoryId: action.payload\r\n };\r\n case \"SET_SIGNATORY_GUID\":\r\n localStorage.setItem(\"guid\", action.payload)\r\n return {\r\n ...state,\r\n guid: action.payload\r\n };\r\n case \"SET_USER_ACCEPTED_TNCS\":\r\n localStorage.setItem(\"user\", JSON.stringify(action.payload))\r\n return {\r\n ...state,\r\n user: action.payload\r\n };\r\n case \"SET_ERROR_MESSAGE\":\r\n console.error(action.payload)\r\n return {\r\n ...state,\r\n errorMessage: action.payload\r\n };\r\n default:\r\n return state;\r\n }\r\n};\r\n\r\nexport default function App() {\r\n const [state, dispatch] = React.useReducer(reducer, initialState);\r\n const { isLatestVersion, emptyCacheStorage } = useClearCache();\r\n return (\r\n <AppProvider>\r\n {!isLatestVersion && (\r\n <p>\r\n <a\r\n href=\"#\"\r\n onClick={e => {\r\n e.preventDefault();\r\n emptyCacheStorage();\r\n }}\r\n >\r\n Update version\r\n </a>\r\n </p>\r\n )}\r\n <AuthContext.Provider value={{ state, dispatch }}>\r\n <SnackbarProvider maxSnack={3}>\r\n <Layout>\r\n <Route exact path='/' component={Home} />\r\n <Route path='/counter' component={Counter} />\r\n <PrivateRoute path=\"/survey\" component={Survey} />\r\n <PrivateRoute exact path='/signatories' component={Signatories} />\r\n <PrivateRoute path='/accessrequests' component={AccessRequests} />\r\n <PrivateRoute path='/datasync' component={DataSync} />\r\n <Route path=\"/login\" component={LoginPage} />\r\n <Route path=\"/transition\" component={TransitionPage} />\r\n <Route path=\"/dataportalv2\">\r\n <PlotlyDash />\r\n </Route>\r\n <PrivateRoute path=\"/signatory\" component={Signatory} />\r\n <PrivateRoute path=\"/priadmins\" component={PRIAdmin} />\r\n <Route path=\"/termsandconditions\" component={TermsAndConditions} />\r\n </Layout>\r\n </SnackbarProvider>\r\n </AuthContext.Provider>\r\n </AppProvider>\r\n )\r\n}\r\n"],"sourceRoot":""}