From 652e65066373684179cb327f147e27f1e9c768d9 Mon Sep 17 00:00:00 2001 From: bill Date: Wed, 19 Nov 2025 18:19:31 +0800 Subject: [PATCH] Feat: If a query variable in a data manipulation operator is deleted, a warning message should be displayed to the user. #10427 --- .../schema-editor/json-schema-visualizer.tsx | 2 +- web/src/locales/en.ts | 1 + web/src/locales/zh.ts | 1 + .../agent/canvas/node/data-operations-node.tsx | 3 ++- .../agent/form/components/dynamic-fom-header.tsx | 9 ++++++++- .../agent/form/components/query-variable-list.tsx | 13 +++++++++++-- .../pages/agent/form/data-operations-form/index.tsx | 7 ++++++- web/src/pages/agent/hooks/use-get-begin-query.tsx | 10 +++++++--- 8 files changed, 37 insertions(+), 9 deletions(-) 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;