From 3f15983f3efab984c0c2819d5aee765804255329 Mon Sep 17 00:00:00 2001 From: Braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:25:55 +0200 Subject: [PATCH] feat(edges): Use slot injection for custom edges --- package/src/components/Edges/EdgeWrapper.vue | 77 ++++++++----------- package/src/components/Nodes/NodeWrapper.vue | 3 +- .../container/EdgeRenderer/EdgeRenderer.vue | 6 +- .../container/NodeRenderer/NodeRenderer.vue | 6 +- package/src/index.ts | 5 +- 5 files changed, 40 insertions(+), 57 deletions(-) diff --git a/package/src/components/Edges/EdgeWrapper.vue b/package/src/components/Edges/EdgeWrapper.vue index 43e407e4..1f11e04e 100644 --- a/package/src/components/Edges/EdgeWrapper.vue +++ b/package/src/components/Edges/EdgeWrapper.vue @@ -2,6 +2,7 @@ import { useHandle, useVueFlow } from '../../composables' import { ConnectionMode, Position, EdgeComponent } from '../../types' import { getEdgePositions, getHandle, getMarkerId } from '../../utils' +import { Slots } from '../../context' import EdgeAnchor from './EdgeAnchor.vue' interface EdgeWrapper { @@ -98,18 +99,38 @@ onMounted(() => { ) }) +const slots = inject(Slots) + const name = ref(edge.value.type ?? 'default') +watch( + () => edge.value.type, + (v) => v && (name.value = v), +) + const type = computed(() => { + const instance = getCurrentInstance() let edgeType = store.getEdgeTypes[name.value] - if (typeof edgeType === 'string') edgeType = resolveComponent(name.value, false) as EdgeComponent + if (typeof edgeType === 'string') { + if (instance) { + const components = Object.keys(instance.appContext.components) + if (components && components.includes(name.value)) { + edgeType = resolveComponent(name.value, false) as EdgeComponent + } + } + } if (typeof edgeType !== 'string') return edgeType - const slot = useSlots()?.[name.value]?.({}) - if (!slot || !slot[0].key?.toString().includes(name.value)) { - console.warn(`Node type "${edge.value.type}" not found and no slot detected. Using fallback type "default".`) + const slot = slots?.[`edge-${name.value}`]?.({}) + if (!slot) { + console.warn(`[vueflow]: Edge type "${edge.value.type}" not found and no edge-slot detected. Using fallback type "default".`) name.value = 'default' return store.getEdgeTypes.default } + if (slot.length > 1) { + console.warn('[vue-flow]: More than one element in edge-slot detected. Using fallback to first slot item.') + } + + return slot[0] })