11import { memo , useMemo , useRef } from 'react'
22import { RepeatIcon , SplitIcon } from 'lucide-react'
33import { Handle , type NodeProps , Position , useReactFlow } from 'reactflow'
4- import { Button , Trash } from '@/components/emcn'
54import { cn } from '@/lib/core/utils/cn'
65import { HANDLE_POSITIONS } from '@/lib/workflows/blocks/block-dimensions'
76import { type DiffStatus , hasDiffStatus } from '@/lib/workflows/diff/types'
7+ import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider'
8+ import { ActionBar } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/action-bar/action-bar'
89import { useCurrentWorkflow } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks'
9- import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
1010import { usePanelEditorStore } from '@/stores/panel'
1111
1212/**
@@ -18,11 +18,16 @@ import { usePanelEditorStore } from '@/stores/panel'
1818const SubflowNodeStyles : React . FC = ( ) => {
1919 return (
2020 < style jsx global > { `
21- /* Z-index management for subflow nodes */
21+ /* Z-index management for subflow nodes - default behind blocks */
2222 .workflow-container .react-flow__node-subflowNode {
2323 z-index: -1 !important;
2424 }
2525
26+ /* Selected subflows appear above other subflows but below blocks (z-21) */
27+ .workflow-container .react-flow__node-subflowNode:has([data-subflow-selected='true']) {
28+ z-index: 10 !important;
29+ }
30+
2631 /* Drag-over states */
2732 .loop-node-drag-over,
2833 .parallel-node-drag-over {
@@ -63,8 +68,8 @@ export interface SubflowNodeData {
6368 */
6469export const SubflowNodeComponent = memo ( ( { data, id } : NodeProps < SubflowNodeData > ) => {
6570 const { getNodes } = useReactFlow ( )
66- const { collaborativeBatchRemoveBlocks } = useCollaborativeWorkflow ( )
6771 const blockRef = useRef < HTMLDivElement > ( null )
72+ const userPermissions = useUserPermissionsContext ( )
6873
6974 const currentWorkflow = useCurrentWorkflow ( )
7075 const currentBlock = currentWorkflow . getBlockById ( id )
@@ -80,6 +85,8 @@ export const SubflowNodeComponent = memo(({ data, id }: NodeProps<SubflowNodeDat
8085 const currentBlockId = usePanelEditorStore ( ( state ) => state . currentBlockId )
8186 const isFocused = currentBlockId === id
8287
88+ const isPreviewSelected = data ?. isPreviewSelected || false
89+
8390 /**
8491 * Calculate the nesting level of this subflow node based on its parent hierarchy.
8592 * Used to apply appropriate styling for nested containers.
@@ -125,8 +132,6 @@ export const SubflowNodeComponent = memo(({ data, id }: NodeProps<SubflowNodeDat
125132 return { top : `${ HANDLE_POSITIONS . DEFAULT_Y_OFFSET } px` , transform : 'translateY(-50%)' }
126133 }
127134
128- const isPreviewSelected = data ?. isPreviewSelected || false
129-
130135 /**
131136 * Determine the ring styling based on subflow state priority:
132137 * 1. Focused (selected in editor) or preview selected - blue ring
@@ -162,7 +167,12 @@ export const SubflowNodeComponent = memo(({ data, id }: NodeProps<SubflowNodeDat
162167 data-node-id = { id }
163168 data-type = 'subflowNode'
164169 data-nesting-level = { nestingLevel }
170+ data-subflow-selected = { isFocused || isPreviewSelected }
165171 >
172+ { ! isPreview && (
173+ < ActionBar blockId = { id } blockType = { data . kind } disabled = { ! userPermissions . canEdit } />
174+ ) }
175+
166176 { /* Header Section */ }
167177 < div
168178 className = { cn (
@@ -180,18 +190,6 @@ export const SubflowNodeComponent = memo(({ data, id }: NodeProps<SubflowNodeDat
180190 { blockName }
181191 </ span >
182192 </ div >
183- { ! isPreview && (
184- < Button
185- variant = 'ghost'
186- onClick = { ( e ) => {
187- e . stopPropagation ( )
188- collaborativeBatchRemoveBlocks ( [ id ] )
189- } }
190- className = 'h-[14px] w-[14px] p-0 opacity-0 transition-opacity duration-100 group-hover:opacity-100'
191- >
192- < Trash className = 'h-[14px] w-[14px]' />
193- </ Button >
194- ) }
195193 </ div >
196194
197195 { ! isPreview && (
0 commit comments