### 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)tags/v0.19.0
| } | } | ||||
| }, [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} | ||||
| 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 | 
| 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' })} | ||||
| 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> | 
| 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')} | ||||
| 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> | 
| 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 })} | ||||
| }} | }} | ||||
| confirmLoading={loading} | confirmLoading={loading} | ||||
| > | > | ||||
| <Form | |||||
| name="basic" | |||||
| style={{ maxWidth: 600 }} | |||||
| autoComplete="off" | |||||
| layout={'vertical'} | |||||
| form={form} | |||||
| > | |||||
| <Form> | |||||
| <Form.Item<FieldType> | <Form.Item<FieldType> | ||||
| label={t('modelType')} | label={t('modelType')} | ||||
| name="model_type" | name="model_type" | ||||
| 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> | 
| 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); | ||||
| 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> | ||||
| 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() && ( | 
| 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 })} | ||||
| 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')} | ||||
| 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')} | ||||
| 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')} | 
| 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 })} | ||||
| onCancel={hideModal} | onCancel={hideModal} | ||||
| okButtonProps={{ loading }} | okButtonProps={{ loading }} | ||||
| > | > | ||||
| <Form | |||||
| name="basic" | |||||
| style={{ maxWidth: 600 }} | |||||
| autoComplete="off" | |||||
| layout={'vertical'} | |||||
| form={form} | |||||
| > | |||||
| <Form> | |||||
| <Form.Item<FieldType> | <Form.Item<FieldType> | ||||
| label={t('modelType')} | label={t('modelType')} | ||||
| name="model_type" | name="model_type" | ||||
| 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')} | ||||
| { 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')} | 
| 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 })} | ||||
| 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> | 
| 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 = | ||||
| 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')} | ||||
| <InputNumber | <InputNumber | ||||
| placeholder={t('maxTokensTip')} | placeholder={t('maxTokensTip')} | ||||
| style={{ width: '100%' }} | style={{ width: '100%' }} | ||||
| onKeyDown={handleKeyDown} | |||||
| /> | /> | ||||
| </Form.Item> | </Form.Item> | ||||
| 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 })} | ||||
| okButtonProps={{ loading }} | okButtonProps={{ loading }} | ||||
| confirmLoading={loading} | confirmLoading={loading} | ||||
| > | > | ||||
| <Form | |||||
| name="basic" | |||||
| style={{ maxWidth: 600 }} | |||||
| autoComplete="off" | |||||
| layout={'vertical'} | |||||
| form={form} | |||||
| > | |||||
| <Form> | |||||
| <Form.Item<FieldType> | <Form.Item<FieldType> | ||||
| label={t('modelType')} | label={t('modelType')} | ||||
| name="model_type" | name="model_type" | ||||
| 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']}> | |||||
| {({ getFieldValue }) => | |||||
| getFieldValue('model_type') === 'chat' && ( | |||||
| <Form.Item<FieldType> | |||||
| label={t('addSparkAPIPassword')} | |||||
| name="spark_api_password" | |||||
| rules={[ | |||||
| { required: true, message: t('SparkAPIPasswordMessage') }, | |||||
| ]} | |||||
| > | |||||
| <Input placeholder={t('SparkAPIPasswordMessage')} /> | |||||
| </Form.Item> | |||||
| ) | |||||
| } | |||||
| <Form.Item<FieldType> | |||||
| label={t('addSparkAPIPassword')} | |||||
| name="spark_api_password" | |||||
| rules={[{ required: true, message: t('SparkAPIPasswordMessage') }]} | |||||
| > | |||||
| <Input | |||||
| placeholder={t('SparkAPIPasswordMessage')} | |||||
| onKeyDown={handleKeyDown} | |||||
| /> | |||||
| </Form.Item> | </Form.Item> | ||||
| <Form.Item noStyle dependencies={['model_type']}> | <Form.Item noStyle dependencies={['model_type']}> | ||||
| {({ getFieldValue }) => | {({ getFieldValue }) => | 
| 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 })} | ||||
| 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')} |