fix(core): elements not correctly unselected
This commit is contained in:
@@ -5,8 +5,7 @@ import { getConnectedEdges, getNodesInside } from '../../utils'
|
|||||||
import SelectionRect from './SelectionRect.vue'
|
import SelectionRect from './SelectionRect.vue'
|
||||||
import { getMousePosition } from './utils'
|
import { getMousePosition } from './utils'
|
||||||
|
|
||||||
const { userSelectionActive, nodesSelectionActive, getNodes, getEdges, viewport, addSelectedEdges, addSelectedNodes } =
|
const { userSelectionActive, nodesSelectionActive, getNodes, getEdges, viewport, addSelectedElements } = useVueFlow()
|
||||||
useVueFlow()
|
|
||||||
|
|
||||||
let prevNodes = $ref(0)
|
let prevNodes = $ref(0)
|
||||||
|
|
||||||
@@ -72,8 +71,7 @@ const onMouseMove = (event: MouseEvent) => {
|
|||||||
|
|
||||||
rect = nextUserSelectRect
|
rect = nextUserSelectRect
|
||||||
|
|
||||||
addSelectedNodes(selectedNodes)
|
addSelectedElements([...selectedNodes, ...selectedEdges])
|
||||||
addSelectedEdges(selectedEdges)
|
|
||||||
|
|
||||||
prevNodes = selectedNodes.length
|
prevNodes = selectedNodes.length
|
||||||
prevEdges = selectedEdges.length
|
prevEdges = selectedEdges.length
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import type {
|
|||||||
CoordinateExtent,
|
CoordinateExtent,
|
||||||
EdgeChange,
|
EdgeChange,
|
||||||
EdgeRemoveChange,
|
EdgeRemoveChange,
|
||||||
|
EdgeSelectionChange,
|
||||||
|
Elements,
|
||||||
FlowExportObject,
|
FlowExportObject,
|
||||||
GraphEdge,
|
GraphEdge,
|
||||||
GraphNode,
|
GraphNode,
|
||||||
@@ -12,6 +14,7 @@ import type {
|
|||||||
NodeDimensionChange,
|
NodeDimensionChange,
|
||||||
NodePositionChange,
|
NodePositionChange,
|
||||||
NodeRemoveChange,
|
NodeRemoveChange,
|
||||||
|
NodeSelectionChange,
|
||||||
State,
|
State,
|
||||||
} from '~/types'
|
} from '~/types'
|
||||||
import {
|
import {
|
||||||
@@ -139,19 +142,47 @@ export default (state: State, getters: ComputedGetters): Actions => {
|
|||||||
const nodeIds = nodes.map((n) => n.id)
|
const nodeIds = nodes.map((n) => n.id)
|
||||||
|
|
||||||
let changedNodes: NodeChange[]
|
let changedNodes: NodeChange[]
|
||||||
|
let changedEdges: EdgeChange[] = []
|
||||||
if (state.multiSelectionActive) changedNodes = nodeIds.map((nodeId) => createSelectionChange(nodeId, selected))
|
if (state.multiSelectionActive) changedNodes = nodeIds.map((nodeId) => createSelectionChange(nodeId, selected))
|
||||||
else changedNodes = getSelectionChanges(state.nodes, nodeIds)
|
else {
|
||||||
|
const selectionChanges = getSelectionChanges([...state.nodes, ...state.edges], nodeIds)
|
||||||
|
changedNodes = selectionChanges.changedNodes
|
||||||
|
changedEdges = selectionChanges.changedEdges
|
||||||
|
}
|
||||||
|
|
||||||
if (changedNodes.length) state.hooks.nodesChange.trigger(changedNodes)
|
if (changedNodes.length) state.hooks.nodesChange.trigger(changedNodes)
|
||||||
|
if (changedEdges.length) state.hooks.edgesChange.trigger(changedEdges)
|
||||||
}
|
}
|
||||||
|
|
||||||
const edgeSelectionHandler = (edges: GraphEdge[], selected: boolean) => {
|
const edgeSelectionHandler = (edges: GraphEdge[], selected: boolean) => {
|
||||||
const edgeIds = edges.map((e) => e.id)
|
const edgeIds = edges.map((n) => n.id)
|
||||||
|
|
||||||
|
let changedNodes: NodeChange[] = []
|
||||||
let changedEdges: EdgeChange[]
|
let changedEdges: EdgeChange[]
|
||||||
if (state.multiSelectionActive) changedEdges = edgeIds.map((edgeId) => createSelectionChange(edgeId, selected))
|
if (state.multiSelectionActive) changedEdges = edgeIds.map((edgeId) => createSelectionChange(edgeId, selected))
|
||||||
else changedEdges = getSelectionChanges(state.edges, edgeIds)
|
else {
|
||||||
|
const selectionChanges = getSelectionChanges([...state.nodes, ...state.edges], edgeIds)
|
||||||
|
changedNodes = selectionChanges.changedNodes
|
||||||
|
changedEdges = selectionChanges.changedEdges
|
||||||
|
}
|
||||||
|
|
||||||
|
if (changedNodes.length) state.hooks.nodesChange.trigger(changedNodes)
|
||||||
|
if (changedEdges.length) state.hooks.edgesChange.trigger(changedEdges)
|
||||||
|
}
|
||||||
|
|
||||||
|
const elementSelectionHandler = (elements: Elements, selected: boolean) => {
|
||||||
|
const nodes = elements.filter(isGraphNode)
|
||||||
|
const edges = elements.filter(isGraphEdge)
|
||||||
|
|
||||||
|
const nodeIds = nodes.map((n) => n.id)
|
||||||
|
const edgeIds = edges.map((e) => e.id)
|
||||||
|
|
||||||
|
let { changedNodes, changedEdges } = getSelectionChanges([...state.nodes, ...state.edges], [...nodeIds, ...edgeIds])
|
||||||
|
|
||||||
|
if (state.multiSelectionActive) changedNodes = nodeIds.map((nodeId) => createSelectionChange(nodeId, selected))
|
||||||
|
if (state.multiSelectionActive) changedEdges = edgeIds.map((edgeId) => createSelectionChange(edgeId, selected))
|
||||||
|
|
||||||
|
if (changedNodes.length) state.hooks.nodesChange.trigger(changedNodes)
|
||||||
if (changedEdges.length) state.hooks.edgesChange.trigger(changedEdges)
|
if (changedEdges.length) state.hooks.edgesChange.trigger(changedEdges)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,8 +195,7 @@ export default (state: State, getters: ComputedGetters): Actions => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const addSelectedElements: Actions['addSelectedElements'] = (elements) => {
|
const addSelectedElements: Actions['addSelectedElements'] = (elements) => {
|
||||||
addSelectedNodes(elements.filter(isGraphNode))
|
elementSelectionHandler(elements, true)
|
||||||
addSelectedEdges(elements.filter(isGraphEdge))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const removeSelectedNodes: Actions['removeSelectedNodes'] = (nodes) => {
|
const removeSelectedNodes: Actions['removeSelectedNodes'] = (nodes) => {
|
||||||
@@ -179,7 +209,7 @@ export default (state: State, getters: ComputedGetters): Actions => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const removeSelectedEdges: Actions['removeSelectedEdges'] = (edges) => {
|
const removeSelectedEdges: Actions['removeSelectedEdges'] = (edges) => {
|
||||||
if (!edges.length) edgeSelectionHandler(edges, false)
|
if (!edges.length) return edgeSelectionHandler(edges, false)
|
||||||
|
|
||||||
const edgeIds = edges.map((e) => e.id)
|
const edgeIds = edges.map((e) => e.id)
|
||||||
|
|
||||||
@@ -189,13 +219,21 @@ export default (state: State, getters: ComputedGetters): Actions => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const removeSelectedElements: Actions['removeSelectedElements'] = (elements) => {
|
const removeSelectedElements: Actions['removeSelectedElements'] = (elements) => {
|
||||||
if (!elements) {
|
if (!elements || !elements.length) return elementSelectionHandler([], false)
|
||||||
removeSelectedNodes([])
|
|
||||||
removeSelectedEdges([])
|
const { changedNodes, changedEdges } = elements.reduce(
|
||||||
} else {
|
(acc, curr) => {
|
||||||
if (elements.nodes) removeSelectedNodes(elements.nodes.filter(isGraphNode))
|
const selectionChange = createSelectionChange(curr.id, false)
|
||||||
if (elements.edges) removeSelectedEdges(elements.edges.filter(isGraphEdge))
|
if (isGraphNode(curr)) acc.changedNodes.push(selectionChange)
|
||||||
}
|
else acc.changedEdges.push(selectionChange)
|
||||||
|
|
||||||
|
return acc
|
||||||
|
},
|
||||||
|
{ changedNodes: [] as NodeSelectionChange[], changedEdges: [] as EdgeSelectionChange[] },
|
||||||
|
)
|
||||||
|
|
||||||
|
if (changedNodes.length) state.hooks.nodesChange.trigger(changedNodes)
|
||||||
|
if (changedEdges.length) state.hooks.edgesChange.trigger(changedEdges)
|
||||||
}
|
}
|
||||||
|
|
||||||
const setMinZoom: Actions['setMinZoom'] = (minZoom: any) => {
|
const setMinZoom: Actions['setMinZoom'] = (minZoom: any) => {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { isGraphEdge, isGraphNode } from './graph'
|
import { isGraphNode } from './graph'
|
||||||
import type {
|
import type {
|
||||||
Edge,
|
Edge,
|
||||||
EdgeAddChange,
|
EdgeAddChange,
|
||||||
@@ -89,9 +89,10 @@ export const applyChanges = <
|
|||||||
|
|
||||||
const i = elementIds.indexOf((<any>change).id)
|
const i = elementIds.indexOf((<any>change).id)
|
||||||
const el = elements[i]
|
const el = elements[i]
|
||||||
|
|
||||||
switch (change.type) {
|
switch (change.type) {
|
||||||
case 'select':
|
case 'select':
|
||||||
if (isGraphNode(el) || isGraphEdge(el)) el.selected = change.selected
|
;(el as FlowElement).selected = change.selected
|
||||||
break
|
break
|
||||||
case 'position':
|
case 'position':
|
||||||
if (isGraphNode(el)) {
|
if (isGraphNode(el)) {
|
||||||
@@ -159,18 +160,20 @@ export const createRemoveChange = (id: string): NodeRemoveChange | EdgeRemoveCha
|
|||||||
type: 'remove',
|
type: 'remove',
|
||||||
})
|
})
|
||||||
|
|
||||||
export const getSelectionChanges = (items: FlowElements, selectedIds: string[]) => {
|
export const getSelectionChanges = (elements: FlowElements, selectedIds: string[]) => {
|
||||||
return items.reduce((res, item) => {
|
return elements.reduce(
|
||||||
const willBeSelected = selectedIds.includes(item.id)
|
(res, item) => {
|
||||||
|
const willBeSelected = selectedIds.includes(item.id)
|
||||||
|
const key = isGraphNode(item) ? 'changedNodes' : 'changedEdges'
|
||||||
|
|
||||||
if (!item.selected && willBeSelected) {
|
if (!item.selected && willBeSelected) {
|
||||||
item.selected = true
|
res[key].push(createSelectionChange(item.id, true))
|
||||||
res.push(createSelectionChange(item.id, true))
|
} else if (item.selected && !willBeSelected) {
|
||||||
} else if (item.selected && !willBeSelected) {
|
res[key].push(createSelectionChange(item.id, false))
|
||||||
item.selected = false
|
}
|
||||||
res.push(createSelectionChange(item.id, false))
|
|
||||||
}
|
|
||||||
|
|
||||||
return res
|
return res
|
||||||
}, [] as (NodeSelectionChange | EdgeSelectionChange)[])
|
},
|
||||||
|
{ changedNodes: [], changedEdges: [] } as { changedNodes: NodeSelectionChange[]; changedEdges: EdgeSelectionChange[] },
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user