diff --git a/frontend/src/lib/components/flows/map/FlowStickyNode.svelte b/frontend/src/lib/components/flows/map/FlowStickyNode.svelte index f575e977c4..f0c541c3c6 100644 --- a/frontend/src/lib/components/flows/map/FlowStickyNode.svelte +++ b/frontend/src/lib/components/flows/map/FlowStickyNode.svelte @@ -98,7 +98,7 @@ selected={noteMode} > {#snippet text()} - {noteMode ? 'Exit note mode' : 'Add notes'} + {noteMode ? 'Exit note mode' : 'Add sticky notes'} {/snippet} diff --git a/frontend/src/lib/components/flows/map/MapItem.svelte b/frontend/src/lib/components/flows/map/MapItem.svelte index e04c7f069b..f893c43112 100644 --- a/frontend/src/lib/components/flows/map/MapItem.svelte +++ b/frontend/src/lib/components/flows/map/MapItem.svelte @@ -102,6 +102,13 @@ let parentLoop = $derived( flowStore?.val && mod ? checkIfParentLoop(flowStore.val, mod.id) : undefined ) + + function handlePointerDown(e: CustomEvent) { + // Only handle left clicks (button 0) + if (e.detail.button === 0) { + onSelect(mod.id) + } + } {#if mod} @@ -164,7 +171,7 @@ on:changeId on:move on:delete - on:pointerdown={() => onSelect(mod.id)} + on:pointerdown={handlePointerDown} onUpdateMock={(mock) => { mod.mock = mock onUpdateMock?.({ id: mod.id, mock }) @@ -193,7 +200,7 @@ on:changeId on:delete on:move - on:pointerdown={() => onSelect(mod.id)} + on:pointerdown={handlePointerDown} {...itemProps} id={mod.id} label={mod.summary || 'Run one branch'} @@ -213,7 +220,7 @@ on:changeId on:delete on:move - on:pointerdown={() => onSelect(mod.id)} + on:pointerdown={handlePointerDown} id={mod.id} {...itemProps} label={mod.summary || `Run all branches${mod.value.parallel ? ' (parallel)' : ''}`} @@ -231,7 +238,7 @@ {moduleAction} {onShowModuleDiff} on:changeId - on:pointerdown={() => onSelect(mod.id)} + on:pointerdown={handlePointerDown} on:delete on:move onUpdateMock={(mock) => { diff --git a/frontend/src/lib/components/graph/FlowGraphV2.svelte b/frontend/src/lib/components/graph/FlowGraphV2.svelte index 16b5fe73ce..71616f373e 100644 --- a/frontend/src/lib/components/graph/FlowGraphV2.svelte +++ b/frontend/src/lib/components/graph/FlowGraphV2.svelte @@ -36,10 +36,10 @@ import BaseEdge from './renderers/edges/BaseEdge.svelte' import EmptyEdge from './renderers/edges/EmptyEdge.svelte' import { sugiyama, dagStratify, coordCenter, decrossTwoLayer, decrossOpt } from 'd3-dag' - import { Expand, MousePointer } from 'lucide-svelte' + import { Expand, MousePointer, Hand } from 'lucide-svelte' import Toggle from '../Toggle.svelte' import DataflowEdge from './renderers/edges/DataflowEdge.svelte' - import { encodeState, readFieldsRecursively } from '$lib/utils' + import { encodeState, readFieldsRecursively, getModifierKey } from '$lib/utils' import BranchOneStart from './renderers/nodes/BranchOneStart.svelte' import NoBranchNode from './renderers/nodes/NoBranchNode.svelte' import HiddenBaseEdge from './renderers/edges/HiddenBaseEdge.svelte' @@ -74,6 +74,7 @@ import type { AIModuleAction } from '../copilot/chat/flow/core' import { setGraphContext } from './graphContext' import { buildNodeSpacingMap, getNoteStateSignature } from './groupNoteUtils' + import { Tooltip } from '../meltComponents' let useDataflow: Writable = writable(false) let showAssets: Writable = writable(true) @@ -481,6 +482,9 @@ function handleKeyDown(event: KeyboardEvent) { selectionManager.handleKeyDown(event, nodes) noteManager.handleKeyDown(event) + if (noteMode) { + exitNoteMode?.() + } } async function updateStores() { @@ -821,18 +825,39 @@ {#if multiSelectEnabled}
- { - selectionManager.mode = - selectionManager.mode === 'normal' ? 'rect-select' : 'normal' - }} - title="Toggle rectangle selection" - class={selectionManager.mode === 'rect-select' - ? 'text-accent !bg-surface-selected' - : ''} - > - - + + { + selectionManager.mode = + selectionManager.mode === 'normal' ? 'rect-select' : 'normal' + }} + > + {#if selectionManager.mode === 'rect-select'} + + {:else} + + {/if} + + {#snippet text()} +
+
+ + Grab: Click and drag to pan. Hold + {getModifierKey()} to box select. +
+
+ + Select Click and drag to box + select. Hold + {getModifierKey()} to pan. +
+
+ {/snippet} +
{/if} {#if download} diff --git a/frontend/src/lib/components/graph/groupNoteUtils.ts b/frontend/src/lib/components/graph/groupNoteUtils.ts index 20502e3095..60de54137a 100644 --- a/frontend/src/lib/components/graph/groupNoteUtils.ts +++ b/frontend/src/lib/components/graph/groupNoteUtils.ts @@ -2,6 +2,8 @@ import type { Node } from '@xyflow/svelte' import { NODE } from './util' import type { FlowNote } from '../../gen' import type { NoteManager } from './noteManager.svelte' +import type { NoteEditorContext } from './noteEditor.svelte' +import { StickyNote } from 'lucide-svelte' type NodeDep = { id: string; parentIds?: string[]; offset?: number } @@ -250,3 +252,20 @@ export function calculateAllNoteZIndexes( return zIndexMap } + +export function addGroupNoteContextMenuItem( + nodeId: string, + noteEditorContext: NoteEditorContext | undefined +) { + return { + id: 'add-group-note', + label: 'Add group note', + icon: StickyNote, + disabled: !noteEditorContext?.noteEditor, + onClick: () => { + if (noteEditorContext?.noteEditor) { + noteEditorContext.noteEditor.createGroupNote([nodeId], 'Group Note') + } + } + } +} diff --git a/frontend/src/lib/components/graph/renderers/nodes/ModuleNode.svelte b/frontend/src/lib/components/graph/renderers/nodes/ModuleNode.svelte index baa95c17f9..30872d5fad 100644 --- a/frontend/src/lib/components/graph/renderers/nodes/ModuleNode.svelte +++ b/frontend/src/lib/components/graph/renderers/nodes/ModuleNode.svelte @@ -1,11 +1,12 @@