Skip to content

Commit

Permalink
fix: nodes as fragments
Browse files Browse the repository at this point in the history
feat: accept vnode as edge text
  • Loading branch information
bcakmakoglu committed Oct 20, 2021
1 parent b2b1fe8 commit 64a4b8c
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 40 deletions.
10 changes: 8 additions & 2 deletions examples/Edges/CustomLabel.vue
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
<script lang="ts" setup></script>
<script lang="ts" setup>
interface CustomLabelProps {
text: string
}
const props = defineProps<CustomLabelProps>()
</script>
<template>
<tspan dy="10" x="0">I am a `tspan`</tspan>
<tspan dy="10" x="0">{{ props.text }}</tspan>
</template>
8 changes: 7 additions & 1 deletion examples/Edges/EdgesExample.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<script lang="ts" setup>
import CustomEdge from './CustomEdge.vue'
import CustomEdge2 from './CustomEdge2.vue'
import CustomLabel from './CustomLabel.vue'
import Flow, {
MiniMap,
Controls,
Expand Down Expand Up @@ -37,7 +38,12 @@ const initialElements = [
id: 'e5-6',
source: '5',
target: '6',
label: 'foobar',
label: {
component: CustomLabel,
props: {
text: 'custom label text',
},
},
labelStyle: { fill: 'red', fontWeight: 700 },
arrowHeadType: ArrowHeadType.Arrow,
},
Expand Down
2 changes: 1 addition & 1 deletion src/components/Edges/Edge.vue
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ const edgePos = computed(() =>
v-if="!props.edge.isHidden && isVisible(edgePos)"
:class="[
'revue-flow__edge',
`revue-flow__edge-${props.type.name || 'default'}`,
`revue-flow__edge-${props.edge.type || 'default'}`,
{
selected: isSelected,
animated: props.edge.animated,
Expand Down
13 changes: 11 additions & 2 deletions src/components/Edges/EdgeText.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@ import { HTMLAttributes, VNode } from 'vue'
interface EdgeTextProps extends HTMLAttributes {
x: number
y: number
label?: string | VNode
label?:
| string
| {
component: VNode
props?: any
}
labelStyle?: any
labelShowBg?: boolean
labelBgStyle?: any
Expand Down Expand Up @@ -38,7 +43,11 @@ const { width = 0, height = 0, x = 0, y = 0 } = useElementBounding(edgeRef)
:ry="props.labelBgBorderRadius"
/>
<text ref="edge-text" class="revue-flow__edge-text" :y="height / 2" dy="0.3em" :style="props.labelStyle">
<component :is="props.label" v-if="typeof props.label !== 'string'" />
<component
:is="props.label.component"
v-if="typeof props.label.component !== 'undefined'"
v-bind="{ ...props, ...props.label.props, width, height, x, y }"
/>
<template v-else>
{{ props.label }}
</template>
Expand Down
14 changes: 6 additions & 8 deletions src/components/Nodes/DefaultNode.vue
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,10 @@ const props = withDefaults(defineProps<DefaultNodeProps>(), {
})
</script>
<template>
<div class="revue-flow__node-default">
<Handle type="target" :position="props.targetPosition" :is-connectable="props.connectable" />
<component :is="props.data?.label" v-if="typeof props.data?.label !== 'string'" />
<template v-else>
{{ props.data?.label }}
</template>
<Handle type="source" :position="props.sourcePosition" :is-connectable="props.connectable" />
</div>
<Handle type="target" :position="props.targetPosition" :is-connectable="props.connectable" />
<component :is="props.data?.label" v-if="typeof props.data?.label !== 'string'" />
<template v-else>
{{ props.data?.label }}
</template>
<Handle type="source" :position="props.sourcePosition" :is-connectable="props.connectable" />
</template>
12 changes: 5 additions & 7 deletions src/components/Nodes/InputNode.vue
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,9 @@ const props = withDefaults(defineProps<InputNodeProps>(), {
})
</script>
<template>
<div class="revue-flow__node-input">
<component :is="props.data?.label" v-if="typeof props.data?.label !== 'string'" />
<template v-else>
{{ props.data?.label }}
</template>
<Handle type="source" :position="props.sourcePosition" :connectable="props.connectable" />
</div>
<component :is="props.data?.label" v-if="typeof props.data?.label !== 'string'" />
<template v-else>
{{ props.data?.label }}
</template>
<Handle type="source" :position="props.sourcePosition" :connectable="props.connectable" />
</template>
12 changes: 5 additions & 7 deletions src/components/Nodes/OutputNode.vue
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,9 @@ const props = withDefaults(defineProps<OutputNodeProps>(), {
})
</script>
<template>
<div class="revue-flow__node-output">
<component :is="props.data?.label" v-if="typeof props.data?.label !== 'string'" />
<template v-else>
{{ props.data?.label }}
</template>
<Handle type="source" :position="props.targetPosition" :is-connectable="props.connectable" />
</div>
<component :is="props.data?.label" v-if="typeof props.data?.label !== 'string'" />
<template v-else>
{{ props.data?.label }}
</template>
<Handle type="source" :position="props.targetPosition" :is-connectable="props.connectable" />
</template>
18 changes: 9 additions & 9 deletions src/container/Flow/Flow.vue
Original file line number Diff line number Diff line change
Expand Up @@ -114,19 +114,19 @@ const defaultEdgeTypes: Record<string, EdgeType> = {
const store = useStore(props)
const hooks = useHooks(emit)
const init = () => {
store.$state = { ...store.$state, ...props }
store.setElements(props.elements)
store.setMinZoom(props.minZoom)
store.setMaxZoom(props.maxZoom)
store.setTranslateExtent(props.translateExtent)
store.setNodeExtent(props.nodeExtent)
const init = (opts: typeof props) => {
store.$state = { ...store.$state, ...opts }
store.setElements(opts.elements)
store.setMinZoom(opts.minZoom)
store.setMaxZoom(opts.maxZoom)
store.setTranslateExtent(opts.translateExtent)
store.setNodeExtent(opts.nodeExtent)
}
onBeforeUnmount(() => store?.$dispose())
onUpdated(() => init())
init()
watch(props, (val) => init(val))
init(props)
const nodeTypes = createNodeTypes({ ...defaultNodeTypes, ...props.nodeTypes })
const edgeTypes = createEdgeTypes({ ...defaultEdgeTypes, ...props.edgeTypes })
Expand Down
4 changes: 1 addition & 3 deletions src/container/NodeRenderer/NodeRenderer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ const type = (node: TNode) => {
}
return type
}
const selected = (nodeId: string) => store.selectedElements?.some(({ id }) => id === nodeId)
</script>
<template>
<div
Expand All @@ -52,7 +50,7 @@ const selected = (nodeId: string) => store.selectedElements?.some(({ id }) => id
:type="type(node)"
:scale="store.transform[2]"
:snap-grid="store.snapToGrid ? store.snapGrid : undefined"
:selected="selected(node.id)"
:selected="store.selectedElements?.some(({ id }) => id === node.id)"
:selectable="node.selectable || store.elementsSelectable"
:connectable="node.connectable || store.nodesConnectable"
:draggable="node.draggable || store.nodesDraggable"
Expand Down

0 comments on commit 64a4b8c

Please sign in to comment.