import { Button, Popconfirm, Popover, Select, Space, Table, Typography, notification, } from "antd"; import { Constants, FormatDatetime, getConnectionStatusItem, hasOnePermission, hasPermission, myFetch, wsConnectionCustomEventName, } from "../../utils"; import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { UserAddOutlined } from "@ant-design/icons"; import CreateUserModal from "./CreateUserModal"; import { useTranslation } from "react-i18next"; import { MyAvatar } from "../../Components/MyAvatar"; import { useUsersContext } from "../../Contexts/UsersContext"; import { useAppContext } from "../../Contexts/AppContext"; import { useWebSocketContext } from "../../Contexts/WebSocketContext"; import { SentMessagesCommands } from "../../Handlers/WebSocketMessageHandler"; export default function AllUsers() { const webSocketContext = useWebSocketContext(); const appContext = useAppContext(); const usersContext = useUsersContext(); const { t } = useTranslation(); const [selectedRoleId, setSelectedRoleId] = useState(""); const [notificationApi, notificationContextHolder] = notification.useNotification(); const [isCreateUserModalOpen, setIsCreateUserModalOpen] = useState(false); const getTableContent = () => { let items = [ { title: t("allUsers.column.avatar"), dataIndex: "avatar", key: "avatar", }, { title: t("allUsers.column.username"), dataIndex: "username", key: "username", }, { title: t("allUsers.column.role"), dataIndex: "role", key: "role", }, { title: t("allUsers.column.connectionStatus"), dataIndex: "connectionStatus", key: "connectionStatus", }, { title: t("allUsers.column.lastOnline"), dataIndex: "lastOnline", key: "lastOnline", }, ]; if ( hasOnePermission( appContext.userPermissions, Constants.PERMISSIONS.ALL_USERS.ACTION.CHANGE_ROLE, Constants.PERMISSIONS.ALL_USERS.ACTION.DELETE_USER, Constants.PERMISSIONS.ALL_USERS.ACTION.DEACTIVATE_USER ) ) { items.push({ title: t("allUsers.column.action.title"), key: "action", render: (_, record) => ( {hasPermission( appContext.userPermissions, Constants.PERMISSIONS.ALL_USERS.ACTION.CHANGE_ROLE ) && (usersContext.roles.find( (role) => role.Id === usersContext.roleId ).SortingOrder < usersContext.roles.find((role) => role.Id === record._roleId) .SortingOrder || usersContext.roles.find( (role) => role.Id === usersContext.roleId ).Master) && ( onRoleChangeConfirm(record.key)} okButtonProps={{ disabled: selectedRoleId === usersContext.users.find((user) => user.Id === record.key) .RoleId, }} description={ } > { setSelectedRoleId( usersContext.users.find( (user) => user.Id === record.key ).RoleId ); }} > {t("allUsers.column.action.changeRole")} )} {hasPermission( appContext.userPermissions, Constants.PERMISSIONS.ALL_USERS.ACTION.DELETE_USER ) && (usersContext.roles.find( (role) => role.Id === usersContext.roleId ).SortingOrder < usersContext.roles.find((role) => role.Id === record._roleId) .SortingOrder || usersContext.roles.find( (role) => role.Id === usersContext.roleId ).Master) && ( onUserDeletionConfirm(record.key)} > {t("allUsers.column.action.delete.link")} )} {!usersContext.users.find((user) => user.Id === record.key) .Deactivated ? hasPermission( appContext.userPermissions, Constants.PERMISSIONS.ALL_USERS.ACTION.USER_DEACTIVATION ) && (usersContext.roles.find( (role) => role.Id === usersContext.roleId ).SortingOrder < usersContext.roles.find((role) => role.Id === record._roleId) .SortingOrder || usersContext.roles.find( (role) => role.Id === usersContext.roleId ).Master) && ( onUserDeactivationConfirm(record.key, true) } > {t("allUsers.column.action.deactivate.link")} ) : hasPermission( appContext.userPermissions, Constants.PERMISSIONS.ALL_USERS.ACTION.USER_DEACTIVATION ) && (usersContext.roles.find( (role) => role.Id === usersContext.roleId ).SortingOrder < usersContext.roles.find((role) => role.Id === record._roleId) .SortingOrder || usersContext.roles.find( (role) => role.Id === usersContext.roleId ).Master) && ( onUserDeactivationConfirm(record.key, false) } > {t("allUsers.column.action.activate.link")} )} ), }); } return items; }; const activatedUsers = usersContext.users.filter( (user) => user.Deactivated === false ); const deactivatedUsers = usersContext.users.filter( (user) => user.Deactivated === true ); const getTableItems = (users) => { let items = []; users.sort( (a, b) => usersContext.roles.find((r) => r.Id === a.RoleId).SortingOrder - usersContext.roles.find((r) => r.Id === b.RoleId).SortingOrder ); users.forEach((user) => { items.push({ key: user.Id, avatar: ( } > <> ), role: usersContext.roles.find((role) => role.Id === user.RoleId) .DisplayName, _roleId: user.RoleId, // used as reference for user deletion connectionStatus: getConnectionStatusItem(user.ConnectionStatus), username: user.Username, lastOnline: FormatDatetime(user.LastOnline), }); }); return items; }; const onRoleChangeConfirm = (targetUserId) => { const existsRole = usersContext.roles.find( (role) => role.Id === selectedRoleId ); if (existsRole === undefined) { notificationApi["error"]({ message: t("allUsers.roleChangeError.notification.message"), description: t("allUsers.roleChangeError.notification.description"), }); return; } webSocketContext.SendSocketMessage( SentMessagesCommands.AllUsersUpdateUserRole, { UserId: targetUserId, RoleId: selectedRoleId, } ); }; const onUserDeletionConfirm = (userId) => { webSocketContext.SendSocketMessage( SentMessagesCommands.AllUsersDeleteUser, { UserId: userId, } ); }; const onUserDeactivationConfirm = (userId, deactivate) => { webSocketContext.SendSocketMessage( SentMessagesCommands.AllUsersUserDeactivation, { UserId: userId, Deactivation: deactivate, } ); }; useEffect(() => { const usersRequest = () => myFetch("/users", "GET").then((data) => { usersContext.setRoleId(data.RoleId); usersContext.setUsers(data.Users); usersContext.setRoles(data.Roles); }); usersRequest(); const handleUsersRequest = () => usersRequest(); document.addEventListener(wsConnectionCustomEventName, handleUsersRequest); return () => document.removeEventListener( wsConnectionCustomEventName, handleUsersRequest ); }, []); return ( <> {notificationContextHolder}
{t("allUsers.header.allUsers")} ({activatedUsers.length}) {hasPermission( appContext.userPermissions, Constants.PERMISSIONS.ALL_USERS.CREATE_NEW_USER ) && ( )}
{hasPermission( appContext.userPermissions, Constants.PERMISSIONS.ALL_USERS.ACTION.USER_DEACTIVATION ) && deactivatedUsers.length > 0 && ( <> {t("allUsers.header.deactivatedUsers")} ({deactivatedUsers.length} )
)} ); }