diff --git a/web/app/metalakes/CreateCatalogDialog.js b/web/app/metalakes/CreateCatalogDialog.js index 12b66b3ccf3..f9a357f1519 100644 --- a/web/app/metalakes/CreateCatalogDialog.js +++ b/web/app/metalakes/CreateCatalogDialog.js @@ -83,11 +83,13 @@ const CreateCatalogDialog = props => { reset, watch, setValue, + getValues, handleSubmit, + trigger, formState: { errors } } = useForm({ defaultValues, - mode: 'onChange', + mode: 'all', resolver: yupResolver(schema) }) @@ -146,25 +148,50 @@ const CreateCatalogDialog = props => { setOpen(false) } + const handleClickSubmit = e => { + e.preventDefault() + + return handleSubmit(onSubmit(getValues()), onError) + } + const onSubmit = data => { const { propItems, ...mainData } = data - const properties = innerProps.reduce((acc, item) => { - acc[item.key] = item.value + let nextProps = [] - return acc - }, {}) - - const catalogData = { - ...mainData, - properties + if (propItems[0]?.key === 'catalog-backend' && propItems[0]?.value === 'hive') { + nextProps = propItems.slice(0, 3) + } else { + nextProps = propItems } - if (type === 'create') { - dispatch(createCatalog({ data: catalogData, metalake })) - } + trigger() + + const validData = { propItems: nextProps, ...mainData } + + schema + .validate(validData) + .then(() => { + const properties = innerProps.reduce((acc, item) => { + acc[item.key] = item.value + + return acc + }, {}) + + const catalogData = { + ...mainData, + properties + } + + if (type === 'create') { + dispatch(createCatalog({ data: catalogData, metalake })) + } - handleClose() + handleClose() + }) + .catch(err => { + console.error('valid error', err) + }) } const onError = errors => { @@ -172,17 +199,18 @@ const CreateCatalogDialog = props => { } useEffect(() => { - const providerItemIndex = providers.findIndex(i => i.value === providerSelect) - let defaultProps = [] + const providerItemIndex = providers.findIndex(i => i.value === providerSelect) + if (providerItemIndex !== -1) { defaultProps = providers[providerItemIndex].defaultProps resetPropsFields(providers, providerItemIndex) setInnerProps(defaultProps) + setValue('propItems', providers[providerItemIndex].defaultProps) } - }, [providerSelect, setInnerProps]) + }, [providerSelect, setInnerProps, setValue]) useEffect(() => { if (open && JSON.stringify(data) !== '{}') { @@ -205,7 +233,7 @@ const CreateCatalogDialog = props => { return ( -
+ handleClickSubmit(e)}>