Skip to content

Commit d7f59e0

Browse files
Bill LeoutsakosBill Leoutsakos
authored andcommitted
fix(workflows): honor explicit canonical modes
1 parent c155a57 commit d7f59e0

37 files changed

Lines changed: 1871 additions & 112 deletions

File tree

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ import {
105105
type CanonicalIndex,
106106
type CanonicalModeOverrides,
107107
evaluateSubBlockCondition,
108+
getCanonicalSubBlocksForSurface,
108109
isCanonicalPair,
109110
reindexToolCanonicalModes,
110111
resolveCanonicalMode,
@@ -526,13 +527,14 @@ export const ToolInput = memo(function ToolInput({
526527
for (const [toolIndex, tool] of selectedTools.entries()) {
527528
const blockConfig = allBlocks.find((b: { type: string }) => b.type === tool.type)
528529
if (!blockConfig?.subBlocks) continue
529-
const toolCanonical = buildCanonicalIndex(blockConfig.subBlocks)
530+
const actionSubBlocks = getCanonicalSubBlocksForSurface(blockConfig.subBlocks, false)
531+
const toolCanonical = buildCanonicalIndex(actionSubBlocks)
530532
const scopedOverrides = scopeCanonicalModesForTool(
531533
canonicalModeOverrides,
532534
toolIndex,
533535
tool.type
534536
)
535-
const reactiveSubBlock = blockConfig.subBlocks.find(
537+
const reactiveSubBlock = actionSubBlocks.find(
536538
(sb: { reactiveCondition?: unknown }) => sb.reactiveCondition
537539
)
538540
const reactiveCond = reactiveSubBlock?.reactiveCondition as
@@ -1744,14 +1746,17 @@ export const ToolInput = memo(function ToolInput({
17441746
)
17451747
: null
17461748

1747-
const toolCanonicalIndex: CanonicalIndex | null = toolBlock?.subBlocks
1748-
? buildCanonicalIndex(toolBlock.subBlocks)
1749+
const toolActionSubBlocks = toolBlock?.subBlocks
1750+
? getCanonicalSubBlocksForSurface(toolBlock.subBlocks, false)
1751+
: null
1752+
const toolCanonicalIndex: CanonicalIndex | null = toolActionSubBlocks
1753+
? buildCanonicalIndex(toolActionSubBlocks)
17491754
: null
17501755

17511756
const toolContextValues = toolCanonicalIndex
17521757
? buildPreviewContextValues(tool.params || {}, {
17531758
blockType: tool.type,
1754-
subBlocks: toolBlock!.subBlocks,
1759+
subBlocks: toolActionSubBlocks!,
17551760
canonicalIndex: toolCanonicalIndex,
17561761
values: { operation: tool.operation, ...tool.params },
17571762
overrides: toolScopedOverrides,

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-canonical-sub-block-value.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import { useCallback, useMemo } from 'react'
22
import { isEqual } from 'es-toolkit'
33
import { useStoreWithEqualityFn } from 'zustand/traditional'
4-
import { buildCanonicalIndex, resolveDependencyValue } from '@/lib/workflows/subblocks/visibility'
4+
import {
5+
buildCanonicalIndex,
6+
getCanonicalSubBlocksForSurface,
7+
isPureTriggerBlockConfig,
8+
resolveDependencyValue,
9+
} from '@/lib/workflows/subblocks/visibility'
510
import { getBlock } from '@/blocks/registry'
611
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
712
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
@@ -22,10 +27,15 @@ export function useCanonicalSubBlockValue<T = unknown>(
2227
const activeWorkflowId = useWorkflowRegistry((s) => s.activeWorkflowId)
2328
const blockState = useWorkflowStore((state) => state.blocks[blockId])
2429
const blockConfig = blockState?.type ? getBlock(blockState.type) : null
25-
const canonicalIndex = useMemo(
26-
() => buildCanonicalIndex(blockConfig?.subBlocks || []),
27-
[blockConfig?.subBlocks]
28-
)
30+
const canonicalIndex = useMemo(() => {
31+
const subBlocks = blockConfig?.subBlocks || []
32+
return buildCanonicalIndex(
33+
getCanonicalSubBlocksForSurface(
34+
subBlocks,
35+
Boolean(blockState?.triggerMode) || isPureTriggerBlockConfig(blockConfig ?? undefined)
36+
)
37+
)
38+
}, [blockConfig?.subBlocks, blockState?.triggerMode])
2939
const canonicalModeOverrides = blockState?.data?.canonicalModes
3040

3141
return useStoreWithEqualityFn(

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-depends-on-gate.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import { isEqual } from 'es-toolkit'
55
import { useStoreWithEqualityFn } from 'zustand/traditional'
66
import {
77
buildCanonicalIndex,
8+
getCanonicalSubBlocksForSurface,
89
isNonEmptyValue,
10+
isPureTriggerBlockConfig,
911
normalizeDependencyValue,
1012
parseDependsOn,
1113
resolveDependencyValue,
@@ -41,10 +43,15 @@ export function useDependsOnGate(
4143
: blockState?.type
4244
? getBlock(blockState.type)
4345
: null
44-
const canonicalIndex = useMemo(
45-
() => buildCanonicalIndex(blockConfig?.subBlocks || []),
46-
[blockConfig?.subBlocks]
47-
)
46+
const canonicalIndex = useMemo(() => {
47+
const subBlocks = blockConfig?.subBlocks || []
48+
return buildCanonicalIndex(
49+
getCanonicalSubBlocksForSurface(
50+
subBlocks,
51+
Boolean(blockState?.triggerMode) || isPureTriggerBlockConfig(blockConfig ?? undefined)
52+
)
53+
)
54+
}, [blockConfig?.subBlocks, blockState?.triggerMode])
4855
const canonicalModeOverrides = blockState?.data?.canonicalModes
4956

5057
// Parse dependsOn config to get all/any field lists

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-fetched-options.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
22
import { getErrorMessage } from '@sim/utils/errors'
33
import { isEqual } from 'es-toolkit'
44
import { useStoreWithEqualityFn } from 'zustand/traditional'
5-
import { buildCanonicalIndex, resolveDependencyValue } from '@/lib/workflows/subblocks/visibility'
5+
import {
6+
buildCanonicalIndex,
7+
getCanonicalSubBlocksForSurface,
8+
isPureTriggerBlockConfig,
9+
resolveDependencyValue,
10+
} from '@/lib/workflows/subblocks/visibility'
611
import { getBlock } from '@/blocks/registry'
712
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
813
import { useSubBlockStore } from '@/stores/workflows/subblock/store'
@@ -73,10 +78,15 @@ export function useFetchedOptions({
7378
const blockState = useWorkflowStore((state) => state.blocks[blockId])
7479
const blockConfig = blockState?.type ? getBlock(blockState.type) : null
7580
const canonicalModeOverrides = blockState?.data?.canonicalModes
76-
const canonicalIndex = useMemo(
77-
() => buildCanonicalIndex(blockConfig?.subBlocks || []),
78-
[blockConfig?.subBlocks]
79-
)
81+
const canonicalIndex = useMemo(() => {
82+
const subBlocks = blockConfig?.subBlocks || []
83+
return buildCanonicalIndex(
84+
getCanonicalSubBlocksForSurface(
85+
subBlocks,
86+
Boolean(blockState?.triggerMode) || isPureTriggerBlockConfig(blockConfig ?? undefined)
87+
)
88+
)
89+
}, [blockConfig?.subBlocks, blockState?.triggerMode])
8090

8191
const dependencyValues = useStoreWithEqualityFn(
8292
useSubBlockStore,

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/editor.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@ import { isRetryEligibleBlock } from '@/lib/workflows/blocks/retry-eligibility'
2323
import {
2424
buildCanonicalIndex,
2525
evaluateSubBlockCondition,
26+
getCanonicalSubBlocksForSurface,
2627
hasAdvancedValues,
2728
isCanonicalPair,
29+
isPureTriggerBlockConfig,
2830
isStandaloneAdvancedMode,
2931
resolveCanonicalMode,
30-
shouldUseSubBlockForTriggerModeCanonicalIndex,
3132
} from '@/lib/workflows/subblocks/visibility'
3233
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider'
3334
import {
@@ -159,9 +160,11 @@ export function Editor() {
159160

160161
const subBlocksForCanonical = useMemo(() => {
161162
const subBlocks = blockConfig?.subBlocks || []
162-
if (!triggerMode) return subBlocks
163-
return subBlocks.filter(shouldUseSubBlockForTriggerModeCanonicalIndex)
164-
}, [blockConfig?.subBlocks, triggerMode])
163+
return getCanonicalSubBlocksForSurface(
164+
subBlocks,
165+
triggerMode || isPureTriggerBlockConfig(blockConfig ?? undefined)
166+
)
167+
}, [blockConfig, triggerMode])
165168

166169
const canonicalIndex = useMemo(
167170
() => buildCanonicalIndex(subBlocksForCanonical),

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-editor-subblock-layout.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ import { useCallback, useMemo } from 'react'
22
import {
33
buildCanonicalIndex,
44
evaluateSubBlockCondition,
5+
getCanonicalSubBlocksForSurface,
6+
isPureTriggerBlockConfig,
57
isSubBlockFeatureEnabled,
68
isSubBlockHidden,
79
isSubBlockVisibleForMode,
810
isSubBlockVisibleForTriggerMode,
911
isToolInputOnlySubBlock,
10-
shouldUseSubBlockForTriggerModeCanonicalIndex,
1112
} from '@/lib/workflows/subblocks/visibility'
1213
import type { BlockConfig, SubBlockConfig } from '@/blocks/types'
1314
import { usePermissionConfig } from '@/hooks/use-permission-config'
@@ -43,9 +44,17 @@ export function useEditorSubblockLayout(
4344
)
4445
const { config: permissionConfig } = usePermissionConfig()
4546

47+
const canonicalSubBlocks = useMemo(() => {
48+
const subBlocks = config?.subBlocks || []
49+
return getCanonicalSubBlocksForSurface(
50+
subBlocks,
51+
displayTriggerMode || isPureTriggerBlockConfig(config)
52+
)
53+
}, [config?.subBlocks, displayTriggerMode])
54+
4655
// Evaluate reactive conditions (hooks-based, must be called before useMemo)
4756
const hiddenByReactiveCondition = useReactiveConditions(
48-
config?.subBlocks || [],
57+
canonicalSubBlocks,
4958
blockId,
5059
activeWorkflowId,
5160
blockDataFromStore?.canonicalModes
@@ -102,10 +111,7 @@ export function useEditorSubblockLayout(
102111
{}
103112
)
104113

105-
const subBlocksForCanonical = displayTriggerMode
106-
? (config.subBlocks || []).filter(shouldUseSubBlockForTriggerModeCanonicalIndex)
107-
: config.subBlocks || []
108-
const canonicalIndex = buildCanonicalIndex(subBlocksForCanonical)
114+
const canonicalIndex = buildCanonicalIndex(canonicalSubBlocks)
109115
const effectiveAdvanced = displayAdvancedMode
110116
const canonicalModeOverrides = blockData?.canonicalModes
111117

@@ -169,5 +175,6 @@ export function useEditorSubblockLayout(
169175
blockDataFromStore,
170176
hiddenByReactiveCondition,
171177
permissionConfig.disableSkills,
178+
canonicalSubBlocks,
172179
])
173180
}

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ import {
6464
} from '@/lib/workflows/subblocks/display'
6565
import {
6666
buildCanonicalIndex,
67+
getCanonicalSubBlocksForSurface,
6768
hasAdvancedValues,
69+
isPureTriggerBlockConfig,
6870
resolveDependencyValue,
6971
} from '@/lib/workflows/subblocks/visibility'
7072
import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider'
@@ -791,11 +793,22 @@ export const WorkflowBlock = memo(function WorkflowBlock({
791793
])
792794
}
793795

794-
const canonicalIndex = useMemo(() => buildCanonicalIndex(config.subBlocks), [config.subBlocks])
796+
const canonicalSubBlocks = useMemo(
797+
() =>
798+
getCanonicalSubBlocksForSurface(
799+
config.subBlocks,
800+
displayTriggerMode || isPureTriggerBlockConfig(config)
801+
),
802+
[config.subBlocks, displayTriggerMode]
803+
)
804+
const canonicalIndex = useMemo(
805+
() => buildCanonicalIndex(canonicalSubBlocks),
806+
[canonicalSubBlocks]
807+
)
795808
const canonicalModeOverrides = currentStoreBlock?.data?.canonicalModes
796809

797810
const hiddenByReactiveCondition = useReactiveConditions(
798-
config.subBlocks,
811+
canonicalSubBlocks,
799812
id,
800813
activeWorkflowId,
801814
canonicalModeOverrides
@@ -832,7 +845,7 @@ export const WorkflowBlock = memo(function WorkflowBlock({
832845

833846
const effectiveAdvanced = canEditWorkflow
834847
? displayAdvancedMode
835-
: displayAdvancedMode || hasAdvancedValues(config.subBlocks, rawValues, canonicalIndex)
848+
: displayAdvancedMode || hasAdvancedValues(canonicalSubBlocks, rawValues, canonicalIndex)
836849
const effectiveTrigger = displayTriggerMode
837850
const canvasPresentation = resolveCanvasBlockPresentation(config, name, rawValues)
838851

@@ -919,8 +932,8 @@ export const WorkflowBlock = memo(function WorkflowBlock({
919932
)
920933
return canEditWorkflow
921934
? displayAdvancedMode
922-
: displayAdvancedMode || hasAdvancedValues(config.subBlocks, rawValues, canonicalIndex)
923-
}, [subBlockState, displayAdvancedMode, config.subBlocks, canonicalIndex, canEditWorkflow])
935+
: displayAdvancedMode || hasAdvancedValues(canonicalSubBlocks, rawValues, canonicalIndex)
936+
}, [subBlockState, displayAdvancedMode, canonicalSubBlocks, canonicalIndex, canEditWorkflow])
924937

925938
const shouldShowDefaultHandles = showsCanvasDefaultHandles(config, type, displayTriggerMode)
926939

apps/sim/app/workspace/[workspaceId]/w/components/preview/components/preview-editor/preview-editor.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ import { extractReferencePrefixes } from '@/lib/workflows/sanitization/reference
3232
import {
3333
buildCanonicalIndex,
3434
evaluateSubBlockCondition,
35+
getCanonicalSubBlocksForSurface,
3536
hasAdvancedValues,
37+
isPureTriggerBlockConfig,
3638
isSubBlockFeatureEnabled,
3739
isSubBlockVisibleForMode,
3840
isToolInputOnlySubBlock,
@@ -1055,9 +1057,15 @@ function PreviewEditorContent({
10551057
}, {})
10561058
}, [subBlockValues])
10571059

1060+
const isPureTriggerBlock = isPureTriggerBlockConfig(blockConfig)
1061+
const triggerCanonicalSurface = block.triggerMode === true || isPureTriggerBlock
1062+
const canonicalSubBlocks = useMemo(
1063+
() => getCanonicalSubBlocksForSurface(blockConfig?.subBlocks || [], triggerCanonicalSurface),
1064+
[blockConfig?.subBlocks, triggerCanonicalSurface]
1065+
)
10581066
const canonicalIndex = useMemo(
1059-
() => buildCanonicalIndex(blockConfig?.subBlocks || []),
1060-
[blockConfig?.subBlocks]
1067+
() => buildCanonicalIndex(canonicalSubBlocks),
1068+
[canonicalSubBlocks]
10611069
)
10621070

10631071
const isSubflow = block.type === 'loop' || block.type === 'parallel'
@@ -1115,9 +1123,8 @@ function PreviewEditorContent({
11151123
const canonicalModeOverrides = block.data?.canonicalModes
11161124
const effectiveAdvanced =
11171125
(block.advancedMode ?? false) ||
1118-
hasAdvancedValues(blockConfig.subBlocks, rawValues, canonicalIndex)
1126+
hasAdvancedValues(canonicalSubBlocks, rawValues, canonicalIndex)
11191127

1120-
const isPureTriggerBlock = blockConfig.triggers?.enabled && blockConfig.category === 'triggers'
11211128
const effectiveTrigger = block.triggerMode === true
11221129

11231130
const visibleSubBlocks = blockConfig.subBlocks.filter((subBlock) => {

0 commit comments

Comments
 (0)