From 781d49cd0eeb5da18e848b8268cd048062399deb Mon Sep 17 00:00:00 2001 From: balibabu Date: Tue, 14 Oct 2025 13:30:54 +0800 Subject: [PATCH] Feat: Display the configuration of data flow operators on the node #9869 (#10533) ### What problem does this PR solve? Feat: Display the configuration of data flow operators on the node #9869 ### Type of change - [x] New Feature (non-breaking change which adds functionality) --- web/src/pages/data-flow/canvas/node/card.tsx | 61 +++---------------- .../data-flow/canvas/node/extractor-node.tsx | 19 +++++- web/src/pages/data-flow/canvas/node/index.tsx | 7 ++- .../data-flow/canvas/node/parser-node.tsx | 19 +++++- .../data-flow/canvas/node/tokenizer-node.tsx | 19 +++++- .../data-flow/form/tokenizer-form/index.tsx | 4 +- 6 files changed, 68 insertions(+), 61 deletions(-) diff --git a/web/src/pages/data-flow/canvas/node/card.tsx b/web/src/pages/data-flow/canvas/node/card.tsx index 042ca45e0..7b2f39ba7 100644 --- a/web/src/pages/data-flow/canvas/node/card.tsx +++ b/web/src/pages/data-flow/canvas/node/card.tsx @@ -1,57 +1,12 @@ -import { Button } from '@/components/ui/button'; -import { - Card, - CardContent, - CardDescription, - CardFooter, - CardHeader, - CardTitle, -} from '@/components/ui/card'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from '@/components/ui/select'; +import { cn } from '@/lib/utils'; +import { PropsWithChildren } from 'react'; -export function CardWithForm() { +type LabelCardProps = { + className?: string; +} & PropsWithChildren; + +export function LabelCard({ children, className }: LabelCardProps) { return ( - - - Create project - Deploy your new project in one-click. - - -
-
-
- - -
-
- - -
-
-
-
- - - - -
+
{children}
); } diff --git a/web/src/pages/data-flow/canvas/node/extractor-node.tsx b/web/src/pages/data-flow/canvas/node/extractor-node.tsx index b8746a163..8b2e03483 100644 --- a/web/src/pages/data-flow/canvas/node/extractor-node.tsx +++ b/web/src/pages/data-flow/canvas/node/extractor-node.tsx @@ -1 +1,18 @@ -export { RagNode as ExtractorNode } from './index'; +import LLMLabel from '@/components/llm-select/llm-label'; +import { IRagNode } from '@/interfaces/database/agent'; +import { NodeProps } from '@xyflow/react'; +import { get } from 'lodash'; +import { LabelCard } from './card'; +import { RagNode } from './index'; + +export function ExtractorNode({ ...props }: NodeProps) { + const { data } = props; + + return ( + + + + + + ); +} diff --git a/web/src/pages/data-flow/canvas/node/index.tsx b/web/src/pages/data-flow/canvas/node/index.tsx index 7a26d4ecc..4e004aa83 100644 --- a/web/src/pages/data-flow/canvas/node/index.tsx +++ b/web/src/pages/data-flow/canvas/node/index.tsx @@ -1,6 +1,6 @@ import { IRagNode } from '@/interfaces/database/flow'; import { NodeProps, Position } from '@xyflow/react'; -import { memo, useMemo } from 'react'; +import { PropsWithChildren, memo, useMemo } from 'react'; import { NodeHandleId, SingleOperators } from '../../constant'; import useGraphStore from '../../store'; import { CommonHandle } from './handle'; @@ -9,12 +9,14 @@ import NodeHeader from './node-header'; import { NodeWrapper } from './node-wrapper'; import { ToolBar } from './toolbar'; +type RagNodeProps = NodeProps & PropsWithChildren; function InnerRagNode({ id, data, isConnectable = true, selected, -}: NodeProps) { + children, +}: RagNodeProps) { const getOperatorTypeFromId = useGraphStore( (state) => state.getOperatorTypeFromId, ); @@ -45,6 +47,7 @@ function InnerRagNode({ isConnectableEnd={false} > + {children} ); diff --git a/web/src/pages/data-flow/canvas/node/parser-node.tsx b/web/src/pages/data-flow/canvas/node/parser-node.tsx index 512632db6..9201b98db 100644 --- a/web/src/pages/data-flow/canvas/node/parser-node.tsx +++ b/web/src/pages/data-flow/canvas/node/parser-node.tsx @@ -1,7 +1,10 @@ -import { IRagNode } from '@/interfaces/database/flow'; +import { BaseNode } from '@/interfaces/database/agent'; import { NodeProps, Position } from '@xyflow/react'; import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; import { NodeHandleId } from '../../constant'; +import { ParserFormSchemaType } from '../../form/parser-form'; +import { LabelCard } from './card'; import { CommonHandle } from './handle'; import { LeftHandleStyle, RightHandleStyle } from './handle-icon'; import NodeHeader from './node-header'; @@ -12,7 +15,8 @@ function ParserNode({ data, isConnectable = true, selected, -}: NodeProps) { +}: NodeProps>) { + const { t } = useTranslation(); return ( +
+ {data.form?.setups.map((x, idx) => ( + + Parser {idx + 1} + {t(`dataflow.fileFormatOptions.${x.fileFormat}`)} + + ))} +
); } diff --git a/web/src/pages/data-flow/canvas/node/tokenizer-node.tsx b/web/src/pages/data-flow/canvas/node/tokenizer-node.tsx index 710ddef1f..9ae2face2 100644 --- a/web/src/pages/data-flow/canvas/node/tokenizer-node.tsx +++ b/web/src/pages/data-flow/canvas/node/tokenizer-node.tsx @@ -1,7 +1,10 @@ -import { IRagNode } from '@/interfaces/database/flow'; +import { BaseNode } from '@/interfaces/database/agent'; import { NodeProps, Position } from '@xyflow/react'; import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; import { NodeHandleId } from '../../constant'; +import { TokenizerFormSchemaType } from '../../form/tokenizer-form'; +import { LabelCard } from './card'; import { CommonHandle } from './handle'; import { LeftHandleStyle } from './handle-icon'; import NodeHeader from './node-header'; @@ -13,7 +16,9 @@ function TokenizerNode({ data, isConnectable = true, selected, -}: NodeProps) { +}: NodeProps>) { + const { t } = useTranslation(); + return ( + + + {t('dataflow.searchMethod')} + +
    + {data.form?.search_method.map((x) => ( +
  • {t(`dataflow.tokenizerSearchMethodOptions.${x}`)}
  • + ))} +
+
); diff --git a/web/src/pages/data-flow/form/tokenizer-form/index.tsx b/web/src/pages/data-flow/form/tokenizer-form/index.tsx index cc949d5cd..358554508 100644 --- a/web/src/pages/data-flow/form/tokenizer-form/index.tsx +++ b/web/src/pages/data-flow/form/tokenizer-form/index.tsx @@ -29,6 +29,8 @@ export const FormSchema = z.object({ fields: z.string(), }); +export type TokenizerFormSchemaType = z.infer; + const TokenizerForm = ({ node }: INextOperatorForm) => { const { t } = useTranslation(); const defaultValues = useFormValues(initialTokenizerValues, node); @@ -44,7 +46,7 @@ const TokenizerForm = ({ node }: INextOperatorForm) => { 'dataflow.tokenizerFieldsOptions', ); - const form = useForm>({ + const form = useForm({ defaultValues, resolver: zodResolver(FormSchema), mode: 'onChange',