From 73bc198804ba5ba7753d5eb8e65a4309f4821d5f Mon Sep 17 00:00:00 2001 From: Nikhil Trehan Date: Sat, 28 Sep 2024 13:17:02 -0400 Subject: [PATCH 1/2] Added Super User Functionality --- backend/models/user.model.js | 2 +- .../src/components/user-admin/EditUsers.jsx | 58 +++++++++++-------- client/src/sass/UserAdmin.scss | 8 ++- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/backend/models/user.model.js b/backend/models/user.model.js index 5ff3ddacd..4c2005cc6 100644 --- a/backend/models/user.model.js +++ b/backend/models/user.model.js @@ -11,7 +11,7 @@ const userSchema = mongoose.Schema({ email: { type: String, unique: true }, accessLevel: { type: String, - enum: ["user", "admin"], // restricts values to "user" and "admin" + enum: ["user", "admin", "superadmin"], // restricts values to "user", "admin" and "superadmin" default: "user" }, createdDate: { type: Date, default: Date.now }, diff --git a/client/src/components/user-admin/EditUsers.jsx b/client/src/components/user-admin/EditUsers.jsx index 929ec9055..a223327ac 100644 --- a/client/src/components/user-admin/EditUsers.jsx +++ b/client/src/components/user-admin/EditUsers.jsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react'; import '../../sass/UserAdmin.scss'; -import { FormGroup, FormControlLabel, Switch } from '@mui/material' +import { FormGroup, FormControlLabel, Switch } from '@mui/material'; // child of UserAdmin. Displays form to update users. const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUserActiveStatus, updateUserAccessLevel }) => { @@ -9,6 +9,9 @@ const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUse const [isActive, setIsActive] = useState(userToEdit.isActive); const [isAdmin, setIsAdmin] = useState(userToEdit.accessLevel === "admin"); + // Function to check if the current user is the super admin + const isSuperAdmin = userToEdit.accessLevel === "superadmin"; + // Prepare data for display const userName = `${userToEdit.name?.firstName} ${userToEdit.name?.lastName}`; const userEmail = userToEdit.email; @@ -18,7 +21,6 @@ const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUse const activeProjects = Object.values(projects) .filter((project) => project.projectStatus === 'Active') .sort((a, b) => a.name?.localeCompare(b.name)) - // eslint-disable-next-line no-underscore-dangle .map((p) => [p._id, p.name]); // add user projects to state @@ -35,11 +37,7 @@ const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUse const onSubmit = (event) => { event.preventDefault(); - if ( - projectValue.length > 0 && - projectValue !== 'default' && - !userManagedProjects.includes(projectValue) - ) { + if (!isSuperAdmin && projectValue.length > 0 && projectValue !== 'default' && !userManagedProjects.includes(projectValue)) { const newProjects = [...userManagedProjects, projectValue]; updateUserDb(userToEdit, newProjects); setUserManagedProjects(newProjects); @@ -51,24 +49,26 @@ const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUse // Remove projects from db const handleRemoveProject = (projectToRemove) => { - if (userManagedProjects.length > 0) { - const newProjects = userManagedProjects.filter( - (p) => p !== projectToRemove - ); + if (!isSuperAdmin && userManagedProjects.length > 0) { + const newProjects = userManagedProjects.filter((p) => p !== projectToRemove); updateUserDb(userToEdit, newProjects); setUserManagedProjects(newProjects); } }; const handleSetIsActive = () => { - setIsActive(!isActive) - updateUserActiveStatus(userToEdit, !isActive) - } + if (!isSuperAdmin) { + setIsActive(!isActive); + updateUserActiveStatus(userToEdit, !isActive); + } + }; const handleSetAccessLevel = () => { - const newAccessLevel = isAdmin ? "user" : "admin"; - setIsAdmin(!isAdmin); - updateUserAccessLevel(userToEdit, newAccessLevel); + if (!isSuperAdmin) { + const newAccessLevel = isAdmin ? "user" : "admin"; + setIsAdmin(!isAdmin); + updateUserAccessLevel(userToEdit, newAccessLevel); + } }; return ( @@ -86,16 +86,24 @@ const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUse
{isActive.toString()} - } onClick={() => handleSetIsActive()} /> + } + onClick={handleSetIsActive} + />
-
VRSM Admin:
+
VRMS Admin:
- {isAdmin ? "Yes" : "No"} + {isAdmin || isSuperAdmin ? "Yes" : "No"} - } onClick={() => handleSetAccessLevel()} /> + } + onClick={handleSetAccessLevel} + />
@@ -110,6 +118,7 @@ const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUse
diff --git a/client/src/sass/UserAdmin.scss b/client/src/sass/UserAdmin.scss index adf81a32e..44f37466a 100644 --- a/client/src/sass/UserAdmin.scss +++ b/client/src/sass/UserAdmin.scss @@ -61,14 +61,14 @@ .user-display-column-right { display: flex; flex-direction: column; - flex-basis: 85%; + flex-basis: 80%; margin-bottom: 8px; } .user-toggle-column-left { display: flex; flex-direction: column; - flex-basis: 15%; + flex-basis: 20%; } .toggle-status { @@ -108,6 +108,10 @@ margin-top: 10px; margin-bottom: 10px; } +.button-add-disabled { + opacity: 0.5; + cursor: not-allowed; +} .button-back { background-color: black; From 272c8d9a3e79083ed181a06a8e591e6d512df9e8 Mon Sep 17 00:00:00 2001 From: Nikhil Trehan Date: Wed, 16 Oct 2024 00:37:27 -0400 Subject: [PATCH 2/2] Modified a comment to improve semantics --- client/src/components/user-admin/EditUsers.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/components/user-admin/EditUsers.jsx b/client/src/components/user-admin/EditUsers.jsx index a223327ac..894a3628c 100644 --- a/client/src/components/user-admin/EditUsers.jsx +++ b/client/src/components/user-admin/EditUsers.jsx @@ -9,7 +9,7 @@ const EditUsers = ({ userToEdit, backToSearch, updateUserDb, projects, updateUse const [isActive, setIsActive] = useState(userToEdit.isActive); const [isAdmin, setIsAdmin] = useState(userToEdit.accessLevel === "admin"); - // Function to check if the current user is the super admin + // Boolean to check if the current user is the super admin const isSuperAdmin = userToEdit.accessLevel === "superadmin"; // Prepare data for display