import { useState } from 'react' import type { FC } from 'react' import { ValidatingTip } from '../../key-validator/ValidateStatus' import type { CredentialFormSchema, CredentialFormSchemaNumberInput, CredentialFormSchemaRadio, CredentialFormSchemaSecretInput, CredentialFormSchemaSelect, CredentialFormSchemaTextInput, FormValue, } from '../declarations' import { FormTypeEnum } from '../declarations' import { useLanguage } from '../hooks' import Input from './Input' import cn from '@/utils/classnames' import { SimpleSelect } from '@/app/components/base/select' import Tooltip from '@/app/components/base/tooltip' import Radio from '@/app/components/base/radio' type FormProps = { className?: string itemClassName?: string fieldLabelClassName?: string value: FormValue onChange: (val: FormValue) => void formSchemas: CredentialFormSchema[] validating: boolean validatedSuccess?: boolean showOnVariableMap: Record isEditMode: boolean readonly?: boolean inputClassName?: string isShowDefaultValue?: boolean fieldMoreInfo?: (payload: CredentialFormSchema) => JSX.Element | null } const Form: FC = ({ className, itemClassName, fieldLabelClassName, value, onChange, formSchemas, validating, validatedSuccess, showOnVariableMap, isEditMode, readonly, inputClassName, isShowDefaultValue = false, fieldMoreInfo, }) => { const language = useLanguage() const [changeKey, setChangeKey] = useState('') const handleFormChange = (key: string, val: string | boolean) => { if (isEditMode && (key === '__model_type' || key === '__model_name')) return setChangeKey(key) const shouldClearVariable: Record = {} if (showOnVariableMap[key]?.length) { showOnVariableMap[key].forEach((clearVariable) => { shouldClearVariable[clearVariable] = undefined }) } onChange({ ...value, [key]: val, ...shouldClearVariable }) } const renderField = (formSchema: CredentialFormSchema) => { const tooltip = formSchema.tooltip const tooltipContent = (tooltip && ( {tooltip[language] || tooltip.en_US} } triggerClassName='ml-1 w-4 h-4' asChild={false} /> )) if (formSchema.type === FormTypeEnum.textInput || formSchema.type === FormTypeEnum.secretInput || formSchema.type === FormTypeEnum.textNumber) { const { variable, label, placeholder, required, show_on, } = formSchema as (CredentialFormSchemaTextInput | CredentialFormSchemaSecretInput) if (show_on.length && !show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value)) return null const disabled = readonly || (isEditMode && (variable === '__model_type' || variable === '__model_name')) return (
{label[language] || label.en_US} { required && ( * ) } {tooltipContent}
handleFormChange(variable, val)} validated={validatedSuccess} placeholder={placeholder?.[language] || placeholder?.en_US} disabled={disabled} type={formSchema.type === FormTypeEnum.textNumber ? 'number' : 'text'} {...(formSchema.type === FormTypeEnum.textNumber ? { min: (formSchema as CredentialFormSchemaNumberInput).min, max: (formSchema as CredentialFormSchemaNumberInput).max } : {})} /> {fieldMoreInfo?.(formSchema)} {validating && changeKey === variable && }
) } if (formSchema.type === FormTypeEnum.radio) { const { options, variable, label, show_on, required, } = formSchema as CredentialFormSchemaRadio if (show_on.length && !show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value)) return null const disabled = isEditMode && (variable === '__model_type' || variable === '__model_name') return (
{label[language] || label.en_US} { required && ( * ) } {tooltipContent}
{ options.filter((option) => { if (option.show_on.length) return option.show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value) return true }).map(option => (
handleFormChange(variable, option.value)} key={`${variable}-${option.value}`} >
{option.label[language] || option.label.en_US}
)) }
{fieldMoreInfo?.(formSchema)} {validating && changeKey === variable && }
) } if (formSchema.type === 'select') { const { options, variable, label, show_on, required, placeholder, } = formSchema as CredentialFormSchemaSelect if (show_on.length && !show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value)) return null return (
{label[language] || label.en_US} { required && ( * ) } {tooltipContent}
{ if (option.show_on.length) return option.show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value) return true }).map(option => ({ value: option.value, name: option.label[language] || option.label.en_US }))} onSelect={item => handleFormChange(variable, item.value as string)} placeholder={placeholder?.[language] || placeholder?.en_US} /> {fieldMoreInfo?.(formSchema)} {validating && changeKey === variable && }
) } if (formSchema.type === 'boolean') { const { variable, label, show_on, required, } = formSchema as CredentialFormSchemaRadio if (show_on.length && !show_on.every(showOnItem => value[showOnItem.variable] === showOnItem.value)) return null return (
{label[language] || label.en_US} { required && ( * ) } {tooltipContent}
handleFormChange(variable, val === 1)} > True False
{fieldMoreInfo?.(formSchema)}
) } } return (
{ formSchemas.map(formSchema => renderField(formSchema)) }
) } export default Form