|
|
@@ -1,9 +1,10 @@
|
|
|
import React from 'react'
|
|
|
-import { Layout, Row, Col, Input, Button, Table, Icon, Menu, Dropdown, Card, Breadcrumb, Popover, Tree, Tag, Select, DatePicker } from 'antd'
|
|
|
-import { connect } from 'dva'
|
|
|
import moment from 'moment'
|
|
|
-import { dateFormat } from '../../utils/baseUtils'
|
|
|
-import GroupSelector from './groupSelector'
|
|
|
+import { Layout, Row, Col, Input, Button, Table, Icon, Menu, Dropdown, Card, Breadcrumb, Tag, Checkbox, Select, DatePicker } from 'antd'
|
|
|
+import { connect } from 'dva'
|
|
|
+import { arrayToTree, dateFormat } from '../../utils/baseUtils'
|
|
|
+import GroupManagementBox from '../common/groupManageMentBox/box'
|
|
|
+import GroupSelector from '../common/groupSelector/popover'
|
|
|
import TransferBox from '../common/selectUserBox/selectUserBox'
|
|
|
import CopyBox from './copyBox'
|
|
|
import DeleteBox from '../common/deleteBox/deleteBox'
|
|
|
@@ -11,7 +12,6 @@ import DataPreview from '../common/dataPreview/dataPreview'
|
|
|
import './list.less'
|
|
|
const { Content } = Layout
|
|
|
const { Search } = Input
|
|
|
-const { TreeNode } = Tree
|
|
|
const { Option } = Select
|
|
|
const { RangePicker } = DatePicker
|
|
|
|
|
|
@@ -21,12 +21,12 @@ class DataSource extends React.Component {
|
|
|
this.state = {
|
|
|
selectedRecord: null, // 当前选中的dataSource
|
|
|
visibleGroupMenu: false, // 显示分组菜单
|
|
|
- visibleSetGroupMenu: false, //
|
|
|
visibleTransferBox: false,
|
|
|
visibleDeleteBox: false,
|
|
|
visibleCopyBox: false,
|
|
|
visibleDataPreviewBox: false, // 显示数据预览
|
|
|
- groupEditing: false, // 是否处于编辑状态
|
|
|
+ visibleGroupManageMentBox: false, // 显示分组管理
|
|
|
+ noGroup: false, // 显示未分组数据
|
|
|
}
|
|
|
};
|
|
|
hideTransferBox = () => {
|
|
|
@@ -52,42 +52,34 @@ class DataSource extends React.Component {
|
|
|
|
|
|
onGroup() {
|
|
|
const { dataSource } = this.props;
|
|
|
- const { groupList, currentGroup, list } = dataSource;
|
|
|
-
|
|
|
- let groupFilter = groupList.concat({ code: '-1', label: '未分组' }).filter(g => (
|
|
|
- currentGroup[0].code === 'all' ||
|
|
|
- (
|
|
|
- currentGroup[0].code === '-1' ? g.code === '-1' : (
|
|
|
- currentGroup[1] ? (g.code === currentGroup[1].code) :
|
|
|
- (
|
|
|
- g.code === currentGroup[0].code ||
|
|
|
- g.pcode === currentGroup[0].code
|
|
|
- )
|
|
|
- )
|
|
|
- )
|
|
|
- )).map(g => g.code);
|
|
|
+ const { noGroup } = this.state;
|
|
|
+ const { currentGroup, list } = dataSource;
|
|
|
|
|
|
- return list.filter(l => groupFilter.indexOf(l.groupCode+'') !== -1);
|
|
|
+ if(noGroup) {
|
|
|
+ return list.filter(l => l.groupCode === '-1' );
|
|
|
+ }else if(currentGroup) {
|
|
|
+ return list.filter(l => l.groupCode === currentGroup.code );
|
|
|
+ }else {
|
|
|
+ return list;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
onSearch(list, dataSource) {
|
|
|
const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符
|
|
|
+ let filterItem = dataSource.filterItem
|
|
|
let filterLabel = (dataSource.filterLabel || '').replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1'); // 添加转义符号
|
|
|
- let typeLabel = dataSource.typeLabel
|
|
|
+ let filterReg = new RegExp('('+ filterLabel +'){1}', 'ig');
|
|
|
|
|
|
return list.map(l => {
|
|
|
let o = Object.assign({}, l);
|
|
|
- let reg = new RegExp('('+ filterLabel +'){1}', 'ig');
|
|
|
|
|
|
- if(o[typeLabel] && typeLabel!=='createTime' && o[typeLabel].search(reg) !== -1){
|
|
|
- return o;
|
|
|
- }else if(o[typeLabel] && typeLabel==='createTime'){
|
|
|
+ if(filterItem.type === 'date') {
|
|
|
if(filterLabel===""){
|
|
|
return o;
|
|
|
}else if(filterLabel.indexOf('#')>-1){
|
|
|
let start = filterLabel.split('#')[0]
|
|
|
let end = filterLabel.split('#')[1]
|
|
|
- let nowTime = o[typeLabel].getTime();
|
|
|
+ let nowTime = o[filterItem.name].getTime();
|
|
|
if(nowTime>=start && nowTime<=end){
|
|
|
return o;
|
|
|
}
|
|
|
@@ -95,8 +87,8 @@ class DataSource extends React.Component {
|
|
|
}else{
|
|
|
return null
|
|
|
}
|
|
|
- }else{
|
|
|
- return null
|
|
|
+ }else {
|
|
|
+ return ((o[filterItem.name] + '').search(filterReg) > -1) ? o : null
|
|
|
}
|
|
|
}).filter(a => a!==null);
|
|
|
}
|
|
|
@@ -111,140 +103,76 @@ class DataSource extends React.Component {
|
|
|
this.setState({ visibleGroupMenu: flag });
|
|
|
}
|
|
|
|
|
|
- createGroupMenu = (selectedRecord) => {
|
|
|
+ getParens = (group) => {
|
|
|
+ const groupData = this.props.dataSource.groupList;
|
|
|
+ let pgroups = [group];
|
|
|
+ let fgroup = groupData.find(g => g.code === group.pcode);
|
|
|
+ if(fgroup) {
|
|
|
+ pgroups = this.getParens(fgroup).concat(pgroups);
|
|
|
+ }
|
|
|
+ return pgroups;
|
|
|
+ }
|
|
|
|
|
|
+ generateGroupTags = () => {
|
|
|
const { dataSource, dispatch } = this.props;
|
|
|
- const groupList = dataSource.groupList;
|
|
|
- const pGroups = groupList.filter(d => d.pcode === '-1').sort((a, b) => a.index - b.index);
|
|
|
- const cGroups = groupList.filter(d => d.pcode !== '-1');
|
|
|
-
|
|
|
- let allGroups = selectedRecord ? [
|
|
|
- { code: '-1', label: '未分组' }
|
|
|
- ].concat(pGroups) : [
|
|
|
- { code: 'all', label: '全部分组' },
|
|
|
- { code: '-1', 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: 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/remoteSetDataSourceGroup', dataSource: selectedRecord, group: p });
|
|
|
- }
|
|
|
- this.hideGroupMenu();
|
|
|
- }}>
|
|
|
- {c.map(c => {
|
|
|
- return (<Menu.Item key={c.code} onClick={(item) => {
|
|
|
- // dispatch({ type: 'dataSource/setCurrentGroup', group1: p, group2: c }); // 尝试禁用分组后跳转逻辑
|
|
|
- if(selectedRecord) {
|
|
|
- dispatch({ type: 'dataSource/remoteSetDataSourceGroup', dataSource: selectedRecord, group: c });
|
|
|
- }
|
|
|
- }}><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 }); // 尝试禁用分组后跳转逻辑
|
|
|
- if(selectedRecord) {
|
|
|
- dispatch({ type: 'dataSource/remoteSetDataSourceGroup', dataSource: selectedRecord, group: p });
|
|
|
- }
|
|
|
- this.hideGroupMenu();
|
|
|
- }}><span className={selectedRecord ? (
|
|
|
- selectedRecord.groupCode+'' === p.code+'' ? 'selected' : ''
|
|
|
- ) : dataSource.currentGroup[0] && (dataSource.currentGroup[0].code === p.code) ? 'selected' : ''} 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>
|
|
|
- );
|
|
|
- });
|
|
|
+ const { noGroup } = this.state;
|
|
|
+ const { currentGroup } = dataSource;
|
|
|
+ const pGroups = currentGroup ? [{ code: '-1', label: '全部分组' }].concat(this.getParens(currentGroup)) : [{ code: '-1', label: '全部分组' }];
|
|
|
+ return <Breadcrumb className={`group${noGroup ? ' nogroup' : ''}`} separator=">">
|
|
|
+ { pGroups.map(g => (
|
|
|
+ <Breadcrumb.Item key={g.code}>
|
|
|
+ <GroupSelector
|
|
|
+ visible={this.state['visibleGroupSelector' + g.code]}
|
|
|
+ handleVisibleChange={(visible) => {
|
|
|
+ let obj = {};
|
|
|
+ obj['visibleGroupSelector' + g.code] = visible
|
|
|
+ this.setState(obj);
|
|
|
+ }}
|
|
|
+ pGroup={g}
|
|
|
+ groupList={dataSource.groupList}
|
|
|
+ selectGroup={(group) => {
|
|
|
+ let obj = {};
|
|
|
+ obj['visibleGroupSelector' + g.code] = false;
|
|
|
+ this.setState(obj);
|
|
|
+ dispatch({ type: 'dataSource/setCurrentGroup', group });
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <Tag color={'blue'} >
|
|
|
+ {g.label}
|
|
|
+ </Tag>
|
|
|
+ </GroupSelector>
|
|
|
+ </Breadcrumb.Item>
|
|
|
+ )) }
|
|
|
+ </Breadcrumb>
|
|
|
}
|
|
|
|
|
|
- createSubGroupMenu = () => {
|
|
|
- const { dataSource, dispatch } = this.props;
|
|
|
- const groupList = dataSource.groupList;
|
|
|
- const parentGroup = dataSource.currentGroup[0];
|
|
|
- const children = groupList.filter(d => d.pcode === parentGroup.code);
|
|
|
- const subGroup = dataSource.currentGroup[1];
|
|
|
+ createGroupMenu = (treeData) => {
|
|
|
+ const { dispatch } = this.props;
|
|
|
+ const { selectedRecord } = this.state;
|
|
|
|
|
|
- return children.map(c => {
|
|
|
- return (
|
|
|
- <Menu.Item key={c.code} onClick={() => {
|
|
|
- dispatch({ type: 'dataSource/setCurrentGroup', group1: parentGroup, group2: c });
|
|
|
- }}><span className={subGroup && (subGroup.code === c.code) ? 'selected' : ''} style={{ fontWeight: subGroup && (subGroup.code === c.code) ? 'bold' : 'normal' }}>{c.label}</span></Menu.Item>
|
|
|
- );
|
|
|
+ return treeData.map(t => {
|
|
|
+ if(t.children && t.children.length > 0) {
|
|
|
+ return <Menu.SubMenu
|
|
|
+ key={t.code}
|
|
|
+ title={selectedRecord.groupCode === t.code ? <span style={{ color: '#1890ff', fontWeight: 'bold' }}>{t.label}</span> : t.label}
|
|
|
+ onTitleClick={() => {
|
|
|
+ dispatch({ type: 'dataSource/remoteSetGroup', dataSource: selectedRecord, group: t });
|
|
|
+ dispatch({ type: 'dataSource/setCurrentGroup', group: t });
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {this.createGroupMenu(t.children)}
|
|
|
+ </Menu.SubMenu>
|
|
|
+ }else {
|
|
|
+ return <Menu.Item key={t.code} onClick={() => {
|
|
|
+ dispatch({ type: 'dataSource/remoteSetGroup', dataSource: selectedRecord, group: t });
|
|
|
+ dispatch({ type: 'dataSource/setCurrentGroup', group: t });
|
|
|
+ }}>
|
|
|
+ {selectedRecord.groupCode === t.code ? <span style={{ color: '#1890ff', fontWeight: 'bold' }}>{t.label}</span> : t.label}
|
|
|
+ </Menu.Item>
|
|
|
+ }
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- createGroupTree(modify) {
|
|
|
- const { dispatch, dataSource } = this.props;
|
|
|
- const { groupEditing } = this.state;
|
|
|
- const groupList = dataSource.groupList;
|
|
|
-
|
|
|
- let parent = groupList.filter(d => d.pcode === '-1').sort((a, b) => a.index - b.index);
|
|
|
- let children = groupList.filter(d => d.pcode !== '-1');
|
|
|
-
|
|
|
- let groupTree = parent.map(p => {
|
|
|
- return (
|
|
|
- <TreeNode disabled={groupEditing} title={
|
|
|
- modify ? (<div><Icon style={{ cursor: 'move' }} type='drag'/>
|
|
|
- <Input value={p.label} size='small' focus={'true'} onFocus={() => {
|
|
|
- this.setState({
|
|
|
- groupEditing: true
|
|
|
- });
|
|
|
- }} onChange={(e) => {
|
|
|
- dispatch({ type: 'dataSource/modifyGroup', group: {...p, label:e.target.value} });
|
|
|
- }} onBlur={(e) => {
|
|
|
- this.setState({
|
|
|
- groupEditing: false
|
|
|
- });
|
|
|
- dispatch({ type: 'dataSource/remoteModifyGroup', group: {...p, label:e.target.value} });
|
|
|
- }} onPressEnter={(e) => {
|
|
|
- dispatch({ type: 'dataSource/remoteModifyGroup', group: {...p, label:e.target.value} });
|
|
|
- }} /><Icon type='plus-circle-o' onClick={() => {
|
|
|
- dispatch({ type: 'dataSource/remoteAddGroup', pgroup: p });
|
|
|
- }}/><Icon type='minus-circle' onClick={() => {
|
|
|
- dispatch({ type: 'dataSource/remoteDeleteGroup', group: p });
|
|
|
- }}/></div>) : p.label} key={p.code}>
|
|
|
- {
|
|
|
- children.filter(c => c.pcode === p.code).sort((a, b) => a.index - b.index).map(c => {
|
|
|
- return (
|
|
|
- <TreeNode disabled={groupEditing} title={
|
|
|
- modify ? (<div><Icon style={{ cursor: 'move' }} type='drag'/>
|
|
|
- <Input value={c.label} size='small' onFocus={() => {
|
|
|
- this.setState({
|
|
|
- groupEditing: true
|
|
|
- });
|
|
|
- }} onChange={(e) => {
|
|
|
- dispatch({ type: 'dataSource/modifyGroup', group: {...c, label:e.target.value} });
|
|
|
- }} onBlur={(e) => {
|
|
|
- this.setState({
|
|
|
- groupEditing: false
|
|
|
- });
|
|
|
- dispatch({ type: 'dataSource/remoteModifyGroup', group: {...c, label:e.target.value} });
|
|
|
- }} onPressEnter={(e) => {
|
|
|
- dispatch({ type: 'dataSource/remoteModifyGroup', group: {...c, label:e.target.value} });
|
|
|
- }} onCompositionEnd={(e) => {
|
|
|
- }}/><Icon type='minus-circle' onClick={() => {
|
|
|
- dispatch({ type: 'dataSource/remoteDeleteGroup', group: c });
|
|
|
- }}/></div>) : p.label
|
|
|
- } key={c.code} />
|
|
|
- )
|
|
|
- })
|
|
|
- }
|
|
|
- </TreeNode>
|
|
|
- )
|
|
|
- });
|
|
|
-
|
|
|
- return groupTree;
|
|
|
- }
|
|
|
|
|
|
hideGroupMenu = () => {
|
|
|
this.setState({
|
|
|
@@ -262,18 +190,20 @@ class DataSource extends React.Component {
|
|
|
dispatch({ type: 'dataSource/remoteMoveGroup', dragCode, dropCode, dropPosition });
|
|
|
}
|
|
|
|
|
|
+ generateFilterItems = () => {
|
|
|
+ const { filterItems } = this.props.dataSource;
|
|
|
+ return filterItems.map(t => <Option key={t.name} value={t.name}>{t.label}</Option>);
|
|
|
+ }
|
|
|
+
|
|
|
render() {
|
|
|
const { main, dataSource, dispatch } = this.props;
|
|
|
- const { selectedRecord, visibleTransferBox, visibleCopyBox, visibleDeleteBox, visibleDataPreviewBox } = this.state;
|
|
|
+ const { selectedRecord, visibleTransferBox, visibleGroupManageMentBox, visibleCopyBox, visibleDeleteBox, visibleDataPreviewBox, noGroup } = this.state;
|
|
|
const { currentUser } = main;
|
|
|
- const { changeSearchType } = dataSource;
|
|
|
-
|
|
|
+ const treeData = arrayToTree(dataSource.groupList, '-1', 'code', 'pcode', 'children');
|
|
|
const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符
|
|
|
+ let filterItem = dataSource.filterItem;
|
|
|
let filterLabel = dataSource.filterLabel.replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1'); // 添加转义符号
|
|
|
|
|
|
- const TAG_COLOR = ['blue'];
|
|
|
- // const TAG_COLOR1 = ['magenta', 'red', 'volcano', 'orange', 'gold', 'lime', 'green', 'cyan', 'blue', 'geekblue', 'purple'];
|
|
|
-
|
|
|
const moreOperatingMenu = (
|
|
|
<Menu className='operationmenu' visible={true}>
|
|
|
<Menu.Item
|
|
|
@@ -283,13 +213,6 @@ class DataSource extends React.Component {
|
|
|
>
|
|
|
<Icon type="file-add" />创建图表
|
|
|
</Menu.Item>
|
|
|
- {/* {selectedRecord && currentUser.code === selectedRecord.creatorCode && <Menu.Item onClick={(e) => {
|
|
|
- dispatch({ type: 'dataSource/resetNewModel' });
|
|
|
- let selectedModel = dataSource.list.find((i) => { return i.code === selectedRecord.code })
|
|
|
- dispatch({type: 'main/redirect', path: {pathname: '/datasource/'+ selectedModel.type +'/' + selectedModel.code + '/base'}});
|
|
|
- }}>
|
|
|
- <Icon type="info-circle-o" />属性设置
|
|
|
- </Menu.Item>} */}
|
|
|
<Menu.Item onClick={() => {
|
|
|
this.setState({
|
|
|
visibleDataPreviewBox: true
|
|
|
@@ -297,7 +220,12 @@ class DataSource extends React.Component {
|
|
|
}}><Icon type="search" />预览数据</Menu.Item>
|
|
|
<Menu.Divider />
|
|
|
{ selectedRecord && currentUser.code === selectedRecord.creatorCode && <Menu.SubMenu className='setgroupmenu' title={<div><Icon style={{ marginRight: '6px' }} type='profile' />移动到</div>}>
|
|
|
- {this.createGroupMenu(selectedRecord)}
|
|
|
+ {[<Menu.Item key='-1' onClick={() => {
|
|
|
+ dispatch({ type: 'dataSource/remoteSetGroup', dataSource: selectedRecord, group: { code: '-1'} });
|
|
|
+ this.setState({
|
|
|
+ noGroup: true
|
|
|
+ });
|
|
|
+ }}>未分组</Menu.Item>].concat(this.createGroupMenu(treeData))}
|
|
|
</Menu.SubMenu>}
|
|
|
<Menu.Divider />
|
|
|
{ selectedRecord && currentUser.code === selectedRecord.creatorCode && <Menu.Item
|
|
|
@@ -340,7 +268,7 @@ class DataSource extends React.Component {
|
|
|
dispatch({ type: 'dataSource/resetNewModel' });
|
|
|
dispatch({type: 'main/redirect', path: {pathname: '/datasource/'+ record.type +'/' + record.code + '/base'}});
|
|
|
}}>
|
|
|
- { filterLabel ?
|
|
|
+ { (filterItem.name === 'name' && filterLabel) ?
|
|
|
((text || '').split(new RegExp(`(${filterLabel})`, 'i')).map((fragment, i) => {
|
|
|
return (
|
|
|
fragment.toLowerCase().replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1') === filterLabel.toLowerCase() ?
|
|
|
@@ -362,7 +290,7 @@ class DataSource extends React.Component {
|
|
|
render: (text, record) => {
|
|
|
return (
|
|
|
<span>
|
|
|
- { filterLabel ?
|
|
|
+ { (filterItem.name === 'description' && filterLabel) ?
|
|
|
((text || '').split(new RegExp(`(${filterLabel})`, 'i')).map((fragment, i) => {
|
|
|
return (
|
|
|
fragment.toLowerCase().replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1') === filterLabel.toLowerCase() ?
|
|
|
@@ -379,7 +307,23 @@ class DataSource extends React.Component {
|
|
|
title: '创建人',
|
|
|
dataIndex: 'creatorName',
|
|
|
key: 'creatorName',
|
|
|
- width: 100
|
|
|
+ width: 100,
|
|
|
+ render: (text, record) => {
|
|
|
+ return (
|
|
|
+ <span>
|
|
|
+ { (filterItem.name === 'creatorName' && filterLabel) ?
|
|
|
+ ((text || '').split(new RegExp(`(${filterLabel})`, 'i')).map((fragment, i) => {
|
|
|
+ return (
|
|
|
+ fragment.toLowerCase().replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1') === filterLabel.toLowerCase() ?
|
|
|
+ <span key={i} style={{fontWeight: 'bold', color: 'red'}} className="highlight">{fragment}</span> :
|
|
|
+ fragment
|
|
|
+ )
|
|
|
+ }
|
|
|
+ )) : text
|
|
|
+ }
|
|
|
+ </span>
|
|
|
+ )
|
|
|
+ }
|
|
|
}, {
|
|
|
title: '创建时间',
|
|
|
dataIndex: 'createTime',
|
|
|
@@ -402,68 +346,32 @@ class DataSource extends React.Component {
|
|
|
<Content>
|
|
|
<Card className='datasource-body' title={
|
|
|
<Row className='datasource-tools' type='flex' justify='space-between'>
|
|
|
- <Col style={{ display: 'flex' }}>
|
|
|
- <Popover overlayClassName='popover-group' title={
|
|
|
- <Row className='grouptree-title' type='flex' justify='space-between'>
|
|
|
- <Col>
|
|
|
- 分组管理
|
|
|
- </Col>
|
|
|
- <Col>
|
|
|
- <div className='create-group' onClick={() => {
|
|
|
- dispatch({ type: 'dataSource/remoteAddGroup' });
|
|
|
- }}>添加分组<Icon type="plus-circle-o" /></div>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- } trigger="click" placement="bottomLeft" content={(
|
|
|
- <Tree
|
|
|
- className='tree-group'
|
|
|
- showLine
|
|
|
- defaultExpandAll
|
|
|
- draggable
|
|
|
- onDragStart={this.onDragStart}
|
|
|
- onDrop={this.onDrop}
|
|
|
- >
|
|
|
- {
|
|
|
- this.createGroupTree(true)
|
|
|
- }
|
|
|
- </Tree>
|
|
|
- )}>
|
|
|
- <Icon type="bars" />
|
|
|
- </Popover>
|
|
|
- <Breadcrumb className='group' separator=">">
|
|
|
- <Breadcrumb.Item>
|
|
|
- <GroupSelector model={dataSource} modelName='dataSource'>
|
|
|
- <Tag color={TAG_COLOR[Math.ceil(Math.random()*TAG_COLOR.length) - 1]} >
|
|
|
- {dataSource.currentGroup[0].label}
|
|
|
- </Tag>
|
|
|
- </GroupSelector>
|
|
|
- </Breadcrumb.Item>
|
|
|
- {dataSource.currentGroup[1] && (<Breadcrumb.Item>
|
|
|
- <GroupSelector model={dataSource} modelName='dataSource'>
|
|
|
- <Tag color={TAG_COLOR[Math.ceil(Math.random()*TAG_COLOR.length) - 1]}>
|
|
|
- {dataSource.currentGroup[1].label}
|
|
|
- </Tag>
|
|
|
- </GroupSelector>
|
|
|
- </Breadcrumb.Item>)}
|
|
|
- </Breadcrumb>
|
|
|
+ <Col style={{ display: 'flex', width: 'calc(100% - 324px)', overflow: 'hidden' }}>
|
|
|
+ <Icon type="bars" onClick={() => {
|
|
|
+ this.setState({
|
|
|
+ visibleGroupManageMentBox: true
|
|
|
+ });
|
|
|
+ }}/>
|
|
|
+ <Checkbox style={{ marginTop: '4px' }} value={noGroup} onChange={(e) => {
|
|
|
+ this.setState({noGroup: e.target.checked})
|
|
|
+ }}>未分组</Checkbox>
|
|
|
+ { this.generateGroupTags() }
|
|
|
</Col>
|
|
|
<Col className='search'>
|
|
|
<Col style={{ padding: '0 1px', margin: '0 -5px' }}>
|
|
|
<Select
|
|
|
- value={dataSource.typeLabel}
|
|
|
+ value={filterItem.name}
|
|
|
style={{ width: 120 }}
|
|
|
- onChange={e => {
|
|
|
- dispatch({ type: 'dataSource/setTypeLabel', selected: e });
|
|
|
+ onChange={value => {
|
|
|
+ let item = dataSource.filterItems.find(i => i.name === value);
|
|
|
+ dispatch({ type: 'dataSource/setFilterItem', item });
|
|
|
}}
|
|
|
>
|
|
|
- <Option value="name">名称</Option>
|
|
|
- <Option hidden value="description">说明</Option>
|
|
|
- <Option value="creatorName">创建人</Option>
|
|
|
- <Option value="createTime">创建时间</Option>
|
|
|
+ { this.generateFilterItems() }
|
|
|
</Select>
|
|
|
</Col>
|
|
|
<Col style={{ padding: '0 5px' }}>
|
|
|
- {changeSearchType ?
|
|
|
+ {filterItem.type === 'date' ?
|
|
|
<RangePicker
|
|
|
ranges={{
|
|
|
'今天': [moment().startOf('day'), moment().endOf('day')],
|
|
|
@@ -537,7 +445,19 @@ class DataSource extends React.Component {
|
|
|
}
|
|
|
}}
|
|
|
/>
|
|
|
- <TransferBox
|
|
|
+ {visibleGroupManageMentBox && <GroupManagementBox
|
|
|
+ visibleBox={visibleGroupManageMentBox}
|
|
|
+ groupData={dataSource.groupList}
|
|
|
+ hideBox={() => {
|
|
|
+ this.setState({
|
|
|
+ visibleGroupManageMentBox: false
|
|
|
+ })
|
|
|
+ }}
|
|
|
+ okHandler={(aGroups, mGroups, dGroups) => {
|
|
|
+ dispatch({ type: 'dataSource/remoteSetGroups', aGroups, mGroups, dGroups });
|
|
|
+ }}
|
|
|
+ />}
|
|
|
+ {visibleTransferBox && <TransferBox
|
|
|
visibleBox={visibleTransferBox}
|
|
|
title='选择移交对象'
|
|
|
okHandler={(user) => {
|
|
|
@@ -549,7 +469,7 @@ class DataSource extends React.Component {
|
|
|
})
|
|
|
}}
|
|
|
onlyAdmin={true}
|
|
|
- />
|
|
|
+ />}
|
|
|
{visibleCopyBox && <CopyBox
|
|
|
visibleBox={visibleCopyBox}
|
|
|
currentDataSourceCode={selectedRecord.code}
|