import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { is, fromJS } from 'immutable'
|
import { Tabs, Icon, Popover, Modal } from 'antd'
|
|
import MKEmitter from '@/utils/events.js'
|
import asyncComponent from '@/utils/asyncComponent'
|
|
import Utils from '@/utils/utils.js'
|
import zhCN from '@/locales/zh-CN/model.js'
|
import enUS from '@/locales/en-US/model.js'
|
import './index.scss'
|
|
const SettingComponent = asyncComponent(() => import('../tabsetting'))
|
const TabLabelComponent = asyncComponent(() => import('../tablabelform'))
|
const TabComponents = asyncComponent(() => import('../tabcomponents'))
|
|
const { TabPane } = Tabs
|
const { confirm } = Modal
|
|
class antvBarLineChart extends Component {
|
static propTpyes = {
|
menu: PropTypes.object,
|
tabs: PropTypes.object,
|
updateConfig: PropTypes.func,
|
}
|
|
state = {
|
dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
|
tabs: null,
|
editab: null,
|
labelvisible: false
|
}
|
|
UNSAFE_componentWillMount () {
|
const { tabs } = this.props
|
|
if (tabs.isNew) {
|
let _tabs = {
|
uuid: tabs.uuid,
|
type: tabs.type,
|
floor: tabs.floor,
|
subtype: tabs.subtype,
|
setting: {span: 12, position: 'top', tabStyle: 'line', name: tabs.name},
|
subtabs: [
|
{ uuid: Utils.getuuid(), label: 'Tab 1', icon: '', components: [] },
|
{ uuid: Utils.getuuid(), label: 'Tab 2', icon: '', components: [] },
|
{ uuid: Utils.getuuid(), label: 'Tab 3', icon: '', components: [] }
|
]
|
}
|
this.setState({
|
tabs: _tabs
|
})
|
this.props.updateConfig(_tabs)
|
} else {
|
this.setState({
|
tabs: fromJS(tabs).toJS()
|
})
|
}
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
return !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
updateComponent = (component) => {
|
const { tabs } = this.state
|
|
if (!is(fromJS(tabs.setting), fromJS(component.setting))) {
|
// 注册事件-标签变化,通知标签内元素
|
MKEmitter.emit('tabsChange', tabs.uuid)
|
}
|
|
this.setState({
|
tabs: component
|
})
|
this.props.updateConfig(component)
|
}
|
|
updateTabComponent = (tab) => {
|
let tabs = fromJS(this.state.tabs).toJS()
|
|
tabs.subtabs = tabs.subtabs.map(t => {
|
if (t.uuid === tab.uuid) {
|
return tab
|
} else {
|
return t
|
}
|
})
|
|
this.setState({tabs})
|
this.props.updateConfig(tabs)
|
}
|
|
tabAdd = (e) => {
|
e.stopPropagation()
|
this.setState({
|
editab: {
|
uuid: '',
|
label: '',
|
icon: '',
|
components: []
|
},
|
labelvisible: true
|
})
|
}
|
|
editTab = (tab) => {
|
this.setState({
|
editab: tab,
|
labelvisible: true
|
})
|
}
|
|
tabLabelSubmit = () => {
|
let tabs = fromJS(this.state.tabs).toJS()
|
let editab = fromJS(this.state.editab).toJS()
|
|
this.tabLabelRef.handleConfirm().then(res => {
|
editab.label = res.label
|
editab.icon = res.icon
|
|
if (editab.uuid) {
|
tabs.subtabs = tabs.subtabs.map(t => {
|
if (t.uuid === editab.uuid) {
|
return editab
|
} else {
|
return t
|
}
|
})
|
} else {
|
editab.uuid = Utils.getuuid()
|
tabs.subtabs.push(editab)
|
}
|
|
this.setState({
|
editab: null,
|
labelvisible: false,
|
tabs
|
})
|
this.props.updateConfig(tabs)
|
})
|
}
|
|
delTab = (tab) => {
|
let tabs = fromJS(this.state.tabs).toJS()
|
const _this = this
|
|
tabs.subtabs = tabs.subtabs.filter(t => t.uuid !== tab.uuid)
|
|
confirm({
|
title: '确定删除标签?',
|
content: '',
|
onOk() {
|
_this.setState({tabs})
|
_this.props.updateConfig(tabs)
|
},
|
onCancel() {}
|
})
|
}
|
|
moveSwitch = (index, index1) => {
|
let tabs = fromJS(this.state.tabs).toJS()
|
tabs.subtabs[index] = tabs.subtabs.splice(index1, 1, tabs.subtabs[index])[0]
|
|
this.setState({tabs})
|
this.props.updateConfig(tabs)
|
}
|
|
render() {
|
const { menu } = this.props
|
const { tabs, dict, labelvisible, editab } = this.state
|
|
return (
|
<div className="menu-tabs-edit-box">
|
<SettingComponent config={tabs} updateConfig={this.updateComponent} />
|
<Tabs defaultActiveKey="1" tabPosition={tabs.setting.position} type={tabs.setting.tabStyle}>
|
{tabs.subtabs.map((tab, index) => (
|
<TabPane tab={
|
<Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
|
<div className="mk-popover-control">
|
<Icon className="edit" title="edit" type="edit" onClick={() => this.editTab(tab)} />
|
{index !== 0 ? <Icon className="edit" type="arrow-left" onClick={() => this.moveSwitch(index, index - 1)} /> : null}
|
{(index + 1) !== tabs.subtabs.length ? <Icon className="edit" type="arrow-right" onClick={() => this.moveSwitch(index, index + 1)} /> : null}
|
<Icon className="close" title="delete" type="close" onClick={() => this.delTab(tab)} />
|
</div>
|
} trigger="hover">
|
<span>{tab.icon ? <Icon type={tab.icon} /> : null}{tab.label}</span>
|
</Popover>
|
} key={tab.uuid}>
|
<TabComponents menu={menu} parentId={tabs.uuid} config={tab} handleList={this.updateTabComponent} deleteCard={this.deleteCard} />
|
</TabPane>
|
))}
|
<TabPane className="tab-add" disabled tab={<Icon onClick={this.tabAdd} type="plus" />} key="add"></TabPane>
|
</Tabs>
|
<Modal
|
wrapClassName="popview-modal"
|
title={'标签编辑'}
|
visible={labelvisible}
|
width={600}
|
maskClosable={false}
|
okText={dict['model.submit']}
|
onOk={this.tabLabelSubmit}
|
onCancel={() => { this.setState({ labelvisible: false }) }}
|
destroyOnClose
|
>
|
<TabLabelComponent
|
dict={dict}
|
tab={editab}
|
wrappedComponentRef={(inst) => this.tabLabelRef = inst}
|
/>
|
</Modal>
|
</div>
|
)
|
}
|
}
|
|
export default antvBarLineChart
|