diff --git a/ui/litellm-dashboard/src/components/team/TeamMemberTab.tsx b/ui/litellm-dashboard/src/components/team/TeamMemberTab.tsx index 09a6b0f468d..c72320d08a7 100644 --- a/ui/litellm-dashboard/src/components/team/TeamMemberTab.tsx +++ b/ui/litellm-dashboard/src/components/team/TeamMemberTab.tsx @@ -3,14 +3,12 @@ import useAuthorized from "@/app/(dashboard)/hooks/useAuthorized"; import { Member } from "@/components/networking"; import { formatNumberWithCommas } from "@/utils/dataUtils"; import { isProxyAdminRole, isUserTeamAdminForSingleTeam } from "@/utils/roles"; -import { CrownOutlined, InfoCircleOutlined, UserAddOutlined, UserOutlined } from "@ant-design/icons"; -import { Button, Space, Table, Tag, Tooltip, Typography } from "antd"; +import { InfoCircleOutlined } from "@ant-design/icons"; +import { Space, Tooltip, Typography } from "antd"; import type { ColumnsType } from "antd/es/table"; -import TableIconActionButton from "../common_components/IconActionButton/TableIconActionButtons/TableIconActionButton"; +import MemberTable from "@/components/common_components/MemberTable"; import { TeamData } from "./TeamInfo"; -const { Text } = Typography; - interface TeamMemberTabProps { teamData: TeamData; canEditTeam: boolean; @@ -84,48 +82,7 @@ export default function TeamMemberTab({ const isUserTeamAdmin = isUserTeamAdminForSingleTeam(teamData.team_info.members_with_roles, userId || ""); const isProxyAdmin = isProxyAdminRole(userRole || ""); - const columns: ColumnsType = [ - { - title: "User Email", - dataIndex: "user_email", - key: "user_email", - render: (email: string | null) => ( - {email || "-"} - ), - }, - { - title: "User ID", - dataIndex: "user_id", - key: "user_id", - render: (userId: string | null) => - userId === "default_user_id" ? ( - Default Proxy Admin - ) : ( - {userId} - ), - }, - { - title: ( - - Team Role - - - - - ), - dataIndex: "role", - key: "role", - render: (role: string) => ( - - {role?.toLowerCase() === "admin" ? ( - - ) : ( - - )} - {role} - - ), - }, + const extraColumns: ColumnsType = [ { title: ( @@ -137,9 +94,7 @@ export default function TeamMemberTab({ ), key: "spend", render: (_: unknown, record: Member) => ( - - ${formatNumberWithCommas(getUserSpend(record.user_id), 4)} - + ${formatNumberWithCommas(getUserSpend(record.user_id), 4)} ), }, { @@ -148,9 +103,9 @@ export default function TeamMemberTab({ render: (_: unknown, record: Member) => { const budget = getUserBudget(record.user_id); return ( - + {budget ? `$${formatNumberWithCommas(Number(budget), 4)}` : "No Limit"} - + ); }, }, @@ -165,69 +120,36 @@ export default function TeamMemberTab({ ), key: "rate_limits", render: (_: unknown, record: Member) => ( - {getUserRateLimits(record.user_id)} + {getUserRateLimits(record.user_id)} ), }, - { - title: "Actions", - key: "actions", - fixed: "right", - width: 120, - render: (_: unknown, record: Member) => - canEditTeam ? ( -
- { - const membership = teamData.team_memberships.find( - (tm) => tm.user_id === record.user_id - ); - const enhancedMember = { - ...record, - max_budget_in_team: - membership?.litellm_budget_table?.max_budget || null, - tpm_limit: - membership?.litellm_budget_table?.tpm_limit || null, - rpm_limit: - membership?.litellm_budget_table?.rpm_limit || null, - }; - setSelectedEditMember(enhancedMember); - setIsEditMemberModalVisible(true); - }} - /> - {(isProxyAdmin || - (isUserTeamAdmin && !disableTeamAdminDeleteTeamUser)) && ( - handleMemberDelete(record)} - /> - )} -
- ) : null, - }, ]; return ( -
- record.user_id || String(index)} - pagination={false} - size="small" - scroll={{ x: "max-content" }} - /> - - + { + const membership = teamData.team_memberships.find( + (tm) => tm.user_id === record.user_id + ); + const enhancedMember = { + ...record, + max_budget_in_team: membership?.litellm_budget_table?.max_budget || null, + tpm_limit: membership?.litellm_budget_table?.tpm_limit || null, + rpm_limit: membership?.litellm_budget_table?.rpm_limit || null, + }; + setSelectedEditMember(enhancedMember); + setIsEditMemberModalVisible(true); + }} + onDelete={handleMemberDelete} + onAddMember={() => setIsAddMemberModalVisible(true)} + roleColumnTitle="Team Role" + roleTooltip="This role applies only to this team and is independent from the user's proxy-level role." + extraColumns={extraColumns} + showDeleteForMember={() => + isProxyAdmin || (isUserTeamAdmin && !disableTeamAdminDeleteTeamUser) + } + /> ); -}; +}