diff --git a/web/src/components/credentials/actions/CreateCredential.tsx b/web/src/components/credentials/actions/CreateCredential.tsx index b061821ff..d0bf3cece 100644 --- a/web/src/components/credentials/actions/CreateCredential.tsx +++ b/web/src/components/credentials/actions/CreateCredential.tsx @@ -111,9 +111,15 @@ export default function CreateCredential({ const { name, is_public, groups, ...credentialValues } = values; + const filteredCredentialValues = Object.fromEntries( + Object.entries(credentialValues).filter( + ([_, value]) => value !== null && value !== "" + ) + ); + try { const response = await submitCredential({ - credential_json: credentialValues, + credential_json: filteredCredentialValues, admin_public: true, curator_public: is_public, groups: groups, @@ -194,7 +200,7 @@ export default function CreateCredential({ for information on setting up this connector.

)} - + ) { + const schemaFields: Record = {}; for (const key in json_values) { - if (Object.prototype.hasOwnProperty.call(json_values, key)) { - if (json_values[key] === null) { - schemaFields[key] = Yup.string().optional(); - } else { - schemaFields[key] = Yup.string().required( - `Please enter your ${getDisplayNameForCredentialKey(key)}` - ); - } + if (!Object.prototype.hasOwnProperty.call(json_values, key)) { + continue; + } + + const displayName = getDisplayNameForCredentialKey(key); + + if (json_values[key] === null) { + // Field is optional: + schemaFields[key] = Yup.string() + .trim() + // Transform empty strings to null + .transform((value) => (value === "" ? null : value)) + .nullable() + .notRequired(); + } else { + // Field is required: + schemaFields[key] = Yup.string() + .trim() + // This ensures user cannot enter an empty string: + .min(1, `${displayName} cannot be empty`) + // The required message is shown if the field is missing + .required(`Please enter your ${displayName}`); } }