diff --git a/ui/litellm-dashboard/src/components/bulk_edit_user.tsx b/ui/litellm-dashboard/src/components/bulk_edit_user.tsx index c4ae4a97d38..25b70b9f49b 100644 --- a/ui/litellm-dashboard/src/components/bulk_edit_user.tsx +++ b/ui/litellm-dashboard/src/components/bulk_edit_user.tsx @@ -104,6 +104,10 @@ const BulkEditUserModal: React.FC = ({ updatePayload.models = formValues.models; } + if (formValues.budget_duration && formValues.budget_duration !== "") { + updatePayload.budget_duration = formValues.budget_duration; + } + if (formValues.metadata && Object.keys(formValues.metadata).length > 0) { updatePayload.metadata = formValues.metadata; } diff --git a/ui/litellm-dashboard/src/components/common_components/budget_duration_dropdown.tsx b/ui/litellm-dashboard/src/components/common_components/budget_duration_dropdown.tsx index 9171e13381c..23e0dd331cf 100644 --- a/ui/litellm-dashboard/src/components/common_components/budget_duration_dropdown.tsx +++ b/ui/litellm-dashboard/src/components/common_components/budget_duration_dropdown.tsx @@ -5,7 +5,7 @@ const { Option } = Select; interface BudgetDurationDropdownProps { value?: string | null; - onChange: (value: string) => void; + onChange?: (value: string) => void; className?: string; style?: React.CSSProperties; } diff --git a/ui/litellm-dashboard/src/components/edit_user.tsx b/ui/litellm-dashboard/src/components/edit_user.tsx index 1cd47ffec29..4f49eb821f2 100644 --- a/ui/litellm-dashboard/src/components/edit_user.tsx +++ b/ui/litellm-dashboard/src/components/edit_user.tsx @@ -22,6 +22,7 @@ import { } from "antd"; import NumericalInput from "./shared/numerical_input"; +import BudgetDurationDropdown from "./common_components/budget_duration_dropdown"; interface EditUserModalProps { visible: boolean; @@ -126,6 +127,14 @@ const EditUserModal: React.FC = ({ visible, possibleUIRoles, + + + + +
+ Save +
+
Save
diff --git a/ui/litellm-dashboard/src/components/user_edit_view.tsx b/ui/litellm-dashboard/src/components/user_edit_view.tsx index c79d3430943..bfe00290eba 100644 --- a/ui/litellm-dashboard/src/components/user_edit_view.tsx +++ b/ui/litellm-dashboard/src/components/user_edit_view.tsx @@ -5,6 +5,8 @@ import { Button } from "@tremor/react"; import { getModelDisplayName } from "./key_team_helpers/fetch_available_models_team_key"; import { all_admin_roles } from "../utils/roles"; import { InfoCircleOutlined } from "@ant-design/icons"; +import BudgetDurationDropdown from "./common_components/budget_duration_dropdown"; + interface UserEditViewProps { userData: any; onCancel: () => void; @@ -40,6 +42,7 @@ export function UserEditView({ user_role: userData.user_info?.user_role, models: userData.user_info?.models || [], max_budget: userData.user_info?.max_budget, + budget_duration: userData.user_info?.budget_duration, metadata: userData.user_info?.metadata ? JSON.stringify(userData.user_info.metadata, null, 2) : undefined, }); }, [userData, form]); @@ -154,6 +157,10 @@ export function UserEditView({ /> + + + + | null created_at: string | null @@ -137,6 +139,7 @@ export default function UserInfoView({ user_email: formValues.user_email, models: formValues.models, max_budget: formValues.max_budget, + budget_duration: formValues.budget_duration, metadata: formValues.metadata, }, }) @@ -355,7 +358,7 @@ export default function UserInfoView({
- Role + Global Proxy Role {userData.user_info?.user_role || "Not Set"}
@@ -393,7 +396,7 @@ export default function UserInfoView({
- Models + Personal Models
{userData.user_info?.models?.length && userData.user_info?.models?.length > 0 ? ( userData.user_info?.models?.map((model, index) => ( @@ -422,6 +425,20 @@ export default function UserInfoView({
+
+ Max Budget + + {userData.user_info?.max_budget !== null && userData.user_info?.max_budget !== undefined + ? `$${formatNumberWithCommas(userData.user_info.max_budget, 4)}` + : "Unlimited"} + +
+ +
+ Budget Reset + {getBudgetDurationLabel(userData.user_info?.budget_duration ?? null)} +
+
Metadata