Files
TERES_web_frontend/src/pages/knowledge/components/CreateKnowledgeDialog.tsx
guangfei.zhao ed6e0ab282 feat(agent-mui): add agent canvas, nodes, and related components
docs(agent-hooks-guide): add comprehensive guide for agent hooks usage and implementation
2025-11-07 17:49:44 +08:00

132 lines
4.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { useEffect, useMemo, useState } from 'react';
import {
Dialog,
DialogTitle,
DialogContent,
DialogActions,
Button,
Box,
Divider,
} from '@mui/material';
import { useTranslation } from 'react-i18next';
import { useForm, FormProvider } from 'react-hook-form';
import GeneralForm from './GeneralForm';
import { RadioFormField } from '@/components/FormField';
import { ChunkMethodItem, PipelineSelectorItem } from '../configuration';
import { DocumentParserType, ParseType } from '@/constants/knowledge';
import { useKnowledgeOperations } from '@/hooks/knowledge-hooks';
import { useSnackbar } from '@/components/Provider/SnackbarProvider';
export interface CreateKnowledgeDialogProps {
open: boolean;
onClose: () => void;
onSuccess?: () => void;
}
function CreateKnowledgeDialog({ open, onClose, onSuccess }: CreateKnowledgeDialogProps) {
const { t } = useTranslation();
const { showMessage } = useSnackbar();
const { createKnowledge, loading, clearError } = useKnowledgeOperations();
// 表单实例与默认值
const form = useForm<any>({
defaultValues: {
name: '',
description: '',
permission: 'me',
avatar: undefined,
pagerank: 0,
embd_id: '',
// 解析相关
parser_id: DocumentParserType.Naive,
pipeline_id: '',
parseType: ParseType.BuildIn,
},
});
const [parseType, setParseType] = useState<ParseType>(ParseType.BuildIn);
// 同步 parseType 到表单并清理互斥字段
useEffect(() => {
form.setValue('parseType', parseType);
if (parseType === ParseType.BuildIn) {
// 选择内置解析时清空 pipeline_id
form.setValue('pipeline_id', '');
}
}, [parseType]);
const handleSubmit = async (data: any) => {
clearError();
try {
// 构建创建数据basicData + 解析选择)
const requestData = {
name: data.name,
description: data.description,
permission: data.permission,
avatar: data.avatar,
pagerank: data.pagerank,
embd_id: data.embd_id,
// 解析相关字段:后端已支持 parser_id / pipeline_id
parser_id: data.parser_id,
pipeline_id: data.pipeline_id,
};
await createKnowledge(requestData);
showMessage.success(t('knowledgeConfiguration.createSuccess'));
onSuccess?.();
onClose();
} catch (err) {
// 错误提示由 hook 内部处理,这里保底提示
showMessage.error(t('knowledgeConfiguration.createFailed'));
}
};
const handleCancel = () => {
onClose();
};
return (
<Dialog open={open} onClose={onClose} maxWidth="md" fullWidth>
<DialogTitle>{t('knowledgeList.createKnowledgeBase')}</DialogTitle>
<FormProvider {...form}>
<DialogContent>
{/* 基础信息表单名称、描述、权限、头像、嵌入模型、Pagerank 等) */}
<GeneralForm />
<Divider sx={{ my: 2 }} />
{/* 解析方式选择与联动(来自 ChunkMethodForm */}
<Box sx={{ px: 1 }}>
<RadioFormField
name="parseType"
label={t('knowledgeConfiguration.parseType')}
defaultValue={parseType}
options={[
{ value: ParseType.BuildIn, label: 'Built-in' },
{ value: ParseType.Pipeline, label: 'Pipeline' },
]}
onChangeValue={(v) => setParseType(v as ParseType)}
/>
{/* 基于模式内置显示切片方法Pipeline 显示选择器 */}
<Box sx={{ mt: 2 }}>
{parseType === ParseType.BuildIn ? (
<ChunkMethodItem />
) : (
<PipelineSelectorItem />
)}
</Box>
</Box>
</DialogContent>
</FormProvider>
<DialogActions>
<Button onClick={handleCancel} disabled={loading}>{t('common.cancel')}</Button>
<Button onClick={form.handleSubmit(handleSubmit)} variant="contained" disabled={loading}>
{loading ? t('knowledgeConfiguration.creating') : t('knowledgeConfiguration.createAndNext')}
</Button>
</DialogActions>
</Dialog>
);
}
export default CreateKnowledgeDialog;