mirror of
https://github.com/csunny/DB-GPT.git
synced 2025-09-13 21:21:08 +00:00
feat: 编排画布新增基于AWEL2.0的Select类型节点渲染
This commit is contained in:
@@ -4,6 +4,7 @@ import React from 'react';
|
|||||||
import RequiredIcon from './required-icon';
|
import RequiredIcon from './required-icon';
|
||||||
import NodeHandler from './node-handler';
|
import NodeHandler from './node-handler';
|
||||||
import { InfoCircleOutlined } from '@ant-design/icons';
|
import { InfoCircleOutlined } from '@ant-design/icons';
|
||||||
|
import { RenderSelect, RenderCascader } from './node-renderer';
|
||||||
|
|
||||||
interface NodeParamHandlerProps {
|
interface NodeParamHandlerProps {
|
||||||
node: IFlowNode;
|
node: IFlowNode;
|
||||||
@@ -14,14 +15,14 @@ interface NodeParamHandlerProps {
|
|||||||
|
|
||||||
// render node parameters item
|
// render node parameters item
|
||||||
const NodeParamHandler: React.FC<NodeParamHandlerProps> = ({ node, data, label, index }) => {
|
const NodeParamHandler: React.FC<NodeParamHandlerProps> = ({ node, data, label, index }) => {
|
||||||
function handleChange(value: any) {
|
function onChange(value: any) {
|
||||||
data.value = value;
|
data.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.category === 'resource') {
|
// 基于AWEL1.0的流程设计器,对节点参数的渲染
|
||||||
return <NodeHandler node={node} data={data} type="target" label={label} index={index} />;
|
function renderNodeWithoutUiParam(data: IFlowNodeParameter) {
|
||||||
} else if (data.category === 'common') {
|
|
||||||
let defaultValue = data.value !== null && data.value !== undefined ? data.value : data.default;
|
let defaultValue = data.value !== null && data.value !== undefined ? data.value : data.default;
|
||||||
|
|
||||||
switch (data.type_name) {
|
switch (data.type_name) {
|
||||||
case 'int':
|
case 'int':
|
||||||
case 'float':
|
case 'float':
|
||||||
@@ -39,7 +40,7 @@ const NodeParamHandler: React.FC<NodeParamHandlerProps> = ({ node, data, label,
|
|||||||
className="w-full"
|
className="w-full"
|
||||||
defaultValue={defaultValue}
|
defaultValue={defaultValue}
|
||||||
onChange={(value: number | null) => {
|
onChange={(value: number | null) => {
|
||||||
handleChange(value);
|
onChange(value);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@@ -60,20 +61,20 @@ const NodeParamHandler: React.FC<NodeParamHandlerProps> = ({ node, data, label,
|
|||||||
className="w-full nodrag"
|
className="w-full nodrag"
|
||||||
defaultValue={defaultValue}
|
defaultValue={defaultValue}
|
||||||
options={data.options.map((item: any) => ({ label: item.label, value: item.value }))}
|
options={data.options.map((item: any) => ({ label: item.label, value: item.value }))}
|
||||||
onChange={handleChange}
|
onChange={onChange}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<Input
|
<Input
|
||||||
className="w-full"
|
className="w-full"
|
||||||
defaultValue={defaultValue}
|
defaultValue={defaultValue}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
handleChange(e.target.value);
|
onChange(e.target.value);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
case 'bool':
|
case 'checkbox':
|
||||||
defaultValue = defaultValue === 'False' ? false : defaultValue;
|
defaultValue = defaultValue === 'False' ? false : defaultValue;
|
||||||
defaultValue = defaultValue === 'True' ? true : defaultValue;
|
defaultValue = defaultValue === 'True' ? true : defaultValue;
|
||||||
return (
|
return (
|
||||||
@@ -89,7 +90,7 @@ const NodeParamHandler: React.FC<NodeParamHandlerProps> = ({ node, data, label,
|
|||||||
className="ml-2"
|
className="ml-2"
|
||||||
defaultChecked={defaultValue}
|
defaultChecked={defaultValue}
|
||||||
onChange={(e) => {
|
onChange={(e) => {
|
||||||
handleChange(e.target.checked);
|
onChange(e.target.checked);
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</p>
|
</p>
|
||||||
@@ -97,6 +98,23 @@ const NodeParamHandler: React.FC<NodeParamHandlerProps> = ({ node, data, label,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 基于AWEL2.0的流程设计器,对节点参数的渲染
|
||||||
|
function renderNodeWithUiParam(data: IFlowNodeParameter) {
|
||||||
|
let defaultValue = data.value !== null && data.value !== undefined ? data.value : data.default;
|
||||||
|
|
||||||
|
// TODO: 根据ui_type渲染不同的组件
|
||||||
|
switch (data?.ui?.ui_type) {
|
||||||
|
case 'select':
|
||||||
|
return <RenderSelect data={data} defaultValue={defaultValue} onChange={onChange} />;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.category === 'resource') {
|
||||||
|
return <NodeHandler node={node} data={data} type="target" label={label} index={index} />;
|
||||||
|
} else if (data.category === 'common') {
|
||||||
|
return data?.ui ? renderNodeWithUiParam(data) : renderNodeWithoutUiParam(data);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export default NodeParamHandler;
|
export default NodeParamHandler;
|
||||||
|
3
web/components/flow/node-renderer/cascader.tsx
Normal file
3
web/components/flow/node-renderer/cascader.tsx
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import { IFlowNodeParameter } from '@/types/flow';
|
||||||
|
|
||||||
|
export const RenderCascader = (props: IFlowNodeParameter) => {};
|
2
web/components/flow/node-renderer/index.ts
Normal file
2
web/components/flow/node-renderer/index.ts
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export * from "./select";
|
||||||
|
export * from "./cascader";
|
21
web/components/flow/node-renderer/select.tsx
Normal file
21
web/components/flow/node-renderer/select.tsx
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import { IFlowNodeParameter } from "@/types/flow";
|
||||||
|
import { Select } from "antd";
|
||||||
|
|
||||||
|
type SelectProps = {
|
||||||
|
data: IFlowNodeParameter;
|
||||||
|
defaultValue: any;
|
||||||
|
onChange: (value: any) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const RenderSelect = (params: SelectProps) => {
|
||||||
|
const { data, defaultValue, onChange } = params;
|
||||||
|
|
||||||
|
return data.options?.length > 0 && (
|
||||||
|
<Select
|
||||||
|
className="w-full nodrag"
|
||||||
|
defaultValue={defaultValue}
|
||||||
|
options={data.options.map((item: any) => ({ label: item.label, value: item.value }))}
|
||||||
|
onChange={onChange}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
@@ -49,6 +49,15 @@ export type IFlowNodeParameter = {
|
|||||||
options?: any;
|
options?: any;
|
||||||
value: any;
|
value: any;
|
||||||
is_list?: boolean;
|
is_list?: boolean;
|
||||||
|
ui: IFlowNodeParameterUI;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type IFlowNodeParameterUI = {
|
||||||
|
ui_type: string;
|
||||||
|
attr: {
|
||||||
|
disabled: boolean;
|
||||||
|
[key: string]: any;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
export type IFlowNodeInput = {
|
export type IFlowNodeInput = {
|
||||||
|
Reference in New Issue
Block a user