Commit 0743b8cb by zhaochengxiang

任务增加connection

parent 9345649c
import React, { useEffect, useState } from 'react'; import React, { useEffect, useMemo, useState } from 'react';
import { Modal, Checkbox, Row, Col, Divider, Input, Typography, Form, Switch, Select } from 'antd'; import { Modal, Checkbox, Row, Col, Divider, Input, Typography, Form, Switch } from 'antd';
import { dispatch } from '../../../../model'; import { dispatch } from '../../../../model';
const MultiSelect = ({ value = '', data = [], onChange, ...restProps }) => { const MultiSelect = ({ title, data = [], selectedData = [], onChange }) => {
const [ keyword, setKeyword ] = useState('');
const [ checkAllValue, setCheckAllValue ] = useState(false);
const onSelectChange = (value) => { const filterData = useMemo(() => {
onChange((value||[]).join(',')); return (data||[]).filter(item => (item||'').indexOf(keyword)!==-1);
}, [keyword, data])
const onSearchInputChange = (e) => {
setKeyword(e.target.value||'');
} }
return ( const onCheckChange = (e) => {
<Select let newSelectedData = [];
mode="multiple" if (e.target.checked) {
value={value?value.split(','):[]} newSelectedData = [...selectedData, e.target.value];
onChange={onSelectChange} } else {
allowClear newSelectedData = [...selectedData];
style={{ width: '100%' }} const index = newSelectedData.findIndex(key => key === e.target.value);
{...restProps} newSelectedData.splice(index, 1)
> }
{
(data||[]).map((item, index) => { onChange?.(newSelectedData)
return ( }
<Select.Option key={item}>{item}</Select.Option>
); const onCheckAll =(checked)=>{
}) setCheckAllValue(checked);
let newSelectedData = [];
if (checked) {
newSelectedData = Array.from(new Set([...selectedData, ...filterData]));;
} else {
newSelectedData = selectedData.filter(item=>!filterData.includes(item));
} }
</Select>
onChange?.(newSelectedData);
}
return (
<div>
<Divider>{`${title}信息`}</Divider>
<div className='d-flex mb-3' style={{ alignItems: 'center' }}>
<span className='mr-3'>{`${title}搜索`}:</span>
<Input
placeholder={`请输入${title}名称`}
allowClear
value={keyword}
onChange={onSearchInputChange}
style={{ width: 230 }}
/>
<Switch
checkedChildren="全不选"
unCheckedChildren="全选"
checked={ checkAllValue }
onChange={ onCheckAll }
style={{ marginLeft: 'auto' }}
/>
</div>
<div style={{ maxHeight: 300, overflow: 'auto' }}>
<Row className='mb-3'>
{
(filterData||[]).map((item, index) => {
return (
<Col className='mt-1' key={index} md={8}>
<div className='d-flex'>
<Checkbox checked={ selectedData.indexOf(item)!==-1 } value={item||''} onChange={onCheckChange} >
</Checkbox>
<Typography.Paragraph className='ml-1' title={item||''} ellipsis>
{item||''}
</Typography.Paragraph>
</div>
</Col>
);
})
}
</Row>
</div>
</div>
) )
} }
const UpdateTaskModal = (props) => { const UpdateTaskModal = (props) => {
const { visible, onCancel, action, id, datasourceId,currentDatabase } = props; const { visible, onCancel, action, id, datasourceId,currentDatabase } = props;
const [ schemas, setSchemas ] = useState([]);
const [ filterSchemas, setFilterSchemas ] = useState([]);
const [ selectedSchemas, setSelectedSchemas ] = useState([]); const [ selectedSchemas, setSelectedSchemas ] = useState([]);
const [ selectedConnections, setSelectedConnections ] = useState([]);
const [ taskSettings, setTaskSettings ] = useState({}); const [ taskSettings, setTaskSettings ] = useState({});
const [ currentTask, setCurrentTask ] = useState({}); const [ currentTask, setCurrentTask ] = useState({});
const [ keyword, setKeyword ] = useState('');
const [ confirmLoading, setConfirmLoading ] = useState(false); const [ confirmLoading, setConfirmLoading ] = useState(false);
const [ checkAllValue, setCheckAllValue ] = useState(false);
const [ form ] = Form.useForm(); const [ form ] = Form.useForm();
...@@ -58,10 +110,6 @@ const UpdateTaskModal = (props) => { ...@@ -58,10 +110,6 @@ const UpdateTaskModal = (props) => {
//eslint-disable-next-line react-hooks/exhaustive-deps //eslint-disable-next-line react-hooks/exhaustive-deps
}, [visible, action, id, datasourceId]) }, [visible, action, id, datasourceId])
useEffect(() => {
setFilterSchemas((schemas||[]).filter(schema => (schema||'').indexOf(keyword)!==-1));
}, [keyword, schemas])
const getTask = () => { const getTask = () => {
dispatch({ dispatch({
type: 'datasource.getTask', type: 'datasource.getTask',
...@@ -84,12 +132,13 @@ const UpdateTaskModal = (props) => { ...@@ -84,12 +132,13 @@ const UpdateTaskModal = (props) => {
callback: data => { callback: data => {
setTaskSettings(data); setTaskSettings(data);
let recentSchemas = []; let recentSchemas = [], recentConnections = [];
data && (data.targetConfParameters||[]).forEach(item => { data && (data.targetConfParameters||[]).forEach(item => {
if (item.name === 'schema') { if (item.name === 'schema') {
setSchemas(item.selectItem||[]);
recentSchemas = item.selectItem||[]; recentSchemas = item.selectItem||[];
} else if (item.name === 'connection') {
recentConnections = item.selectItem||[];
} }
}) })
...@@ -99,6 +148,8 @@ const UpdateTaskModal = (props) => { ...@@ -99,6 +148,8 @@ const UpdateTaskModal = (props) => {
task && (task.targetConfParameters||[]).forEach(item => { task && (task.targetConfParameters||[]).forEach(item => {
if (item.name === 'schema') { if (item.name === 'schema') {
setSelectedSchemas((item.value||'').split(',').filter(value=> recentSchemas.indexOf(value)!==-1)); setSelectedSchemas((item.value||'').split(',').filter(value=> recentSchemas.indexOf(value)!==-1));
} else if (item.name === 'connection') {
setSelectedConnections((item.value||'').split(',').filter(value=> recentConnections.indexOf(value)!==-1));
} else { } else {
_fieldsValue[item.name||''] = item.value||''; _fieldsValue[item.name||''] = item.value||'';
} }
...@@ -110,6 +161,10 @@ const UpdateTaskModal = (props) => { ...@@ -110,6 +161,10 @@ const UpdateTaskModal = (props) => {
}) })
} }
const onMultiChange = (value, type) => {
(type === 'schema') ? setSelectedSchemas(value) : setSelectedConnections(value);
}
const onOk = async() => { const onOk = async() => {
try { try {
const row = await form.validateFields(); const row = await form.validateFields();
...@@ -124,6 +179,8 @@ const UpdateTaskModal = (props) => { ...@@ -124,6 +179,8 @@ const UpdateTaskModal = (props) => {
newTask && (newTask.targetConfParameters||[]).forEach(item => { newTask && (newTask.targetConfParameters||[]).forEach(item => {
if (item.name === 'schema') { if (item.name === 'schema') {
item.value = selectedSchemas.join(','); item.value = selectedSchemas.join(',');
} else if (item.name === 'connection') {
item.value = selectedConnections.join(',');
} else { } else {
item.value = row[item.name]||''; item.value = row[item.name]||'';
} }
...@@ -150,40 +207,12 @@ const UpdateTaskModal = (props) => { ...@@ -150,40 +207,12 @@ const UpdateTaskModal = (props) => {
} }
const reset = () => { const reset = () => {
setSchemas([]);
setSelectedSchemas([]); setSelectedSchemas([]);
setSelectedConnections([]);
setTaskSettings({}); setTaskSettings({});
setKeyword('');
setCheckAllValue(false);
form.resetFields(); form.resetFields();
} }
const onSearchInputChange = (e) => {
setKeyword(e.target.value||'');
}
const onCheckAll =(checked)=>{
setCheckAllValue(checked);
if (checked) {
const _newSelectedSchemas = Array.from(new Set([...selectedSchemas, ...filterSchemas]));;
setSelectedSchemas(_newSelectedSchemas);
} else {
setSelectedSchemas(selectedSchemas.filter(schema=>!filterSchemas.includes(schema)));
}
}
const onCheckChange = (e) => {
if (e.target.checked) {
setSelectedSchemas([...selectedSchemas, e.target.value]);
} else {
const index = selectedSchemas.findIndex(key => key === e.target.value);
selectedSchemas.splice(index, 1)
setSelectedSchemas([...selectedSchemas]);
}
}
const formItemLayout = { const formItemLayout = {
labelCol: { labelCol: {
xs: { span: 24 }, xs: { span: 24 },
...@@ -205,48 +234,33 @@ const UpdateTaskModal = (props) => { ...@@ -205,48 +234,33 @@ const UpdateTaskModal = (props) => {
onCancel={() => { onCancel && onCancel() }} onCancel={() => { onCancel && onCancel() }}
onOk={onOk} onOk={onOk}
confirmLoading={confirmLoading} confirmLoading={confirmLoading}
> >
<Divider>{(currentDatabase?.type==="Neo4jTarget")?'neo4j数据库信息':'schema信息'}</Divider> {
<div className='d-flex mb-3' style={{ alignItems: 'center' }}> taskSettings && (taskSettings.targetConfParameters||[]).map((param, index) => {
<span className='mr-3'>{(currentDatabase?.type==="Neo4jTarget")?'neo4j数据库搜索':'schema搜索'}:</span> if (param.name === 'schema' || param.name === 'connection') {
<Input let title = 'connection';
placeholder={`请输入${(currentDatabase?.type==="Neo4jTarget")?'neo4j数据库':'schema'}名称`} if (param.name === 'schema') {
allowClear title = (currentDatabase?.type==="Neo4jTarget")?'neo4j数据库':'schema';
value={keyword} }
onChange={onSearchInputChange}
style={{ width: 230 }} return <MultiSelect
/> key={index}
<Switch title={title}
checkedChildren="全不选" data={param.selectItem}
unCheckedChildren="全选" selectedData={param.name === 'schema'?selectedSchemas:selectedConnections}
checked={ checkAllValue } onChange={(value) => { onMultiChange(value, param.name); }}
onChange={ onCheckAll } />
style={{ marginLeft: 'auto' }} }
/>
</div> return <></>;
<div style={{ maxHeight: 300, overflow: 'auto' }}> })
<Row className='mb-3'> }
{
(filterSchemas||[]).map((schema, index) => {
return (
<Col className='mt-1' key={index} md={8}>
<div className='d-flex'>
<Checkbox checked={ selectedSchemas.indexOf(schema)!==-1 } value={schema||''} onChange={onCheckChange} >
</Checkbox>
<Typography.Paragraph className='ml-1' title={schema||''} ellipsis>
{schema||''}
</Typography.Paragraph>
</div>
</Col>
);
})
}
</Row>
</div>
<Divider>过滤信息</Divider> <Divider>过滤信息</Divider>
<Form {...formItemLayout} form={form}> <Form {...formItemLayout} form={form}>
{ {
taskSettings && (taskSettings.targetConfParameters||[]).filter(item => item.name!=='schema').map((param, index) => { taskSettings && (taskSettings.targetConfParameters||[]).map((param, index) => {
if (param.name === 'schema' || param.name === 'connection') return <></>;
return ( return (
<Form.Item <Form.Item
label={param.cnName||''} label={param.cnName||''}
...@@ -255,8 +269,7 @@ const UpdateTaskModal = (props) => { ...@@ -255,8 +269,7 @@ const UpdateTaskModal = (props) => {
rules={[{ required: param.required, message: '必填项'}]} rules={[{ required: param.required, message: '必填项'}]}
> >
{ {
(param.selectMode==='multiSelect') ? <MultiSelect data={param.selectItem} placeholder={param.explain||''} /> ( param.show ? <Input placeholder={param.explain||''} /> : <Input.Password placeholder={param.explain||''} visibilityToggle={false} /> )
: ( param.show ? <Input placeholder={param.explain||''} /> : <Input.Password placeholder={param.explain||''} visibilityToggle={false} /> )
} }
</Form.Item> </Form.Item>
) )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment