Skip to content

Commit 5f1e00f

Browse files
committed
Merge branch 'master' into release/2.0.0
2 parents 34ecbed + c24ba07 commit 5f1e00f

File tree

16 files changed

+124
-39
lines changed

16 files changed

+124
-39
lines changed

Diff for: CHANGELOG.md

+33
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,39 @@
22

33
All notable changes to this project will be documented in this file.
44

5+
## [1.42.4] - 2025-03-17
6+
7+
[e9168d3](e9168d30841ec0cdb15c4034a3fe89f26657b5dc)...[f49e509](f49e50996f4d9e294b45b0125e45231acc45b3be)
8+
9+
### Bug Fixes
10+
11+
- Use null as fallback id for edge source handle (#1794) ([c9fd24d](c9fd24dc827358db2cdebff95c1b18dcd155f979))
12+
- Reset drag items on drag end (#1798) ([b85b0ec](b85b0ec66fce9500f74795f5eef6aa40ce1beac1))
13+
- Remove edge lookup update when updating connection lookup ([05e4df2](05e4df2cb62a12cdcbe866a0007b622941d4af92))
14+
15+
## [1.42.3] - 2025-03-13
16+
17+
[d3b0eb9](d3b0eb91357fa1630f75e359f48cc9a60c83845f)...[e9168d3](e9168d30841ec0cdb15c4034a3fe89f26657b5dc)
18+
19+
### Bug Fixes
20+
21+
- Unwrap ref when checking if connection in progress (#1789) ([410a59d](410a59df5b355df17a4a66726ab6dd1a8ef0246c))
22+
23+
## [1.42.2] - 2025-03-09
24+
25+
[d7f5506](d7f5506882b4438ee04f8f08217547f38379366e)...[d3b0eb9](d3b0eb91357fa1630f75e359f48cc9a60c83845f)
26+
27+
### Bug Fixes
28+
29+
- Bind attrs to minimap node (#1754) ([acdd1ad](acdd1ad8b0ef8b5cfa501f3e0425712b37e89c65))
30+
- Prevent pane click event when connection is in progress (#1776) ([49b2780](49b27807401ef1f54a37c8b5d16df4517dcba6df))
31+
- Avoid removing handle bounds on handle unmount (#1781) ([dd9c92f](dd9c92ff81af28cb2474da4f56825d43daa8a930))
32+
- Set default value for isVisible to undefined (#1785) ([2ba98ef](2ba98efef018325a0086e82065dd44279ff1e25c))
33+
34+
### Miscellaneous Tasks
35+
36+
- Cleanup ([67b652e](67b652e159b7866eb2edb75d1324614ff7ca5702))
37+
538
## [1.42.1] - 2025-01-16
639

740
[5a5b2c1](5a5b2c15d76ac6173e616b947e227f6974bfe444)...[d7f5506](d7f5506882b4438ee04f8f08217547f38379366e)

Diff for: packages/core/CHANGELOG.md

+30
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,35 @@
11
# @vue-flow/core
22

3+
## 1.42.5
4+
5+
### Patch Changes
6+
7+
- [#1807](https://github.com/bcakmakoglu/vue-flow/pull/1807) [`60482cf`](https://github.com/bcakmakoglu/vue-flow/commit/60482cf983d9f674070a48bdfd0624fe6e28a110) Thanks [@bcakmakoglu](https://github.com/bcakmakoglu)! - Prevent keypress events from being swallowed when a button element is focused.
8+
9+
## 1.42.4
10+
11+
### Patch Changes
12+
13+
- [#1794](https://github.com/bcakmakoglu/vue-flow/pull/1794) [`e0bb46e`](https://github.com/bcakmakoglu/vue-flow/commit/e0bb46e9ee6c67737e40d154bbd8eae5cdde0cce) Thanks [@bcakmakoglu](https://github.com/bcakmakoglu)! - Use null as fallback id for edge source handle
14+
15+
- [#1796](https://github.com/bcakmakoglu/vue-flow/pull/1796) [`978b896`](https://github.com/bcakmakoglu/vue-flow/commit/978b8966468737897b6b63fd1ff38d2eee7772d9) Thanks [@bcakmakoglu](https://github.com/bcakmakoglu)! - Remove edgelookup update when updating connection lookup as edge lookup is computed already
16+
17+
- [#1796](https://github.com/bcakmakoglu/vue-flow/pull/1796) [`a6a3000`](https://github.com/bcakmakoglu/vue-flow/commit/a6a30008ead042f01b3dd7e82cc015cbfd4f65a2) Thanks [@bcakmakoglu](https://github.com/bcakmakoglu)! - Reset drag items on drag end
18+
19+
## 1.42.3
20+
21+
### Patch Changes
22+
23+
- [#1789](https://github.com/bcakmakoglu/vue-flow/pull/1789) [`f4fc254`](https://github.com/bcakmakoglu/vue-flow/commit/f4fc254f5bfb152fb217d9e6278b2737f29293a4) Thanks [@bcakmakoglu](https://github.com/bcakmakoglu)! - Unwrap ref when checking if connection in progress.
24+
25+
## 1.42.2
26+
27+
### Patch Changes
28+
29+
- [#1781](https://github.com/bcakmakoglu/vue-flow/pull/1781) [`a14d16d`](https://github.com/bcakmakoglu/vue-flow/commit/a14d16d9d0df1f24a18ce2c4f7ca42b7802cf640) Thanks [@bcakmakoglu](https://github.com/bcakmakoglu)! - Prevent removal of handle bounds when `<Handle>` is unmounted.
30+
31+
- [#1776](https://github.com/bcakmakoglu/vue-flow/pull/1776) [`41bed0c`](https://github.com/bcakmakoglu/vue-flow/commit/41bed0cb674cba1b3f22c5e4c4e9c1d0c03a5c61) Thanks [@bcakmakoglu](https://github.com/bcakmakoglu)! - Prevent pane click event when connection is in progress.
32+
333
## 1.42.1
434

535
### Patch Changes

Diff for: packages/core/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@vue-flow/core",
3-
"version": "1.42.1",
3+
"version": "1.42.5",
44
"private": false,
55
"license": "MIT",
66
"author": "Burak Cakmakoglu<[email protected]>",

Diff for: packages/core/src/components/Edges/EdgeWrapper.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ const EdgeWrapper = defineComponent({
313313
updating.value = true
314314

315315
nodeId.value = isSourceHandle ? edge.value.target : edge.value.source
316-
handleId.value = (isSourceHandle ? edge.value.targetHandle : edge.value.sourceHandle) ?? ''
316+
handleId.value = (isSourceHandle ? edge.value.targetHandle : edge.value.sourceHandle) ?? null
317317

318318
edgeUpdaterType.value = isSourceHandle ? 'target' : 'source'
319319

Diff for: packages/core/src/components/Handle/Handle.vue

+1-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts" setup>
2-
import { computed, onMounted, onUnmounted, ref, toRef } from 'vue'
2+
import { computed, onMounted, ref, toRef } from 'vue'
33
import type { HandleProps } from '../../types'
44
import { Position } from '../../types'
55
import { useHandle, useNode, useVueFlow } from '../../composables'
@@ -136,14 +136,6 @@ onMounted(() => {
136136
node.handleBounds[type.value] = [...(node.handleBounds[type.value] ?? []), nextBounds]
137137
})
138138
139-
onUnmounted(() => {
140-
// clean up node internals
141-
const handleBounds = node.handleBounds[type.value]
142-
if (handleBounds) {
143-
node.handleBounds[type.value] = handleBounds.filter((b) => b.id !== handleId)
144-
}
145-
})
146-
147139
function onPointerDown(event: MouseEvent | TouchEvent) {
148140
const isMouseTriggered = isMouseEvent(event)
149141

Diff for: packages/core/src/composables/useDrag.ts

+14-13
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
getEventPosition,
1313
handleNodeClick,
1414
hasSelector,
15-
isUseDragEvent,
1615
snapPosition,
1716
} from '../utils'
1817
import { useGetPointerPosition, useVueFlow } from '.'
@@ -226,8 +225,10 @@ export function useDrag(params: UseDragParams) {
226225
}
227226

228227
const eventEnd = (event: UseDragEvent) => {
229-
if (!isUseDragEvent(event) && !dragStarted && !dragging.value && !multiSelectionActive.value) {
230-
const evt = event as MouseTouchEvent
228+
let isClick = false
229+
230+
if (!dragStarted && !dragging.value && !multiSelectionActive.value) {
231+
const evt = event.sourceEvent as MouseTouchEvent
231232

232233
const pointerPos = getPointerPosition(evt)
233234

@@ -238,19 +239,11 @@ export function useDrag(params: UseDragParams) {
238239
// dispatch a click event if the node was attempted to be dragged but the threshold was not exceeded
239240
if (distance !== 0 && distance <= nodeDragThreshold.value) {
240241
onClick?.(evt)
242+
isClick = true
241243
}
242-
243-
return
244244
}
245245

246-
dragging.value = false
247-
autoPanStarted = false
248-
dragStarted = false
249-
lastPos = { x: undefined, y: undefined }
250-
251-
cancelAnimationFrame(autoPanId)
252-
253-
if (dragItems.length) {
246+
if (dragItems.length && !isClick) {
254247
updateNodePositions(dragItems, false, false)
255248

256249
const [currentNode, nodes] = getEventHandlerParams({
@@ -261,6 +254,14 @@ export function useDrag(params: UseDragParams) {
261254

262255
onStop({ event: event.sourceEvent, node: currentNode, nodes })
263256
}
257+
258+
dragItems = []
259+
dragging.value = false
260+
autoPanStarted = false
261+
dragStarted = false
262+
lastPos = { x: undefined, y: undefined }
263+
264+
cancelAnimationFrame(autoPanId)
264265
}
265266

266267
watch([() => toValue(disabled), el], ([isDisabled, nodeEl], _, onCleanup) => {

Diff for: packages/core/src/composables/useKeyPress.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ type PressedKeys = Set<string>
77
type KeyOrCode = 'key' | 'code'
88

99
export interface UseKeyPressOptions {
10-
actInsideInputWithModifier?: MaybeRefOrGetter<boolean>
1110
target?: MaybeRefOrGetter<EventTarget | null | undefined>
11+
actInsideInputWithModifier?: MaybeRefOrGetter<boolean>
12+
preventDefault?: MaybeRefOrGetter<boolean>
1213
}
1314

15+
const inputTags = ['INPUT', 'SELECT', 'TEXTAREA']
16+
1417
export function isInputDOMNode(event: KeyboardEvent): boolean {
1518
const target = (event.composedPath?.()?.[0] || event.target) as HTMLElement
1619

@@ -19,12 +22,12 @@ export function isInputDOMNode(event: KeyboardEvent): boolean {
1922
const closest = typeof target?.closest === 'function' ? target.closest('.nokey') : null
2023

2124
// when an input field is focused we don't want to trigger deletion or movement of nodes
22-
return ['INPUT', 'SELECT', 'TEXTAREA'].includes(target?.nodeName) || hasAttribute || !!closest
25+
return inputTags.includes(target?.nodeName) || hasAttribute || !!closest
2326
}
2427

2528
// we want to be able to do a multi selection event if we are in an input field
2629
function wasModifierPressed(event: KeyboardEvent) {
27-
return event.ctrlKey || event.metaKey || event.shiftKey
30+
return event.ctrlKey || event.metaKey || event.shiftKey || event.altKey
2831
}
2932

3033
function isKeyMatch(pressedKey: string, keyToMatch: string, pressedKeys: Set<string>, isKeyUp: boolean) {
@@ -88,6 +91,8 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter<KeyFilter | boolean | nu
8891

8992
const target = toRef(() => toValue(options?.target) ?? window)
9093

94+
const preventDefault = toRef(() => toValue(options?.preventDefault) ?? true)
95+
9196
const isPressed = ref(toValue(keyFilter) === true)
9297

9398
let modifierPressed = false
@@ -124,7 +129,12 @@ export function useKeyPress(keyFilter: MaybeRefOrGetter<KeyFilter | boolean | nu
124129
return
125130
}
126131

127-
e.preventDefault()
132+
const target = (e.composedPath?.()?.[0] || e.target) as Element | null
133+
const isInteractiveElement = target?.nodeName === 'BUTTON' || target?.nodeName === 'A'
134+
135+
if (!preventDefault.value && (modifierPressed || !isInteractiveElement)) {
136+
e.preventDefault()
137+
}
128138

129139
isPressed.value = true
130140
},

Diff for: packages/core/src/container/Pane/Pane.vue

+4-1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const {
3232
nodeLookup,
3333
connectionLookup,
3434
defaultEdgeOptions,
35+
connectionStartHandle,
3536
} = useVueFlow()
3637
3738
const container = ref<HTMLDivElement | null>(null)
@@ -44,6 +45,8 @@ const containerBounds = ref<DOMRect>()
4445
4546
const hasActiveSelection = toRef(() => elementsSelectable.value && (isSelecting || userSelectionActive.value))
4647
48+
const connectionInProgress = toRef(() => connectionStartHandle.value !== null)
49+
4750
// Used to prevent click events when the user lets go of the selectionKey during a selection
4851
let selectionInProgress = false
4952
let selectionStarted = false
@@ -79,7 +82,7 @@ function wrapHandler(handler: Function, containerRef: HTMLDivElement | null) {
7982
}
8083
8184
function onClick(event: MouseEvent) {
82-
if (selectionInProgress) {
85+
if (selectionInProgress || connectionInProgress.value) {
8386
selectionInProgress = false
8487
return
8588
}

Diff for: packages/core/src/store/actions.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -509,7 +509,13 @@ export function useActions(state: State, nodeLookup: ComputedRef<NodeLookup>, ed
509509
}
510510

511511
const updateEdge: Actions['updateEdge'] = (oldEdge, newConnection, shouldReplaceId = true) => {
512-
const prevEdge = findEdge(oldEdge.id)!
512+
const prevEdge = findEdge(oldEdge.id)
513+
514+
if (!prevEdge) {
515+
return false
516+
}
517+
518+
const prevEdgeIndex = state.edges.indexOf(prevEdge)
513519

514520
const newEdge = updateEdgeAction(oldEdge, newConnection, prevEdge, shouldReplaceId, state.hooks.error.trigger)
515521

@@ -525,7 +531,7 @@ export function useActions(state: State, nodeLookup: ComputedRef<NodeLookup>, ed
525531
state.edges,
526532
)
527533

528-
state.edges.splice(state.edges.indexOf(prevEdge), 1, validEdge)
534+
state.edges = state.edges.map((edge, index) => (index === prevEdgeIndex ? validEdge : edge))
529535

530536
updateConnectionLookup(state.connectionLookup, edgeLookup.value, [validEdge])
531537

Diff for: packages/core/src/utils/store.ts

-3
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ function addConnectionToLookup(
165165

166166
export function updateConnectionLookup(connectionLookup: ConnectionLookup, edgeLookup: EdgeLookup, edges: GraphEdge[]) {
167167
connectionLookup.clear()
168-
edgeLookup.clear()
169168

170169
for (const edge of edges) {
171170
const { source: sourceNode, target: targetNode, sourceHandle = null, targetHandle = null } = edge
@@ -176,8 +175,6 @@ export function updateConnectionLookup(connectionLookup: ConnectionLookup, edgeL
176175

177176
addConnectionToLookup('source', connection, targetKey, connectionLookup, sourceNode, sourceHandle)
178177
addConnectionToLookup('target', connection, sourceKey, connectionLookup, targetNode, targetHandle)
179-
180-
edgeLookup.set(edge.id, edge)
181178
}
182179
}
183180

Diff for: packages/minimap/CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# @vue-flow/minimap
22

3+
## 1.5.3
4+
5+
### Patch Changes
6+
7+
- [#1809](https://github.com/bcakmakoglu/vue-flow/pull/1809) [`b60c526`](https://github.com/bcakmakoglu/vue-flow/commit/b60c526c7f577663329e1d40e461b599dfaf0bd8) Thanks [@bcakmakoglu](https://github.com/bcakmakoglu)! - Filter hidden nodes from minimap bounds
8+
39
## 1.5.2
410

511
### Patch Changes

Diff for: packages/minimap/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@vue-flow/minimap",
3-
"version": "1.5.2",
3+
"version": "1.5.3",
44
"private": false,
55
"license": "MIT",
66
"author": "Burak Cakmakoglu<[email protected]>",

Diff for: packages/minimap/src/MiniMap.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ const nodeClassNameFunc = computed<MiniMapNodeFunc>(() =>
6161
typeof nodeClassName === 'string' ? () => nodeClassName : typeof nodeClassName === 'function' ? nodeClassName : () => '',
6262
)
6363
64-
const bb = computed(() => getRectOfNodes(getNodesInitialized.value))
64+
const bb = computed(() => getRectOfNodes(getNodesInitialized.value.filter((node) => !node.hidden)))
6565
6666
const viewBB = computed(() => ({
6767
x: -viewport.value.x / viewport.value.zoom,

Diff for: packages/node-toolbar/CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# @vue-flow/node-toolbar
22

3+
## 1.1.1
4+
5+
### Patch Changes
6+
7+
- [#1785](https://github.com/bcakmakoglu/vue-flow/pull/1785) [`0179b98`](https://github.com/bcakmakoglu/vue-flow/commit/0179b982cc7a74d4aa99b4a5c1ba815e0cd4db28) Thanks [@bcakmakoglu](https://github.com/bcakmakoglu)! - Set default value for `isVisible` to `undefined`
8+
39
## 1.1.0
410

511
### Minor Changes

Diff for: packages/node-toolbar/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@vue-flow/node-toolbar",
3-
"version": "1.1.0",
3+
"version": "1.1.1",
44
"private": false,
55
"license": "MIT",
66
"author": "Burak Cakmakoglu<[email protected]>",

Diff for: packages/node-toolbar/src/NodeToolbar.vue

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts" setup>
2-
import { computed, inject, toRef } from 'vue'
2+
import { computed, inject } from 'vue'
33
import type { GraphNode, Rect, ViewportTransform } from '@vue-flow/core'
44
import { NodeIdInjection, Position, getRectOfNodes, useVueFlow } from '@vue-flow/core'
55
@@ -10,6 +10,7 @@ const props = withDefaults(defineProps<NodeToolbarProps>(), {
1010
position: Position.Top,
1111
offset: 10,
1212
align: 'center',
13+
isVisible: undefined,
1314
})
1415
1516
const contextNodeId = inject(NodeIdInjection, null)
@@ -30,7 +31,7 @@ const nodes = computed(() => {
3031
}, [] as GraphNode[])
3132
})
3233
33-
const isActive = toRef(() =>
34+
const isActive = computed(() =>
3435
typeof props.isVisible === 'boolean'
3536
? props.isVisible
3637
: nodes.value.length === 1 && nodes.value[0].selected && getSelectedNodes.value.length === 1,

0 commit comments

Comments
 (0)