diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/action-bar/action-bar.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/action-bar/action-bar.tsx
index a0e17dc16..7c044c5a4 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/action-bar/action-bar.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/action-bar/action-bar.tsx
@@ -200,18 +200,18 @@ export const ActionBar = memo(
variant='ghost'
onClick={(e) => {
e.stopPropagation()
- if (!disabled && !isLocked) {
+ if (!disabled && !isLocked && !isParentLocked) {
collaborativeBatchToggleBlockEnabled([blockId])
}
}}
className={ACTION_BUTTON_STYLES}
- disabled={disabled || isLocked}
+ disabled={disabled || isLocked || isParentLocked}
>
{isEnabled ? : }
- {isLocked
+ {isLocked || isParentLocked
? 'Block is locked'
: getTooltipMessage(isEnabled ? 'Disable Block' : 'Enable Block')}
@@ -274,12 +274,12 @@ export const ActionBar = memo(
variant='ghost'
onClick={(e) => {
e.stopPropagation()
- if (!disabled && !isLocked) {
+ if (!disabled && !isLocked && !isParentLocked) {
collaborativeBatchToggleBlockHandles([blockId])
}
}}
className={ACTION_BUTTON_STYLES}
- disabled={disabled || isLocked}
+ disabled={disabled || isLocked || isParentLocked}
>
{horizontalHandles ? (
@@ -289,7 +289,7 @@ export const ActionBar = memo(
- {isLocked
+ {isLocked || isParentLocked
? 'Block is locked'
: getTooltipMessage(horizontalHandles ? 'Vertical Ports' : 'Horizontal Ports')}
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/block-menu/block-menu.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/block-menu/block-menu.tsx
index 65c0a65d2..e8c5861b8 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/block-menu/block-menu.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/block-menu/block-menu.tsx
@@ -21,6 +21,7 @@ export interface BlockInfo {
parentId?: string
parentType?: string
locked?: boolean
+ isParentLocked?: boolean
}
/**
@@ -98,6 +99,8 @@ export function BlockMenu({
const allDisabled = selectedBlocks.every((b) => !b.enabled)
const allLocked = selectedBlocks.every((b) => b.locked)
const allUnlocked = selectedBlocks.every((b) => !b.locked)
+ // Can't unlock blocks that have locked parents
+ const hasBlockWithLockedParent = selectedBlocks.some((b) => b.locked && b.isParentLocked)
const hasSingletonBlock = selectedBlocks.some(
(b) =>
@@ -216,12 +219,15 @@ export function BlockMenu({
)}
{canAdmin && onToggleLocked && (
{
- onToggleLocked()
- onClose()
+ if (!hasBlockWithLockedParent) {
+ onToggleLocked()
+ onClose()
+ }
}}
>
- {getToggleLockedLabel()}
+ {hasBlockWithLockedParent ? 'Parent is locked' : getToggleLockedLabel()}
)}
diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-canvas-context-menu.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-canvas-context-menu.ts
index 334e473f8..c95e97563 100644
--- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-canvas-context-menu.ts
+++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-canvas-context-menu.ts
@@ -31,7 +31,8 @@ export function useCanvasContextMenu({ blocks, getNodes, setNodes }: UseCanvasCo
nodes.map((n) => {
const block = blocks[n.id]
const parentId = block?.data?.parentId
- const parentType = parentId ? blocks[parentId]?.type : undefined
+ const parentBlock = parentId ? blocks[parentId] : undefined
+ const parentType = parentBlock?.type
return {
id: n.id,
type: block?.type || '',
@@ -40,6 +41,7 @@ export function useCanvasContextMenu({ blocks, getNodes, setNodes }: UseCanvasCo
parentId,
parentType,
locked: block?.locked ?? false,
+ isParentLocked: parentBlock?.locked ?? false,
}
}),
[blocks]