From 395e6ed59146ac63de2967de4b1519851afd8359 Mon Sep 17 00:00:00 2001 From: waleed Date: Sat, 31 Jan 2026 20:29:14 -0800 Subject: [PATCH] fix(lock): fix toggle locked target state and draggable check 1. BATCH_TOGGLE_LOCKED now uses first block from blocksToToggle set instead of blockIds[0], matching BATCH_TOGGLE_ENABLED pattern. Also added early exit if blocksToToggle is empty. 2. Blocks inside locked containers are now properly non-draggable. Changed draggable check from !block.locked to use isBlockProtected() which checks both block lock and parent container lock. Co-Authored-By: Claude Opus 4.5 --- .../app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx | 4 ++-- apps/sim/socket/database/operations.ts | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx index 6240e0ac7..07bb0c143 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx @@ -2156,7 +2156,7 @@ const WorkflowContent = React.memo(() => { parentId: block.data?.parentId, extent: block.data?.extent || undefined, dragHandle: '.workflow-drag-handle', - draggable: !block.locked, + draggable: !isBlockProtected(block.id, blocks), data: { ...block.data, name: block.name, @@ -2192,7 +2192,7 @@ const WorkflowContent = React.memo(() => { position, parentId: block.data?.parentId, dragHandle, - draggable: !block.locked, + draggable: !isBlockProtected(block.id, blocks), extent: (() => { // Clamp children to subflow body (exclude header) const parentId = block.data?.parentId as string | undefined diff --git a/apps/sim/socket/database/operations.ts b/apps/sim/socket/database/operations.ts index b2491f1e4..2aae11de3 100644 --- a/apps/sim/socket/database/operations.ts +++ b/apps/sim/socket/database/operations.ts @@ -870,8 +870,10 @@ async function handleBlocksOperationTx( } } - // Determine target locked state based on first block - const firstBlock = blocksById[blockIds[0]] + // Determine target locked state based on first toggleable block + if (blocksToToggle.size === 0) break + const firstToggleableId = Array.from(blocksToToggle)[0] + const firstBlock = blocksById[firstToggleableId] if (!firstBlock) break const targetLocked = !firstBlock.locked