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 = ( { dispatch({ type: 'chartDesigner/remoteQucikAdd', dataSource: selectedRecord }); }} > 创建图表 { 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'}}); }}> 属性设置 预览数据 分组}> {this.createGroupMenu(selectedRecord)} { dispatch({ type: 'dataSource/remoteDelete', code: selectedRecord.code }); }} >删除 ); 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)