import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import {connect} from 'react-redux'
|
import { fromJS } from 'immutable'
|
import {Tabs, BackTop, notification} from 'antd'
|
import { RedoOutlined, CloseOutlined } from '@ant-design/icons'
|
import moment from 'moment'
|
import 'moment/locale/zh-cn'
|
|
import { initActionPermission } from '@/store/action'
|
import asyncComponent from '@/utils/asyncLoadComponent'
|
import NotFount from '@/components/404'
|
import options from '@/store/options.js'
|
import MKEmitter from '@/utils/events.js'
|
import Api from '@/api'
|
import './index.scss'
|
|
const Home = asyncComponent(() => import('@/tabviews/home'))
|
const CustomPage = asyncComponent(() => import('@/tabviews/custom'))
|
const CommonTable = asyncComponent(() => import('@/tabviews/commontable'))
|
// const BaseTable = asyncComponent(() => import('@/tabviews/basetable'))
|
const CalendarPage = asyncComponent(() => import('@/tabviews/calendar'))
|
const TreePage = asyncComponent(() => import('@/tabviews/treepage'))
|
const TabManage = asyncComponent(() => import('@/tabviews/tabmanage'))
|
const Iframe = asyncComponent(() => import('@/tabviews/iframe'))
|
const RoleManage = asyncComponent(() => import('@/tabviews/rolemanage'))
|
const FormTab = asyncComponent(() => import('@/tabviews/formtab'))
|
|
class TabViews extends Component {
|
static propTpyes = {
|
collapse: PropTypes.bool
|
}
|
|
state = {
|
activeId: '',
|
tabviews: null, // 标签集
|
iFrameHeight: 0,
|
}
|
|
// 关闭tab页,重新选择显示页
|
closeTabView = (id) => {
|
let tabs = fromJS(this.state.tabviews).toJS()
|
let index = -1
|
|
tabs = tabs.filter((tab, i) => {
|
if (tab.MenuID === id) {
|
index = i
|
return false
|
} else {
|
return true
|
}
|
})
|
|
if (index > -1) {
|
let activeId = ''
|
if (id !== this.state.activeId) {
|
activeId = this.state.activeId
|
} else if (index > 0) {
|
activeId = tabs[index - 1].MenuID || ''
|
} else if (tabs[index]) {
|
activeId = tabs[index].MenuID || ''
|
}
|
|
this.setState({
|
activeId,
|
tabviews: tabs
|
})
|
|
let node = document.getElementById('root').parentNode.parentNode
|
if (node) {
|
node.scrollTop = 0
|
}
|
}
|
}
|
|
refreshTabview = (e, menu) => {
|
e.stopPropagation()
|
window.GLOB.CacheMap = new Map()
|
|
if (options.sysType === 'local' && window.GLOB.systemType !== 'production') {
|
let roledefer = new Promise(resolve => {
|
Api.getSystemConfig({
|
func: 's_Get_TrdMenu_Role',
|
edition_type: 'A',
|
pro_sys: ''
|
}).then(result => {
|
if (!result) return
|
if (!result.status) {
|
notification.error({
|
top: 92,
|
message: result.message,
|
duration: 10
|
})
|
} else {
|
let _permAction = {loaded: true} // 按钮权限
|
|
if (result.UserRoles_Menu) {
|
result.UserRoles_Menu.forEach(menu => {
|
if (!menu.MenuID) return
|
_permAction[menu.MenuID] = true
|
})
|
}
|
|
this.props.initActionPermission(_permAction)
|
}
|
|
resolve()
|
})
|
})
|
|
// 获取主菜单参数
|
let menudefer = new Promise(resolve => {
|
Api.getAppVersion().then(() => {
|
resolve()
|
}, () => {
|
resolve()
|
})
|
})
|
|
Promise.all([roledefer, menudefer]).then(() => {
|
MKEmitter.emit('reloadMenuView', menu.MenuID)
|
})
|
} else {
|
MKEmitter.emit('reloadMenuView', menu.MenuID)
|
}
|
}
|
|
modifyTabs = (tab, type, fixed) => {
|
const { tabviews, activeId } = this.state
|
|
if (type === 'plus' && fixed) {
|
let _tabs = tabviews.filter(item => item.MenuID !== tab.MenuID)
|
let index = _tabs.findIndex(item => item.MenuID === activeId)
|
|
this.setState({
|
tabviews: _tabs
|
}, () => {
|
if (index > -1) {
|
_tabs.splice(index + 1, 0, tab)
|
} else {
|
_tabs.push(tab)
|
}
|
this.setState({
|
tabviews: _tabs,
|
activeId: tab.MenuID
|
})
|
})
|
} else if (type === 'plus') {
|
if (tabviews.findIndex(item => item.MenuID === tab.MenuID) > -1) {
|
let _tabs = tabviews.filter(item => item.MenuID !== tab.MenuID)
|
this.setState({
|
tabviews: _tabs
|
}, () => {
|
this.setState({
|
tabviews: [..._tabs, tab],
|
activeId: tab.MenuID
|
})
|
})
|
} else {
|
this.setState({
|
tabviews: [...tabviews, tab],
|
activeId: tab.MenuID
|
})
|
}
|
} else if (type === 'replace') {
|
this.setState({
|
tabviews: tab ? [tab] : [],
|
activeId: tab ? tab.MenuID : ''
|
})
|
}
|
|
let node = document.getElementById('root').parentNode.parentNode
|
if (node) {
|
node.scrollTop = 0
|
}
|
}
|
|
changeTab = (e, menu) => {
|
e.stopPropagation()
|
// 窗口切换
|
|
this.setState({
|
activeId: menu.MenuID || ''
|
}, () => {
|
MKEmitter.emit('resetActiveMenu', menu.MenuID || '')
|
})
|
}
|
|
selectcomponent = (view) => {
|
// 根据tab页中菜单信息,选择所需的组件
|
if (view.type === 'Home') {
|
return (<Home MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
|
} else if (view.type === 'CommonTable') {
|
return (<CommonTable MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
|
// } else if (view.type === 'BaseTable') {
|
// return (<BaseTable MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
|
} else if (view.type === 'CustomPage') {
|
return (<CustomPage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
|
} else if (view.type === 'TreePage') {
|
return (<TreePage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
|
} else if (view.type === 'CalendarPage') {
|
return (<CalendarPage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
|
} else if (view.type === 'TabManage') {
|
return (<TabManage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
|
} else if (view.type === 'RolePermission') {
|
return (<RoleManage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
|
} else if (view.type === 'FormTab') {
|
return (<FormTab MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
|
} else if (view.type === 'iframe') {
|
return (<Iframe key={view.MenuID} MenuID={view.MenuID} MenuNo={view.MenuNo} title={view.MenuName} MenuName={view.MenuName} url={window.GLOB.baseurl + 'zh-CN/' + view.LinkUrl}/>)
|
} else {
|
return (<NotFount key={view.MenuID} />)
|
}
|
}
|
|
UNSAFE_componentWillMount () {
|
if (!sessionStorage.getItem('lang') || sessionStorage.getItem('lang') === 'zh-CN') {
|
moment.locale('zh-cn')
|
} else {
|
moment.locale('en')
|
}
|
|
if (sessionStorage.getItem('isEditState') !== 'true') {
|
this.setState({
|
activeId: 'home_page_id',
|
tabviews: [{
|
MenuID: 'home_page_id',
|
MenuName: '首页',
|
type: 'Home'
|
}]
|
})
|
} else {
|
this.setState({
|
activeId: '',
|
tabviews: []
|
})
|
}
|
}
|
|
componentDidMount () {
|
MKEmitter.addListener('modifyTabs', this.modifyTabs)
|
MKEmitter.addListener('closeTabView', this.closeTabView)
|
}
|
|
/**
|
* @description 组件销毁,清除state更新
|
*/
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
MKEmitter.removeListener('modifyTabs', this.modifyTabs)
|
MKEmitter.removeListener('closeTabView', this.closeTabView)
|
}
|
|
render () {
|
const { tabviews, activeId } = this.state
|
|
return (
|
<section id="mk-tabview-wrap" className={'mk-tabview-wrap' + (this.props.collapse ? ' collapsed' : '') + (tabviews && tabviews.length > 0 ? ' hastab' : '')}>
|
<div className="content-header">
|
{tabviews && tabviews.length > 0 &&
|
<Tabs activeKey={activeId}>
|
{tabviews.map((view, index) => {
|
return (
|
<Tabs.TabPane
|
tab={
|
<span className="tab-control">
|
<RedoOutlined onClick={(e) => {this.refreshTabview(e, view)}}/>
|
<span className="tab-name" onClick={(e) => {this.changeTab(e, view)}}>
|
{view.MenuName}
|
</span>
|
{view.type !== 'Home' ?
|
<CloseOutlined onClick={(e) => {e.stopPropagation();this.closeTabView(view.MenuID)}}/> : null
|
}
|
</span>
|
}
|
key={view.MenuID}
|
>
|
{this.selectcomponent(view)}
|
<BackTop>
|
<div className="ant-back-top">
|
<div className="ant-back-top-content">
|
<div className="ant-back-top-icon"></div>
|
</div>
|
</div>
|
</BackTop>
|
{/* {options.sysType === 'local' && window.GLOB.systemType !== 'production' ? <div className="mk-water-mark">测试系统</div> : null} */}
|
</Tabs.TabPane>
|
)
|
})}
|
</Tabs>
|
}
|
</div>
|
</section>
|
)
|
}
|
}
|
|
const mapStateToProps = (state) => {
|
return {
|
collapse: state.collapse,
|
}
|
}
|
|
const mapDispatchToProps = (dispatch) => {
|
return {
|
initActionPermission: (permAction) => dispatch(initActionPermission(permAction))
|
}
|
}
|
|
export default connect(mapStateToProps, mapDispatchToProps)(TabViews)
|