feat(knowledge): add parse type enum and refactor configuration components

refactor(configuration): replace buildMode with parseType in all config components
This commit is contained in:
2025-11-07 13:30:59 +08:00
parent b2d4d32375
commit b610ee0a8f
25 changed files with 307 additions and 224 deletions

View File

@@ -106,3 +106,8 @@ export const KNOWLEDGE_SEARCH_PARAMS_KEYS = Object.freeze({
export type KnowledgeSearchParams = (typeof KNOWLEDGE_SEARCH_PARAMS_KEYS)[keyof typeof KNOWLEDGE_SEARCH_PARAMS_KEYS] export type KnowledgeSearchParams = (typeof KNOWLEDGE_SEARCH_PARAMS_KEYS)[keyof typeof KNOWLEDGE_SEARCH_PARAMS_KEYS]
export const DATABASE_BASE_KEY = 'dataset'; export const DATABASE_BASE_KEY = 'dataset';
export enum ParseType {
BuildIn = '1',
Pipeline = '2',
}

View File

@@ -92,6 +92,8 @@ export default {
knowledgeBase: 'Knowledge Base', knowledgeBase: 'Knowledge Base',
knowledgeBaseDetail: 'Knowledge Base Detail', knowledgeBaseDetail: 'Knowledge Base Detail',
settings: 'Settings', settings: 'Settings',
overview: 'Overview',
fileLogs: 'File Logs',
knowledgeBaseSettings: 'Knowledge Base Settings', knowledgeBaseSettings: 'Knowledge Base Settings',
settingsTabs: 'Settings Tabs', settingsTabs: 'Settings Tabs',
backToKnowledgeDetail: 'Back to Knowledge Base Detail', backToKnowledgeDetail: 'Back to Knowledge Base Detail',
@@ -652,7 +654,7 @@ export default {
dataFlowPlaceholder: 'Please select a pipeline.', dataFlowPlaceholder: 'Please select a pipeline.',
buildItFromScratch: 'Build it from scratch', buildItFromScratch: 'Build it from scratch',
dataFlow: 'Pipeline', dataFlow: 'Pipeline',
parseType: 'Parse Type', parseType: 'Ingestion pipeline',
manualSetup: 'Manual Setup', manualSetup: 'Manual Setup',
builtIn: 'Built-in', builtIn: 'Built-in',
titleDescription: titleDescription:
@@ -1227,6 +1229,8 @@ This auto-tagging feature enhances retrieval by adding another layer of domain-s
editAgent: 'Edit Agent', editAgent: 'Edit Agent',
deleteAgent: 'Delete Agent', deleteAgent: 'Delete Agent',
searchAgent: 'Search Agent',
forms: { forms: {
title: 'Title', title: 'Title',
avatar: 'Avatar', avatar: 'Avatar',

View File

@@ -393,6 +393,8 @@ export default {
knowledgeBase: '知识库', knowledgeBase: '知识库',
knowledgeBaseDetail: '知识库详情', knowledgeBaseDetail: '知识库详情',
settings: '设置', settings: '设置',
overview: '概览',
fileLogs: '文件日志',
knowledgeBaseSettings: '知识库设置', knowledgeBaseSettings: '知识库设置',
settingsTabs: '设置选项卡', settingsTabs: '设置选项卡',
backToKnowledgeDetail: '返回知识库详情', backToKnowledgeDetail: '返回知识库详情',
@@ -1194,6 +1196,8 @@ General实体和关系提取提示来自 GitHub - microsoft/graphrag基于
editAgent: '编辑智能体', editAgent: '编辑智能体',
deleteAgent: '删除智能体', deleteAgent: '删除智能体',
searchAgent: '搜索智能体',
forms: { forms: {
title: '标题', title: '标题',
avatar: '头像', avatar: '头像',

View File

@@ -85,7 +85,7 @@ function AgentListPage() {
<TextField <TextField
value={searchValue} value={searchValue}
onChange={(e) => handleSearch(e.target.value)} onChange={(e) => handleSearch(e.target.value)}
placeholder="搜索名称或描述" placeholder={t('agent.searchAgent')}
size="small" size="small"
InputProps={{ InputProps={{
startAdornment: ( startAdornment: (
@@ -95,7 +95,9 @@ function AgentListPage() {
) )
}} }}
/> />
<Button variant="outlined" startIcon={<RefreshIcon />} onClick={refresh}></Button> <Button variant="outlined" startIcon={<RefreshIcon />} onClick={refresh}>
{t('common.refresh')}
</Button>
</Box> </Box>
</Paper> </Paper>

View File

@@ -8,7 +8,7 @@ import {
Card, Card,
CardContent, CardContent,
} from '@mui/material'; } from '@mui/material';
import { DOCUMENT_PARSER_TYPES, type DocumentParserType } from '@/constants/knowledge'; import { DOCUMENT_PARSER_TYPES, ParseType, type DocumentParserType } from '@/constants/knowledge';
import { type IParserConfig } from '@/interfaces/database/knowledge'; import { type IParserConfig } from '@/interfaces/database/knowledge';
import { import {
NaiveConfiguration, NaiveConfiguration,
@@ -77,6 +77,7 @@ interface ChunkMethodFormProps {
cancelButtonText?: string; cancelButtonText?: string;
} }
function ChunkMethodForm({ function ChunkMethodForm({
form: propForm, form: propForm,
onSubmit, onSubmit,
@@ -120,9 +121,10 @@ function ChunkMethodForm({
control, control,
name: 'pipeline_id', name: 'pipeline_id',
}); });
const [buildMode, setBuildMode] = useState<'buildIn' | 'pipeline'>(pipeline_id ? 'pipeline' : 'buildIn'); const [parseType, setParseType] = useState<ParseType>(pipeline_id ? ParseType.Pipeline : ParseType.BuildIn);
useEffect(() => { useEffect(() => {
setBuildMode(pipeline_id ? 'pipeline' : 'buildIn'); setParseType(pipeline_id ? ParseType.Pipeline : ParseType.BuildIn);
}, [pipeline_id]); }, [pipeline_id]);
// 根据parser_id动态选择配置组件 // 根据parser_id动态选择配置组件
@@ -135,21 +137,21 @@ function ChunkMethodForm({
return ( return (
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 构建模式选择与联动 */} {/* 构建模式选择与联动 */}
<Card sx={{ p: 3 }}> <Card sx={{ px: 3, marginX: 3 }}>
<CardContent> <CardContent>
<RadioFormField <RadioFormField
name="build_mode" name="parseType"
label={t('knowledge.config.buildMode')} label={t('knowledgeConfiguration.parseType')}
defaultValue={buildMode} defaultValue={parseType}
options={[ options={[
{ value: 'buildIn', label: 'Built-in' }, { value: ParseType.BuildIn, label: 'Built-in' },
{ value: 'pipeline', label: 'Pipeline' }, { value: ParseType.Pipeline, label: 'Pipeline' },
]} ]}
onChangeValue={(v) => setBuildMode(String(v) as 'buildIn' | 'pipeline')} onChangeValue={(v) => setParseType(v as ParseType)}
/> />
{/* 基于模式内置显示切片方法Pipeline 显示选择器 */} {/* 基于模式内置显示切片方法Pipeline 显示选择器 */}
{buildMode === 'buildIn' ? ( {parseType === ParseType.BuildIn ? (
<ChunkMethodItem /> <ChunkMethodItem />
) : ( ) : (
<PipelineSelectorItem /> <PipelineSelectorItem />
@@ -157,8 +159,8 @@ function ChunkMethodForm({
</CardContent> </CardContent>
</Card> </Card>
{/* 动态配置内容:始终渲染,内部按 buildMode 控制基础配置显示 */} {/* 动态配置内容:始终渲染,内部按 parseType 控制基础配置显示 */}
<ConfigurationComponent buildMode={buildMode} /> <ConfigurationComponent parseType={parseType} />
{/* 表单操作按钮 - 仅在有onSubmit回调时显示 */} {/* 表单操作按钮 - 仅在有onSubmit回调时显示 */}
{onSubmit && ( {onSubmit && (

View File

@@ -0,0 +1,132 @@
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 { DOCUMENT_PARSER_TYPES, 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: DOCUMENT_PARSER_TYPES.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;

View File

@@ -32,11 +32,11 @@ const FloatingActionButtons: React.FC<FloatingActionButtonsProps> = ({
name: t('knowledge.configSettings'), name: t('knowledge.configSettings'),
onClick: onConfigClick, onClick: onConfigClick,
}, },
{ // {
icon: <OverviewIcon />, // icon: <OverviewIcon />,
name: t('knowledgeDetails.overview'), // name: t('knowledgeDetails.overview'),
onClick: onOverviewClick, // onClick: onOverviewClick,
}, // },
]; ];
return ( return (

View File

@@ -12,14 +12,14 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container'; import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
AutoKeywordsItem, AutoKeywordsItem,
AutoQuestionsItem, AutoQuestionsItem,
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems, KnowledgeGraphConfigItems,
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function AudioConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function AudioConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext(); const { formState: { errors } } = useFormContext();
const { t } = useTranslation(); const { t } = useTranslation();
@@ -27,18 +27,12 @@ export function AudioConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'bui
<ConfigurationFormContainer> <ConfigurationFormContainer>
<MainContainer> <MainContainer>
{/* 第一部分basicConfig 基础配置 */} {/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && ( {parseType === ParseType.BuildIn && (
<Accordion defaultExpanded> <Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography> <Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary> </AccordionSummary>
<AccordionDetails> <AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>
{/* 自动关键词提取 */} {/* 自动关键词提取 */}
<AutoKeywordsItem /> <AutoKeywordsItem />

View File

@@ -4,30 +4,28 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container'; import { ConfigurationFormContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
ChunkTokenNumberItem, ChunkTokenNumberItem,
DelimiterItem, DelimiterItem,
TOCEnhanceItem, TOCEnhanceItem,
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems KnowledgeGraphConfigItems
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function BookConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function BookConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<ConfigurationFormContainer> <ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */} {/* 第一部分:基础配置 */}
{buildMode === 'buildIn' && ( {parseType === ParseType.BuildIn && (
<Accordion defaultExpanded> <Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography> <Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary> </AccordionSummary>
<AccordionDetails> <AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
{/* 分块token数 */} {/* 分块token数 */}
<ChunkTokenNumberItem /> <ChunkTokenNumberItem />
{/* 分隔符 */} {/* 分隔符 */}

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container'; import { ConfigurationFormContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems KnowledgeGraphConfigItems
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function EmailConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function EmailConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<ConfigurationFormContainer> <ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */} {/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 第二部分RAPTOR策略 */} {/* 第二部分RAPTOR策略 */}
<Accordion> <Accordion>

View File

@@ -12,7 +12,6 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container'; import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
EmbeddingModelItem, EmbeddingModelItem,
AutoKeywordsItem, AutoKeywordsItem,
AutoQuestionsItem, AutoQuestionsItem,
@@ -28,8 +27,9 @@ import {
EntityNormalizeItem, EntityNormalizeItem,
CommunityReportItem, CommunityReportItem,
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function KnowledgeGraphConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function KnowledgeGraphConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext(); const { formState: { errors } } = useFormContext();
const { t } = useTranslation(); const { t } = useTranslation();
@@ -37,16 +37,12 @@ export function KnowledgeGraphConfiguration({ buildMode = 'buildIn' }: { buildMo
<ConfigurationFormContainer> <ConfigurationFormContainer>
<MainContainer> <MainContainer>
{/* 第一部分basicConfig 基础配置 */} {/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && ( {parseType === ParseType.BuildIn && (
<Accordion defaultExpanded> <Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography> <Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary> </AccordionSummary>
<AccordionDetails> <AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider /> <Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container'; import { ConfigurationFormContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems KnowledgeGraphConfigItems
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function LawsConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function LawsConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<ConfigurationFormContainer> <ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */} {/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 第二部分RAPTOR策略 */} {/* 第二部分RAPTOR策略 */}
<Accordion> <Accordion>

View File

@@ -12,7 +12,6 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container'; import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
ChunkTokenNumberItem, ChunkTokenNumberItem,
DelimiterItem, DelimiterItem,
LayoutRecognizeItem, LayoutRecognizeItem,
@@ -33,8 +32,9 @@ import {
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems, KnowledgeGraphConfigItems,
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function ManualConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function ManualConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext(); const { formState: { errors } } = useFormContext();
const { t } = useTranslation(); const { t } = useTranslation();
@@ -42,16 +42,12 @@ export function ManualConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'bu
<ConfigurationFormContainer> <ConfigurationFormContainer>
<MainContainer> <MainContainer>
{/* 第一部分basicConfig 基础配置 */} {/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && ( {parseType === ParseType.BuildIn && (
<Accordion defaultExpanded> <Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography> <Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary> </AccordionSummary>
<AccordionDetails> <AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider /> <Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>

View File

@@ -12,9 +12,10 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container'; import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import { RaptorConfigItems, KnowledgeGraphConfigItems, BasicConfigItems } from './common-items'; import { RaptorConfigItems, KnowledgeGraphConfigItems, BasicConfigItems } from './common-items';
import { ParseType } from '@/constants/knowledge';
// import { RadioFormField } from '@/components/FormField'; // import { RadioFormField } from '@/components/FormField';
export function NaiveConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function NaiveConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext(); const { formState: { errors } } = useFormContext();
const { t } = useTranslation(); const { t } = useTranslation();
@@ -22,7 +23,7 @@ export function NaiveConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'bui
<ConfigurationFormContainer> <ConfigurationFormContainer>
<MainContainer> <MainContainer>
{/* 第一部分basicConfig 基础配置 */} {/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && ( {parseType === ParseType.BuildIn && (
<Accordion defaultExpanded> <Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography> <Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>

View File

@@ -12,7 +12,6 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container'; import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
ChunkTokenNumberItem, ChunkTokenNumberItem,
DelimiterItem, DelimiterItem,
LayoutRecognizeItem, LayoutRecognizeItem,
@@ -22,8 +21,9 @@ import {
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems, KnowledgeGraphConfigItems,
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function OneConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function OneConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext(); const { formState: { errors } } = useFormContext();
const { t } = useTranslation(); const { t } = useTranslation();
@@ -31,16 +31,12 @@ export function OneConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'build
<ConfigurationFormContainer> <ConfigurationFormContainer>
<MainContainer> <MainContainer>
{/* 第一部分basicConfig 基础配置 */} {/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && ( {parseType === ParseType.BuildIn && (
<Accordion defaultExpanded> <Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography> <Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary> </AccordionSummary>
<AccordionDetails> <AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider /> <Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>

View File

@@ -12,15 +12,15 @@ import { useFormContext } from 'react-hook-form';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer, MainContainer } from './configuration-form-container'; import { ConfigurationFormContainer, MainContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
LayoutRecognizeItem, LayoutRecognizeItem,
AutoKeywordsItem, AutoKeywordsItem,
AutoQuestionsItem, AutoQuestionsItem,
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems, KnowledgeGraphConfigItems,
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function PaperConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function PaperConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { formState: { errors } } = useFormContext(); const { formState: { errors } } = useFormContext();
const { t } = useTranslation(); const { t } = useTranslation();
@@ -28,16 +28,12 @@ export function PaperConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'bui
<ConfigurationFormContainer> <ConfigurationFormContainer>
<MainContainer> <MainContainer>
{/* 第一部分basicConfig 基础配置 */} {/* 第一部分basicConfig 基础配置 */}
{buildMode === 'buildIn' && ( {parseType === ParseType.BuildIn && (
<Accordion defaultExpanded> <Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography> <Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary> </AccordionSummary>
<AccordionDetails> <AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider /> <Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container'; import { ConfigurationFormContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems KnowledgeGraphConfigItems
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function PictureConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function PictureConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<ConfigurationFormContainer> <ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */} {/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 第二部分RAPTOR策略 */} {/* 第二部分RAPTOR策略 */}
<Accordion> <Accordion>

View File

@@ -4,32 +4,28 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container'; import { ConfigurationFormContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems, KnowledgeGraphConfigItems,
LayoutRecognizeItem, LayoutRecognizeItem,
AutoKeywordsItem, AutoKeywordsItem,
AutoQuestionsItem AutoQuestionsItem
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function PresentationConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function PresentationConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<ConfigurationFormContainer> <ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */} {/* 第一部分:基础配置 */}
{buildMode === 'buildIn' && ( {parseType === ParseType.BuildIn && (
<Accordion defaultExpanded> <Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}> <AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography> <Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary> </AccordionSummary>
<AccordionDetails> <AccordionDetails>
{/* 切片方法 */} <Divider />
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider />
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, mt: 3 }}>
{/* 版面识别 */} {/* 版面识别 */}

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container'; import { ConfigurationFormContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems KnowledgeGraphConfigItems
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function QAConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function QAConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<ConfigurationFormContainer> <ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */} {/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 第二部分RAPTOR策略 */} {/* 第二部分RAPTOR策略 */}
<Accordion> <Accordion>

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container'; import { ConfigurationFormContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems KnowledgeGraphConfigItems
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function ResumeConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function ResumeConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<ConfigurationFormContainer> <ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */} {/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 第二部分RAPTOR策略 */} {/* 第二部分RAPTOR策略 */}
<Accordion> <Accordion>

View File

@@ -4,31 +4,18 @@ import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container'; import { ConfigurationFormContainer } from './configuration-form-container';
import { import {
ChunkMethodItem,
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems KnowledgeGraphConfigItems
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function TableConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function TableConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<ConfigurationFormContainer> <ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */} {/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 分块方法 */}
<ChunkMethodItem />
</Box>
</AccordionDetails>
</Accordion>
)}
{/* 第二部分RAPTOR策略 */} {/* 第二部分RAPTOR策略 */}
<Accordion> <Accordion>

View File

@@ -1,38 +1,24 @@
import React from 'react'; import React from 'react';
import { Box, Typography, Accordion, AccordionSummary, AccordionDetails, Divider } from '@mui/material'; import { Box, Typography, Accordion, AccordionSummary, AccordionDetails } from '@mui/material';
import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material'; import { ExpandMore as ExpandMoreIcon } from '@mui/icons-material';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { ConfigurationFormContainer } from './configuration-form-container'; import { ConfigurationFormContainer } from './configuration-form-container';
import { import {
RaptorConfigItems, RaptorConfigItems,
KnowledgeGraphConfigItems, KnowledgeGraphConfigItems,
ChunkMethodItem,
LayoutRecognizeItem, LayoutRecognizeItem,
AutoKeywordsItem, AutoKeywordsItem,
AutoQuestionsItem AutoQuestionsItem
} from './common-items'; } from './common-items';
import { ParseType } from '@/constants/knowledge';
export function TagConfiguration({ buildMode = 'buildIn' }: { buildMode?: 'buildIn' | 'pipeline' }) { export function TagConfiguration({ parseType = ParseType.BuildIn }: { parseType?: ParseType }) {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
<ConfigurationFormContainer> <ConfigurationFormContainer>
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}> <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
{/* 第一部分:基础配置 */} {/* 基础配置:已在 ChunkMethodForm 中处理,且仅在 buildIn 时显示 */}
{buildMode === 'buildIn' && (
<Accordion defaultExpanded>
<AccordionSummary expandIcon={<ExpandMoreIcon />}>
<Typography variant="h6">{t('knowledge.config.basicConfig')}</Typography>
</AccordionSummary>
<AccordionDetails>
{/* 切片方法 */}
<Box sx={{ mb: 3 }}>
<ChunkMethodItem />
</Box>
<Divider />
</AccordionDetails>
</Accordion>
)}
{/* 第二部分RAPTOR策略 */} {/* 第二部分RAPTOR策略 */}
<Accordion> <Accordion>

View File

@@ -26,6 +26,7 @@ import type { IKnowledge } from '@/interfaces/database/knowledge';
import { useDialog } from '@/hooks/useDialog'; import { useDialog } from '@/hooks/useDialog';
import logger from '@/utils/logger'; import logger from '@/utils/logger';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import CreateKnowledgeDialog from './components/CreateKnowledgeDialog';
const KnowledgeBaseList: React.FC = () => { const KnowledgeBaseList: React.FC = () => {
@@ -88,10 +89,13 @@ const KnowledgeBaseList: React.FC = () => {
refresh(); refresh();
}, [refresh]); }, [refresh]);
// 处理创建知识库 // 创建知识库对话框
const [createDialogOpen, setCreateDialogOpen] = useState(false);
// 处理创建知识库:打开对话框
const handleCreateKnowledge = useCallback(() => { const handleCreateKnowledge = useCallback(() => {
navigate('/knowledge/create'); setCreateDialogOpen(true);
}, [navigate]); }, []);
const dialog = useDialog(); const dialog = useDialog();
@@ -239,6 +243,16 @@ const KnowledgeBaseList: React.FC = () => {
onCreateKnowledge={handleCreateKnowledge} onCreateKnowledge={handleCreateKnowledge}
/> />
{/* 创建知识库对话框 */}
<CreateKnowledgeDialog
open={createDialogOpen}
onClose={() => setCreateDialogOpen(false)}
onSuccess={() => {
setCreateDialogOpen(false);
refresh();
}}
/>
{/* 分页组件 */} {/* 分页组件 */}
{totalPages > 1 && ( {totalPages > 1 && (
<Box sx={{ display: 'flex', justifyContent: 'center', mt: 4 }}> <Box sx={{ display: 'flex', justifyContent: 'center', mt: 4 }}>

View File

@@ -1,15 +1,17 @@
import React from 'react'; import React from 'react';
import { Box, Grid, Paper, Typography, IconButton, TextField, Tabs, Tab } from '@mui/material'; import { Box, Grid, Paper, Typography, IconButton, TextField, Tabs, Tab, Fab } from '@mui/material';
import { DataGrid, type GridColDef } from '@mui/x-data-grid'; import { DataGrid, type GridColDef } from '@mui/x-data-grid';
import FilterListIcon from '@mui/icons-material/FilterList'; import {
import SearchIcon from '@mui/icons-material/Search'; ArrowBack as ArrowBackIcon,
Search as SearchIcon,
} from '@mui/icons-material';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router-dom'; import { useNavigate, useParams } from 'react-router-dom';
import { useKnowledgeOverview } from '@/hooks/knowledge-hooks'; import { useKnowledgeOverview, useKnowledgeDetail } from '@/hooks/knowledge-hooks';
import type { IDocumentLog, IFileLogItem } from '@/interfaces/database/knowledge';
import logger from '@/utils/logger'; import logger from '@/utils/logger';
import i18n, { LanguageAbbreviation } from '@/locales'; import i18n, { LanguageAbbreviation } from '@/locales';
import { enUS, zhCN } from '@mui/x-data-grid/locales'; import { enUS, zhCN } from '@mui/x-data-grid/locales';
import KnowledgeBreadcrumbs from './components/KnowledgeBreadcrumbs';
const PROCESSING_TYPES = { const PROCESSING_TYPES = {
@@ -34,7 +36,6 @@ function KnowledgeLogsPage() {
return currentLanguage === LanguageAbbreviation.Zh ? zhCN : enUS; return currentLanguage === LanguageAbbreviation.Zh ? zhCN : enUS;
}; };
// 路由参数与数据Hook // 路由参数与数据Hook
const { id: kbId = '' } = useParams(); const { id: kbId = '' } = useParams();
const { const {
@@ -52,6 +53,9 @@ function KnowledgeLogsPage() {
setKeywords, setKeywords,
} = useKnowledgeOverview(kbId); } = useKnowledgeOverview(kbId);
// 获取知识库详情以用于面包屑显示名称
const { knowledge } = useKnowledgeDetail(kbId);
// 同步分页模型到Hook // 同步分页模型到Hook
React.useEffect(() => { React.useEffect(() => {
setPaginationModel({ page: Math.max(currentPage - 1, 0), pageSize }); setPaginationModel({ page: Math.max(currentPage - 1, 0), pageSize });
@@ -94,8 +98,29 @@ function KnowledgeLogsPage() {
(datasetLogs?.total || 0)), (datasetLogs?.total || 0)),
[activeTab, fileLogs, datasetLogs]); [activeTab, fileLogs, datasetLogs]);
const navigate = useNavigate();
const handleNavigateBack = () => {
navigate(`/knowledge/${kbId}`);
};
return ( return (
<Box sx={{ p: 3 }}> <Box sx={{ p: 3 }}>
{/* 面包屑导航 */}
<KnowledgeBreadcrumbs
kbItems={[
{
label: t('knowledgeSettings.knowledgeBase'),
path: '/knowledge'
},
{
label: knowledge?.name || t('knowledgeSettings.knowledgeBaseDetail'),
path: `/knowledge/${kbId}`
},
{
label: t('knowledgeSettings.fileLogs')
}
]}
/>
{/* 顶部统计卡片占位 */} {/* 顶部统计卡片占位 */}
<Grid container spacing={2} sx={{ mb: 2 }}> <Grid container spacing={2} sx={{ mb: 2 }}>
<Grid size={{ xs: 12, md: 4 }}> <Grid size={{ xs: 12, md: 4 }}>
@@ -124,8 +149,8 @@ function KnowledgeLogsPage() {
{/* Tabs & Filter/Search */} {/* Tabs & Filter/Search */}
<Box display="flex" alignItems="center" gap={2} sx={{ mb: 2 }}> <Box display="flex" alignItems="center" gap={2} sx={{ mb: 2 }}>
<Tabs value={activeTab} onChange={(_, v) => setActiveTab(v)}> <Tabs value={activeTab} onChange={(_, v) => setActiveTab(v)}>
<Tab value="file" label={t('knowledgeDetails.file')} /> <Tab value="fileLogs" label={t('knowledgeDetails.file')} />
<Tab value="dataset" label={t('knowledgeDetails.dataset')} /> <Tab value="datasetLogs" label={t('knowledgeDetails.dataset')} />
</Tabs> </Tabs>
{/* <IconButton aria-label="filter"><FilterListIcon /></IconButton> */} {/* <IconButton aria-label="filter"><FilterListIcon /></IconButton> */}
<Box display="flex" alignItems="center" gap={1} sx={{ ml: 'auto' }}> <Box display="flex" alignItems="center" gap={1} sx={{ ml: 'auto' }}>
@@ -155,6 +180,20 @@ function KnowledgeLogsPage() {
localeText={getDataGridLocale().components.MuiDataGrid.defaultProps.localeText} localeText={getDataGridLocale().components.MuiDataGrid.defaultProps.localeText}
/> />
</Paper> </Paper>
{/* 返回按钮 */}
<Fab
color="primary"
aria-label={t('knowledgeSettings.backToKnowledgeDetail')}
onClick={handleNavigateBack}
sx={{
position: 'fixed',
bottom: 128,
right: 64,
}}
>
<ArrowBackIcon />
</Fab>
</Box> </Box>
); );
} }

View File

@@ -106,10 +106,10 @@ function KnowledgeBaseSetting() {
setTabValue(newValue); setTabValue(newValue);
}; };
const handleSubmit = async ({data}: {data: any}) => { const handleSubmit = async ({ data }: { data: any }) => {
if (!knowledge) return; if (!knowledge) return;
console.log(t('knowledgeSettings.submitData'), data); console.log(t('knowledgeSettings.submitData'), data);
try { try {
// 分别处理基础信息和配置信息 // 分别处理基础信息和配置信息
if (tabValue === 'generalForm') { if (tabValue === 'generalForm') {
@@ -142,12 +142,12 @@ function KnowledgeBaseSetting() {
await updateKnowledgeModelConfig(configData); await updateKnowledgeModelConfig(configData);
showMessage.success(t('knowledgeSettings.parseConfigUpdateSuccess')); showMessage.success(t('knowledgeSettings.parseConfigUpdateSuccess'));
} }
// 刷新知识库详情 // 刷新知识库详情
refresh(); refresh();
} catch (error) { } catch (error) {
showMessage.error(t('knowledgeSettings.updateFailed', { showMessage.error(t('knowledgeSettings.updateFailed', {
type: tabValue === 'generalForm' ? t('knowledgeSettings.basicInfo') : t('knowledgeSettings.parseConfig') type: tabValue === 'generalForm' ? t('knowledgeSettings.basicInfo') : t('knowledgeSettings.parseConfig')
})); }));
} }
}; };
@@ -167,7 +167,7 @@ function KnowledgeBaseSetting() {
return ( return (
<MainContainer> <MainContainer>
{/* 面包屑导航 */} {/* 面包屑导航 */}
<KnowledgeBreadcrumbs <KnowledgeBreadcrumbs
kbItems={[ kbItems={[
{ {
label: t('knowledgeSettings.knowledgeBase'), label: t('knowledgeSettings.knowledgeBase'),
@@ -194,27 +194,27 @@ function KnowledgeBaseSetting() {
<FormProvider {...form}> <FormProvider {...form}>
<Form onSubmit={handleSubmit}> <Form onSubmit={handleSubmit}>
<Box sx={{ borderBottom: 1, borderColor: 'divider' }}> <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
<Tabs value={tabValue} onChange={handleTabChange} aria-label={t('knowledgeSettings.settingsTabs')}> <Tabs value={tabValue} onChange={handleTabChange} aria-label={t('knowledgeSettings.settingsTabs')}>
<Tab label={t('knowledgeSettings.basicInfo')} value="generalForm" /> <Tab label={t('knowledgeSettings.basicInfo')} value="generalForm" />
<Tab label={t('knowledgeSettings.parseConfig')} value="chunkMethodForm" /> <Tab label={t('knowledgeSettings.parseConfig')} value="chunkMethodForm" />
</Tabs> </Tabs>
</Box> </Box>
<Box sx={{ mt: 3 }}> <Box sx={{ mt: 3 }}>
{tabValue === 'generalForm' && ( {tabValue === 'generalForm' && (
<GeneralForm /> <GeneralForm />
)} )}
{tabValue === 'chunkMethodForm' && ( {tabValue === 'chunkMethodForm' && (
<ChunkMethodForm /> <ChunkMethodForm />
)} )}
</Box> </Box>
<Box sx={{ mt: 3, display: 'flex', justifyContent: 'flex-end' }}> <Box sx={{ mt: 3, display: 'flex', justifyContent: 'flex-end' }}>
<Button type="submit" variant="contained"> <Button type="submit" variant="contained">
{t('common.save')} {t('common.save')}
</Button> </Button>
</Box> </Box>
</Form> </Form>
</FormProvider> </FormProvider>