fix: node type change not triggering recalculation of node dimensions

This commit is contained in:
Braks
2021-10-21 16:23:23 +02:00
parent 636eeff9fe
commit cd02dd0444
6 changed files with 23 additions and 7 deletions
@@ -1,8 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { CSSProperties } from 'vue' import { CSSProperties } from 'vue'
import Flow, { addEdge, Connection, Elements, OnLoadParams, Position, Edge, isEdge } from '~/index' import Flow, { addEdge, Connection, Edge, Elements, isEdge, OnLoadParams, Position } from '~/index'
const onLoad = (reactFlowInstance: OnLoadParams) => reactFlowInstance.fitView()
const initialElements: Elements = [ const initialElements: Elements = [
{ {
@@ -26,7 +24,11 @@ const initialElements: Elements = [
const buttonStyle: CSSProperties = { position: 'absolute', right: 10, top: 30, zIndex: 4 } const buttonStyle: CSSProperties = { position: 'absolute', right: 10, top: 30, zIndex: 4 }
const elements = ref<Elements>(initialElements) const elements = ref<Elements>(initialElements)
const onConnect = (params: Connection | Edge) => (elements.value = addEdge(params, elements.value)) const onConnect = (params: Connection | Edge) => (elements.value = addEdge(params, elements.value))
const onLoad = (reactFlowInstance: OnLoadParams) => reactFlowInstance.fitView()
const changeType = () => { const changeType = () => {
elements.value = elements.value.map((el) => { elements.value = elements.value.map((el) => {
if (isEdge(el) || el.type === 'input') return el if (isEdge(el) || el.type === 'input') return el
+1 -1
View File
@@ -96,7 +96,7 @@ const isVisible = ({ sourceX, sourceY, targetX, targetY }: ReturnType<typeof get
const targetNodeHandles = computed(() => const targetNodeHandles = computed(() =>
store.connectionMode === ConnectionMode.Strict store.connectionMode === ConnectionMode.Strict
? nodes.value.targetNode?.__rf.handleBounds.target ? nodes.value.targetNode?.__rf.handleBounds.target
: nodes.value.targetNode?.__rf.handleBounds.target || nodes.value.targetNode?.__rf.handleBounds.source, : nodes.value.targetNode?.__rf.handleBounds.target ?? nodes.value.targetNode?.__rf.handleBounds.source,
) )
const sourceHandle = computed( const sourceHandle = computed(
+12
View File
@@ -1,5 +1,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { DraggableEventListener } from '@braks/revue-draggable' import { DraggableEventListener } from '@braks/revue-draggable'
import { watchPostEffect } from 'vue'
import { Node, NodeType, SnapGrid } from '~/types' import { Node, NodeType, SnapGrid } from '~/types'
import { NodeIdContextKey } from '~/context' import { NodeIdContextKey } from '~/context'
import { useHooks, useStore } from '~/composables' import { useHooks, useStore } from '~/composables'
@@ -122,6 +123,17 @@ onMounted(() => {
}), }),
) )
}) })
watch(
() => props.node.type,
() => {
store.updateNodeDimensions({
id: props.node.id,
nodeElement: nodeElement.value,
forceUpdate: true,
})
},
)
</script> </script>
<template> <template>
+2 -2
View File
@@ -64,7 +64,7 @@ export interface FlowProps extends FlowOptions {
const props = withDefaults(defineProps<FlowProps>(), { const props = withDefaults(defineProps<FlowProps>(), {
elements: () => [], elements: () => [],
connectionMode: ConnectionMode.Strict, connectionMode: ConnectionMode.Loose,
connectionLineType: ConnectionLineType.Bezier, connectionLineType: ConnectionLineType.Bezier,
selectionKeyCode: 'Shift', selectionKeyCode: 'Shift',
multiSelectionKeyCode: 'Meta', multiSelectionKeyCode: 'Meta',
@@ -175,6 +175,6 @@ const edgeTypes = createEdgeTypes({ ...defaultEdgeTypes, ...props.edgeTypes })
</EdgeRenderer> </EdgeRenderer>
</SelectionPane> </SelectionPane>
</ZoomPane> </ZoomPane>
<slot v-bind="{ flowProps: props, store, hooks }"></slot> <slot v-bind="{ ...props, store, hooks }"></slot>
</div> </div>
</template> </template>
+2 -1
View File
@@ -6,6 +6,7 @@ export const initialState = (): FlowState => ({
height: 0, height: 0,
}, },
transform: [0, 0, 1], transform: [0, 0, 1],
elements: [],
nodes: [], nodes: [],
edges: [], edges: [],
selectedElements: undefined, selectedElements: undefined,
@@ -42,7 +43,7 @@ export const initialState = (): FlowState => ({
connectionHandleId: undefined, connectionHandleId: undefined,
connectionHandleType: 'source', connectionHandleType: 'source',
connectionPosition: { x: NaN, y: NaN }, connectionPosition: { x: NaN, y: NaN },
connectionMode: ConnectionMode.Strict, connectionMode: ConnectionMode.Loose,
snapGrid: [15, 15], snapGrid: [15, 15],
snapToGrid: false, snapToGrid: false,
+1
View File
@@ -10,6 +10,7 @@ import { D3Selection, D3Zoom, D3ZoomHandler } from '~/types/panel'
export interface FlowState { export interface FlowState {
dimensions: Dimensions dimensions: Dimensions
transform: Transform transform: Transform
elements: Elements
nodes: Node[] nodes: Node[]
edges: Edge[] edges: Edge[]
selectedElements?: Elements selectedElements?: Elements