diff --git a/Client/src/Components/TabPanels/Account/TeamPanel.jsx b/Client/src/Components/TabPanels/Account/TeamPanel.jsx index 59ed4fb88..5fda4cc0f 100644 --- a/Client/src/Components/TabPanels/Account/TeamPanel.jsx +++ b/Client/src/Components/TabPanels/Account/TeamPanel.jsx @@ -2,8 +2,8 @@ import { useTheme } from "@emotion/react"; import TabPanel from "@mui/lab/TabPanel"; import { Box, + ButtonGroup, Checkbox, - Container, Divider, MenuItem, Modal, @@ -45,8 +45,9 @@ const TeamPanel = () => { email: "", role: "", }); - const [teamStates, setTeamStates] = useState({}); const [tableData, setTableData] = useState({}); + const [members, setMembers] = useState([]); + const [filter, setFilter] = useState("all"); const [errors, setErrors] = useState({}); useEffect(() => { @@ -55,30 +56,8 @@ const TeamPanel = () => { const response = await axiosInstance.get("/auth/users", { headers: { Authorization: `Bearer ${authToken}` }, }); - setTeamStates({ members: response.data.data, filters: "" }); - const data = { - cols: [ - { id: 1, name: "NAME" }, - { id: 2, name: "EMAIL" }, - { id: 3, name: "ROLE" }, - ], - rows: response.data.data.map((member, idx) => { - return { - id: member._id, - data: [ - { id: idx, data: member.firstName + " " + member.lastName }, - { id: idx + 1, data: member.email }, - { - id: idx + 2, - data: member.role[0] === "admin" ? "Administrator" : "Member", - }, - ], - }; - }), - }; - - setTableData(data); + setMembers(response.data.data); } catch (error) { createToast({ body: error.message || "Error fetching team members.", @@ -89,41 +68,61 @@ const TeamPanel = () => { fetchTeam(); }, []); + useEffect(() => { + let team = members; + if (filter !== "all") + team = members.filter((member) => member.role[0] === filter); + + const data = { + cols: [ + { id: 1, name: "NAME" }, + { id: 2, name: "EMAIL" }, + { id: 3, name: "ROLE" }, + ], + rows: team?.map((member, idx) => { + return { + id: member._id, + data: [ + { + id: idx, + data: ( + + + {member.firstName + " " + member.lastName} + + + Created {new Date(member.createdAt).toLocaleDateString()} + + + ), + }, + { id: idx + 1, data: member.email }, + { + id: idx + 2, + data: member.role[0] === "admin" ? "Administrator" : "Member", + }, + ], + }; + }), + }; + + setTableData(data); + }, [members, filter]); + // RENAME ORGANIZATION const toggleEdit = () => { setOrgStates((prev) => ({ ...prev, isEdit: !prev.isEdit })); }; const handleRename = () => {}; - // TABLE ACTIONS - const handleMembersQuery = (type) => { - let count = 0; - tableData.rows?.forEach((member) => { - type === "" ? count++ : member.data[2].data === type ? count++ : ""; - }); - return count; - }; - - // const handleCheckCell = (id) => { - // const updatedTeamStates = [...teamStates.members]; - // updatedTeamStates[id] = { - // ...updatedTeamStates[id], - // isChecked: !updatedTeamStates[id].isChecked, - // }; - // setTeamStates((prev) => ({ - // ...prev, - // members: updatedTeamStates, - // })); - // }; - // const handleFilter = (filter) => { - // setTeamStates((prev) => ({ - // ...prev, - // filter: filter, - // })); - // }; //TODO - implement save team function const handleSaveTeam = () => {}; + // INVITE MEMBER + const [isOpen, setIsOpen] = useState(false); + const handleChange = (event) => { const { value } = event.target; setToInvite((prev) => ({ @@ -148,8 +147,6 @@ const TeamPanel = () => { }); }; - // INVITE MEMBER - const [isOpen, setIsOpen] = useState(false); const handleInviteMember = async () => { if (toInvite.role !== "user" || toInvite !== "admin") setToInvite((prev) => ({ ...prev, role: "user" })); @@ -193,87 +190,94 @@ const TeamPanel = () => { return ( - - - Organization name - - - - setOrgStates((prev) => ({ - ...prev, - name: event.target.value, - })) - } - disabled={!orgStates.isEdit} - sx={{ - color: theme.palette.otherColors.bluishGray, - "& .Mui-disabled": { - WebkitTextFillColor: "initial !important", - }, - "& .Mui-disabled fieldset": { - borderColor: "transparent !important", - }, - }} - inputProps={{ - sx: { textAlign: "end", padding: theme.gap.small }, - }} - /> - : ""} - onClick={() => toggleEdit()} - sx={{ - minWidth: 0, - paddingX: theme.gap.small, - ml: orgStates.isEdit ? theme.gap.small : 0, - }} - /> - - - + + Organization name + + + + setOrgStates((prev) => ({ + ...prev, + name: event.target.value, + })) + } + disabled={!orgStates.isEdit} + sx={{ + color: theme.palette.otherColors.bluishGray, + "& .Mui-disabled": { + WebkitTextFillColor: "initial !important", + }, + "& .Mui-disabled fieldset": { + borderColor: "transparent !important", + }, + }} + inputProps={{ + sx: { textAlign: "end", padding: theme.gap.small }, + }} + /> + : ""} + onClick={() => toggleEdit()} + sx={{ + minWidth: 0, + paddingX: theme.gap.small, + ml: orgStates.isEdit ? theme.gap.small : 0, + }} + /> + - - - Team members - - + + + Team members + - handleFilter("")}> - All - - {handleMembersQuery("")} - - - handleFilter("admin")}> - Administrator - - {handleMembersQuery("Administrator")} - - - handleFilter("member")}> - Member - - {handleMembersQuery("Member")} - - + + setFilter("all")} + sx={{ backgroundColor: filter === "all" && "#f4f4f4" }} + /> + setFilter("admin")} + sx={{ backgroundColor: filter === "admin" && "#f4f4f4" }} + /> + setFilter("user")} + sx={{ backgroundColor: filter === "user" && "#f4f4f4" }} + /> + { sx={{ paddingX: "30px" }} onClick={() => setIsOpen(true)} /> - + - { onClick={handleSaveTeam} isLoading={false} loadingText="Saving..." + disabled={true} sx={{ paddingX: "40px", }} diff --git a/Client/src/Pages/Account/index.css b/Client/src/Pages/Account/index.css index fef2e5b49..beb655815 100644 --- a/Client/src/Pages/Account/index.css +++ b/Client/src/Pages/Account/index.css @@ -28,8 +28,8 @@ margin: 50px 0; } .account .MuiDivider-root, -.account .MuiOutlinedInput-root fieldset { - border-color: var(--env-var-color-29); +.account .MuiButtonGroup-root button { + border-color: var(--env-var-color-16); } .account [class$="-form"] { width: inherit; @@ -42,8 +42,7 @@ align-items: flex-start; } .edit-profile-form__wrapper > .MuiStack-root:not(.row-stack), -.edit-password-form__wrapper > .MuiStack-root:not(.row-stack), -.edit-organization-form__wrapper > .MuiStack-root:not(.row-stack) { +.edit-password-form__wrapper > .MuiStack-root:not(.row-stack) { flex-direction: column; gap: 8px; margin-right: 10px; @@ -68,21 +67,6 @@ align-items: center; } -.edit-team-form__wrapper td { - padding: 10px 0; - padding-top: 20px; - vertical-align: text-top; -} -.edit-team-form__wrapper th { - padding: var(--env-var-spacing-1) 0; -} -.edit-team-form__wrapper th:first-of-type { - padding-left: 20px; -} -.edit-team-form__wrapper td { - color: var(--env-var-color-25); -} - #select-actions, #select-role { padding: 5px 0; @@ -101,24 +85,6 @@ border-color: var(--env-var-color-2); } -.MuiStack-root:has(.MuiBox-root > .members-query) .MuiBox-root { - cursor: pointer; -} -.members-query { - display: inline-flex; - justify-content: center; - align-items: center; - margin-left: 6px; - padding: 2px; - font-size: 12px; - font-weight: 500; - color: var(--env-var-color-3); - background-color: #e0e9fd; - min-width: 22px; - min-height: 22px; - border-radius: 50%; -} - /* for testing, will remove later */ @media only screen and (max-width: 1600px) { .edit-profile-form__wrapper .MuiStack-root:not(.row-stack), @@ -131,22 +97,10 @@ .account .MuiStack-root:has(span.MuiTypography-root.input-error) { position: relative; } -.account .text-field-icon { - position: absolute; - top: 50%; - transform: translateY(-50%); - width: 18px !important; - height: 18px !important; - opacity: 0.8; -} .account:not(:has(#modal-invite-member)) span.MuiTypography-root.input-error { position: absolute; top: 100%; } -.account .email-text-field, -.account .password-text-field { - margin: 0; -} .edit-profile-form__wrapper .MuiFormControl-root, .edit-password-form__wrapper .MuiFormControl-root { @@ -173,3 +127,14 @@ .MuiInputBase-root:not(.Mui-focused):has(#team-member-role):hover fieldset { border-color: var(--env-var-color-29); } + +.edit-organization-form { + display: flex; + align-items: center; +} +.edit-team-form .MuiTableCell-root { + color: var(--env-var-color-25) !important; +} +.edit-team-form .MuiTableBody-root .MuiTableCell-root { + padding: var(--env-var-spacing-1-plus) var(--env-var-spacing-2) !important; +} \ No newline at end of file diff --git a/Client/src/Pages/Account/index.jsx b/Client/src/Pages/Account/index.jsx index 2bb4dc018..391cf3940 100644 --- a/Client/src/Pages/Account/index.jsx +++ b/Client/src/Pages/Account/index.jsx @@ -38,7 +38,7 @@ const Account = ({ open = "profile" }) => {