weaver_trunk_cli/pc4public/portal/wea-menu/MenuInline.js

229 lines
8.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;