diff --git a/web/public/iconfont.js b/web/public/iconfont.js index b7b426074..bd97aeb5a 100644 --- a/web/public/iconfont.js +++ b/web/public/iconfont.js @@ -140,6 +140,16 @@ ` + + ` + + ` + + ` + + ` + + ` + + +` + ''), ((h) => { var a = (l = (l = document.getElementsByTagName('script'))[ diff --git a/web/src/components/jsonjoy-builder/components/schema-editor/json-schema-visualizer.tsx b/web/src/components/jsonjoy-builder/components/schema-editor/json-schema-visualizer.tsx index 48ee8a957..f39d9e260 100644 --- a/web/src/components/jsonjoy-builder/components/schema-editor/json-schema-visualizer.tsx +++ b/web/src/components/jsonjoy-builder/components/schema-editor/json-schema-visualizer.tsx @@ -48,7 +48,7 @@ const JsonSchemaVisualizer: FC = ({ try { const parsedJson = JSON.parse(value); - if (onChange) { + if (onChange && typeof parsedJson !== 'number') { onChange(parsedJson); } } catch (_error) { diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index f6fb0efc9..cf351b7ba 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -1646,6 +1646,7 @@ The variable aggregation node (originally the variable assignment node) is a cru beginInputTip: 'By defining input parameters, this content can be accessed by other components in subsequent processes.', query: 'Query variables', + queryRequired: 'Query is required', queryTip: 'Select the variable you want to use', agent: 'Agent', addAgent: 'Add Agent', diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index bff10d618..433ea628e 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -1549,6 +1549,7 @@ General:实体和关系提取提示来自 GitHub - microsoft/graphrag:基于 task: '任务', beginInputTip: '通过定义输入参数,此内容可以被后续流程中的其他组件访问。', query: '查询变量', + queryRequired: '查询变量是必填项', queryTip: '选择您想要使用的变量', agent: '智能体', addAgent: '添加智能体', diff --git a/web/src/pages/agent/canvas/node/data-operations-node.tsx b/web/src/pages/agent/canvas/node/data-operations-node.tsx index cb029a504..2eab53dc9 100644 --- a/web/src/pages/agent/canvas/node/data-operations-node.tsx +++ b/web/src/pages/agent/canvas/node/data-operations-node.tsx @@ -11,11 +11,12 @@ export function DataOperationsNode({ }: NodeProps>) { const { data } = props; const { t } = useTranslation(); + const operations = data.form?.operations; return ( - {t(`flow.operationsOptions.${camelCase(data.form?.operations)}`)} + {operations && t(`flow.operationsOptions.${camelCase(operations)}`)} ); diff --git a/web/src/pages/agent/form/components/dynamic-fom-header.tsx b/web/src/pages/agent/form/components/dynamic-fom-header.tsx index 66ff5d1a6..ecc24560c 100644 --- a/web/src/pages/agent/form/components/dynamic-fom-header.tsx +++ b/web/src/pages/agent/form/components/dynamic-fom-header.tsx @@ -7,17 +7,24 @@ export type FormListHeaderProps = { label: ReactNode; tooltip?: string; onClick?: () => void; + disabled?: boolean; }; export function DynamicFormHeader({ label, tooltip, onClick, + disabled = false, }: FormListHeaderProps) { return (
{label} -
diff --git a/web/src/pages/agent/form/components/query-variable-list.tsx b/web/src/pages/agent/form/components/query-variable-list.tsx index 73734532a..a4a76781d 100644 --- a/web/src/pages/agent/form/components/query-variable-list.tsx +++ b/web/src/pages/agent/form/components/query-variable-list.tsx @@ -2,6 +2,10 @@ import { Button } from '@/components/ui/button'; import { X } from 'lucide-react'; import { useFieldArray, useFormContext } from 'react-hook-form'; import { JsonSchemaDataType } from '../../constant'; +import { + flatOptions, + useFilterQueryVariableOptionsByTypes, +} from '../../hooks/use-get-begin-query'; import { DynamicFormHeader, FormListHeaderProps } from './dynamic-fom-header'; import { QueryVariable } from './query-variable'; @@ -16,6 +20,10 @@ export function QueryVariableList({ const form = useFormContext(); const name = 'query'; + let options = useFilterQueryVariableOptionsByTypes(types); + + const secondOptions = flatOptions(options); + const { fields, remove, append } = useFieldArray({ name: name, control: form.control, @@ -26,14 +34,15 @@ export function QueryVariableList({ append({ input: '' })} + onClick={() => append({ input: secondOptions.at(0)?.value })} + disabled={!secondOptions.length} >
{fields.map((field, index) => { const nameField = `${name}.${index}.input`; return ( -
+
{ return getLabel; }; +export function flatOptions(options: DefaultOptionType[]) { + return options.reduce((pre, cur) => { + return [...pre, ...cur.options]; + }, []); +} + export function useFlattenQueryVariableOptions(nodeId?: string) { const { getNode } = useGraphStore((state) => state); const nextOptions = useBuildQueryVariableOptions(getNode(nodeId)); const flattenOptions = useMemo(() => { - return nextOptions.reduce((pre, cur) => { - return [...pre, ...cur.options]; - }, []); + return flatOptions(nextOptions); }, [nextOptions]); return flattenOptions; diff --git a/web/src/pages/agent/operator-icon.tsx b/web/src/pages/agent/operator-icon.tsx index 44fe9d01a..bca93d7fa 100644 --- a/web/src/pages/agent/operator-icon.tsx +++ b/web/src/pages/agent/operator-icon.tsx @@ -12,9 +12,9 @@ import { ReactComponent as WenCaiIcon } from '@/assets/svg/wencai.svg'; import { ReactComponent as WikipediaIcon } from '@/assets/svg/wikipedia.svg'; import { ReactComponent as YahooFinanceIcon } from '@/assets/svg/yahoo-finance.svg'; -import { IconFont } from '@/components/icon-font'; +import { IconFontFill } from '@/components/icon-font'; import { cn } from '@/lib/utils'; -import { Columns3, Equal, FileCode, HousePlus, Variable } from 'lucide-react'; +import { FileCode, HousePlus } from 'lucide-react'; import { Operator } from './constant'; interface IProps { @@ -37,6 +37,9 @@ export const OperatorIconMap = { [Operator.ExeSQL]: 'executesql-0', [Operator.Invoke]: 'httprequest-0', [Operator.Email]: 'sendemail-0', + [Operator.ListOperations]: 'a-listoperations', + [Operator.VariableAssigner]: 'a-ariableassigner', + [Operator.VariableAggregator]: 'aggregator', }; export const SVGIconMap = { @@ -57,9 +60,6 @@ export const SVGIconMap = { }; export const LucideIconMap = { [Operator.DataOperations]: FileCode, - [Operator.ListOperations]: Columns3, - [Operator.VariableAssigner]: Equal, - [Operator.VariableAggregator]: Variable, }; const Empty = () => { @@ -86,7 +86,10 @@ const OperatorIcon = ({ name, className }: IProps) => { if (Icon) { return ( - + ); }