mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-29 12:09:31 +08:00
Feat: Delete dataset level graph. (#17474)
### Summary Feat: Delete dataset level graph.
This commit is contained in:
@@ -30,6 +30,7 @@ import {
|
||||
import i18n from '@/locales/config';
|
||||
import kbService, {
|
||||
clearWiki,
|
||||
deleteArtifactsStructure,
|
||||
deleteKnowledgeGraph,
|
||||
getArtifactsAlteration,
|
||||
getArtifactGraph,
|
||||
@@ -95,6 +96,7 @@ export const enum KnowledgeApiAction {
|
||||
RemoveKnowledgeGraph = 'removeKnowledgeGraph',
|
||||
ClearWiki = 'clearWiki',
|
||||
FetchDatasetStructure = 'fetchDatasetStructure',
|
||||
DeleteDatasetStructure = 'deleteDatasetStructure',
|
||||
FetchArtifactAlteration = 'fetchArtifactAlteration',
|
||||
RunArtifactIndex = 'runArtifactIndex',
|
||||
}
|
||||
@@ -833,6 +835,31 @@ export function useFetchDatasetStructureGraph(kind: string, keywords?: string) {
|
||||
return { data, loading };
|
||||
}
|
||||
|
||||
export const useDeleteDatasetStructure = () => {
|
||||
const knowledgeBaseId = useKnowledgeBaseId();
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
const {
|
||||
data,
|
||||
isPending: loading,
|
||||
mutateAsync,
|
||||
} = useMutation({
|
||||
mutationKey: [KnowledgeApiAction.DeleteDatasetStructure],
|
||||
mutationFn: async (kind: string) => {
|
||||
const { data } = await deleteArtifactsStructure(knowledgeBaseId, kind);
|
||||
if (data?.code === 0) {
|
||||
message.success(i18n.t('message.deleted'));
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: DatasetStructureKeys.all(knowledgeBaseId),
|
||||
});
|
||||
}
|
||||
return data?.code;
|
||||
},
|
||||
});
|
||||
|
||||
return { data, loading, deleteDatasetStructure: mutateAsync };
|
||||
};
|
||||
|
||||
export function useFetchKnowledgeMetadata(kbIds: string[] = []) {
|
||||
const { data, isFetching: loading } = useQuery<
|
||||
Record<string, Record<string, string[]>>
|
||||
|
||||
@@ -537,6 +537,7 @@ Example: A 1 KB message with 1024-dim embedding uses ~9 KB. The 5 MB default lim
|
||||
noStructureTimeline: 'No timeline yet',
|
||||
noStructureSessionEssence: 'No session essence yet',
|
||||
noStructureSessionGraph: 'No session graph yet',
|
||||
deleteStructureConfirm: 'Are you sure you want to delete the {{name}}?',
|
||||
contents: 'Navigation',
|
||||
topics: 'Topics',
|
||||
concept: 'Concept',
|
||||
|
||||
@@ -482,6 +482,7 @@ export default {
|
||||
noStructureTimeline: '暂无时间线',
|
||||
noStructureSessionEssence: '暂无会话摘要',
|
||||
noStructureSessionGraph: '暂无会话图谱',
|
||||
deleteStructureConfirm: '确定要删除{{name}}吗?',
|
||||
contents: '导航',
|
||||
topics: '主题',
|
||||
concept: '概念',
|
||||
|
||||
@@ -26,6 +26,12 @@ export const StructureKinds = [
|
||||
|
||||
export type StructureKind = (typeof StructureKinds)[number];
|
||||
|
||||
export const StructureKindLabelKeyMap: Record<StructureKind, string> = {
|
||||
[ViewMode.Graph]: 'knowledgeDetails.structureGraph',
|
||||
[ViewMode.MindMap]: 'knowledgeDetails.structureMindmap',
|
||||
[ViewMode.Timeline]: 'knowledgeDetails.structureTimeline',
|
||||
};
|
||||
|
||||
export type GenerableViewMode = Exclude<ViewMode, ViewMode.Tree>;
|
||||
|
||||
export const ViewModeGenerateTypeMap: Record<GenerableViewMode, GenerateType> =
|
||||
|
||||
@@ -2,11 +2,14 @@ import {
|
||||
SelectWithSearch,
|
||||
SelectWithSearchFlagOptionType,
|
||||
} from '@/components/originui/select-with-search';
|
||||
import { ConfirmDeleteDialog } from '@/components/confirm-delete-dialog';
|
||||
import { getEntityDisplayName } from '@/components/structure-graph/adapters';
|
||||
import { RepresentationRenderer } from '@/components/structure-graph/representation-renderer';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { Card } from '@/components/ui/card';
|
||||
import {
|
||||
DatasetStructureKeys,
|
||||
useDeleteDatasetStructure,
|
||||
useFetchDatasetStructureGraph,
|
||||
useFetchKnowledgeBaseConfiguration,
|
||||
useKnowledgeBaseId,
|
||||
@@ -15,10 +18,16 @@ import { GenerateStatus } from '@/pages/dataset/dataset/generate-button/constant
|
||||
import { useTraceRunData } from '@/pages/dataset/dataset/generate-button/hook';
|
||||
import { useGenerateStatus } from '@/pages/dataset/dataset/generate-button/use-generate-status';
|
||||
import { useQueryClient } from '@tanstack/react-query';
|
||||
import { Trash2 } from 'lucide-react';
|
||||
import { useCallback, useEffect, useMemo, useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import { StructureKind, ViewMode, ViewModeGenerateTypeMap } from './constants';
|
||||
import {
|
||||
StructureKind,
|
||||
StructureKindLabelKeyMap,
|
||||
ViewMode,
|
||||
ViewModeGenerateTypeMap,
|
||||
} from './constants';
|
||||
import CompilationEmptyState from './empty-state';
|
||||
import { CompilationLoadingCard } from './loading-card';
|
||||
|
||||
@@ -35,6 +44,8 @@ export function DatasetStructureView({ kind }: DatasetStructureViewProps) {
|
||||
const [selectedNodeId, setSelectedNodeId] = useState('');
|
||||
const { data, loading } = useFetchDatasetStructureGraph(kind, graphKeywords);
|
||||
const template = data?.templates?.[0];
|
||||
const { deleteDatasetStructure, loading: deleting } =
|
||||
useDeleteDatasetStructure();
|
||||
|
||||
const { data: structureRunData } = useTraceRunData(
|
||||
ViewModeGenerateTypeMap[kind],
|
||||
@@ -86,6 +97,14 @@ export function DatasetStructureView({ kind }: DatasetStructureViewProps) {
|
||||
setSelectedNodeId('');
|
||||
}, []);
|
||||
|
||||
const handleDeleteStructure = useCallback(async () => {
|
||||
const code = await deleteDatasetStructure(kind);
|
||||
if (code === 0) {
|
||||
setGraphKeywords('');
|
||||
setSelectedNodeId('');
|
||||
}
|
||||
}, [deleteDatasetStructure, kind]);
|
||||
|
||||
const canGenerate = (knowledgeBase?.chunk_count ?? 0) > 0;
|
||||
|
||||
if (loading && !data) {
|
||||
@@ -104,8 +123,18 @@ export function DatasetStructureView({ kind }: DatasetStructureViewProps) {
|
||||
|
||||
return (
|
||||
<Card className="flex-1 min-h-0 overflow-hidden flex border-border-button rounded-xl flex-col">
|
||||
{kind === ViewMode.Graph && (
|
||||
<div className="flex justify-end px-4 pt-4">
|
||||
<div className="flex justify-between gap-4 px-4 pt-4">
|
||||
<ConfirmDeleteDialog
|
||||
title={t('knowledgeDetails.deleteStructureConfirm', {
|
||||
name: t(StructureKindLabelKeyMap[kind]),
|
||||
})}
|
||||
onOk={handleDeleteStructure}
|
||||
>
|
||||
<Button variant="outline" size="sm" disabled={deleting}>
|
||||
<Trash2 />
|
||||
</Button>
|
||||
</ConfirmDeleteDialog>
|
||||
{kind === ViewMode.Graph && (
|
||||
<SelectWithSearch
|
||||
options={entityOptions}
|
||||
value={selectedEntityName || graphKeywords}
|
||||
@@ -116,8 +145,8 @@ export function DatasetStructureView({ kind }: DatasetStructureViewProps) {
|
||||
onNoMatchEnter={handleNoMatchEnter}
|
||||
disableAutoSelectOnEnter
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
)}
|
||||
</div>
|
||||
<RepresentationRenderer
|
||||
template={template}
|
||||
highlightNodeId={selectedEntityName || null}
|
||||
|
||||
@@ -431,6 +431,9 @@ export const getArtifactsStructure = (
|
||||
params: keywords ? { kind, keywords } : { kind },
|
||||
});
|
||||
|
||||
export const deleteArtifactsStructure = (datasetId: string, kind: string) =>
|
||||
request.delete(api.artifactsStructure(datasetId), { params: { kind } });
|
||||
|
||||
export const updateArtifactPage = (
|
||||
datasetId: string,
|
||||
pageType: string,
|
||||
|
||||
Reference in New Issue
Block a user