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 {
-
+ ) : (
+
+ )}
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 {
-
+ ) : (
+
+ )}