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:
@@ -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',
|
||||||
|
}
|
||||||
@@ -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',
|
||||||
|
|||||||
@@ -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: '头像',
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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 && (
|
||||||
|
|||||||
132
src/pages/knowledge/components/CreateKnowledgeDialog.tsx
Normal file
132
src/pages/knowledge/components/CreateKnowledgeDialog.tsx
Normal 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;
|
||||||
@@ -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 (
|
||||||
|
|||||||
@@ -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 />
|
||||||
|
|||||||
@@ -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 />
|
||||||
{/* 分隔符 */}
|
{/* 分隔符 */}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 }}>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 }}>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 }}>
|
||||||
|
|||||||
@@ -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 }}>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 }}>
|
||||||
{/* 版面识别 */}
|
{/* 版面识别 */}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 }}>
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user