import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import {connect} from 'react-redux'
|
import { is, fromJS } from 'immutable'
|
import {Tabs, Icon, Button, ConfigProvider, message} from 'antd'
|
import {modifyTabview, toggleIsiframe} from '@/store/action'
|
import asyncComponent from '@/utils/asyncComponent'
|
import NotFount from '@/components/404'
|
import enUS from 'antd/es/locale/en_US'
|
import zhCN from 'antd/es/locale/zh_CN'
|
import mzhCN from '@/locales/zh-CN/main.js'
|
import menUS from '@/locales/en-US/main.js'
|
import moment from 'moment'
|
import 'moment/locale/zh-cn'
|
import './index.scss'
|
|
|
let Comps = {}
|
|
class Header extends Component {
|
static propTpyes = {
|
collapse: PropTypes.bool,
|
tabviews: PropTypes.array // 标签页数组
|
}
|
|
state = {
|
selectedTabId: '', // 当前选中tab页面
|
iFrameHeight: 0,
|
dict: (!sessionStorage.getItem('lang') || sessionStorage.getItem('lang') === 'zh-CN') ? mzhCN : menUS,
|
locale: (!sessionStorage.getItem('lang') || sessionStorage.getItem('lang') === 'zh-CN') ? zhCN : enUS
|
}
|
|
handleTabview (menu) {
|
// 关闭tab页,重新选择显示页
|
let tabs = JSON.parse(JSON.stringify(this.props.tabviews))
|
tabs = tabs.filter(tab => {
|
if (tab.MenuID === this.state.selectedTabId) {
|
tab.selected = true
|
} else {
|
tab.selected = false
|
}
|
return tab.MenuID !== menu.MenuID
|
})
|
if (menu.MenuID === this.state.selectedTabId) {
|
tabs[0] && (tabs[0].selected = true)
|
}
|
this.props.modifyTabview(tabs)
|
}
|
|
changeTab (menu) {
|
// 窗口切换
|
this.setState({
|
selectedTabId: menu.MenuID
|
})
|
|
this.resetWindow(menu)
|
}
|
|
selectcomponent (view) {
|
// 根据tab页中菜单信息,选择所需的组件
|
if (view.type === 'CommonTable') {
|
return (<Comps.CommonTable MenuNo={view.MenuNo} key={view.MenuID}/>)
|
} else if (view.type === 'DataManage') {
|
return (<Comps.DataManage MenuNo={view.MenuNo} key={view.MenuID}/>)
|
} else if (view.type === 'RoleManage') {
|
return (<Comps.RoleManage MenuNo={view.MenuNo} key={view.MenuID}/>)
|
} else if (view.type === 'iframe') {
|
return (<Comps.Iframe key={view.MenuID} title={view.MenuName} url={'http://qingqiumarket.cn/MKWMS/zh-CN/' + view.LinkUrl}/>)
|
} else {
|
return (<NotFount key={view.MenuID} />)
|
}
|
}
|
|
resetWindow (view) {
|
// 窗口在iframe与普通页面切换时,修改左侧菜单栏样式
|
if (!view) return
|
let _isiframe = this.props.isiframe
|
if (view && view.type === 'iframe') {
|
_isiframe = true
|
} else {
|
_isiframe = false
|
}
|
|
if (_isiframe !== this.props.isiframe) {
|
this.props.toggleIsiframe(_isiframe)
|
}
|
}
|
|
copyMenuNo = (e) => {
|
e.stopPropagation()
|
let oInput = document.createElement('input')
|
oInput.value = e.target.dataset.menuno || ''
|
document.body.appendChild(oInput)
|
oInput.select()
|
document.execCommand('Copy')
|
oInput.className = 'oInput'
|
oInput.style.display='none'
|
message.success(this.state.dict['main.copy.success'])
|
}
|
|
UNSAFE_componentWillMount () {
|
if (!sessionStorage.getItem('lang') || sessionStorage.getItem('lang') === 'zh-CN') {
|
moment.locale('zh-cn')
|
} else {
|
moment.locale('en')
|
}
|
}
|
|
UNSAFE_componentWillReceiveProps (nextProps) {
|
if (nextProps.tabviews && !is(fromJS(this.props.tabviews), fromJS(nextProps.tabviews))) {
|
// tab窗口页增加或删除
|
if (nextProps.tabviews.length > this.props.tabviews.length) {
|
// 查看新tab页需要组件是否加载
|
let newtab = nextProps.tabviews[nextProps.tabviews.length - 1]
|
if (!Comps.CommonTable && newtab.type === 'CommonTable') {
|
Comps.CommonTable = asyncComponent(() => import('@/tabviews/commontable'))
|
} else if (!Comps.Iframe && newtab.type === 'iframe') {
|
Comps.Iframe = asyncComponent(() => import('@/tabviews/iframe'))
|
} else if (!Comps.DataManage && newtab.type === 'DataManage') {
|
Comps.DataManage = asyncComponent(() => import('@/tabviews/datamanage'))
|
} else if (!Comps.DataManage && newtab.type === 'RoleManage') {
|
Comps.RoleManage = asyncComponent(() => import('@/tabviews/rolemanage'))
|
}
|
}
|
|
// 设置选中窗口
|
let view = nextProps.tabviews.filter(tab => tab.selected)[0]
|
this.setState({
|
selectedTabId: view ? view.MenuID : ''
|
})
|
|
this.resetWindow(view)
|
}
|
}
|
|
shouldComponentUpdate(nextProps, nextState) {
|
return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
render () {
|
return (
|
<section className={'flex-container content-box' + (this.props.collapse ? ' collapsed' : '')}>
|
<ConfigProvider locale={this.state.locale}>
|
<div className="content-header">
|
{this.props.tabviews && this.props.tabviews.length > 0 &&
|
<Tabs activeKey={this.state.selectedTabId}>
|
{this.props.tabviews.map(view => {
|
return (
|
<Tabs.TabPane
|
className="test"
|
tab={
|
<span>
|
<span className="tab-name" onClick={() => {this.changeTab(view)}}>
|
{view.MenuName}
|
</span>
|
<Icon type="close" onClick={() => {this.handleTabview(view)}}/>
|
</span>
|
}
|
key={view.MenuID}
|
>
|
{this.selectcomponent(view)}
|
<Button className={'main-copy ' + (view.type === 'iframe' ? 'ifr-copy' : '')} icon="copy" data-menuno={view.MenuNo} onClick={this.copyMenuNo} shape="circle" />
|
</Tabs.TabPane>
|
)
|
})}
|
</Tabs>
|
}
|
</div>
|
</ConfigProvider>
|
</section>
|
)
|
}
|
}
|
|
const mapStateToProps = (state) => {
|
return {
|
tabviews: state.tabviews,
|
collapse: state.collapse,
|
isiframe: state.isiframe
|
}
|
}
|
|
const mapDispatchToProps = (dispatch) => {
|
return {
|
modifyTabview: (tabviews) => dispatch(modifyTabview(tabviews)),
|
toggleIsiframe: (isiframe) => dispatch(toggleIsiframe(isiframe))
|
}
|
}
|
|
export default connect(mapStateToProps, mapDispatchToProps)(Header)
|