{"version":3,"sources":["api.tsx","components/search.tsx","components/header.tsx","components/footer.tsx","Models/userInfo.tsx","Utilities/Skeletons.tsx","components/userdetailsbar.tsx","Utilities/TableUtilities.tsx","components/userinfo.tsx","components/user.tsx","components/home.tsx","components/usergroupsinfo.tsx","components/useronpremgroupstatusbar.tsx","components/usersgroups.tsx","components/confirmdialog.tsx","components/progressdialog.tsx","components/group.tsx","AuthProvider.tsx","components/photo.tsx","components/userphoto.tsx","App.tsx","index.tsx","config.js"],"names":["instance","axios","create","baseURL","process","ApiCancelToken","CancelToken","setAuthHeader","token","defaults","headers","common","useStyles","makeStyles","theme","createStyles","search","position","borderRadius","shape","backgroundColor","fade","palette","white","marginRight","spacing","marginLeft","width","breakpoints","up","searchIcon","padding","height","pointerEvents","display","alignItems","justifyContent","inputRoot","color","inputInput","paddingLeft","transition","transitions","Search","props","cancelToken","classes","history","useHistory","useState","searchResult","setSearchResult","value","setValue","setIsLoading","options","map","option","category","type","onInputChange","a","cancel","source","auth","getAccessToken","msalRequest","scopes","api","get","then","resp","result","data","catch","error","isAuthenticated","className","Autocomplete","id","key","groupBy","size","autoHighlight","getOptionLabel","displayName","staffId","upn","renderOption","Fragment","onPremisesSyncEnabled","onChange","event","values","push","renderInput","params","InputBase","ref","InputProps","root","input","placeholder","e","target","inputProps","autoComplete","flexGrow","menuButton","title","typographyStyle","flex","withRouter","AppBar","Toolbar","IconButton","edge","onClick","Typography","variant","noWrap","logout","Footer","Container","maxWidth","Box","m","align","UserInfo","msGraphObjectId","accountEnabled","UserDetailsSkeleton","p","pl","pt","pr","Skeleton","Grid","container","item","xs","GroupSkeleton","GroupCountSkeleton","TableSkeleton","RowSkeleton","pb","style","justify","direction","margin","div","icon","fontSize","userInfo","setUserInfo","query","location","hash","encodeURIComponent","match","isLoading","useEffect","isMounted","endpoint","err","console","log","getStaffInfo","ButtonGroup","orientation","Button","aadEndpoints","index","href","link","BooleanFormatter","GroupLinkFormatter","row","to","BooleanTypeProvider","formatterComponent","GroupLinkTypeProvider","HeaderCellComponent","Cell","fontWeight","cellComponent","column","name","rows","setRows","columns","getCellValue","adValue","msGraphValue","adsValue","getStaff","test","Paper","defaultHiddenColumnNames","heroContent","background","paper","heroButtons","marginTop","cardGrid","paddingTop","paddingBottom","card","flexDirection","cardMedia","cardContent","footer","sources","description","image","buttonLink","buttonVariant","component","gutterBottom","paragraph","indexOf","sm","md","Card","CardMedia","CardContent","CardActions","onSave","workbook","xlsx","writeBuffer","buffer","saveAs","Blob","booleanColumns","groupLinkColumns","exporterRef","useRef","startExport","useCallback","current","exportGrid","getUsersGroups","encodeURI","for","status","divbase","maxAdGroupCount","bar","textShadow","colour","setColor","groupOnPremCount","setGroupOnPremCount","setGroupCount","getOnPremGroupCount","count","ConfirmDialog","children","open","setOpen","onConfirm","Dialog","onClose","aria-labelledby","DialogTitle","DialogContent","DialogActions","ProgressDialog","CircularProgress","UserGroupLinkFormatter","memberType","UserGroupLinkTypeProvider","getRowId","rowId","initialState","skip","requestedSkip","take","VIRTUAL_PAGE_SIZE","totalCount","loading","lastQuery","forceReload","skipToken","reducer","state","action","payload","excelWorkbook","useReducer","dispatch","setDisplayName","isExporting","setIsExporting","UserGroupLinkColumns","cache","useMemo","createRowCache","save","onSaveNested","updateRows","receivedCount","newTotalCount","getRows","URL","buildQueryString","getGroupMemberNested","groupDetails","groupMembersDetails","ExcelJS","Workbook","worksheet","addWorksheet","header","getRow","font","bold","addRows","groupMembersList","invalidate","length","skipTokens","fetch","method","body","JSON","stringify","Headers","response","json","getGroupMembersFlat","exportRows","totalRowCount","pageSize","infiniteScrolling","menuItemComponent","MenuItem","text","WrappedComponent","photos","setPhotos","getUserPhotos","skeleton","mt","mb","ml","Math","random","photo","CardHeader","src","NoMatch","role","UnAuthorised","App","this","isAuthorised","hasLoaded","CssBaseline","path","exact","React","Component","withAuthProvider","publicClientApplication","user","PublicClientApplication","config","handleRedirectPromise","getUserProfile","accounts","getAllAccounts","login","setError","message","debug","setErrorMessage","loginRedirect","prompt","setState","normalizeError","Error","acquireTokenSilent","account","silentResult","accessToken","isInteractionRequired","acquireTokenPopup","interactiveResult","acc","prop","idTokenClaims","hasOwnProperty","roles","includes","email","username","normalizedError","errParts","split","ReactDOM","document","getElementById","Object","defineProperty","exports","clientId","authority","redirectUri","cacheLocation","storeAuthStateInCookie"],"mappings":"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","file":"static/js/main.d0389023.chunk.js","sourcesContent":["import axios from 'axios';\n\nconst instance = axios.create({\n baseURL: process.env.REACT_APP_API_BASE_URL,\n});\nconst ApiCancelToken = axios.CancelToken;\n const setAuthHeader = (token: string) => {\n instance.defaults.headers.common['Authorization'] = `Bearer ${token}`;\n}\nexport { instance, setAuthHeader, ApiCancelToken };\n\n//export default instance;","import React, { useState } from 'react';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport InputBase from '@material-ui/core/InputBase';\nimport SearchIcon from '@material-ui/icons/Search';\nimport { fade, makeStyles, Theme, createStyles } from '@material-ui/core/styles';\nimport { instance as api, setAuthHeader, ApiCancelToken } from '../api';\nimport SearchModel from '../Models/searchModel';\nimport { AuthComponentProps } from \"../AuthProvider\";\nimport { msalRequest } from '../config';\nimport { useHistory } from 'react-router-dom';\nimport { CancelTokenSource } from 'axios';\n\nconst useStyles = makeStyles((theme: Theme) => createStyles({\n\n search: {\n position: 'relative',\n borderRadius: theme.shape.borderRadius,\n backgroundColor: fade(theme.palette.common.white, 0.15),\n '&:hover': {\n backgroundColor: fade(theme.palette.common.white, 0.25),\n },\n marginRight: theme.spacing(2),\n marginLeft: 0,\n width: '100%',\n [theme.breakpoints.up('sm')]: {\n marginLeft: theme.spacing(3),\n width: 'auto',\n },\n },\n searchIcon: {\n padding: theme.spacing(0, 2),\n height: '100%',\n position: 'absolute',\n pointerEvents: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n inputRoot: {\n color: 'inherit',\n },\n inputInput: {\n padding: theme.spacing(1, 1, 1, 0),\n // vertical padding + font size from searchIcon\n paddingLeft: `calc(1em + ${theme.spacing(4)}px)`,\n transition: theme.transitions.create('width'),\n width: '100%',\n [theme.breakpoints.up('md')]: {\n width: '50ch',\n },\n }\n}));\ninterface Props {\n auth: AuthComponentProps;\n}\nconst Search: React.FC = (props: Props) => {\n const classes = useStyles();\n const history = useHistory();\n const [searchResult, setSearchResult] = useState([]);\n const [value, setValue] = useState('');\n let cancelToken: CancelTokenSource;\n const [isLoading, setIsLoading] = useState(true);\n const options = searchResult.map((option) => {\n return {\n category: option.type,\n ...option,\n };\n });\n const onChange = (event: any, values: any) => {\n setValue(values.displayName);\n if (values) {\n return values.category === 'User' ? history.push(`/user/${values.upn}`)\n : history.push(`/group/${values.id}`);\n }\n return \"\";\n }\n const onInputChange = async (value: string) => {\n if (value === '')\n value = null;\n if (typeof cancelToken != typeof undefined) {\n cancelToken.cancel();\n }\n //Save the cancel token for the current request\n cancelToken = ApiCancelToken.source();\n const token = await props.auth.getAccessToken(msalRequest.scopes);\n setIsLoading(true);\n setAuthHeader(token);\n await api.get(`SearchUserGroup/${value}`, { cancelToken: cancelToken.token })\n .then((resp) => {\n var result = resp.data\n setIsLoading(false);\n setSearchResult(result);\n }).catch(error => {\n });\n }\n if (props.auth.isAuthenticated) {\n return (
\n option.category}\n size=\"small\"\n autoHighlight\n getOptionLabel={(option: any) => (option.displayName + option.staffId + option.upn)}\n renderOption={(option) => {\n if (option.type === 'Group') {\n return (\n {option.displayName} {option.onPremisesSyncEnabled === true ? '' : '(Cloud only)'}\n );\n }\n else {\n return (\n {option.displayName} ({option.staffId}/{option.upn})\n );\n }\n }}\n onChange={onChange}\n renderInput={(params) => {\n return (<>\n
\n \n
\n onInputChange(e.target.value)}\n inputProps={{\n ...params.inputProps,\n autoComplete: 'new-password'\n }}\n />\n )\n }}\n />\n
\n )\n }\n else return (
not authorised
);\n}\nexport default Search;\n\n","import React from 'react';\nimport { makeStyles, Theme, createStyles } from '@material-ui/core/styles';\nimport AppBar from '@material-ui/core/AppBar';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport Typography from '@material-ui/core/Typography';\nimport HomeIcon from '@material-ui/icons/Home';\nimport ExitTo from '@material-ui/icons/ExitToApp';\nimport IconButton from '@material-ui/core/IconButton';\nimport { useHistory, RouteComponentProps, withRouter } from 'react-router-dom';\nimport Search from \"./search\";\nimport { AuthComponentProps } from \"../AuthProvider\";\n\ninterface Props extends RouteComponentProps<{ query: string }> {\n auth: AuthComponentProps;\n}\n\nconst useStyles = makeStyles((theme: Theme) => createStyles({\n root: {\n flexGrow: 1,\n },\n menuButton: {\n marginRight: theme.spacing(2),\n },\n title: {\n flexGrow: 0,\n justifyContent: 'flex-start',\n marginLeft: theme.spacing(0),\n },\n typographyStyle: {\n flex: 1\n },\n}));\n\nconst Header: React.FC = (props: Props) => {\n//const Header = (props: any) => {\n const classes = useStyles();\n const history = useHistory();\n\n const handleHomeClick = (event: React.MouseEvent) => {\n history.push(\"/\");\n };\n\n const signOut = (event: React.MouseEvent) => {\n props.auth.logout();\n };\n\n return (\n \n \n \n \n \n \n Arup Identity Tool\n \n \n
\n {props.auth.isAuthenticated &&\n \n \n \n }\n \n \n \n );\n}\nexport default withRouter(Header);\n","import React from 'react';\nimport { Box, Container, Typography } from '@material-ui/core';\n\nconst Footer = () => {\n return (\n
\n \n \n \n @Arup 2020\n \n \n \n
\n );\n}\n\nexport default Footer;","class UserInfo {\n displayName: string;\n msGraphObjectId: string;\n accountEnabled: boolean;\n}\n\nexport { UserInfo }\n","import React from \"react\";\nimport Grid from '@material-ui/core/Grid';\nimport Skeleton from '@material-ui/lab/Skeleton';\nimport { Box } from '@material-ui/core';\n\nconst UserDetailsSkeleton = () => {\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nconst GroupSkeleton = () => {\n return (\n <>\n \n \n \n \n \n );\n};\n\nconst GroupCountSkeleton = () => {\n return (\n <>\n \n \n \n \n )\n}\n\n\nconst TableSkeleton = () => {\n const RowSkeleton = () => {\n return (<>\n \n \n \n \n \n \n \n \n \n \n \n \n )\n }\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n};\n\nexport { TableSkeleton, UserDetailsSkeleton, GroupSkeleton, GroupCountSkeleton }\n","import React, { useEffect, useState } from 'react';\nimport { RouteComponentProps, withRouter, useHistory } from 'react-router-dom';\nimport { AuthComponentProps } from '../AuthProvider';\nimport { makeStyles, ButtonGroup, Button, Typography, Box } from '@material-ui/core';\nimport { msalRequest } from '../config';\nimport { instance as api, setAuthHeader } from '../api';\nimport { UserInfo } from '../Models/userInfo';\nimport { aadEndpoints } from '../config';\nimport { UserDetailsSkeleton } from '../Utilities/Skeletons';\nimport CheckCircleIcon from '@material-ui/icons/CheckCircle';\nimport CancelIcon from '@material-ui/icons/Cancel';\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: 'flex',\n '& > *': {\n margin: theme.spacing(1),\n },\n },\n div: {\n flexGrow: 1\n },\n icon: {\n fontSize: 16,\n }\n}));\n\ninterface Props extends RouteComponentProps<{ query: string }> {\n auth: AuthComponentProps;\n}\n\nconst UserDetailsBar: React.FC = (props: Props) => {\n const classes = useStyles();\n const [userInfo, setUserInfo] = useState(new UserInfo());\n const query = props.location.hash ? encodeURIComponent(props.match.params.query + props.location.hash) : props.match.params.query\n const history = useHistory();\n const [isLoading, setIsLoading] = useState(false);\n const handleDetails = () => {\n history.push(`/user/${query}`)\n }\n const handleGroups = () => {\n history.push(`/user/${query}/groups`)\n }\n const handlePhoto = () => {\n history.push(`/user/${query}/photo`)\n }\n useEffect(() => {\n let isMounted = true;\n setIsLoading(true);\n const getStaffInfo = async (endpoint: string) => {\n const token = await props.auth.getAccessToken(msalRequest.scopes);\n setAuthHeader(token);\n await api.get(`${endpoint}`)\n .then((resp) => {\n if (isMounted) {\n setUserInfo(resp.data);\n setIsLoading(false);\n }\n }).catch(err => console.log(err));\n }\n getStaffInfo(`GetUserDetails/${query}`);\n return () => {\n isMounted = false;\n };\n }, [query, props]);\n\n return (\n <>\n {isLoading ? :\n <>\n \n \n {userInfo.accountEnabled ? :\n }\n \n \n \n {userInfo.displayName}\n \n \n \n
\n \n \n \n \n \n
\n \n {aadEndpoints.map((item, index) => (\n \n ))}\n \n
\n\n \n }\n );\n}\n\nexport default withRouter(UserDetailsBar);\n","import React from \"react\";\nimport {\n DataTypeProvider,\n DataTypeProviderProps,\n} from \"@devexpress/dx-react-grid\";\nimport { NavLink } from \"react-router-dom\";\nimport { TableHeaderRow } from '@devexpress/dx-react-grid-material-ui';\n\ntype BooleanFormatterProps = DataTypeProvider.ValueFormatterProps;\ntype GroupLinkFormatterProps = DataTypeProvider.ValueFormatterProps;\n\nconst BooleanFormatter = ({ value }: BooleanFormatterProps) => (\n <>{value ? \"Yes\" : \"No\"} \n);\n\nconst GroupLinkFormatter = ({\n row: { id },\n value,\n}: GroupLinkFormatterProps) => {value};\n\nconst BooleanTypeProvider: React.ComponentType = (\n props: DataTypeProviderProps\n) => ;\n\nconst GroupLinkTypeProvider: React.ComponentType = (\n props: DataTypeProviderProps\n) => ;\n\nconst HeaderCellComponent: React.FunctionComponent = (props: TableHeaderRow.CellProps) => {\n return ;\n};\n\nexport { BooleanTypeProvider, GroupLinkTypeProvider, HeaderCellComponent}","import React, { useState, useEffect } from 'react';\nimport { instance as api, setAuthHeader } from '../api';\nimport { RouteComponentProps, withRouter } from 'react-router-dom';\nimport {\n Grid,\n Table,\n TableHeaderRow,\n ColumnChooser,\n TableColumnVisibility,\n Toolbar,\n}\n from '@devexpress/dx-react-grid-material-ui';\nimport { Box, Paper } from '@material-ui/core';\nimport { Result, UserRows } from '../Models/userRows';\nimport { AuthComponentProps } from \"../AuthProvider\";\nimport { TableSkeleton } from \"../Utilities/Skeletons\";\nimport { HeaderCellComponent } from \"../Utilities/TableUtilities\";\nimport { msalRequest } from '../config';\n\ninterface Props extends RouteComponentProps<{ query: string }> {\n auth: AuthComponentProps;\n}\n\nconst cellComponent = (props: any) => {\n const { column } = props;\n if (column.name === 'field') {\n return \n }\n return ;\n};\nconst UserInfo: React.FC = (props: Props) => {\n const [rows, setRows] = useState([]);\n const [isLoading, setIsLoading] = useState(false);\n const columns = [\n { name: 'field', title: 'Field' },\n { name: 'adProp', title: 'AD Fieldname' },\n {\n name: 'adValue', title: 'Active Directory (AD)',\n getCellValue: (row: any) => ((row.adValue !== row.msGraphValue || row.adValue !== row.adsValue)\n && row.adsValue !== '-' && row.msGraphValue !== '-' && row.adValue !== '-') ?\n {row.adValue} : row.adValue\n },\n { name: 'msGraphProp', title: 'Microsoft Graph Fieldname' },\n {\n name: 'msGraphValue', title: 'Microsoft Graph',\n getCellValue: (row: any) => ((row.adValue !== row.msGraphValue || row.msGraphValue !== row.adsValue)\n && row.adsValue !== '-' && row.msGraphValue !== '-' && row.adValue !== '-') ?\n {row.msGraphValue} : row.msGraphValue\n },\n { name: 'adsProp', title: 'Arup Data FieldName' },\n {\n name: 'adsValue', title: 'Arup Data Services (ADS)',\n getCellValue: (row: any) => ((row.adValue !== row.adsValue || row.msGraphValue !== row.adsValue)\n && row.adsValue !== '-' && row.msGraphValue !== '-' && row.adValue !== '-') ?\n {row.adsValue} : row.adsValue\n },\n ];\n const defaultHiddenColumnNames: string[] = ['adProp', 'msGraphProp', 'adsProp'];\n const query = props.match.params.query + props.location.hash;\n useEffect(() => {\n let isMounted = true;\n let reg = /^\\d+$/;\n const getStaff = async (endpoint: string) => {\n setIsLoading(true);\n const token = await props.auth.getAccessToken(msalRequest.scopes);\n setAuthHeader(token);\n await api.get(`${endpoint}`)\n .then((resp) => {\n if (isMounted) {\n setRows(resp.data.result);\n setIsLoading(false);\n }\n }).catch(err => console.log(err));\n }\n\n if (reg.test(query)) {\n getStaff(`GetUserByStaffId/${query}`);\n } else {\n getStaff(`GetUserByUpn/${encodeURIComponent(query)}`);\n }\n\n return () => {\n isMounted = false;\n };\n }, [query, props]);\n if (props.auth.isAuthenticated) {\n return (\n \n {isLoading ? (\n \n \n \n ) : (\n <>\n \n \n \n \n \n \n \n )\n }\n \n );\n }\n else {\n return (
not authorised
);\n }\n}\n\nexport default withRouter(UserInfo)","import React from 'react';\nimport { RouteComponentProps, withRouter} from 'react-router-dom';\nimport { Paper} from '@material-ui/core';\nimport { AuthComponentProps } from \"../AuthProvider\";\nimport UserDetailsBar from './userdetailsbar';\nimport UserInfo from './userinfo'\n\ninterface Props extends RouteComponentProps<{ query: string }> {\n auth: AuthComponentProps;\n}\n\nconst User: React.FC = (props: Props) => {\n if (props.auth.isAuthenticated) {\n return (\n \n \n \n \n );\n }\n else {\n return (
not authorised
);\n }\n}\n\nexport default withRouter(User);\n","import React from 'react';\nimport { AuthComponentProps } from \"../AuthProvider\";\nimport { RouteComponentProps, withRouter } from 'react-router-dom';\nimport Button from '@material-ui/core/Button';\nimport Card from '@material-ui/core/Card';\nimport CardActions from '@material-ui/core/CardActions';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardMedia from '@material-ui/core/CardMedia';\nimport Container from '@material-ui/core/Container';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\n\nconst useStyles = makeStyles((theme) => ({\n icon: {\n marginRight: theme.spacing(2),\n },\n heroContent: {\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(8, 0, 6),\n },\n heroButtons: {\n marginTop: theme.spacing(4),\n },\n cardGrid: {\n paddingTop: theme.spacing(8),\n paddingBottom: theme.spacing(8),\n },\n card: {\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n },\n cardMedia: {\n paddingTop: '56.25%', // 16:9\n },\n cardContent: {\n flexGrow: 1,\n },\n footer: {\n backgroundColor: theme.palette.background.paper,\n padding: theme.spacing(6),\n },\n}));\n\ninterface Props extends RouteComponentProps<{ query: string }> {\n auth: AuthComponentProps;\n}\n\n\nconst sources = [\n {\n title: \"Microsoft Graph\",\n description:\n \"Using Microsoft Graph to get User' and 'Group' properties. 'Users' and 'Groups' are the representation of Arup's Azure Active Directory in Microsoft Graph\",\n image: \"/images/azure-active-directory.png\",\n buttonLink: \"https://developer.microsoft.com/en-us/graph/\",\n buttonVariant: \"outlined\",\n },\n {\n title: \"Active Directory\",\n description:\n \"Using Windows Active Directory to get 'User' and 'Group' properties.\",\n image: \"/images/active-directory-logo.png\",\n buttonLink:\n \"https://docs.microsoft.com/en-us/windows-server/identity/ad-ds/get-started/virtual-dc/active-directory-domain-services-overview\",\n buttonVariant: \"outlined\",\n },\n {\n title: \"Arup Data Services (ADS)\",\n description: \"Using Arup Data Services (ADS) to get 'Staff' properties.\",\n image: \"/images/arup-data-services.jpg\",\n buttonLink:\n \"https://arup.sharepoint.com/sites/essentials-corporate-services/information-technology/aisportal/Pages/Home-Page.aspx\",\n buttonVariant: \"outlined\",\n },\n];\n\nconst Home: React.FC = (props: Props) => {\n const classes = useStyles();\n return (\n
\n
\n \n \n Arup Identity Tools\n \n \n A utility used by Digital Technology staff to compare data between Microsoft Graph, Active Directory and Arup Data Services (ADS).\n \n \n
\n \n {/* End hero unit */}\n \n {sources.map((source) => (\n \n \n \n \n \n {source.title}\n \n \n {source.description}\n \n \n \n \n \n \n \n ))}\n \n \n
\n );\n}\nexport default withRouter(Home);","import React, { useEffect, useState, useRef, useCallback, } from \"react\";\nimport { withRouter, RouteComponentProps } from \"react-router-dom\";\nimport { instance as api, setAuthHeader } from '../api';\nimport {\n Grid,\n Table,\n TableHeaderRow,\n Toolbar,\n ExportPanel,\n\n} from \"@devexpress/dx-react-grid-material-ui\";\nimport { GridExporter } from '@devexpress/dx-react-grid-export';\nimport { Box, Paper } from '@material-ui/core';\nimport { UsersGroupsRows, UsersGroupsColumns } from \"../Models/usersGroupsData\";\nimport { BooleanTypeProvider, GroupLinkTypeProvider, HeaderCellComponent } from \"../Utilities/TableUtilities\";\nimport { TableSkeleton } from \"../Utilities/Skeletons\";\nimport { saveAs } from 'file-saver';\nimport ExcelJS from \"exceljs\";\nimport { AuthComponentProps } from \"../AuthProvider\";\nimport { msalRequest } from '../config';\n\ninterface Props extends RouteComponentProps<{ query: string }> {\n auth: AuthComponentProps;\n}\n\nconst onSave = (workbook: ExcelJS.Workbook) => {\n workbook.xlsx.writeBuffer().then((buffer) => {\n saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'DataGrid.xlsx');\n });\n};\n\nconst UsersGroupsInfo: React.FC = (props: Props) => {\n const [rows, setRows] = useState([]);\n const [query] = useState(props.match.params.query);\n const [isLoading, setIsLoading] = useState(false);\n const columns: UsersGroupsColumns[] = [\n { name: \"displayName\", title: \"Display Name\" },\n { name: \"description\", title: \"Description\" },\n { name: \"onPremisesSyncEnabled\", title: \"On premise?\" },\n ];\n const [booleanColumns] = useState([\"onPremisesSyncEnabled\"]);\n const [groupLinkColumns] = useState([\"displayName\"]);\n const exporterRef = useRef(null);\n\n const startExport = useCallback((options) => {\n if (null !== exporterRef.current) {\n exporterRef.current.exportGrid(options);\n }\n }, [exporterRef]);\n\n useEffect(() => {\n let isMounted = true;\n let reg = /^\\d+$/;\n const getUsersGroups = async (endpoint:string) => {\n setIsLoading(true);\n const token = await props.auth.getAccessToken(msalRequest.scopes);\n setAuthHeader(token)\n await api\n .get(`${endpoint}`)\n .then((resp) => {\n if (isMounted) {\n setRows(resp.data);\n setIsLoading(false);\n }\n }).catch(err => console.log(err));\n }\n if (reg.test(query)) {\n getUsersGroups(`GetGroupsForUserByStaffId/${query}`);\n } else {\n getUsersGroups(`GetGroupsForUser/${encodeURI(query)}`);\n }\n return () => {\n isMounted = false;\n };\n }, [query, props]);\n\n return (\n
\n \n {isLoading ? (\n \n \n \n ) : (\n <>\n \n \n \n
\n \n \n \n \n \n )}\n \n \n );\n};\nexport default withRouter(UsersGroupsInfo);\n","import React, { useEffect, useState } from 'react';\nimport { RouteComponentProps, withRouter } from 'react-router-dom';\nimport { AuthComponentProps } from '../AuthProvider';\nimport { msalRequest } from '../config';\nimport { instance as api, setAuthHeader } from '../api';\nimport Typography from '@material-ui/core/Typography';\nimport { Box, makeStyles } from '@material-ui/core';\nimport { GroupCountSkeleton } from '../Utilities/Skeletons';\n\nconst maxAdGroupCount = 1010;\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: 'flex',\n '& > *': {\n margin: theme.spacing(1),\n },\n },\n status: {\n color: \"green\"\n },\n divbase: {\n height: 20,\n borderRadius: 5,\n width: (maxAdGroupCount / 4),\n backgroundColor:'#AAA',\n display: 'flex',\n marginTop: '5px',\n marginLeft: '5px'\n },\n bar: {\n borderRadius: 5,\n backgroundColor: 'green',\n color: 'white',\n paddingLeft: '6px',\n textShadow: '1px 0 0 #000'\n },\n row: {\n display: 'flex',\n flexDirection: 'row'\n }\n}));\n\ninterface Props extends RouteComponentProps<{ query: string }> {\n auth: AuthComponentProps;\n}\n\nconst UserOnPremGroupStatusBar: React.FC = (props: Props) => {\n const classes = useStyles();\n const [isLoading, setIsLoading] = useState(false);\n const [colour, setColor] = useState(\"green\");\n const [groupOnPremCount, setGroupOnPremCount] = useState(0);\n const query = props.location.hash ? encodeURIComponent(props.match.params.query + props.location.hash) : props.match.params.query;\n\n useEffect(() => {\n let isMounted = true;\n setIsLoading(true);\n const getOnPremGroupCount = async (endpoint: string) => {\n const token = await props.auth.getAccessToken(msalRequest.scopes);\n setAuthHeader(token);\n await api.get(`${endpoint}`)\n .then((resp) => {\n if (isMounted) {\n setGroupCount(resp.data);\n setIsLoading(false);\n }\n }).catch(err => console.log(err));\n }\n getOnPremGroupCount(`GetUserOnPremGroupCount/${query}`);\n return () => {\n isMounted = false;\n };\n }, [query, props]);\n\n const setGroupCount = (count: number) => {\n if (count >= 900) {\n setColor(\"red\");\n }\n else if (count >= 800) {\n setColor(\"orange\");\n }\n setGroupOnPremCount(count);\n }\n\n return (\n <>\n {isLoading ? :\n \n \n
\n \n On-Premise Group Count :\n \n
\n
\n {groupOnPremCount}\n
\n
\n
\n
\n \n }\n \n )\n}\nexport default withRouter(UserOnPremGroupStatusBar);\n","import React from \"react\";\nimport { withRouter, RouteComponentProps } from \"react-router-dom\";\nimport { Paper } from '@material-ui/core';\nimport { AuthComponentProps } from \"../AuthProvider\";\nimport UserDetailsBar from './userdetailsbar';\nimport UsersGroupsInfo from './usergroupsinfo'\nimport UserOnPremGroupStatusBar from './useronpremgroupstatusbar'\n\ninterface Props extends RouteComponentProps<{ query: string }> {\n auth: AuthComponentProps;\n}\n\nconst UsersGroups: React.FC = (props: Props) => {\n return (\n \n \n \n \n \n );\n};\nexport default withRouter(UsersGroups);\n","import React from 'react';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\n\nexport interface IDialogProps {\n title: string;\n open: boolean;\n setOpen: Function;\n onConfirm: Function;\n children: string;\n}\nconst ConfirmDialog = (props: IDialogProps) => {\n const { title, children, open, setOpen, onConfirm } = props;\n return (\n setOpen(false)}\n aria-labelledby=\"confirm-dialog\"\n >\n {title}\n {children}\n \n setOpen(false)}\n color=\"default\"\n >\n No\n \n {\n setOpen(false);\n onConfirm();\n }}\n color=\"default\"\n >\n Yes\n \n \n \n );\n};\nexport default ConfirmDialog;","import React from 'react';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport { Box, CircularProgress, makeStyles, Theme, createStyles } from '@material-ui/core';\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n display: 'flex',\n '& > * + *': {\n marginLeft: theme.spacing(10),\n },\n },\n }),\n);\n\nexport interface IDialogProps {\n title: string;\n open: boolean;\n}\nconst ProgressDialog = (props: IDialogProps) => {\n const classes = useStyles();\n const { title, open } = props;\n return (\n \n {title}\n \n \n \n \n \n \n );\n};\nexport default ProgressDialog;","import React, {\n useReducer, useState, useEffect, useMemo, useRef, useCallback\n} from 'react';\nimport Paper from '@material-ui/core/Paper';\nimport {\n VirtualTableState,\n createRowCache,\n DataTypeProvider,\n DataTypeProviderProps,\n} from '@devexpress/dx-react-grid';\nimport {\n Grid,\n VirtualTable,\n TableHeaderRow,\n Toolbar,\n ExportPanel,\n TableColumnVisibility\n} from '@devexpress/dx-react-grid-material-ui';\nimport { GridExporter } from '@devexpress/dx-react-grid-export';\nimport ExcelJS from \"exceljs\";\nimport { saveAs } from 'file-saver';\nimport { GroupMembersRows } from '../Models/groupMembersData';\nimport { RouteComponentProps, withRouter, NavLink } from 'react-router-dom';\nimport { AuthComponentProps } from '../AuthProvider';\nimport { Box, Typography } from '@material-ui/core';\nimport { GroupSkeleton } from '../Utilities/Skeletons';\nimport { BooleanTypeProvider, HeaderCellComponent } from '../Utilities/TableUtilities';\nimport { msalRequest } from '../config';\nimport { instance as api, setAuthHeader } from '../api';\nimport ConfirmDialog from './confirmdialog';\nimport { GroupDetailsRows } from '../Models/groupDetails';\nimport ProgressDialog from './progressdialog';\n\ninterface Props extends RouteComponentProps<{ query: string }> {\n auth: AuthComponentProps;\n}\n\ntype UserGroupLinkformatterProps = DataTypeProvider.ValueFormatterProps;\nconst UserGroupLinkFormatter = (\n {\n row: { upn, memberType, id },\n value,\n }: UserGroupLinkformatterProps\n) => {\n switch (memberType) {\n case 'Group':\n return {value};\n case 'User':\n return {value};\n default:\n return <>;\n }\n}\nconst UserGroupLinkTypeProvider: React.ComponentType = (\n props: DataTypeProviderProps\n) => ;\n\nconst getRowId = (row: GroupMembersRows) => row.rowId;\nconst VIRTUAL_PAGE_SIZE = 450;\n\ninterface IInitialState {\n rows: GroupMembersRows[];\n skip: number;\n requestedSkip: number;\n take: number;\n totalCount: number;\n loading: boolean;\n lastQuery: string;\n forceReload: boolean;\n skipToken: string\n}\nconst initialState: IInitialState = {\n rows: [],\n skip: 0,\n requestedSkip: 0,\n take: VIRTUAL_PAGE_SIZE * 2,\n totalCount: 0,\n loading: false,\n lastQuery: '',\n forceReload: false,\n skipToken: 'start'\n};\n\ntype Action = {\n readonly type: 'START_LOADING';\n readonly payload: {\n requestedSkip: number,\n take: number\n }\n} | {\n readonly type: 'UPDATE_ROWS';\n readonly payload: {\n skip: number,\n rows: GroupMembersRows[],\n totalCount: number,\n skipToken: string\n }\n} | {\n readonly type: 'REQUEST_ERROR';\n} | {\n readonly type: 'FETCH_INIT';\n} | {\n readonly type: 'UPDATE_QUERY';\n readonly payload: string;\n}\n\nfunction reducer(state: IInitialState, action: Action) {\n switch (action.type) {\n case 'UPDATE_ROWS':\n return {\n ...state,\n ...action.payload,\n loading: false,\n };\n case 'START_LOADING':\n return {\n ...state,\n requestedSkip: action.payload.requestedSkip,\n take: action.payload.take,\n };\n case 'REQUEST_ERROR':\n return {\n ...state,\n loading: false,\n };\n case 'FETCH_INIT':\n return {\n ...state,\n loading: true,\n forceReload: false,\n };\n case 'UPDATE_QUERY':\n return {\n ...state,\n lastQuery: action.payload,\n };\n default:\n return state;\n }\n}\n\nconst Group: React.FC = (props: Props) => {\n const [state, dispatch] = useReducer(reducer, initialState);\n const exporterRef = useRef(null);\n const [displayName, setDisplayName] = useState(\"\");\n const [isLoading, setIsLoading] = useState(true);\n const [isExporting, setIsExporting] = useState(false);\n const [booleanColumns] = useState([\"onPremisesSyncEnabled\"]);\n const [UserGroupLinkColumns] = useState([\"displayName\"]);\n const [open, setOpen] = useState(false)\n const [columns] = useState([\n { name: 'rowId', title: '#', getCellValue: (row: GroupMembersRows) => row.rowId },\n { name: 'memberType', title: 'Type' },\n { name: 'displayName', title: 'Display Name' },\n { name: 'onPremisesSyncEnabled', title: 'On Premises' },\n { name: 'userType', title: 'User Type' },\n { name: 'upn', title: 'User Principal Name' },\n { name: 'description', title: 'Description' },\n ]);\n const defaultHiddenColumnNames: string[] = ['rowId'];\n const cache = useMemo(() => createRowCache(VIRTUAL_PAGE_SIZE), []);\n const startExport = useCallback((options) => {\n if (null !== exporterRef.current) {\n exporterRef.current.exportGrid(options);\n }\n }, [exporterRef]);\n let excelWorkbook: ExcelJS.Workbook;\n const onSave = (workbook: ExcelJS.Workbook) => {\n excelWorkbook = workbook;\n state.skipToken !== null ? setOpen(true) : save();\n };\n const handleYes = () => {\n setOpen(false);\n save();\n }\n const save = () => {\n excelWorkbook.xlsx.writeBuffer().then((buffer) => {\n saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'GroupMembers.xlsx');\n });\n }\n const onSaveNested = async (workbook: ExcelJS.Workbook) => {\n workbook.xlsx.writeBuffer().then((buffer) => {\n saveAs(new Blob([buffer], { type: 'application/octet-stream' }), 'NestedGroupMembers.xlsx');\n });\n setIsExporting(false);\n }\n const menuItemComponent: React.ComponentType = (props: ExportPanel.MenuItemProps) => {\n return <>\n \n { if (!isExporting) getGroupMemberNested(); }} />\n \n };\n const updateRows = (skip: number, take: number, skipToken: string, receivedCount: number) => {\n let newTotalCount = skip + receivedCount + VIRTUAL_PAGE_SIZE\n if (receivedCount === 0) {\n newTotalCount = state.totalCount;\n }\n else if (!skipToken && receivedCount !== 0) {\n newTotalCount = skip + receivedCount;\n }\n dispatch({\n type: 'UPDATE_ROWS',\n payload: {\n skip: skip,\n rows: cache.getRows(skip, take),\n totalCount: newTotalCount,\n skipToken: skipToken\n },\n });\n };\n const getRemoteRows = (requestedSkip: number, take: number) => {\n dispatch({ type: 'START_LOADING', payload: { requestedSkip, take } });\n };\n const URL = `${api.defaults.baseURL}GetGroupMembersFlat/${props.match.params.query}`;\n const buildQueryString = () => {\n const {\n requestedSkip, take\n } = state;\n return `${URL}/${requestedSkip}/${take}`;\n };\n const getGroupMemberNested = async () => {\n const token = await props.auth.getAccessToken(msalRequest.scopes);\n setAuthHeader(token)\n setIsExporting(true);\n api.get(`GetGroupMembersNested/${props.match.params.query}`)\n .then((resp: any) => {\n let groupDetails = resp.data.groupMembersDetails;\n if (groupDetails) {\n let workbook = new ExcelJS.Workbook();\n let worksheet = workbook.addWorksheet('NestedGroupMembers');\n worksheet.columns = [\n { header: 'Type', key: 'memberType' },\n { header: 'Display Name', key: 'displayName' },\n { header: 'On Premises', key: 'onPremisesSyncEnabled' },\n { header: 'User Type', key: 'userType' },\n { header: 'User Principal Name', key: 'upn' },\n { header: 'Description', key: 'description' }\n ]\n worksheet.getRow(1).font = { bold: true }\n worksheet.addRows(groupDetails.groupMembersList);\n onSaveNested(workbook);\n }\n }).catch(err => console.log(err));\n }\n useEffect(() => {\n const {\n requestedSkip, take, lastQuery, loading, forceReload, skipToken\n } = state;\n const getGroupMembersFlat = async () => {\n const token = await props.auth.getAccessToken(msalRequest.scopes);\n setAuthHeader(token)\n const query = buildQueryString();\n if ((query !== lastQuery || forceReload) && !loading) {\n if (forceReload) {\n cache.invalidate();\n }\n const cached = cache.getRows(requestedSkip, take);\n if (cached.length === take) {\n updateRows(requestedSkip, take, skipToken, 0);\n } else {\n dispatch({ type: 'FETCH_INIT' });\n const data = { skipTokens: skipToken }\n fetch(query, {\n method: `post`,\n body: JSON.stringify(data),\n headers: new Headers({\n 'Authorization': `Bearer ${token}`\n })\n }).then(response => response.json())\n .then((resp) => {\n setDisplayName(resp.displayName);\n cache.setRows(requestedSkip, resp.groupMembersDetails.groupMembersList);\n const receivedCount = resp.groupMembersDetails.groupMembersList.length;\n updateRows(requestedSkip, take, resp.groupMembersDetails.skipToken, receivedCount);\n setIsLoading(false);\n }).catch(() => dispatch({ type: 'REQUEST_ERROR' }));\n }\n dispatch({ type: 'UPDATE_QUERY', payload: query });\n }\n }\n getGroupMembersFlat();\n });\n\n const {\n rows, skip, totalCount, loading\n } = state;\n let exportRows = cache.getRows(0, totalCount);\n return (\n {\n (isLoading) ?\n <>\n \n \n :\n (\n <>\n \n \n {displayName}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )}\n \n This will export partial data.\n To export all data scroll to the bottom of the page and try again.\n Do you wish to continue to download partial data?\n \n \n \n );\n};\nexport default withRouter(Group);\n","// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT License.\nimport React from 'react';\nimport { AuthenticationResult, PublicClientApplication } from '@azure/msal-browser';\n\nimport { config } from './config';\n\nexport interface AuthComponentProps {\n error: any;\n isAuthenticated: boolean;\n isAuthorised: boolean;\n user: any;\n login: Function;\n logout: Function;\n getAccessToken: Function;\n setError: Function;\n hasLoaded: boolean;\n\n}\n\ninterface AuthProviderState {\n error: any;\n isAuthenticated: boolean;\n isAuthorised: boolean;\n user: any;\n hasLoaded: boolean;\n}\n\nfunction hasOwnProperty(obj: X, prop: Y): obj is X & Record {\n return obj.hasOwnProperty(prop);\n}\n\nexport default function withAuthProvider>\n (WrappedComponent: new (props: AuthComponentProps, context?: any) => T): React.ComponentClass {\n return class extends React.Component {\n private publicClientApplication: PublicClientApplication;\n\n constructor(props: any) {\n super(props);\n this.state = {\n error: null,\n isAuthenticated: false,\n isAuthorised: false,\n user: {},\n hasLoaded: false\n };\n\n // Initialize the MSAL application object\n this.publicClientApplication = new PublicClientApplication(config);\n }\n\n componentDidMount() {\n // If MSAL already has an account, the user\n // is already logged in\n this.publicClientApplication.handleRedirectPromise().then(async (resp: AuthenticationResult) => {\n if (resp !== null) {\n await this.getUserProfile(resp);\n }\n }).catch(console.error);\n const accounts = this.publicClientApplication.getAllAccounts();\n if (accounts && accounts.length > 0) {\n // Enhance user object with data from Graph\n // this.getUserProfile();\n this.getUserProfile();\n } else {\n this.login();\n }\n }\n\n render() {\n return this.login()}\n logout={() => this.logout()}\n getAccessToken={(scopes: string[]) => this.getAccessToken(scopes)}\n setError={(message: string, debug: string) => this.setErrorMessage(message, debug)}\n hasLoaded={this.state.hasLoaded}\n {...this.props} />;\n }\n\n async login() {\n try {\n // Login via popup\n await this.publicClientApplication.loginRedirect(\n {\n scopes: config.scopes,\n prompt: \"select_account\"\n });\n }\n catch (err) {\n this.setState({\n isAuthenticated: false,\n isAuthorised: false,\n user: {},\n error: this.normalizeError(err)\n });\n }\n }\n\n logout() {\n this.publicClientApplication.logout();\n }\n\n async getAccessToken(scopes: string[]): Promise {\n try {\n const accounts = this.publicClientApplication.getAllAccounts();\n if (accounts.length <= 0) throw new Error('login_required');\n // Get the access token silently\n // If the cache contains a non-expired token, this function\n // will just return the cached token. Otherwise, it will\n // make a request to the Azure OAuth endpoint to get a token\n var silentResult = await this.publicClientApplication\n .acquireTokenSilent({\n scopes: scopes,\n account: accounts[0]\n });\n return silentResult.accessToken;\n } catch (err) {\n // If a silent request fails, it may be because the user needs\n // to login or grant consent to one or more of the requested scopes\n if (this.isInteractionRequired(err)) {\n var interactiveResult = await this.publicClientApplication\n .acquireTokenPopup({\n scopes: scopes\n });\n return interactiveResult.accessToken;\n } else {\n throw err;\n }\n }\n }\n\n getUserProfile(response?: AuthenticationResult) {\n try {\n var acc = this.publicClientApplication.getAllAccounts();\n if (acc !== null) {\n this.publicClientApplication.acquireTokenSilent({\n scopes: config.scopes,\n account: acc[0]\n })\n .then(({ idTokenClaims }) => {\n try {\n if (typeof idTokenClaims === 'object' && hasOwnProperty(idTokenClaims, \"roles\")) {\n this.setState({\n isAuthorised: idTokenClaims.roles.includes(\"IDTUser\"),\n isAuthenticated: true,\n hasLoaded: true,\n user: {\n displayName: acc[0].name,\n email: acc[0].username\n },\n error: null\n });\n } else {\n this.setState({\n isAuthorised: false,\n isAuthenticated: true,\n hasLoaded: true,\n user: {\n displayName: acc[0].name,\n email: acc[0].username\n },\n error: null\n })\n }\n }\n catch (err) {\n this.setState({\n isAuthorised: false,\n isAuthenticated: false,\n user: {},\n error: this.normalizeError(err)\n });\n }\n });\n }\n }\n catch (err) {\n this.setState({\n isAuthenticated: false,\n isAuthorised: false,\n user: {},\n error: this.normalizeError(err)\n });\n }\n }\n\n setErrorMessage(message: string, debug: string) {\n this.setState({\n error: { message: message, debug: debug }\n });\n }\n\n normalizeError(error: string | Error): any {\n var normalizedError = {};\n if (typeof (error) === 'string') {\n var errParts = error.split('|');\n normalizedError = errParts.length > 1 ?\n { message: errParts[1], debug: errParts[0] } :\n { message: error };\n } else {\n normalizedError = {\n message: error.message,\n debug: JSON.stringify(error)\n };\n }\n return normalizedError;\n }\n\n isInteractionRequired(error: Error): boolean {\n if (!error.message || error.message.length <= 0) {\n return false;\n }\n return (\n error.message.indexOf('consent_required') > -1 ||\n error.message.indexOf('interaction_required') > -1 ||\n error.message.indexOf('login_required') > -1 ||\n error.message.indexOf('no_account_in_silent_request') > -1\n );\n }\n }\n}\n","import React, { useEffect, useState } from 'react';\nimport { RouteComponentProps, withRouter } from 'react-router-dom';\nimport { AuthComponentProps } from '../AuthProvider';\nimport { msalRequest } from '../config';\nimport { instance as api, setAuthHeader } from '../api';\nimport ProfilePhoto from '../Models/profilePhoto';\nimport {\n makeStyles,\n Grid,\n Card,\n CardHeader,\n CardMedia,\n Box,\n Paper,\n} from '@material-ui/core';\nimport Container from '@material-ui/core/Container';\nimport Skeleton from '@material-ui/lab/Skeleton';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n flexGrow: 1,\n padding: theme.spacing(2)\n },\n cardGrid: {\n paddingTop: theme.spacing(8),\n paddingBottom: theme.spacing(8),\n }\n}))\ninterface Props extends RouteComponentProps<{ query: string }> {\n auth: AuthComponentProps;\n}\nconst Photo: React.FC = (props: Props) => {\n const [query] = useState(props.match.params.query);\n const [photos, setPhotos] = useState([]);\n const [isLoading, setIsLoading] = useState(false);\n const classes = useStyles();\n useEffect(() => {\n let isMounted = true;\n let reg = /^\\d+$/;\n setIsLoading(true);\n const getUserPhotos = async (endpoint: string) => {\n const token = await props.auth.getAccessToken(msalRequest.scopes);\n setAuthHeader(token)\n await api\n .get(`${endpoint}`)\n .then((resp) => {\n console.log(resp);\n if (isMounted) {\n setPhotos(resp.data);\n setIsLoading(false);\n }\n });\n }\n if (reg.test(query)) {\n getUserPhotos(`GetUserPhotosByStaffId/${query}`);\n } else {\n getUserPhotos(`GetUserPhotosByUpn/${encodeURI(query)}`);\n }\n return () => {\n isMounted = false;\n };\n }, [query, props]);\n return (\n \n {isLoading ?\n <>\n \n \n {[1, 2, 3].map(skeleton => (\n \n \n \n \n \n \n ))}\n \n \n \n :\n <>\n \n \n {photos.map(photo => {\n return (\n \n \n \n \n \n \n );\n })}\n \n \n \n }\n \n\n );\n}\nexport default withRouter(Photo);","import React from \"react\";\nimport { withRouter, RouteComponentProps } from \"react-router-dom\";\nimport { Paper } from '@material-ui/core';\nimport { AuthComponentProps } from \"../AuthProvider\";\nimport UserDetailsBar from './userdetailsbar';\nimport Photo from './photo';\n\ninterface Props extends RouteComponentProps<{ query: string }> {\n auth: AuthComponentProps;\n}\n\nconst UsersPhoto: React.FC = (props: Props) => {\n return (\n \n \n \n \n );\n};\nexport default withRouter(UsersPhoto);\n","import React from \"react\";\nimport { BrowserRouter as Router, Route, Switch } from \"react-router-dom\";\nimport { CssBaseline, Container } from '@material-ui/core';\nimport Header from \"./components/header\";\nimport Footer from \"./components/footer\";\nimport User from \"./components/user\";\nimport Home from \"./components/home\";\nimport UsersGroups from \"./components/usersgroups\";\nimport Group from \"./components/group\";\nimport withAuthProvider, { AuthComponentProps } from \"./AuthProvider\";\nimport UserPhoto from './components/userphoto';\n\nconst NoMatch = () => (\n
\n
\n
\n
\n
\n 404 - Page not found!\n
\n
\n
\n
\n
\n);\n\nconst UnAuthenticated = () => (\n
\n
\n
\n
\n
\n 401 - You have not been authenticated!\n
\n
\n
\n
\n
\n);\n\nconst UnAuthorised = () => (\n
\n
\n
\n
\n
\n 403 - You have not been authorised!\n
\n
\n
\n
\n
\n);\n\nconst signOut = () => (\n
\n
\n
\n
\n
\n

You are signed out successfully.

\n
\n
\n
\n
\n
\n);\n\nclass App extends React.Component {\n\n \n public render() {\n if (this.props.isAuthorised && this.props.hasLoaded) {\n return (\n <>\n \n \n
\n \n \n ()} />\n ()} />\n ()} />\n ()} />\n ()} />\n \n \n \n
\n \n \n );\n }\n else if (this.props.hasLoaded) {\n return ();\n }\n else {\n return <> \n }\n }\n}\n\nexport default withAuthProvider(App);\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App'\nimport { BrowserRouter } from 'react-router-dom';\n\nReactDOM.render( , document.getElementById('root') as HTMLElement);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\n//serviceWorker.unregister();\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.config = {\n auth: {\n clientId: process.env.REACT_APP_CLIENT_ID,\n authority: \"https://login.microsoftonline.com/4ae48b41-0137-4599-8661-fc641fe77bea\",\n redirectUri: process.env.REACT_APP_REDIRECT_URI\n },\n cache: {\n cacheLocation: \"sessionStorage\",\n storeAuthStateInCookie: true\n },\n scopes: [\n 'user.read',\n ]\n};\nexports.msalRequest = {\n scopes: [\n `${process.env.REACT_APP_API_ID}/.default`\n ]\n}\nexports.aadEndpoints = \n [\n {\n title: 'License',\n link: 'https://portal.azure.com/#blade/Microsoft_AAD_IAM/UserDetailsMenuBlade/Licenses/userId/'\n },\n {\n title: 'Sign-in activity',\n link: `https://portal.azure.com/#blade/Microsoft_AAD_IAM/UserDetailsMenuBlade/SignIns/userId/`,\n },\n {\n title: 'Registered Devices',\n link: `https://portal.azure.com/#blade/Microsoft_AAD_IAM/UserDetailsMenuBlade/Devices/userId/`,\n },\n {\n title: 'Applications',\n link: `https://portal.azure.com/#blade/Microsoft_AAD_IAM/UserDetailsMenuBlade/AssignedApplications/userId/`,\n },\n {\n title: 'Audit logs',\n link: `https://portal.azure.com/#blade/Microsoft_AAD_IAM/UserDetailsMenuBlade/Audit/userId/`\n }\n]\n"],"sourceRoot":""}