import React from 'react' import { Layout, Button, Icon, Table, Menu, Dropdown, Card, Col, Row, Select } from 'antd' import { connect } from 'dva' import TransferBox from '../common/selectUserBox/selectUserBox'; import AccessObjectBox from '../common/accessObjectBox/accessObjectBox' import { dateFormat } from '../../utils/baseUtils' import DeleteBox from '../common/deleteBox/deleteBox' import ShareBox from './shareBox' import CopyBox from './copyBox' import ListFilter from '../common/listFilter/index' import EllipsisTooltip from '../common/ellipsisTooltip/index' import CusIcon from '../common/cusIcon/index' import './list.less' const { Content } = Layout const { Option } = Select class DashboardList extends React.Component { constructor(props) { super(props); this.state = { selectedRecord: null, visibleChooseDataSourceBox: false, visibleDistributeBox: false, visibleShareBox: false, shareUrl: '', visibleTransferBox: false, visibleGroupMenu: false, // 显示分组菜单 visibleDeleteBox: false, visibleCopyBox: false, defaultSelectedGroups: [], defaultSelectedUsers: [], } } componentDidMount() { const { dashboard, dispatch } = this.props; const { currentMenu } = dashboard; this.setScrollTableHeight(); console.log(currentMenu); if(currentMenu && currentMenu.code !== '-1') { dispatch({ type: 'dashboard/remoteMenuDashboardList', menuCode: currentMenu.code }); }else { // dispatch({ type: 'dashboard/fetchList' }); } document.getElementsByClassName('ant-table-body')[0].scrollTo(0, dashboard.listScrollTop); } componentWillUnmount() { const { dispatch } = this.props; window.removeEventListener('resize', this.setBodyWidth); dispatch({ type: 'dashboard/setField', name: 'listScrollTop', value: document.getElementsByClassName('ant-table-body')[0].scrollTop }); } /** * 根据视图设置表格高度以呈现滚动条 */ setScrollTableHeight() { const view = document.getElementsByClassName('dashboard-view')[0]; const mainContentBody = view.getElementsByClassName('dashboard-body')[0]; const tableContentBody = mainContentBody.getElementsByClassName('ant-card-body')[0]; const tableHeader = tableContentBody.getElementsByClassName('ant-table-header')[0]; const tableBody = tableContentBody.getElementsByClassName('ant-table-body')[0]; // 如果上下padding不一致就有问题了 const padding = tableContentBody.children[0].getBoundingClientRect().top - tableContentBody.getBoundingClientRect().top; // table容器高度 - 上下padding - 表头高度 - 边框线宽 tableBody.style.maxHeight = `${tableContentBody.offsetHeight - padding * 2 - tableHeader.offsetHeight - 2}px`; } getShareList = () => { new Promise((resolve, reject) => { const { dispatch } = this.props; const { selectedRecord } = this.state; dispatch({ type: 'dashboard/shareList', code: selectedRecord.code }) .then( (resolve) => { const resData = resolve.data.data; const { groupNames: defaultSelectedGroups, userNames: defaultSelectedUsers } = resData; this.setState({ visibleDistributeBox: true, defaultSelectedGroups: defaultSelectedGroups.map(g => ({ code: g.id + '', name: g.name })), defaultSelectedUsers: defaultSelectedUsers.map(u => ({ code: u.id + '', name: u.name })), }); } ).catch(reject => { console.log(reject); }); }); } handleVisibleChange = (flag) => { this.setState({ visibleGroupMenu: flag }); } hideGroupMenu = () => { this.setState({ visibleGrouMenu: false }); } distribute = (group, geren) => { const { dispatch } = this.props; const { selectedRecord } = this.state; let targets = group.map(g => ({ code: g.code, name: g.name, isGroup: true })).concat(geren.map(g => ({ code: g.code, name: g.name, isGroup: false }))) dispatch({ type: 'dashboard/share', code: selectedRecord.code, targets }); } onSearch(list, dashboard) { const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符 let filterLabel = dashboard.filterLabel ? (dashboard.filterLabel + '').replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1') : ''; // 添加转义符号 let filterItem = dashboard.filterItem; let filterReg = new RegExp('(' + filterLabel + '){1}', 'ig'); return list.map(l => { let o = Object.assign({}, l); 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 = new Date(o[filterItem.name]).getTime(); if(nowTime>=start && nowTime<=end){ return o; } return null }else{ return null } }else { return ((o[filterItem.name] + '').search(filterReg) > -1) ? o : null } }).filter(a => a!==null); } onSort(list) { return list.sort((a, b) => { return new Date(b.createTime) - new Date(a.createTime); }); } generateFilterItems = () => { const { filterItems } = this.props.dashboard; return filterItems.map(t => ); } generateMenuItems = (menuTree) => { const { dispatch } = this.props; const { selectedRecord } = this.state; return menuTree.filter(t => t.type === 'menu').map(t => { if(t.children && t.children.length > 0) { return {t.name} : t.name} onTitleClick={() => { dispatch({ type: 'dashboard/remoteSetMenu', dashboard: selectedRecord, menu: t }); let obj = {selectedRecord: null}; obj['visibleOperatingMenu' + selectedRecord.code] = false; this.setState(obj); }} > {this.generateMenuItems(t.children)} }else { return { dispatch({ type: 'dashboard/remoteSetMenu', dashboard: selectedRecord, menu: t }); let obj = {selectedRecord: null}; obj['visibleOperatingMenu' + selectedRecord.code] = false; this.setState(obj); }}>{selectedRecord.menuCode === t.code ? {t.name} : t.name} } }) } // generateCurrentMenu = () => { // const { currentMenuParents } = this.props.dashboard; // let arr = []; // for(let i = currentMenuParents.length - 1; i >= 0; i--) { // arr.push(); // } // return arr; // } render() { const { dispatch, dashboard, main } = this.props; const { visibleShareBox, shareUrl, visibleDistributeBox, visibleTransferBox, visibleDeleteBox, visibleCopyBox, selectedRecord, defaultSelectedGroups, defaultSelectedUsers } = this.state const { currentUser } = main; const { menuTree, filterItem, currentMenu, currentMenuParents } = dashboard; const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符 let filterLabel = dashboard.filterLabel ? (dashboard.filterLabel + '').replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1') : ''; // 添加转义符号 const moreOperatingMenu = ( { selectedRecord && currentUser.code === selectedRecord.creatorCode && { dispatch({ type: 'dashboard/getShareKey', record: selectedRecord, delay: 7 }).then((key) => { let obj = { visibleShareBox: true, shareUrl: window.location.origin + '/#/dashboard/share_key/' + key }; obj['visibleOperatingMenu' + selectedRecord.code] = false; this.setState(obj); }); }}> 分享 } { selectedRecord && currentUser.code === selectedRecord.creatorCode && } {/* { selectedRecord && currentUser.code === selectedRecord.creatorCode && 分发 } */} { selectedRecord && currentUser.code === selectedRecord.creatorCode && { let obj = {visibleTransferBox: true}; obj['visibleOperatingMenu' + selectedRecord.code] = false; this.setState(obj); }} > 移交 } { selectedRecord && currentUser.code === selectedRecord.creatorCode && } { selectedRecord && currentUser.code === selectedRecord.creatorCode && 移动到}> {this.generateMenuItems(menuTree)} } { selectedRecord && (selectedRecord.dataConnects.length <= 1) && { let obj = {visibleCopyBox: true}; obj['visibleOperatingMenu' + selectedRecord.code] = false; this.setState(obj); }} > 复制 } { selectedRecord && currentUser.code === selectedRecord.creatorCode && { let obj = {visibleDeleteBox: true}; obj['visibleOperatingMenu' + selectedRecord.code] = false; this.setState(obj); }} > 删除 } ) const dashboardColumns = [{ title: '名称', dataIndex: 'name', key: 'name', width: 100, render: (text, record) => { return ( { dispatch({ type: 'dashboardDesigner/reset' }); dispatch({ type: 'main/redirect', path: '/dashboard/' + record.code }); dispatch({ type: 'recent/addRecentRecord', tarId: record.code, recordType: 1}); }}> { filterLabel && filterItem.name === 'name' ? ((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, onCell: () => { return { style: { whiteSpace: 'nowrap', maxWidth: 200, } } }, render: (text) => { filterLabel && filterItem.name === 'description' ? ((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: 'creatorName', key: 'creatorName', width: 100, render: (text, record) => { return ( { filterLabel && filterItem.name === 'creatorName' ? ((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: 'createTime', key: 'createTime', render: (text, record) => dateFormat(text, 'yyyy-MM-dd hh:mm:ss'), width: 100 }, { title: '操作', key: 'action', render: (text, record, index) => ( { let obj = {}; obj['visibleOperatingMenu' + record.code] = visible; this.setState(obj) }}> ), width: 50 }]; return ( {/* { this.generateCurrentMenu() } */} { [].concat(currentMenuParents).reverse().map(m => m.name).join(' > ') } }> { return { onClick: () => { this.setState({ selectedRecord: record}) } } }} /> {visibleDistributeBox && { this.setState({ visibleDistributeBox: false }) }} okHandler={this.distribute} defaultSelectedGroups={defaultSelectedGroups} defaultSelectedUsers={defaultSelectedUsers} />} {visibleTransferBox && { dispatch({ type: 'dashboard/transfer', dashboardCode: this.state.selectedRecord.code, userCode: user.code }); }} hideBox={() => { this.setState({ visibleTransferBox: false }) }} />} {visibleDeleteBox && { this.setState({ visibleDeleteBox: false }) }} okHandler={() => { dispatch({ type: 'dashboard/remoteDelete', code: this.state.selectedRecord.code }) }} />} {visibleShareBox && { this.setState({ visibleShareBox: false }) }} onRefreshKey={(delay) => { return dispatch({ type: 'dashboard/getShareKey', record: this.state.selectedRecord, delay: delay }) .then((key) => { this.setState({ shareUrl: window.location.origin + '/#/dashboard/share_key/' + key }) }) }} />} {visibleCopyBox && {this.setState({visibleCopyBox: false})}} currentDashboardCode={selectedRecord.code} currentDataConnect={selectedRecord.dataConnects[0]} />} ) } } export default connect(({ present: { main, dashboard } }) => ({ main, dashboard }))(DashboardList)