feat(nodes, edges, store): Add updateNodeDimensions actions

* Returns new changes for updating node dimensions
* Add expandParent prop to nodes when parents should be expanded to fit the new child in them
*
This commit is contained in:
Braks
2022-04-04 21:42:48 +02:00
parent 5cc0da29c0
commit 0093df43a9
11 changed files with 244 additions and 96 deletions
+35 -1
View File
@@ -12,13 +12,16 @@ import {
Edge,
Connection,
GraphEdge,
NodePositionChange,
} from '~/types'
import {
applyChanges,
connectionExists,
createPositionChange,
createSelectionChange,
getDimensions,
getEdgeId,
getHandleBounds,
getSelectionChanges,
isEdge,
isGraphEdge,
@@ -110,7 +113,7 @@ export const parseChildren = (
export default (state: State, getters: ComputedGetters): Actions => {
const updateNodePosition: Actions['updateNodePosition'] = ({ id, diff = { x: 0, y: 0 }, dragging }) => {
const changes: NodeDimensionChange[] = []
const changes: NodePositionChange[] = []
state.nodes.forEach((node) => {
if (node.selected) {
@@ -126,6 +129,36 @@ export default (state: State, getters: ComputedGetters): Actions => {
if (changes.length) state.hooks.nodesChange.trigger(changes)
}
const updateNodeDimensions: Actions['updateNodeDimensions'] = (updates) => {
const changes: NodeDimensionChange[] = updates.reduce<NodeDimensionChange[]>((res, update) => {
const node = getters.getNode.value(update.id)
if (node) {
const dimensions = getDimensions(update.nodeElement)
const doUpdate = !!(
dimensions.width &&
dimensions.height &&
(node.dimensions.width !== dimensions.width || node.dimensions.height !== dimensions.height || update.forceUpdate)
)
if (doUpdate) {
const handleBounds = getHandleBounds(update.nodeElement, state.transform[2])
node.dimensions = dimensions
node.handleBounds = handleBounds
res.push({
id: node.id,
type: 'dimensions',
dimensions,
})
}
}
return res
}, [])
if (changes.length) state.hooks.nodesChange.trigger(changes)
}
const addSelectedNodes: Actions['addSelectedNodes'] = (nodes) => {
const selectedNodesIds = nodes.map((n) => n.id)
@@ -296,6 +329,7 @@ export default (state: State, getters: ComputedGetters): Actions => {
}
return {
updateNodePosition,
updateNodeDimensions,
setElements,
setNodes,
setEdges,