fix(viewpane): set viewpane functions on Transform mount

# What's changed?

* log warnings when viewpane functions are used before viewpane is ready
This commit is contained in:
bcakmakoglu
2022-06-07 18:33:00 +02:00
committed by Braks
parent eb8fa5d5d8
commit 8a570bea8b
3 changed files with 41 additions and 11 deletions
+2 -4
View File
@@ -41,7 +41,7 @@ const initialEdges = [
style: { strokeWidth: 2, stroke: '#0ea5e9' }, style: { strokeWidth: 2, stroke: '#0ea5e9' },
}, },
] ]
const { dimensions, instance, onNodeClick, getNodes, getNode, getEdge, updateEdge, edges, setEdges } = useVueFlow({ const { dimensions, onNodeClick, getNodes, fitView, getNode, getEdge, updateEdge, edges, setEdges } = useVueFlow({
nodes: [ nodes: [
{ id: 'intro', type: 'box', position: { x: 0, y: 0 } }, { id: 'intro', type: 'box', position: { x: 0, y: 0 } },
{ id: 'examples', type: 'box', position: { x: -50, y: 400 } }, { id: 'examples', type: 'box', position: { x: -50, y: 400 } },
@@ -103,8 +103,6 @@ onNodeClick(async ({ node }) => {
const init = ref(false) const init = ref(false)
const el = templateRef<HTMLDivElement>('el', null) const el = templateRef<HTMLDivElement>('el', null)
let stopObserver: () => void
const setNodes = () => { const setNodes = () => {
if (breakpoints.isSmaller('md')) { if (breakpoints.isSmaller('md')) {
const mainNode = getNode.value('intro')! const mainNode = getNode.value('intro')!
@@ -192,7 +190,7 @@ const setNodes = () => {
} }
nextTick(() => { nextTick(() => {
instance.value?.fitView() fitView()
if (!init.value) init.value = true if (!init.value) init.value = true
}) })
} }
@@ -1,10 +1,12 @@
<script lang="ts" setup> <script lang="ts" setup>
import NodeRenderer from '../NodeRenderer/NodeRenderer.vue' import NodeRenderer from '../NodeRenderer/NodeRenderer.vue'
import EdgeRenderer from '../EdgeRenderer/EdgeRenderer.vue' import EdgeRenderer from '../EdgeRenderer/EdgeRenderer.vue'
import { useVueFlow, useWindow } from '../../composables' import { useVueFlow, useWindow, useZoomPanHelper } from '../../composables'
import type { Dimensions } from '../../types' import type { Dimensions } from '../../types'
const { id, nodes, edges, viewport, snapToGrid, snapGrid, dimensions, setState, fitViewOnInit, emits, fitView } = $(useVueFlow()) const { id, nodes, edges, viewport, snapToGrid, snapGrid, dimensions, setState, fitViewOnInit, emits } = $(useVueFlow())
// eslint-disable-next-line prefer-const
let { fitView, zoomIn, zoomOut, zoomTo, setTransform, setCenter, fitBounds, ...rest } = 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
@@ -23,11 +25,24 @@ onMounted(async () => {
// wait until proper dimensions have been established, otherwise fitView will have wrong bounds when called at paneReady // wait until proper dimensions have been established, otherwise fitView will have wrong bounds when called at paneReady
await untilDimensions(dimensions) await untilDimensions(dimensions)
// create new instance and set to state
const zoomPanHelper = useZoomPanHelper()
fitView = (params = { padding: 0.1 }) => {
zoomPanHelper.fitView(params)
}
zoomIn = zoomPanHelper.zoomIn
zoomOut = zoomPanHelper.zoomOut
zoomTo = zoomPanHelper.zoomTo
setTransform = zoomPanHelper.setTransform
setCenter = zoomPanHelper.setCenter
fitBounds = zoomPanHelper.fitBounds
// hide graph until dimensions are ready, so we don't have jumping graphs (ssr for example) // hide graph until dimensions are ready, so we don't have jumping graphs (ssr for example)
ready = true ready = true
fitViewOnInit && fitView() fitViewOnInit && fitView()
emits.paneReady(useVueFlow()) emits.paneReady({ fitView, zoomIn, zoomOut, zoomTo, setTransform, setCenter, fitBounds, ...rest })
}) })
</script> </script>
+21 -4
View File
@@ -31,9 +31,9 @@ import {
isGraphNode, isGraphNode,
isNode, isNode,
parseEdge, parseEdge,
pointToRendererPoint,
updateEdgeAction, updateEdgeAction,
} from '~/utils' } from '~/utils'
import { useZoomPanHelper } from '~/composables'
export default (state: State, getters: ComputedGetters): Actions => { export default (state: State, getters: ComputedGetters): Actions => {
const updateNodePositions: Actions['updateNodePositions'] = (dragItems, changed, dragging) => { const updateNodePositions: Actions['updateNodePositions'] = (dragItems, changed, dragging) => {
@@ -338,7 +338,11 @@ export default (state: State, getters: ComputedGetters): Actions => {
) )
} }
const { fitView, ...rest } = useZoomPanHelper() const paneNotReady = () => {
console.warn(
`[Vue Flow]: Used viewpane function before pane was ready. Use viewpane functions *after* onPaneReady is emitted.`,
)
}
return { return {
updateNodePositions, updateNodePositions,
@@ -364,9 +368,22 @@ export default (state: State, getters: ComputedGetters): Actions => {
removeSelectedEdges, removeSelectedEdges,
setInteractive, setInteractive,
setState, setState,
fitView: (params = { padding: 0.1 }) => fitView(params), fitView: paneNotReady,
zoomIn: paneNotReady,
zoomOut: paneNotReady,
zoomTo: paneNotReady,
setTransform: paneNotReady,
getTransform: () => ({
x: state.viewport.x,
y: state.viewport.y,
zoom: state.viewport.zoom,
}),
setCenter: paneNotReady,
fitBounds: paneNotReady,
project(position) {
return pointToRendererPoint(position, state.viewport, state.snapToGrid, state.snapGrid)
},
toObject, toObject,
...rest,
$reset: () => { $reset: () => {
setState(useState()) setState(useState())
}, },