mirror of
https://github.com/simstudioai/sim.git
synced 2026-02-01 02:05:18 -05:00
fix(enable): consistent behavior - can't enable if parent disabled
Same pattern as lock: must enable parent container first before enabling children inside it. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -85,25 +85,33 @@ export const ActionBar = memo(
|
||||
)
|
||||
}, [blockId, addNotification, collaborativeBatchAddBlocks, setPendingSelection])
|
||||
|
||||
const { isEnabled, horizontalHandles, parentId, parentType, isLocked, isParentLocked } =
|
||||
useWorkflowStore(
|
||||
useCallback(
|
||||
(state) => {
|
||||
const block = state.blocks[blockId]
|
||||
const parentId = block?.data?.parentId
|
||||
const parentBlock = parentId ? state.blocks[parentId] : undefined
|
||||
return {
|
||||
isEnabled: block?.enabled ?? true,
|
||||
horizontalHandles: block?.horizontalHandles ?? false,
|
||||
parentId,
|
||||
parentType: parentBlock?.type,
|
||||
isLocked: block?.locked ?? false,
|
||||
isParentLocked: parentBlock?.locked ?? false,
|
||||
}
|
||||
},
|
||||
[blockId]
|
||||
)
|
||||
const {
|
||||
isEnabled,
|
||||
horizontalHandles,
|
||||
parentId,
|
||||
parentType,
|
||||
isLocked,
|
||||
isParentLocked,
|
||||
isParentDisabled,
|
||||
} = useWorkflowStore(
|
||||
useCallback(
|
||||
(state) => {
|
||||
const block = state.blocks[blockId]
|
||||
const parentId = block?.data?.parentId
|
||||
const parentBlock = parentId ? state.blocks[parentId] : undefined
|
||||
return {
|
||||
isEnabled: block?.enabled ?? true,
|
||||
horizontalHandles: block?.horizontalHandles ?? false,
|
||||
parentId,
|
||||
parentType: parentBlock?.type,
|
||||
isLocked: block?.locked ?? false,
|
||||
isParentLocked: parentBlock?.locked ?? false,
|
||||
isParentDisabled: parentBlock ? !parentBlock.enabled : false,
|
||||
}
|
||||
},
|
||||
[blockId]
|
||||
)
|
||||
)
|
||||
|
||||
const { activeWorkflowId } = useWorkflowRegistry()
|
||||
const { isExecuting, getLastExecutionSnapshot } = useExecutionStore()
|
||||
@@ -200,12 +208,16 @@ export const ActionBar = memo(
|
||||
variant='ghost'
|
||||
onClick={(e) => {
|
||||
e.stopPropagation()
|
||||
if (!disabled && !isLocked && !isParentLocked) {
|
||||
// Can't enable if parent is disabled (must enable parent first)
|
||||
const cantEnable = !isEnabled && isParentDisabled
|
||||
if (!disabled && !isLocked && !isParentLocked && !cantEnable) {
|
||||
collaborativeBatchToggleBlockEnabled([blockId])
|
||||
}
|
||||
}}
|
||||
className={ACTION_BUTTON_STYLES}
|
||||
disabled={disabled || isLocked || isParentLocked}
|
||||
disabled={
|
||||
disabled || isLocked || isParentLocked || (!isEnabled && isParentDisabled)
|
||||
}
|
||||
>
|
||||
{isEnabled ? <Circle className={ICON_SIZE} /> : <CircleOff className={ICON_SIZE} />}
|
||||
</Button>
|
||||
@@ -213,7 +225,9 @@ export const ActionBar = memo(
|
||||
<Tooltip.Content side='top'>
|
||||
{isLocked || isParentLocked
|
||||
? 'Block is locked'
|
||||
: getTooltipMessage(isEnabled ? 'Disable Block' : 'Enable Block')}
|
||||
: !isEnabled && isParentDisabled
|
||||
? 'Parent container is disabled'
|
||||
: getTooltipMessage(isEnabled ? 'Disable Block' : 'Enable Block')}
|
||||
</Tooltip.Content>
|
||||
</Tooltip.Root>
|
||||
)}
|
||||
|
||||
@@ -22,6 +22,7 @@ export interface BlockInfo {
|
||||
parentType?: string
|
||||
locked?: boolean
|
||||
isParentLocked?: boolean
|
||||
isParentDisabled?: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -101,6 +102,8 @@ export function BlockMenu({
|
||||
const allUnlocked = selectedBlocks.every((b) => !b.locked)
|
||||
// Can't unlock blocks that have locked parents
|
||||
const hasBlockWithLockedParent = selectedBlocks.some((b) => b.locked && b.isParentLocked)
|
||||
// Can't enable blocks that have disabled parents
|
||||
const hasBlockWithDisabledParent = selectedBlocks.some((b) => !b.enabled && b.isParentDisabled)
|
||||
|
||||
const hasSingletonBlock = selectedBlocks.some(
|
||||
(b) =>
|
||||
@@ -186,13 +189,15 @@ export function BlockMenu({
|
||||
{!allNoteBlocks && <PopoverDivider />}
|
||||
{!allNoteBlocks && (
|
||||
<PopoverItem
|
||||
disabled={disableEdit}
|
||||
disabled={disableEdit || hasBlockWithDisabledParent}
|
||||
onClick={() => {
|
||||
onToggleEnabled()
|
||||
onClose()
|
||||
if (!disableEdit && !hasBlockWithDisabledParent) {
|
||||
onToggleEnabled()
|
||||
onClose()
|
||||
}
|
||||
}}
|
||||
>
|
||||
{getToggleEnabledLabel()}
|
||||
{hasBlockWithDisabledParent ? 'Parent is disabled' : getToggleEnabledLabel()}
|
||||
</PopoverItem>
|
||||
)}
|
||||
{!allNoteBlocks && !isSubflow && (
|
||||
|
||||
@@ -42,6 +42,7 @@ export function useCanvasContextMenu({ blocks, getNodes, setNodes }: UseCanvasCo
|
||||
parentType,
|
||||
locked: block?.locked ?? false,
|
||||
isParentLocked: parentBlock?.locked ?? false,
|
||||
isParentDisabled: parentBlock ? !parentBlock.enabled : false,
|
||||
}
|
||||
}),
|
||||
[blocks]
|
||||
|
||||
Reference in New Issue
Block a user