From c345e4aac85336f103ed38579ccbd7ef5f306c30 Mon Sep 17 00:00:00 2001 From: Lauri Eskola Date: Tue, 5 Jun 2018 22:34:00 +0700 Subject: [PATCH] Rebuild admin UI using Material UI (#114) * Rebuild admin UI using Material UI * Remove react-burger-menu * Fix tests --- package.json | 2 - src/components/05_pages/Content/Content.js | 127 +++++----- src/components/06_wrappers/Default/Default.js | 229 +++++------------- .../06_wrappers/Default/Default.test.js | 45 ---- src/reducers/application.js | 33 +-- src/reducers/index.js | 3 +- yarn.lock | 84 +------ 7 files changed, 125 insertions(+), 398 deletions(-) delete mode 100644 src/components/06_wrappers/Default/Default.test.js diff --git a/package.json b/package.json index cb8a6a7bf..35f6fc15f 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "prop-types": "^15.6.1", "qs": "^6.5.1", "react": "^16.4.0", - "react-burger-menu": "^2.4.0", "react-dom": "^16.4.0", "react-jss": "^8.4.0", "react-redux": "^5.0.7", @@ -22,7 +21,6 @@ "react-router-redux": "^5.0.0-alpha.9", "react-sticky": "^6.0.2", "redux": "^3.7.2", - "redux-burger-menu": "^0.2.4", "redux-devtools-extension": "^2.13.2", "redux-saga": "^0.16.0" }, diff --git a/src/components/05_pages/Content/Content.js b/src/components/05_pages/Content/Content.js index e65a5d06c..69162cdc4 100644 --- a/src/components/05_pages/Content/Content.js +++ b/src/components/05_pages/Content/Content.js @@ -53,7 +53,7 @@ const styles = { margin: 0.5rem; `, filters: css` - min-height: 7rem; + padding: 0 1.5rem; `, }; @@ -82,75 +82,76 @@ class Content extends Component { } render = () => ( -
- { - this.setState({ title: e.target.value }, () => { - this.props.requestContent(this.state); - }); - }} - margin="normal" - /> - - - - Content Type - - } - renderValue={selected => ( -
- {selected.map(value => ( - + + + + Content Type + + } + renderValue={selected => ( +
+ {selected.map(value => ( + + ))} +
+ )} + > + {Object.keys(this.props.contentTypes).map(type => ( + + -1} /> - ))} -
- )} - > - {Object.keys(this.props.contentTypes).map(type => ( - - -1} - /> - + + + ))} + +
+ + + Status + } + autoWidth + > + + Any - ))} - - + Published + Unpublished + + +
- - Status - } - autoWidth - > - - Any - - Published - Unpublished - - - - diff --git a/src/components/06_wrappers/Default/Default.js b/src/components/06_wrappers/Default/Default.js index 56874291c..778d52e5b 100644 --- a/src/components/06_wrappers/Default/Default.js +++ b/src/components/06_wrappers/Default/Default.js @@ -1,198 +1,89 @@ -import React, { Fragment } from 'react'; +import React from 'react'; import { func, node, arrayOf, shape, string } from 'prop-types'; import { connect } from 'react-redux'; -import CssBaseline from '@material-ui/core/CssBaseline'; import { css } from 'emotion'; -import { reveal as Menu } from 'react-burger-menu'; import { Link } from 'react-router-dom'; -import { decorator as reduxBurgerMenu } from 'redux-burger-menu'; + +import CssBaseline from '@material-ui/core/CssBaseline'; +import Drawer from '@material-ui/core/Drawer'; +import List from '@material-ui/core/List'; +import ListItem from '@material-ui/core/ListItem'; +import ListItemIcon from '@material-ui/core/ListItemIcon'; +import ListItemText from '@material-ui/core/ListItemText'; +import Divider from '@material-ui/core/Divider'; +import ViewListIcon from '@material-ui/icons/ViewList'; +import BuildIcon from '@material-ui/icons/Build'; +import ColorLensIcon from '@material-ui/icons/ColorLens'; +import ExtensionIcon from '@material-ui/icons/Extension'; +import SettingsIcon from '@material-ui/icons/Settings'; +import PeopleIcon from '@material-ui/icons/People'; +import AssesmentIcon from '@material-ui/icons/Assessment'; +import HelpIcon from '@material-ui/icons/Help'; + import { requestMenu } from '../../../actions/application'; import Message from '../../02_atoms/Message/Message'; import ErrorBoundary from '../ErrorBoundary/ErrorBoundary'; let styles; -const ConnectedMenu = reduxBurgerMenu(Menu, 'admin'); - -export const filterMenuLinks = (searchString, menuLinks) => { - if (!searchString) { - return menuLinks; - } - return menuLinks - .map(menuLink => { - const subtree = - menuLink.subtree && filterMenuLinks(searchString, menuLink.subtree); - if ( - (menuLink.link && - `${menuLink.link.title}${menuLink.link.description}` - .toLowerCase() - .indexOf(searchString.toLowerCase()) !== -1) || - (Array.isArray(subtree) && subtree.length > 0) - ) { - return { - ...menuLink, - subtree, - }; - } - return null; - }) - .filter(id => id); +const iconMap = { + '/admin/content': , + '/admin/structure': , + '/admin/appearance': , + '/admin/modules': , + '/admin/config': , + '/admin/people': , + '/admin/reports': , + '/admin/help': , }; class Default extends React.Component { - constructor(props) { - super(props); - - this.state = { - filterString: '', - }; - } componentWillMount() { this.props.requestMenu(); } - filterMenu = e => { - this.setState({ - filterString: e.target.value, - }); - }; + render = () => ( - +
-
- - - {filterMenuLinks(this.state.filterString, this.props.menuLinks).map( - ({ link: menuLink, subtree }) => ( -
    -
  • - - {menuLink.title} - -
      - {subtree.map(({ link: subMenuLink }) => ( -
    • - - {subMenuLink.title} - -
    • - ))} -
    -
  • -
- ), - )} -
+ + + {this.props.menuLinks.map(({ link: menuLink }) => ( + + {iconMap[menuLink.url] ? ( + {iconMap[menuLink.url]} + ) : ( + '' + )} + + + ))} + + + -
- - {this.props.message && } - {this.props.children} - -
-
- +
+ + {this.props.message && } + {this.props.children} + +
+
); } styles = { outerWrapper: css` height: 100%; - background: #444444; + display: flex; `, main: css` - padding: 7rem 2rem 3rem; + flex-grow: 1; + padding: 2rem; height: 100%; - background: #ffffff; `, - filterMenu: css` + drawerPaper: css` position: relative; - margin: 36px 8px 8px; - `, - burgerButton: css` - position: absolute; - width: 36px; - height: 30px; - left: 36px; - top: 36px; - `, - burgerBar: css` - background: #373a47; - `, - crossButton: css` - height: 24px; - width: 24px; - `, - cross: css` - background: #bdc3c7; - `, - menu: css` - background: #fafafa; - font-size: 1.05rem; - `, - menuList: css` - list-style: none; - margin: 10px 0; - padding-left: 1.5rem; - `, - menuListChildren: css` - list-style: none; - padding: 10px 0 0 1.5rem; - `, - menuListItem: css` - padding-bottom: 10px; - `, - topLevelLink: css` - color: #272756; - font-weight: bold; - text-decoration: none; - font-size: 0.95rem; - `, - childrenLink: css` - color: #252629; - text-decoration: none; - - &:hover { - color: #000000; - } - `, - morphShape: css` - fill: #373a47; - `, - itemList: css` - color: #b8b7ad; - `, - overlay: css` - background: rgba(0, 0, 0, 0.3); + width: 250px; `, }; @@ -204,14 +95,6 @@ Default.propTypes = { }), menuLinks: arrayOf( shape({ - subtree: arrayOf( - shape({ - link: shape({ - url: string, - title: string, - }), - }), - ), link: shape({ url: string, title: string, diff --git a/src/components/06_wrappers/Default/Default.test.js b/src/components/06_wrappers/Default/Default.test.js deleted file mode 100644 index 4d477bf76..000000000 --- a/src/components/06_wrappers/Default/Default.test.js +++ /dev/null @@ -1,45 +0,0 @@ -import { filterMenuLinks } from './Default'; - -const menuLinks = [ - { - link: { - title: 'Elephant', - description: 'More elephants', - }, - }, - { - link: { - title: 'Animals', - description: 'More animals available', - }, - subtree: [ - { - link: { - title: 'Giraffe', - description: 'More humming', - }, - }, - ], - }, - { - link: { - title: 'Giraffe', - description: 'Even more humming', - }, - }, -]; - -it('filters menu links', () => { - const filteredMenuLinks = filterMenuLinks('giraffe', menuLinks); - - expect(filteredMenuLinks.length).toEqual(2); - expect(filteredMenuLinks[0].link.title).toEqual('Animals'); - expect(filteredMenuLinks[0].subtree[0].link.title).toEqual('Giraffe'); - expect(filteredMenuLinks[1].link.title).toEqual('Giraffe'); -}); - -it('filters menu links without results', () => { - const filteredMenuLinks = filterMenuLinks('Oranges', menuLinks); - - expect(filteredMenuLinks.length).toEqual(0); -}); diff --git a/src/reducers/application.js b/src/reducers/application.js index 24516e82a..9b435d80e 100644 --- a/src/reducers/application.js +++ b/src/reducers/application.js @@ -42,40 +42,9 @@ export default (state = initialState, action) => { }; } case MENU_LOADED: { - const menuLinks = action.payload.menuLinks.map(menuLink => { - // Explicitly add the Permissions and Roles as top level menu items, as - // those are usually local tasks which are not supported at the moment. - if (menuLink.link.url.indexOf('admin/people') !== -1) { - menuLink.subtree.push({ - subtree: [], - hasChildren: false, - inActiveTrail: false, - link: { - weight: '4', - title: '🔐 Permissions', - description: 'Manage permissions.', - menuName: 'admin', - url: '/admin/people/permissions', - }, - }); - menuLink.subtree.push({ - subtree: [], - hasChildren: false, - inActiveTrail: false, - link: { - weight: '5', - title: '📇 Roles', - description: 'Manage roles.', - menuName: 'admin', - url: '/admin/people/roles', - }, - }); - } - return menuLink; - }); return { ...state, - menuLinks, + menuLinks: action.payload.menuLinks, }; } case DBLOG_COLLECTION_LOADED: { diff --git a/src/reducers/index.js b/src/reducers/index.js index e2bfc268a..412f97aeb 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -1,7 +1,6 @@ import { loadingBarReducer as loadingBar } from 'react-redux-loading-bar'; -import { reducer as burgerMenu } from 'redux-burger-menu'; import application from './application'; import content from './content'; -const reducers = { burgerMenu, application, content }; +const reducers = { application, content }; export default { ...reducers, loadingBar }; diff --git a/yarn.lock b/yarn.lock index 772a89699..1a834c587 100644 --- a/yarn.lock +++ b/yarn.lock @@ -443,22 +443,10 @@ assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" -ast-transform@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/ast-transform/-/ast-transform-0.0.0.tgz#74944058887d8283e189d954600947bc98fe0062" - dependencies: - escodegen "~1.2.0" - esprima "~1.0.4" - through "~2.3.4" - ast-types-flow@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" -ast-types@^0.7.0: - version "0.7.8" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.7.8.tgz#902d2e0d60d071bdcd46dc115e1809ed11c138a9" - async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -1346,7 +1334,7 @@ brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" -browser-resolve@^1.11.2, browser-resolve@^1.8.1: +browser-resolve@^1.11.2: version "1.11.2" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" dependencies: @@ -1379,14 +1367,6 @@ browserify-des@^1.0.0: des.js "^1.0.0" inherits "^2.0.1" -browserify-optional@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-optional/-/browserify-optional-1.0.1.tgz#1e13722cfde0d85f121676c2a72ced533a018869" - dependencies: - ast-transform "0.0.0" - ast-types "^0.7.0" - browser-resolve "^1.8.1" - browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" @@ -1660,7 +1640,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.1.1, classnames@^2.2.5: +classnames@^2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" @@ -2644,16 +2624,6 @@ escodegen@^1.6.1: optionalDependencies: source-map "~0.6.1" -escodegen@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.2.0.tgz#09de7967791cc958b7f89a2ddb6d23451af327e1" - dependencies: - esprima "~1.0.4" - estraverse "~1.5.0" - esutils "~1.0.0" - optionalDependencies: - source-map "~0.1.30" - escope@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" @@ -2919,10 +2889,6 @@ esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" -esprima@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" - esquery@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" @@ -2939,26 +2905,14 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -estraverse@~1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.5.1.tgz#867a3e8e58a9f84618afb6c2ddbcd916b7cbaf71" - esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -esutils@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.0.0.tgz#8151d358e20c8acc7fb745e7472c0025fe496570" - etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" -eve@~0.5.1: - version "0.5.4" - resolved "https://registry.yarnpkg.com/eve/-/eve-0.5.4.tgz#67d080b9725291d7e389e34c26860dd97f1debaa" - event-emitter@~0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" @@ -6387,16 +6341,6 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-burger-menu@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/react-burger-menu/-/react-burger-menu-2.4.0.tgz#64c1f1b38b0065c1fbd3aa14b0ceca87c50e7e56" - dependencies: - browserify-optional "^1.0.0" - classnames "^2.1.1" - eve "~0.5.1" - prop-types "^15.5.8" - snapsvg-cjs "0.0.6" - react-dev-utils@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-5.0.0.tgz#425ac7c9c40c2603bc4f7ab8836c1406e96bb473" @@ -6699,10 +6643,6 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" -redux-burger-menu@^0.2.4: - version "0.2.4" - resolved "https://registry.npmjs.org/redux-burger-menu/-/redux-burger-menu-0.2.4.tgz#89c1da0b20b44c0b2e359689a0fe0af098c0a123" - redux-devtools-extension@^2.13.2: version "2.13.2" resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.2.tgz#e0f9a8e8dfca7c17be92c7124958a3b94eb2911d" @@ -7220,18 +7160,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^2.0.0" -snapsvg-cjs@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/snapsvg-cjs/-/snapsvg-cjs-0.0.6.tgz#3b2f56af2573d3d364c3ed5bf8885745f4d2dde1" - dependencies: - snapsvg "0.5.1" - -snapsvg@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/snapsvg/-/snapsvg-0.5.1.tgz#0caf52c79189a290746fc446cc5e863f6bdddfe3" - dependencies: - eve "~0.5.1" - sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -7306,12 +7234,6 @@ source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" -source-map@~0.1.30: - version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - dependencies: - amdefine ">=0.0.4" - spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" @@ -7659,7 +7581,7 @@ throat@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836" -through@^2.3.6, through@~2.3.4: +through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"