feat: Add emits property to store

# What's changed?

* For easier access (and shorter syntax) of event emitters add emits property to store
* Change instance, zoom, hooks, emits and onEvent triggers to readonly
This commit is contained in:
Braks
2022-04-24 13:34:22 +02:00
parent c6840a31ad
commit f5d245322b
12 changed files with 103 additions and 76 deletions
+10 -10
View File
@@ -18,7 +18,7 @@ interface EdgeWrapper {
const { id, edge, name, sourceNode, targetNode, selectable, updatable, type } = defineProps<EdgeWrapper>() const { id, edge, name, sourceNode, targetNode, selectable, updatable, type } = defineProps<EdgeWrapper>()
const { hooks, connectionMode, edgeUpdaterRadius, noPanClassName, setState, getEdge, addSelectedEdges } = $(useVueFlow()) const { emits, connectionMode, edgeUpdaterRadius, noPanClassName, setState, getEdge, addSelectedEdges } = $(useVueFlow())
let updating = $ref(false) let updating = $ref(false)
@@ -33,18 +33,18 @@ const onEdgeClick = (event: MouseEvent) => {
addSelectedEdges([edge]) addSelectedEdges([edge])
} }
hooks.edgeClick.trigger(data) emits.edgeClick(data)
} }
const onEdgeContextMenu = (event: MouseEvent) => hooks.edgeContextMenu.trigger({ event, edge }) const onEdgeContextMenu = (event: MouseEvent) => emits.edgeContextMenu({ event, edge })
const onDoubleClick = (event: MouseEvent) => hooks.edgeDoubleClick.trigger({ event, edge }) const onDoubleClick = (event: MouseEvent) => emits.edgeDoubleClick({ event, edge })
const onEdgeMouseEnter = (event: MouseEvent) => hooks.edgeMouseEnter.trigger({ event, edge }) const onEdgeMouseEnter = (event: MouseEvent) => emits.edgeMouseEnter({ event, edge })
const onEdgeMouseMove = (event: MouseEvent) => hooks.edgeMouseMove.trigger({ event, edge }) const onEdgeMouseMove = (event: MouseEvent) => emits.edgeMouseMove({ event, edge })
const onEdgeMouseLeave = (event: MouseEvent) => hooks.edgeMouseLeave.trigger({ event, edge }) const onEdgeMouseLeave = (event: MouseEvent) => emits.edgeMouseLeave({ event, edge })
const onEdgeUpdaterMouseEnter = () => (updating = true) const onEdgeUpdaterMouseEnter = () => (updating = true)
@@ -58,7 +58,7 @@ const handleEdgeUpdater = (event: MouseEvent, isSourceHandle: boolean) => {
const nodeId = isSourceHandle ? edge.target : edge.source const nodeId = isSourceHandle ? edge.target : edge.source
const handleId = (isSourceHandle ? edge.targetHandle : edge.sourceHandle) ?? '' const handleId = (isSourceHandle ? edge.targetHandle : edge.sourceHandle) ?? ''
hooks.edgeUpdateStart.trigger({ event, edge }) emits.edgeUpdateStart({ event, edge })
onMouseDown( onMouseDown(
event, event,
@@ -67,8 +67,8 @@ const handleEdgeUpdater = (event: MouseEvent, isSourceHandle: boolean) => {
isSourceHandle, isSourceHandle,
undefined, undefined,
isSourceHandle ? 'target' : 'source', isSourceHandle ? 'target' : 'source',
(connection) => hooks.edgeUpdate.trigger({ edge, connection }), (connection) => emits.edgeUpdate({ edge, connection }),
() => hooks.edgeUpdateEnd.trigger({ event, edge }), () => emits.edgeUpdateEnd({ event, edge }),
) )
} }
+1 -1
View File
@@ -14,7 +14,7 @@ const {
}, },
} = defineProps<HandleProps>() } = defineProps<HandleProps>()
const { hooks, connectionStartHandle, connectionMode } = $(useVueFlow()) const { connectionStartHandle, connectionMode } = $(useVueFlow())
const nodeId = inject(NodeId, '') const nodeId = inject(NodeId, '')
+11 -11
View File
@@ -26,7 +26,7 @@ const {
viewport, viewport,
noDragClassName, noDragClassName,
noPanClassName, noPanClassName,
hooks, emits,
selectNodesOnDrag, selectNodesOnDrag,
setState, setState,
updateNodePosition, updateNodePosition,
@@ -134,30 +134,30 @@ onUnmounted(() => {
const onMouseEnter = (event: MouseEvent) => { const onMouseEnter = (event: MouseEvent) => {
if (!node.dragging) { if (!node.dragging) {
hooks.nodeMouseEnter.trigger({ event, node }) emits.nodeMouseEnter({ event, node })
} }
} }
const onMouseMove = (event: MouseEvent) => { const onMouseMove = (event: MouseEvent) => {
if (!node.dragging) { if (!node.dragging) {
hooks.nodeMouseMove.trigger({ event, node }) emits.nodeMouseMove({ event, node })
} }
} }
const onMouseLeave = (event: MouseEvent) => { const onMouseLeave = (event: MouseEvent) => {
if (!node.dragging) { if (!node.dragging) {
hooks.nodeMouseLeave.trigger({ event, node }) emits.nodeMouseLeave({ event, node })
} }
} }
const onContextMenu = (event: MouseEvent) => { const onContextMenu = (event: MouseEvent) => {
hooks.nodeContextMenu.trigger({ emits.nodeContextMenu({
event, event,
node, node,
}) })
} }
const onDoubleClick = (event: MouseEvent) => hooks.nodeDoubleClick.trigger({ event, node }) const onDoubleClick = (event: MouseEvent) => emits.nodeDoubleClick({ event, node })
const onSelectNode = (event: MouseEvent) => { const onSelectNode = (event: MouseEvent) => {
if (!draggable) { if (!draggable) {
@@ -168,13 +168,13 @@ const onSelectNode = (event: MouseEvent) => {
if (!node.selected) addSelectedNodes([node]) if (!node.selected) addSelectedNodes([node])
} }
hooks.nodeClick.trigger({ event, node }) emits.nodeClick({ event, node })
} }
} }
onDragStart(({ event }) => { onDragStart(({ event }) => {
addSelectedNodes([]) addSelectedNodes([])
hooks.nodeDragStart.trigger({ event, node }) emits.nodeDragStart({ event, node })
if (selectNodesOnDrag && selectable) { if (selectNodesOnDrag && selectable) {
setState({ setState({
@@ -193,7 +193,7 @@ onDragStart(({ event }) => {
onDrag(({ event, data: { deltaX, deltaY } }) => { onDrag(({ event, data: { deltaX, deltaY } }) => {
updateNodePosition({ id: node.id, diff: { x: deltaX, y: deltaY }, dragging: true }) updateNodePosition({ id: node.id, diff: { x: deltaX, y: deltaY }, dragging: true })
hooks.nodeDrag.trigger({ event, node }) emits.nodeDrag({ event, node })
}) })
onDragStop(({ event, data: { deltaX, deltaY } }) => { onDragStop(({ event, data: { deltaX, deltaY } }) => {
@@ -203,11 +203,11 @@ onDragStop(({ event, data: { deltaX, deltaY } }) => {
if (selectable && !selectNodesOnDrag && !node.selected) { if (selectable && !selectNodesOnDrag && !node.selected) {
addSelectedNodes([node]) addSelectedNodes([node])
} }
hooks.nodeClick.trigger({ event, node }) emits.nodeClick({ event, node })
return return
} }
updateNodePosition({ id: node.id, diff: { x: deltaX, y: deltaY }, dragging: false }) updateNodePosition({ id: node.id, diff: { x: deltaX, y: deltaY }, dragging: false })
hooks.nodeDragStop.trigger({ event, node }) emits.nodeDragStop({ event, node })
}) })
const getClass = computed(() => { const getClass = computed(() => {
@@ -3,7 +3,7 @@ import { useDraggableCore } from '@braks/revue-draggable'
import { useVueFlow } from '../../composables' import { useVueFlow } from '../../composables'
import { getRectOfNodes } from '../../utils' import { getRectOfNodes } from '../../utils'
const { hooks, setState, viewport, getSelectedNodes, snapToGrid, snapGrid, updateNodePosition, noPanClassName } = $(useVueFlow()) const { emits, setState, viewport, getSelectedNodes, snapToGrid, snapGrid, updateNodePosition, noPanClassName } = $(useVueFlow())
const el = templateRef<HTMLDivElement>('el', null) const el = templateRef<HTMLDivElement>('el', null)
@@ -24,7 +24,7 @@ watch($$(selectedNodesBBox), (v) => {
}) })
}) })
const onContextMenu = (event: MouseEvent) => hooks.selectionContextMenu.trigger({ event, nodes: getSelectedNodes }) const onContextMenu = (event: MouseEvent) => emits.selectionContextMenu({ event, nodes: getSelectedNodes })
const { onDragStart, onDrag, onDragStop, scale } = useDraggableCore(el, { const { onDragStart, onDrag, onDragStop, scale } = useDraggableCore(el, {
grid: snapToGrid ? snapGrid : undefined, grid: snapToGrid ? snapGrid : undefined,
@@ -42,15 +42,15 @@ onMounted(() => {
) )
}) })
onDragStart(({ event }) => hooks.selectionDragStart.trigger({ event, nodes: getSelectedNodes })) onDragStart(({ event }) => emits.selectionDragStart({ event, nodes: getSelectedNodes }))
onDrag(({ event, data: { deltaX, deltaY } }) => { onDrag(({ event, data: { deltaX, deltaY } }) => {
hooks.selectionDrag.trigger({ event, nodes: getSelectedNodes }) emits.selectionDrag({ event, nodes: getSelectedNodes })
updateNodePosition({ diff: { x: deltaX, y: deltaY }, dragging: true }) updateNodePosition({ diff: { x: deltaX, y: deltaY }, dragging: true })
}) })
onDragStop(({ event }) => { onDragStop(({ event }) => {
hooks.selectionDragStop.trigger({ event, nodes: getSelectedNodes }) emits.selectionDragStop({ event, nodes: getSelectedNodes })
getSelectedNodes.forEach((node) => (node.dragging = false)) getSelectedNodes.forEach((node) => (node.dragging = false))
}) })
</script> </script>
+9 -9
View File
@@ -79,7 +79,7 @@ export default () => {
connectionStartHandle, connectionStartHandle,
connectionPosition, connectionPosition,
connectionMode, connectionMode,
hooks, emits,
setState, setState,
getNode, getNode,
} = $(useVueFlow()) } = $(useVueFlow())
@@ -131,7 +131,7 @@ export default () => {
connectionHandleType: handleType, connectionHandleType: handleType,
}) })
hooks.connectStart.trigger({ event, nodeId, handleId, handleType }) emits.connectStart({ event, nodeId, handleId, handleType })
function onMouseMove(event: MouseEvent) { function onMouseMove(event: MouseEvent) {
connectionPosition.x = event.clientX - containerBounds.left connectionPosition.x = event.clientX - containerBounds.left
@@ -173,16 +173,16 @@ export default () => {
getNode, getNode,
) )
hooks.connectStop.trigger(event) emits.connectStop(event)
const isOwnHandle = connection.source === connection.target const isOwnHandle = connection.source === connection.target
if (isValid && !isOwnHandle) { if (isValid && !isOwnHandle) {
if (!onEdgeUpdate) hooks.connect.trigger(connection) if (!onEdgeUpdate) emits.connect(connection)
else onEdgeUpdate(connection) else onEdgeUpdate(connection)
} }
hooks.connectEnd.trigger(event) emits.connectEnd(event)
if (elementEdgeUpdaterType) onEdgeUpdateEnd?.() if (elementEdgeUpdaterType) onEdgeUpdateEnd?.()
@@ -212,7 +212,7 @@ export default () => {
) => { ) => {
if (!connectOnClick) return if (!connectOnClick) return
if (!connectionStartHandle) { if (!connectionStartHandle) {
hooks.connectStart.trigger({ event, nodeId, handleId, handleType }) emits.connectStart({ event, nodeId, handleId, handleType })
setState({ connectionStartHandle: { nodeId, type: handleType, handleId } }) setState({ connectionStartHandle: { nodeId, type: handleType, handleId } })
} else { } else {
let validConnectFunc: ValidConnectionFunc = isValidConnection ?? (() => true) let validConnectFunc: ValidConnectionFunc = isValidConnection ?? (() => true)
@@ -241,11 +241,11 @@ export default () => {
const isOwnHandle = connection.source === connection.target const isOwnHandle = connection.source === connection.target
hooks.connectStop.trigger(event) emits.connectStop(event)
if (isValid && !isOwnHandle) hooks.connect.trigger(connection) if (isValid && !isOwnHandle) emits.connect(connection)
hooks.connectEnd.trigger(event) emits.connectEnd(event)
setState({ connectionStartHandle: null }) setState({ connectionStartHandle: null })
} }
+10 -4
View File
@@ -1,6 +1,6 @@
import { EffectScope } from 'vue' import { EffectScope } from 'vue'
import { MaybeRef } from '@vueuse/core' import { MaybeRef } from '@vueuse/core'
import { FlowHooksOn, FlowOptions, FlowProps, State, VueFlowStore } from '~/types' import { FlowOptions, FlowProps, State, VueFlowStore } from '~/types'
import { VueFlow } from '~/context' import { VueFlow } from '~/context'
import useState from '~/store/state' import useState from '~/store/state'
import useGetters from '~/store/getters' import useGetters from '~/store/getters'
@@ -43,10 +43,15 @@ export class Storage {
const actions = useActions(reactiveState, getters) const actions = useActions(reactiveState, getters)
const hooksOn: FlowHooksOn = <any>{} const hooksOn = <any>{}
Object.entries(reactiveState.hooks).forEach(([n, h]) => { Object.entries(reactiveState.hooks).forEach(([n, h]) => {
const name = `on${n.charAt(0).toUpperCase() + n.slice(1)}` as keyof FlowHooksOn const name = `on${n.charAt(0).toUpperCase() + n.slice(1)}`
hooksOn[name] = h.on as any hooksOn[name] = h.on
})
const emits = <any>{}
Object.entries(reactiveState.hooks).forEach(([n, h]) => {
emits[n] = h.trigger
}) })
actions.setState(reactiveState) actions.setState(reactiveState)
@@ -61,6 +66,7 @@ export class Storage {
...getters, ...getters,
...actions, ...actions,
...toRefs(reactiveState), ...toRefs(reactiveState),
emits,
id, id,
} }
+14 -3
View File
@@ -29,12 +29,23 @@ const untilDimensions = async (dimensions: Dimensions, getNodes: Getters['getNod
} }
export default (): ViewportFuncs => { export default (): ViewportFuncs => {
const { hooks, d3Zoom, d3Selection, dimensions, translateExtent, minZoom, maxZoom, viewport, snapToGrid, snapGrid, getNodes } = const {
$(useVueFlow()) onPaneReady,
d3Zoom,
d3Selection,
dimensions,
translateExtent,
minZoom,
maxZoom,
viewport,
snapToGrid,
snapGrid,
getNodes,
} = $(useVueFlow())
let hasDimensions = $ref(false) let hasDimensions = $ref(false)
hooks.paneReady.on(() => (hasDimensions = true)) onPaneReady(() => (hasDimensions = true))
const zoomTo: ViewportFuncs['zoomTo'] = async (zoomLevel, options) => { const zoomTo: ViewportFuncs['zoomTo'] = async (zoomLevel, options) => {
if (!hasDimensions) await untilDimensions(dimensions, getNodes) if (!hasDimensions) await untilDimensions(dimensions, getNodes)
@@ -11,7 +11,7 @@ const {
deleteKeyCode, deleteKeyCode,
selectionKeyCode, selectionKeyCode,
multiSelectionKeyCode, multiSelectionKeyCode,
hooks, emits,
nodesSelectionActive, nodesSelectionActive,
userSelectionActive, userSelectionActive,
elementsSelectable, elementsSelectable,
@@ -22,16 +22,16 @@ const {
} = $(useVueFlow()) } = $(useVueFlow())
const onClick = (event: MouseEvent) => { const onClick = (event: MouseEvent) => {
hooks.paneClick.trigger(event) emits.paneClick(event)
setState({ setState({
nodesSelectionActive: false, nodesSelectionActive: false,
}) })
resetSelectedElements() resetSelectedElements()
} }
const onContextMenu = (event: MouseEvent) => hooks.paneContextMenu.trigger(event) const onContextMenu = (event: MouseEvent) => emits.paneContextMenu(event)
const onWheel = (event: WheelEvent) => hooks.paneScroll.trigger(event) const onWheel = (event: WheelEvent) => emits.paneScroll(event)
useKeyPress($$(deleteKeyCode), (keyPressed) => { useKeyPress($$(deleteKeyCode), (keyPressed) => {
const selectedNodes = getSelectedNodes const selectedNodes = getSelectedNodes
@@ -45,8 +45,8 @@ useKeyPress($$(deleteKeyCode), (keyPressed) => {
type: 'remove', type: 'remove',
})) }))
hooks.nodesChange.trigger(nodeChanges) emits.nodesChange(nodeChanges)
hooks.edgesChange.trigger(edgeChanges) emits.edgesChange(edgeChanges)
setState({ setState({
nodesSelectionActive: false, nodesSelectionActive: false,
+2 -2
View File
@@ -5,7 +5,7 @@ import { useVueFlow, useZoomPanHelper, useWindow } from '../../composables'
import { Dimensions, FlowExportObject, FlowInstance, XYPosition } from '../../types' import { Dimensions, FlowExportObject, FlowInstance, XYPosition } from '../../types'
import { pointToRendererPoint } from '../../utils' import { pointToRendererPoint } from '../../utils'
const { id, nodes, edges, viewport, snapToGrid, snapGrid, dimensions, setState, fitViewOnInit, hooks } = $(useVueFlow()) const { id, nodes, edges, viewport, snapToGrid, snapGrid, dimensions, setState, fitViewOnInit, emits } = $(useVueFlow())
const untilDimensions = async (dim: Dimensions) => { const untilDimensions = async (dim: Dimensions) => {
// if ssr we can't wait for dimensions, they'll never really exist // if ssr we can't wait for dimensions, they'll never really exist
@@ -65,7 +65,7 @@ onMounted(async () => {
}) })
fitViewOnInit && instance.fitView() fitViewOnInit && instance.fitView()
hooks.paneReady.trigger(instance) emits.paneReady(instance)
}) })
const transform = computed(() => `translate(${viewport.x}px,${viewport.y}px) scale(${viewport.zoom})`) const transform = computed(() => `translate(${viewport.x}px,${viewport.y}px) scale(${viewport.zoom})`)
+4 -4
View File
@@ -28,7 +28,7 @@ const {
noWheelClassName, noWheelClassName,
noPanClassName, noPanClassName,
setState, setState,
hooks, emits,
} = $(useVueFlow()) } = $(useVueFlow())
const viewportEl = templateRef<HTMLDivElement>('viewport', null) const viewportEl = templateRef<HTMLDivElement>('viewport', null)
@@ -86,7 +86,7 @@ onMounted(() => {
d3Zoom.on('zoom', (event: D3ZoomEvent<HTMLDivElement, any>) => { d3Zoom.on('zoom', (event: D3ZoomEvent<HTMLDivElement, any>) => {
setState({ viewport: { x: event.transform.x, y: event.transform.y, zoom: event.transform.k } }) setState({ viewport: { x: event.transform.x, y: event.transform.y, zoom: event.transform.k } })
const flowTransform = eventToFlowTransform(event.transform) const flowTransform = eventToFlowTransform(event.transform)
hooks.move.trigger({ event, flowTransform }) emits.move({ event, flowTransform })
}) })
} }
}) })
@@ -96,14 +96,14 @@ onMounted(() => {
d3Zoom.on('start', (event: D3ZoomEvent<HTMLDivElement, any>) => { d3Zoom.on('start', (event: D3ZoomEvent<HTMLDivElement, any>) => {
const flowTransform = eventToFlowTransform(event.transform) const flowTransform = eventToFlowTransform(event.transform)
transform = flowTransform transform = flowTransform
hooks.moveStart.trigger({ event, flowTransform }) emits.moveStart({ event, flowTransform })
}) })
d3Zoom.on('end', (event: D3ZoomEvent<HTMLDivElement, any>) => { d3Zoom.on('end', (event: D3ZoomEvent<HTMLDivElement, any>) => {
if (viewChanged(transform, event.transform)) { if (viewChanged(transform, event.transform)) {
const flowTransform = eventToFlowTransform(event.transform) const flowTransform = eventToFlowTransform(event.transform)
transform = flowTransform transform = flowTransform
hooks.moveEnd.trigger({ event, flowTransform }) emits.moveEnd({ event, flowTransform })
} }
}) })
+10 -5
View File
@@ -1,4 +1,4 @@
import { EventHook, EventHookOn } from '@vueuse/core' import { EventHook, EventHookOn, EventHookTrigger } from '@vueuse/core'
import { MouseTouchEvent } from '@braks/revue-draggable' import { MouseTouchEvent } from '@braks/revue-draggable'
import { D3ZoomEvent } from 'd3-zoom' import { D3ZoomEvent } from 'd3-zoom'
import { FlowInstance } from './flow' import { FlowInstance } from './flow'
@@ -50,11 +50,16 @@ export interface FlowEvents {
edgeUpdateEnd: { event: MouseEvent; edge: GraphEdge } edgeUpdateEnd: { event: MouseEvent; edge: GraphEdge }
} }
export type FlowHooks = { export type FlowHooks = Readonly<{
[key in keyof FlowEvents]: EventHook<FlowEvents[key]> [key in keyof FlowEvents]: EventHook<FlowEvents[key]>
} }>
export type FlowHooksOn = {
export type FlowHooksOn = Readonly<{
[key in keyof FlowEvents as `on${Capitalize<key>}`]: EventHookOn<FlowEvents[key]> [key in keyof FlowEvents as `on${Capitalize<key>}`]: EventHookOn<FlowEvents[key]>
} }>
export type FlowHooksEmit = Readonly<{
[key in keyof FlowEvents]: EventHookTrigger<FlowEvents[key]>
}>
export type EmitFunc = (name: keyof FlowHooks, ...args: FlowEvents[keyof FlowEvents][]) => void export type EmitFunc = (name: keyof FlowHooks, ...args: FlowEvents[keyof FlowEvents][]) => void
+21 -16
View File
@@ -5,7 +5,7 @@ import { Connection, ConnectionLineType, ConnectionMode } from './connection'
import { DefaultEdgeOptions, Edge, GraphEdge } from './edge' import { DefaultEdgeOptions, Edge, GraphEdge } from './edge'
import { GraphNode, CoordinateExtent, Node } from './node' import { GraphNode, CoordinateExtent, Node } from './node'
import { D3Selection, D3Zoom, D3ZoomHandler, KeyCode, PanOnScrollMode, Viewport } from './zoom' import { D3Selection, D3Zoom, D3ZoomHandler, KeyCode, PanOnScrollMode, Viewport } from './zoom'
import { FlowHooks, FlowHooksOn } from './hooks' import { FlowHooks, FlowHooksEmit, FlowHooksOn } from './hooks'
import { NodeChange, EdgeChange } from './changes' import { NodeChange, EdgeChange } from './changes'
import { StartHandle, HandleType } from './handle' import { StartHandle, HandleType } from './handle'
@@ -19,29 +19,32 @@ export type UpdateNodePositionsParams = { id?: string; diff?: XYPosition; draggi
export interface State extends Omit<FlowOptions, 'id' | 'modelValue'> { export interface State extends Omit<FlowOptions, 'id' | 'modelValue'> {
/** Event hooks, you can manipulate the triggers at your own peril */ /** Event hooks, you can manipulate the triggers at your own peril */
hooks: FlowHooks readonly hooks: FlowHooks
instance: FlowInstance | null readonly instance: FlowInstance | null
/** all stored nodes */ /** all stored nodes */
nodes: GraphNode[] nodes: GraphNode[]
/** all stored edges */ /** all stored edges */
edges: GraphEdge[] edges: GraphEdge[]
d3Zoom: D3Zoom | null readonly d3Zoom: D3Zoom | null
d3Selection: D3Selection | null readonly d3Selection: D3Selection | null
d3ZoomHandler: D3ZoomHandler | null readonly d3ZoomHandler: D3ZoomHandler | null
/** use setMinZoom action to change minZoom */
minZoom: number minZoom: number
/** use setMaxZoom action to change maxZoom */
maxZoom: number maxZoom: number
defaultZoom: number defaultZoom: number
/** use setTranslateExtent action to change translateExtent */
translateExtent: CoordinateExtent translateExtent: CoordinateExtent
nodeExtent: CoordinateExtent nodeExtent: CoordinateExtent
/** viewport dimensions */ /** viewport dimensions - do not change! */
dimensions: Dimensions readonly dimensions: Dimensions
/** viewport transform x, y, z */ /** viewport transform x, y, z - do not change! */
viewport: Viewport readonly viewport: Viewport
/** if true will skip rendering any elements currently not inside viewport until they become visible */
onlyRenderVisibleElements: boolean onlyRenderVisibleElements: boolean
defaultPosition: [number, number] defaultPosition: [number, number]
@@ -98,7 +101,8 @@ export interface State extends Omit<FlowOptions, 'id' | 'modelValue'> {
defaultEdgeOptions?: DefaultEdgeOptions defaultEdgeOptions?: DefaultEdgeOptions
vueFlowVersion: string /** current vue flow version you're using */
readonly vueFlowVersion: string
} }
export type SetElements = (elements: Elements | ((elements: FlowElements) => Elements), extent?: CoordinateExtent) => void export type SetElements = (elements: Elements | ((elements: FlowElements) => Elements), extent?: CoordinateExtent) => void
@@ -146,7 +150,7 @@ export interface Actions {
setMaxZoom: (zoom: number) => void setMaxZoom: (zoom: number) => void
/** apply translate extent to d3 */ /** apply translate extent to d3 */
setTranslateExtent: (translateExtent: CoordinateExtent) => void setTranslateExtent: (translateExtent: CoordinateExtent) => void
/** enable node interaction (dragging, selecting etc) */ /** enable/disable node interaction (dragging, selecting etc) */
setInteractive: (isInteractive: boolean) => void setInteractive: (isInteractive: boolean) => void
/** set new state */ /** set new state */
setState: SetState setState: SetState
@@ -186,8 +190,9 @@ export type ComputedGetters = {
} }
export type VueFlowStore = { export type VueFlowStore = {
id: string readonly id: string
readonly emits: FlowHooksEmit
} & FlowHooksOn & } & FlowHooksOn &
ToRefs<State> & ToRefs<State> &
ComputedGetters & Readonly<ComputedGetters> &
Actions Readonly<Actions>