From f56656929992b98a3473944fd2a395e05d5c42f0 Mon Sep 17 00:00:00 2001 From: Alex Grozav Date: Tue, 19 Apr 2022 13:28:31 +0300 Subject: [PATCH] feat(editor): Add drag and drop from nodes panel (#3123) * :sparkles: Added support for drag and drop from nodes main panel. :sparkles: Added node draggable placeholder. * :sparkles: Added snapping to grid. Changed how draggable ghost follows the cursor. * :lipstick: Changed node drag anchor position to be centered. * :sparkles: Added drag and drop animation. Added event cancellation when dropping node on main panel. * :recycle: Simplified drag and drop code and cleaned up prop-drilling. * :bug: Added check for nodeTypeName in dataTransfer when draging and dropping nodes. * :bug: Ensured MS Edge compatibility. MS edge does not send datatransfer in ondragover event. Co-authored-by: Mutasem --- .../components/NodeCreator/CreatorItem.vue | 10 +- .../components/NodeCreator/ItemIterator.vue | 15 ++- .../src/components/NodeCreator/MainPanel.vue | 28 ++-- .../components/NodeCreator/NodeCreator.vue | 32 ++++- .../src/components/NodeCreator/NodeItem.vue | 125 +++++++++++++++++- .../NodeCreator/SubcategoryPanel.vue | 9 +- packages/editor-ui/src/views/NodeView.vue | 101 ++++++++++---- 7 files changed, 259 insertions(+), 61 deletions(-) diff --git a/packages/editor-ui/src/components/NodeCreator/CreatorItem.vue b/packages/editor-ui/src/components/NodeCreator/CreatorItem.vue index a024c2ec4..9c8597cbd 100644 --- a/packages/editor-ui/src/components/NodeCreator/CreatorItem.vue +++ b/packages/editor-ui/src/components/NodeCreator/CreatorItem.vue @@ -5,8 +5,8 @@ clickable: props.clickable, active: props.active, }" - @click="listeners['click']" - > + @click="listeners.click" + > + @dragstart="listeners.dragstart" + @dragend="listeners.dragend" + /> @@ -54,4 +56,4 @@ export default { } } - \ No newline at end of file + diff --git a/packages/editor-ui/src/components/NodeCreator/ItemIterator.vue b/packages/editor-ui/src/components/NodeCreator/ItemIterator.vue index 39d0437d4..e07b5fed6 100644 --- a/packages/editor-ui/src/components/NodeCreator/ItemIterator.vue +++ b/packages/editor-ui/src/components/NodeCreator/ItemIterator.vue @@ -8,7 +8,12 @@ @before-leave="beforeLeave" @leave="leave" > -
+
@@ -36,12 +43,12 @@ export default Vue.extend({ }, props: ['elements', 'activeIndex', 'disabled', 'transitionsEnabled'], methods: { - selected(element: INodeCreateElement) { + emit(eventName: string, element: INodeCreateElement, event: Event) { if (this.$props.disabled) { return; } - this.$emit('selected', element); + this.$emit(eventName, { element, event }); }, beforeEnter(el: HTMLElement) { el.style.height = '0'; diff --git a/packages/editor-ui/src/components/NodeCreator/MainPanel.vue b/packages/editor-ui/src/components/NodeCreator/MainPanel.vue index dbff0d758..1f03e81b4 100644 --- a/packages/editor-ui/src/components/NodeCreator/MainPanel.vue +++ b/packages/editor-ui/src/components/NodeCreator/MainPanel.vue @@ -1,7 +1,18 @@ @@ -56,7 +70,6 @@ import { ALL_NODE_FILTER, CORE_NODES_CATEGORY, REGULAR_NODE_FILTER, TRIGGER_NODE import SlideTransition from '../transitions/SlideTransition.vue'; import { matchesNodeType, matchesSelectType } from './helpers'; - export default mixins(externalHooks).extend({ name: 'NodeCreateList', components: { @@ -235,18 +248,13 @@ export default mixins(externalHooks).extend({ }, selected(element: INodeCreateElement) { if (element.type === 'node') { - const properties = element.properties as INodeItemProps; - - this.nodeTypeSelected(properties.nodeType.name); + this.$emit('nodeTypeSelected', (element.properties as INodeItemProps).nodeType.name); } else if (element.type === 'category') { this.onCategorySelected(element.category); } else if (element.type === 'subcategory') { this.onSubcategorySelected(element); } }, - nodeTypeSelected(nodeTypeName: string) { - this.$emit('nodeTypeSelected', nodeTypeName); - }, onCategorySelected(category: string) { if (this.activeCategory.includes(category)) { this.activeCategory = this.activeCategory.filter( diff --git a/packages/editor-ui/src/components/NodeCreator/NodeCreator.vue b/packages/editor-ui/src/components/NodeCreator/NodeCreator.vue index 9ba458709..b9bb41763 100644 --- a/packages/editor-ui/src/components/NodeCreator/NodeCreator.vue +++ b/packages/editor-ui/src/components/NodeCreator/NodeCreator.vue @@ -1,8 +1,20 @@