diff --git a/package/src/components/Nodes/NodeWrapper.vue b/package/src/components/Nodes/NodeWrapper.vue index 7b609fc8..6da42c40 100644 --- a/package/src/components/Nodes/NodeWrapper.vue +++ b/package/src/components/Nodes/NodeWrapper.vue @@ -16,9 +16,21 @@ interface NodeWrapperProps { } const props = defineProps() + +provide(NodeId, props.id) + +const slots = inject(Slots) + const { store } = useVueFlow() const node = useVModel(props, 'node') + +const name = ref(node.value.type ?? 'default') +watch( + () => node.value.type, + (v) => v && (name.value = v), +) + const nodeElement = ref() const { scale, onDrag, onDragStart, onDragStop } = useDraggableCore(nodeElement, { @@ -30,29 +42,19 @@ const { scale, onDrag, onDragStart, onDragStop } = useDraggableCore(nodeElement, scale: store.viewport.zoom, }) -provide(NodeId, props.id) +onBeforeMount(() => { + store.updateNodePosition({ id: node.value.id, diff: { x: 0, y: 0 } }) +}) -const onMouseEnterHandler = () => - node.value.dragging && ((event: MouseEvent) => store.hooks.nodeMouseEnter.trigger({ event, node: node.value })) -const onMouseMoveHandler = () => - node.value.dragging && ((event: MouseEvent) => store.hooks.nodeMouseMove.trigger({ event, node: node.value })) -const onMouseLeaveHandler = () => - node.value.dragging && ((event: MouseEvent) => store.hooks.nodeMouseLeave.trigger({ event, node: node.value })) -const onContextMenuHandler = () => (event: MouseEvent) => - store.hooks.nodeContextMenu.trigger({ - event, - node: node.value, - }) -const onDoubleClick = () => (event: MouseEvent) => store.hooks.nodeDoubleClick.trigger({ event, node: node.value }) -const onSelectNodeHandler = (event: MouseEvent) => { - if (!props.draggable) { - if (props.selectable) { - store.nodesSelectionActive = false - if (!node.value.selected) store.addSelectedNodes([node.value]) - } - store.hooks.nodeClick.trigger({ event, node: node.value }) - } -} +onMounted(() => { + debouncedWatch( + () => store.viewport.zoom, + () => { + scale.value = store.viewport.zoom + }, + { debounce: 5, flush: 'post' }, + ) +}) onMounted(() => { const observer = useResizeObserver(nodeElement, () => @@ -93,22 +95,49 @@ watch( node.value.handleBounds = getHandleBounds(nodeElement.value, scale.value) }, - { deep: true }, + { deep: true, flush: 'post' }, ) onUnmounted(() => { nodeElement.value = undefined }) -store.updateNodePosition({ id: node.value.id, diff: { x: 0, y: 0 } }) +const onMouseEnter = (event: MouseEvent) => { + if (!node.value.dragging) { + store.hooks.nodeMouseEnter.trigger({ event, node: node.value }) + } +} -const slots = inject(Slots) +const onMouseMove = (event: MouseEvent) => { + if (!node.value.dragging) { + store.hooks.nodeMouseMove.trigger({ event, node: node.value }) + } +} -const name = ref(node.value.type ?? 'default') -watch( - () => node.value.type, - (v) => v && (name.value = v), -) +const onMouseLeave = (event: MouseEvent) => { + if (!node.value.dragging) { + store.hooks.nodeMouseLeave.trigger({ event, node: node.value }) + } +} + +const onContextMenu = (event: MouseEvent) => { + store.hooks.nodeContextMenu.trigger({ + event, + node: node.value, + }) +} + +const onDoubleClick = (event: MouseEvent) => store.hooks.nodeDoubleClick.trigger({ event, node: node.value }) + +const onSelectNode = (event: MouseEvent) => { + if (!props.draggable) { + if (props.selectable) { + store.nodesSelectionActive = false + if (!node.value.selected) store.addSelectedNodes([node.value]) + } + store.hooks.nodeClick.trigger({ event, node: node.value }) + } +} const type = computed(() => { let nodeType = node.value.template ?? store.getNodeTypes[name.value] @@ -134,16 +163,6 @@ const type = computed(() => { return slot }) -onMounted(() => { - debouncedWatch( - () => store.viewport.zoom, - () => { - scale.value = store.viewport.zoom - }, - { debounce: 5, flush: 'post' }, - ) -}) - onDragStart(({ event }) => { store.addSelectedNodes([]) store.hooks.nodeDragStart.trigger({ event, node: node.value }) @@ -219,11 +238,11 @@ export default { :class="getClass" :style="getStyle" :data-id="node.id" - @mouseenter="onMouseEnterHandler" - @mousemove="onMouseMoveHandler" - @mouseleave="onMouseLeaveHandler" - @contextmenu="onContextMenuHandler" - @click="onSelectNodeHandler" + @mouseenter="onMouseEnter" + @mousemove="onMouseMove" + @mouseleave="onMouseLeave" + @contextmenu="onContextMenu" + @click="onSelectNode" @dblclick="onDoubleClick" >