feat(slots): Add node and edge renderer slots

* more flexibility by having the ability to use the node/edge-renderer and wrapper
* export renderer and wrapper from lib entry

Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
Braks
2021-11-21 12:34:28 +01:00
parent 39b21faa5b
commit da29a613f0
5 changed files with 65 additions and 54 deletions
+1
View File
@@ -4,3 +4,4 @@ export { default as SmoothStepEdge } from './SmoothStepEdge.vue'
export { default as StraightEdge } from './StraightEdge.vue' export { default as StraightEdge } from './StraightEdge.vue'
export { default as EdgeAnchor } from './EdgeAnchor.vue' export { default as EdgeAnchor } from './EdgeAnchor.vue'
export { default as EdgeText } from './EdgeText.vue' export { default as EdgeText } from './EdgeText.vue'
export { default as EdgeWrapper } from './Edge.vue'
+1
View File
@@ -1,3 +1,4 @@
export { default as DefaultNode } from './DefaultNode.vue' export { default as DefaultNode } from './DefaultNode.vue'
export { default as InputNode } from './InputNode.vue' export { default as InputNode } from './InputNode.vue'
export { default as OutputNode } from './OutputNode.vue' export { default as OutputNode } from './OutputNode.vue'
export { default as NodeWrapper } from './Node.vue'
+59 -53
View File
@@ -1,6 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import { CSSProperties, onBeforeUnmount } from 'vue' import { CSSProperties, onBeforeUnmount } from 'vue'
import diff from 'microdiff'
import { invoke } from '@vueuse/core' import { invoke } from '@vueuse/core'
import { import {
ConnectionLineType, ConnectionLineType,
@@ -155,7 +154,7 @@ invoke(async () => {
store.instance = instance store.instance = instance
}) })
throttledWatch(elements, (val) => store.setElements(val), { flush: 'post', deep: true, throttle: 10 }) throttledWatch(elements, store.setElements, { flush: 'post', deep: true, throttle: 10 })
throttledWatch(store.elements, (val) => (elements.value = val), { flush: 'post', deep: true, throttle: 10 }) throttledWatch(store.elements, (val) => (elements.value = val), { flush: 'post', deep: true, throttle: 10 })
onMounted(() => { onMounted(() => {
@@ -179,58 +178,65 @@ const transitionName = computed(() => {
<div class="vue-flow"> <div class="vue-flow">
<Transition key="vue-flow-transition" :name="transitionName"> <Transition key="vue-flow-transition" :name="transitionName">
<Suspense> <Suspense>
<ZoomPane <template #default>
key="zoom-pane" <ZoomPane
:selection-key-code="store.selectionKeyCode" v-show="store.isReady"
:zoom-activation-key-code="store.zoomActivationKeyCode" key="zoom-pane"
:default-zoom="store.defaultZoom" :selection-key-code="store.selectionKeyCode"
:default-position="store.defaultPosition" :zoom-activation-key-code="store.zoomActivationKeyCode"
:zoom-on-scroll="store.zoomOnScroll" :default-zoom="store.defaultZoom"
:zoom-on-pinch="store.zoomOnPinch" :default-position="store.defaultPosition"
:zoom-on-double-click="store.zoomOnDoubleClick" :zoom-on-scroll="store.zoomOnScroll"
:pan-on-scroll="store.panOnScroll" :zoom-on-pinch="store.zoomOnPinch"
:pan-on-scroll-speed="store.panOnScrollSpeed" :zoom-on-double-click="store.zoomOnDoubleClick"
:pan-on-scroll-mode="store.panOnScrollMode" :pan-on-scroll="store.panOnScroll"
:pane-moveable="store.paneMoveable" :pan-on-scroll-speed="store.panOnScrollSpeed"
> :pan-on-scroll-mode="store.panOnScrollMode"
<template #default="zoomPaneProps"> :pane-moveable="store.paneMoveable"
<SelectionPane >
key="selection-pane" <template #default="zoomPaneProps">
:delete-key-code="store.deleteKeyCode" <SelectionPane
:multi-selection-key-code="store.multiSelectionKeyCode" key="selection-pane"
:selection-key-code="store.selectionKeyCode" :delete-key-code="store.deleteKeyCode"
> :multi-selection-key-code="store.multiSelectionKeyCode"
<NodeRenderer key="node-renderer" :select-nodes-on-drag="store.selectNodesOnDrag"> :selection-key-code="store.selectionKeyCode"
<template
v-for="nodeName of Object.keys(store.getNodeTypes)"
#[`node-${nodeName}`]="nodeProps"
:key="`node-${nodeName}`"
>
<slot :name="`node-${nodeName}`" v-bind="nodeProps"></slot>
</template>
</NodeRenderer>
<EdgeRenderer
key="edge-renderer"
:connection-line-type="store.connectionLineType"
:connection-line-style="store.connectionLineStyle"
:arrow-head-color="store.arrowHeadColor"
:marker-end-id="store.markerEndId"
> >
<template <slot name="node-renderer" v-bind="{ nodes: store.getNodes, nodeTypes: store.getNodeTypes }">
v-for="edgeName of Object.keys(store.getEdgeTypes)" <NodeRenderer key="node-renderer" :select-nodes-on-drag="store.selectNodesOnDrag">
#[`edge-${edgeName}`]="edgeProps" <template
:key="`edge-${edgeName}`" v-for="nodeName of Object.keys(store.getNodeTypes)"
> #[`node-${nodeName}`]="nodeProps"
<slot :name="`edge-${edgeName}`" v-bind="edgeProps"></slot> :key="`node-${nodeName}`"
</template> >
<template #custom-connection-line="customConnectionLineProps"> <slot :name="`node-${nodeName}`" v-bind="nodeProps"></slot>
<slot key="connection-line" name="custom-connection-line" v-bind="customConnectionLineProps"></slot> </template>
</template> </NodeRenderer>
</EdgeRenderer> </slot>
</SelectionPane> <slot name="edge-renderer" v-bind="{ edges: store.getEdges, edgeTypes: store.getEdgeTypes }">
<slot name="zoom-pane" v-bind="zoomPaneProps"></slot> <EdgeRenderer
</template> key="edge-renderer"
</ZoomPane> :connection-line-type="store.connectionLineType"
:connection-line-style="store.connectionLineStyle"
:arrow-head-color="store.arrowHeadColor"
:marker-end-id="store.markerEndId"
>
<template
v-for="edgeName of Object.keys(store.getEdgeTypes)"
#[`edge-${edgeName}`]="edgeProps"
:key="`edge-${edgeName}`"
>
<slot :name="`edge-${edgeName}`" v-bind="edgeProps"></slot>
</template>
<template #custom-connection-line="customConnectionLineProps">
<slot key="connection-line" name="custom-connection-line" v-bind="customConnectionLineProps"></slot>
</template>
</EdgeRenderer>
</slot>
</SelectionPane>
<slot name="zoom-pane" v-bind="zoomPaneProps"></slot>
</template>
</ZoomPane>
</template>
<template v-if="store.loading" #fallback> <template v-if="store.loading" #fallback>
<slot key="loading-indicator" name="loading-indicator"> <slot key="loading-indicator" name="loading-indicator">
<LoadingIndicator key="default-loading-indicator" v-bind="store.loading"> <LoadingIndicator key="default-loading-indicator" v-bind="store.loading">
+2 -1
View File
@@ -181,7 +181,8 @@ store.dimensions = {
height: height.value, height: height.value,
} }
await until(() => store.isReady).toBe(true) // skip waiting for ssr
if (import.meta.env.SSR || typeof window === 'undefined') await until(() => store.isReady)
watch( watch(
[width, height], [width, height],
+2
View File
@@ -1,4 +1,6 @@
export { default as VueFlow } from './container/VueFlow/VueFlow.vue' export { default as VueFlow } from './container/VueFlow/VueFlow.vue'
export { default as NodeRenderer } from './container/NodeRenderer/NodeRenderer.vue'
export { default as EdgeRenderer } from './container/EdgeRenderer/EdgeRenderer.vue'
export { default as Handle } from './components/Handle/Handle.vue' export { default as Handle } from './components/Handle/Handle.vue'
export * from './components/Edges' export * from './components/Edges'
export * from './components/Nodes' export * from './components/Nodes'