Compare commits

..

No commits in common. 'ded88c7721a86db4a2f0e266b6ca706ce8fe3962' and 'f1fe33942e286f4ee9b496d4fc3499c67059a245' have entirely different histories.

@ -29,7 +29,7 @@ const PaneContextMenu: React.FC<PaneContextMenuProps> = ({
}, []);
// 检查是否有复制的节点数据
const hasCopiedNode = !!localStorage.getItem('copiedNode') || !!localStorage.getItem('copiedFlowData');
const hasCopiedNode = !!localStorage.getItem('copiedNode');
return (
<Menu

@ -12,11 +12,7 @@ import FlowEditorMain from './FlowEditorMain';
import { useFlowEditorState } from '@/hooks/useFlowEditorState';
import { useFlowCallbacks } from '@/hooks/useFlowCallbacks';
const FlowEditorWithProvider: React.FC<{
initialData?: any,
useDefault?: boolean,
readOnly?: boolean
}> = ({ initialData, useDefault, readOnly }) => {
const FlowEditorWithProvider: React.FC<{ initialData?: any, useDefault?: boolean, readOnly?: boolean }> = ({ initialData, useDefault, readOnly }) => {
return (
<div style={{ width: '100%', height: '91vh', display: 'flex' }} onContextMenu={(e) => e.preventDefault()}>
<ReactFlowProvider>
@ -26,11 +22,7 @@ const FlowEditorWithProvider: React.FC<{
);
};
const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean, readOnly?: boolean }> = ({
initialData,
useDefault,
readOnly = false
}) => {
const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean, readOnly?: boolean }> = ({ initialData, useDefault, readOnly = false }) => {
const reactFlowInstance = useReactFlow();
const reactFlowWrapper = useRef<HTMLDivElement>(null);
const [menu, setMenu] = useState<{
@ -213,56 +205,30 @@ const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean, readOnly?:
setMenu(null);
}, [setMenu]);
// 存储最后的鼠标位置
const lastMousePositionRef = useRef<{ x: number; y: number } | null>(null);
// 跟踪鼠标位置
useEffect(() => {
const handleMouseMove = (event: MouseEvent) => {
const pane = reactFlowWrapper.current?.getBoundingClientRect();
if (pane && reactFlowInstance) {
const position = reactFlowInstance.screenToFlowPosition({
x: event.clientX,
y: event.clientY
});
lastMousePositionRef.current = position;
}
};
const canvasElement = reactFlowWrapper.current;
if (canvasElement) {
canvasElement.addEventListener('mousemove', handleMouseMove);
}
return () => {
if (canvasElement) {
canvasElement.removeEventListener('mousemove', handleMouseMove);
}
};
}, [reactFlowInstance]);
// 处理粘贴事件
// 添加处理粘贴事件的函数
const handlePasteNode = useCallback((event: ClipboardEvent) => {
// 右键菜单触发的粘贴(有menu.position)
// 检查是否是粘贴操作且在画布区域内
if (event.clipboardData?.getData('text') === 'paste-node' && menu?.type === 'pane' && menu.position) {
pasteNode(menu.position);
setMenu(null);
}
}, [menu, pasteNode, setMenu]);
}, [menu, pasteNode]);
// 添加键盘事件监听
useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
// 检查是否按下了 Ctrl+V (Windows/Linux) 或 Cmd+V (Mac)
if ((event.ctrlKey || event.metaKey) && event.key === 'v') {
// 键盘快捷键粘贴,使用最后的鼠标位置
if (lastMousePositionRef.current) {
pasteNode(lastMousePositionRef.current);
}
// 触发自定义粘贴事件
const pasteEvent = new ClipboardEvent('paste', {
clipboardData: new DataTransfer()
});
pasteEvent.clipboardData?.setData('text', 'paste-node');
document.dispatchEvent(pasteEvent);
}
};
// 为画布添加键盘和粘贴事件监听
// 为画布添加键盘事件监听
const canvasElement = reactFlowWrapper.current;
if (canvasElement) {
canvasElement.addEventListener('keydown', handleKeyDown);
@ -275,7 +241,7 @@ const FlowEditor: React.FC<{ initialData?: any, useDefault?: boolean, readOnly?:
}
document.removeEventListener('paste', handlePasteNode);
};
}, [pasteNode, handlePasteNode]);
}, [handlePasteNode]);
// 监听边的变化,处理添加节点的触发
useEffect(() => {

@ -235,7 +235,7 @@ const EventContainer = () => {
title="删除事件"
content="事件删除后无法恢复,请谨慎删除!"
onOk={async () => {
const res: any = await deleteEventItem(record.topicId);
const res: any = await deleteEventItem(record.eventId);
if (res && res.code === 200) {
Message.success('删除成功');
fetchEventData();

Loading…
Cancel
Save