@@ -13,7 +13,11 @@ interface UseCanvasContextMenuProps {
1313
1414/**
1515 * Hook for managing workflow canvas context menus.
16- * Handles right-click events, menu state, click-outside detection, and block info extraction.
16+ *
17+ * Handles right-click events on nodes, pane, and selections with proper multi-select behavior.
18+ *
19+ * @param props - Hook configuration
20+ * @returns Context menu state and handlers
1721 */
1822export function useCanvasContextMenu ( { blocks, getNodes, setNodes } : UseCanvasContextMenuProps ) {
1923 const [ activeMenu , setActiveMenu ] = useState < MenuType > ( null )
@@ -46,19 +50,29 @@ export function useCanvasContextMenu({ blocks, getNodes, setNodes }: UseCanvasCo
4650 event . stopPropagation ( )
4751
4852 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-
56- const selectedNodes = getNodes ( ) . filter ( ( n ) => n . selected )
57- const nodesToUse = isMultiSelect
58- ? selectedNodes . some ( ( n ) => n . id === node . id )
59- ? selectedNodes
60- : [ ...selectedNodes , node ]
61- : [ node ]
53+ const currentSelectedNodes = getNodes ( ) . filter ( ( n ) => n . selected )
54+ const isClickedNodeSelected = currentSelectedNodes . some ( ( n ) => n . id === node . id )
55+
56+ let nodesToUse : Node [ ]
57+ if ( isClickedNodeSelected ) {
58+ nodesToUse = currentSelectedNodes
59+ } else if ( isMultiSelect ) {
60+ nodesToUse = [ ...currentSelectedNodes , node ]
61+ setNodes ( ( nodes ) =>
62+ nodes . map ( ( n ) => ( {
63+ ...n ,
64+ selected : n . id === node . id ? true : n . selected ,
65+ } ) )
66+ )
67+ } else {
68+ nodesToUse = [ node ]
69+ setNodes ( ( nodes ) =>
70+ nodes . map ( ( n ) => ( {
71+ ...n ,
72+ selected : n . id === node . id ,
73+ } ) )
74+ )
75+ }
6276
6377 setPosition ( { x : event . clientX , y : event . clientY } )
6478 setSelectedBlocks ( nodesToBlockInfos ( nodesToUse ) )
0 commit comments