import React from 'react'
import { Layout, Row, Col, Input, Button, Table, Icon, Menu, Dropdown, Card, Breadcrumb, Popover, Tree, Tag } from 'antd'
import { connect } from 'dva'
import './dataSource.less'
import { dateFormat } from '../../utils/baseUtils'
import GroupSelector from './groupSelector'
const { Content } = Layout
const { Search } = Input
const { TreeNode } = Tree
class DataSource extends React.Component {
constructor(props) {
super(props);
this.state = {
selectedRecord: null, // 当前选中的dataSource
visibleGroupMenu: false, // 显示分组菜单
visibleSetGroupMenu: false, //
groupEditing: false, // 是否处于编辑状态
}
};
componentDidMount() {
const { dispatch } = this.props;
this.setScrollTableHeight();
dispatch({ type: 'dataSource/fetchList' });
dispatch({ type: 'dataSource/remoteGroupList' });
}
/**
* 根据视图设置表格高度以呈现滚动条
*/
setScrollTableHeight() {
const mainContent = document.getElementsByClassName('main-content')[0];
const toolbar = mainContent.getElementsByClassName('datasource-tools')[0];
const tableHeader = mainContent.getElementsByClassName('ant-table-header')[0];
const tableBody = mainContent.getElementsByClassName('ant-table-body')[0];
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);
let reg = new RegExp('('+ text +'){1}', 'ig');
if(o.name.search(reg) !== -1) {
return o;
}else if(o.description.search(reg) !== -1) {
return o;
}else {
return null
}
}).filter(a => a!==null);
}
onSort(list) {
return list.sort((a, b) => {
return new Date(b.createTime) - new Date(a.createTime);
});
}
handleVisibleChange = (flag) => {
this.setState({ visibleGroupMenu: flag });
}
createGroupMenu = (selectedRecord) => {
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 ? 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 ? (
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}} onTitleClick={(item) => {
dispatch({ type: 'dataSource/setCurrentGroup', group1: p });
if(selectedRecord) {
dispatch({ type: 'dataSource/remoteSetDataSourceGroup', dataSource: selectedRecord, group: p });
}
this.hideGroupMenu();
}}>
{c.map(c => {
return ( {
dispatch({ type: 'dataSource/setCurrentGroup', group1: p, group2: c });
if(selectedRecord) {
dispatch({ type: 'dataSource/remoteSetDataSourceGroup', dataSource: selectedRecord, group: c });
}
}}>{c.label})
})}
) : (
{
dispatch({ type: 'dataSource/setCurrentGroup', group1: p });
this.hideGroupMenu();
}}>{p.label}
);
});
}
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];
return children.map(c => {
return (
{
dispatch({ type: 'dataSource/setCurrentGroup', group1: parentGroup, group2: c });
}}>{c.label}
);
})
}
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 (
{
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} });
}} /> {
dispatch({ type: 'dataSource/remoteAddGroup', pgroup: p });
}}/> {
dispatch({ type: 'dataSource/remoteDeleteGroup', group: p });
}}/>) : p.label} key={p.code}>
{
children.filter(c => c.pcode === p.code).sort((a, b) => a.index - b.index).map(c => {
return (
{
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) => {
console.log(e.target.value);
}}/> {
dispatch({ type: 'dataSource/remoteDeleteGroup', group: c });
}}/>) : p.label
} key={c.code} />
)
})
}
)
});
return groupTree;
}
hideGroupMenu = () => {
this.setState({
visibleGroupMenu: false
});
}
onDrop = (info) => {
const { dispatch } = this.props;
const dropCode = info.node.props.eventKey;
const dragCode = info.dragNode.props.eventKey;
const dropPos = info.node.props.pos.split('-');
const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]); // -1/0/1 -> 兄/子/弟
console.log(dragCode, dropCode, dropPosition);
dispatch({ type: 'dataSource/remoteMoveGroup', dragCode, dropCode, dropPosition });
}
render() {
const { dataSource, dispatch } = this.props;
const { selectedRecord } = this.state;
const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符
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 = (
);
const dataSourceColumns = [{
title: '名称',
dataIndex: 'name',
key: 'name',
width: 100,
render: (text, record) => {
return
{ filterLabel ?
(text.split(new RegExp(`(${filterLabel})`, 'i')).map((fragment, i) => {
return (
fragment.toLowerCase().replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1') === filterLabel.toLowerCase() ?
{fragment} :
fragment
)
}
)) : text
}
}
}, {
title: '说明',
dataIndex: 'description',
key: 'description',
width: 200,
render: (text, record) => {
return (
{ filterLabel ?
(text.split(new RegExp(`(${filterLabel})`, 'i')).map((fragment, i) => {
return (
fragment.toLowerCase().replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1') === filterLabel.toLowerCase() ?
{fragment} :
fragment
)
}
)) : text
}
)
}
}, {
title: '创建人',
dataIndex: 'creator',
key: 'creator',
width: 100
}, {
title: '创建时间',
dataIndex: 'createTime',
key: 'createTime',
render: (text, record) => dateFormat(text, 'yyyy-MM-dd hh:mm:ss'),
width: 100
}, {
title: '操作',
key: 'action',
render: (text, record, index) => (
),
width: 50
}];
return (
分组管理
{
dispatch({ type: 'dataSource/remoteAddGroup' });
}}>添加分组
} trigger="click" placement="bottomLeft" content={(
{
this.createGroupTree(true)
}
)}>
{dataSource.currentGroup[0].label}
{dataSource.currentGroup[1] && (
{dataSource.currentGroup[1].label}
)}
{
dispatch({ type: 'dataSource/setFilterLabel', label: e.target.value });
}}
/>
{
const type = item.key;
dispatch({ type: 'dataSource/resetNewModel' });
dispatch({ type: 'dataSource/setNewModelField', name: 'type', value: type });
dispatch({type: 'main/redirect', path: {pathname: '/datasource/'+ type +'/create/base'}});
}}>
数据库
文件
)} trigger={['click']}>
}>
{
return {
onClick: () => {this.setState({ selectedRecord: record})}
}
}}
/>
)
}
}
function mapStateToProps({present: {dataSource, dataConnect}}) {
return { dataSource, dataConnect }
}
export default connect(mapStateToProps)(DataSource)