/* * @Author: ZhaoYing * @Date: 2026-02-03 15:40:13 * @Last Modified by: ZhaoYing * @Last Modified time: 2026-03-25 16:54:44 */ import { type FC } from 'react' import clsx from 'clsx'; import { Select, type SelectProps, Flex, Space } from 'antd' import type { Suggestion } from '../Editor/plugin/AutocompletePlugin' type LabelRender = SelectProps['labelRender']; /** * Props for VariableSelect component */ interface VariableSelectProps extends SelectProps { /** Available variable options */ options: Suggestion[]; /** Current selected value */ value?: string; /** Whether to show clear button */ allowClear?: boolean; /** Filter out boolean type variables */ filterBooleanType?: boolean; /** Size of the select component */ size?: 'small' | 'middle' | 'large' } /** * VariableSelect component * Custom select component for workflow variables with grouped options and custom rendering * @param props - Component props */ const VariableSelect: FC = ({ placeholder, options, value, allowClear = true, onChange, size = 'middle', filterBooleanType = false, mode, ...resetPorps }) => { /** * Handle value change and pass selected option to parent * @param value - Selected value */ const handleChange: SelectProps['onChange'] = (value: string) => { const filterItem = options.find(option => `{{${option.value}}}` === value) onChange?.(value, filterItem); } /** * Custom label renderer for selected value * Displays node icon, name and variable label * @param props - Label render props */ const labelRender: LabelRender = (props) => { const { value } = props const filterOption = filteredOptions.find(vo => `{{${vo.value}}}` === value) if (filterOption) { return ( {filterOption.nodeData?.icon && filterOption.nodeData?.name && ( <> {filterOption.nodeData.name} / )} {filterOption.label} ) } return null } // Filter options based on boolean type if needed const filteredOptions = filterBooleanType ? options.filter(option => option.dataType !== 'boolean') : options; /** * Group suggestions by node ID */ const groupedSuggestions = filteredOptions.reduce((groups: Record, suggestion) => { const { nodeData } = suggestion const nodeId = nodeData.id as string; if (!groups[nodeId]) { groups[nodeId] = []; } groups[nodeId].push(suggestion); return groups; }, {}); /** * Format grouped options for Select component */ const groupedOptions = Object.entries(groupedSuggestions).map(([_nodeId, suggestions]) => ({ label: {suggestions[0].nodeData.icon && } {suggestions[0].nodeData.name} , options: suggestions.map(s => ({ label: {`{x}`} {s.label} {s.dataType} , value: `{{${s.value}}}` })) })); return (