From 9b78c0f5d229e3e8f7875cfb145a53a41459abe0 Mon Sep 17 00:00:00 2001 From: Braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Thu, 15 Jul 2021 23:33:17 +0200 Subject: [PATCH] feat: add drag n drop example --- examples/DragNDrop/Sidebar.tsx | 25 +++++++++++ examples/DragNDrop/dnd.css | 37 ++++++++++++++++ examples/DragNDrop/index.tsx | 77 ++++++++++++++++++++++++++++++++++ examples/router.ts | 4 ++ 4 files changed, 143 insertions(+) create mode 100644 examples/DragNDrop/Sidebar.tsx create mode 100644 examples/DragNDrop/dnd.css create mode 100644 examples/DragNDrop/index.tsx diff --git a/examples/DragNDrop/Sidebar.tsx b/examples/DragNDrop/Sidebar.tsx new file mode 100644 index 00000000..7bc42a3c --- /dev/null +++ b/examples/DragNDrop/Sidebar.tsx @@ -0,0 +1,25 @@ +const onDragStart = (event: DragEvent, nodeType: string) => { + if (event.dataTransfer) { + event.dataTransfer.setData('application/revueflow', nodeType); + event.dataTransfer.effectAllowed = 'move'; + } +}; + +const Sidebar = () => { + return ( + + ); +}; + +export default Sidebar; diff --git a/examples/DragNDrop/dnd.css b/examples/DragNDrop/dnd.css new file mode 100644 index 00000000..6ff6d489 --- /dev/null +++ b/examples/DragNDrop/dnd.css @@ -0,0 +1,37 @@ +.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 > * { + margin-bottom: 10px; + cursor: grab; +} + +.dndflow aside .description { + margin-bottom: 10px; +} + +.dndflow .revueflow-wrapper { + flex-grow: 1; + height: 100%; +} + +@media screen and (min-width: 768px) { + .dndflow { + flex-direction: row; + } + + .dndflow aside { + width: 20%; + max-width: 180px; + } +} diff --git a/examples/DragNDrop/index.tsx b/examples/DragNDrop/index.tsx new file mode 100644 index 00000000..e8921b20 --- /dev/null +++ b/examples/DragNDrop/index.tsx @@ -0,0 +1,77 @@ +import RevueFlow, { + addEdge, + removeElements, + Controls, + OnLoadParams, + Elements, + Connection, + Edge, + ElementId, + Node +} from '../../src'; +import Sidebar from './Sidebar'; + +import './dnd.css'; +import { defineComponent, ref } from 'vue'; + +const initialElements = [{ id: '1', type: 'input', data: { label: 'input node' }, position: { x: 250, y: 5 } }]; + +const onDragOver = (event: DragEvent) => { + event.preventDefault(); + if (event.dataTransfer) { + event.dataTransfer.dropEffect = 'move'; + } +}; + +let id = 0; +const getId = (): ElementId => `dndnode_${id++}`; + +const DnDFlow = defineComponent({ + setup() { + const revueFlowInstance = ref(); + const elements = ref(initialElements); + + const onConnect = (params: Connection | Edge) => (elements.value = addEdge(params, elements.value)); + const onElementsRemove = (elementsToRemove: Elements) => (elements.value = removeElements(elementsToRemove, elements.value)); + const onLoad = (instance: OnLoadParams) => (revueFlowInstance.value = instance); + + const onDrop = (event: DragEvent) => { + event.preventDefault(); + + if (revueFlowInstance.value) { + console.log(event.dataTransfer?.getData('application/revueflow')); + const type = event.dataTransfer?.getData('application/revueflow'); + const position = revueFlowInstance.value.project({ x: event.clientX, y: event.clientY - 40 }); + const newNode: Node = { + id: getId(), + type, + position, + data: { label: `${type} node` } + }; + + elements.value.push(newNode); + console.log(elements.value); + } + }; + + return () => ( +
+
+ + + +
+ +
+ ); + } +}); + +export default DnDFlow; diff --git a/examples/router.ts b/examples/router.ts index 5687e5f1..76e8959c 100644 --- a/examples/router.ts +++ b/examples/router.ts @@ -12,6 +12,10 @@ export const routes = [ { path: '/custom-node', component: () => import('./CustomNode') + }, + { + path: '/drag-n-drop', + component: () => import('./DragNDrop') } ];