balibabu
commited on
Commit
·
de9090d
1
Parent(s):
4d5d480
feat: Add input parameter to begin operator #3355 (#3375)
Browse files### What problem does this PR solve?
feat: Add input parameter to begin operator #3355
### Type of change
- [x] New Feature (non-breaking change which adds functionality)
- web/src/hooks/logic-hooks.ts +21 -0
- web/src/pages/flow/constant.tsx +20 -0
- web/src/pages/flow/form/begin-form/begin-dynamic-options.tsx +68 -0
- web/src/pages/flow/form/begin-form/hooks.ts +50 -0
- web/src/pages/flow/form/begin-form/index.tsx +91 -17
- web/src/pages/flow/form/begin-form/paramater-modal.tsx +113 -0
- web/src/pages/flow/form/begin-form/query-table.tsx +71 -0
- web/src/pages/flow/interface.ts +9 -0
web/src/hooks/logic-hooks.ts
CHANGED
@@ -557,3 +557,24 @@ export const useHandleChunkMethodSelectChange = (form: FormInstance) => {
|
|
557 |
|
558 |
return handleChange;
|
559 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
557 |
|
558 |
return handleChange;
|
559 |
};
|
560 |
+
|
561 |
+
// reset form fields when modal is form, closed
|
562 |
+
export const useResetFormOnCloseModal = ({
|
563 |
+
form,
|
564 |
+
visible,
|
565 |
+
}: {
|
566 |
+
form: FormInstance;
|
567 |
+
visible?: boolean;
|
568 |
+
}) => {
|
569 |
+
const prevOpenRef = useRef<boolean>();
|
570 |
+
useEffect(() => {
|
571 |
+
prevOpenRef.current = visible;
|
572 |
+
}, [visible]);
|
573 |
+
const prevOpen = prevOpenRef.current;
|
574 |
+
|
575 |
+
useEffect(() => {
|
576 |
+
if (!visible && prevOpen) {
|
577 |
+
form.resetFields();
|
578 |
+
}
|
579 |
+
}, [form, prevOpen, visible]);
|
580 |
+
};
|
web/src/pages/flow/constant.tsx
CHANGED
@@ -2859,3 +2859,23 @@ export const TuShareSrcOptions = [
|
|
2859 |
'jinrongjie',
|
2860 |
];
|
2861 |
export const CrawlerResultOptions = ['markdown', 'html', 'content'];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2859 |
'jinrongjie',
|
2860 |
];
|
2861 |
export const CrawlerResultOptions = ['markdown', 'html', 'content'];
|
2862 |
+
|
2863 |
+
export enum BeginQueryType {
|
2864 |
+
Line = 'line',
|
2865 |
+
Paragraph = 'paragraph',
|
2866 |
+
Options = 'options',
|
2867 |
+
File = 'file',
|
2868 |
+
Integer = 'integer',
|
2869 |
+
Boolean = 'boolean',
|
2870 |
+
Url = 'url',
|
2871 |
+
}
|
2872 |
+
|
2873 |
+
export const BeginQueryTypeMap = {
|
2874 |
+
[BeginQueryType.Line]: 'input',
|
2875 |
+
[BeginQueryType.Paragraph]: 'textarea',
|
2876 |
+
[BeginQueryType.Options]: 'select',
|
2877 |
+
[BeginQueryType.File]: 'file',
|
2878 |
+
[BeginQueryType.Integer]: 'inputnumber',
|
2879 |
+
[BeginQueryType.Boolean]: 'switch',
|
2880 |
+
[BeginQueryType.Url]: 'input',
|
2881 |
+
};
|
web/src/pages/flow/form/begin-form/begin-dynamic-options.tsx
ADDED
@@ -0,0 +1,68 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons';
|
2 |
+
import { Button, Form, Input } from 'antd';
|
3 |
+
|
4 |
+
const BeginDynamicOptions = () => {
|
5 |
+
return (
|
6 |
+
<Form.List
|
7 |
+
name="options"
|
8 |
+
rules={[
|
9 |
+
{
|
10 |
+
validator: async (_, names) => {
|
11 |
+
if (!names || names.length < 1) {
|
12 |
+
return Promise.reject(new Error('At least 1 option'));
|
13 |
+
}
|
14 |
+
},
|
15 |
+
},
|
16 |
+
]}
|
17 |
+
>
|
18 |
+
{(fields, { add, remove }, { errors }) => (
|
19 |
+
<>
|
20 |
+
{fields.map((field, index) => (
|
21 |
+
<Form.Item
|
22 |
+
label={index === 0 ? 'Options' : ''}
|
23 |
+
required={false}
|
24 |
+
key={field.key}
|
25 |
+
>
|
26 |
+
<Form.Item
|
27 |
+
{...field}
|
28 |
+
validateTrigger={['onChange', 'onBlur']}
|
29 |
+
rules={[
|
30 |
+
{
|
31 |
+
required: true,
|
32 |
+
whitespace: true,
|
33 |
+
message: 'Please input option or delete this field.',
|
34 |
+
},
|
35 |
+
]}
|
36 |
+
noStyle
|
37 |
+
>
|
38 |
+
<Input
|
39 |
+
placeholder="option"
|
40 |
+
style={{ width: '90%', marginRight: 16 }}
|
41 |
+
/>
|
42 |
+
</Form.Item>
|
43 |
+
{fields.length > 1 ? (
|
44 |
+
<MinusCircleOutlined
|
45 |
+
className="dynamic-delete-button"
|
46 |
+
onClick={() => remove(field.name)}
|
47 |
+
/>
|
48 |
+
) : null}
|
49 |
+
</Form.Item>
|
50 |
+
))}
|
51 |
+
<Form.Item>
|
52 |
+
<Button
|
53 |
+
type="dashed"
|
54 |
+
onClick={() => add()}
|
55 |
+
icon={<PlusOutlined />}
|
56 |
+
block
|
57 |
+
>
|
58 |
+
Add field
|
59 |
+
</Button>
|
60 |
+
<Form.ErrorList errors={errors} />
|
61 |
+
</Form.Item>
|
62 |
+
</>
|
63 |
+
)}
|
64 |
+
</Form.List>
|
65 |
+
);
|
66 |
+
};
|
67 |
+
|
68 |
+
export default BeginDynamicOptions;
|
web/src/pages/flow/form/begin-form/hooks.ts
ADDED
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { useSetModalState } from '@/hooks/common-hooks';
|
2 |
+
import { useSetSelectedRecord } from '@/hooks/logic-hooks';
|
3 |
+
import { useCallback, useMemo, useState } from 'react';
|
4 |
+
import { BeginQuery, IOperatorForm } from '../../interface';
|
5 |
+
|
6 |
+
export const useEditQueryRecord = ({ form, onValuesChange }: IOperatorForm) => {
|
7 |
+
const { setRecord, currentRecord } = useSetSelectedRecord<BeginQuery>();
|
8 |
+
const { visible, hideModal, showModal } = useSetModalState();
|
9 |
+
const [index, setIndex] = useState(-1);
|
10 |
+
|
11 |
+
const otherThanCurrentQuery = useMemo(() => {
|
12 |
+
const query: BeginQuery[] = form?.getFieldValue('query') || [];
|
13 |
+
return query.filter((item, idx) => idx !== index);
|
14 |
+
}, [form, index]);
|
15 |
+
|
16 |
+
const handleEditRecord = useCallback(
|
17 |
+
(record: BeginQuery) => {
|
18 |
+
const query: BeginQuery[] = form?.getFieldValue('query') || [];
|
19 |
+
|
20 |
+
const nextQuery: BeginQuery[] =
|
21 |
+
index > -1 ? query.toSpliced(index, 1, record) : [...query, record];
|
22 |
+
|
23 |
+
onValuesChange?.(
|
24 |
+
{ query: nextQuery },
|
25 |
+
{ query: nextQuery, prologue: form?.getFieldValue('prologue') },
|
26 |
+
);
|
27 |
+
hideModal();
|
28 |
+
},
|
29 |
+
[form, hideModal, index, onValuesChange],
|
30 |
+
);
|
31 |
+
|
32 |
+
const handleShowModal = useCallback(
|
33 |
+
(idx?: number, record?: BeginQuery) => {
|
34 |
+
setIndex(idx ?? -1);
|
35 |
+
setRecord(record ?? ({} as BeginQuery));
|
36 |
+
showModal();
|
37 |
+
},
|
38 |
+
[setRecord, showModal],
|
39 |
+
);
|
40 |
+
|
41 |
+
return {
|
42 |
+
ok: handleEditRecord,
|
43 |
+
currentRecord,
|
44 |
+
setRecord,
|
45 |
+
visible,
|
46 |
+
hideModal,
|
47 |
+
showModal: handleShowModal,
|
48 |
+
otherThanCurrentQuery,
|
49 |
+
};
|
50 |
+
};
|
web/src/pages/flow/form/begin-form/index.tsx
CHANGED
@@ -1,6 +1,10 @@
|
|
1 |
import { useTranslate } from '@/hooks/common-hooks';
|
2 |
-
import { Form, Input } from 'antd';
|
3 |
-
import {
|
|
|
|
|
|
|
|
|
4 |
|
5 |
type FieldType = {
|
6 |
prologue?: string;
|
@@ -8,25 +12,95 @@ type FieldType = {
|
|
8 |
|
9 |
const BeginForm = ({ onValuesChange, form }: IOperatorForm) => {
|
10 |
const { t } = useTranslate('chat');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
|
12 |
return (
|
13 |
-
<Form
|
14 |
-
name
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
form={form}
|
20 |
>
|
21 |
-
<Form
|
22 |
-
name=
|
23 |
-
|
24 |
-
|
25 |
-
|
|
|
26 |
>
|
27 |
-
<
|
28 |
-
|
29 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
);
|
31 |
};
|
32 |
|
|
|
1 |
import { useTranslate } from '@/hooks/common-hooks';
|
2 |
+
import { Button, Form, Input } from 'antd';
|
3 |
+
import { useCallback } from 'react';
|
4 |
+
import { BeginQuery, IOperatorForm } from '../../interface';
|
5 |
+
import { useEditQueryRecord } from './hooks';
|
6 |
+
import { ModalForm } from './paramater-modal';
|
7 |
+
import QueryTable from './query-table';
|
8 |
|
9 |
type FieldType = {
|
10 |
prologue?: string;
|
|
|
12 |
|
13 |
const BeginForm = ({ onValuesChange, form }: IOperatorForm) => {
|
14 |
const { t } = useTranslate('chat');
|
15 |
+
const {
|
16 |
+
ok,
|
17 |
+
currentRecord,
|
18 |
+
visible,
|
19 |
+
hideModal,
|
20 |
+
showModal,
|
21 |
+
otherThanCurrentQuery,
|
22 |
+
} = useEditQueryRecord({
|
23 |
+
form,
|
24 |
+
onValuesChange,
|
25 |
+
});
|
26 |
+
|
27 |
+
const handleDeleteRecord = useCallback(
|
28 |
+
(idx: number) => {
|
29 |
+
const query = form?.getFieldValue('query') || [];
|
30 |
+
const nextQuery = query.filter(
|
31 |
+
(item: BeginQuery, index: number) => index !== idx,
|
32 |
+
);
|
33 |
+
onValuesChange?.(
|
34 |
+
{ query: nextQuery },
|
35 |
+
{ query: nextQuery, prologue: form?.getFieldValue('prologue') },
|
36 |
+
);
|
37 |
+
},
|
38 |
+
[form, onValuesChange],
|
39 |
+
);
|
40 |
|
41 |
return (
|
42 |
+
<Form.Provider
|
43 |
+
onFormFinish={(name, { values }) => {
|
44 |
+
if (name === 'queryForm') {
|
45 |
+
ok(values as BeginQuery);
|
46 |
+
}
|
47 |
+
}}
|
|
|
48 |
>
|
49 |
+
<Form
|
50 |
+
name="basicForm"
|
51 |
+
onValuesChange={onValuesChange}
|
52 |
+
autoComplete="off"
|
53 |
+
form={form}
|
54 |
+
layout="vertical"
|
55 |
>
|
56 |
+
<Form.Item<FieldType>
|
57 |
+
name={'prologue'}
|
58 |
+
label={t('setAnOpener')}
|
59 |
+
tooltip={t('setAnOpenerTip')}
|
60 |
+
initialValue={t('setAnOpenerInitial')}
|
61 |
+
>
|
62 |
+
<Input.TextArea autoSize={{ minRows: 5 }} />
|
63 |
+
</Form.Item>
|
64 |
+
{/* Create a hidden field to make Form instance record this */}
|
65 |
+
<Form.Item name="query" noStyle />
|
66 |
+
|
67 |
+
<Form.Item
|
68 |
+
label="Query List"
|
69 |
+
shouldUpdate={(prevValues, curValues) =>
|
70 |
+
prevValues.query !== curValues.query
|
71 |
+
}
|
72 |
+
>
|
73 |
+
{({ getFieldValue }) => {
|
74 |
+
const query: BeginQuery[] = getFieldValue('query') || [];
|
75 |
+
return (
|
76 |
+
<QueryTable
|
77 |
+
data={query}
|
78 |
+
showModal={showModal}
|
79 |
+
deleteRecord={handleDeleteRecord}
|
80 |
+
></QueryTable>
|
81 |
+
);
|
82 |
+
}}
|
83 |
+
</Form.Item>
|
84 |
+
|
85 |
+
<Button
|
86 |
+
htmlType="button"
|
87 |
+
style={{ margin: '0 8px' }}
|
88 |
+
onClick={() => showModal()}
|
89 |
+
block
|
90 |
+
>
|
91 |
+
Add +
|
92 |
+
</Button>
|
93 |
+
{visible && (
|
94 |
+
<ModalForm
|
95 |
+
visible={visible}
|
96 |
+
hideModal={hideModal}
|
97 |
+
initialValue={currentRecord}
|
98 |
+
onOk={ok}
|
99 |
+
otherThanCurrentQuery={otherThanCurrentQuery}
|
100 |
+
/>
|
101 |
+
)}
|
102 |
+
</Form>
|
103 |
+
</Form.Provider>
|
104 |
);
|
105 |
};
|
106 |
|
web/src/pages/flow/form/begin-form/paramater-modal.tsx
ADDED
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { useResetFormOnCloseModal } from '@/hooks/logic-hooks';
|
2 |
+
import { IModalProps } from '@/interfaces/common';
|
3 |
+
import { Form, Input, Modal, Select, Switch } from 'antd';
|
4 |
+
import { DefaultOptionType } from 'antd/es/select';
|
5 |
+
import { useEffect, useMemo } from 'react';
|
6 |
+
import { BeginQueryType } from '../../constant';
|
7 |
+
import { BeginQuery } from '../../interface';
|
8 |
+
import BeginDynamicOptions from './begin-dynamic-options';
|
9 |
+
|
10 |
+
export const ModalForm = ({
|
11 |
+
visible,
|
12 |
+
initialValue,
|
13 |
+
hideModal,
|
14 |
+
otherThanCurrentQuery,
|
15 |
+
}: IModalProps<BeginQuery> & {
|
16 |
+
initialValue: BeginQuery;
|
17 |
+
otherThanCurrentQuery: BeginQuery[];
|
18 |
+
}) => {
|
19 |
+
const [form] = Form.useForm();
|
20 |
+
const options = useMemo(() => {
|
21 |
+
return Object.values(BeginQueryType).reduce<DefaultOptionType[]>(
|
22 |
+
(pre, cur) => {
|
23 |
+
return [
|
24 |
+
...pre,
|
25 |
+
{
|
26 |
+
label: cur,
|
27 |
+
value: cur,
|
28 |
+
},
|
29 |
+
];
|
30 |
+
},
|
31 |
+
[],
|
32 |
+
);
|
33 |
+
}, []);
|
34 |
+
|
35 |
+
useResetFormOnCloseModal({
|
36 |
+
form,
|
37 |
+
visible: visible,
|
38 |
+
});
|
39 |
+
|
40 |
+
useEffect(() => {
|
41 |
+
form.setFieldsValue(initialValue);
|
42 |
+
}, [form, initialValue]);
|
43 |
+
|
44 |
+
const onOk = () => {
|
45 |
+
form.submit();
|
46 |
+
};
|
47 |
+
|
48 |
+
return (
|
49 |
+
<Modal
|
50 |
+
title="Begin query"
|
51 |
+
open={visible}
|
52 |
+
onOk={onOk}
|
53 |
+
onCancel={hideModal}
|
54 |
+
centered
|
55 |
+
>
|
56 |
+
<Form form={form} layout="vertical" name="queryForm" autoComplete="false">
|
57 |
+
<Form.Item
|
58 |
+
name="type"
|
59 |
+
label="Type"
|
60 |
+
rules={[{ required: true }]}
|
61 |
+
initialValue={BeginQueryType.Line}
|
62 |
+
>
|
63 |
+
<Select options={options} />
|
64 |
+
</Form.Item>
|
65 |
+
<Form.Item
|
66 |
+
name="key"
|
67 |
+
label="Key"
|
68 |
+
rules={[
|
69 |
+
{ required: true },
|
70 |
+
() => ({
|
71 |
+
validator(_, value) {
|
72 |
+
if (
|
73 |
+
!value ||
|
74 |
+
!otherThanCurrentQuery.some((x) => x.key === value)
|
75 |
+
) {
|
76 |
+
return Promise.resolve();
|
77 |
+
}
|
78 |
+
return Promise.reject(new Error('The key cannot be repeated!'));
|
79 |
+
},
|
80 |
+
}),
|
81 |
+
]}
|
82 |
+
>
|
83 |
+
<Input />
|
84 |
+
</Form.Item>
|
85 |
+
<Form.Item name="name" label="Name" rules={[{ required: true }]}>
|
86 |
+
<Input />
|
87 |
+
</Form.Item>
|
88 |
+
<Form.Item
|
89 |
+
name="optional"
|
90 |
+
label={'Optional'}
|
91 |
+
valuePropName="checked"
|
92 |
+
initialValue={false}
|
93 |
+
>
|
94 |
+
<Switch />
|
95 |
+
</Form.Item>
|
96 |
+
<Form.Item
|
97 |
+
shouldUpdate={(prevValues, curValues) =>
|
98 |
+
prevValues.type !== curValues.type
|
99 |
+
}
|
100 |
+
>
|
101 |
+
{({ getFieldValue }) => {
|
102 |
+
const type: BeginQueryType = getFieldValue('type');
|
103 |
+
return (
|
104 |
+
type === BeginQueryType.Options && (
|
105 |
+
<BeginDynamicOptions></BeginDynamicOptions>
|
106 |
+
)
|
107 |
+
);
|
108 |
+
}}
|
109 |
+
</Form.Item>
|
110 |
+
</Form>
|
111 |
+
</Modal>
|
112 |
+
);
|
113 |
+
};
|
web/src/pages/flow/form/begin-form/query-table.tsx
ADDED
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { DeleteOutlined, EditOutlined } from '@ant-design/icons';
|
2 |
+
import type { TableProps } from 'antd';
|
3 |
+
import { Space, Table, Tooltip } from 'antd';
|
4 |
+
import { BeginQuery } from '../../interface';
|
5 |
+
|
6 |
+
interface IProps {
|
7 |
+
data: BeginQuery[];
|
8 |
+
deleteRecord(index: number): void;
|
9 |
+
showModal(index: number, record: BeginQuery): void;
|
10 |
+
}
|
11 |
+
|
12 |
+
const QueryTable = ({ data, deleteRecord, showModal }: IProps) => {
|
13 |
+
const columns: TableProps<BeginQuery>['columns'] = [
|
14 |
+
{
|
15 |
+
title: 'Key',
|
16 |
+
dataIndex: 'key',
|
17 |
+
key: 'key',
|
18 |
+
ellipsis: {
|
19 |
+
showTitle: false,
|
20 |
+
},
|
21 |
+
render: (key) => (
|
22 |
+
<Tooltip placement="topLeft" title={key}>
|
23 |
+
{key}
|
24 |
+
</Tooltip>
|
25 |
+
),
|
26 |
+
},
|
27 |
+
{
|
28 |
+
title: 'Name',
|
29 |
+
dataIndex: 'name',
|
30 |
+
key: 'name',
|
31 |
+
ellipsis: {
|
32 |
+
showTitle: false,
|
33 |
+
},
|
34 |
+
render: (name) => (
|
35 |
+
<Tooltip placement="topLeft" title={name}>
|
36 |
+
{name}
|
37 |
+
</Tooltip>
|
38 |
+
),
|
39 |
+
},
|
40 |
+
{
|
41 |
+
title: 'Type',
|
42 |
+
dataIndex: 'type',
|
43 |
+
key: 'type',
|
44 |
+
},
|
45 |
+
{
|
46 |
+
title: 'Optional',
|
47 |
+
dataIndex: 'optional',
|
48 |
+
key: 'optional',
|
49 |
+
render: (optional) => (optional ? 'Yes' : 'No'),
|
50 |
+
},
|
51 |
+
{
|
52 |
+
title: 'Action',
|
53 |
+
key: 'action',
|
54 |
+
render: (_, record, idx) => (
|
55 |
+
<Space>
|
56 |
+
<EditOutlined onClick={() => showModal(idx, record)} />
|
57 |
+
<DeleteOutlined
|
58 |
+
className="cursor-pointer"
|
59 |
+
onClick={() => deleteRecord(idx)}
|
60 |
+
/>
|
61 |
+
</Space>
|
62 |
+
),
|
63 |
+
},
|
64 |
+
];
|
65 |
+
|
66 |
+
return (
|
67 |
+
<Table<BeginQuery> columns={columns} dataSource={data} pagination={false} />
|
68 |
+
);
|
69 |
+
};
|
70 |
+
|
71 |
+
export default QueryTable;
|
web/src/pages/flow/interface.ts
CHANGED
@@ -100,3 +100,12 @@ export type NodeData = {
|
|
100 |
};
|
101 |
|
102 |
export type IPosition = { top: number; right: number; idx: number };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
100 |
};
|
101 |
|
102 |
export type IPosition = { top: number; right: number; idx: number };
|
103 |
+
|
104 |
+
export interface BeginQuery {
|
105 |
+
key: string;
|
106 |
+
type: string;
|
107 |
+
value: string;
|
108 |
+
optional: boolean;
|
109 |
+
name: string;
|
110 |
+
options: (number | string | boolean)[];
|
111 |
+
}
|