feat: merge store with props

* if options are passed to useVueFlow, we want to merge them with possibly passed props
* renamed flowStore to stateStore
* fix examples
* add store prop to pass an already existing store to flow

Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
Braks
2021-11-19 23:45:39 +01:00
parent 921d93c73e
commit 6a68292f7c
19 changed files with 80 additions and 96 deletions
+2
View File
@@ -13,6 +13,7 @@ import {
isNode, isNode,
removeElements, removeElements,
Node, Node,
useVueFlow,
} from '~/index' } from '~/index'
const onNodeDragStop = ({ node }: { node: Node }) => console.log('drag stop', node) const onNodeDragStop = ({ node }: { node: Node }) => console.log('drag stop', node)
@@ -54,6 +55,7 @@ const toggleclasss = () => {
return el return el
}) })
} }
useVueFlow()
</script> </script>
<template> <template>
<VueFlow <VueFlow
+2 -16
View File
@@ -28,10 +28,7 @@ const onElementsRemove = (elementsToRemove: Elements) => (elements.value = remov
const onLoad = (instance: FlowInstance) => (flowInstance.value = instance) const onLoad = (instance: FlowInstance) => (flowInstance.value = instance)
const onDrop = (event: DragEvent) => { const onDrop = (event: DragEvent) => {
event.preventDefault()
if (flowInstance.value) { if (flowInstance.value) {
console.log(event.dataTransfer?.getData('application/vueflow'))
const type = event.dataTransfer?.getData('application/vueflow') const type = event.dataTransfer?.getData('application/vueflow')
const position = flowInstance.value.project({ x: event.clientX, y: event.clientY - 40 }) const position = flowInstance.value.project({ x: event.clientX, y: event.clientY - 40 })
const newNode = { const newNode = {
@@ -40,24 +37,13 @@ const onDrop = (event: DragEvent) => {
position, position,
data: { label: `${type} node` }, data: { label: `${type} node` },
} as Node } as Node
elements.value.push(newNode) elements.value.push(newNode)
} }
} }
</script> </script>
<template> <template>
<div class="dndflow"> <div class="dndflow" @drop="onDrop">
<div class="vueflow-wrapper" @drop="onDrop"> <VueFlow v-model="elements" @elements-remove="onElementsRemove" @load="onLoad" @connect="onConnect" @dragover="onDragOver" />
<VueFlow
:elements="elements"
@elements-remove="onElementsRemove"
@load="onLoad"
@connect="onConnect"
@dragover="onDragOver"
>
<Controls />
</VueFlow>
</div>
<Sidebar /> <Sidebar />
</div> </div>
</template> </template>
+1 -1
View File
@@ -38,7 +38,7 @@ const addRandomNode = () => {
</script> </script>
<template> <template>
<VueFlow <VueFlow
:elements="elements" v-model="elements"
@load="onLoad" @load="onLoad"
@element-click="onElementClick" @element-click="onElementClick"
@elements-remove="onElementsRemove" @elements-remove="onElementsRemove"
+2 -2
View File
@@ -1,6 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useStore } from '~/index' import { useVueFlow } from '~/index'
const store = useStore() const store = useVueFlow()
const nodes = computed(() => store.nodes) const nodes = computed(() => store.nodes)
const transform = computed(() => store.transform) const transform = computed(() => store.transform)
+5 -2
View File
@@ -22,7 +22,7 @@ const elements = ref<Elements>([
const el = templateRef<HTMLDivElement>('page', null) const el = templateRef<HTMLDivElement>('page', null)
const onLoad = (flowInstance: FlowInstance) => { const onLoad = (flowInstance: FlowInstance) => {
flowInstance.setTransform({ x: el.value?.clientWidth / 2.2, y: el.value?.clientHeight / 3, zoom: 1.25 }) flowInstance.fitView({ padding: 1 })
} }
const color = ref<Colors>({ const color = ref<Colors>({
red: 100, red: 100,
@@ -35,12 +35,15 @@ const store = useVueFlow({
'rgb': true, 'rgb': true,
'rgb-output': true, 'rgb-output': true,
}, },
edgeTypes: {
pathfinding: true,
},
zoomOnScroll: false, zoomOnScroll: false,
}) })
</script> </script>
<template> <template>
<div ref="page" class="demo-flow"> <div ref="page" class="demo-flow">
<VueFlow :elements="elements" @load="onLoad"> <VueFlow v-model="elements" @load="onLoad">
<template #node-rgb="props"> <template #node-rgb="props">
<RGBNode v-bind="props" :amount="color" @change="onChange" /> <RGBNode v-bind="props" :amount="color" @change="onChange" />
</template> </template>
+1 -1
View File
@@ -10,7 +10,7 @@ const props = defineProps<RBGOutputNodeProps>()
<template> <template>
<div :style="{ backgroundColor: props.rgb }" class="rgb-output-node"> <div :style="{ backgroundColor: props.rgb }" class="rgb-output-node">
<div class="text-md uppercase">{{ props.rgb }}</div> <div class="text-md uppercase">{{ props.rgb }}</div>
<Handle type="source" :position="Position.Left" /> <Handle type="target" :position="Position.Left" />
</div> </div>
</template> </template>
<style> <style>
-1
View File
@@ -1,4 +1,3 @@
module.exports = { module.exports = {
inject: true,
plugins: [require('autoprefixer'), require('postcss-nested')], plugins: [require('autoprefixer'), require('postcss-nested')],
} }
@@ -22,7 +22,7 @@ const sourceHandle =
? props.sourceNode.__rf?.handleBounds[store.connectionHandleType].find( ? props.sourceNode.__rf?.handleBounds[store.connectionHandleType].find(
(d: HandleElement) => d.id === store.connectionHandleId, (d: HandleElement) => d.id === store.connectionHandleId,
) )
: store.connectionHandleType && props.sourceNode.__rf?.handleBounds[store.connectionHandleType][0] : store.connectionHandleType && props.sourceNode.__rf?.handleBounds[store.connectionHandleType ?? 'source'][0]
const sourceHandleX = sourceHandle ? sourceHandle.x + sourceHandle.width / 2 : (props.sourceNode.__rf?.width as number) / 2 const sourceHandleX = sourceHandle ? sourceHandle.x + sourceHandle.width / 2 : (props.sourceNode.__rf?.width as number) / 2
const sourceHandleY = sourceHandle ? sourceHandle.y + sourceHandle.height / 2 : props.sourceNode.__rf?.height const sourceHandleY = sourceHandle ? sourceHandle.y + sourceHandle.height / 2 : props.sourceNode.__rf?.height
const sourceX = props.sourceNode.__rf?.position?.x + sourceHandleX const sourceX = props.sourceNode.__rf?.position?.x + sourceHandleX
+1 -1
View File
@@ -20,6 +20,7 @@ const type = store.getEdgeTypes[edgeType] || store.getEdgeTypes.default
if (!store.getEdgeTypes[edgeType]) { if (!store.getEdgeTypes[edgeType]) {
console.warn(`Edge type "${edgeType}" not found. Using fallback type "default".`) console.warn(`Edge type "${edgeType}" not found. Using fallback type "default".`)
} }
const updating = ref<boolean>(false)
const onEdgeClick = (event: MouseEvent) => { const onEdgeClick = (event: MouseEvent) => {
if (store.elementsSelectable) { if (store.elementsSelectable) {
@@ -63,7 +64,6 @@ const onEdgeUpdaterTargetMouseDown = (event: MouseEvent) => {
handleEdgeUpdater(event, false) handleEdgeUpdater(event, false)
} }
const updating = ref<boolean>(false)
const onEdgeUpdaterMouseEnter = () => (updating.value = true) const onEdgeUpdaterMouseEnter = () => (updating.value = true)
const onEdgeUpdaterMouseOut = () => (updating.value = false) const onEdgeUpdaterMouseOut = () => (updating.value = false)
+1 -1
View File
@@ -19,7 +19,7 @@ const props = withDefaults(defineProps<HandleProps>(), {
}) })
const store = useStore() const store = useStore()
const nodeId = inject(NodeId, '')! const nodeId = inject(NodeId, '')
const handler = useHandle() const handler = useHandle()
const onMouseDownHandler = (event: MouseEvent) => const onMouseDownHandler = (event: MouseEvent) =>
+3 -6
View File
@@ -67,10 +67,8 @@ const resetRecentHandle = (hoveredHandle: Element): void => {
hoveredHandle?.classList.remove('vue-flow__handle-connecting') hoveredHandle?.classList.remove('vue-flow__handle-connecting')
} }
export default () => { export default (store = useStore()) =>
const store = useStore() (
return (
event: MouseEvent, event: MouseEvent,
handleId: ElementId, handleId: ElementId,
nodeId: ElementId, nodeId: ElementId,
@@ -93,7 +91,7 @@ export default () => {
if (!flowNode || (!elementBelowIsTarget && !elementBelowIsSource && !elementEdgeUpdaterType)) return if (!flowNode || (!elementBelowIsTarget && !elementBelowIsSource && !elementEdgeUpdaterType)) return
const handleType = elementEdgeUpdaterType || (elementBelowIsTarget ? 'target' : 'source') const handleType = elementEdgeUpdaterType ?? (elementBelowIsTarget ? 'target' : 'source')
const containerBounds = flowNode.getBoundingClientRect() const containerBounds = flowNode.getBoundingClientRect()
let recentHoveredHandle: Element let recentHoveredHandle: Element
@@ -167,4 +165,3 @@ export default () => {
doc.addEventListener('mousemove', onMouseMove as EventListenerOrEventListenerObject) doc.addEventListener('mousemove', onMouseMove as EventListenerOrEventListenerObject)
doc.addEventListener('mouseup', onMouseUp as EventListenerOrEventListenerObject) doc.addEventListener('mouseup', onMouseUp as EventListenerOrEventListenerObject)
} }
}
+3 -3
View File
@@ -1,11 +1,11 @@
import { FlowExportObject, FlowOptions } from '~/types' import { FlowExportObject, FlowOptions } from '~/types'
import { useFlowStore, initialState } from '~/store' import { useStateStore, initialState } from '~/store'
import { Store } from '~/context' import { Store } from '~/context'
import { onLoadToObject } from '~/utils' import { onLoadToObject } from '~/utils'
let id = 0 let id = 0
export default (options?: Partial<FlowOptions>) => { export default (options?: Partial<FlowOptions>) => {
let store = inject(Store, null)! let store = inject(Store, null)
if (!store) { if (!store) {
const withStorage = options?.storageKey ?? false const withStorage = options?.storageKey ?? false
@@ -25,7 +25,7 @@ export default (options?: Partial<FlowOptions>) => {
preloadedState.transform = [storedState.value.position[0], storedState.value.position[1], storedState.value.zoom] preloadedState.transform = [storedState.value.position[0], storedState.value.position[1], storedState.value.zoom]
} }
} }
store = useFlowStore(storageKey, preloadedState)() store = useStateStore(storageKey, preloadedState)()
if (withStorage && storageKey === store.$id) { if (withStorage && storageKey === store.$id) {
const toObject = onLoadToObject(store) const toObject = onLoadToObject(store)
store.$subscribe(() => { store.$subscribe(() => {
+4 -9
View File
@@ -1,15 +1,10 @@
import useHooks from './useHooks'
import useStore from './useStore' import useStore from './useStore'
import useHooks from './useHooks'
import { EmitFunc, FlowOptions, FlowStore } from '~/types' import { EmitFunc, FlowOptions, FlowStore } from '~/types'
export const initFlow = (emit: EmitFunc, options: Partial<FlowOptions>) => { export const initFlow = (emit: EmitFunc, store = useStore()) => {
const store = useStore(options) useHooks(store, emit)
const hooks = useHooks(store, emit) return store
return {
store,
hooks,
}
} }
export default (options?: Partial<FlowOptions>): FlowStore => useStore(options) export default (options?: Partial<FlowOptions>): FlowStore => useStore(options)
+35 -42
View File
@@ -12,6 +12,7 @@ import {
FlowOptions, FlowOptions,
NodeTypes, NodeTypes,
EdgeTypes, EdgeTypes,
FlowStore,
} from '../../types' } from '../../types'
import ZoomPane from '../../container/ZoomPane/ZoomPane.vue' import ZoomPane from '../../container/ZoomPane/ZoomPane.vue'
import SelectionPane from '../../container/SelectionPane/SelectionPane.vue' import SelectionPane from '../../container/SelectionPane/SelectionPane.vue'
@@ -20,6 +21,8 @@ import EdgeRenderer from '../../container/EdgeRenderer/EdgeRenderer.vue'
import { createHooks, initFlow } from '../../composables' import { createHooks, initFlow } from '../../composables'
export interface FlowProps extends Partial<FlowOptions> { export interface FlowProps extends Partial<FlowOptions> {
id?: string
store?: FlowStore
modelValue?: Elements modelValue?: Elements
elements?: Elements elements?: Elements
nodeTypes?: NodeTypes nodeTypes?: NodeTypes
@@ -54,11 +57,11 @@ export interface FlowProps extends Partial<FlowOptions> {
panOnScrollMode?: PanOnScrollMode panOnScrollMode?: PanOnScrollMode
zoomOnDoubleClick?: boolean zoomOnDoubleClick?: boolean
edgeUpdaterRadius?: number edgeUpdaterRadius?: number
edgeTypesId?: string
nodeTypesId?: string
storageKey?: string storageKey?: string
} }
const emit = defineEmits([...Object.keys(createHooks()), 'update:elements', 'update:modelValue'])
const props = withDefaults(defineProps<FlowProps>(), { const props = withDefaults(defineProps<FlowProps>(), {
modelValue: () => [], modelValue: () => [],
elements: () => [], elements: () => [],
@@ -96,23 +99,22 @@ const props = withDefaults(defineProps<FlowProps>(), {
panOnScrollMode: PanOnScrollMode.Free, panOnScrollMode: PanOnScrollMode.Free,
paneMoveable: true, paneMoveable: true,
edgeUpdaterRadius: 10, edgeUpdaterRadius: 10,
edgeTypesId: '1',
nodeTypesId: '1',
}) })
const emit = defineEmits([...Object.keys(createHooks()), 'update:elements', 'update:modelValue']) const store = initFlow(emit, props.store)
const { store, hooks } = initFlow(emit, props)
const elements = useVModel(props, props.elements.length ? 'elements' : 'modelValue', emit) const elements = useVModel(props, props.elements.length ? 'elements' : 'modelValue', emit)
const options = Object.assign({}, props, store.$state)
// if there are preloaded elements we overwrite the current elements with the stored ones // if there are preloaded elements we overwrite the current elements with the stored ones
if (store.elements.length) elements.value = store.elements if (store.elements.length) elements.value = store.elements
const init = (opts: typeof props) => { const init = (opts: typeof props) => {
for (const opt of Object.keys(opts)) { for (const opt of Object.keys(opts)) {
const val = opts[opt as keyof FlowProps] const val = opts[opt as keyof FlowProps]
if (val && typeof val !== 'undefined') { if (val && typeof val !== 'undefined') {
if (typeof val === 'object' && !Array.isArray(val)) { if (typeof val === 'object' && !Array.isArray(val)) {
;(store.$state as any)[opt] = { ...(store.$state as any)[opt], ...val } ;(store as any)[opt] = { ...(store.$state as any)[opt], ...val }
} else (store.$state as any)[opt] = val } else (store as any)[opt] = val
} }
} }
store.setElements(elements.value) store.setElements(elements.value)
@@ -123,18 +125,9 @@ const init = (opts: typeof props) => {
} }
onBeforeUnmount(() => store?.$dispose()) onBeforeUnmount(() => store?.$dispose())
store.hooks.load.on(() => init(props))
onMounted(() => { onMounted(() => {
watch( init(options)
elements, watch(elements, (val) => store.setElements(val), { flush: 'post', deep: true })
(val, oldVal) => {
nextTick(() => {
const hasDiff = diff(val, oldVal)
if (hasDiff.length > 0) store.setElements(val)
})
},
{ flush: 'pre', deep: true },
)
watch( watch(
() => store.elements, () => store.elements,
(val, oldVal) => { (val, oldVal) => {
@@ -143,13 +136,13 @@ onMounted(() => {
if (hasDiff.length > 0) elements.value = val if (hasDiff.length > 0) elements.value = val
}) })
}, },
{ flush: 'pre', deep: true }, { flush: 'post', deep: true },
) )
watch( watch(
() => props, () => props,
(val, oldVal) => { (val, oldVal) => {
const hasDiff = diff(val, oldVal) const hasDiff = diff(val, oldVal)
if (hasDiff.length > 0) init(val) if (hasDiff.length > 0) init({ ...options, ...val })
}, },
{ flush: 'pre', deep: true }, { flush: 'pre', deep: true },
) )
@@ -159,34 +152,34 @@ onMounted(() => {
<div class="vue-flow"> <div class="vue-flow">
<Suspense> <Suspense>
<ZoomPane <ZoomPane
:selection-key-code="props.selectionKeyCode" :selection-key-code="store.selectionKeyCode"
:zoom-activation-key-code="props.zoomActivationKeyCode" :zoom-activation-key-code="store.zoomActivationKeyCode"
:default-zoom="props.defaultZoom" :default-zoom="store.defaultZoom"
:default-position="props.defaultPosition" :default-position="store.defaultPosition"
:zoom-on-scroll="props.zoomOnScroll" :zoom-on-scroll="store.zoomOnScroll"
:zoom-on-pinch="props.zoomOnPinch" :zoom-on-pinch="store.zoomOnPinch"
:zoom-on-double-click="props.zoomOnDoubleClick" :zoom-on-double-click="store.zoomOnDoubleClick"
:pan-on-scroll="props.panOnScroll" :pan-on-scroll="store.panOnScroll"
:pan-on-scroll-speed="props.panOnScrollSpeed" :pan-on-scroll-speed="store.panOnScrollSpeed"
:pan-on-scroll-mode="props.panOnScrollMode" :pan-on-scroll-mode="store.panOnScrollMode"
:pane-moveable="props.paneMoveable" :pane-moveable="store.paneMoveable"
> >
<template #default="zoomPaneProps"> <template #default="zoomPaneProps">
<SelectionPane <SelectionPane
:delete-key-code="props.deleteKeyCode" :delete-key-code="store.deleteKeyCode"
:multi-selection-key-code="props.multiSelectionKeyCode" :multi-selection-key-code="store.multiSelectionKeyCode"
:selection-key-code="props.selectionKeyCode" :selection-key-code="store.selectionKeyCode"
> >
<NodeRenderer :select-nodes-on-drag="props.selectNodesOnDrag"> <NodeRenderer :select-nodes-on-drag="store.selectNodesOnDrag">
<template v-for="nodeName of Object.keys(store.getNodeTypes)" #[`node-${nodeName}`]="nodeProps"> <template v-for="nodeName of Object.keys(store.getNodeTypes)" #[`node-${nodeName}`]="nodeProps">
<slot :name="`node-${nodeName}`" v-bind="nodeProps"></slot> <slot :name="`node-${nodeName}`" v-bind="nodeProps"></slot>
</template> </template>
</NodeRenderer> </NodeRenderer>
<EdgeRenderer <EdgeRenderer
:connection-line-type="props.connectionLineType" :connection-line-type="store.connectionLineType"
:connection-line-style="props.connectionLineStyle" :connection-line-style="store.connectionLineStyle"
:arrow-head-color="props.arrowHeadColor" :arrow-head-color="store.arrowHeadColor"
:marker-end-id="props.markerEndId" :marker-end-id="store.markerEndId"
> >
<template v-for="edgeName of Object.keys(store.getEdgeTypes)" #[`edge-${edgeName}`]="edgeProps"> <template v-for="edgeName of Object.keys(store.getEdgeTypes)" #[`edge-${edgeName}`]="edgeProps">
<slot :name="`edge-${edgeName}`" v-bind="edgeProps"></slot> <slot :name="`edge-${edgeName}`" v-bind="edgeProps"></slot>
@@ -200,7 +193,7 @@ onMounted(() => {
</template> </template>
</ZoomPane> </ZoomPane>
</Suspense> </Suspense>
<slot v-bind="{ ...props, store, hooks }"></slot> <slot v-bind="{ ...props, store }"></slot>
</div> </div>
</template> </template>
<style> <style>
+12 -4
View File
@@ -1,4 +1,4 @@
import { ConnectionMode, EdgeTypes, FlowState, NodeTypes } from '~/types' import { ConnectionMode, EdgeTypes, FlowState, NodeTypes, PanOnScrollMode } from '~/types'
import { createHooks } from '~/composables' import { createHooks } from '~/composables'
import { DefaultNode, InputNode, OutputNode } from '~/components/Nodes' import { DefaultNode, InputNode, OutputNode } from '~/components/Nodes'
import { BezierEdge, SmoothStepEdge, StepEdge, StraightEdge } from '~/components/Edges' import { BezierEdge, SmoothStepEdge, StepEdge, StraightEdge } from '~/components/Edges'
@@ -22,8 +22,6 @@ export const initialState = (): FlowState => ({
height: 0, height: 0,
}, },
transform: [0, 0, 1], transform: [0, 0, 1],
nodeTypes: {},
edgeTypes: {},
elements: [], elements: [],
nodes: [], nodes: [],
edges: [], edges: [],
@@ -44,6 +42,14 @@ export const initialState = (): FlowState => ({
[Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY], [Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY],
[Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY], [Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],
], ],
zoomOnScroll: true,
zoomOnPinch: true,
zoomOnDoubleClick: true,
panOnScroll: false,
panOnScrollSpeed: 0.5,
panOnScrollMode: PanOnScrollMode.Free,
paneMoveable: true,
edgeUpdaterRadius: 10,
nodesSelectionActive: false, nodesSelectionActive: false,
selectionActive: false, selectionActive: false,
@@ -57,6 +63,8 @@ export const initialState = (): FlowState => ({
height: 0, height: 0,
draw: false, draw: false,
}, },
arrowHeadColor: '#b1b1b7',
connectionNodeId: undefined, connectionNodeId: undefined,
connectionHandleId: undefined, connectionHandleId: undefined,
connectionHandleType: 'source', connectionHandleType: 'source',
@@ -80,4 +88,4 @@ export const initialState = (): FlowState => ({
vueFlowVersion: typeof __VUE_FLOW_VERSION__ !== 'undefined' ? __VUE_FLOW_VERSION__ : '-', vueFlowVersion: typeof __VUE_FLOW_VERSION__ !== 'undefined' ? __VUE_FLOW_VERSION__ : '-',
}) })
export { default as useFlowStore } from './flowStore' export { default as useStateStore } from './stateStore'
+1 -1
View File
@@ -22,7 +22,7 @@ export interface Edge<T = any> {
labelBgStyle?: any labelBgStyle?: any
labelBgPadding?: [number, number] labelBgPadding?: [number, number]
labelBgBorderRadius?: number labelBgBorderRadius?: number
style?: CSSProperties style?: CSSProperties | unknown
animated?: boolean animated?: boolean
arrowHeadType?: ArrowHeadType arrowHeadType?: ArrowHeadType
markerEndId?: string markerEndId?: string
+2 -2
View File
@@ -24,9 +24,9 @@ export interface FlowState extends FlowOptions {
transform: Transform transform: Transform
elements: Elements elements: Elements
nodes: Node[] nodes: Node[]
nodeTypes: NodeTypes nodeTypes?: NodeTypes
edges: Edge[] edges: Edge[]
edgeTypes: EdgeTypes edgeTypes?: EdgeTypes
selectedElements?: Elements selectedElements?: Elements
selectedNodesBbox: Rect selectedNodesBbox: Rect
+4 -3
View File
@@ -3,6 +3,7 @@ import { Edge, EdgeTypes } from './edge'
import { Node, NodeExtent, NodeTypes, TranslateExtent } from './node' import { Node, NodeExtent, NodeTypes, TranslateExtent } from './node'
import { ConnectionLineType, ConnectionMode } from './connection' import { ConnectionLineType, ConnectionMode } from './connection'
import { KeyCode, PanOnScrollMode } from './panel' import { KeyCode, PanOnScrollMode } from './panel'
import { FlowStore } from './store'
export type ElementId = string export type ElementId = string
@@ -89,7 +90,9 @@ export type FlowInstance<T = any> = {
} }
export interface FlowOptions { export interface FlowOptions {
elements: Elements id?: string
store?: FlowStore
elements?: Elements
nodeTypes?: NodeTypes nodeTypes?: NodeTypes
edgeTypes?: EdgeTypes edgeTypes?: EdgeTypes
connectionMode?: ConnectionMode connectionMode?: ConnectionMode
@@ -122,7 +125,5 @@ export interface FlowOptions {
panOnScrollMode?: PanOnScrollMode panOnScrollMode?: PanOnScrollMode
zoomOnDoubleClick?: boolean zoomOnDoubleClick?: boolean
edgeUpdaterRadius?: number edgeUpdaterRadius?: number
nodeTypesId?: string
edgeTypesId?: string
storageKey?: string storageKey?: string
} }