Skip to content

Commit dec523c

Browse files
committed
fix selection
1 parent b300192 commit dec523c

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-canvas-context-menu.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ type MenuType = 'block' | 'pane' | null
88
interface UseCanvasContextMenuProps {
99
blocks: Record<string, BlockState>
1010
getNodes: () => Node[]
11+
setNodes: (updater: (nodes: Node[]) => Node[]) => void
1112
}
1213

1314
/**
1415
* Hook for managing workflow canvas context menus.
1516
* Handles right-click events, menu state, click-outside detection, and block info extraction.
1617
*/
17-
export function useCanvasContextMenu({ blocks, getNodes }: UseCanvasContextMenuProps) {
18+
export function useCanvasContextMenu({ blocks, getNodes, setNodes }: UseCanvasContextMenuProps) {
1819
const [activeMenu, setActiveMenu] = useState<MenuType>(null)
1920
const [position, setPosition] = useState({ x: 0, y: 0 })
2021
const [selectedBlocks, setSelectedBlocks] = useState<BlockInfo[]>([])
@@ -44,14 +45,26 @@ export function useCanvasContextMenu({ blocks, getNodes }: UseCanvasContextMenuP
4445
event.preventDefault()
4546
event.stopPropagation()
4647

48+
const isMultiSelect = event.shiftKey || event.metaKey || event.ctrlKey
49+
setNodes((nodes) =>
50+
nodes.map((n) => ({
51+
...n,
52+
selected: isMultiSelect ? (n.id === node.id ? true : n.selected) : n.id === node.id,
53+
}))
54+
)
55+
4756
const selectedNodes = getNodes().filter((n) => n.selected)
48-
const nodesToUse = selectedNodes.some((n) => n.id === node.id) ? selectedNodes : [node]
57+
const nodesToUse = isMultiSelect
58+
? selectedNodes.some((n) => n.id === node.id)
59+
? selectedNodes
60+
: [...selectedNodes, node]
61+
: [node]
4962

5063
setPosition({ x: event.clientX, y: event.clientY })
5164
setSelectedBlocks(nodesToBlockInfos(nodesToUse))
5265
setActiveMenu('block')
5366
},
54-
[getNodes, nodesToBlockInfos]
67+
[getNodes, nodesToBlockInfos, setNodes]
5568
)
5669

5770
const handlePaneContextMenu = useCallback((event: React.MouseEvent) => {

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ const WorkflowContent = React.memo(() => {
234234
const [potentialParentId, setPotentialParentId] = useState<string | null>(null)
235235
const [selectedEdges, setSelectedEdges] = useState<SelectedEdgesMap>(new Map())
236236
const [isErrorConnectionDrag, setIsErrorConnectionDrag] = useState(false)
237+
const selectedIdsRef = useRef<string[] | null>(null)
237238
const canvasMode = useCanvasModeStore((state) => state.mode)
238239
const isHandMode = canvasMode === 'hand'
239240
const { handleCanvasMouseDown, selectionProps } = useShiftSelectionLock({ isHandMode })
@@ -864,7 +865,7 @@ const WorkflowContent = React.memo(() => {
864865
handlePaneContextMenu,
865866
handleSelectionContextMenu,
866867
closeMenu: closeContextMenu,
867-
} = useCanvasContextMenu({ blocks, getNodes })
868+
} = useCanvasContextMenu({ blocks, getNodes, setNodes })
868869

869870
const handleContextCopy = useCallback(() => {
870871
const blockIds = contextMenuBlocks.map((b) => b.id)
@@ -2153,11 +2154,22 @@ const WorkflowContent = React.memo(() => {
21532154
/** Handles node changes - applies changes and resolves parent-child selection conflicts. */
21542155
const onNodesChange = useCallback(
21552156
(changes: NodeChange[]) => {
2157+
selectedIdsRef.current = null
21562158
setDisplayNodes((nds) => {
21572159
const updated = applyNodeChanges(changes, nds)
21582160
const hasSelectionChange = changes.some((c) => c.type === 'select')
2159-
return hasSelectionChange ? resolveParentChildSelectionConflicts(updated, blocks) : updated
2161+
if (!hasSelectionChange) return updated
2162+
const resolved = resolveParentChildSelectionConflicts(updated, blocks)
2163+
selectedIdsRef.current = resolved.filter((node) => node.selected).map((node) => node.id)
2164+
return resolved
21602165
})
2166+
const selectedIds = selectedIdsRef.current as string[] | null
2167+
if (selectedIds !== null) {
2168+
const { currentBlockId, clearCurrentBlock } = usePanelEditorStore.getState()
2169+
if (currentBlockId && selectedIds.indexOf(currentBlockId) === -1) {
2170+
clearCurrentBlock()
2171+
}
2172+
}
21612173
},
21622174
[blocks]
21632175
)

0 commit comments

Comments
 (0)