mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-08 20:42:30 +08:00
### What problem does this PR solve? #9869 ### Type of change - [x] New Feature (non-breaking change which adds functionality) --------- Signed-off-by: dependabot[bot] <support@github.com> Signed-off-by: jinhai <haijin.chn@gmail.com> Signed-off-by: Jin Hai <haijin.chn@gmail.com> Co-authored-by: chanx <1243304602@qq.com> Co-authored-by: balibabu <cike8899@users.noreply.github.com> Co-authored-by: Lynn <lynn_inf@hotmail.com> Co-authored-by: 纷繁下的无奈 <zhileihuang@126.com> Co-authored-by: huangzl <huangzl@shinemo.com> Co-authored-by: writinwaters <93570324+writinwaters@users.noreply.github.com> Co-authored-by: Wilmer <33392318@qq.com> Co-authored-by: Adrian Weidig <adrianweidig@gmx.net> Co-authored-by: Zhichang Yu <yuzhichang@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Yongteng Lei <yongtengrey@outlook.com> Co-authored-by: Liu An <asiro@qq.com> Co-authored-by: buua436 <66937541+buua436@users.noreply.github.com> Co-authored-by: BadwomanCraZY <511528396@qq.com> Co-authored-by: cucusenok <31804608+cucusenok@users.noreply.github.com> Co-authored-by: Russell Valentine <russ@coldstonelabs.org> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Billy Bao <newyorkupperbay@gmail.com> Co-authored-by: Zhedong Cen <cenzhedong2@126.com> Co-authored-by: TensorNull <129579691+TensorNull@users.noreply.github.com> Co-authored-by: TensorNull <tensor.null@gmail.com> Co-authored-by: TeslaZY <TeslaZY@outlook.com> Co-authored-by: Ajay <160579663+aybanda@users.noreply.github.com> Co-authored-by: AB <aj@Ajays-MacBook-Air.local> Co-authored-by: 天海蒼灆 <huangaoqin@tecpie.com> Co-authored-by: He Wang <wanghechn@qq.com> Co-authored-by: Atsushi Hatakeyama <atu729@icloud.com> Co-authored-by: Jin Hai <haijin.chn@gmail.com> Co-authored-by: Mohamed Mathari <155896313+melmathari@users.noreply.github.com> Co-authored-by: Mohamed Mathari <nocodeventure@Mac-mini-van-Mohamed.fritz.box> Co-authored-by: Stephen Hu <stephenhu@seismic.com> Co-authored-by: Shaun Zhang <zhangwfjh@users.noreply.github.com> Co-authored-by: zhimeng123 <60221886+zhimeng123@users.noreply.github.com> Co-authored-by: mxc <mxc@example.com> Co-authored-by: Dominik Novotný <50611433+SgtMarmite@users.noreply.github.com> Co-authored-by: EVGENY M <168018528+rjohny55@users.noreply.github.com> Co-authored-by: mcoder6425 <mcoder64@gmail.com> Co-authored-by: lemsn <lemsn@msn.com> Co-authored-by: lemsn <lemsn@126.com> Co-authored-by: Adrian Gora <47756404+adagora@users.noreply.github.com> Co-authored-by: Womsxd <45663319+Womsxd@users.noreply.github.com> Co-authored-by: FatMii <39074672+FatMii@users.noreply.github.com>
111 lines
2.8 KiB
TypeScript
111 lines
2.8 KiB
TypeScript
import {
|
||
BaseEdge,
|
||
Edge,
|
||
EdgeLabelRenderer,
|
||
EdgeProps,
|
||
getBezierPath,
|
||
} from '@xyflow/react';
|
||
import { memo } from 'react';
|
||
import useGraphStore from '../../store';
|
||
|
||
import { useFetchAgent } from '@/hooks/use-agent-request';
|
||
import { cn } from '@/lib/utils';
|
||
import { useMemo } from 'react';
|
||
import { Operator } from '../../constant';
|
||
|
||
function InnerButtonEdge({
|
||
id,
|
||
sourceX,
|
||
sourceY,
|
||
targetX,
|
||
targetY,
|
||
sourcePosition,
|
||
targetPosition,
|
||
source,
|
||
target,
|
||
style = {},
|
||
markerEnd,
|
||
selected,
|
||
data,
|
||
}: EdgeProps<Edge<{ isHovered: boolean }>>) {
|
||
const deleteEdgeById = useGraphStore((state) => state.deleteEdgeById);
|
||
const [edgePath, labelX, labelY] = getBezierPath({
|
||
sourceX,
|
||
sourceY,
|
||
sourcePosition,
|
||
targetX,
|
||
targetY,
|
||
targetPosition,
|
||
});
|
||
const selectedStyle = useMemo(() => {
|
||
return selected ? { strokeWidth: 1, stroke: 'rgba(76, 164, 231, 1)' } : {};
|
||
}, [selected]);
|
||
|
||
const onEdgeClick = () => {
|
||
deleteEdgeById(id);
|
||
};
|
||
|
||
// highlight the nodes that the workflow passes through
|
||
const { data: flowDetail } = useFetchAgent();
|
||
|
||
const showHighlight = useMemo(() => {
|
||
const path = flowDetail?.dsl?.path ?? [];
|
||
const idx = path.findIndex((x) => x === target);
|
||
if (idx !== -1) {
|
||
let index = idx - 1;
|
||
while (index >= 0) {
|
||
if (path[index] === source) {
|
||
return { strokeWidth: 1, stroke: 'var(--accent-primary)' };
|
||
}
|
||
index--;
|
||
}
|
||
return {};
|
||
}
|
||
return {};
|
||
}, [flowDetail?.dsl?.path, source, target]);
|
||
|
||
const visible = useMemo(() => {
|
||
return data?.isHovered && source !== Operator.Begin;
|
||
}, [data?.isHovered, source]);
|
||
|
||
return (
|
||
<>
|
||
<BaseEdge
|
||
path={edgePath}
|
||
markerEnd={markerEnd}
|
||
style={{ ...style, ...selectedStyle, ...showHighlight }}
|
||
className="text-text-secondary"
|
||
/>
|
||
|
||
<EdgeLabelRenderer>
|
||
<div
|
||
style={{
|
||
position: 'absolute',
|
||
transform: `translate(-50%, -50%) translate(${labelX}px,${labelY}px)`,
|
||
fontSize: 12,
|
||
// everything inside EdgeLabelRenderer has no pointer events by default
|
||
// if you have an interactive element, set pointer-events: all
|
||
pointerEvents: 'all',
|
||
zIndex: 1001, // https://github.com/xyflow/xyflow/discussions/3498
|
||
}}
|
||
className="nodrag nopan"
|
||
>
|
||
<button
|
||
className={cn(
|
||
'size-3.5 border border-state-error text-state-error rounded-full leading-none',
|
||
'invisible',
|
||
{ visible },
|
||
)}
|
||
type="button"
|
||
onClick={onEdgeClick}
|
||
>
|
||
×
|
||
</button>
|
||
</div>
|
||
</EdgeLabelRenderer>
|
||
</>
|
||
);
|
||
}
|
||
|
||
export const ButtonEdge = memo(InnerButtonEdge);
|