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:
@@ -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 }),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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, '')
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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})`)
|
||||||
|
|||||||
@@ -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 })
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user