diff --git a/ui/src/modules/destinations/pages/CreateDestination.tsx b/ui/src/modules/destinations/pages/CreateDestination.tsx index b54e137d..3574ba66 100644 --- a/ui/src/modules/destinations/pages/CreateDestination.tsx +++ b/ui/src/modules/destinations/pages/CreateDestination.tsx @@ -29,6 +29,7 @@ import { getConnectorDocumentationPath, handleSpecResponse, withAbortController, + trimFormDataStrings, } from "../../../utils/utils" import { CONNECTOR_TYPES, @@ -405,7 +406,7 @@ const CreateDestination = forwardRef< const handleDestinationNameChange = ( e: React.ChangeEvent, ) => { - const newName = e.target.value + const newName = e.target.value.trim() if (newName.length >= 1) { setDestinationNameError(null) } @@ -631,9 +632,10 @@ const CreateDestination = forwardRef< widgets={widgets} formData={formData} onChange={e => { - setFormData(e.formData) - if (onFormDataChange) onFormDataChange(e.formData) - const catalogValue = e.formData?.writer?.catalog_type + const trimmedData = trimFormDataStrings(e.formData) + setFormData(trimmedData) + if (onFormDataChange) onFormDataChange(trimmedData) + const catalogValue = trimmedData?.writer?.catalog_type if (catalogValue) setCatalog(catalogValue) }} onSubmit={handleCreate} diff --git a/ui/src/modules/destinations/pages/DestinationEdit.tsx b/ui/src/modules/destinations/pages/DestinationEdit.tsx index ffcd6e27..15262995 100644 --- a/ui/src/modules/destinations/pages/DestinationEdit.tsx +++ b/ui/src/modules/destinations/pages/DestinationEdit.tsx @@ -38,6 +38,7 @@ import { getStatusLabel, handleSpecResponse, withAbortController, + trimFormDataStrings, } from "../../../utils/utils" import { getStatusIcon } from "../../../utils/statusIcons" import { @@ -595,8 +596,10 @@ const DestinationEdit: React.FC = ({ widgets={widgets} formData={formData} onChange={e => { - setFormData(e.formData) - const catalogValue = e.formData?.writer?.catalog_type + const trimmedData = trimFormDataStrings(e.formData) + setFormData(trimmedData) + if (onFormDataChange) onFormDataChange(trimmedData) + const catalogValue = trimmedData?.writer?.catalog_type if (catalogValue) setCatalog(catalogValue) }} transformErrors={transformErrors} diff --git a/ui/src/modules/sources/pages/CreateSource.tsx b/ui/src/modules/sources/pages/CreateSource.tsx index 12e068a6..f6ad7f9a 100644 --- a/ui/src/modules/sources/pages/CreateSource.tsx +++ b/ui/src/modules/sources/pages/CreateSource.tsx @@ -24,6 +24,7 @@ import { getConnectorLabel, handleSpecResponse, withAbortController, + trimFormDataStrings, } from "../../../utils/utils" import { CONNECTOR_TYPES, @@ -315,7 +316,7 @@ const CreateSource = forwardRef( } const handleSourceNameChange = (e: React.ChangeEvent) => { - const newName = e.target.value + const newName = e.target.value.trim() if (newName.length >= 1) { setSourceNameError(null) } @@ -552,8 +553,9 @@ const CreateSource = forwardRef( widgets={widgets} formData={formData} onChange={e => { - setFormData(e.formData) - if (onFormDataChange) onFormDataChange(e.formData) + const trimmedData = trimFormDataStrings(e.formData) + setFormData(trimmedData) + if (onFormDataChange) onFormDataChange(trimmedData) }} transformErrors={transformErrors} uiSchema={uiSchema} diff --git a/ui/src/modules/sources/pages/SourceEdit.tsx b/ui/src/modules/sources/pages/SourceEdit.tsx index 66a13264..6bb503e2 100644 --- a/ui/src/modules/sources/pages/SourceEdit.tsx +++ b/ui/src/modules/sources/pages/SourceEdit.tsx @@ -33,6 +33,7 @@ import { getStatusLabel, handleSpecResponse, withAbortController, + trimFormDataStrings, } from "../../../utils/utils" import DocumentationPanel from "../../common/components/DocumentationPanel" import StepTitle from "../../common/components/StepTitle" @@ -641,7 +642,10 @@ const SourceEdit: React.FC = ({ }} widgets={widgets} formData={formData} - onChange={e => setFormData(e.formData)} + onChange={e => { + const trimmedData = trimFormDataStrings(e.formData) + setFormData(trimmedData) + }} transformErrors={transformErrors} onSubmit={() => handleSave()} uiSchema={uiSchema} diff --git a/ui/src/utils/utils.ts b/ui/src/utils/utils.ts index 769dec86..c0bd84f1 100644 --- a/ui/src/utils/utils.ts +++ b/ui/src/utils/utils.ts @@ -564,3 +564,30 @@ export const getIngestionMode = (selectedStreams: { if (upsertCount === allSelectedStreams.length) return IngestionMode.UPSERT return IngestionMode.CUSTOM } + +// recursively trims all string values in form data used to remove leading/trailing whitespaces from configuration fields +export const trimFormDataStrings = (data: any): any => { + if (data === null || data === undefined) { + return data + } + + if (typeof data === "string") { + return data.trim() + } + + if (Array.isArray(data)) { + return data.map(item => trimFormDataStrings(item)) + } + + if (typeof data === "object") { + const trimmedObject: Record = {} + for (const key in data) { + if (Object.prototype.hasOwnProperty.call(data, key)) { + trimmedObject[key] = trimFormDataStrings(data[key]) + } + } + return trimmedObject + } + + return data +}