diff --git a/example/src/DragNDrop/Sidebar.js b/example/src/DragNDrop/Sidebar.js new file mode 100644 index 00000000..73e51200 --- /dev/null +++ b/example/src/DragNDrop/Sidebar.js @@ -0,0 +1,23 @@ +import React from 'react'; + +export default () => { + const onDragStart = (event, nodeType) => { + event.dataTransfer.setData('application/reactflow', nodeType); + event.dataTransfer.effectAllowed = 'move'; + }; + + return ( + + ); +}; diff --git a/example/src/DragNDrop/dnd.css b/example/src/DragNDrop/dnd.css new file mode 100644 index 00000000..9067f699 --- /dev/null +++ b/example/src/DragNDrop/dnd.css @@ -0,0 +1,56 @@ +.dndflow { + flex-direction: column; + display: flex; + height: 100%; +} + +.dndflow aside { + border-right: 1px solid #eee; + padding: 15px 10px; + font-size: 12px; + background: #fcfcfc; +} + +.dndflow aside .description { + margin-bottom: 10px; +} + +.dndflow .dndnode { + height: 20px; + padding: 4px; + border: 1px solid #1a192b; + border-radius: 2px; + margin-bottom: 10px; + display: flex; + justify-content: center; + align-items: center; + cursor: grab; +} + +.dndflow .dndnode.input { + border-color: #0041d0; +} + +.dndflow .dndnode.output { + border-color: #ff0072; +} + +.dndflow .reactflow-wrapper { + flex-grow: 1; + height: 100%; +} + +.dndflow .selectall { + margin-top: 10px; +} + +@media screen and (min-width: 768px) { + .dndflow { + flex-direction: row; + } + + .dndflow aside { + width: 20%; + max-width: 250px; + } +} diff --git a/example/src/DragNDrop/index.js b/example/src/DragNDrop/index.js new file mode 100644 index 00000000..5159c189 --- /dev/null +++ b/example/src/DragNDrop/index.js @@ -0,0 +1,62 @@ +import React, { useState } from 'react'; +import ReactFlow, { ReactFlowProvider, addEdge, removeElements, Controls } from 'react-flow-renderer'; + +import Sidebar from './Sidebar'; + +import './dnd.css'; + +const initialElements = [{ id: '1', type: 'input', data: { label: 'input node' }, position: { x: 250, y: 5 } }]; + +let id = 0; +const getId = () => `dndnode_${id++}`; + +const DnDFlow = () => { + const [reactFlowInstance, setReactFlowInstance] = useState(null); + const [elements, setElements] = useState(initialElements); + const onConnect = (params) => setElements((els) => addEdge(params, els)); + const onElementsRemove = (elementsToRemove) => setElements((els) => removeElements(elementsToRemove, els)); + + const onLoad = (_reactFlowInstance) => setReactFlowInstance(_reactFlowInstance); + + const onDragOver = (event) => { + event.preventDefault(); + event.dataTransfer.dropEffect = 'move'; + }; + + const onDrop = (event) => { + event.preventDefault(); + + const type = event.dataTransfer.getData('application/reactflow'); + const position = reactFlowInstance.project({ x: event.clientX, y: event.clientY - 40 }); + const newNode = { + id: getId(), + type, + position, + data: { label: `${type} node` }, + }; + + setElements((es) => es.concat(newNode)); + }; + + return ( +