update(nodes): watch nodes width for dimension update
* add force param to setElements, if set we clear the elements arr (default true) * wait for store watcher until store is ready (i.e. a state has been set) * move renderer css class to Renderer.vue Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
@@ -17,8 +17,10 @@ import {
|
|||||||
|
|
||||||
const buttonWrapperStyles: CSSProperties = { position: 'absolute', right: 10, top: 10, zIndex: 4 }
|
const buttonWrapperStyles: CSSProperties = { position: 'absolute', right: 10, top: 10, zIndex: 4 }
|
||||||
|
|
||||||
|
const instance = ref<FlowInstance>()
|
||||||
const onLoad = (flowInstance: FlowInstance) => {
|
const onLoad = (flowInstance: FlowInstance) => {
|
||||||
flowInstance.fitView()
|
flowInstance.fitView()
|
||||||
|
instance.value = flowInstance
|
||||||
console.log(flowInstance.getElements())
|
console.log(flowInstance.getElements())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,6 +48,7 @@ const updatePos = () => {
|
|||||||
const updateElements = () => {
|
const updateElements = () => {
|
||||||
const grid = Math.ceil(Math.random() * 10)
|
const grid = Math.ceil(Math.random() * 10)
|
||||||
elements.value = getElements(grid, grid)
|
elements.value = getElements(grid, grid)
|
||||||
|
setTimeout(() => instance.value.fitView({ padding: 0.5 }))
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
|
|||||||
@@ -98,12 +98,17 @@ const updateNodeDimensions = ({ nodeElement, forceUpdate }: NodeDimensionUpdate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
updateNodeDimensions({
|
watch(
|
||||||
id: props.node.id,
|
() => props.node.__vf.width,
|
||||||
nodeElement: nodeElement.value,
|
() => {
|
||||||
forceUpdate: true,
|
updateNodeDimensions({
|
||||||
})
|
id: props.node.id,
|
||||||
|
nodeElement: nodeElement.value,
|
||||||
|
forceUpdate: true,
|
||||||
|
})
|
||||||
|
},
|
||||||
|
{ immediate: true },
|
||||||
|
)
|
||||||
useResizeObserver(nodeElement, (entries) =>
|
useResizeObserver(nodeElement, (entries) =>
|
||||||
entries.forEach((entry) => {
|
entries.forEach((entry) => {
|
||||||
updateNodeDimensions({
|
updateNodeDimensions({
|
||||||
|
|||||||
@@ -11,11 +11,7 @@ const props = defineProps<RendererProps>()
|
|||||||
const store = useStore()
|
const store = useStore()
|
||||||
|
|
||||||
// if there are preloaded elements we overwrite the current elements with the stored ones and reset the stored elements (so we can properly parse them)
|
// if there are preloaded elements we overwrite the current elements with the stored ones and reset the stored elements (so we can properly parse them)
|
||||||
const hasInitialElements = store.elements.length
|
await store.setElements(props.elements, false)
|
||||||
const initialElements = hasInitialElements ? store.elements : props.elements
|
|
||||||
if (hasInitialElements) store.elements = []
|
|
||||||
|
|
||||||
await store.setElements(initialElements)
|
|
||||||
store.isReady = true
|
store.isReady = true
|
||||||
|
|
||||||
nextTick(async () => {
|
nextTick(async () => {
|
||||||
@@ -45,5 +41,7 @@ export default {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<slot />
|
<div class="vue-flow__renderer">
|
||||||
|
<slot />
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -116,19 +116,22 @@ const { pause: pauseModel, resume: resumeModel } = pausableWatch(
|
|||||||
async () => await store.setElements(elements.value),
|
async () => await store.setElements(elements.value),
|
||||||
)
|
)
|
||||||
const { pause, resume } = pausableWatch(elements, async (val) => await store.setElements(val), { flush: 'post' })
|
const { pause, resume } = pausableWatch(elements, async (val) => await store.setElements(val), { flush: 'post' })
|
||||||
watch(
|
|
||||||
() => store.elements,
|
until(() => store.isReady).toBe(true).then(() => {
|
||||||
(val) => {
|
watch(
|
||||||
pause()
|
() => store.elements,
|
||||||
pauseModel()
|
(val) => {
|
||||||
elements.value = val
|
pause()
|
||||||
setTimeout(() => {
|
pauseModel()
|
||||||
resume()
|
elements.value = val
|
||||||
resumeModel()
|
setTimeout(() => {
|
||||||
}, 1)
|
resume()
|
||||||
},
|
resumeModel()
|
||||||
{ flush: 'post', deep: true },
|
}, 1)
|
||||||
)
|
},
|
||||||
|
{ flush: 'post', deep: true },
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
const transitionName = computed(() => {
|
const transitionName = computed(() => {
|
||||||
let name = ''
|
let name = ''
|
||||||
@@ -149,9 +152,9 @@ export default {
|
|||||||
<template>
|
<template>
|
||||||
<div class="vue-flow">
|
<div class="vue-flow">
|
||||||
<Transition :key="`vue-flow-transition-${store.$id}`" :name="transitionName">
|
<Transition :key="`vue-flow-transition-${store.$id}`" :name="transitionName">
|
||||||
<Suspense>
|
<Suspense timeout="0">
|
||||||
<template #default>
|
<template #default>
|
||||||
<Renderer :elements="elements">
|
<Renderer :key="`renderer-${store.$id}`" :elements="elements">
|
||||||
<ZoomPane
|
<ZoomPane
|
||||||
:key="`zoom-pane-${store.$id}`"
|
:key="`zoom-pane-${store.$id}`"
|
||||||
:prevent-scrolling="store.preventScrolling"
|
:prevent-scrolling="store.preventScrolling"
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ export default {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<div ref="zoomPane" class="vue-flow__renderer vue-flow__zoompane">
|
<div ref="zoomPane" class="vue-flow__zoompane">
|
||||||
<slot
|
<slot
|
||||||
v-bind="{
|
v-bind="{
|
||||||
transform: store.transform,
|
transform: store.transform,
|
||||||
|
|||||||
@@ -85,8 +85,9 @@ export default (id: string, preloadedState: FlowState) => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
async setElements(elements) {
|
async setElements(elements, force = true) {
|
||||||
const { nodes, edges } = parseElements(elements, this.elements, this.nodeExtent)
|
const { nodes, edges } = parseElements(elements, this.elements, this.nodeExtent)
|
||||||
|
if (force) this.elements = []
|
||||||
await processElements([...nodes, ...edges], (processed) => {
|
await processElements([...nodes, ...edges], (processed) => {
|
||||||
this.elements = [...this.elements, ...processed]
|
this.elements = [...this.elements, ...processed]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -5,6 +5,11 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.vue-flow__zoompane {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
.vue-flow__renderer,
|
.vue-flow__renderer,
|
||||||
.vue-flow__pane,
|
.vue-flow__pane,
|
||||||
.vue-flow__selectionpane {
|
.vue-flow__selectionpane {
|
||||||
|
|||||||
+1
-1
@@ -73,7 +73,7 @@ export interface FlowState extends Omit<FlowOptions, 'elements'> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface FlowActions {
|
export interface FlowActions {
|
||||||
setElements: (elements: Elements) => Promise<void>
|
setElements: (elements: Elements, init?: boolean) => Promise<void>
|
||||||
setUserSelection: (mousePos: XYPosition) => void
|
setUserSelection: (mousePos: XYPosition) => void
|
||||||
updateUserSelection: (mousePos: XYPosition) => void
|
updateUserSelection: (mousePos: XYPosition) => void
|
||||||
unsetUserSelection: () => void
|
unsetUserSelection: () => void
|
||||||
|
|||||||
+1
-2
@@ -53,8 +53,7 @@ export const getHostForElement = (element: HTMLElement): Document => {
|
|||||||
export const isEdge = (element: Node | Edge | Connection): element is Edge =>
|
export const isEdge = (element: Node | Edge | Connection): element is Edge =>
|
||||||
'id' in element && 'source' in element && 'target' in element
|
'id' in element && 'source' in element && 'target' in element
|
||||||
|
|
||||||
export const isNode = (element: Node | Edge | Connection): element is Node =>
|
export const isNode = (element: Node | Edge | Connection): element is Node => 'id' in element && !isEdge(element)
|
||||||
'id' in element && !('source' in element) && !('target' in element)
|
|
||||||
|
|
||||||
export const isGraphNode = (element: any): element is GraphNode => isNode(element) && '__vf' in element
|
export const isGraphNode = (element: any): element is GraphNode => isNode(element) && '__vf' in element
|
||||||
export const isGraphEdge = (element: any): element is GraphEdge => isEdge(element) && 'sourceTargetNodes' in element
|
export const isGraphEdge = (element: any): element is GraphEdge => isEdge(element) && 'sourceTargetNodes' in element
|
||||||
|
|||||||
Reference in New Issue
Block a user