Fix: Creating Knowledge Base Support Enter Key (#7258)

### What problem does this PR solve?


[https://github.com/infiniflow/ragflow/issues/7180](https://github.com/infiniflow/ragflow/issues/7180)
When creating a knowledge base, support the enter key
### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
Stephen Hu 2025-04-25 18:53:52 +08:00 committed by GitHub
parent 3052006ba8
commit 3da8776a3c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 157 additions and 59 deletions

View File

@ -142,6 +142,18 @@ const ChatConfigurationModal = ({
} }
}, [initialDialog, form, visible, modelId]); }, [initialDialog, form, visible, modelId]);
const handleKeyDown = (e: React.KeyboardEvent) => {
// Allow Enter in textareas
if (e.target instanceof HTMLTextAreaElement) {
return;
}
if (e.key === 'Enter' && !e.shiftKey) {
e.preventDefault();
handleOk();
}
};
return ( return (
<Modal <Modal
title={title} title={title}
@ -171,6 +183,7 @@ const ChatConfigurationModal = ({
style={{ maxWidth: 600 }} style={{ maxWidth: 600 }}
validateMessages={validateMessages} validateMessages={validateMessages}
colon={false} colon={false}
onKeyDown={handleKeyDown}
> >
{Object.entries(segmentedMap).map(([key, Element]) => ( {Object.entries(segmentedMap).map(([key, Element]) => (
<Element <Element

View File

@ -22,6 +22,12 @@ const CreateAgentModal = ({ visible, hideModal, loading, onOk }: IProps) => {
return onOk(ret.name); return onOk(ret.name);
}; };
const handleKeyDown = (e: React.KeyboardEvent) => {
if (e.key === 'Enter' && !e.shiftKey) {
handleOk();
}
};
return ( return (
<Modal <Modal
title={t('createGraph', { keyPrefix: 'flow' })} title={t('createGraph', { keyPrefix: 'flow' })}
@ -44,7 +50,7 @@ const CreateAgentModal = ({ visible, hideModal, loading, onOk }: IProps) => {
name="name" name="name"
rules={[{ required: true, message: t('namePlaceholder') }]} rules={[{ required: true, message: t('namePlaceholder') }]}
> >
<Input /> <Input onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>

View File

@ -23,10 +23,15 @@ const KnowledgeCreatingModal = ({
const handleOk = async () => { const handleOk = async () => {
const ret = await form.validateFields(); const ret = await form.validateFields();
onOk(ret.name); onOk(ret.name);
}; };
const handleKeyDown = async (e) => {
if (e.key === 'Enter') {
await handleOk();
}
};
return ( return (
<Modal <Modal
title={t('createKnowledgeBase')} title={t('createKnowledgeBase')}
@ -48,7 +53,7 @@ const KnowledgeCreatingModal = ({
name="name" name="name"
rules={[{ required: true, message: t('namePlaceholder') }]} rules={[{ required: true, message: t('namePlaceholder') }]}
> >
<Input placeholder={t('namePlaceholder')} /> <Input placeholder={t('namePlaceholder')} onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>

View File

@ -37,6 +37,12 @@ const TencentCloudModal = ({
onOk?.(data); onOk?.(data);
}; };
const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};
return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
@ -60,13 +66,7 @@ const TencentCloudModal = ({
}} }}
confirmLoading={loading} confirmLoading={loading}
> >
<Form <Form>
name="basic"
style={{ maxWidth: 600 }}
autoComplete="off"
layout={'vertical'}
form={form}
>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('modelType')} label={t('modelType')}
name="model_type" name="model_type"
@ -113,14 +113,20 @@ const TencentCloudModal = ({
name="TencentCloud_sid" name="TencentCloud_sid"
rules={[{ required: true, message: t('TencentCloudSIDMessage') }]} rules={[{ required: true, message: t('TencentCloudSIDMessage') }]}
> >
<Input placeholder={t('TencentCloudSIDMessage')} /> <Input
placeholder={t('TencentCloudSIDMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addTencentCloudSK')} label={t('addTencentCloudSK')}
name="TencentCloud_sk" name="TencentCloud_sk"
rules={[{ required: true, message: t('TencentCloudSKMessage') }]} rules={[{ required: true, message: t('TencentCloudSKMessage') }]}
> >
<Input placeholder={t('TencentCloudSKMessage')} /> <Input
placeholder={t('TencentCloudSKMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>

View File

@ -38,6 +38,12 @@ const ApiKeyModal = ({
return onOk(ret); return onOk(ret);
}; };
const handleKeyDown = async (e) => {
if (e.key === 'Enter') {
await handleOk();
}
};
useEffect(() => { useEffect(() => {
if (visible) { if (visible) {
form.setFieldValue('api_key', initialValue); form.setFieldValue('api_key', initialValue);
@ -67,7 +73,7 @@ const ApiKeyModal = ({
tooltip={t('apiKeyTip')} tooltip={t('apiKeyTip')}
rules={[{ required: true, message: t('apiKeyMessage') }]} rules={[{ required: true, message: t('apiKeyMessage') }]}
> >
<Input /> <Input onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
{modelsWithBaseUrl.some((x) => x === llmFactory) && ( {modelsWithBaseUrl.some((x) => x === llmFactory) && (
<Form.Item<FieldType> <Form.Item<FieldType>
@ -75,7 +81,10 @@ const ApiKeyModal = ({
name="base_url" name="base_url"
tooltip={t('baseUrlTip')} tooltip={t('baseUrlTip')}
> >
<Input placeholder="https://api.openai.com/v1" /> <Input
placeholder="https://api.openai.com/v1"
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
)} )}
{llmFactory?.toLowerCase() === 'Minimax'.toLowerCase() && ( {llmFactory?.toLowerCase() === 'Minimax'.toLowerCase() && (

View File

@ -49,6 +49,12 @@ const AzureOpenAIModal = ({
const getOptions = (factory: string) => { const getOptions = (factory: string) => {
return optionsMap.Default; return optionsMap.Default;
}; };
const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};
return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
@ -83,14 +89,17 @@ const AzureOpenAIModal = ({
name="api_base" name="api_base"
rules={[{ required: true, message: t('baseUrlNameMessage') }]} rules={[{ required: true, message: t('baseUrlNameMessage') }]}
> >
<Input placeholder={t('baseUrlNameMessage')} /> <Input
placeholder={t('baseUrlNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('apiKey')} label={t('apiKey')}
name="api_key" name="api_key"
rules={[{ required: false, message: t('apiKeyMessage') }]} rules={[{ required: false, message: t('apiKeyMessage') }]}
> >
<Input placeholder={t('apiKeyMessage')} /> <Input placeholder={t('apiKeyMessage')} onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('modelName')} label={t('modelName')}
@ -98,7 +107,10 @@ const AzureOpenAIModal = ({
initialValue="gpt-3.5-turbo" initialValue="gpt-3.5-turbo"
rules={[{ required: true, message: t('modelNameMessage') }]} rules={[{ required: true, message: t('modelNameMessage') }]}
> >
<Input placeholder={t('modelNameMessage')} /> <Input
placeholder={t('modelNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('apiVersion')} label={t('apiVersion')}
@ -106,7 +118,10 @@ const AzureOpenAIModal = ({
initialValue="2024-02-01" initialValue="2024-02-01"
rules={[{ required: false, message: t('apiVersionMessage') }]} rules={[{ required: false, message: t('apiVersionMessage') }]}
> >
<Input placeholder={t('apiVersionMessage')} /> <Input
placeholder={t('apiVersionMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('maxTokens')} label={t('maxTokens')}

View File

@ -33,6 +33,12 @@ const GoogleModal = ({
onOk?.(data); onOk?.(data);
}; };
const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};
return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
@ -41,13 +47,7 @@ const GoogleModal = ({
onCancel={hideModal} onCancel={hideModal}
okButtonProps={{ loading }} okButtonProps={{ loading }}
> >
<Form <Form>
name="basic"
style={{ maxWidth: 600 }}
autoComplete="off"
layout={'vertical'}
form={form}
>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('modelType')} label={t('modelType')}
name="model_type" name="model_type"
@ -63,21 +63,30 @@ const GoogleModal = ({
name="llm_name" name="llm_name"
rules={[{ required: true, message: t('GoogleModelIDMessage') }]} rules={[{ required: true, message: t('GoogleModelIDMessage') }]}
> >
<Input placeholder={t('GoogleModelIDMessage')} /> <Input
placeholder={t('GoogleModelIDMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addGoogleProjectID')} label={t('addGoogleProjectID')}
name="google_project_id" name="google_project_id"
rules={[{ required: true, message: t('GoogleProjectIDMessage') }]} rules={[{ required: true, message: t('GoogleProjectIDMessage') }]}
> >
<Input placeholder={t('GoogleProjectIDMessage')} /> <Input
placeholder={t('GoogleProjectIDMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addGoogleRegion')} label={t('addGoogleRegion')}
name="google_region" name="google_region"
rules={[{ required: true, message: t('GoogleRegionMessage') }]} rules={[{ required: true, message: t('GoogleRegionMessage') }]}
> >
<Input placeholder={t('GoogleRegionMessage')} /> <Input
placeholder={t('GoogleRegionMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addGoogleServiceAccountKey')} label={t('addGoogleServiceAccountKey')}
@ -86,7 +95,10 @@ const GoogleModal = ({
{ required: true, message: t('GoogleServiceAccountKeyMessage') }, { required: true, message: t('GoogleServiceAccountKeyMessage') },
]} ]}
> >
<Input placeholder={t('GoogleServiceAccountKeyMessage')} /> <Input
placeholder={t('GoogleServiceAccountKeyMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('maxTokens')} label={t('maxTokens')}

View File

@ -40,6 +40,12 @@ const HunyuanModal = ({
onOk?.(data); onOk?.(data);
}; };
const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};
return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
@ -61,14 +67,20 @@ const HunyuanModal = ({
name="hunyuan_sid" name="hunyuan_sid"
rules={[{ required: true, message: t('HunyuanSIDMessage') }]} rules={[{ required: true, message: t('HunyuanSIDMessage') }]}
> >
<Input placeholder={t('HunyuanSIDMessage')} /> <Input
placeholder={t('HunyuanSIDMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addHunyuanSK')} label={t('addHunyuanSK')}
name="hunyuan_sk" name="hunyuan_sk"
rules={[{ required: true, message: t('HunyuanSKMessage') }]} rules={[{ required: true, message: t('HunyuanSKMessage') }]}
> >
<Input placeholder={t('HunyuanSKMessage')} /> <Input
placeholder={t('HunyuanSKMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>

View File

@ -50,6 +50,12 @@ const OllamaModal = ({
const { t } = useTranslate('setting'); const { t } = useTranslate('setting');
const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};
const handleOk = async () => { const handleOk = async () => {
const values = await form.validateFields(); const values = await form.validateFields();
const modelType = const modelType =
@ -146,21 +152,27 @@ const OllamaModal = ({
name="llm_name" name="llm_name"
rules={[{ required: true, message: t('modelNameMessage') }]} rules={[{ required: true, message: t('modelNameMessage') }]}
> >
<Input placeholder={t('modelNameMessage')} /> <Input
placeholder={t('modelNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addLlmBaseUrl')} label={t('addLlmBaseUrl')}
name="api_base" name="api_base"
rules={[{ required: true, message: t('baseUrlNameMessage') }]} rules={[{ required: true, message: t('baseUrlNameMessage') }]}
> >
<Input placeholder={t('baseUrlNameMessage')} /> <Input
placeholder={t('baseUrlNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('apiKey')} label={t('apiKey')}
name="api_key" name="api_key"
rules={[{ required: false, message: t('apiKeyMessage') }]} rules={[{ required: false, message: t('apiKeyMessage') }]}
> >
<Input placeholder={t('apiKeyMessage')} /> <Input placeholder={t('apiKeyMessage')} onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('maxTokens')} label={t('maxTokens')}
@ -184,6 +196,7 @@ const OllamaModal = ({
<InputNumber <InputNumber
placeholder={t('maxTokensTip')} placeholder={t('maxTokensTip')}
style={{ width: '100%' }} style={{ width: '100%' }}
onKeyDown={handleKeyDown}
/> />
</Form.Item> </Form.Item>

View File

@ -43,6 +43,12 @@ const SparkModal = ({
onOk?.(data); onOk?.(data);
}; };
const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};
return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
@ -52,13 +58,7 @@ const SparkModal = ({
okButtonProps={{ loading }} okButtonProps={{ loading }}
confirmLoading={loading} confirmLoading={loading}
> >
<Form <Form>
name="basic"
style={{ maxWidth: 600 }}
autoComplete="off"
layout={'vertical'}
form={form}
>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('modelType')} label={t('modelType')}
name="model_type" name="model_type"
@ -75,22 +75,20 @@ const SparkModal = ({
name="llm_name" name="llm_name"
rules={[{ required: true, message: t('SparkModelNameMessage') }]} rules={[{ required: true, message: t('SparkModelNameMessage') }]}
> >
<Input placeholder={t('modelNameMessage')} /> <Input
placeholder={t('modelNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item noStyle dependencies={['model_type']}> <Form.Item<FieldType>
{({ getFieldValue }) => label={t('addSparkAPIPassword')}
getFieldValue('model_type') === 'chat' && ( name="spark_api_password"
<Form.Item<FieldType> rules={[{ required: true, message: t('SparkAPIPasswordMessage') }]}
label={t('addSparkAPIPassword')} >
name="spark_api_password" <Input
rules={[ placeholder={t('SparkAPIPasswordMessage')}
{ required: true, message: t('SparkAPIPasswordMessage') }, onKeyDown={handleKeyDown}
]} />
>
<Input placeholder={t('SparkAPIPasswordMessage')} />
</Form.Item>
)
}
</Form.Item> </Form.Item>
<Form.Item noStyle dependencies={['model_type']}> <Form.Item noStyle dependencies={['model_type']}>
{({ getFieldValue }) => {({ getFieldValue }) =>

View File

@ -41,6 +41,12 @@ const YiyanModal = ({
onOk?.(data); onOk?.(data);
}; };
const handleKeyDown = async (e: React.KeyboardEvent) => {
if (e.key === 'Enter') {
await handleOk();
}
};
return ( return (
<Modal <Modal
title={t('addLlmTitle', { name: llmFactory })} title={t('addLlmTitle', { name: llmFactory })}
@ -74,21 +80,24 @@ const YiyanModal = ({
name="llm_name" name="llm_name"
rules={[{ required: true, message: t('yiyanModelNameMessage') }]} rules={[{ required: true, message: t('yiyanModelNameMessage') }]}
> >
<Input placeholder={t('yiyanModelNameMessage')} /> <Input
placeholder={t('yiyanModelNameMessage')}
onKeyDown={handleKeyDown}
/>
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addyiyanAK')} label={t('addyiyanAK')}
name="yiyan_ak" name="yiyan_ak"
rules={[{ required: true, message: t('yiyanAKMessage') }]} rules={[{ required: true, message: t('yiyanAKMessage') }]}
> >
<Input placeholder={t('yiyanAKMessage')} /> <Input placeholder={t('yiyanAKMessage')} onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('addyiyanSK')} label={t('addyiyanSK')}
name="yiyan_sk" name="yiyan_sk"
rules={[{ required: true, message: t('yiyanSKMessage') }]} rules={[{ required: true, message: t('yiyanSKMessage') }]}
> >
<Input placeholder={t('yiyanSKMessage')} /> <Input placeholder={t('yiyanSKMessage')} onKeyDown={handleKeyDown} />
</Form.Item> </Form.Item>
<Form.Item<FieldType> <Form.Item<FieldType>
label={t('maxTokens')} label={t('maxTokens')}