Fix:Automatically enable metadata and optimize parser dialog logic (#12553)

### What problem does this PR solve?

Fix:Automatically enable metadata and optimize parser dialog logic

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
This commit is contained in:
chanx
2026-01-12 15:29:50 +08:00
committed by GitHub
parent a7dd3b7e9e
commit d4f8c724ed
8 changed files with 88 additions and 33 deletions

View File

@ -67,6 +67,7 @@ export interface ParserConfig {
tag_kb_ids?: string[]; tag_kb_ids?: string[];
topn_tags?: number; topn_tags?: number;
graphrag?: { use_graphrag?: boolean }; graphrag?: { use_graphrag?: boolean };
enable_metadata?: boolean;
} }
export interface IKnowledgeFileParserConfig { export interface IKnowledgeFileParserConfig {

View File

@ -389,6 +389,7 @@ export const useManageMetaDataModal = (
const { data: res } = await kbService.kbUpdateMetaData({ const { data: res } = await kbService.kbUpdateMetaData({
kb_id: id, kb_id: id,
metadata: data, metadata: data,
enable_metadata: true,
}); });
if (res.code === 0) { if (res.code === 0) {
message.success(t('message.operated')); message.success(t('message.operated'));

View File

@ -0,0 +1,34 @@
import { IKnowledge } from '@/interfaces/database/knowledge';
import React, { createContext, ReactNode, useContext } from 'react';
interface KnowledgeBaseContextType {
knowledgeBase: IKnowledge | null;
loading: boolean;
}
const KnowledgeBaseContext = createContext<
KnowledgeBaseContextType | undefined
>(undefined);
export const KnowledgeBaseProvider: React.FC<{
children: ReactNode;
knowledgeBase: IKnowledge | null;
loading: boolean;
}> = ({ children, knowledgeBase, loading }) => {
return (
<KnowledgeBaseContext.Provider value={{ knowledgeBase, loading }}>
{children}
</KnowledgeBaseContext.Provider>
);
};
// eslint-disable-next-line react-refresh/only-export-components
export const useKnowledgeBaseContext = (): KnowledgeBaseContextType => {
const context = useContext(KnowledgeBaseContext);
if (context === undefined) {
throw new Error(
'useKnowledgeBaseContext must be used within a KnowledgeBaseProvider',
);
}
return context;
};

View File

@ -431,6 +431,7 @@ export function AutoMetadata({
const handleSaveMetadata = (data?: IMetaDataReturnJSONSettings) => { const handleSaveMetadata = (data?: IMetaDataReturnJSONSettings) => {
form.setValue('parser_config.metadata', data || []); form.setValue('parser_config.metadata', data || []);
form.setValue('parser_config.enable_metadata', true);
}; };
return ( return (
<> <>

View File

@ -21,6 +21,7 @@ import {
useManageMetadata, useManageMetadata,
} from '../components/metedata/hooks/use-manage-modal'; } from '../components/metedata/hooks/use-manage-modal';
import { ManageMetadataModal } from '../components/metedata/manage-modal'; import { ManageMetadataModal } from '../components/metedata/manage-modal';
import { useKnowledgeBaseContext } from '../contexts/knowledge-base-context';
import { DatasetTable } from './dataset-table'; import { DatasetTable } from './dataset-table';
import Generate from './generate-button/generate'; import Generate from './generate-button/generate';
import { ReparseDialog } from './reparse-dialog'; import { ReparseDialog } from './reparse-dialog';
@ -38,7 +39,7 @@ export default function Dataset() {
onDocumentUploadOk, onDocumentUploadOk,
documentUploadLoading, documentUploadLoading,
} = useHandleUploadDocument(); } = useHandleUploadDocument();
const { knowledgeBase } = useKnowledgeBaseContext();
const { const {
searchString, searchString,
documents, documents,
@ -221,8 +222,11 @@ export default function Dataset() {
)} )}
{reparseDialogVisible && ( {reparseDialogVisible && (
<ReparseDialog <ReparseDialog
// hidden={isZeroChunk || isRunning} hidden={
hidden={false} chunkNum === 0 && !knowledgeBase?.parser_config?.enable_metadata
}
// hidden={false}
enable_metadata={knowledgeBase?.parser_config?.enable_metadata}
handleOperationIconClick={handleOperationIconClick} handleOperationIconClick={handleOperationIconClick}
chunk_num={chunkNum} chunk_num={chunkNum}
visible={reparseDialogVisible} visible={reparseDialogVisible}

View File

@ -183,8 +183,12 @@ export function ParsingStatusCell({
)} )}
{reparseDialogVisible && ( {reparseDialogVisible && (
<ReparseDialog <ReparseDialog
hidden={isRunning} hidden={
(isZeroChunk && !record?.parser_config?.enable_metadata) ||
isRunning
}
// hidden={false} // hidden={false}
enable_metadata={record?.parser_config?.enable_metadata}
handleOperationIconClick={handleOperationIconClick} handleOperationIconClick={handleOperationIconClick}
chunk_num={chunk_num} chunk_num={chunk_num}
visible={reparseDialogVisible} visible={reparseDialogVisible}

View File

@ -15,6 +15,7 @@ export const ReparseDialog = memo(
({ ({
handleOperationIconClick, handleOperationIconClick,
chunk_num, chunk_num,
enable_metadata = false,
hidden = false, hidden = false,
visible = true, visible = true,
hideModal, hideModal,
@ -24,6 +25,7 @@ export const ReparseDialog = memo(
delete: boolean; delete: boolean;
apply_kb: boolean; apply_kb: boolean;
}) => void; }) => void;
enable_metadata?: boolean;
visible: boolean; visible: boolean;
hideModal: () => void; hideModal: () => void;
hidden?: boolean; hidden?: boolean;
@ -92,13 +94,16 @@ export const ReparseDialog = memo(
</div> </div>
), ),
}; };
if (chunk_num > 0) { if (chunk_num > 0 && enable_metadata) {
setFields([deleteField, applyKBField]); setFields([deleteField, applyKBField]);
} } else if (chunk_num > 0 && !enable_metadata) {
if (chunk_num <= 0) { setFields([deleteField]);
} else if (chunk_num <= 0 && enable_metadata) {
setFields([applyKBField]); setFields([applyKBField]);
} else {
setFields([]);
} }
}, [chunk_num, t]); }, [chunk_num, t, enable_metadata]);
const formCallbackRef = useRef<DynamicFormRef>(null); const formCallbackRef = useRef<DynamicFormRef>(null);
@ -167,3 +172,5 @@ export const ReparseDialog = memo(
); );
}, },
); );
ReparseDialog.displayName = 'ReparseDialog';

View File

@ -9,6 +9,7 @@ import {
} from '@/components/ui/breadcrumb'; } from '@/components/ui/breadcrumb';
import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks'; import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks';
import { useFetchKnowledgeBaseConfiguration } from '@/hooks/use-knowledge-request'; import { useFetchKnowledgeBaseConfiguration } from '@/hooks/use-knowledge-request';
import { KnowledgeBaseProvider } from '@/pages/dataset/contexts/knowledge-base-context';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { Outlet } from 'react-router'; import { Outlet } from 'react-router';
import { SideBar } from './sidebar'; import { SideBar } from './sidebar';
@ -16,33 +17,35 @@ import { SideBar } from './sidebar';
export default function DatasetWrapper() { export default function DatasetWrapper() {
const { navigateToDatasetList } = useNavigatePage(); const { navigateToDatasetList } = useNavigatePage();
const { t } = useTranslation(); const { t } = useTranslation();
const { data } = useFetchKnowledgeBaseConfiguration(); const { data, loading } = useFetchKnowledgeBaseConfiguration();
return ( return (
<section className="flex h-full flex-col w-full"> <KnowledgeBaseProvider knowledgeBase={data} loading={loading}>
<PageHeader> <section className="flex h-full flex-col w-full">
<Breadcrumb> <PageHeader>
<BreadcrumbList> <Breadcrumb>
<BreadcrumbItem> <BreadcrumbList>
<BreadcrumbLink onClick={navigateToDatasetList}> <BreadcrumbItem>
{t('knowledgeDetails.dataset')} <BreadcrumbLink onClick={navigateToDatasetList}>
</BreadcrumbLink> {t('knowledgeDetails.dataset')}
</BreadcrumbItem> </BreadcrumbLink>
<BreadcrumbSeparator /> </BreadcrumbItem>
<BreadcrumbItem> <BreadcrumbSeparator />
<BreadcrumbPage className="w-28 whitespace-nowrap text-ellipsis overflow-hidden"> <BreadcrumbItem>
{data.name} <BreadcrumbPage className="w-28 whitespace-nowrap text-ellipsis overflow-hidden">
</BreadcrumbPage> {data.name}
</BreadcrumbItem> </BreadcrumbPage>
</BreadcrumbList> </BreadcrumbItem>
</Breadcrumb> </BreadcrumbList>
</PageHeader> </Breadcrumb>
<div className="flex flex-1 min-h-0"> </PageHeader>
<SideBar></SideBar> <div className="flex flex-1 min-h-0">
<div className="flex-1 overflow-auto"> <SideBar></SideBar>
<Outlet /> <div className="flex-1 overflow-auto">
<Outlet />
</div>
</div> </div>
</div> </section>
</section> </KnowledgeBaseProvider>
); );
} }