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, BackTop} from 'antd'
|
import enUS from 'antd/es/locale/en_US'
|
import zhCN from 'antd/es/locale/zh_CN'
|
import moment from 'moment'
|
import 'moment/locale/zh-cn'
|
|
import {modifyTabview, toggleIsiframe, refreshTabView} from '@/store/action'
|
import asyncComponent from '@/utils/asyncLoadComponent'
|
import NotFount from '@/components/404'
|
import options from '@/store/options.js'
|
import mzhCN from '@/locales/zh-CN/main.js'
|
import menUS from '@/locales/en-US/main.js'
|
|
import './index.scss'
|
|
const Home = asyncComponent(() => import('@/tabviews/home'))
|
const CommonTable = asyncComponent(() => import('@/tabviews/commontable'))
|
const TreePage = asyncComponent(() => import('@/tabviews/treepage'))
|
const VerupTable = asyncComponent(() => import('@/tabviews/verupmanage'))
|
const ScriptTable = asyncComponent(() => import('@/tabviews/scriptmanage'))
|
const TabManage = asyncComponent(() => import('@/tabviews/tabmanage'))
|
const Iframe = asyncComponent(() => import('@/tabviews/iframe'))
|
const DataManage = asyncComponent(() => import('@/tabviews/datamanage'))
|
const RoleManage = asyncComponent(() => import('@/tabviews/rolemanage'))
|
const TabForm = asyncComponent(() => import('@/tabviews/tabform'))
|
const FormTab = asyncComponent(() => import('@/tabviews/formtab'))
|
|
let service = ''
|
|
if (process.env.NODE_ENV === 'production') {
|
service = document.location.origin + '/' + window.GLOB.service + 'zh-CN/'
|
} else {
|
service = window.GLOB.location + window.GLOB.service + 'zh-CN/'
|
}
|
|
class Header extends Component {
|
static propTpyes = {
|
collapse: PropTypes.bool,
|
tabviews: PropTypes.array // 标签页数组
|
}
|
|
state = {
|
tabviews: null, // 标签集
|
iFrameHeight: 0,
|
dict: localStorage.getItem('lang') !== 'en-US' ? mzhCN : menUS,
|
locale: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS
|
}
|
|
handleTabview = (e, menu) => {
|
e.stopPropagation()
|
// 关闭tab页,重新选择显示页
|
let tabs = JSON.parse(JSON.stringify(this.state.tabviews))
|
tabs = tabs.filter(tab => {
|
return tab.MenuID !== menu.MenuID
|
})
|
|
if (menu.selected) {
|
tabs[0] && (tabs[0].selected = true)
|
}
|
|
this.props.modifyTabview(tabs)
|
}
|
|
refreshTabview = (e, menu) => {
|
e.stopPropagation()
|
window.GLOB.CacheMap = new Map()
|
|
let _menu = {
|
MenuID: menu.MenuID,
|
position: 'view'
|
}
|
this.props.refreshTabView(_menu)
|
}
|
|
changeTab = (e, menu) => {
|
e.stopPropagation()
|
// 窗口切换
|
let tabs = JSON.parse(JSON.stringify(this.state.tabviews))
|
tabs = tabs.map(tab => {
|
tab.selected = false
|
|
if (tab.MenuID === menu.MenuID) {
|
tab.selected = true
|
}
|
|
return tab
|
})
|
|
this.setState({
|
tabviews: tabs
|
})
|
|
this.props.modifyTabview(tabs)
|
}
|
|
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' || view.type === 'ManageTable') {
|
return (<CommonTable 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 === 'VerupTable') {
|
return (<VerupTable MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
|
} else if (view.type === 'ScriptTable') {
|
return (<ScriptTable MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
|
} else if (view.type === 'TabManage') {
|
return (<TabManage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
|
} else if (view.type === 'DataManage') {
|
return (<DataManage 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 === 'TabForm') {
|
return (<TabForm MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
|
} 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} title={view.MenuName} MenuName={view.MenuName} url={service + 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')
|
}
|
this.setState({
|
tabviews: this.props.tabviews
|
})
|
}
|
|
componentDidMount () {
|
let home = {
|
MenuID: '1576117946681plembmkk9akkv8sn0vtdfdsfaf',
|
MenuName: '首页',
|
MenuNo: 'MESOrderDetailMwe',
|
PageParam: {},
|
id: 1,
|
selected: true,
|
src: '',
|
text: '首页',
|
type: 'Home'
|
}
|
this.props.modifyTabview([home])
|
}
|
|
UNSAFE_componentWillReceiveProps (nextProps) {
|
if (nextProps.tabviews && !is(fromJS(this.state.tabviews), fromJS(nextProps.tabviews))) {
|
// 保存修改标签集
|
this.setState({
|
tabviews: nextProps.tabviews
|
})
|
|
let node = document.getElementById('root').parentNode.parentNode
|
if (node) {
|
node.scrollTop = 0
|
}
|
}
|
}
|
|
render () {
|
const { tabviews } = this.state
|
let view = tabviews.filter(tab => tab.selected)[0]
|
this.resetWindow(view)
|
let selectedTabId = view ? view.MenuID : ''
|
|
return (
|
<section className={'flex-container content-box' + (this.props.collapse ? ' collapsed' : '')}>
|
<ConfigProvider locale={this.state.locale}>
|
<div className="content-header">
|
{tabviews && tabviews.length > 0 &&
|
<Tabs activeKey={selectedTabId}>
|
{tabviews.map(view => {
|
return (
|
<Tabs.TabPane
|
tab={
|
<span className="tab-control">
|
{['CommonTable', 'FormTab', 'TreePage'].includes(view.type) ?
|
<Icon type="redo" onClick={(e) => {this.refreshTabview(e, view)}}/> : null
|
}
|
<span className="tab-name" onClick={(e) => {this.changeTab(e, view)}}>
|
{view.MenuName}
|
</span>
|
{view.type !== 'Home' ?
|
<Icon type="close" onClick={(e) => {this.handleTabview(e, view)}}/> : null
|
}
|
</span>
|
}
|
key={view.MenuID}
|
>
|
{this.selectcomponent(view)}
|
{options.sysType !== 'cloud' && !['CommonTable', 'TreePage', 'ManageTable'].includes(view.type) ?
|
<Button
|
icon="copy"
|
shape="circle"
|
className={'main-copy ' + (view.type === 'iframe' ? 'ifr-copy' : '')}
|
data-menuno={view.MenuNo}
|
onClick={this.copyMenuNo}
|
/> : null
|
}
|
<BackTop>
|
<div className="ant-back-top">
|
<div className="ant-back-top-content">
|
<div className="ant-back-top-icon"></div>
|
</div>
|
</div>
|
</BackTop>
|
</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)),
|
refreshTabView: (refreshTab) => dispatch(refreshTabView(refreshTab)),
|
toggleIsiframe: (isiframe) => dispatch(toggleIsiframe(isiframe))
|
}
|
}
|
|
export default connect(mapStateToProps, mapDispatchToProps)(Header)
|