42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
import type { Ref } from 'vue'
|
|
import type { Actions, GraphNode, HandleElement, Position } from '~/types'
|
|
|
|
export const getHandleBounds = (selector: string, nodeElement: HTMLDivElement, zoom: number): HandleElement[] | undefined => {
|
|
const handles = nodeElement.querySelectorAll(`.vue-flow__handle${selector}`)
|
|
|
|
if (!handles || !handles.length) {
|
|
return undefined
|
|
}
|
|
|
|
const handlesArray = Array.from(handles) as HTMLDivElement[]
|
|
const nodeBounds = nodeElement.getBoundingClientRect()
|
|
|
|
return handlesArray.map((handle): HandleElement => {
|
|
const handleBounds = handle.getBoundingClientRect()
|
|
|
|
return {
|
|
id: handle.getAttribute('data-handleid'),
|
|
position: handle.getAttribute('data-handlepos') as unknown as Position,
|
|
x: (handleBounds.left - nodeBounds.left) / zoom,
|
|
y: (handleBounds.top - nodeBounds.top) / zoom,
|
|
...getDimensions(handle),
|
|
}
|
|
})
|
|
}
|
|
|
|
export const handleNodeClick = (
|
|
node: GraphNode,
|
|
multiSelectionActive: boolean,
|
|
addSelectedNodes: Actions['addSelectedNodes'],
|
|
removeSelectedElements: Actions['removeSelectedElements'],
|
|
nodesSelectionActive: Ref<boolean>,
|
|
) => {
|
|
nodesSelectionActive.value = false
|
|
|
|
if (!node.selected) {
|
|
addSelectedNodes([node])
|
|
} else if (node.selected && multiSelectionActive) {
|
|
removeSelectedElements([node])
|
|
}
|
|
}
|