Skip to content
Prev Previous commit
Next Next commit
fix(connectors): clear canonical siblings of dependents and resolve a…
…ctive 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>
  • Loading branch information
waleedlatif1 and claude committed Mar 14, 2026
commit 31ee9a9fe593dc29411a8fbf55d75d5c36444fa2
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,12 @@ export function AddConnectorModal({ open, onOpenChange, knowledgeBaseId }: AddCo
for (const field of group) {
for (const dep of map.get(field.id) ?? []) {
allDependents.add(dep)
const depField = connectorConfig.configFields.find((f) => f.id === dep)
if (depField?.canonicalParamId) {
for (const sibling of canonicalGroups.get(depField.canonicalParamId) ?? []) {
allDependents.add(sibling.id)
}
}
}
}
if (allDependents.size > 0) {
Expand Down Expand Up @@ -438,7 +444,7 @@ export function AddConnectorModal({ open, onOpenChange, knowledgeBaseId }: AddCo
</Tooltip.Trigger>
<Tooltip.Content side='top'>
{field.mode === 'basic'
? 'Switch to manual ID'
? 'Switch to manual input'
: 'Switch to selector'}
</Tooltip.Content>
Comment thread
waleedlatif1 marked this conversation as resolved.
</Tooltip.Root>
Expand All @@ -455,6 +461,7 @@ export function AddConnectorModal({ open, onOpenChange, knowledgeBaseId }: AddCo
credentialId={effectiveCredentialId}
sourceConfig={sourceConfig}
configFields={connectorConfig.configFields}
canonicalModes={canonicalModes}
disabled={isCreating}
/>
) : field.type === 'dropdown' && field.options ? (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ interface ConnectorSelectorFieldProps {
credentialId: string | null
sourceConfig: Record<string, string>
configFields: ConnectorConfigField[]
canonicalModes: Record<string, 'basic' | 'advanced'>
disabled?: boolean
}

Expand All @@ -26,6 +27,7 @@ export function ConnectorSelectorField({
credentialId,
sourceConfig,
configFields,
canonicalModes,
disabled,
}: ConnectorSelectorFieldProps) {
const context = useMemo<SelectorContext>(() => {
Expand All @@ -35,20 +37,22 @@ export function ConnectorSelectorField({
for (const depFieldId of getDependsOnFields(field.dependsOn)) {
const depField = configFields.find((f) => f.id === depFieldId)
const canonicalId = depField?.canonicalParamId ?? depFieldId
const depValue = sourceConfig[depFieldId]
const depValue = resolveDepValue(depFieldId, configFields, canonicalModes, sourceConfig)
if (depValue && SELECTOR_CONTEXT_FIELDS.has(canonicalId as keyof SelectorContext)) {
ctx[canonicalId as keyof SelectorContext] = depValue
}
}
Comment thread
waleedlatif1 marked this conversation as resolved.

return ctx
}, [credentialId, field.dependsOn, sourceConfig, configFields])
}, [credentialId, field.dependsOn, sourceConfig, configFields, canonicalModes])

const depsResolved = useMemo(() => {
if (!field.dependsOn) return true
const deps = Array.isArray(field.dependsOn) ? field.dependsOn : (field.dependsOn.all ?? [])
return deps.every((depId) => Boolean(sourceConfig[depId]?.trim()))
}, [field.dependsOn, sourceConfig])
return deps.every((depId) =>
Boolean(resolveDepValue(depId, configFields, canonicalModes, sourceConfig)?.trim())
)
}, [field.dependsOn, sourceConfig, configFields, canonicalModes])

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

function resolveDepValue(
depFieldId: string,
configFields: ConnectorConfigField[],
canonicalModes: Record<string, 'basic' | 'advanced'>,
sourceConfig: Record<string, string>
): string {
const depField = configFields.find((f) => f.id === depFieldId)
if (!depField?.canonicalParamId) return sourceConfig[depFieldId] ?? ''

const activeMode = canonicalModes[depField.canonicalParamId] ?? 'basic'
if (depField.mode === activeMode) return sourceConfig[depFieldId] ?? ''

const activeField = configFields.find(
(f) => f.canonicalParamId === depField.canonicalParamId && f.mode === activeMode
)
return activeField ? (sourceConfig[activeField.id] ?? '') : (sourceConfig[depFieldId] ?? '')
}

function getDependencyLabel(
field: ConnectorConfigField,
configFields: ConnectorConfigField[]
Expand Down
Loading