import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { is, fromJS } from 'immutable'
|
import { Modal, Popover, Icon, Col } from 'antd'
|
|
import asyncIconComponent from '@/utils/asyncIconComponent'
|
import zhCN from '@/locales/zh-CN/model.js'
|
import enUS from '@/locales/en-US/model.js'
|
import Utils from '@/utils/utils.js'
|
import SettingForm from './settingform'
|
import { resetStyle } from '@/utils/utils-custom.js'
|
import MKEmitter from '@/utils/events.js'
|
import './index.scss'
|
|
const { confirm } = Modal
|
const CopyComponent = asyncIconComponent(() => import('@/menu/components/share/copycomponent'))
|
|
class MenuBoxComponent extends Component {
|
static propTpyes = {
|
offset: PropTypes.any, // 偏移量
|
cards: PropTypes.object, // 卡片行配置信息
|
card: PropTypes.object, // 卡片配置信息
|
move: PropTypes.func, // 卡片移动
|
deleteElement: PropTypes.func, // 卡片删除
|
updateElement: PropTypes.func // 菜单配置更新
|
}
|
|
state = {
|
dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
|
card: null,
|
formlist: null,
|
visible: false
|
}
|
|
UNSAFE_componentWillMount () {
|
const { card } = this.props
|
|
this.setState({
|
card: fromJS(card).toJS()
|
})
|
}
|
|
componentDidMount () {
|
const { card } = this.props
|
MKEmitter.addListener('submitStyle', this.getStyle)
|
|
if (card.isnew) {
|
this.setState({
|
visible: true
|
})
|
}
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
const { cards } = this.props
|
|
return !is(fromJS(cards.wrap), fromJS(nextProps.cards.wrap)) || !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
/**
|
* @description 组件销毁,清除state更新,清除快捷键设置
|
*/
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
MKEmitter.removeListener('submitStyle', this.getStyle)
|
}
|
|
getStyle = (comIds, style) => {
|
const { cards } = this.props
|
const { card } = this.state
|
|
if (comIds.length !== 2 || comIds[0] !== cards.uuid || comIds[1] !== card.uuid) return
|
|
let _card = fromJS(card).toJS()
|
_card.style = style
|
|
this.setState({
|
card: _card
|
})
|
|
this.props.updateElement(_card)
|
}
|
|
changeStyle = () => {
|
const { cards } = this.props
|
const { card } = this.state
|
|
let _style = card.style ? fromJS(card.style).toJS() : {}
|
let options = ['font', 'border', 'padding']
|
|
MKEmitter.emit('changeStyle', [cards.uuid, card.uuid], options, _style)
|
}
|
|
settingSubmit = () => {
|
const { card } = this.state
|
|
this.settingRef.handleConfirm().then(res => {
|
let _card = {...card, setting: res}
|
|
if (!card.isnew && card.setting.type === 'menu' && _card.setting.type !== 'menu') {
|
const _this = this
|
confirm({
|
content: '菜单属性由“菜单”切换至其他类型时,菜单将被重置,即解除之前菜单的绑定关系,确定修改吗?',
|
onOk() {
|
_card.oriuuid = _card.uuid
|
_card.uuid = Utils.getuuid()
|
_this.setState({ visible: false, card: _card })
|
_this.props.updateElement(_card)
|
},
|
onCancel() {}
|
})
|
} else {
|
delete _card.isnew
|
this.setState({ visible: false, card: _card })
|
this.props.updateElement(_card)
|
}
|
})
|
}
|
|
cancel = () => {
|
const { card } = this.state
|
|
if (card.isnew) {
|
let _card = fromJS(card).toJS()
|
delete _card.isnew
|
|
this.setState({ visible: false, card: _card })
|
this.props.updateElement(_card)
|
} else {
|
this.setState({ visible: false })
|
}
|
}
|
|
changeMenu = () => {
|
const { card } = this.state
|
|
if (card.setting.type === 'link') {
|
window.open(card.setting.linkurl)
|
} else {
|
MKEmitter.emit('changeEditMenu', {
|
MenuID: card.setting.type === 'linkmenu' ? card.setting.linkMenuId : card.uuid,
|
copyMenuId: card.setting.type === 'menu' ? card.setting.copyMenuId : '',
|
MenuNo: card.setting.MenuNo || '',
|
MenuName: card.setting.name,
|
})
|
}
|
}
|
|
render() {
|
const { cards, offset } = this.props
|
const { card, visible, dict } = this.state
|
|
let _style = {...card.style}
|
|
_style = resetStyle(_style)
|
|
return (
|
<Col span={card.setting.width || 6} offset={offset || 0}>
|
<Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
|
<div className="mk-popover-control">
|
<Icon className="edit" title="编辑" type="edit" onClick={() => this.setState({visible: true})} />
|
<CopyComponent type="menucell" card={card}/>
|
<Icon className="style" title="调整样式" onClick={this.changeStyle} type="font-colors" />
|
<Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
|
<div className="mk-popover-control">
|
<Icon className="plus" title="左移" type="arrow-left" onClick={() => this.props.move(card, 'left')} />
|
<Icon className="close" title="右移" type="arrow-right" onClick={() => this.props.move(card, 'right')} />
|
</div>
|
} trigger="hover" getPopupContainer={() => document.getElementById(card.uuid + 'swap')}>
|
<Icon type="swap" id={card.uuid + 'swap'}/>
|
</Popover>
|
<Icon className="close" title="删除菜单" type="delete" onClick={() => this.props.deleteElement(card)} />
|
</div>
|
} trigger="hover">
|
<div className="menu-item" onDoubleClick={() => this.changeMenu()} style={_style}>
|
{card.setting.sign === 'icon' ? <div className="menu-sign">
|
<Icon style={{
|
fontSize: card.setting.iconFont || 20,
|
padding: card.setting.padding,
|
background: card.setting.background,
|
color: card.setting.color
|
}} type={card.setting.icon}/>
|
</div> : <div className="menu-sign">
|
<img style={{width: card.setting.imgWidth, height: card.setting.imgWidth}} src={card.setting.url} alt=""/>
|
</div>}
|
<div className="menu-name">{card.setting.name}</div>
|
</div>
|
</Popover>
|
<Modal
|
wrapClassName="popview-modal"
|
title={'菜单设置'}
|
visible={visible}
|
width={800}
|
maskClosable={false}
|
okText={dict['model.submit']}
|
onOk={this.settingSubmit}
|
onCancel={this.cancel}
|
destroyOnClose
|
>
|
<SettingForm
|
dict={dict}
|
cards={cards}
|
setting={card.setting}
|
inputSubmit={this.settingSubmit}
|
wrappedComponentRef={(inst) => this.settingRef = inst}
|
/>
|
</Modal>
|
</Col>
|
)
|
}
|
}
|
|
export default MenuBoxComponent
|