From 5193c3e606e6c30f47836ecbd97a9461334b9fd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A8=E6=AC=A3?= Date: Mon, 12 Aug 2024 22:35:33 +0800 Subject: [PATCH 1/2] feat: add some atomic components to flow --- web/components/flow/node-param-handler.tsx | 20 +++++++++++--- .../flow/node-renderer/cascader.tsx | 24 ++++++++++++++++- .../flow/node-renderer/checkbox.tsx | 26 +++++++++++++++++++ .../flow/node-renderer/data-picker.tsx | 17 ++++++++++++ web/components/flow/node-renderer/index.ts | 8 ++++-- web/components/flow/node-renderer/input.tsx | 25 ++++++++++++++++++ web/components/flow/node-renderer/radio.tsx | 25 ++++++++++++++++++ web/components/flow/node-renderer/select.tsx | 22 +++++++++------- web/package.json | 1 + web/utils/flow.ts | 16 ++++++++++++ web/yarn.lock | 5 ++++ 11 files changed, 173 insertions(+), 16 deletions(-) create mode 100644 web/components/flow/node-renderer/checkbox.tsx create mode 100644 web/components/flow/node-renderer/data-picker.tsx create mode 100644 web/components/flow/node-renderer/input.tsx create mode 100644 web/components/flow/node-renderer/radio.tsx diff --git a/web/components/flow/node-param-handler.tsx b/web/components/flow/node-param-handler.tsx index efa3cc67a..ab16ecc07 100644 --- a/web/components/flow/node-param-handler.tsx +++ b/web/components/flow/node-param-handler.tsx @@ -4,7 +4,7 @@ import React from 'react'; import RequiredIcon from './required-icon'; import NodeHandler from './node-handler'; import { InfoCircleOutlined } from '@ant-design/icons'; -import { RenderSelect, RenderCascader } from './node-renderer'; +import { RenderSelect, RenderCheckbox, RenderRadio, RenderCascader, RenderDataPicker, RenderInput } from './node-renderer'; interface NodeParamHandlerProps { node: IFlowNode; @@ -101,12 +101,24 @@ const NodeParamHandler: React.FC = ({ node, data, label, // render node parameters based on AWEL2.0 function renderNodeWithUiParam(data: IFlowNodeParameter) { - let defaultValue = data.value !== null && data.value !== undefined ? data.value : data.default; + let defaultValue = data.value ?? data.default; + const props = { data, defaultValue, onChange }; - // TODO: 根据ui_type渲染不同的组件 switch (data?.ui?.ui_type) { case 'select': - return ; + return ; + case 'cascader': + return ; + case 'checkbox': + return ; + case 'radio': + return ; + case 'data_picker': + return ; + case 'input': + return ; + default: + return null; } } diff --git a/web/components/flow/node-renderer/cascader.tsx b/web/components/flow/node-renderer/cascader.tsx index 605105a93..b7b9c4a9f 100644 --- a/web/components/flow/node-renderer/cascader.tsx +++ b/web/components/flow/node-renderer/cascader.tsx @@ -1,3 +1,25 @@ import { IFlowNodeParameter } from '@/types/flow'; +import { convertKeysToCamelCase } from '@/utils/flow'; +import { Cascader } from 'antd'; -export const RenderCascader = (props: IFlowNodeParameter) => {}; +type Props = { + data: IFlowNodeParameter; + defaultValue: any; + onChange: (value: any) => void; +}; + +export const RenderCascader = (params: Props) => { + const { data, defaultValue, onChange } = params; + const attr = convertKeysToCamelCase(data.ui?.attr || {}); + + return ( + + ); +}; diff --git a/web/components/flow/node-renderer/checkbox.tsx b/web/components/flow/node-renderer/checkbox.tsx new file mode 100644 index 000000000..194005982 --- /dev/null +++ b/web/components/flow/node-renderer/checkbox.tsx @@ -0,0 +1,26 @@ +import { IFlowNodeParameter } from '@/types/flow'; +import { convertKeysToCamelCase } from '@/utils/flow'; +import { Checkbox } from 'antd'; + +type Props = { + data: IFlowNodeParameter; + defaultValue: any; + onChange: (value: any) => void; +}; + +export const RenderCheckbox = (params: Props) => { + const { data, defaultValue, onChange } = params; + const attr = convertKeysToCamelCase(data.ui?.attr || {}); + + return ( + data.options?.length > 0 && ( + + ) + ); +}; diff --git a/web/components/flow/node-renderer/data-picker.tsx b/web/components/flow/node-renderer/data-picker.tsx new file mode 100644 index 000000000..69f18d78f --- /dev/null +++ b/web/components/flow/node-renderer/data-picker.tsx @@ -0,0 +1,17 @@ +import { IFlowNodeParameter } from '@/types/flow'; +import { convertKeysToCamelCase } from '@/utils/flow'; +import { DatePicker } from 'antd'; +import dayjs from 'dayjs'; + +type Props = { + data: IFlowNodeParameter; + defaultValue: any; + onChange: (value: any) => void; +}; + +export const RenderDataPicker = (params: Props) => { + const { data, defaultValue, onChange } = params; + const attr = convertKeysToCamelCase(data.ui?.attr || {}); + + return ; +}; diff --git a/web/components/flow/node-renderer/index.ts b/web/components/flow/node-renderer/index.ts index d9d116497..b3d2a6b7e 100644 --- a/web/components/flow/node-renderer/index.ts +++ b/web/components/flow/node-renderer/index.ts @@ -1,2 +1,6 @@ -export * from "./select"; -export * from "./cascader"; \ No newline at end of file +export * from './select'; +export * from './cascader'; +export * from './data-picker'; +export * from './input'; +export * from './checkbox'; +export * from './radio'; diff --git a/web/components/flow/node-renderer/input.tsx b/web/components/flow/node-renderer/input.tsx new file mode 100644 index 000000000..b6f1f5052 --- /dev/null +++ b/web/components/flow/node-renderer/input.tsx @@ -0,0 +1,25 @@ +import { IFlowNodeParameter } from '@/types/flow'; +import { convertKeysToCamelCase } from '@/utils/flow'; +import { Input } from 'antd'; + +type Props = { + data: IFlowNodeParameter; + defaultValue: any; + onChange: (value: any) => void; +}; + +export const RenderInput = (params: Props) => { + const { data, defaultValue, onChange } = params; + const attr = convertKeysToCamelCase(data.ui?.attr || {}); + + return ( + { + onChange(e.target.value); + }} + /> + ); +}; diff --git a/web/components/flow/node-renderer/radio.tsx b/web/components/flow/node-renderer/radio.tsx new file mode 100644 index 000000000..4b5a1a194 --- /dev/null +++ b/web/components/flow/node-renderer/radio.tsx @@ -0,0 +1,25 @@ +import { IFlowNodeParameter } from '@/types/flow'; +import { convertKeysToCamelCase } from '@/utils/flow'; +import { Radio } from 'antd'; + +type Props = { + data: IFlowNodeParameter; + defaultValue: any; + onChange: (value: any) => void; +}; + +export const RenderRadio = (params: Props) => { + const { data, defaultValue, onChange } = params; + const attr = convertKeysToCamelCase(data.ui?.attr || {}); + + return ( + { + onChange(e.target.checked); + }} + defaultValue={defaultValue} + /> + ); +}; diff --git a/web/components/flow/node-renderer/select.tsx b/web/components/flow/node-renderer/select.tsx index 897d18522..0752d6959 100644 --- a/web/components/flow/node-renderer/select.tsx +++ b/web/components/flow/node-renderer/select.tsx @@ -1,21 +1,25 @@ -import { IFlowNodeParameter } from "@/types/flow"; -import { Select } from "antd"; +import { IFlowNodeParameter } from '@/types/flow'; +import { Select } from 'antd'; +import { convertKeysToCamelCase } from '@/utils/flow'; -type SelectProps = { +type Props = { data: IFlowNodeParameter; defaultValue: any; onChange: (value: any) => void; -} +}; -export const RenderSelect = (params: SelectProps) => { +export const RenderSelect = (params: Props) => { const { data, defaultValue, onChange } = params; + const attr = convertKeysToCamelCase(data.ui?.attr || {}); - return data.options?.length > 0 && ( + return (