diff --git a/src/Pages/AllUsers/CreateUserModal.js b/src/Pages/AllUsers/CreateUserModal.js index b72a67a..e74d4cc 100644 --- a/src/Pages/AllUsers/CreateUserModal.js +++ b/src/Pages/AllUsers/CreateUserModal.js @@ -8,7 +8,6 @@ import { isEmailValid, } from "../../utils"; import { useContext, useState } from "react"; -import { LockOutlined, MailOutlined, UserOutlined } from "@ant-design/icons"; export default function CreateUserModal({ isModalOpen, setIsModalOpen }) { const webSocketContext = useContext(WebSocketContext); diff --git a/src/Pages/AllUsers/index.js b/src/Pages/AllUsers/index.js index f53e829..3a92e1e 100644 --- a/src/Pages/AllUsers/index.js +++ b/src/Pages/AllUsers/index.js @@ -62,7 +62,8 @@ export default function AllUsers() { hasOnePermission( webSocketContext.User.Permissions, Constants.PERMISSIONS.ALL_USERS.ACTION.CHANGE_ROLE, - Constants.PERMISSIONS.ALL_USERS.ACTION.DELETE_USER + Constants.PERMISSIONS.ALL_USERS.ACTION.DELETE_USER, + Constants.PERMISSIONS.ALL_USERS.ACTION.DEACTIVATE_USER ) ) { items.push({ @@ -161,9 +162,60 @@ export default function AllUsers() { title="Are you sure you want to delete the user?" onConfirm={() => onUserDeletionConfirm(record.key)} > - Delete user + Delete )} + + {!webSocketContext.AllUsers.find((user) => user.Id === record.key) + .Deactivated + ? hasPermission( + webSocketContext.User.Permissions, + Constants.PERMISSIONS.ALL_USERS.ACTION.USER_DEACTIVATION + ) && + (webSocketContext.AllRoles.find( + (role) => role.Id === webSocketContext.User.RoleId + ).SortingOrder < + webSocketContext.AllRoles.find( + (role) => role.Id === record._roleId + ).SortingOrder || + webSocketContext.AllRoles.find( + (role) => role.Id === webSocketContext.User.RoleId + ).Master) && ( + + onUserDeactivationConfirm(record.key, true) + } + > + Deactivate + + ) + : hasPermission( + webSocketContext.User.Permissions, + Constants.PERMISSIONS.ALL_USERS.ACTION.USER_DEACTIVATION + ) && + (webSocketContext.AllRoles.find( + (role) => role.Id === webSocketContext.User.RoleId + ).SortingOrder < + webSocketContext.AllRoles.find( + (role) => role.Id === record._roleId + ).SortingOrder || + webSocketContext.AllRoles.find( + (role) => role.Id === webSocketContext.User.RoleId + ).Master) && ( + + onUserDeactivationConfirm(record.key, false) + } + > + Activate + + )} ), }); @@ -172,16 +224,23 @@ export default function AllUsers() { return items; }; - const getTableItems = () => { + const activatedUsers = webSocketContext.AllUsers.filter( + (user) => user.Deactivated === false + ); + const deactivatedUsers = webSocketContext.AllUsers.filter( + (user) => user.Deactivated === true + ); + + const getTableItems = (users) => { let items = []; - webSocketContext.AllUsers.sort( + users.sort( (a, b) => webSocketContext.AllRoles.find((r) => r.Id === a.RoleId).SortingOrder - webSocketContext.AllRoles.find((r) => r.Id === b.RoleId).SortingOrder ); - webSocketContext.AllUsers.forEach((user) => { + users.forEach((user) => { items.push({ key: user.Id, avatar: ( @@ -238,6 +297,16 @@ export default function AllUsers() { ); }; + const onUserDeactivationConfirm = (userId, deactivate) => { + webSocketContext.SendSocketMessage( + SentMessagesCommands.AllUsersUserDeactivation, + { + UserId: userId, + Deactivation: deactivate, + } + ); + }; + return ( <> {notificationContextHolder} @@ -250,7 +319,7 @@ export default function AllUsers() { }} >

- All users ({webSocketContext.AllUsers.length}) + All users ({activatedUsers.length})

{hasPermission( webSocketContext.User.Permissions, @@ -265,7 +334,26 @@ export default function AllUsers() { )} - +
+ + {hasPermission( + webSocketContext.User.Permissions, + Constants.PERMISSIONS.ALL_USERS.ACTION.USER_DEACTIVATION + ) && + deactivatedUsers.length > 0 && ( + <> +

+ Deactivated users ({deactivatedUsers.length}) +

+
+ + )} { + const showErrorNotification = (errStatus) => { + if (errStatus === 401) { + api["error"]({ + message: "Account deactivated", + description: "Please contact an administrator", + }); + return; + } + api["error"]({ - message: "Login Failed!", + message: "Login failed", description: "Please check your username and password!", }); }; @@ -49,10 +57,7 @@ export default function Login() { setUserSessionToLocalStorage(data.Session); window.location.href = "/"; }) - .catch((err) => { - console.error(err); - showErrorNotification(); - }); + .catch((errStatus) => showErrorNotification(errStatus)); }; return ( diff --git a/src/utils.js b/src/utils.js index bbafc7d..fbbf4b5 100644 --- a/src/utils.js +++ b/src/utils.js @@ -54,6 +54,7 @@ export const Constants = { ACTION: { CHANGE_ROLE: "all_users.action.change_role", DELETE_USER: "all_users.action.delete_user", + USER_DEACTIVATION: "all_users.action.user_deactivation", }, }, SCANNER: { @@ -175,6 +176,7 @@ const ReceivedMessagesCommands = { ErrorNoPermissions: 25, AllUsersNewUserCreated: 26, AllUsersUserDeleted: 27, + AllUsersUserDeactivation: 28, }; // commands sent to the backend server @@ -192,6 +194,7 @@ export const SentMessagesCommands = { AllUsersUpdateUserRole: 11, AllUsersCreateNewUser: 12, AllUsersDeleteUser: 13, + AllUsersUserDeactivation: 14, }; export function WebSocketProvider({ @@ -814,6 +817,17 @@ export function WebSocketProvider({ }); } break; + case ReceivedMessagesCommands.AllUsersUserDeactivation: + setAllUsers((arr) => { + let newArr = [...arr]; + + newArr[ + newArr.findIndex((user) => user.Id === body.UserId) + ].Deactivated = body.Deactivated; + + return newArr; + }); + break; default: console.error("unknown command", cmd);