229 lines
8.2 KiB
JavaScript
229 lines
8.2 KiB
JavaScript
|
|
import { Menu } from 'antd';
|
|||
|
|
|
|||
|
|
const SubMenu = Menu.SubMenu;
|
|||
|
|
const ItemMenu = Menu.Item;
|
|||
|
|
import cloneDeep from 'lodash/cloneDeep';
|
|||
|
|
|
|||
|
|
class WeaMenuInline extends React.Component {
|
|||
|
|
constructor(props) {
|
|||
|
|
super(props);
|
|||
|
|
const openKeys = this.getOpenKeys(props.defaultSelectedKey, props.datas);
|
|||
|
|
// console.log("openKeys1:",openKeys);
|
|||
|
|
this.state = {
|
|||
|
|
mode: props.mode || 'Inline',
|
|||
|
|
datas: props.datas || [],
|
|||
|
|
inlineWidth: props.inlineWidth || 197,
|
|||
|
|
verticalWidth: props.verticalWidth || 61,
|
|||
|
|
fontSize: props.fontSize,
|
|||
|
|
openKeys: openKeys || [],
|
|||
|
|
selectedKey: props.defaultSelectedKey || '', // 包含SubMenu,只做单选
|
|||
|
|
defaultSelectedKey: props.defaultSelectedKey || '', // 包含SubMenu,只做单选
|
|||
|
|
canClick: true,
|
|||
|
|
selectedType: 0,
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
componentWillReceiveProps(nextProps) {
|
|||
|
|
// console.log('datas:',this.props.datas,nextProps.datas,this.props.datas.toString() !== nextProps.datas.toString());
|
|||
|
|
// console.log('defaultSelectedKey',this.props.defaultSelectedKey,nextProps.defaultSelectedKey,this.props.defaultSelectedKey !== nextProps.defaultSelectedKey);
|
|||
|
|
// console.log('defaultSelectedKey',this.state.defaultSelectedKey,nextProps.defaultSelectedKey,this.state.defaultSelectedKey !== nextProps.defaultSelectedKey);
|
|||
|
|
|
|||
|
|
const openKeys = this.getOpenKeys(nextProps.defaultSelectedKey, nextProps.datas);
|
|||
|
|
if (
|
|||
|
|
JSON.stringify(this.props.datas) !== JSON.stringify(nextProps.datas) ||
|
|||
|
|
(this.props.defaultSelectedKey !== nextProps.defaultSelectedKey && this.state.defaultSelectedKey !== nextProps.defaultSelectedKey)
|
|||
|
|
) {
|
|||
|
|
// 计算出openKeys
|
|||
|
|
let newProps = {
|
|||
|
|
datas: nextProps.datas || [],
|
|||
|
|
openKeys: openKeys || [],
|
|||
|
|
defaultSelectedKey: nextProps.defaultSelectedKey || '',
|
|||
|
|
selectedKey: nextProps.defaultSelectedKey || '',
|
|||
|
|
};
|
|||
|
|
// if(this.props.defaultSelectedKey !== nextProps.defaultSelectedKey&&this.state.defaultSelectedKey !== nextProps.defaultSelectedKey)
|
|||
|
|
// newProps.openKeys = this.getOpenKeys(nextProps.defaultSelectedKey,nextProps.datas);
|
|||
|
|
this.setState(newProps);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
render() {
|
|||
|
|
const { mode, datas, verticalWidth } = this.state;
|
|||
|
|
const { openKeys, selectedType } = this.state;
|
|||
|
|
let that = this;
|
|||
|
|
return (
|
|||
|
|
<Menu ecId={`${this && this.props && this.props.ecId || ''}_Menu@fc6gtr`}
|
|||
|
|
inlineIndent={verticalWidth / 2 - 9}
|
|||
|
|
mode={mode}
|
|||
|
|
openKeys={selectedType == 1 ? [] : openKeys}
|
|||
|
|
selectedKeys={[]}
|
|||
|
|
onOpen={(e) => {
|
|||
|
|
that.changeOpen(e.openKeys);
|
|||
|
|
}}
|
|||
|
|
onClose={(e) => {
|
|||
|
|
that.changeOpen(e.openKeys);
|
|||
|
|
}}
|
|||
|
|
onClick={(e) => {
|
|||
|
|
that.changeSelectedKey(e.key, that.getDataByKey(e.key, datas), 0);
|
|||
|
|
}}
|
|||
|
|
>
|
|||
|
|
{this.renderMenuItem(datas, 1)}
|
|||
|
|
</Menu>
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
getOpenKeys(key, datas) {
|
|||
|
|
const data = this.getDataByKey(key, datas);
|
|||
|
|
const treeKey = data.treeKey;
|
|||
|
|
let treeKeyArr = treeKey ? treeKey.split('{$}') : [];
|
|||
|
|
// console.log("treeKey:",treeKey," treeKeyArr:",treeKeyArr);
|
|||
|
|
return treeKeyArr;
|
|||
|
|
}
|
|||
|
|
onModeChange() {
|
|||
|
|
const { mode } = this.state;
|
|||
|
|
if (typeof this.props.onModeChange == 'function') {
|
|||
|
|
this.props.onModeChange(mode);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
getDataByKey(key, datas) {
|
|||
|
|
let that = this;
|
|||
|
|
let obj = '';
|
|||
|
|
for (let i = 0; i < datas.length && obj == ''; i++) {
|
|||
|
|
if (datas[i].id == key) {
|
|||
|
|
obj = cloneDeep(datas[i]);
|
|||
|
|
}
|
|||
|
|
if (obj == '' && datas[i].child && datas[i].child.length > 0) {
|
|||
|
|
obj = that.getDataByKey(key, datas[i].child);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return obj;
|
|||
|
|
}
|
|||
|
|
changeSelectedKey(key, data, type) {
|
|||
|
|
if (window.event && window.event.shiftKey) {
|
|||
|
|
window.open(data.fullrouteurl || data.url, '_blank');
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (data && data.target != 'mainFrame') {
|
|||
|
|
window.open(data.fullrouteurl || data.url, data.target);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
const { canClick } = this.state;
|
|||
|
|
const { clickBlock } = this.props;
|
|||
|
|
const that = this;
|
|||
|
|
// let d = new Date();
|
|||
|
|
// console.log(canClick,d.getTime());
|
|||
|
|
if (canClick) {
|
|||
|
|
this.setState({
|
|||
|
|
canClick: false,
|
|||
|
|
selectedKey: key,
|
|||
|
|
selectedType: type,
|
|||
|
|
});
|
|||
|
|
if (typeof this.props.onSelect == 'function') {
|
|||
|
|
this.props.onSelect(key, data, type);
|
|||
|
|
}
|
|||
|
|
setTimeout(() => {
|
|||
|
|
that.setState({ canClick: true });
|
|||
|
|
}, clickBlock || 300);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
changeOpen(openKeys) {
|
|||
|
|
this.setState({
|
|||
|
|
openKeys,
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
renderMenuItem(datas, level) {
|
|||
|
|
const selectedClassName = 'wea-menu-selected';
|
|||
|
|
let that = this;
|
|||
|
|
const { selectedKey, canClick } = this.state;
|
|||
|
|
let datasArr = new Array();
|
|||
|
|
for (let i = 0; i < datas.length; i++) {
|
|||
|
|
const data = datas[i];
|
|||
|
|
const isSubMenu = data.child && data.child.length > 0;
|
|||
|
|
const isSelected = selectedKey == data.id || `verTop_${selectedKey}` == data.id;
|
|||
|
|
if (data.isInlineHide !== 'true') {
|
|||
|
|
if (isSubMenu) {
|
|||
|
|
datasArr.push(
|
|||
|
|
<SubMenu ecId={`${this && this.props && this.props.ecId || ''}_SubMenu@0x72ew@${data.id}`}
|
|||
|
|
disabled={!canClick}
|
|||
|
|
selectedClassName={isSelected ? selectedClassName : ''}
|
|||
|
|
key={data.id}
|
|||
|
|
onTitleClick={(e) => {
|
|||
|
|
that.changeSelectedKey(e.key, data, 0);
|
|||
|
|
}}
|
|||
|
|
title={that.renderTitle(data, level)}
|
|||
|
|
>
|
|||
|
|
{that.renderMenuItem(data.child, level + 1)}
|
|||
|
|
</SubMenu>,
|
|||
|
|
);
|
|||
|
|
} else {
|
|||
|
|
datasArr.push(
|
|||
|
|
<ItemMenu ecId={`${this && this.props && this.props.ecId || ''}_ItemMenu@8u33tz@${data.id}`} className={isSelected ? selectedClassName : ''} key={data.id}>
|
|||
|
|
{that.renderTitle(data, level)}
|
|||
|
|
</ItemMenu>,
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return datasArr;
|
|||
|
|
}
|
|||
|
|
renderTitle(data, level) {
|
|||
|
|
const { verticalWidth, fontSize } = this.state;
|
|||
|
|
const that = this;
|
|||
|
|
const needImg = level == 1;
|
|||
|
|
const underLineStyle = data.hasUnderLine == 'true' ? { borderBottom: '1px solid #bbb' } : {};
|
|||
|
|
const topLineStyle = data.hasTopLine == 'true' ? { borderTop: '1px solid #bbb' } : {};
|
|||
|
|
const borderStyle = Object.assign({ height: 42, position: 'relative' }, underLineStyle, topLineStyle);
|
|||
|
|
const iconMarginR = verticalWidth / 2 - 9;
|
|||
|
|
|
|||
|
|
const img =
|
|||
|
|
data.iconType == '2' && data.iconImgSrc ? (
|
|||
|
|
<img src={data.iconImgSrc} alt="" style={{ display: 'inline-block', width: '18px', height: '18px', verticalAlign: '-4px', marginRight: iconMarginR }} />
|
|||
|
|
) : data.icon ? (
|
|||
|
|
<i style={{ display: 'inline-block', fontSize: '18px', verticalAlign: 'middle', marginRight: iconMarginR }} className={`wevicon ${data.icon}`} />
|
|||
|
|
) : (
|
|||
|
|
<i
|
|||
|
|
style={{ display: 'inline-block', fontSize: '18px', verticalAlign: 'middle', marginRight: iconMarginR }}
|
|||
|
|
className={`wevicon wevicon-menu-default wevicon-menu-${data.levelid}`}
|
|||
|
|
/>
|
|||
|
|
);
|
|||
|
|
const urlIcon = (
|
|||
|
|
<img
|
|||
|
|
className="wea-titleUrlIcon"
|
|||
|
|
style={{ position: 'absolute', right: 20, top: 13 }}
|
|||
|
|
align="middle"
|
|||
|
|
src={data.titleUrlIcon}
|
|||
|
|
width="16px"
|
|||
|
|
height="16px"
|
|||
|
|
onClick={(e) => {
|
|||
|
|
that.changeSelectedKey(data.id, data, 1);
|
|||
|
|
e.stopPropagation();
|
|||
|
|
}}
|
|||
|
|
/>
|
|||
|
|
);
|
|||
|
|
return (
|
|||
|
|
<div data-id={data.numId} style={borderStyle}>
|
|||
|
|
{needImg ? img : ''}
|
|||
|
|
<span title={data.name} className="wea-menu-tip-out" style={needImg ? { position: 'absolute', display: 'inline-block', maxWidth: '67%' } : {}}>
|
|||
|
|
{data.tagColor ? (
|
|||
|
|
<span
|
|||
|
|
style={{ display: 'inline-block', width: 10, height: 10, verticalAlign: 'middle', border: '1px solid #bbb', backgroundColor: data.tagColor }}
|
|||
|
|
/>
|
|||
|
|
) : (
|
|||
|
|
''
|
|||
|
|
)}
|
|||
|
|
<span className={`wea-menu-tip-inner wea-menu-title wea-f${fontSize}`} style={needImg ? {} : { marginLeft: 12 }}>
|
|||
|
|
{data.name}
|
|||
|
|
{data.count != '' && (
|
|||
|
|
<span>
|
|||
|
|
(<span id={data.countId}>{data.count}</span>)
|
|||
|
|
</span>
|
|||
|
|
)}
|
|||
|
|
</span>
|
|||
|
|
</span>
|
|||
|
|
<span id={`num_${data.numId}`} style={{ position: 'absolute', top: 0, right: 0 }} />
|
|||
|
|
{data.titleUrlIcon ? urlIcon : ''}
|
|||
|
|
</div>
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export default WeaMenuInline;
|