'use client' import { Button } from '@/components/ui/button' import { Label } from '@/components/ui/label' import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Plus, Trash2 } from 'lucide-react' import type { Node } from '@xyflow/react' import { NODE_TYPE_LABELS } from '@/lib/mail-automation/node-definitions' import { actionTypesForDomains, AUTOMATION_DOMAIN_LABELS, conditionFieldsForDomains, inferDomainsFromTriggers, primaryDomainFromTriggers, } from '@/lib/mail-automation/domains' import { useAutomationDomains } from './automation-domain-context' import { isBooleanConditionField, isLabelConditionField } from '@/lib/mail-automation/condition-helpers' import { actionValueSuggestionKind, conditionValueSuggestionKind, defaultOperatorForField, formatConditionSummary, operatorOptionsForConditionField, switchFieldSuggestionKind, } from '@/lib/mail-automation/condition-helpers' import type { ActionsNodeData, ConditionNodeData, LLMCheckNodeData, SetVarNodeData, SwitchNodeData, CallRuleNodeData, WorkflowNodeType, ConditionField, } from '@/lib/mail-automation/types' import type { ApiRule } from '@/lib/api/types' import { createEmptyAction } from '@/lib/mail-automation/defaults' import { AutomationSuggestInput } from './automation-suggest-input' import { Input } from '@/components/ui/input' interface WorkflowNodeInspectorProps { node: Node | null allRules: ApiRule[] onUpdate: (nodeId: string, data: Record) => void onDelete: (nodeId: string) => void triggers?: import('@/lib/mail-automation/types').TriggerOrGroup } export function WorkflowNodeInspector({ node, allRules, onUpdate, onDelete, triggers, }: WorkflowNodeInspectorProps) { const contextDomains = useAutomationDomains() const activeDomains = triggers ? inferDomainsFromTriggers(triggers) : contextDomains const conditionFields = conditionFieldsForDomains(activeDomains) const actionTypes = actionTypesForDomains(activeDomains) const primaryDomain = primaryDomainFromTriggers( triggers ?? { operator: 'or', groups: [{ operator: 'and', items: [] }] } ) if (!node || node.type === 'start' || node.type === 'end') { return (
Sélectionnez un nœud pour le configurer
) } const type = node.type as WorkflowNodeType const data = node.data as unknown as Record function patch(partial: Record) { onUpdate(node!.id, { ...data, ...partial }) } return (

{NODE_TYPE_LABELS[type]}

{node.id}

{type === 'condition' || type === 'label_check' ? ( ) : null} {type === 'switch' ? ( ) : null} {type === 'llm_check' ? ( ) : null} {type === 'actions' ? ( ) : null} {type === 'set_var' ? ( ) : null} {type === 'call_function' || type === 'call_rule' ? ( ) : null}
) } function ConditionEditor({ fields, data, onChange, }: { fields: { value: ConditionField; label: string; domain: import('@/lib/mail-automation/domains').AutomationDomain }[] data: ConditionNodeData onChange: (p: Partial) => void }) { const operatorOptions = operatorOptionsForConditionField(data.field) const valueKind = conditionValueSuggestionKind(data.field, data.operator) const isRegex = data.operator === 'regex' || data.operator === 'not_regex' function onFieldChange(field: ConditionField) { onChange({ field, operator: defaultOperatorForField(field), value: isBooleanConditionField(field) ? 'true' : '', }) } return ( <> onFieldChange(v as ConditionField)} /> onChange({ operator: v as ConditionNodeData['operator'] })} />
{isBooleanConditionField(data.field) ? ( onChange({ value: v })} /> ) : ( onChange({ value })} /> )}
) } function SwitchEditor({ fields, data, onChange, }: { fields: { value: ConditionField; label: string; domain: import('@/lib/mail-automation/domains').AutomationDomain }[] data: SwitchNodeData onChange: (p: Partial) => void }) { const cases = data.cases ?? [] const fieldKind = switchFieldSuggestionKind(data.field) return ( <> onChange({ field: v })} />
{cases.map((c, i) => (
{ const next = [...cases] next[i] = { ...c, value } onChange({ cases: next }) }} /> { const next = [...cases] next[i] = { ...c, label: e.target.value } onChange({ cases: next }) }} />
))}
) } function LLMEditor({ data, onChange, }: { data: LLMCheckNodeData onChange: (p: Partial) => void }) { return ( <>