diff --git a/backend/models/user.model.js b/backend/models/user.model.js index 1424a3753..715dc9046 100644 --- a/backend/models/user.model.js +++ b/backend/models/user.model.js @@ -36,7 +36,8 @@ const userSchema = mongoose.Schema({ managedProjects: [{ type: String}], // Which projects managed by user. //currentProject: { type: String } // no longer need this as we can get it from Project Team Member table // password: { type: String, required: true } - isActive: { type: Boolean, default: true } + isActive: { type: Boolean, default: true }, + isAdmin: {type: Boolean, default: false} // Signifies if a user is an admin or not }); userSchema.methods.serialize = function () { @@ -67,7 +68,8 @@ userSchema.methods.serialize = function () { githubPublic2FA: this.githubPublic2FA, availability: this.availability, managedProjects: this.managedProjects, - isActive: this.isActive + isActive: this.isActive, + isAdmin: this.isAmdin }; }; diff --git a/client/src/api/UserApiService.js b/client/src/api/UserApiService.js index d0c5506de..a6b16eddf 100644 --- a/client/src/api/UserApiService.js +++ b/client/src/api/UserApiService.js @@ -73,6 +73,22 @@ class UserApiService { alert('server not responding. Please try again.'); } } + + async updateUserDbIsAdmin(userToEdit, isAdmin) { + const url = `${this.baseUserUrl}${userToEdit._id}`; + const requestOptions = { + method: 'PATCH', + headers: this.headers, + body: JSON.stringify({ isAdmin }), + }; + + try { + return await fetch(url, requestOptions); + } catch (err) { + console.error('update is-admin error', err); + alert('server not responding. Please try again.'); + } + } } export default UserApiService; diff --git a/client/src/components/user-admin/EditUsers.jsx b/client/src/components/user-admin/EditUsers.jsx index 1e5f72e93..d5426302c 100644 --- a/client/src/components/user-admin/EditUsers.jsx +++ b/client/src/components/user-admin/EditUsers.jsx @@ -3,10 +3,11 @@ import '../../sass/UserAdmin.scss'; import { FormGroup, FormControlLabel, Switch } from '@mui/material' // child of UserAdmin. Displays form to update users. -const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUserActiveStatus }) => { +const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUserActiveStatus, updateUserAdminStatus }) => { const [userManagedProjects, setUserManagedProjects] = useState([]); // The projects that the selected user is assigned const [projectValue, setProjectValue] = useState(''); // State and handler for form in EditUsers const [isActive, setIsActive] = useState(userToEdit.isActive); + const [isAdmin, setIsAdmin] = useState(userToEdit.isAdmin); // Prepare data for display const userName = `${userToEdit.name?.firstName} ${userToEdit.name?.lastName}`; @@ -64,6 +65,10 @@ const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUse updateUserActiveStatus(userToEdit, !isActive) } + const handleSetIsAdmin = () => { + setIsAdmin(!isAdmin) + updateUserAdminStatus(userToEdit, !isAdmin) + } return (
@@ -74,15 +79,24 @@ const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUse
Email:
{userEmail}
-
-
Is Active:
-
- {isActive.toString()} +
+
Is Active:
+
+ {isActive.toString()} } onClick={() => handleSetIsActive()} />
+
+
Is Admin:
+
+ {isAdmin.toString()} + + } onClick={() => handleSetIsAdmin()} /> + +
+
Projects:
diff --git a/client/src/pages/UserAdmin.jsx b/client/src/pages/UserAdmin.jsx index c540082ff..b501ca5e0 100644 --- a/client/src/pages/UserAdmin.jsx +++ b/client/src/pages/UserAdmin.jsx @@ -37,6 +37,13 @@ const UserAdmin = () => { }, [userApiService, fetchUsers] ) + const updateUserAdminStatus = useCallback( + async (user, isAdmin) => { + await userApiService.updateUserDbIsAdmin(user, isAdmin); + fetchUsers() + }, [userApiService, fetchUsers] + ) + const fetchProjects = useCallback(async () => { const projectRes = await projectApiService.fetchProjects(); setProjects(projectRes); @@ -65,6 +72,7 @@ const UserAdmin = () => { updateUserDb={updateUserDb} backToSearch={backToSearch} updateUserActiveStatus={updateUserActiveStatus} + updateUserAdminStatus={updateUserAdminStatus} /> ); } diff --git a/client/src/sass/UserAdmin.scss b/client/src/sass/UserAdmin.scss index 0d3759edb..adf81a32e 100644 --- a/client/src/sass/UserAdmin.scss +++ b/client/src/sass/UserAdmin.scss @@ -65,18 +65,18 @@ margin-bottom: 8px; } -.user-is-active-column-left { +.user-toggle-column-left { display: flex; flex-direction: column; flex-basis: 15%; } -.active-status { +.toggle-status { margin-right: 15px; width: 25px; } -.is-active-flex { +.toggle-flex { display: flex; align-items: center; }