From fafd581f06a67b191205f8fd7a33215f0b82cefc Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Mon, 9 Feb 2026 18:14:06 +0000 Subject: [PATCH] add team member initial commit --- client/src/Pages/Account/TabTeam.tsx | 10 +++ .../components/AddTeamMemberDialog.tsx | 87 +++++++++++++++++++ .../Account/components/HeaderTeamControls.tsx | 3 + client/src/locales/en.json | 4 + 4 files changed, 104 insertions(+) create mode 100644 client/src/Pages/Account/components/AddTeamMemberDialog.tsx diff --git a/client/src/Pages/Account/TabTeam.tsx b/client/src/Pages/Account/TabTeam.tsx index 308becb2a..731f4eabf 100644 --- a/client/src/Pages/Account/TabTeam.tsx +++ b/client/src/Pages/Account/TabTeam.tsx @@ -4,6 +4,7 @@ import { useState, useMemo } from "react"; import { HeaderTeamControls } from "./components/HeaderTeamControls"; import { TeamTable } from "./components/TeamTable"; import { InviteTeamMemberDialog } from "./components/InviteTeamMemberDialog"; +import { AddTeamMemberDialog } from "./components/AddTeamMemberDialog"; import { useGet } from "@/Hooks/UseApi"; import type { User, UserRole } from "@/Types/User"; @@ -11,6 +12,7 @@ export const TabTeam = () => { const theme = useTheme(); const [filter, setFilter] = useState(""); const [inviteDialogOpen, setInviteDialogOpen] = useState(false); + const [addMemberDialogOpen, setAddMemberDialogOpen] = useState(false); const { data: users } = useGet("/auth/users"); @@ -24,18 +26,26 @@ export const TabTeam = () => { const handleOpenInviteDialog = () => setInviteDialogOpen(true); const handleCloseInviteDialog = () => setInviteDialogOpen(false); + const handleOpenAddMemberDialog = () => setAddMemberDialogOpen(true); + const handleCloseAddMemberDialog = () => setAddMemberDialogOpen(false); + return ( + ); }; diff --git a/client/src/Pages/Account/components/AddTeamMemberDialog.tsx b/client/src/Pages/Account/components/AddTeamMemberDialog.tsx new file mode 100644 index 000000000..1ca086684 --- /dev/null +++ b/client/src/Pages/Account/components/AddTeamMemberDialog.tsx @@ -0,0 +1,87 @@ +import { Stack } from "@mui/material"; +import MenuItem from "@mui/material/MenuItem"; +import { useTheme } from "@mui/material"; +import { useTranslation } from "react-i18next"; +import { Dialog, TextField, Select } from "@/Components/v2/inputs"; +import type { UserRole } from "@/Types/User"; + +interface AddTeamMemberDialogProps { + open: boolean; + onClose: () => void; +} + +export const AddTeamMemberDialog = ({ open, onClose }: AddTeamMemberDialogProps) => { + const theme = useTheme(); + const { t } = useTranslation(); + + const roleOptions: { value: UserRole; label: string }[] = [ + { value: "admin", label: t("common.auth.roles.admin") }, + { value: "user", label: t("common.auth.roles.user") }, + ]; + + const handleClose = () => { + onClose(); + }; + + return ( + {}} + confirmText={t("common.buttons.addMember")} + maxWidth="sm" + fullWidth + > + + + + + + + + + + ); +}; diff --git a/client/src/Pages/Account/components/HeaderTeamControls.tsx b/client/src/Pages/Account/components/HeaderTeamControls.tsx index 328deb411..57f000170 100644 --- a/client/src/Pages/Account/components/HeaderTeamControls.tsx +++ b/client/src/Pages/Account/components/HeaderTeamControls.tsx @@ -14,12 +14,14 @@ interface HeaderTeamControlsProps { filter: UserRole | ""; onFilterChange: (value: UserRole | "") => void; onInviteClick?: () => void; + onAddMemberClick?: () => void; } export const HeaderTeamControls = ({ filter, onFilterChange, onInviteClick, + onAddMemberClick, }: HeaderTeamControlsProps) => { const theme = useTheme(); const { t } = useTranslation(); @@ -68,6 +70,7 @@ export const HeaderTeamControls = ({ variant="contained" color="primary" startIcon={} + onClick={onAddMemberClick} > {t("common.buttons.addMember")} diff --git a/client/src/locales/en.json b/client/src/locales/en.json index 36b89762c..06e923565 100644 --- a/client/src/locales/en.json +++ b/client/src/locales/en.json @@ -578,6 +578,10 @@ "role": "Role" } }, + "addMember": { + "title": "Register new team member", + "description": "Create a new user account. Share credentials securely after creation." + }, "invite": { "title": "Invite team member", "description": "Send an invitation to join your team",