feat(flow): Add setNodes and OnNodesChange / setEdges OnEdgesChange utils to useNode/Edge-state

* add option to apply default change handler
This commit is contained in:
Braks
2021-12-20 19:29:52 +01:00
parent 17a1b08ee0
commit 65b2e0d148
6 changed files with 46 additions and 17 deletions
+22 -5
View File
@@ -9,21 +9,38 @@ const applyEdgeChanges = (changes: EdgeChange[], edges: GraphEdge[]) => applyCha
export default (options?: FlowOptions): UseVueFlow => {
const currentInstance = getCurrentInstance()
let vueFlow = currentInstance ? inject(VueFlow, undefined) : false
let vueFlow: UseVueFlow | false | undefined = currentInstance ? inject(VueFlow, undefined) : false
if (!vueFlow || (vueFlow && options?.id && options.id !== vueFlow.store.id)) {
const store = reactive(useStore(options))
const applyNodes = (changes: NodeChange[]) => applyNodeChanges(changes, store.nodes)
const applyEdges = (changes: EdgeChange[]) => applyEdgeChanges(changes, store.edges)
vueFlow = {
id: store.id,
store,
useNodesState: (nodes) => {
store.setNodes(nodes)
return store.nodes
return {
nodes: store.nodes,
setNodes: store.setNodes,
OnNodesChange: (applyDefault = false) => {
if (applyDefault) store.hooksOn.OnNodesChange((e) => applyNodes(e))
return store.hooksOn.OnNodesChange
},
}
},
useEdgesState: (edges) => {
store.setEdges(edges)
return store.edges
return {
edges: store.edges,
setEdges: store.setEdges,
OnEdgesChange: (applyDefault = false) => {
if (applyDefault) store.hooksOn.OnEdgesChange((e) => applyEdges(e))
return store.hooksOn.OnEdgesChange
},
}
},
applyNodeChanges: (changes) => applyNodeChanges(changes, store.nodes),
applyEdgeChanges: (changes) => applyEdgeChanges(changes, store.edges),
applyNodeChanges: applyNodes,
applyEdgeChanges: applyEdges,
...store.hooksOn,
}
}
+2 -2
View File
@@ -64,9 +64,9 @@ export default {
<slot :name="`edge-${edge.type}`" v-bind="edgeProps"></slot>
</template>
</EdgeWrapper>
<ConnectionLine v-if="group.isMaxLevel && connectionLineVisible && sourceNode" :source-node="sourceNode">
<ConnectionLine v-if="connectionLineVisible && sourceNode" :source-node="sourceNode">
<template #default="customConnectionLineProps">
<slot name="custom-connection-line" v-bind="customConnectionLineProps"></slot>
<slot name="connection-line" v-bind="customConnectionLineProps"></slot>
</template>
</ConnectionLine>
</g>
@@ -27,8 +27,8 @@ const { store } = useVueFlow()
>
<slot :name="`edge-${edgeName}`" v-bind="edgeProps" />
</template>
<template #custom-connection-line="customConnectionLineProps">
<slot name="custom-connection-line" v-bind="customConnectionLineProps" />
<template #connection-line="customConnectionLineProps">
<slot name="connection-line" v-bind="customConnectionLineProps" />
</template>
</EdgeRenderer>
</div>
+4 -3
View File
@@ -21,8 +21,9 @@ const props = withDefaults(defineProps<FlowProps>(), {
})
const emit = defineEmits([...Object.keys(createHooks())])
const { store } = useVueFlow(props)
const { store } = useVueFlow()
useHooks(store, emit)
nextTick(() => store.setState(props))
watch(
() => props,
(v) => nextTick(() => store.setState(v)),
@@ -51,8 +52,8 @@ export default {
>
<slot :name="`edge-${edgeName}`" v-bind="edgeProps" />
</template>
<template #custom-connection-line="customConnectionLineProps">
<slot name="custom-connection-line" v-bind="customConnectionLineProps" />
<template #connection-line="customConnectionLineProps">
<slot name="connection-line" v-bind="customConnectionLineProps" />
</template>
<slot name="zoom-pane" />
</ZoomPane>
+2 -2
View File
@@ -237,8 +237,8 @@ export default {
>
<slot :name="`edge-${edgeName}`" v-bind="edgeProps" />
</template>
<template #custom-connection-line="customConnectionLineProps">
<slot name="custom-connection-line" v-bind="customConnectionLineProps" />
<template #connection-line="customConnectionLineProps">
<slot name="connection-line" v-bind="customConnectionLineProps" />
</template>
</TransformationPane>
<SelectionPane :key="`selection-pane-${store.id}`" />
+14 -3
View File
@@ -3,7 +3,7 @@ import { GraphEdge, Edge } from './edge'
import { GraphNode, CoordinateExtent, Node } from './node'
import { ConnectionLineType, ConnectionMode } from './connection'
import { KeyCode, PanOnScrollMode, UseZoomPanHelper } from './zoom'
import { FlowStore } from './store'
import { FlowActions, FlowStore } from './store'
import { EdgeChange, FlowHooksOn, NodeChange } from './hooks'
export type FlowElement<N = any, E = any> = GraphNode<N> | GraphEdge<E>
@@ -119,10 +119,21 @@ export interface FlowProps<N = any, E = N> {
export type FlowOptions<N = any, E = N> = FlowProps<N, E>
export type UseNodesState = {
nodes: GraphNode[]
setNodes: FlowActions['setNodes']
OnNodesChange: (applyDefault?: boolean) => FlowHooksOn['OnNodesChange']
}
export type UseEdgeState = {
edges: GraphEdge[]
setEdges: FlowActions['setEdges']
OnEdgesChange: (applyDefault: boolean) => FlowHooksOn['OnEdgesChange']
}
export type UseVueFlow = {
id: string
store: FlowStore
useNodesState: (nodes: Node[]) => GraphNode[]
useEdgesState: (edges: Edge[]) => GraphEdge[]
useNodesState: (nodes: Node[]) => UseNodesState
useEdgesState: (edges: Edge[]) => UseEdgeState
applyNodeChanges: (changes: NodeChange[]) => void
applyEdgeChanges: (changes: EdgeChange[]) => void
} & FlowHooksOn