diff --git a/ui/src/app/admin/component/UserMaintenance.js b/ui/src/app/admin/component/UserMaintenance.js index cf083e6b3..45b6d7acb 100644 --- a/ui/src/app/admin/component/UserMaintenance.js +++ b/ui/src/app/admin/component/UserMaintenance.js @@ -12,12 +12,15 @@ import { useCurrentUser } from '../../core/user/UserContext'; import { GroupsProvider } from '../hoc/GroupsProvider'; import { useTranslator } from '../../i18n/hooks'; +import Spinner from '../../core/components/Spinner'; -export default function UserMaintenance({ users, roles, loading, onDeleteUser, onChangeUserRole, onChangeUserGroup }) { +export default function UserMaintenance({ users, roles, loading, onDeleteUser, onChangeUserRole, onChangeUserGroup, updating = [] }) { const currentUser = useCurrentUser(); const translator = useTranslator(); + const isUpdating = React.useCallback((username) => updating.find(u => u === username), [updating]); + return (
@@ -41,19 +44,26 @@ export default function UserMaintenance({ users, roles, loading, onDeleteUser, o
{user.firstName} {user.lastName} {user.emailAddress} - - onChangeUserRole({user, role: event.target.value})} - defaultValue={user.role} - disabled={loading || currentUser.username === user.username} - disablevalidation="true"> - {roles.map((role, ridx) => ( - - ))} - + + + onChangeUserRole({user, role: event.target.value})} + value={user.role} + disabled={ isUpdating(user.username) || loading || currentUser.username === user.username} + disablevalidation="true"> + {roles.map((role, ridx) => ( + + ))} + + + + + { + setUpdating([...updating, user.username]); + Object.assign(user, {role}); + setUserRoleRequest({ user, role }).unwrap().then(() => setUpdating(updating.filter(u => u !== user.username))); + }, [updating, setUserRoleRequest]); + /*eslint-disable react-hooks/exhaustive-deps*/ React.useEffect(() => { @@ -40,9 +49,13 @@ export default function UserManagement({ users, children, reload}) { setDeleting(null); }; + React.useEffect(() => { + setCloned(cloneDeep(users)); + }, [users]); + return (
- {children(users, roles, setUserRoleRequest, setUserGroupRequest, (id) => setDeleting(id), loading)} + {children(cloned, roles, onChangeUserRole, setUserGroupRequest, (id) => setDeleting(id), loading, updating)} setDeleting(null)}> Delete User? diff --git a/ui/src/app/dashboard/view/AdminTab.js b/ui/src/app/dashboard/view/AdminTab.js index 01f5271c9..a5b3f8ba8 100644 --- a/ui/src/app/dashboard/view/AdminTab.js +++ b/ui/src/app/dashboard/view/AdminTab.js @@ -22,13 +22,14 @@ export function AdminTab () {
- {(u, roles, onChangeUserRole, onChangeUserGroup, onDeleteUser, loading) => + {(u, roles, onChangeUserRole, onChangeUserGroup, onDeleteUser, loading, updating) => } + onChangeUserGroup={onChangeUserGroup} + updating={updating} />} {loading &&
}