Skip to content

Commit 31ee9a9

Browse files
waleedlatif1claude
andcommitted
fix(connectors): clear canonical siblings of dependents and resolve active mode values
Fixes three issues from PR review: - Dependency clearing now includes canonical siblings of dependent fields (e.g., changing base clears both tableSelector AND tableIdOrName) - Selector context and depsResolved now resolve dependency values through the active canonical mode, not just the raw depFieldId - Tooltip text changed from "Switch to manual ID" to "Switch to manual input" to correctly describe dropdown fallbacks (e.g., Outlook folder) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 4b7d9a7 commit 31ee9a9

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ export function AddConnectorModal({ open, onOpenChange, knowledgeBaseId }: AddCo
121121
for (const field of group) {
122122
for (const dep of map.get(field.id) ?? []) {
123123
allDependents.add(dep)
124+
const depField = connectorConfig.configFields.find((f) => f.id === dep)
125+
if (depField?.canonicalParamId) {
126+
for (const sibling of canonicalGroups.get(depField.canonicalParamId) ?? []) {
127+
allDependents.add(sibling.id)
128+
}
129+
}
124130
}
125131
}
126132
if (allDependents.size > 0) {
@@ -438,7 +444,7 @@ export function AddConnectorModal({ open, onOpenChange, knowledgeBaseId }: AddCo
438444
</Tooltip.Trigger>
439445
<Tooltip.Content side='top'>
440446
{field.mode === 'basic'
441-
? 'Switch to manual ID'
447+
? 'Switch to manual input'
442448
: 'Switch to selector'}
443449
</Tooltip.Content>
444450
</Tooltip.Root>
@@ -455,6 +461,7 @@ export function AddConnectorModal({ open, onOpenChange, knowledgeBaseId }: AddCo
455461
credentialId={effectiveCredentialId}
456462
sourceConfig={sourceConfig}
457463
configFields={connectorConfig.configFields}
464+
canonicalModes={canonicalModes}
458465
disabled={isCreating}
459466
/>
460467
) : field.type === 'dropdown' && field.options ? (

apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/components/connector-selector-field.tsx

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ interface ConnectorSelectorFieldProps {
1616
credentialId: string | null
1717
sourceConfig: Record<string, string>
1818
configFields: ConnectorConfigField[]
19+
canonicalModes: Record<string, 'basic' | 'advanced'>
1920
disabled?: boolean
2021
}
2122

@@ -26,6 +27,7 @@ export function ConnectorSelectorField({
2627
credentialId,
2728
sourceConfig,
2829
configFields,
30+
canonicalModes,
2931
disabled,
3032
}: ConnectorSelectorFieldProps) {
3133
const context = useMemo<SelectorContext>(() => {
@@ -35,20 +37,22 @@ export function ConnectorSelectorField({
3537
for (const depFieldId of getDependsOnFields(field.dependsOn)) {
3638
const depField = configFields.find((f) => f.id === depFieldId)
3739
const canonicalId = depField?.canonicalParamId ?? depFieldId
38-
const depValue = sourceConfig[depFieldId]
40+
const depValue = resolveDepValue(depFieldId, configFields, canonicalModes, sourceConfig)
3941
if (depValue && SELECTOR_CONTEXT_FIELDS.has(canonicalId as keyof SelectorContext)) {
4042
ctx[canonicalId as keyof SelectorContext] = depValue
4143
}
4244
}
4345

4446
return ctx
45-
}, [credentialId, field.dependsOn, sourceConfig, configFields])
47+
}, [credentialId, field.dependsOn, sourceConfig, configFields, canonicalModes])
4648

4749
const depsResolved = useMemo(() => {
4850
if (!field.dependsOn) return true
4951
const deps = Array.isArray(field.dependsOn) ? field.dependsOn : (field.dependsOn.all ?? [])
50-
return deps.every((depId) => Boolean(sourceConfig[depId]?.trim()))
51-
}, [field.dependsOn, sourceConfig])
52+
return deps.every((depId) =>
53+
Boolean(resolveDepValue(depId, configFields, canonicalModes, sourceConfig)?.trim())
54+
)
55+
}, [field.dependsOn, sourceConfig, configFields, canonicalModes])
5256

5357
const isEnabled = !disabled && !!credentialId && depsResolved
5458
const { data: options = [], isLoading } = useSelectorOptions(field.selectorKey, {
@@ -87,6 +91,24 @@ export function ConnectorSelectorField({
8791
)
8892
}
8993

94+
function resolveDepValue(
95+
depFieldId: string,
96+
configFields: ConnectorConfigField[],
97+
canonicalModes: Record<string, 'basic' | 'advanced'>,
98+
sourceConfig: Record<string, string>
99+
): string {
100+
const depField = configFields.find((f) => f.id === depFieldId)
101+
if (!depField?.canonicalParamId) return sourceConfig[depFieldId] ?? ''
102+
103+
const activeMode = canonicalModes[depField.canonicalParamId] ?? 'basic'
104+
if (depField.mode === activeMode) return sourceConfig[depFieldId] ?? ''
105+
106+
const activeField = configFields.find(
107+
(f) => f.canonicalParamId === depField.canonicalParamId && f.mode === activeMode
108+
)
109+
return activeField ? (sourceConfig[activeField.id] ?? '') : (sourceConfig[depFieldId] ?? '')
110+
}
111+
90112
function getDependencyLabel(
91113
field: ConnectorConfigField,
92114
configFields: ConnectorConfigField[]

0 commit comments

Comments
 (0)