node-param-handler.tsx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import { IFlowNode, IFlowNodeParameter } from '@/types/flow';
  2. import { InfoCircleOutlined } from '@ant-design/icons';
  3. import { Checkbox, Form, Input, InputNumber, Select } from 'antd';
  4. import React from 'react';
  5. import NodeHandler from './node-handler';
  6. import {
  7. renderCascader,
  8. renderCheckbox,
  9. renderCodeEditor,
  10. renderDatePicker,
  11. renderInput,
  12. renderPassword,
  13. renderRadio,
  14. renderSelect,
  15. renderSlider,
  16. renderTextArea,
  17. renderTimePicker,
  18. renderTreeSelect,
  19. renderUpload,
  20. renderVariables,
  21. } from './node-renderer';
  22. interface NodeParamHandlerProps {
  23. formValuesChange: any;
  24. node: IFlowNode;
  25. paramData: IFlowNodeParameter;
  26. label: 'inputs' | 'outputs' | 'parameters';
  27. index: number; // index of array
  28. }
  29. // render node parameters item
  30. const NodeParamHandler: React.FC<NodeParamHandlerProps> = ({ formValuesChange, node, paramData, label, index }) => {
  31. // render node parameters based on AWEL1.0
  32. function renderNodeWithoutUiParam(data: IFlowNodeParameter) {
  33. let defaultValue = data.value ?? data.default;
  34. switch (data.type_name) {
  35. case 'int':
  36. case 'float':
  37. return (
  38. <Form.Item
  39. className='mb-2 text-sm'
  40. name={data.name}
  41. initialValue={defaultValue}
  42. rules={[{ required: !data.optional }]}
  43. label={<span className='text-neutral-500'>{data.label}</span>}
  44. tooltip={data.description ? { title: data.description, icon: <InfoCircleOutlined /> } : ''}
  45. >
  46. <InputNumber className='w-full nodrag' />
  47. </Form.Item>
  48. );
  49. case 'str':
  50. return (
  51. <Form.Item
  52. className='mb-2 text-sm'
  53. name={data.name}
  54. initialValue={defaultValue}
  55. rules={[{ required: !data.optional }]}
  56. label={<span className='text-neutral-500'>{data.label}</span>}
  57. tooltip={data.description ? { title: data.description, icon: <InfoCircleOutlined /> } : ''}
  58. >
  59. {data.options?.length > 0 ? (
  60. <Select
  61. className='w-full nodrag'
  62. options={data.options.map((item: any) => ({ label: item.label, value: item.value }))}
  63. />
  64. ) : (
  65. <Input className='w-full' />
  66. )}
  67. </Form.Item>
  68. );
  69. case 'bool':
  70. defaultValue = defaultValue === 'False' ? false : defaultValue;
  71. defaultValue = defaultValue === 'True' ? true : defaultValue;
  72. return (
  73. <Form.Item
  74. className='mb-2 text-sm'
  75. name={data.name}
  76. initialValue={defaultValue}
  77. rules={[{ required: !data.optional }]}
  78. label={<span className='text-neutral-500'>{data.label}</span>}
  79. tooltip={data.description ? { title: data.description, icon: <InfoCircleOutlined /> } : ''}
  80. >
  81. <Checkbox className='ml-2' />
  82. </Form.Item>
  83. );
  84. }
  85. }
  86. function renderComponentByType(type: string, data: IFlowNodeParameter, formValuesChange: any) {
  87. switch (type) {
  88. case 'select':
  89. return renderSelect(data);
  90. case 'cascader':
  91. return renderCascader(data);
  92. case 'checkbox':
  93. return renderCheckbox(data);
  94. case 'radio':
  95. return renderRadio(data);
  96. case 'input':
  97. return renderInput(data);
  98. case 'text_area':
  99. return renderTextArea(data);
  100. case 'slider':
  101. return renderSlider(data);
  102. case 'date_picker':
  103. return renderDatePicker({ data, formValuesChange });
  104. case 'time_picker':
  105. return renderTimePicker({ data, formValuesChange });
  106. case 'tree_select':
  107. return renderTreeSelect(data);
  108. case 'password':
  109. return renderPassword(data);
  110. case 'upload':
  111. return renderUpload({ data, formValuesChange });
  112. case 'variables':
  113. return renderVariables(data);
  114. case 'code_editor':
  115. return renderCodeEditor(data);
  116. default:
  117. return null;
  118. }
  119. }
  120. // render node parameters based on AWEL2.0
  121. function renderNodeWithUiParam(data: IFlowNodeParameter, formValuesChange: any) {
  122. const { refresh_depends, ui_type } = data.ui;
  123. let defaultValue = data.value ?? data.default;
  124. if (ui_type === 'slider' && data.is_list) {
  125. defaultValue = [0, 1];
  126. }
  127. return (
  128. <Form.Item
  129. className='mb-2'
  130. initialValue={defaultValue}
  131. name={data.name}
  132. rules={[{ required: !data.optional }]}
  133. label={<span className='text-neutral-500'>{data.label}</span>}
  134. {...(refresh_depends && { dependencies: refresh_depends })}
  135. {...(data.description && { tooltip: { title: data.description, icon: <InfoCircleOutlined /> } })}
  136. >
  137. {renderComponentByType(ui_type, data, formValuesChange)}
  138. </Form.Item>
  139. );
  140. }
  141. if (paramData.category === 'resource') {
  142. return <NodeHandler node={node} data={paramData} type='target' label={label} index={index} />;
  143. } else if (paramData.category === 'common') {
  144. return paramData?.ui ? renderNodeWithUiParam(paramData, formValuesChange) : renderNodeWithoutUiParam(paramData);
  145. }
  146. };
  147. export default NodeParamHandler;