mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-26 19:24:27 +00:00
UI Fixes p2 (#8502)
* refactor(admin.tsx): cleanup add new admin flow removes buggy flow. Ensures just 1 simple way to add users / update roles. * fix(user_search_modal.tsx): ensure 'add member' button is always visible * fix(edit_membership.tsx): ensure 'save changes' button always visible * fix(internal_user_endpoints.py): ensure user in org can be deleted Fixes issue where user couldn't be deleted if they were a member of an org * fix: fix linting error
This commit is contained in:
parent
cc98d37c24
commit
1598a2636e
4 changed files with 8 additions and 112 deletions
|
@ -885,6 +885,11 @@ async def delete_user(
|
||||||
where={"user_id": {"in": data.user_ids}}
|
where={"user_id": {"in": data.user_ids}}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
## DELETE ASSOCIATED ORGANIZATION MEMBERSHIPS
|
||||||
|
await prisma_client.db.litellm_organizationmembership.delete_many(
|
||||||
|
where={"user_id": {"in": data.user_ids}}
|
||||||
|
)
|
||||||
|
|
||||||
## DELETE USERS
|
## DELETE USERS
|
||||||
deleted_users = await prisma_client.db.litellm_usertable.delete_many(
|
deleted_users = await prisma_client.db.litellm_usertable.delete_many(
|
||||||
where={"user_id": {"in": data.user_ids}}
|
where={"user_id": {"in": data.user_ids}}
|
||||||
|
|
|
@ -496,116 +496,7 @@ const AdminPanel: React.FC<AdminPanelProps> = ({
|
||||||
return (
|
return (
|
||||||
<div className="w-full m-2 mt-2 p-8">
|
<div className="w-full m-2 mt-2 p-8">
|
||||||
<Title level={4}>Admin Access </Title>
|
<Title level={4}>Admin Access </Title>
|
||||||
<Paragraph>
|
<Paragraph>Go to 'Internal Users' page to add other admins.</Paragraph>
|
||||||
{showSSOBanner && (
|
|
||||||
<a href="https://docs.litellm.ai/docs/proxy/ui#restrict-ui-access">
|
|
||||||
Requires SSO Setup
|
|
||||||
</a>
|
|
||||||
)}
|
|
||||||
<br />
|
|
||||||
<b>Proxy Admin: </b> Can create keys, teams, users, add models, etc.{" "}
|
|
||||||
<br />
|
|
||||||
<b>Proxy Admin Viewer: </b>Can just view spend. They cannot create keys,
|
|
||||||
teams or grant users access to new models.{" "}
|
|
||||||
</Paragraph>
|
|
||||||
<Grid numItems={1} className="gap-2 p-2 w-full">
|
|
||||||
<Col numColSpan={1}>
|
|
||||||
<Card className="w-full mx-auto flex-auto overflow-y-auto max-h-[50vh]">
|
|
||||||
<Table>
|
|
||||||
<TableHead>
|
|
||||||
<TableRow>
|
|
||||||
<TableHeaderCell>Member Name</TableHeaderCell>
|
|
||||||
<TableHeaderCell>Role</TableHeaderCell>
|
|
||||||
</TableRow>
|
|
||||||
</TableHead>
|
|
||||||
|
|
||||||
<TableBody>
|
|
||||||
{admins
|
|
||||||
? admins.map((member: any, index: number) => (
|
|
||||||
<TableRow key={index}>
|
|
||||||
<TableCell>
|
|
||||||
{member["user_email"]
|
|
||||||
? member["user_email"]
|
|
||||||
: member["user_id"]
|
|
||||||
? member["user_id"]
|
|
||||||
: null}
|
|
||||||
</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
{" "}
|
|
||||||
{possibleUIRoles?.[member?.user_role]?.ui_label ||
|
|
||||||
"-"}
|
|
||||||
</TableCell>
|
|
||||||
<TableCell>
|
|
||||||
<Icon
|
|
||||||
icon={PencilAltIcon}
|
|
||||||
size="sm"
|
|
||||||
onClick={() => setIsUpdateModalModalVisible(true)}
|
|
||||||
/>
|
|
||||||
<Modal
|
|
||||||
title="Update role"
|
|
||||||
visible={isUpdateMemberModalVisible}
|
|
||||||
width={800}
|
|
||||||
footer={null}
|
|
||||||
onOk={handleMemberUpdateOk}
|
|
||||||
onCancel={handleMemberUpdateCancel}
|
|
||||||
>
|
|
||||||
{modifyMemberForm(
|
|
||||||
handleMemberUpdate,
|
|
||||||
member["user_role"],
|
|
||||||
member["user_id"]
|
|
||||||
)}
|
|
||||||
</Modal>
|
|
||||||
</TableCell>
|
|
||||||
</TableRow>
|
|
||||||
))
|
|
||||||
: null}
|
|
||||||
</TableBody>
|
|
||||||
</Table>
|
|
||||||
</Card>
|
|
||||||
</Col>
|
|
||||||
<Col numColSpan={1}>
|
|
||||||
<div className="flex justify-start">
|
|
||||||
<Button
|
|
||||||
className="mr-4 mb-5"
|
|
||||||
onClick={() => setIsAddAdminModalVisible(true)}
|
|
||||||
>
|
|
||||||
+ Add admin
|
|
||||||
</Button>
|
|
||||||
<Modal
|
|
||||||
title="Add admin"
|
|
||||||
visible={isAddAdminModalVisible}
|
|
||||||
width={800}
|
|
||||||
footer={null}
|
|
||||||
onOk={handleAdminOk}
|
|
||||||
onCancel={handleAdminCancel}
|
|
||||||
>
|
|
||||||
{addMemberForm(handleAdminCreate)}
|
|
||||||
</Modal>
|
|
||||||
<OnboardingModal
|
|
||||||
isInvitationLinkModalVisible={isInvitationLinkModalVisible}
|
|
||||||
setIsInvitationLinkModalVisible={setIsInvitationLinkModalVisible}
|
|
||||||
baseUrl={baseUrl}
|
|
||||||
invitationLinkData={invitationLinkData}
|
|
||||||
/>
|
|
||||||
<Button
|
|
||||||
className="mb-5"
|
|
||||||
onClick={() => setIsAddMemberModalVisible(true)}
|
|
||||||
>
|
|
||||||
+ Add viewer
|
|
||||||
</Button>
|
|
||||||
<Modal
|
|
||||||
title="Add viewer"
|
|
||||||
visible={isAddMemberModalVisible}
|
|
||||||
width={800}
|
|
||||||
footer={null}
|
|
||||||
onOk={handleMemberOk}
|
|
||||||
onCancel={handleMemberCancel}
|
|
||||||
>
|
|
||||||
{addMemberForm(handleMemberCreate)}
|
|
||||||
</Modal>
|
|
||||||
</div>
|
|
||||||
</Col>
|
|
||||||
</Grid>
|
|
||||||
<Grid >
|
<Grid >
|
||||||
<Card>
|
<Card>
|
||||||
<Title level={4}> ✨ Security Settings</Title>
|
<Title level={4}> ✨ Security Settings</Title>
|
||||||
|
|
|
@ -163,7 +163,7 @@ const UserSearchModal: React.FC<UserSearchModalProps> = ({
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
|
|
||||||
<div className="text-right mt-4">
|
<div className="text-right mt-4">
|
||||||
<Button type="primary" htmlType="submit">
|
<Button type="default" htmlType="submit">
|
||||||
Add Member
|
Add Member
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -129,7 +129,7 @@ const TeamMemberModal: React.FC<TeamMemberModalProps> = ({
|
||||||
Cancel
|
Cancel
|
||||||
</AntButton>
|
</AntButton>
|
||||||
<AntButton
|
<AntButton
|
||||||
type="primary"
|
type="default"
|
||||||
htmlType="submit"
|
htmlType="submit"
|
||||||
>
|
>
|
||||||
{mode === 'add' ? 'Add Member' : 'Save Changes'}
|
{mode === 'add' ? 'Add Member' : 'Save Changes'}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue