You've already forked DataMate
feat(api): 添加 graphrag 权限规则和优化知识图谱缓存失效
Some checks failed
Some checks failed
- 在权限规则匹配器中添加 /api/graphrag/** 的读写权限控制 - 修改图关系服务中的删除操作以精确失效相关实体缓存 - 更新图同步服务确保 BELONGS_TO 关系在增量同步时正确重建 - 重构图同步步骤服务中的组织归属关系构建逻辑 - 修复前端图_canvas 组件中的元素点击事件处理逻辑 - 实现 Python GraphRAG 缓存的启用/禁用功能 - 为 GraphRAG 缓存统计和清除接口添加调用方日志记录
This commit is contained in:
@@ -18,6 +18,15 @@ interface GraphCanvasProps {
|
||||
onSelectionChange?: (nodeIds: string[], edgeIds: string[]) => void;
|
||||
}
|
||||
|
||||
type GraphElementEvent = {
|
||||
item?: {
|
||||
id?: string;
|
||||
getID?: () => string;
|
||||
getModel?: () => { id?: string };
|
||||
};
|
||||
target?: { id?: string };
|
||||
};
|
||||
|
||||
function GraphCanvas({
|
||||
data,
|
||||
loading = false,
|
||||
@@ -126,6 +135,30 @@ function GraphCanvas({
|
||||
}, [highlightedNodeIds, data]);
|
||||
|
||||
// Helper: query selected elements from graph and notify parent
|
||||
const resolveElementId = useCallback(
|
||||
(event: GraphElementEvent, elementType: "node" | "edge"): string | null => {
|
||||
const itemId =
|
||||
event.item?.getID?.() ??
|
||||
event.item?.getModel?.()?.id ??
|
||||
event.item?.id;
|
||||
if (itemId) {
|
||||
return itemId;
|
||||
}
|
||||
|
||||
const targetId = event.target?.id;
|
||||
if (!targetId) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const existsInData =
|
||||
elementType === "node"
|
||||
? data.nodes.some((node) => node.id === targetId)
|
||||
: data.edges.some((edge) => edge.id === targetId);
|
||||
return existsInData ? targetId : null;
|
||||
},
|
||||
[data.nodes, data.edges]
|
||||
);
|
||||
|
||||
const emitSelectionChange = useCallback(() => {
|
||||
const graph = graphRef.current;
|
||||
if (!graph || !onSelectionChange) return;
|
||||
@@ -149,16 +182,25 @@ function GraphCanvas({
|
||||
const graph = graphRef.current;
|
||||
if (!graph) return;
|
||||
|
||||
const handleNodeClick = (event: { target: { id: string } }) => {
|
||||
onNodeClick?.(event.target.id);
|
||||
const handleNodeClick = (event: GraphElementEvent) => {
|
||||
const nodeId = resolveElementId(event, "node");
|
||||
if (nodeId) {
|
||||
onNodeClick?.(nodeId);
|
||||
}
|
||||
emitSelectionChange();
|
||||
};
|
||||
const handleEdgeClick = (event: { target: { id: string } }) => {
|
||||
onEdgeClick?.(event.target.id);
|
||||
const handleEdgeClick = (event: GraphElementEvent) => {
|
||||
const edgeId = resolveElementId(event, "edge");
|
||||
if (edgeId) {
|
||||
onEdgeClick?.(edgeId);
|
||||
}
|
||||
emitSelectionChange();
|
||||
};
|
||||
const handleNodeDblClick = (event: { target: { id: string } }) => {
|
||||
onNodeDoubleClick?.(event.target.id);
|
||||
const handleNodeDblClick = (event: GraphElementEvent) => {
|
||||
const nodeId = resolveElementId(event, "node");
|
||||
if (nodeId) {
|
||||
onNodeDoubleClick?.(nodeId);
|
||||
}
|
||||
};
|
||||
const handleCanvasClick = () => {
|
||||
onCanvasClick?.();
|
||||
@@ -176,7 +218,14 @@ function GraphCanvas({
|
||||
graph.off("node:dblclick", handleNodeDblClick);
|
||||
graph.off("canvas:click", handleCanvasClick);
|
||||
};
|
||||
}, [onNodeClick, onEdgeClick, onNodeDoubleClick, onCanvasClick, emitSelectionChange]);
|
||||
}, [
|
||||
onNodeClick,
|
||||
onEdgeClick,
|
||||
onNodeDoubleClick,
|
||||
onCanvasClick,
|
||||
emitSelectionChange,
|
||||
resolveElementId,
|
||||
]);
|
||||
|
||||
// Fit view helper
|
||||
const handleFitView = useCallback(() => {
|
||||
|
||||
Reference in New Issue
Block a user