style: optimize code of flow (#1817)

This commit is contained in:
Dreammy23
2024-08-13 11:19:35 +08:00
committed by GitHub
9 changed files with 173 additions and 227 deletions

View File

@@ -5,7 +5,7 @@ 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, RenderSlider, RenderTreeSelect, RenderTimePicker, RenderTextArea, RenderCascader } from './node-renderer'; import { RenderSelect, RenderSlider, RenderTreeSelect, RenderTimePicker, RenderTextArea, RenderCascader } from './node-renderer';
import { uiAtrrtUnderlineToHump } from '@/utils/flow' import { uiAtrrtUnderlineToHump } from '@/utils/flow';
interface NodeParamHandlerProps { interface NodeParamHandlerProps {
node: IFlowNode; node: IFlowNode;
data: IFlowNodeParameter; data: IFlowNodeParameter;
@@ -104,25 +104,20 @@ const NodeParamHandler: React.FC<NodeParamHandlerProps> = ({ node, data, label,
function renderNodeWithUiParam(data: IFlowNodeParameter) { function renderNodeWithUiParam(data: IFlowNodeParameter) {
let defaultValue = data.value !== null && data.value !== undefined ? data.value : data.default; let defaultValue = data.value !== null && data.value !== undefined ? data.value : data.default;
if (data?.ui?.attr) { if (data?.ui?.attr) {
uiAtrrtUnderlineToHump(data.ui.attr) uiAtrrtUnderlineToHump(data.ui.attr);
} }
// TODO: 根据ui_type渲染不同的组件 // TODO: 根据ui_type渲染不同的组件
switch (data?.ui?.ui_type) { switch (data?.ui?.ui_type) {
case 'select': case 'select':
return <RenderSelect data={data} defaultValue={defaultValue} onChange={onChange} />; return <RenderSelect data={data} defaultValue={defaultValue} onChange={onChange} />;
break
case 'text_area': case 'text_area':
return <RenderTextArea data={data} defaultValue={defaultValue} onChange={onChange} />; return <RenderTextArea data={data} defaultValue={defaultValue} onChange={onChange} />;
break
case 'slider': case 'slider':
return <RenderSlider data={data} defaultValue={defaultValue} onChange={onChange} />; return <RenderSlider data={data} defaultValue={defaultValue} onChange={onChange} />;
break
case 'time_picker': case 'time_picker':
return <RenderTimePicker data={data} defaultValue={defaultValue} onChange={onChange} />; return <RenderTimePicker data={data} defaultValue={defaultValue} onChange={onChange} />;
break
case 'tree_select': case 'tree_select':
return <RenderTreeSelect data={data} defaultValue={defaultValue} onChange={onChange} />; return <RenderTreeSelect data={data} defaultValue={defaultValue} onChange={onChange} />;
break
} }
} }
@@ -134,4 +129,3 @@ const NodeParamHandler: React.FC<NodeParamHandlerProps> = ({ node, data, label,
}; };
export default NodeParamHandler; export default NodeParamHandler;

View File

@@ -1,6 +1,6 @@
export * from "./select"; export * from './select';
export * from "./cascader"; export * from './cascader';
export * from "./textarea"; export * from './textarea';
export * from "./slider"; export * from './slider';
export * from "./timePicker"; export * from './timePicker';
export * from "./treeSelect"; export * from './treeSelect';

View File

@@ -1,16 +1,17 @@
import { IFlowNodeParameter } from "@/types/flow"; import { IFlowNodeParameter } from '@/types/flow';
import { Select } from "antd"; import { Select } from 'antd';
type SelectProps = { type SelectProps = {
data: IFlowNodeParameter; data: IFlowNodeParameter;
defaultValue: any; defaultValue: any;
onChange: (value: any) => void; onChange: (value: any) => void;
} };
export const RenderSelect = (params: SelectProps) => { export const RenderSelect = (params: SelectProps) => {
const { data, defaultValue, onChange } = params; const { data, defaultValue, onChange } = params;
return data.options?.length > 0 && ( return (
data.options?.length > 0 && (
<Select <Select
className="w-full nodrag" className="w-full nodrag"
defaultValue={defaultValue} defaultValue={defaultValue}
@@ -18,4 +19,5 @@ export const RenderSelect = (params: SelectProps) => {
onChange={onChange} onChange={onChange}
/> />
) )
} );
};

View File

@@ -1,18 +1,13 @@
import { IFlowNodeParameter } from "@/types/flow"; import { IFlowNodeParameter } from '@/types/flow';
import { Col, InputNumber, Row, Slider, Space } from 'antd'; import { Col, InputNumber, Row, Slider, Space } from 'antd';
import { uiAtrrtUnderlineToHump } from '@/utils/flow'
import type { InputNumberProps } from 'antd'; import type { InputNumberProps } from 'antd';
import React, { useState } from 'react'; import React, { useState } from 'react';
type TextAreaProps = { type TextAreaProps = {
data: IFlowNodeParameter; data: IFlowNodeParameter;
defaultValue: any; defaultValue: any;
onChange: (value: any) => void; onChange: (value: any) => void;
} };
export const RenderSlider = (params: TextAreaProps) => { export const RenderSlider = (params: TextAreaProps) => {
const { data, defaultValue, onChange } = params; const { data, defaultValue, onChange } = params;
@@ -21,33 +16,23 @@ export const RenderSlider = (params: TextAreaProps) => {
const onChangeSlider: InputNumberProps['onChange'] = (newValue) => { const onChangeSlider: InputNumberProps['onChange'] = (newValue) => {
setInputValue(newValue as number); setInputValue(newValue as number);
onChange(newValue as number) onChange(newValue as number);
}; };
return ( return (
<> <>
{data?.ui?.show_input ? <Row> {data?.ui?.show_input ? (
<Row>
<Col span={12}> <Col span={12}>
<Slider <Slider {...data.ui.attr} onChange={onChangeSlider} value={typeof inputValue === 'number' ? inputValue : 0} />
{...data.ui.attr}
onChange={onChangeSlider}
value={typeof inputValue === 'number' ? inputValue : 0}
/>
</Col> </Col>
<Col span={4}> <Col span={4}>
<InputNumber <InputNumber {...data.ui.attr} style={{ margin: '0 16px' }} value={inputValue} onChange={onChangeSlider} />
{...data.ui.attr}
style={{ margin: '0 16px' }}
value={inputValue}
onChange={onChangeSlider}
/>
</Col> </Col>
</Row>: </Row>
<Slider ) : (
{...data.ui.attr} <Slider {...data.ui.attr} onChange={onChangeSlider} value={typeof inputValue === 'number' ? inputValue : 0} />
onChange={onChangeSlider} )}
value={typeof inputValue === 'number' ? inputValue : 0}
/>
}
</> </>
) );
} };

View File

@@ -1,53 +1,36 @@
import { IFlowNodeParameter } from "@/types/flow"; import { IFlowNodeParameter } from '@/types/flow';
import { Col, InputNumber, Row, Slider, Space } from 'antd'; import { Col, InputNumber, Row, Slider, Space } from 'antd';
import { uiAtrrtUnderlineToHump } from '@/utils/flow'
import type { InputNumberProps } from 'antd'; import type { InputNumberProps } from 'antd';
import React, { useState } from 'react'; import React, { useState } from 'react';
type TextAreaProps = { type TextAreaProps = {
data: IFlowNodeParameter; data: IFlowNodeParameter;
defaultValue: any; defaultValue: any;
onChange: (value: any) => void; onChange: (value: any) => void;
} };
export const RenderSlider = (params: TextAreaProps) => { export const RenderSlider = (params: TextAreaProps) => {
const { data, defaultValue, onChange } = params; const { data, defaultValue, onChange } = params;
const [inputValue, setInputValue] = useState(defaultValue); const [inputValue, setInputValue] = useState(defaultValue);
const onChangeSlider: InputNumberProps['onChange'] = (newValue) => { const onChangeSlider: InputNumberProps['onChange'] = (newValue) => {
setInputValue(newValue as number); setInputValue(newValue as number);
onChange(newValue as number) onChange(newValue as number);
}; };
return ( return (
<> <>
{data?.ui?.show_input ? <Row> {data?.ui?.show_input ? (
<Row>
<Col span={12}> <Col span={12}>
<Slider <Slider {...data.ui.attr} onChange={onChangeSlider} value={typeof inputValue === 'number' ? inputValue : 0} />
{...data.ui.attr}
onChange={onChangeSlider}
value={typeof inputValue === 'number' ? inputValue : 0}
/>
</Col> </Col>
<Col span={4}> <Col span={4}>
<InputNumber <InputNumber {...data.ui.attr} style={{ margin: '0 16px' }} value={inputValue} onChange={onChangeSlider} />
{...data.ui.attr}
style={{ margin: '0 16px' }}
value={inputValue}
onChange={onChangeSlider}
/>
</Col> </Col>
</Row>: </Row>
<Slider ) : (
{...data.ui.attr} <Slider {...data.ui.attr} onChange={onChangeSlider} value={typeof inputValue === 'number' ? inputValue : 0} />
onChange={onChangeSlider} )}
value={typeof inputValue === 'number' ? inputValue : 0}
/>
}
</> </>
) );
} };

View File

@@ -1,6 +1,6 @@
import { IFlowNodeParameter } from "@/types/flow"; import { IFlowNodeParameter } from '@/types/flow';
import { Input } from 'antd'; import { Input } from 'antd';
import { uiAtrrtUnderlineToHump } from '@/utils/flow' import { uiAtrrtUnderlineToHump } from '@/utils/flow';
const { TextArea } = Input; const { TextArea } = Input;
@@ -8,15 +8,11 @@ type TextAreaProps = {
data: IFlowNodeParameter; data: IFlowNodeParameter;
defaultValue: any; defaultValue: any;
onChange: (value: any) => void; onChange: (value: any) => void;
} };
export const RenderTextArea = (params: TextAreaProps) => { export const RenderTextArea = (params: TextAreaProps) => {
const { data, defaultValue, onChange } = params; const { data, defaultValue, onChange } = params;
if(data?.ui?.autosize){ uiAtrrtUnderlineToHump(data?.ui?.attr?.autosize || {});
uiAtrrtUnderlineToHump(data.ui.autosize)
} return <TextArea {...data.ui.attr} defaultValue={defaultValue} onChange={(e) => onChange(e.target.value)} {...data.ui.autosize} rows={4} />;
return ( };
<TextArea {...data.ui.attr} defaultValue={defaultValue} onChange={(e) => onChange(e.target.value)} {...data.ui.autosize} rows={4} />
)
}

View File

@@ -1,15 +1,13 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import type { TimePickerProps } from 'antd'; import type { TimePickerProps } from 'antd';
import { TimePicker } from 'antd'; import { TimePicker } from 'antd';
import { IFlowNodeParameter } from '@/types/flow';
import { IFlowNodeParameter } from "@/types/flow";
type TextAreaProps = { type TextAreaProps = {
data: IFlowNodeParameter; data: IFlowNodeParameter;
defaultValue: any; defaultValue: any;
onChange: (value: any) => void; onChange: (value: any) => void;
} };
export const RenderTimePicker = (params: TextAreaProps) => { export const RenderTimePicker = (params: TextAreaProps) => {
const { data, defaultValue, onChange } = params; const { data, defaultValue, onChange } = params;
const [value, setValue] = useState(defaultValue); const [value, setValue] = useState(defaultValue);
@@ -17,18 +15,9 @@ export const RenderTimePicker = (params: TextAreaProps) => {
// dayjs.extend(customParseFormat); // dayjs.extend(customParseFormat);
const onChangeTime: TimePickerProps['onChange'] = (time, timeString) => { const onChangeTime: TimePickerProps['onChange'] = (time, timeString) => {
// console.log(timeString); onChange(timeString);
onChange(timeString) setValue(time);
setValue(time)
}; };
return ( return <TimePicker style={{ width: '100%' }} {...data.ui.attr} value={value} onChange={onChangeTime} />;
<TimePicker };
style={{ width: '100%' }}
{...data.ui.attr} value={value}
onChange={onChangeTime} />
)
}

View File

@@ -1,15 +1,15 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import { TreeSelect } from 'antd'; import { TreeSelect } from 'antd';
import type { TreeSelectProps } from 'antd'; import type { TreeSelectProps } from 'antd';
import { IFlowNodeParameter } from "@/types/flow"; import { IFlowNodeParameter } from '@/types/flow';
import { Label } from '@mui/icons-material'; import { Label } from '@mui/icons-material';
type TextAreaProps = { type TextAreaProps = {
data: IFlowNodeParameter; data: IFlowNodeParameter;
defaultValue: any; defaultValue: any;
onChange: (value: any) => void; onChange: (value: any) => void;
} };
const treeData = [ const treeData = [
{ {
value: 'parent 1', value: 'parent 1',
title: 'parent 1', title: 'parent 1',
@@ -29,7 +29,8 @@ type TextAreaProps = {
{ {
value: 'leaf3', value: 'leaf3',
title: 'leaf3', title: 'leaf3',
}, { },
{
value: 'leaf4', value: 'leaf4',
title: 'leaf4', title: 'leaf4',
}, },
@@ -55,8 +56,8 @@ type TextAreaProps = {
}, },
], ],
}, },
]; ];
export const RenderTreeSelect = (params: TextAreaProps) => { export const RenderTreeSelect = (params: TextAreaProps) => {
const { data, defaultValue, onChange } = params; const { data, defaultValue, onChange } = params;
// console.log(data.options); // console.log(data.options);
// const [value, setValue] = useState<string>(); // const [value, setValue] = useState<string>();
@@ -66,15 +67,17 @@ type TextAreaProps = {
// }; // };
const [dropdownVisible, setDropdownVisible] = useState(false); const [dropdownVisible, setDropdownVisible] = useState(false);
const handleDropdownVisibleChange = (visible) => { const handleDropdownVisibleChange = (visible: boolean | ((prevState: boolean) => boolean)) => {
setDropdownVisible(visible); setDropdownVisible(visible);
// 你可以在这里执行更多的逻辑,比如发送请求、更新状态等 // 你可以在这里执行更多的逻辑,比如发送请求、更新状态等
console.log('Dropdown is now:', visible ? 'visible' : 'hidden'); console.log('Dropdown is now:', visible ? 'visible' : 'hidden');
}; };
const focuss = ()=>{
console.log('focus==========');
} const focus = () => {
// console.log('focus==========');
};
return ( return (
<TreeSelect <TreeSelect
fieldNames={{ label: 'label', value: 'value', children: 'children' }} fieldNames={{ label: 'label', value: 'value', children: 'children' }}
@@ -85,9 +88,9 @@ type TextAreaProps = {
onChange={onChange} onChange={onChange}
treeData={data.options} treeData={data.options}
onDropdownVisibleChange={handleDropdownVisibleChange} onDropdownVisibleChange={handleDropdownVisibleChange}
/> />
// TODO: Implement the TreeSelect component
// <TreeSelect // <TreeSelect
// showSearch // showSearch
// style={{ width: '100%' }} // style={{ width: '100%' }}
@@ -101,4 +104,4 @@ type TextAreaProps = {
// getPopupContainer={() => document.body} // getPopupContainer={() => document.body}
// /> // />
); );
} };

View File

@@ -58,12 +58,6 @@ export type IFlowNodeParameterUI = {
disabled: boolean; disabled: boolean;
[key: string]: any; [key: string]: any;
}; };
autosize: {
minRows: number;
maxRows: number;
min_rows: number;
max_rows: number;
};
show_input: boolean; show_input: boolean;
}; };