diff --git a/config/config.js b/config/config.js index d75938edc668241a7f8694fa706e6a52653cd773..909a13a29990e6f34daa01376f9dfbbc1b2c3a0a 100644 --- a/config/config.js +++ b/config/config.js @@ -1,9 +1,6 @@ -/* eslint-disable react/destructuring-assignment */ - // https://umijs.org/config/ const pageRoutes = require('./router.config'); const webpackplugin = require('./plugin.config'); -const path = require('path'); export default { // add for transfer to umi diff --git a/config/plugin.config.js b/config/plugin.config.js index ed25dd95bbf9f262b926f0560d4d881e061869c6..aa7cb717da65296cd0bf454bfef5b828c649c8ef 100644 --- a/config/plugin.config.js +++ b/config/plugin.config.js @@ -1,7 +1,7 @@ // Change theme plugin const MergeLessPlugin = require('antd-pro-merge-less'); -const AntDesignThemePlugin = require('antd-theme-webpack-plugin'); +const AntDesignThemePlugin = require('antd-pro-theme-webpack-plugin'); const path = require('path'); const plugin = config => { diff --git a/package.json b/package.json index fdc790f2808b958289e3c6b877baac0f6e93e9e8..8e035d0371207f75c394080348964dda13bc6d44 100755 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@types/react": "^16.4.11", "@types/react-dom": "^16.0.6", "antd-pro-merge-less": "^0.0.9", - "antd-theme-webpack-plugin": "^1.0.8", + "antd-pro-theme-webpack-plugin": "^1.1.8", "babel-eslint": "^8.2.6", "babel-runtime": "^6.9.2", "cross-env": "^5.1.1", diff --git a/src/components/SiderMenu/SiderMenu.js b/src/components/SiderMenu/SiderMenu.js deleted file mode 100644 index 58077b77f4bc5892e055c407c3bf7b5a44477d0d..0000000000000000000000000000000000000000 --- a/src/components/SiderMenu/SiderMenu.js +++ /dev/null @@ -1,256 +0,0 @@ -import React, { PureComponent } from 'react'; -import { Layout, Menu, Icon } from 'antd'; -import pathToRegexp from 'path-to-regexp'; -import Link from 'umi/link'; -import styles from './index.less'; -import { urlToList } from '../_utils/pathTools'; - -const { Sider } = Layout; -const { SubMenu } = Menu; - -// Allow menu.js config icon as string or ReactNode -// icon: 'setting', -// icon: 'http://demo.com/icon.png', -// icon: , -const getIcon = icon => { - if (typeof icon === 'string') { - if (icon.indexOf('http') === 0) { - return icon; - } - return ; - } - - return icon; -}; - -/** - * Recursively flatten the data - * [{path:string},{path:string}] => [path,path2] - * @param menu - */ -export const getFlatMenuKeys = menu => - menu.reduce((keys, item) => { - keys.push(item.path); - if (item.children) { - return keys.concat(getFlatMenuKeys(item.children)); - } - return keys; - }, []); - -/** - * Find all matched menu keys based on paths - * @param flatMenuKeys: [/abc, /abc/:id, /abc/:id/info] - * @param paths: [/abc, /abc/11, /abc/11/info] - */ -export const getMenuMatchKeys = (flatMenuKeys, paths) => - paths.reduce( - (matchKeys, path) => - matchKeys.concat(flatMenuKeys.filter(item => pathToRegexp(item).test(path))), - [] - ); - -export default class SiderMenu extends PureComponent { - constructor(props) { - super(props); - this.flatMenuKeys = getFlatMenuKeys(props.menuData); - this.state = { - openKeys: this.getDefaultCollapsedSubMenus(props), - }; - } - - componentWillReceiveProps(nextProps) { - const { location } = this.props; - if (nextProps.location.pathname !== location.pathname) { - this.setState({ - openKeys: this.getDefaultCollapsedSubMenus(nextProps), - }); - } - } - - /** - * Convert pathname to openKeys - * /list/search/articles = > ['list','/list/search'] - * @param props - */ - getDefaultCollapsedSubMenus(props) { - const { - location: { pathname }, - } = - props || this.props; - return getMenuMatchKeys(this.flatMenuKeys, urlToList(pathname)); - } - - /** - * 判断是否是http链接.返回 Link 或 a - * Judge whether it is http link.return a or Link - * @memberof SiderMenu - */ - getMenuItemPath = item => { - const itemPath = this.conversionPath(item.path); - const icon = getIcon(item.icon); - const { target, name } = item; - // Is it a http link - if (/^https?:\/\//.test(itemPath)) { - return ( - - {icon} - {name} - - ); - } - const { location, isMobile, onCollapse } = this.props; - return ( - { - onCollapse(true); - } - : undefined - } - > - {icon} - {name} - - ); - }; - - /** - * get SubMenu or Item - */ - getSubMenuOrItem = item => { - if (item.children && item.children.some(child => child.name)) { - const childrenItems = this.getNavMenuItems(item.children); - // 当无子菜单时就不展示菜单 - if (childrenItems && childrenItems.length > 0) { - return ( - - {getIcon(item.icon)} - {item.name} - - ) : ( - item.name - ) - } - key={item.path} - > - {childrenItems} - - ); - } - return null; - } else { - return {this.getMenuItemPath(item)}; - } - }; - - /** - * 获得菜单子节点 - * @memberof SiderMenu - */ - getNavMenuItems = menusData => { - if (!menusData) { - return []; - } - return menusData - .filter(item => item.name && !item.hideInMenu) - .map(item => { - // make dom - const ItemDom = this.getSubMenuOrItem(item); - return this.checkPermissionItem(item.authority, ItemDom); - }) - .filter(item => item); - }; - - // Get the currently selected menu - getSelectedMenuKeys = () => { - const { - location: { pathname }, - } = this.props; - return getMenuMatchKeys(this.flatMenuKeys, urlToList(pathname)); - }; - - // conversion Path - // 转化路径 - conversionPath = path => { - if (path && path.indexOf('http') === 0) { - return path; - } else { - return `/${path || ''}`.replace(/\/+/g, '/'); - } - }; - - // permission to check - checkPermissionItem = (authority, ItemDom) => { - const { Authorized } = this.props; - if (Authorized && Authorized.check) { - const { check } = Authorized; - return check(authority, ItemDom); - } - return ItemDom; - }; - - isMainMenu = key => { - const { menuData } = this.props; - return menuData.some(item => key && (item.key === key || item.path === key)); - }; - - handleOpenChange = openKeys => { - const lastOpenKey = openKeys[openKeys.length - 1]; - const moreThanOne = openKeys.filter(openKey => this.isMainMenu(openKey)).length > 1; - this.setState({ - openKeys: moreThanOne ? [lastOpenKey] : [...openKeys], - }); - }; - - render() { - const { logo, menuData, collapsed, onCollapse } = this.props; - const { openKeys } = this.state; - // Don't show popup menu when it is been collapsed - const menuProps = collapsed - ? {} - : { - openKeys, - }; - // if pathname can't match, use the nearest parent's key - let selectedKeys = this.getSelectedMenuKeys(); - if (!selectedKeys.length) { - selectedKeys = [openKeys[openKeys.length - 1]]; - } - return ( - -
- - logo -

Ant Design Pro

- -
- - {this.getNavMenuItems(menuData)} - -
- ); - } -}