Browse Source

修复若干bug

zhuth 7 years ago
parent
commit
cc02e8aa96

+ 39 - 15
src/components/chart/list.jsx

@@ -45,12 +45,13 @@ class ChartList extends React.Component {
 
     generateCard() {
         const { chart, dispatch } = this.props;
+        const groupList = chart.groupList;
         const { selectedRecord } = this.state;
         const list = chart.list;
+        const currentGroup = chart.currentGroup;
 
         const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符
         let filterLabel = chart.filterLabel.replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1'); // 添加转义符号
-        console.log(chart.filterLabel,filterLabel);
 
         const operationMenu = (
             <Menu className='menu-operation'>
@@ -65,8 +66,22 @@ class ChartList extends React.Component {
                 </Menu.Item>
             </Menu>
         )
+        
+        let groupFilter = groupList.concat({ code: 'all', label: '全部分组' }).filter(g => (
+            currentGroup[0].code === 'all' || 
+            (
+                currentGroup[0].code === 'nogroup' ? g.code === 'all' : (
+                    currentGroup[1] ? (g.code === currentGroup[1].code) : 
+                    (
+                        g.code === currentGroup[0].code ||
+                        g.pcode === currentGroup[0].code
+                    )
+                )
+            )
+        )).map(g => g.code);
+
 
-        let cards = list.filter(l => {
+        let cards = list.filter(l => groupFilter.indexOf(l.groupCode+'') !== -1).filter(l => {
             let reg = new RegExp('(' + filterLabel + '){1}', 'ig');
             return l.name.search(reg) !== -1 || l.description.search(reg) !== -1;
         }).sort((a, b) => {
@@ -146,20 +161,25 @@ class ChartList extends React.Component {
     createGroupMenu = (selectedRecord) => {
         const { chart, dispatch } = this.props;
         const groupList = chart.groupList;
-        const parent = groupList.filter(d => d.pcode === '-1').sort((a, b) => a.index - b.index);
-        const children = groupList.filter(d => d.pcode !== '-1');
+        const pGroups = groupList.filter(d => d.pcode === '-1').sort((a, b) => a.index - b.index);
+        const cGroups = groupList.filter(d => d.pcode !== '-1');
 
-        parent.unshift({
-            code: 'all',
-            label: '全部分组'
-        });
-        return parent.map(p => {
-            let c = children.filter(c => c.pcode === p.code).sort((a, b) => a.index - b.index);
+        let allGroups = selectedRecord ? pGroups : [
+            { code: 'all', label: '全部分组' },
+            { code: 'nogroup', label: '未分组' }
+        ].concat(pGroups);
+
+        return allGroups.map(p => {
+            let c = cGroups.filter(c => c.pcode === p.code).sort((a, b) => a.index - b.index);
             return c.length > 0 ? (
-                <Menu.SubMenu key={p.code} title={<span style={{ fontWeight: chart.currentGroup[0].code === p.code ? 'bold' : 'normal' }}>{p.label}</span>} onTitleClick={(item) => {
+                <Menu.SubMenu key={p.code} title={<span style={{ fontWeight: selectedRecord ? (
+                    (p.code+'' === selectedRecord.groupCode+'' ? 'bold' : (
+                        c.find(ch => ch.code+'' === selectedRecord.groupCode+'') && c.find(ch => ch.code+'' === selectedRecord.groupCode+'').pcode === p.code ? 'bold' : 'normal'
+                    ))
+                ) : chart.currentGroup[0].code === p.code ? 'bold' : 'normal' }}>{p.label}</span>} onTitleClick={(item) => {
                     dispatch({ type: 'chart/setCurrentGroup', group1: p });
                     if(selectedRecord) {
-                        dispatch({ type: 'chart/remoteSetGroup', chart: selectedRecord, group: p });
+                        dispatch({ type: 'chart/remoteSetChartGroup', chart: selectedRecord, group: p });
                     }
                     this.hideGroupMenu();
                 }}>
@@ -167,16 +187,20 @@ class ChartList extends React.Component {
                         return (<Menu.Item key={c.code} onClick={(item) => {
                             dispatch({ type: 'chart/setCurrentGroup', group1: p, group2: c });
                             if(selectedRecord) {
-                                dispatch({ type: 'chart/remoteSetGroup', chart: selectedRecord, group: p });
+                                dispatch({ type: 'chart/remoteSetChartGroup', chart: selectedRecord, group: p });
                             }
-                        }}><span style={{ fontWeight: chart.currentGroup[1] && (chart.currentGroup[1].code === c.code) ? 'bold' : 'normal' }}>{c.label}</span></Menu.Item>)
+                        }}><span style={{ fontWeight: selectedRecord ? (
+                            selectedRecord.groupCode+'' === c.code+'' ? 'bold' : 'normal'
+                        ) : (chart.currentGroup[1] && (chart.currentGroup[1].code === c.code) ? 'bold' : 'normal') }}>{c.label}</span></Menu.Item>)
                     })}
                 </Menu.SubMenu>
             ) : (
                 <Menu.Item key={p.code} onClick={() => {
                     dispatch({ type: 'chart/setCurrentGroup', group1: p });
                     this.hideGroupMenu();
-                }}><span style={{ fontWeight: chart.currentGroup[0] && (chart.currentGroup[0].code === p.code) ? 'bold' : 'normal' }}>{p.label}</span></Menu.Item>
+                }}><span style={{ fontWeight: selectedRecord ? (
+                    selectedRecord.groupCode+'' === p.code+'' ? 'bold' : 'normal'
+                ) : chart.currentGroup[0] && (chart.currentGroup[0].code === p.code) ? 'bold' : 'normal' }}>{p.label}</span></Menu.Item>
             );
         });
     }

+ 42 - 18
src/components/chartDesigner/sections/dataViewConfigForm.jsx

@@ -1,5 +1,5 @@
 import React from 'react'
-import { Form, Select, InputNumber  } from 'antd'
+import { Form, Select, Cascader } from 'antd'
 import { connect } from 'dva'
 const FormItem = Form.Item
 const { Option } = Select
@@ -11,21 +11,10 @@ class DataViewConfigForm extends React.Component {
         
 		return (
             <Form layout='horizontal'>
-				<FormItem label='分析目标' {...formItemLayout}>
-					<Select
-						value={chartDesigner.dataViewConfig.targetColumn}
-						onChange={(value) => {
-							dispatch({ type: 'chartDesigner/changeField', name: 'dataViewConfig', value: { ...chartDesigner.dataViewConfig, targetColumn: value }});
-						}}
-					>
-						{columns.filter(c => c.type === 'scale').map((c, i)=>{
-							return <Option key={i} value={c.name}>{c.label}</Option>
-						})}
-					</Select>
-				</FormItem>
 				<FormItem label="展示列" {...formItemLayout}>
 					<Select
 						mode='multiple'
+						allowClear
 						value={chartDesigner.dataViewConfig.viewColumns}
 						onChange={(value) => {
 							dispatch({ type: 'chartDesigner/changeField', name: 'dataViewConfig', value: { ...chartDesigner.dataViewConfig, viewColumns: value }});
@@ -36,11 +25,46 @@ class DataViewConfigForm extends React.Component {
 						})}
 					</Select>
 				</FormItem>
-				<FormItem label='最大显示行数' {...formItemLayout}>
-					<InputNumber min={1} precision={0} value={chartDesigner.dataViewConfig.maxRows} onChange={(e) => {
-						console.log(e);
-					}}>
-					</InputNumber >
+				<FormItem label='排序列' {...formItemLayout}>
+					<Cascader
+						value={[chartDesigner.dataViewConfig.sortColumn.value, chartDesigner.barConfig.xAxis.granularity.value]}
+						allowClear={true}
+						options={columns.filter(c =>['ordinal', 'categorical', 'time'].indexOf(c.type) !== -1).map((c, i)=>{
+							
+							return {
+								type: c.type,
+								value: c.name,
+								label: c.label,
+							}
+						})}
+						onChange={(value, items) => {
+							let column = {};
+							let granularity = {};
+							if(items.length > 0) {
+								column = { type: items[0].type, value: items[0].value, label: items[0].label };
+							}
+							if(items.length > 1) {
+								granularity = { value: items[1].value, label: items[1].label };
+							}
+							dispatch({ type: 'chartDesigner/changeField', name: 'barConfig', value: { ...chartDesigner.barConfig, xAxis: { column, granularity } } });
+						}}
+						displayRender={(label, selectedOptions) => {
+							let text = '';
+							let className = 'cascader-label';
+							if(label.length > 0) {
+								className += ' full-label';
+								text += label[0];
+								if(label.length > 1) {
+									text += '(' + label[1] + ')';
+								}
+							}else {
+								className += ' empty-label';
+								text = '请选择...';
+							}
+							return <div className={className}>{text}</div>;
+						}}
+					>
+					</Cascader>
 				</FormItem>
 			</Form>
         );

+ 8 - 3
src/components/datasource/dataConnectBox.jsx

@@ -33,7 +33,11 @@ class DataConnectBox extends React.Component {
         return (
             <Modal
                 className='dataconnect-box'
-                title={`${dataConnect.newOne.boxOperation === 'create'?'新建':'修改'}数据库连接`}
+                title={<Row type='flex' justify='space-between'><Col>{`${dataConnect.newOne.boxOperation === 'create'?'新建':'修改'}数据库连接`}</Col><Col style={{ marginRight: '35px', fontSize: '14px', cursor: 'pointer', color: 'red' }} onClick={() => {
+                    // 密码input特殊处理
+                    document.getElementsByClassName('password')[0].value = '';
+                    dispatch({ type:'dataConnect/resetNewModel'})
+                }}><Icon type='delete' />清空</Col></Row>}
                 visible={dataConnect.newOne.visibleBox}
                 onCancel={() => { this.hideBox() }}
                 maskClosable={false}
@@ -45,10 +49,10 @@ class DataConnectBox extends React.Component {
                         </Col>
                         <Col span={12}>
                             <Button onClick={() => dispatch({ type:'dataConnect/remoteValidate'})}>测试</Button>
-                            <Button onClick={() => dispatch({ type:'dataConnect/resetNewModel'})}>清空</Button>
+                            {/* <Button onClick={() => dispatch({ type:'dataConnect/resetNewModel'})}>清空</Button> */}
                             <Button onClick={() => {this.hideBox()}}>取 消</Button>
                             <Button className={dataConnect.newOne.validating ? 'ant-btn-loading' : ''} type="primary" onClick={() => {this.okHandler()}}>
-                                {dataConnect.newOne.validating ? (<Icon type='loading' />) : ''}确 定
+                                {dataConnect.newOne.validating ? (<Icon type='loading' />) : ''}{dataConnect.newOne.validating ? '校验中' : '保存'}
                             </Button>
                         </Col>
                     </Row>
@@ -147,6 +151,7 @@ class DataConnectBox extends React.Component {
                                 wrapperCol: { span: 16 }
                             }}>
                                 <Input
+                                    className='password'
                                     type='password'
                                     // value={dataConnect.newOne.password}
                                     onChange={(e) => {

+ 1 - 1
src/components/datasource/dataConnectConfig.jsx

@@ -25,7 +25,7 @@ class DataConnectConfig extends React.Component {
                         <Icon type='edit'/>编辑
                     </Menu.Item>
                     <Menu.Item onClick={(e) => {
-                        dispatch({ type: 'chart/remoteDelete', code: dataConnect.selected.code });
+                        dispatch({ type: 'dataConnect/remoteDelete', code: dataConnect.selected.code });
                     }}>
                         <Icon type='delete'/>删除
                     </Menu.Item>

+ 48 - 14
src/components/datasource/dataSource.jsx

@@ -33,6 +33,30 @@ class DataSource extends React.Component {
         tableBody.style.maxHeight=`${mainContent.offsetHeight - toolbar.offsetHeight - tableHeader.offsetHeight - 58}px`;
     }
 
+    onGroup() {
+        const { dataSource } = this.props;
+        const groupList = dataSource.groupList;
+        const list = dataSource.list;
+        const currentGroup = dataSource.currentGroup;
+        
+        let groupFilter = groupList.concat({ code: 'all', label: '全部分组' }).filter(g => (
+            currentGroup[0].code === 'all' || 
+            (
+                currentGroup[0].code === 'nogroup' ? g.code === 'all' : (
+                    currentGroup[1] ? (g.code === currentGroup[1].code) : 
+                    (
+                        g.code === currentGroup[0].code ||
+                        g.pcode === currentGroup[0].code
+                    )
+                )
+            )
+        )).map(g => g.code);
+
+        console.log(list, groupFilter);
+
+        return list.filter(l => groupFilter.indexOf(l.groupCode+'') !== -1);
+    }
+
     onSearch(list, text) {
         return list.map(l => {
             let o = Object.assign({}, l);
@@ -58,22 +82,28 @@ class DataSource extends React.Component {
     }
 
     createGroupMenu = (selectedRecord) => {
+
         const { dataSource, dispatch } = this.props;
         const groupList = dataSource.groupList;
-        const parent = groupList.filter(d => d.pcode === '-1').sort((a, b) => a.index - b.index);
-        const children = groupList.filter(d => d.pcode !== '-1');
+        const pGroups = groupList.filter(d => d.pcode === '-1').sort((a, b) => a.index - b.index);
+        const cGroups = groupList.filter(d => d.pcode !== '-1');
 
-        parent.unshift({
-            code: 'all',
-            label: '全部分组'
-        });
-        return parent.map(p => {
-            let c = children.filter(c => c.pcode === p.code).sort((a, b) => a.index - b.index);
+        let allGroups = selectedRecord ? pGroups : [
+            { code: 'all', label: '全部分组' },
+            { code: 'nogroup', label: '未分组' }
+        ].concat(pGroups);
+
+        return allGroups.map(p => {
+            let c = cGroups.filter(c => c.pcode === p.code).sort((a, b) => a.index - b.index);
             return c.length > 0 ? (
-                <Menu.SubMenu key={p.code} title={<span style={{ fontWeight: dataSource.currentGroup[0].code === p.code ? 'bold' : 'normal' }}>{p.label}</span>} onTitleClick={(item) => {
+                <Menu.SubMenu key={p.code} title={<span style={{ fontWeight: selectedRecord ? (
+                    (p.code+'' === selectedRecord.groupCode+'' ? 'bold' : (
+                        c.find(ch => ch.code+'' === selectedRecord.groupCode+'') && c.find(ch => ch.code+'' === selectedRecord.groupCode+'').pcode === p.code ? 'bold' : 'normal'
+                    ))
+                ) : dataSource.currentGroup[0].code === p.code ? 'bold' : 'normal' }}>{p.label}</span>} onTitleClick={(item) => {
                     dispatch({ type: 'dataSource/setCurrentGroup', group1: p });
                     if(selectedRecord) {
-                        dispatch({ type: 'dataSource/remoteSetGroup', dataSource: selectedRecord, group: p });
+                        dispatch({ type: 'dataSource/remoteSetDataSourceGroup', dataSource: selectedRecord, group: p });
                     }
                     this.hideGroupMenu();
                 }}>
@@ -81,16 +111,20 @@ class DataSource extends React.Component {
                         return (<Menu.Item key={c.code} onClick={(item) => {
                             dispatch({ type: 'dataSource/setCurrentGroup', group1: p, group2: c });
                             if(selectedRecord) {
-                                dispatch({ type: 'dataSource/remoteSetGroup', chart: selectedRecord, group: p });
+                                dispatch({ type: 'dataSource/remoteSetDataSourceGroup', dataSource: selectedRecord, group: p });
                             }
-                        }}><span style={{ fontWeight: dataSource.currentGroup[1] && (dataSource.currentGroup[1].code === c.code) ? 'bold' : 'normal' }}>{c.label}</span></Menu.Item>)
+                        }}><span style={{ fontWeight: selectedRecord ? (
+                            selectedRecord.groupCode+'' === c.code+'' ? 'bold' : 'normal'
+                        ) : (dataSource.currentGroup[1] && (dataSource.currentGroup[1].code === c.code) ? 'bold' : 'normal') }}>{c.label}</span></Menu.Item>)
                     })}
                 </Menu.SubMenu>
             ) : (
                 <Menu.Item key={p.code} onClick={() => {
                     dispatch({ type: 'dataSource/setCurrentGroup', group1: p });
                     this.hideGroupMenu();
-                }}><span style={{ fontWeight: dataSource.currentGroup[0] && (dataSource.currentGroup[0].code === p.code) ? 'bold' : 'normal' }}>{p.label}</span></Menu.Item>
+                }}><span style={{ fontWeight: selectedRecord ? (
+                    selectedRecord.groupCode+'' === p.code+'' ? 'bold' : 'normal'
+                ) : dataSource.currentGroup[0] && (dataSource.currentGroup[0].code === p.code) ? 'bold' : 'normal' }}>{p.label}</span></Menu.Item>
             );
         });
     }
@@ -393,7 +427,7 @@ class DataSource extends React.Component {
                             columns={dataSourceColumns}
                             dataSource={
                                 this.onSort(
-                                    this.onSearch(dataSource.list, dataSource.filterLabel)
+                                    this.onSearch(this.onGroup(), dataSource.filterLabel)
                                 )
                             }
                             size='small'

+ 4 - 0
src/constants/url.js

@@ -63,6 +63,8 @@ const URLS = {
 
     GROUP_DATASOURCE_UPDATE: BASE_URL + '/updataDataConnectorGroup', // 修改数据源分组信息
 
+    GROUP_DATASOURCE_SET_GROUP: BASE_URL + '/updateConnectConfigGroup', // 设置数据源所属分组
+
     GROUP_DATASOURCE_LIST_UPDATE: BASE_URL + '/updataConnectorGroup', // 批量修改数据源分组信息
 
     GROUP_DATASOURCE_DELETE: BASE_URL + '/delDataConnectorGroup', // 删除数据源分组/子分组
@@ -75,6 +77,8 @@ const URLS = {
 
     GROUP_CHART_UPDATE: BASE_URL + '/updataChartsGroup', // 修改图表分组信息
 
+    GROUP_CHART_SET_GROUP: BASE_URL + '/updateChartConfigGroup', // 设置图表所属分组
+
     GROUP_CHART_LIST_UPDATE: BASE_URL + '/updataListGroup', // 批量修改图表分组信息
 
     GROUP_CHART_DELETE: BASE_URL + '/delChartsGroup', // 删除图表分组/子分组

+ 39 - 13
src/models/chart.js

@@ -91,6 +91,21 @@ export default {
         setGroupDirty(state, action) {
             let dirty = action.dirty;
             return Object.assign({}, state, {groupDirty: dirty});
+        },
+        /** 
+         * 设置图表所属分组
+         */
+        setChartGroup(state, action) {
+            const { chartCode, groupCode } = action;
+            let list = state.list;
+            for(let i = 0; i < list.length; i++) {
+                let l = list[i];
+                if(l.code === chartCode) {
+                    l.groupCode = groupCode;
+                    break;
+                }
+            }
+            return Object.assign({}, state, {list: list});
         }
     },
     effects: {
@@ -106,12 +121,13 @@ export default {
                 if(!res.err && res.data.code > 0) {
                     let list = res.data.data.map(d => {
                         return {
-                            code:  d.chartId,
+                            code:  d.chartId+'',
                             name: d.chartName,
                             type: d.chartType,
                             creator: d.createBy,
                             createTime: d.createDate,
-                            description: d.describes || ''
+                            description: d.describes || '',
+                            groupCode: d.chartsGroup+'' === '-1' ? 'all' : d.chartsGroup
                         }
                     })
                     yield put({ type: 'list', list: list });
@@ -173,7 +189,8 @@ export default {
                             })[0]
                         },
                         otherConfig: otherConfig,
-                        description: resData.describes
+                        description: resData.describes,
+                        groupCode: resData.chartsGroup+'' === '-1' ? 'all' : resData.chartsGroup
                     }
 
                     if(viewType === 'bar') {
@@ -645,19 +662,28 @@ export default {
         /**
          * 设置图表所属分组
          */
-        *remoteSetGroup(action, { select, call, put }) {
-            let id = action.dataSource.code
-            let groupID = action.group.code
+        *remoteSetChartGroup(action, { select, call, put }) {
+            const { chart, group } = action;
+            const chartCode = chart.code;
+            const groupCode = group.code;
             try {
-                yield call(service.fetch, {
-                    url: URLS.GROUP_DATASOURCE_ADD,
-                    body: {
-                        id: id,
-                        groupID: groupID
-                    }
+                let body = { 
+                    id: chartCode,
+                    groupId: groupCode
+                }
+                let res = yield call(service.fetch, {
+                    url: URLS.GROUP_CHART_SET_GROUP,
+                    body: body
                 });
+                console.log('设置图表所属分组', body, res);
+                if(!res.err && res.data.code > 0) {
+                    yield put({ type: 'setChartGroup', chartCode, groupCode });
+                }else {
+                    message.error('设置分组失败');
+                }
             } catch(e) {
-                message.error('读取数据连接配置列表错误');
+                console.log(e);
+                message.error('设置分组失败');
             }
         },
     },

+ 101 - 42
src/models/dataConnect.js

@@ -80,7 +80,16 @@ export default {
             return Object.assign({}, state, {newOne});
         },
         resetNewModel(state, action) {
-            return Object.assign({}, state, {newOne: {}});
+            let newOne = state.newOne;
+            delete newOne.name;
+            delete newOne.dbType;
+            delete newOne.address;
+            delete newOne.port;
+            delete newOne.dbName;
+            delete newOne.userName;
+            delete newOne.password;
+            delete newOne.description;
+            return Object.assign({}, state, {newOne});
         },
         setNewModelInvalid(state, action) {
             const { value } = action;
@@ -161,34 +170,58 @@ export default {
         },
         *remoteAdd(action, { select, call, put, takeEvery, takeLatest }) {
             try {
-                yield put({ type: 'remoteValidate' }); // 新增前校验
-
                 const dataConnect = yield select(state => state.present.dataConnect);
                 const model = dataConnect.newOne;
 
-                if(model.invalid) {
-                    return;
-                }
-                let body = {
+                // 设置validating为true
+                yield put({ type: 'setNewModelField', name: 'validating', value: true });
+                // 调用检测接口检测连接配置是否合法
+                let validBody = {
                     name: model.name,
                     addrass: model.address,
                     port: model.port,
                     databaseType: model.dbType,
                     dataName: model.dbName,
                     userName: model.userName,
-                    passWord: model.password,
-                    note: model.description
+                    passWord: model.password
                 }
-                const res = yield call(service.fetch, {
-                    url: URLS.DATACONNECT_ADD,
-                    body: body
+                const validRes = yield call(service.fetch, {
+                    url: URLS.DATACONNECT_VALIDATE,
+                    body: validBody
                 });
-                if(!res.err && res.data.code > 0) {
-                    yield put({ type: 'add' });
-                    yield put({ type: 'setNewModelField', name: 'visibleBox', value: false });
-                    message.success('新增成功');
+
+                // 设置validating为false
+                yield put({ type: 'setNewModelField', name: 'validating', value: false });
+
+                if(!validRes.err && validRes.data.code > 0) {
+                    // 如果合法
+                    // 设置valid为true
+                    yield put({ type: 'setNewModelInvalid', name: 'invalid', value: false });
+
+                    // 继续执行保存
+                    let body = {
+                        name: model.name,
+                        addrass: model.address,
+                        port: model.port,
+                        databaseType: model.dbType,
+                        dataName: model.dbName,
+                        userName: model.userName,
+                        passWord: model.password,
+                        note: model.description
+                    }
+                    const res = yield call(service.fetch, {
+                        url: URLS.DATACONNECT_ADD,
+                        body: body
+                    });
+                    if(!res.err && res.data.code > 0) {
+                        yield put({ type: 'add' });
+                        yield put({ type: 'setNewModelField', name: 'visibleBox', value: false });
+                        message.success('新增成功');
+                    }else {
+                        message.error('新增失败');
+                    }
                 }else {
-                    message.error('新增失败');
+                    yield put({ type: 'setNewModelInvalid', name: 'invalid', value: true });
                 }
             }catch(e) {
                 console.log(e);
@@ -198,41 +231,66 @@ export default {
             try{
                 const dataConnect = yield select(state => state.present.dataConnect);
                 const model = dataConnect.newOne;
-                
-                if(model.invalid) {
-                    return;
-                }
 
-                const code = action.code;
-
-                let data = {
-                    id: code,
+                // 设置validating为true
+                yield put({ type: 'setNewModelField', name: 'validating', value: true });
+                // 调用检测接口检测连接配置是否合法
+                let validBody = {
                     name: model.name,
                     addrass: model.address,
                     port: model.port,
                     databaseType: model.dbType,
                     dataName: model.dbName,
                     userName: model.userName,
-                    passWord: model.password,
-                    note: model.description
-                };
-                const res = yield call(service.fetch, {
-                    url: URLS.DATACONNECT_UPDATE,
-                    body: data
+                    passWord: model.password
+                }
+                const validRes = yield call(service.fetch, {
+                    url: URLS.DATACONNECT_VALIDATE,
+                    body: validBody
                 });
-                if(!res.err && res.data.code > 0) {
-                    let list = dataConnect.list;
-                    list = list.map(l => {
-                        if((l.code+'') === (action.code+'')) {
-                            l = model;
-                        }
-                        return l;
+
+                // 设置validating为false
+                yield put({ type: 'setNewModelField', name: 'validating', value: false });
+
+                if(!validRes.err && validRes.data.code > 0) {
+                    // 如果合法
+                    // 设置valid为true
+                    yield put({ type: 'setNewModelInvalid', name: 'invalid', value: false });
+
+                    // 继续执行保存
+                    const code = action.code;
+
+                    let data = {
+                        id: code,
+                        name: model.name,
+                        addrass: model.address,
+                        port: model.port,
+                        databaseType: model.dbType,
+                        dataName: model.dbName,
+                        userName: model.userName,
+                        passWord: model.password,
+                        note: model.description
+                    };
+                    const res = yield call(service.fetch, {
+                        url: URLS.DATACONNECT_UPDATE,
+                        body: data
                     });
-                    yield put({ type: 'list', data: list });
-                    message.success('修改成功');
-                    yield put({ type: 'setNewModelField', name: 'visibleBox', value: false });
+                    if(!res.err && res.data.code > 0) {
+                        let list = dataConnect.list;
+                        list = list.map(l => {
+                            if((l.code+'') === (action.code+'')) {
+                                l = model;
+                            }
+                            return l;
+                        });
+                        yield put({ type: 'list', data: list });
+                        message.success('修改成功');
+                        yield put({ type: 'setNewModelField', name: 'visibleBox', value: false });
+                    }else {
+                        message.error('修改失败');
+                    }
                 }else {
-                    message.error('修改失败');
+                    yield put({ type: 'setNewModelInvalid', name: 'invalid', value: true });
                 }
             }catch(e) {
                 message.error('修改失败');
@@ -247,6 +305,7 @@ export default {
                     url: URLS.DATACONNECT_DELETE,
                     body: [code]
                 });
+                console.log(code, res);
                 if(!res.err && res.data.code > 0) {
                     for(let i = 0; i < list.length; i++) {
                         if((list[i].code+'') === (code+'')) {

+ 36 - 12
src/models/dataSource.js

@@ -150,6 +150,18 @@ export default {
         setGroupDirty(state, action) {
             let dirty = action.dirty;
             return Object.assign({}, state, {groupDirty: dirty});
+        },
+        setDataSourceGroup(state, action) {
+            const { dataSourceCode, groupCode } = action;
+            let list = state.list;
+            for(let i = 0; i < list.length; i++) {
+                let l = list[i];
+                if(l.code === dataSourceCode) {
+                    l.groupCode = groupCode;
+                    break;
+                }
+            }
+            return Object.assign({}, state, {list: list});
         }
     },
     effects: {
@@ -163,7 +175,7 @@ export default {
                     url: URLS.DATASOURCE_LIST,
                     body: {}
                 });
-                console.log('数据源list', res);
+                
                 if(!res.err && res.data.code > 0) {
                     let data = res.data.data.map((r, i) => {
                         let dbConfig = JSON.parse(r.dbConfig);
@@ -177,9 +189,11 @@ export default {
                             creator: r.createBy,
                             createTime: new Date(r.createDate),
                             tags: tags,
-                            description: r.note
+                            description: r.note,
+                            groupCode: r.group+'' === '-1' || 'all'
                         }
                     });
+                    console.log('数据源list', res, data);
                     yield put({ type: 'list', data });
                 }else {
                     message.error('读取数据源列表错误');
@@ -751,19 +765,29 @@ export default {
         /**
          * 为数据源设置所属分组
          */
-        *remoteSetGroup(action, { select, call, put }) {
-            let id = action.dataSource.code
-            let groupID = action.group.code
+        *remoteSetDataSourceGroup(action, { select, call, put }) {
+
+            const { dataSource, group } = action;
+            const dataSourceCode = dataSource.code;
+            const groupCode = group.code;
             try {
-                yield call(service.fetch, {
-                    url: URLS.GROUP_DATASOURCE_ADD,
-                    body: {
-                        id: id,
-                        groupID: groupID
-                    }
+                let body = { 
+                    id: dataSourceCode,
+                    groupId: groupCode
+                }
+                let res = yield call(service.fetch, {
+                    url: URLS.GROUP_DATASOURCE_SET_GROUP,
+                    body: body
                 });
+                console.log('设置数据源所属分组', body, res);
+                if(!res.err && res.data.code > 0) {
+                    yield put({ type: 'setDataSourceGroup', dataSourceCode, groupCode });
+                }else {
+                    message.error('设置分组失败');
+                }
             } catch(e) {
-                message.error('读取数据连接配置列表错误');
+                console.log(e);
+                message.error('设置分组失败');
             }
         }
     },