From 43e0b52f6f8148dea73651569628292dfa299f6a Mon Sep 17 00:00:00 2001 From: Krrish Dholakia Date: Sat, 23 Nov 2024 17:23:06 +0530 Subject: [PATCH] build(ui/): show teams in leftnav + allow team admin to add new members --- .../src/components/leftnav.tsx | 2 +- .../src/components/networking.tsx | 6 +- ui/litellm-dashboard/src/components/teams.tsx | 73 +++++++++++++------ 3 files changed, 58 insertions(+), 23 deletions(-) diff --git a/ui/litellm-dashboard/src/components/leftnav.tsx b/ui/litellm-dashboard/src/components/leftnav.tsx index 736e6fc9c..4304fe836 100644 --- a/ui/litellm-dashboard/src/components/leftnav.tsx +++ b/ui/litellm-dashboard/src/components/leftnav.tsx @@ -32,7 +32,7 @@ const menuItems: MenuItem[] = [ { key: "3", page: "llm-playground", label: "Test Key" }, // all roles { key: "2", page: "models", label: "Models", roles: all_admin_roles }, { key: "4", page: "usage", label: "Usage"}, // all roles - { key: "6", page: "teams", label: "Teams", roles: all_admin_roles }, + { key: "6", page: "teams", label: "Teams" }, { key: "5", page: "users", label: "Internal Users", roles: all_admin_roles }, { key: "8", page: "settings", label: "Logging & Alerts", roles: all_admin_roles }, { key: "9", page: "caching", label: "Caching", roles: all_admin_roles }, diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx index 874c522d3..3e51444e5 100644 --- a/ui/litellm-dashboard/src/components/networking.tsx +++ b/ui/litellm-dashboard/src/components/networking.tsx @@ -671,7 +671,8 @@ export const teamInfoCall = async ( }; export const teamListCall = async ( - accessToken: String, + accessToken: String, + userID: String | null = null ) => { /** * Get all available teams on proxy @@ -679,6 +680,9 @@ export const teamListCall = async ( try { let url = proxyBaseUrl ? `${proxyBaseUrl}/team/list` : `/team/list`; console.log("in teamInfoCall"); + if (userID) { + url += `?user_id=${userID}`; + } const response = await fetch(url, { method: "GET", headers: { diff --git a/ui/litellm-dashboard/src/components/teams.tsx b/ui/litellm-dashboard/src/components/teams.tsx index 11664bd02..0364245be 100644 --- a/ui/litellm-dashboard/src/components/teams.tsx +++ b/ui/litellm-dashboard/src/components/teams.tsx @@ -80,7 +80,13 @@ const Team: React.FC = ({ if (teams === null && accessToken) { // Call your function here const fetchData = async () => { - const givenTeams = await teamListCall(accessToken) + let givenTeams; + if (userRole != "Admin" && userRole != "Admin Viewer") { + givenTeams = await teamListCall(accessToken, userID) + } else { + givenTeams = await teamListCall(accessToken) + } + console.log(`givenTeams: ${givenTeams}`) setTeams(givenTeams) @@ -98,6 +104,7 @@ const Team: React.FC = ({ const [selectedTeam, setSelectedTeam] = useState( teams ? teams[0] : null ); + const [isTeamModalVisible, setIsTeamModalVisible] = useState(false); const [isAddMemberModalVisible, setIsAddMemberModalVisible] = useState(false); const [userModels, setUserModels] = useState([]); @@ -327,7 +334,13 @@ const Team: React.FC = ({ } let _team_id_to_info: Record = {}; - const teamList = await teamListCall(accessToken) + let teamList; + if (userRole != "Admin" && userRole != "Admin Viewer") { + teamList = await teamListCall(accessToken, userID) + } else { + teamList = await teamListCall(accessToken) + } + for (let i = 0; i < teamList.length; i++) { let team = teamList[i]; let _team_id = team.team_id; @@ -376,6 +389,16 @@ const Team: React.FC = ({ } }; + const is_team_admin = (team: any) => { + for (let i = 0; i < team.members_with_roles.length; i++) { + let member = team.members_with_roles[i]; + if (member.user_id == userID && member.role == "admin") { + return true; + } + } + return false; + } + const handleMemberCreate = async (formValues: Record) => { try { if (accessToken != null && teams != null) { @@ -557,16 +580,20 @@ const Team: React.FC = ({ - handleEditClick(team)} - /> - handleDelete(team.team_id)} - icon={TrashIcon} - size="sm" - /> + {userRole == "Admin" ? ( + <> + handleEditClick(team)} + /> + handleDelete(team.team_id)} + icon={TrashIcon} + size="sm" + /> + + ) : null} )) @@ -623,8 +650,9 @@ const Team: React.FC = ({ )} - - + {userRole == "Admin" || (selectedTeam && is_team_admin(selectedTeam)) ? ( + + ) : null}