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 Loading from '../common/loading/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(); if(currentMenu && currentMenu.code !== '-1') { dispatch({ type: 'dashboard/remoteMenuDashboardList', menuCode: currentMenu.code }); }else { // dispatch({ type: 'dashboard/fetchList' }); } let tableBody = document.getElementsByClassName('ant-table-body')[0]; tableBody.scrollTo && tableBody.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; 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.error(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.filter(c => c.type === 'menu').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} } }) } render() { const { dispatch, dashboard, main } = this.props; const { visibleShareBox, shareUrl, visibleDistributeBox, visibleTransferBox, visibleDeleteBox, visibleCopyBox, selectedRecord, defaultSelectedGroups, defaultSelectedUsers } = this.state const { currentUser } = main; const { listLoading, 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 || currentUser.role === 'superAdmin') && { dispatch({ type: 'dashboard/getShareKey', record: selectedRecord, delay: 7 }).then((key) => { let obj = { visibleShareBox: true, shareUrl: window.location.origin + window.location.pathname + '#/dashboard/share_key/' + key }; obj['visibleOperatingMenu' + selectedRecord.code] = false; this.setState(obj); }); }}> 分享 } { selectedRecord && (currentUser.code === selectedRecord.creatorCode || currentUser.role === 'superAdmin') && } {/* { selectedRecord && (currentUser.code === selectedRecord.creatorCode || currentUser.role === 'superAdmin') && 分发 } */} { selectedRecord && (currentUser.code === selectedRecord.creatorCode || currentUser.role === 'superAdmin') && { let obj = {visibleTransferBox: true}; obj['visibleOperatingMenu' + selectedRecord.code] = false; this.setState(obj); }} > 移交 } { selectedRecord && (currentUser.code === selectedRecord.creatorCode || currentUser.role === 'superAdmin') && } { selectedRecord && (currentUser.code === selectedRecord.creatorCode || currentUser.role === 'superAdmin') && 移动到}> {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 || currentUser.role === 'superAdmin') && { 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 ( { [].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)