diff --git a/packages/web/src/components/RoleList/index.ee.jsx b/packages/web/src/components/RoleList/index.ee.jsx index 28306144..096b65e6 100644 --- a/packages/web/src/components/RoleList/index.ee.jsx +++ b/packages/web/src/components/RoleList/index.ee.jsx @@ -11,14 +11,18 @@ import Paper from '@mui/material/Paper'; import IconButton from '@mui/material/IconButton'; import Typography from '@mui/material/Typography'; import EditIcon from '@mui/icons-material/Edit'; + import DeleteRoleButton from 'components/DeleteRoleButton/index.ee'; import ListLoader from 'components/ListLoader'; import useFormatMessage from 'hooks/useFormatMessage'; import useRoles from 'hooks/useRoles.ee'; import * as URLS from 'config/urls'; + export default function RoleList() { const formatMessage = useFormatMessage(); - const { roles, loading } = useRoles(); + const { data, isLoading: isRolesLoading } = useRoles(); + const roles = data?.data; + return ( @@ -46,15 +50,15 @@ export default function RoleList() { - {loading && ( + {isRolesLoading && ( )} - {!loading && - roles.map((role) => ( + {!isRolesLoading && + roles?.map((role) => ( { + const { data } = await api.get('/v1/admin/roles', { + signal, + }); + + return data; + }, }); - return { - roles: data?.getRoles || [], - loading, - }; + + return query; } diff --git a/packages/web/src/pages/Authentication/RoleMappingsFieldsArray.jsx b/packages/web/src/pages/Authentication/RoleMappingsFieldsArray.jsx index 6eb61dda..be6c08fc 100644 --- a/packages/web/src/pages/Authentication/RoleMappingsFieldsArray.jsx +++ b/packages/web/src/pages/Authentication/RoleMappingsFieldsArray.jsx @@ -4,24 +4,32 @@ import Stack from '@mui/material/Stack'; import DeleteIcon from '@mui/icons-material/Delete'; import IconButton from '@mui/material/IconButton'; import Button from '@mui/material/Button'; +import { Divider, Typography } from '@mui/material'; + import useRoles from 'hooks/useRoles.ee'; import useFormatMessage from 'hooks/useFormatMessage'; import ControlledAutocomplete from 'components/ControlledAutocomplete'; import TextField from 'components/TextField'; -import { Divider, Typography } from '@mui/material'; + function generateRoleOptions(roles) { return roles?.map(({ name: label, id: value }) => ({ label, value })); } + function RoleMappingsFieldArray() { const formatMessage = useFormatMessage(); const { control } = useFormContext(); - const { roles, loading: rolesLoading } = useRoles(); + const { data, isLoading: isRolesLoading } = useRoles(); + const roles = data?.data; + const { fields, append, remove } = useFieldArray({ control, name: 'roleMappings', }); + const handleAppendMapping = () => append({ roleId: '', remoteRoleName: '' }); + const handleRemoveMapping = (index) => () => remove(index); + return ( <> {fields.length === 0 && ( @@ -60,7 +68,7 @@ function RoleMappingsFieldArray() { label={formatMessage('roleMappingsForm.role')} /> )} - loading={rolesLoading} + loading={isRolesLoading} required /> diff --git a/packages/web/src/pages/Authentication/SamlConfiguration.jsx b/packages/web/src/pages/Authentication/SamlConfiguration.jsx index b187a328..adffe002 100644 --- a/packages/web/src/pages/Authentication/SamlConfiguration.jsx +++ b/packages/web/src/pages/Authentication/SamlConfiguration.jsx @@ -2,8 +2,9 @@ import { useMutation } from '@apollo/client'; import LoadingButton from '@mui/lab/LoadingButton'; import Stack from '@mui/material/Stack'; import MuiTextField from '@mui/material/TextField'; -import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar'; import * as React from 'react'; + +import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar'; import ControlledAutocomplete from 'components/ControlledAutocomplete'; import Form from 'components/Form'; import Switch from 'components/Switch'; @@ -11,6 +12,7 @@ import TextField from 'components/TextField'; import { UPSERT_SAML_AUTH_PROVIDER } from 'graphql/mutations/upsert-saml-auth-provider'; import useFormatMessage from 'hooks/useFormatMessage'; import useRoles from 'hooks/useRoles.ee'; + const defaultValues = { active: false, name: '', @@ -24,16 +26,21 @@ const defaultValues = { roleAttributeName: '', defaultRoleId: '', }; + function generateRoleOptions(roles) { return roles?.map(({ name: label, id: value }) => ({ label, value })); } + function SamlConfiguration({ provider, providerLoading, refetchProvider }) { const formatMessage = useFormatMessage(); - const { roles, loading: rolesLoading } = useRoles(); + const { data, loading: isRolesLoading } = useRoles(); + const roles = data?.data; const enqueueSnackbar = useEnqueueSnackbar(); + const [upsertSamlAuthProvider, { loading }] = useMutation( UPSERT_SAML_AUTH_PROVIDER, ); + const handleProviderUpdate = async (providerDataToUpdate) => { try { const { @@ -66,9 +73,11 @@ function SamlConfiguration({ provider, providerLoading, refetchProvider }) { }, }, }); + if (!provider?.id) { await refetchProvider(); } + enqueueSnackbar(formatMessage('authenticationForm.successfullySaved'), { variant: 'success', SnackbarProps: { @@ -79,9 +88,11 @@ function SamlConfiguration({ provider, providerLoading, refetchProvider }) { throw new Error('Failed while saving!'); } }; + if (providerLoading) { return null; } + return (
)} - loading={rolesLoading} + loading={isRolesLoading} /> ({ label, value })); } + export default function CreateUser() { const navigate = useNavigate(); const formatMessage = useFormatMessage(); const [createUser, { loading }] = useMutation(CREATE_USER); - const { roles, loading: rolesLoading } = useRoles(); + const { data, loading: isRolesLoading } = useRoles(); + const roles = data?.data; const enqueueSnackbar = useEnqueueSnackbar(); + const handleUserCreation = async (userData) => { try { await createUser({ @@ -39,6 +44,7 @@ export default function CreateUser() { }, }, }); + enqueueSnackbar(formatMessage('createUser.successfullyCreated'), { variant: 'success', persist: true, @@ -46,11 +52,13 @@ export default function CreateUser() { 'data-test': 'snackbar-create-user-success', }, }); + navigate(URLS.USERS); } catch (error) { throw new Error('Failed while creating!'); } }; + return ( @@ -101,7 +109,7 @@ export default function CreateUser() { label={formatMessage('userForm.role')} /> )} - loading={rolesLoading} + loading={isRolesLoading} /> diff --git a/packages/web/src/pages/EditUser/index.jsx b/packages/web/src/pages/EditUser/index.jsx index 03f3abed..c13d04b4 100644 --- a/packages/web/src/pages/EditUser/index.jsx +++ b/packages/web/src/pages/EditUser/index.jsx @@ -7,6 +7,7 @@ import MuiTextField from '@mui/material/TextField'; import useEnqueueSnackbar from 'hooks/useEnqueueSnackbar'; import * as React from 'react'; import { useNavigate, useParams } from 'react-router-dom'; + import Can from 'components/Can'; import Container from 'components/Container'; import ControlledAutocomplete from 'components/ControlledAutocomplete'; @@ -18,17 +19,21 @@ import { UPDATE_USER } from 'graphql/mutations/update-user.ee'; import useFormatMessage from 'hooks/useFormatMessage'; import useRoles from 'hooks/useRoles.ee'; import useUser from 'hooks/useUser'; + function generateRoleOptions(roles) { return roles?.map(({ name: label, id: value }) => ({ label, value })); } + export default function EditUser() { const formatMessage = useFormatMessage(); const [updateUser, { loading }] = useMutation(UPDATE_USER); const { userId } = useParams(); const { user, loading: userLoading } = useUser(userId); - const { roles, loading: rolesLoading } = useRoles(); + const { data, loading: isRolesLoading } = useRoles(); + const roles = data?.data; const enqueueSnackbar = useEnqueueSnackbar(); const navigate = useNavigate(); + const handleUserUpdate = async (userDataToUpdate) => { try { await updateUser({ @@ -43,6 +48,7 @@ export default function EditUser() { }, }, }); + enqueueSnackbar(formatMessage('editUser.successfullyUpdated'), { variant: 'success', SnackbarProps: { @@ -50,11 +56,13 @@ export default function EditUser() { persist: true, }, }); + navigate(URLS.USERS); } catch (error) { throw new Error('Failed while updating!'); } }; + return ( @@ -106,7 +114,7 @@ export default function EditUser() { label={formatMessage('userForm.role')} /> )} - loading={rolesLoading} + loading={isRolesLoading} />