feat: Build options for the component id field of the Switch operator #1739 (#2037)

### What problem does this PR solve?

feat: Build options for the component id field of the Switch operator
#1739

### Type of change


- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
balibabu 2024-08-21 17:15:24 +08:00 committed by GitHub
parent 6c26872799
commit 9b3f5fd38b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 59 additions and 47 deletions

View File

@ -1,6 +1,6 @@
<svg t="1724034437425" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1567" <svg t="1724229849879" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4299"
width="200" height="200"> width="200" height="200">
<path <path
d="M128 522.666667c17.066667 0 32-14.933333 32-32v-170.666667c0-6.4 4.266667-10.666667 10.666667-10.666667h652.8l-83.2 83.2c-12.8 12.8-12.8 34.133333 0 46.933334 6.4 6.4 14.933333 10.666667 23.466666 10.666666s17.066667-4.266667 23.466667-10.666666l145.066667-145.066667c12.8-12.8 12.8-34.133333 0-46.933333l-145.066667-145.066667c-12.8-12.8-34.133333-12.8-46.933333 0-12.8 12.8-12.8 34.133333 0 46.933333l93.866666 93.866667H170.666667c-40.533333 0-74.666667 34.133333-74.666667 74.666667v170.666666c0 19.2 14.933333 34.133333 32 34.133334zM906.666667 501.333333c-17.066667 0-32 14.933333-32 32v170.666667c0 6.4-4.266667 10.666667-10.666667 10.666667H211.2l83.2-83.2c12.8-12.8 12.8-34.133333 0-46.933334-12.8-12.8-34.133333-12.8-46.933333 0l-145.066667 145.066667c-12.8 12.8-12.8 34.133333 0 46.933333l145.066667 145.066667c6.4 6.4 14.933333 10.666667 23.466666 10.666667s17.066667-4.266667 23.466667-10.666667c12.8-12.8 12.8-34.133333 0-46.933333l-93.866667-93.866667h663.466667c40.533333 0 74.666667-34.133333 74.666667-74.666667v-170.666666c0-19.2-12.8-34.133333-32-34.133334z" d="M128 522.666667c17.066667 0 32-14.933333 32-32v-170.666667c0-6.4 4.266667-10.666667 10.666667-10.666667h652.8l-83.2 83.2c-12.8 12.8-12.8 34.133333 0 46.933334 6.4 6.4 14.933333 10.666667 23.466666 10.666666s17.066667-4.266667 23.466667-10.666666l145.066667-145.066667c12.8-12.8 12.8-34.133333 0-46.933333l-145.066667-145.066667c-12.8-12.8-34.133333-12.8-46.933333 0-12.8 12.8-12.8 34.133333 0 46.933333l93.866666 93.866667H170.666667c-40.533333 0-74.666667 34.133333-74.666667 74.666667v170.666666c0 19.2 14.933333 34.133333 32 34.133334zM906.666667 501.333333c-17.066667 0-32 14.933333-32 32v170.666667c0 6.4-4.266667 10.666667-10.666667 10.666667H211.2l83.2-83.2c12.8-12.8 12.8-34.133333 0-46.933334-12.8-12.8-34.133333-12.8-46.933333 0l-145.066667 145.066667c-12.8 12.8-12.8 34.133333 0 46.933333l145.066667 145.066667c6.4 6.4 14.933333 10.666667 23.466666 10.666667s17.066667-4.266667 23.466667-10.666667c12.8-12.8 12.8-34.133333 0-46.933333l-93.866667-93.866667h663.466667c40.533333 0 74.666667-34.133333 74.666667-74.666667v-170.666666c0-19.2-12.8-34.133333-32-34.133334z"
fill="#666666" p-id="1568"></path> fill="#3b76f4" p-id="4300"></path>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -603,7 +603,7 @@ The above is the content you need to summarize.`,
yes: 'Yes', yes: 'Yes',
no: 'No', no: 'No',
key: 'key', key: 'key',
componentId: 'component id', componentId: 'Component ID',
add: 'Add', add: 'Add',
operation: 'operation', operation: 'operation',
run: 'Run', run: 'Run',
@ -637,6 +637,7 @@ The above is the content you need to summarize.`,
blank: 'Blank', blank: 'Blank',
createFromNothing: 'Create from nothing', createFromNothing: 'Create from nothing',
addItem: 'Add Item', addItem: 'Add Item',
addSubItem: 'Add Sub Item',
nameRequiredMsg: 'Name is required', nameRequiredMsg: 'Name is required',
nameRepeatedMsg: 'The name cannot be repeated', nameRepeatedMsg: 'The name cannot be repeated',
keywordExtract: 'Keyword', keywordExtract: 'Keyword',
@ -833,6 +834,8 @@ The above is the content you need to summarize.`,
and: 'And', and: 'And',
or: 'Or', or: 'Or',
}, },
operator: 'Operator',
value: 'Value',
}, },
footer: { footer: {
profile: 'All rights reserved @ React', profile: 'All rights reserved @ React',

View File

@ -597,6 +597,7 @@ export default {
blank: '空', blank: '空',
createFromNothing: '從無到有', createFromNothing: '從無到有',
addItem: '新增', addItem: '新增',
addSubItem: '新增子項',
nameRequiredMsg: '名稱不能為空', nameRequiredMsg: '名稱不能為空',
nameRepeatedMsg: '名稱不能重複', nameRepeatedMsg: '名稱不能重複',
keywordExtract: '關鍵字', keywordExtract: '關鍵字',
@ -791,6 +792,8 @@ export default {
and: '與', and: '與',
or: '或', or: '或',
}, },
operator: '操作符',
value: '值',
}, },
footer: { footer: {
profile: '“保留所有權利 @ react”', profile: '“保留所有權利 @ react”',

View File

@ -615,6 +615,7 @@ export default {
blank: '空', blank: '空',
createFromNothing: '从无到有', createFromNothing: '从无到有',
addItem: '新增', addItem: '新增',
addSubItem: '新增子项',
nameRequiredMsg: '名称不能为空', nameRequiredMsg: '名称不能为空',
nameRepeatedMsg: '名称不能重复', nameRepeatedMsg: '名称不能重复',
keywordExtract: '关键词', keywordExtract: '关键词',
@ -809,6 +810,8 @@ export default {
and: '与', and: '与',
or: '或', or: '或',
}, },
operator: '操作符',
value: '值',
}, },
footer: { footer: {
profile: 'All rights reserved @ React', profile: 'All rights reserved @ React',

View File

@ -45,8 +45,8 @@ export function RelevantNode({ id, data, selected }: NodeProps<NodeData>) {
className={styles.handle} className={styles.handle}
id={'c'} id={'c'}
></Handle> ></Handle>
<CategorizeHandle top={20} right={6} text={'yes'}></CategorizeHandle> <CategorizeHandle top={20} right={6} id={'yes'}></CategorizeHandle>
<CategorizeHandle top={80} right={6} text={'no'}></CategorizeHandle> <CategorizeHandle top={80} right={6} id={'no'}></CategorizeHandle>
<Flex vertical align="center" justify="center" gap={0}> <Flex vertical align="center" justify="center" gap={0}>
<Flex flex={1}> <Flex flex={1}>
<OperatorIcon <OperatorIcon

View File

@ -97,7 +97,7 @@ export const operatorMap: Record<
fontSize?: number; fontSize?: number;
iconFontSize?: number; iconFontSize?: number;
iconWidth?: number; iconWidth?: number;
moreIconColor?: number; moreIconColor?: string;
} }
> = { > = {
[Operator.Retrieval]: { [Operator.Retrieval]: {

View File

@ -4,10 +4,8 @@ import { DeleteOutlined } from '@ant-design/icons';
import { Button, Flex, Select, Table, TableProps } from 'antd'; import { Button, Flex, Select, Table, TableProps } from 'antd';
import { IGenerateParameter } from '../interface'; import { IGenerateParameter } from '../interface';
import { import { useBuildComponentIdSelectOptions } from '../hooks';
useBuildComponentIdSelectOptions, import { useHandleOperateParameters } from './hooks';
useHandleOperateParameters,
} from './hooks';
import styles from './index.less'; import styles from './index.less';
interface IProps { interface IProps {

View File

@ -1,33 +1,9 @@
import get from 'lodash/get'; import get from 'lodash/get';
import { useCallback, useMemo } from 'react'; import { useCallback, useMemo } from 'react';
import { v4 as uuid } from 'uuid'; import { v4 as uuid } from 'uuid';
import { Operator } from '../constant';
import { IGenerateParameter } from '../interface'; import { IGenerateParameter } from '../interface';
import useGraphStore from '../store'; import useGraphStore from '../store';
// exclude nodes with branches
const ExcludedNodes = [
Operator.Categorize,
Operator.Relevant,
Operator.Begin,
Operator.Answer,
];
export const useBuildComponentIdSelectOptions = (nodeId?: string) => {
const nodes = useGraphStore((state) => state.nodes);
const options = useMemo(() => {
return nodes
.filter(
(x) =>
x.id !== nodeId && !ExcludedNodes.some((y) => y === x.data.label),
)
.map((x) => ({ label: x.data.name, value: x.id }));
}, [nodes, nodeId]);
return options;
};
export const useHandleOperateParameters = (nodeId: string) => { export const useHandleOperateParameters = (nodeId: string) => {
const { getNode, updateNodeForm } = useGraphStore((state) => state); const { getNode, updateNodeForm } = useGraphStore((state) => state);
const node = getNode(nodeId); const node = getNode(nodeId);

View File

@ -563,3 +563,26 @@ export const useWatchNodeFormDataChange = () => {
buildSwitchEdgesByFormData, buildSwitchEdgesByFormData,
]); ]);
}; };
// exclude nodes with branches
const ExcludedNodes = [
Operator.Categorize,
Operator.Relevant,
Operator.Begin,
Operator.Answer,
];
export const useBuildComponentIdSelectOptions = (nodeId?: string) => {
const nodes = useGraphStore((state) => state.nodes);
const options = useMemo(() => {
return nodes
.filter(
(x) =>
x.id !== nodeId && !ExcludedNodes.some((y) => y === x.data.label),
)
.map((x) => ({ label: x.data.name, value: x.id }));
}, [nodes, nodeId]);
return options;
};

View File

@ -9,15 +9,16 @@ import {
SwitchOperatorOptions, SwitchOperatorOptions,
} from '../constant'; } from '../constant';
import { useBuildFormSelectOptions } from '../form-hooks'; import { useBuildFormSelectOptions } from '../form-hooks';
import { useBuildComponentIdSelectOptions } from '../hooks';
import { IOperatorForm, ISwitchForm } from '../interface'; import { IOperatorForm, ISwitchForm } from '../interface';
import { getOtherFieldValues } from '../utils'; import { getOtherFieldValues } from '../utils';
const subLabelCol = { const subLabelCol = {
span: 7, span: 9,
}; };
const subWrapperCol = { const subWrapperCol = {
span: 17, span: 15,
}; };
const SwitchForm = ({ onValuesChange, node, form }: IOperatorForm) => { const SwitchForm = ({ onValuesChange, node, form }: IOperatorForm) => {
@ -48,10 +49,12 @@ const SwitchForm = ({ onValuesChange, node, form }: IOperatorForm) => {
})); }));
}, [t]); }, [t]);
const componentIdOptions = useBuildComponentIdSelectOptions(node?.id);
return ( return (
<Form <Form
labelCol={{ span: 8 }} labelCol={{ span: 4 }}
wrapperCol={{ span: 16 }} wrapperCol={{ span: 20 }}
form={form} form={form}
name="dynamic_form_complex" name="dynamic_form_complex"
autoComplete="off" autoComplete="off"
@ -102,7 +105,7 @@ const SwitchForm = ({ onValuesChange, node, form }: IOperatorForm) => {
])} ])}
/> />
</Form.Item> </Form.Item>
<Form.Item label="Items"> <Form.Item label=" " colon={false}>
<Form.List name={[field.name, 'items']}> <Form.List name={[field.name, 'items']}>
{(subFields, subOpt) => ( {(subFields, subOpt) => (
<div <div
@ -126,31 +129,34 @@ const SwitchForm = ({ onValuesChange, node, form }: IOperatorForm) => {
} }
> >
<Form.Item <Form.Item
label={'cpn_id'} label={t('flow.componentId')}
name={[subField.name, 'cpn_id']} name={[subField.name, 'cpn_id']}
labelCol={subLabelCol} labelCol={subLabelCol}
wrapperCol={subWrapperCol} wrapperCol={subWrapperCol}
> >
<Input placeholder="cpn_id" /> <Select
placeholder={t('flow.componentId')}
options={componentIdOptions}
/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
label={'operator'} label={t('flow.operator')}
name={[subField.name, 'operator']} name={[subField.name, 'operator']}
labelCol={subLabelCol} labelCol={subLabelCol}
wrapperCol={subWrapperCol} wrapperCol={subWrapperCol}
> >
<Select <Select
placeholder="operator" placeholder={t('flow.operator')}
options={switchOperatorOptions} options={switchOperatorOptions}
/> />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
label={'value'} label={t('flow.value')}
name={[subField.name, 'value']} name={[subField.name, 'value']}
labelCol={subLabelCol} labelCol={subLabelCol}
wrapperCol={subWrapperCol} wrapperCol={subWrapperCol}
> >
<Input placeholder="value" /> <Input placeholder={t('flow.value')} />
</Form.Item> </Form.Item>
</Card> </Card>
))} ))}
@ -159,7 +165,7 @@ const SwitchForm = ({ onValuesChange, node, form }: IOperatorForm) => {
onClick={() => subOpt.add()} onClick={() => subOpt.add()}
block block
> >
+ Add Sub Item + {t('flow.addSubItem')}
</Button> </Button>
</div> </div>
)} )}
@ -169,7 +175,7 @@ const SwitchForm = ({ onValuesChange, node, form }: IOperatorForm) => {
))} ))}
<Button type="dashed" onClick={() => add()} block> <Button type="dashed" onClick={() => add()} block>
+ Add Item + {t('flow.addItem')}
</Button> </Button>
</div> </div>
)} )}