diff --git a/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/IdJagFormFields.tsx b/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/IdJagFormFields.tsx index b43ef32c435..742683eba74 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/IdJagFormFields.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/mcp-servers/_components/IdJagFormFields.tsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React from "react"; import { Form, Input, Select, Tooltip } from "antd"; import { InfoCircleOutlined } from "@ant-design/icons"; @@ -19,7 +19,10 @@ const FieldLabel: React.FC<{ label: string; tooltip: string }> = ({ label, toolt const IdJagFormFields: React.FC = ({ isEditing = false }) => { const placeholderSuffix = isEditing ? " (leave blank to keep existing)" : ""; - const [clientAuthMethod, setClientAuthMethod] = useState<"client_secret" | "private_key_jwt">("client_secret"); + const form = Form.useFormInstance(); + const clientAuthMethod = + (Form.useWatch("id_jag_client_auth_method", form) as "client_secret" | "private_key_jwt" | undefined) ?? + "client_secret"; return ( <> @@ -31,6 +34,7 @@ const IdJagFormFields: React.FC = ({ isEditing = false }) /> } name="token_exchange_endpoint" + preserve={false} rules={[{ required: !isEditing, message: "The IdP token exchange endpoint is required for ID-JAG" }]} > @@ -43,6 +47,7 @@ const IdJagFormFields: React.FC = ({ isEditing = false }) /> } name={["credentials", "id_jag_resource_token_endpoint"]} + preserve={false} > @@ -54,6 +59,7 @@ const IdJagFormFields: React.FC = ({ isEditing = false }) /> } name={["credentials", "client_id"]} + preserve={false} rules={[{ required: !isEditing, message: "Client ID is required for ID-JAG" }]} > @@ -62,15 +68,16 @@ const IdJagFormFields: React.FC = ({ isEditing = false }) label={ } + name="id_jag_client_auth_method" + initialValue="client_secret" + preserve={false} > className="rounded-lg" size="large" - value={clientAuthMethod} - onChange={setClientAuthMethod} options={[ { value: "client_secret", label: Client Secret }, { value: "private_key_jwt", label: Private Key JWT }, @@ -86,6 +93,7 @@ const IdJagFormFields: React.FC = ({ isEditing = false }) /> } name={["credentials", "client_secret"]} + preserve={false} rules={[{ required: !isEditing, message: "Client Secret is required for ID-JAG" }]} > @@ -101,6 +109,7 @@ const IdJagFormFields: React.FC = ({ isEditing = false }) /> } name={["credentials", "client_private_key"]} + preserve={false} rules={[{ required: !isEditing, message: "A private key is required for private_key_jwt" }]} > = ({ isEditing = false }) /> } name={["credentials", "client_private_key_id"]} + preserve={false} > @@ -128,6 +138,7 @@ const IdJagFormFields: React.FC = ({ isEditing = false }) /> } name={["credentials", "client_assertion_signing_alg"]} + preserve={false} > @@ -141,12 +152,14 @@ const IdJagFormFields: React.FC = ({ isEditing = false }) /> } name="audience" + preserve={false} > } name={["credentials", "scopes"]} + preserve={false} >