diff --git a/packages/web/src/components/DeleteRoleButton/index.ee.tsx b/packages/web/src/components/DeleteRoleButton/index.ee.tsx index ad3f366f..cd7e9dfb 100644 --- a/packages/web/src/components/DeleteRoleButton/index.ee.tsx +++ b/packages/web/src/components/DeleteRoleButton/index.ee.tsx @@ -9,7 +9,7 @@ import useFormatMessage from 'hooks/useFormatMessage'; type DeleteRoleButtonProps = { roleId: string; -} +}; export default function DeleteRoleButton(props: DeleteRoleButtonProps) { const { roleId } = props; diff --git a/packages/web/src/components/DeleteUserButton/index.ee.tsx b/packages/web/src/components/DeleteUserButton/index.ee.tsx index 428cb953..c4212ea9 100644 --- a/packages/web/src/components/DeleteUserButton/index.ee.tsx +++ b/packages/web/src/components/DeleteUserButton/index.ee.tsx @@ -9,7 +9,7 @@ import useFormatMessage from 'hooks/useFormatMessage'; type DeleteUserButtonProps = { userId: string; -} +}; export default function DeleteUserButton(props: DeleteUserButtonProps) { const { userId } = props; diff --git a/packages/web/src/components/ListLoader/index.tsx b/packages/web/src/components/ListLoader/index.tsx new file mode 100644 index 00000000..3e556554 --- /dev/null +++ b/packages/web/src/components/ListLoader/index.tsx @@ -0,0 +1,47 @@ +import { + IconButton, + Skeleton, + Stack, + TableCell, + TableRow, +} from '@mui/material'; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/Delete'; + +type ListLoaderProps = { + rowsNumber: number; + cellNumber: number; +}; + +const ListLoader = ({ rowsNumber, cellNumber }: ListLoaderProps) => { + return ( + <> + {[...Array(rowsNumber)].map((row, index) => ( + + {[...Array(cellNumber)].map((cell, index) => ( + + + + ))} + + + + + + + + + + + + + + ))} + + ); +}; + +export default ListLoader; diff --git a/packages/web/src/components/RoleList/index.ee.tsx b/packages/web/src/components/RoleList/index.ee.tsx index 6b74731e..65353c03 100644 --- a/packages/web/src/components/RoleList/index.ee.tsx +++ b/packages/web/src/components/RoleList/index.ee.tsx @@ -13,15 +13,15 @@ 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'; // TODO: introduce interaction feedback upon deletion (successful + failure) -// TODO: introduce loading bar export default function RoleList(): React.ReactElement { const formatMessage = useFormatMessage(); - const { roles } = useRoles(); + const { roles, loading } = useRoles(); return ( @@ -50,42 +50,40 @@ export default function RoleList(): React.ReactElement { - {roles.map((role) => ( - - - - {role.name} - - + {loading ? ( + + ) : ( + roles.map((role) => ( + + + {role.name} + - - - {role.description} - - + + + {role.description} + + - - - - - + + + + + - - - - - ))} + + + + + )) + )} diff --git a/packages/web/src/components/UserList/index.tsx b/packages/web/src/components/UserList/index.tsx index 2315ad8f..f2ab3941 100644 --- a/packages/web/src/components/UserList/index.tsx +++ b/packages/web/src/components/UserList/index.tsx @@ -13,13 +13,13 @@ import Typography from '@mui/material/Typography'; import EditIcon from '@mui/icons-material/Edit'; import DeleteUserButton from 'components/DeleteUserButton/index.ee'; +import ListLoader from 'components/ListLoader'; import useUsers from 'hooks/useUsers'; import useFormatMessage from 'hooks/useFormatMessage'; import * as URLS from 'config/urls'; // TODO: introduce translation entries // TODO: introduce interaction feedback upon deletion (successful + failure) -// TODO: introduce loading bar export default function UserList(): React.ReactElement { const formatMessage = useFormatMessage(); const { users, loading } = useUsers(); @@ -51,42 +51,38 @@ export default function UserList(): React.ReactElement { - {users.map((user) => ( - - - - {user.fullName} - - + {loading ? ( + + ) : ( + users.map((user) => ( + + + {user.fullName} + - - - {user.email} - - + + {user.email} + - - - - - + + + + + - - - - - ))} + + + + + )) + )} diff --git a/packages/web/src/pages/EditRole/index.ee.tsx b/packages/web/src/pages/EditRole/index.ee.tsx index e64aff02..d7efc11e 100644 --- a/packages/web/src/pages/EditRole/index.ee.tsx +++ b/packages/web/src/pages/EditRole/index.ee.tsx @@ -13,13 +13,13 @@ import PageTitle from 'components/PageTitle'; import Form from 'components/Form'; import TextField from 'components/TextField'; import useFormatMessage from 'hooks/useFormatMessage'; +import { Skeleton } from '@mui/material'; type EditRoleParams = { roleId: string; -} +}; // TODO: introduce interaction feedback upon deletion (successful + failure) -// TODO: introduce loading bar export default function EditRole(): React.ReactElement { const formatMessage = useFormatMessage(); const [updateRole, { loading }] = useMutation(UPDATE_ROLE); @@ -33,13 +33,11 @@ export default function EditRole(): React.ReactElement { id: roleId, name: roleData.name, description: roleData.description, - } - } + }, + }, }); }; - if (roleLoading) return ; - return ( @@ -48,33 +46,41 @@ export default function EditRole(): React.ReactElement { -
+ {roleLoading ? ( - - - - - - {formatMessage('editRole.submit')} - + + + -
+ ) : ( +
+ + + + + + + {formatMessage('editRole.submit')} + + +
+ )}
diff --git a/packages/web/src/pages/EditUser/index.tsx b/packages/web/src/pages/EditUser/index.tsx index 06be358c..f2f20785 100644 --- a/packages/web/src/pages/EditUser/index.tsx +++ b/packages/web/src/pages/EditUser/index.tsx @@ -16,17 +16,17 @@ import Form from 'components/Form'; import ControlledAutocomplete from 'components/ControlledAutocomplete'; import TextField from 'components/TextField'; import useFormatMessage from 'hooks/useFormatMessage'; +import { Skeleton } from '@mui/material'; type EditUserParams = { userId: string; -} +}; function generateRoleOptions(roles: IRole[]) { return roles?.map(({ name: label, id: value }) => ({ label, value })); } // TODO: introduce interaction feedback upon deletion (successful + failure) -// TODO: introduce loading bar export default function EditUser(): React.ReactElement { const formatMessage = useFormatMessage(); const [updateUser, { loading }] = useMutation(UPDATE_USER); @@ -42,15 +42,13 @@ export default function EditUser(): React.ReactElement { fullName: userDataToUpdate.fullName, email: userDataToUpdate.email, role: { - id: userDataToUpdate.role?.id - } - } - } + id: userDataToUpdate.role?.id, + }, + }, + }, }); }; - if (userLoading) return ; - return ( @@ -59,43 +57,57 @@ export default function EditUser(): React.ReactElement { -
+ {userLoading ? ( - - - - - } - loading={rolesLoading} - /> - - - {formatMessage('editUser.submit')} - + + + + -
+ ) : ( +
+ + + + + + ( + + )} + loading={rolesLoading} + /> + + + {formatMessage('editUser.submit')} + + +
+ )}