feat(nodes): Allow pre-defined dimensions of a node
This commit is contained in:
@@ -73,6 +73,8 @@ const onDragStop: DraggableEventListener = ({ event, data: { deltaX, deltaY } })
|
|||||||
store.hooks.nodeDragStop.trigger({ event, node: node.value })
|
store.hooks.nodeDragStop.trigger({ event, node: node.value })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const size = ref<Record<string, string>>()
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
useResizeObserver(nodeElement, () =>
|
useResizeObserver(nodeElement, () =>
|
||||||
store.updateNodeDimensions([{ id: node.value.id, nodeElement: nodeElement.value, forceUpdate: true }]),
|
store.updateNodeDimensions([{ id: node.value.id, nodeElement: nodeElement.value, forceUpdate: true }]),
|
||||||
@@ -82,6 +84,18 @@ onMounted(() => {
|
|||||||
nextTick(() => store.updateNodeDimensions([{ id: node.value.id, nodeElement: nodeElement.value }])),
|
nextTick(() => store.updateNodeDimensions([{ id: node.value.id, nodeElement: nodeElement.value }])),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const { width, height } = nodeElement.value.getBoundingClientRect()
|
||||||
|
|
||||||
|
const hasCustomSize = node.value.dimensions && node.value.dimensions.width !== 0 && node.value.dimensions.height !== 0
|
||||||
|
const widthMatch = width === node.value.dimensions.width
|
||||||
|
const heightMatch = height === node.value.dimensions.height
|
||||||
|
|
||||||
|
if (hasCustomSize && (!widthMatch || !heightMatch)) {
|
||||||
|
size.value = {}
|
||||||
|
if (!widthMatch) size.value!.width = `${node.value.dimensions.width}px`
|
||||||
|
if (!heightMatch) size.value!.height = `${node.value.dimensions.height}px`
|
||||||
|
}
|
||||||
|
|
||||||
store.updateNodeDimensions([{ id: node.value.id, nodeElement: nodeElement.value }])
|
store.updateNodeDimensions([{ id: node.value.id, nodeElement: nodeElement.value }])
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -179,6 +193,7 @@ export default {
|
|||||||
zIndex: node.computedPosition.z,
|
zIndex: node.computedPosition.z,
|
||||||
transform: `translate(${node.computedPosition.x}px,${node.computedPosition.y}px)`,
|
transform: `translate(${node.computedPosition.x}px,${node.computedPosition.y}px)`,
|
||||||
pointerEvents: props.selectable || props.draggable ? 'all' : 'none',
|
pointerEvents: props.selectable || props.draggable ? 'all' : 'none',
|
||||||
|
...size,
|
||||||
...getStyle(),
|
...getStyle(),
|
||||||
}"
|
}"
|
||||||
:data-id="node.id"
|
:data-id="node.id"
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ export interface Node<Data = ElementData> extends Element<Data> {
|
|||||||
expandParent?: boolean
|
expandParent?: boolean
|
||||||
/** define node as a child node by setting a parent node id */
|
/** define node as a child node by setting a parent node id */
|
||||||
parentNode?: string
|
parentNode?: string
|
||||||
|
dimensions?: Partial<Dimensions>
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface GraphNode<Data = ElementData> extends Node<Data> {
|
export interface GraphNode<Data = ElementData> extends Node<Data> {
|
||||||
@@ -54,7 +55,7 @@ export interface NodeProps<Data = ElementData> {
|
|||||||
/** node DOM-element */
|
/** node DOM-element */
|
||||||
nodeElement: HTMLDivElement
|
nodeElement: HTMLDivElement
|
||||||
type: string
|
type: string
|
||||||
data: Data
|
data?: Data
|
||||||
selected: boolean
|
selected: boolean
|
||||||
connectable: boolean
|
connectable: boolean
|
||||||
/** absolute position in relation to parent elements + z-index */
|
/** absolute position in relation to parent elements + z-index */
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ export const parseNode = (node: Node, nodeExtent: CoordinateExtent, defaults?: P
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
...(defaults as GraphNode),
|
...(defaults as GraphNode),
|
||||||
...node,
|
...(node as GraphNode),
|
||||||
id: node.id.toString(),
|
id: node.id.toString(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user