import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { is, fromJS } from 'immutable'
|
import { Popover, Icon, Col } from 'antd'
|
|
import asyncIconComponent from '@/utils/asyncIconComponent'
|
import Utils from '@/utils/utils.js'
|
import getSettingForm from './options'
|
import { resetStyle } from '@/utils/utils-custom.js'
|
import MKEmitter from '@/utils/events.js'
|
import './index.scss'
|
|
const CopyComponent = asyncIconComponent(() => import('@/menu/components/share/copycomponent'))
|
const NormalForm = asyncIconComponent(() => import('@/components/normalform'))
|
|
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 = {
|
card: null
|
}
|
|
UNSAFE_componentWillMount () {
|
const { card } = this.props
|
|
this.setState({
|
card: fromJS(card).toJS()
|
})
|
}
|
|
componentDidMount () {
|
MKEmitter.addListener('submitStyle', this.getStyle)
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
return !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)
|
}
|
|
getSettingForms = () => {
|
const { cards } = this.props
|
const { card } = this.state
|
|
return getSettingForm(card.setting, cards.columns || [])
|
}
|
|
updateSetting = (res) => {
|
const { card } = this.state
|
let _card = {...card, setting: res}
|
|
if (card.setting.type === 'menu' && _card.setting.type !== 'menu') {
|
_card.oriuuid = _card.uuid
|
_card.uuid = Utils.getuuid()
|
}
|
|
this.setState({ card: _card })
|
this.props.updateElement(_card)
|
}
|
|
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 { offset } = this.props
|
const { card } = 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">
|
<NormalForm title="菜单编辑" width={900} update={this.updateSetting} getForms={this.getSettingForms}>
|
<Icon type="edit" style={{color: '#1890ff'}} title="编辑"/>
|
</NormalForm>
|
<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,
|
borderRadius: card.setting.borderRadius || '15%'
|
}} type={card.setting.icon}/>
|
{card.setting.tip ? <sup className="am-badge-text"></sup> : null}
|
</div> : <div className="menu-sign">
|
<img style={{width: card.setting.imgWidth, height: card.setting.imgWidth, borderRadius: card.setting.borderRadius || '15%'}} src={card.setting.url} alt=""/>
|
{card.setting.tip ? <sup className="am-badge-text"></sup> : null}
|
</div>}
|
<div className="menu-name">{card.setting.name}</div>
|
</div>
|
</Popover>
|
</Col>
|
)
|
}
|
}
|
|
export default MenuBoxComponent
|