import React, { useState, useEffect, Dispatch, SetStateAction } from 'react' import axios from 'axios' import { Button, Grid, Dialog, DialogContent, DialogActions, TextField, CircularProgress, Autocomplete } from '@mui/material' import { styled } from '@mui/material/styles' import { BootstrapDialogTitle } from '../../components/dialogTitle' import { UserResponse, GroupResponse, RegisterPermissionPayload } from '../../utils/types' const BootstrapDialog = styled(Dialog)(({ theme }) => ({ '& .MuiDialogContent-root': { padding: theme.spacing(2) }, '& .MuiDialogActions-root': { padding: theme.spacing(1) } })) type AddPermissionModalProps = { open: boolean handleOpen: Dispatch> addPermission: ( permissions: RegisterPermissionPayload[], permissionType: string, principalType: string, principal: string, permissionSetting: string ) => void } const AddPermissionModal = ({ open, handleOpen, addPermission }: AddPermissionModalProps) => { const [paths, setPaths] = useState([]) const [loadingPaths, setLoadingPaths] = useState(false) const [selectedPaths, setSelectedPaths] = useState([]) const [permissionType, setPermissionType] = useState('Route') const [principalType, setPrincipalType] = useState('Group') const [userPrincipal, setUserPrincipal] = useState() const [groupPrincipal, setGroupPrincipal] = useState() const [permissionSetting, setPermissionSetting] = useState('Grant') const [loadingPrincipals, setLoadingPrincipals] = useState(false) const [userPrincipals, setUserPrincipals] = useState([]) const [groupPrincipals, setGroupPrincipals] = useState([]) useEffect(() => { setLoadingPaths(true) axios .get('/SASjsApi/info/authorizedRoutes') .then((res: any) => { if (res.data) { setPaths(res.data.paths) } }) .catch((err) => { console.log(err) }) .finally(() => { setLoadingPaths(false) }) }, []) useEffect(() => { setLoadingPrincipals(true) axios .get(`/SASjsApi/${principalType.toLowerCase()}`) .then((res: any) => { if (res.data) { if (principalType.toLowerCase() === 'user') { const users: UserResponse[] = res.data const nonAdminUsers = users.filter((user) => !user.isAdmin) setUserPrincipals(nonAdminUsers) } else { setGroupPrincipals(res.data) } } }) .catch((err) => { console.log(err) }) .finally(() => { setLoadingPrincipals(false) }) }, [principalType]) const handleAddPermission = () => { const permissions: RegisterPermissionPayload[] = [] selectedPaths.forEach((path) => { const addPermissionPayload: any = { path, type: permissionType, setting: permissionSetting, principalType: principalType.toLowerCase(), principalId: principalType.toLowerCase() === 'user' ? userPrincipal?.id : groupPrincipal?.groupId } permissions.push(addPermissionPayload) }) const principal = principalType.toLowerCase() === 'user' ? userPrincipal?.username : groupPrincipal?.name addPermission( permissions, permissionType, principalType, principal!, permissionSetting ) } const addButtonDisabled = !selectedPaths.length || (principalType.toLowerCase() === 'user' ? !userPrincipal : !groupPrincipal) return ( handleOpen(false)} open={open}> Add Permission { setSelectedPaths(newValue) }} renderInput={(params) => } /> setPermissionType(newValue) } renderInput={(params) => loadingPaths ? ( ) : ( ) } /> setPrincipalType(newValue) } renderInput={(params) => ( )} /> {principalType.toLowerCase() === 'user' ? ( option.displayName} disableClearable value={userPrincipal} onChange={(event: any, newValue: UserResponse) => setUserPrincipal(newValue) } renderInput={(params) => loadingPrincipals ? ( ) : ( ) } /> ) : ( option.name} disableClearable value={groupPrincipal} onChange={(event: any, newValue: GroupResponse) => setGroupPrincipal(newValue) } renderInput={(params) => loadingPrincipals ? ( ) : ( ) } /> )} setPermissionSetting(newValue) } renderInput={(params) => ( )} /> ) } export default AddPermissionModal