|
@@ -1,6 +1,6 @@
|
|
|
import React from 'react'
|
|
import React from 'react'
|
|
|
import { connect } from 'dva'
|
|
import { connect } from 'dva'
|
|
|
-import { Tree, Input, Button, Icon, Spin } from 'antd'
|
|
|
|
|
|
|
+import { Tree, Input, Button, Icon } from 'antd'
|
|
|
import DeleteBox from '../common/deleteBox/deleteBox'
|
|
import DeleteBox from '../common/deleteBox/deleteBox'
|
|
|
import './menu.less'
|
|
import './menu.less'
|
|
|
const { TreeNode } = Tree
|
|
const { TreeNode } = Tree
|
|
@@ -23,18 +23,26 @@ class DashboardMenu extends React.Component {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
generateMenu(tree, regLabel) {
|
|
generateMenu(tree, regLabel) {
|
|
|
- const { dispatch } = this.props;
|
|
|
|
|
|
|
+ const { mode, dispatch } = this.props;
|
|
|
const { editingKey } = this.state;
|
|
const { editingKey } = this.state;
|
|
|
- return tree.filter(t => t.type === 'menu').sort((a, b) => a.index - b.index).map(t => {
|
|
|
|
|
|
|
+ return tree.filter(t => (mode === 'view' || t.type === 'menu')).sort((a, b) => a.index - b.index).map(t => {
|
|
|
let title = <div className='node-title'>
|
|
let title = <div className='node-title'>
|
|
|
<span>{ (t.code !== editingKey) ?
|
|
<span>{ (t.code !== editingKey) ?
|
|
|
- ( regLabel ? ((t.name || '').split(new RegExp(`(${regLabel})`, 'i')).map((fragment, i) => {
|
|
|
|
|
- return (
|
|
|
|
|
- fragment.toLowerCase().replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'), '\\$1') === regLabel.toLowerCase() ?
|
|
|
|
|
- <span key={i} style={{fontWeight: 'bold', color: 'red'}} className="highlight">{fragment}</span> :
|
|
|
|
|
- fragment
|
|
|
|
|
- )
|
|
|
|
|
- })) : <div className='label'>{t.name}</div> ) : ( <div className='input'>
|
|
|
|
|
|
|
+ ( regLabel ? ( <span style={{ fontWeight: t.type === 'dashboard' ? 'bold' : 'normal' }}>
|
|
|
|
|
+ { t.type === 'dashboard' && <Icon style={{ marginRight: '8px' }} type="pushpin" /> }
|
|
|
|
|
+ { (t.name || '').split(new RegExp(`(${regLabel})`, 'i')).map((fragment, i) => {
|
|
|
|
|
+ return (
|
|
|
|
|
+ fragment.toLowerCase().replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'), '\\$1') === regLabel.toLowerCase() ?
|
|
|
|
|
+ <span key={i} style={{fontWeight: 'bold', color: 'red'}} className="highlight">{fragment}</span> :
|
|
|
|
|
+ fragment
|
|
|
|
|
+ )
|
|
|
|
|
+ }) }
|
|
|
|
|
+ </span> ) : <div className='label'>
|
|
|
|
|
+ <span style={{ fontWeight: t.type === 'dashboard' ? 'bold' : 'normal' }}>
|
|
|
|
|
+ { t.type === 'dashboard' && <Icon style={{ marginRight: '8px' }} type="pushpin" /> }
|
|
|
|
|
+ { t.name }
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </div> ) : ( <div className='input'>
|
|
|
<Input
|
|
<Input
|
|
|
size="small"
|
|
size="small"
|
|
|
defaultValue={t.name}
|
|
defaultValue={t.name}
|
|
@@ -55,7 +63,7 @@ class DashboardMenu extends React.Component {
|
|
|
/>
|
|
/>
|
|
|
</div> )
|
|
</div> )
|
|
|
}</span>
|
|
}</span>
|
|
|
- <div className='tools'>
|
|
|
|
|
|
|
+ {mode !== 'view' && <div className='tools'>
|
|
|
{t.code !== editingKey && <Icon type='edit' onClick={() => {
|
|
{t.code !== editingKey && <Icon type='edit' onClick={() => {
|
|
|
this.setState({
|
|
this.setState({
|
|
|
editingKey: t.code
|
|
editingKey: t.code
|
|
@@ -67,7 +75,7 @@ class DashboardMenu extends React.Component {
|
|
|
visibleDeleteBox: true,
|
|
visibleDeleteBox: true,
|
|
|
});
|
|
});
|
|
|
}}/>}
|
|
}}/>}
|
|
|
- </div>
|
|
|
|
|
|
|
+ </div>}
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
return <TreeNode title={title} key={t.code}>
|
|
return <TreeNode title={title} key={t.code}>
|
|
@@ -82,21 +90,40 @@ class DashboardMenu extends React.Component {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
onExpand = (keys) => {
|
|
onExpand = (keys) => {
|
|
|
- const { dispatch } = this.props;
|
|
|
|
|
- dispatch({ type: 'dashboard/setFields', fields: [
|
|
|
|
|
- { name: 'menuExpandedKeys', value: keys },
|
|
|
|
|
- { name: 'menuAutoExpandParent', value: false },
|
|
|
|
|
- ] });
|
|
|
|
|
|
|
+ const { mode, dispatch } = this.props;
|
|
|
|
|
+ if(mode === 'view') {
|
|
|
|
|
+ dispatch({ type: 'home/setFields', fields: [
|
|
|
|
|
+ { name: 'menuExpandedKeys', value: keys },
|
|
|
|
|
+ { name: 'menuAutoExpandParent', value: false },
|
|
|
|
|
+ ] });
|
|
|
|
|
+ }else {
|
|
|
|
|
+ dispatch({ type: 'dashboard/setFields', fields: [
|
|
|
|
|
+ { name: 'menuExpandedKeys', value: keys },
|
|
|
|
|
+ { name: 'menuAutoExpandParent', value: false },
|
|
|
|
|
+ ] });
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
onSelect = (selectedKeys, info) => {
|
|
onSelect = (selectedKeys, info) => {
|
|
|
- const { dispatch } = this.props;
|
|
|
|
|
- dispatch({ type: 'dashboard/setField', name: 'menuSelectedKeys', value: selectedKeys })
|
|
|
|
|
- if(selectedKeys.length === 1) {
|
|
|
|
|
- if(selectedKeys[0] === '-1') {
|
|
|
|
|
- dispatch({ type: 'dashboard/fetchList', mandatory: true });
|
|
|
|
|
- }else {
|
|
|
|
|
- dispatch({ type: 'dashboard/remoteMenuDashboardList', menuCode: selectedKeys[0] });
|
|
|
|
|
|
|
+ const { mode, dashboard, dispatch } = this.props;
|
|
|
|
|
+ const { menuList } = dashboard;
|
|
|
|
|
+ if(mode === 'view') {
|
|
|
|
|
+ // dispatch({ type: 'home/setField', name: 'menuSelectedKeys', value: selectedKeys })
|
|
|
|
|
+ let selectedMenu = menuList.find(l => l.code === selectedKeys[0]);
|
|
|
|
|
+ if(selectedMenu && selectedMenu.type === 'dashboard') {
|
|
|
|
|
+ dispatch({ type: 'home/openTab', tab: {
|
|
|
|
|
+ code: selectedMenu.code,
|
|
|
|
|
+ name: selectedMenu.name
|
|
|
|
|
+ } })
|
|
|
|
|
+ }
|
|
|
|
|
+ }else {
|
|
|
|
|
+ dispatch({ type: 'dashboard/setField', name: 'menuSelectedKeys', value: selectedKeys })
|
|
|
|
|
+ if(selectedKeys.length === 1) {
|
|
|
|
|
+ if(selectedKeys[0] === '-1') {
|
|
|
|
|
+ dispatch({ type: 'dashboard/fetchList', mandatory: true });
|
|
|
|
|
+ }else {
|
|
|
|
|
+ dispatch({ type: 'dashboard/remoteMenuDashboardList', menuCode: selectedKeys[0] });
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -107,7 +134,7 @@ class DashboardMenu extends React.Component {
|
|
|
dispatch({ type: 'dashboard/setFields', fields: [
|
|
dispatch({ type: 'dashboard/setFields', fields: [
|
|
|
{ name: 'menuExpandedKeys', value: expandedKeys },
|
|
{ name: 'menuExpandedKeys', value: expandedKeys },
|
|
|
{ name: 'menuFilterLabel', value },
|
|
{ name: 'menuFilterLabel', value },
|
|
|
- { name: 'autoExpandParent', value: true },
|
|
|
|
|
|
|
+ { name: 'menuAutoExpandParent', value: true },
|
|
|
] });
|
|
] });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -154,21 +181,20 @@ class DashboardMenu extends React.Component {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
render() {
|
|
|
- const { dashboard, dispatch, loading } = this.props;
|
|
|
|
|
|
|
+ const { mode, home, dashboard, dispatch } = this.props;
|
|
|
const { visibleDeleteBox, selectedMenu } = this.state;
|
|
const { visibleDeleteBox, selectedMenu } = this.state;
|
|
|
- const { menuTree, menuFilterLabel, menuExpandedKeys, menuSelectedKeys, menuAutoExpandParent } = dashboard;
|
|
|
|
|
|
|
+ const { menuTree } = dashboard;
|
|
|
|
|
+ const { menuFilterLabel, menuExpandedKeys, menuSelectedKeys, menuAutoExpandParent } = mode === 'view' ? home : dashboard;
|
|
|
const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符
|
|
const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符
|
|
|
const regLabel = menuFilterLabel.replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1'); // 添加转义符号
|
|
const regLabel = menuFilterLabel.replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1'); // 添加转义符号
|
|
|
|
|
|
|
|
- return <div className='menu-container'>
|
|
|
|
|
- <div style={{ display: loading ? 'block' : 'none', position: 'absolute', height: '100%', width: '100%', zIndex: '4', background: 'rgba(51,51,51,.1)' }}>
|
|
|
|
|
- <Spin style={{ display: 'inline-block', position: 'absolute', top: '50%', left: '50%', margin: '-10px' }} indicator={<Icon type="loading" style={{ fontSize: 24 }} spin />}/>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div className='menu-buttons'>
|
|
|
|
|
|
|
+ return <div className='menu-container' style={ mode === 'view' ? { paddingTop: 0 } : { paddingTop: '88px' } }>
|
|
|
|
|
+
|
|
|
|
|
+ {mode !== 'view' && <div className='menu-buttons'>
|
|
|
<Button disabled={menuSelectedKeys.length !== 1} onClick={this.onAddClick}>新增目录</Button>
|
|
<Button disabled={menuSelectedKeys.length !== 1} onClick={this.onAddClick}>新增目录</Button>
|
|
|
{/* <Button disabled={menuSelectedKeys.length !== 1} onClick={this.onModifyClick}>修改目录</Button> */}
|
|
{/* <Button disabled={menuSelectedKeys.length !== 1} onClick={this.onModifyClick}>修改目录</Button> */}
|
|
|
- </div>
|
|
|
|
|
- <div className='menu-search'>
|
|
|
|
|
|
|
+ </div>}
|
|
|
|
|
+ {mode !== 'view' && <div className='menu-search'>
|
|
|
<Search
|
|
<Search
|
|
|
defaultValue={menuFilterLabel}
|
|
defaultValue={menuFilterLabel}
|
|
|
placeholder='搜索'
|
|
placeholder='搜索'
|
|
@@ -178,7 +204,7 @@ class DashboardMenu extends React.Component {
|
|
|
<Button onClick={() => {
|
|
<Button onClick={() => {
|
|
|
dispatch({ type: 'dashboard/remoteMenuTree', mandatory: true });
|
|
dispatch({ type: 'dashboard/remoteMenuTree', mandatory: true });
|
|
|
}}><Icon type='sync' /></Button>
|
|
}}><Icon type='sync' /></Button>
|
|
|
- </div>
|
|
|
|
|
|
|
+ </div>}
|
|
|
<div className='menu-content'>
|
|
<div className='menu-content'>
|
|
|
<Tree
|
|
<Tree
|
|
|
inlineIndent={8}
|
|
inlineIndent={8}
|
|
@@ -209,16 +235,7 @@ class DashboardMenu extends React.Component {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-function mapStateToProps({ present: { loading, dashboard }}) {
|
|
|
|
|
- let effectsArr = ['dashboard/remoteMenuTree', 'dashboard/remoteAddMenu', 'dashboard/remoteDeleteMenu'];
|
|
|
|
|
- let flag = false;
|
|
|
|
|
- for(let i = 0; i < effectsArr.length; i++) {
|
|
|
|
|
- if(loading.effects[effectsArr[i]]) {
|
|
|
|
|
- flag = true;
|
|
|
|
|
- break;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return { dashboard, loading: flag }
|
|
|
|
|
|
|
+function mapStateToProps({ present: { dashboard, home }}) {
|
|
|
|
|
+ return { dashboard, home }
|
|
|
}
|
|
}
|
|
|
export default connect(mapStateToProps)(DashboardMenu)
|
|
export default connect(mapStateToProps)(DashboardMenu)
|