import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { is, fromJS } from 'immutable'
|
import { Popover, Col } from 'antd'
|
import { SwapOutlined, ArrowLeftOutlined, ArrowRightOutlined, EditOutlined, FontColorsOutlined, DeleteOutlined, RightOutlined } from '@ant-design/icons'
|
|
import asyncIconComponent from '@/utils/asyncIconComponent'
|
import Utils from '@/utils/utils.js'
|
import getSettingForm from './options'
|
import { resetStyle } from '@/utils/utils-custom.js'
|
import MkIcon from '@/components/mk-icon'
|
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', 'margin', 'background']
|
|
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 : '',
|
clearMenu: card.setting.clearMenu || 'true',
|
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}>
|
<EditOutlined style={{color: '#1890ff'}} title="编辑"/>
|
</NormalForm>
|
<CopyComponent type="menucell" card={card}/>
|
<FontColorsOutlined className="style" title="调整样式" onClick={this.changeStyle}/>
|
<Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
|
<div className="mk-popover-control">
|
<ArrowLeftOutlined className="plus" title="左移" onClick={() => this.props.move(card, 'left')} />
|
<ArrowRightOutlined className="close" title="右移" onClick={() => this.props.move(card, 'right')} />
|
</div>
|
} trigger="hover" getPopupContainer={() => document.getElementById(card.uuid + 'swap')}>
|
<SwapOutlined id={card.uuid + 'swap'}/>
|
</Popover>
|
<DeleteOutlined className="close" title="删除菜单" 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">
|
<MkIcon style={{
|
fontSize: card.setting.iconFont || 20,
|
padding: card.setting.padding,
|
background: card.setting.background,
|
color: card.setting.color,
|
borderRadius: card.setting.borderRadius || '15%',
|
opacity: !card.setting.icon ? 0 : 1
|
}} type={card.setting.icon || 'cloud'}/>
|
{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" style={{opacity: !card.setting.name ? 0 : 1}}>{card.setting.name || '明科'}</div>
|
<RightOutlined className="menu-right" />
|
{!card.setting.name ? <NormalForm title="菜单编辑" width={900} update={this.updateSetting} cancel={() => this.props.deleteElement(card, 'direct')} getForms={this.getSettingForms}>
|
<span id={card.uuid}></span>
|
</NormalForm> : null}
|
</div>
|
</Popover>
|
</Col>
|
)
|
}
|
}
|
|
export default MenuBoxComponent
|