From 3b7f1b876f87c604e74dd4ac885e4fa06e07dfe2 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 23 Jul 2024 11:25:25 -0700 Subject: [PATCH 1/2] Updated register page and validation to new role schema --- Client/src/Pages/Auth/Register/Register.jsx | 6 +- Client/src/Validation/validation.js | 4 +- Server/validation/joi.js | 2 +- tq | 62 +++++++++++++++++++++ 4 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 tq diff --git a/Client/src/Pages/Auth/Register/Register.jsx b/Client/src/Pages/Auth/Register/Register.jsx index 1eaa99f89..a5db76373 100644 --- a/Client/src/Pages/Auth/Register/Register.jsx +++ b/Client/src/Pages/Auth/Register/Register.jsx @@ -14,10 +14,12 @@ import { credentials } from "../../../Validation/validation"; import { createToast } from "../../../Utils/toastUtils"; import Field from "../../../Components/Inputs/Field"; import { register } from "../../../Features/Auth/authSlice"; +import { useParams } from "react-router-dom"; const Register = ({ isAdmin }) => { const dispatch = useDispatch(); const navigate = useNavigate(); + const { token } = useParams(); const theme = useTheme(); // TODO If possible, change the IDs of these fields to match the backend @@ -35,14 +37,14 @@ const Register = ({ isAdmin }) => { email: "", password: "", confirm: "", - role: "", + role: [], }); const [errors, setErrors] = useState({}); const handleSubmit = async (e) => { e.preventDefault(); - const registerForm = { ...form, role: isAdmin ? "admin" : "user" }; + const registerForm = { ...form, role: isAdmin ? ["admin"] : [] }; const { error } = credentials.validate(registerForm, { abortEarly: false, context: { password: form.password }, diff --git a/Client/src/Validation/validation.js b/Client/src/Validation/validation.js index 779b7c58e..00d5a1d49 100644 --- a/Client/src/Validation/validation.js +++ b/Client/src/Validation/validation.js @@ -68,9 +68,7 @@ const credentials = joi.object({ } return value; }), - role: joi.string().messages({ - "string.empty": "Role is required", - }), + role: joi.array().required(), }); const monitorValidation = joi.object({ diff --git a/Server/validation/joi.js b/Server/validation/joi.js index a0c5857cb..ec773632c 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -44,7 +44,7 @@ const registerValidation = joi.object({ /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*()])[A-Za-z0-9!@#$%^&*()]+$/ ), profileImage: joi.any(), - role: joi.string().required(), + role: joi.array().required(), }); const editUserParamValidation = joi.object({ diff --git a/tq b/tq new file mode 100644 index 000000000..e5dcc3bab --- /dev/null +++ b/tq @@ -0,0 +1,62 @@ +diff --git a/Client/src/Pages/Auth/Register/Register.jsx b/Client/src/Pages/Auth/Register/Register.jsx +index 1eaa99f..a5db763 100644 +--- a/Client/src/Pages/Auth/Register/Register.jsx ++++ b/Client/src/Pages/Auth/Register/Register.jsx +@@ -14,10 +14,12 @@ import { credentials } from "../../../Validation/validation"; + import { createToast } from "../../../Utils/toastUtils"; + import Field from "../../../Components/Inputs/Field"; + import { register } from "../../../Features/Auth/authSlice"; ++import { useParams } from "react-router-dom"; +  + const Register = ({ isAdmin }) => { + const dispatch = useDispatch(); + const navigate = useNavigate(); ++ const { token } = useParams(); + const theme = useTheme(); +  + // TODO If possible, change the IDs of these fields to match the backend +@@ -35,14 +37,14 @@ const Register = ({ isAdmin }) => { + email: "", + password: "", + confirm: "", +- role: "", ++ role: [], + }); + const [errors, setErrors] = useState({}); +  + const handleSubmit = async (e) => { + e.preventDefault(); +  +- const registerForm = { ...form, role: isAdmin ? "admin" : "user" }; ++ const registerForm = { ...form, role: isAdmin ? ["admin"] : [] }; + const { error } = credentials.validate(registerForm, { + abortEarly: false, + context: { password: form.password }, +diff --git a/Client/src/Validation/validation.js b/Client/src/Validation/validation.js +index 779b7c5..00d5a1d 100644 +--- a/Client/src/Validation/validation.js ++++ b/Client/src/Validation/validation.js +@@ -68,9 +68,7 @@ const credentials = joi.object({ + } + return value; + }), +- role: joi.string().messages({ +- "string.empty": "Role is required", +- }), ++ role: joi.array().required(), + }); +  + const monitorValidation = joi.object({ +diff --git a/Server/validation/joi.js b/Server/validation/joi.js +index a0c5857..ec77363 100644 +--- a/Server/validation/joi.js ++++ b/Server/validation/joi.js +@@ -44,7 +44,7 @@ const registerValidation = joi.object({ + /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*()])[A-Za-z0-9!@#$%^&*()]+$/ + ), + profileImage: joi.any(), +- role: joi.string().required(), ++ role: joi.array().required(), + }); +  + const editUserParamValidation = joi.object({ From ab70996afeda10e6e3e99a0cf4144d56315bb618 Mon Sep 17 00:00:00 2001 From: Daniel Cojocea Date: Tue, 23 Jul 2024 14:36:15 -0400 Subject: [PATCH 2/2] Updated team panel to use new role schema --- .../Components/TabPanels/Account/TeamPanel.jsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Client/src/Components/TabPanels/Account/TeamPanel.jsx b/Client/src/Components/TabPanels/Account/TeamPanel.jsx index eec8fae28..77b8ba12b 100644 --- a/Client/src/Components/TabPanels/Account/TeamPanel.jsx +++ b/Client/src/Components/TabPanels/Account/TeamPanel.jsx @@ -44,7 +44,7 @@ const TeamPanel = () => { }); const [toInvite, setToInvite] = useState({ email: "", - role: "", + role: [""], }); const [tableData, setTableData] = useState({}); const [members, setMembers] = useState([]); @@ -72,7 +72,7 @@ const TeamPanel = () => { useEffect(() => { let team = members; if (filter !== "all") - team = members.filter((member) => member.role[0] === filter); + team = members.filter((member) => member.role.includes(filter)); const data = { cols: [ @@ -104,7 +104,7 @@ const TeamPanel = () => { { // TODO - Add select dropdown id: idx + 2, - data: member.role[0] === "admin" ? "Administrator" : "Member", + data: member.role.includes("admin") ? "Administrator" : "Member", }, { // TODO - Add delete onClick @@ -167,8 +167,8 @@ const TeamPanel = () => { }; const handleInviteMember = async () => { - if (toInvite.role !== "user" || toInvite !== "admin") - setToInvite((prev) => ({ ...prev, role: "user" })); + if (!toInvite.role.includes("user") || !toInvite.role.includes("admin")) + setToInvite((prev) => ({ ...prev, role: ["user"] })); const { error } = credentials.validate( { email: toInvite.email }, @@ -185,7 +185,7 @@ const TeamPanel = () => { "/auth/invite", { email: toInvite.email, - role: toInvite.role, + role: [toInvite.role], }, { headers: { Authorization: `Bearer ${authToken}` } } ); @@ -202,7 +202,7 @@ const TeamPanel = () => { }; const closeInviteModal = () => { setIsOpen(false); - setToInvite({ email: "", role: "" }); + setToInvite({ email: "", role: [""] }); setErrors({}); }; @@ -368,11 +368,11 @@ const TeamPanel = () => { />