fix(core): elements not correctly unselected

This commit is contained in:
braks
2022-10-14 21:13:39 +02:00
committed by Braks
parent 8583e13db9
commit 583efe6c68
3 changed files with 70 additions and 31 deletions
@@ -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
+51 -13
View File
@@ -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) => {
+17 -14
View File
@@ -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[] },
)
} }