From f11636340331a169d6ec1e897c2e53ebbb0503dd Mon Sep 17 00:00:00 2001 From: Ray Schamp <ray@scratch.mit.edu> Date: Thu, 12 Apr 2018 15:13:43 -0400 Subject: [PATCH] Add dividers It's a cleaner API IMO but ended up being a messy implementation... --- src/components/menu-bar/menu-bar.jsx | 61 ++++++++++++++++++---------- src/components/menu/menu.css | 3 +- src/components/menu/menu.jsx | 22 +++++++++- src/containers/load-button.jsx | 11 ++++- src/containers/save-button.jsx | 9 +++- 5 files changed, 79 insertions(+), 27 deletions(-) diff --git a/src/components/menu-bar/menu-bar.jsx b/src/components/menu-bar/menu-bar.jsx index c66fdb2fa..1574014fd 100644 --- a/src/components/menu-bar/menu-bar.jsx +++ b/src/components/menu-bar/menu-bar.jsx @@ -10,7 +10,7 @@ import {ComingSoonTooltip} from '../coming-soon/coming-soon.jsx'; import LanguageSelector from '../../containers/language-selector.jsx'; import LoadButton from '../../containers/load-button.jsx'; import Menu from '../../containers/menu.jsx'; -import {MenuItem} from '../menu/menu.jsx'; +import {MenuItem, MenuSection} from '../menu/menu.jsx'; import SaveButton from '../../containers/save-button.jsx'; import {openFeedbackForm} from '../../reducers/modals'; @@ -25,9 +25,14 @@ import communityIcon from './icon--see-community.svg'; import dropdownCaret from '../language-selector/dropdown-caret.svg'; import scratchLogo from './scratch-logo.svg'; -const MenuBarItemTooltip = ({id, place = 'bottom', children}) => ( +const MenuBarItemTooltip = ({ + children, + className, + id, + place = 'bottom' +}) => ( <ComingSoonTooltip - className={styles.comingSoon} + className={classNames(styles.comingSoon, className)} place={place} tooltipClassName={styles.comingSoonTooltip} tooltipId={id} @@ -38,13 +43,14 @@ const MenuBarItemTooltip = ({id, place = 'bottom', children}) => ( MenuBarItemTooltip.propTypes = { children: PropTypes.node, + className: PropTypes.string, id: PropTypes.string, place: PropTypes.oneOf(['top', 'bottom', 'left', 'right']) }; -const MenuItemTooltip = ({id, children}) => ( +const MenuItemTooltip = ({id, children, className}) => ( <ComingSoonTooltip - className={styles.comingSoon} + className={classNames(styles.comingSoon, className)} place="right" tooltipClassName={styles.comingSoonTooltip} tooltipId={id} @@ -55,6 +61,7 @@ const MenuItemTooltip = ({id, children}) => ( MenuItemTooltip.propTypes = { children: PropTypes.node, + className: PropTypes.string, id: PropTypes.string }; @@ -115,23 +122,33 @@ const MenuBar = props => ( <MenuItemTooltip id="new"> <MenuItem>New</MenuItem> </MenuItemTooltip> - <MenuItemTooltip id="save"> - <MenuItem>Save now</MenuItem> - </MenuItemTooltip> - <MenuItemTooltip id="copy"> - <MenuItem>Save as a copy</MenuItem> - </MenuItemTooltip> - <LoadButton>{(renderFileInput, loadProject) => ( - <MenuItem onClick={loadProject}> - Upload from your computer - {renderFileInput()} - </MenuItem> - )}</LoadButton> - <SaveButton>{saveProject => ( - <MenuItem onClick={saveProject}> - Download to your computer - </MenuItem> - )}</SaveButton> + <MenuSection> + <MenuItemTooltip id="save"> + <MenuItem>Save now</MenuItem> + </MenuItemTooltip> + <MenuItemTooltip id="copy"> + <MenuItem>Save as a copy</MenuItem> + </MenuItemTooltip> + </MenuSection> + <MenuSection> + <LoadButton>{(renderFileInput, loadProject, loadProps) => ( + <MenuItem + onClick={loadProject} + {...loadProps} + > + Upload from your computer + {renderFileInput()} + </MenuItem> + )}</LoadButton> + <SaveButton>{(saveProject, saveProps) => ( + <MenuItem + onClick={saveProject} + {...saveProps} + > + Download to your computer + </MenuItem> + )}</SaveButton> + </MenuSection> </MenuBarMenu> </div> <div className={classNames(styles.menuBarItem)}> diff --git a/src/components/menu/menu.css b/src/components/menu/menu.css index 9940e9611..c9fae4930 100644 --- a/src/components/menu/menu.css +++ b/src/components/menu/menu.css @@ -33,8 +33,7 @@ background-color: $ui-black-transparent; } -.divider { - margin-top: 10px; +.menu-section { border-top: 1px solid $ui-black-transparent; } diff --git a/src/components/menu/menu.jsx b/src/components/menu/menu.jsx index 6bea78c83..5268efb88 100644 --- a/src/components/menu/menu.jsx +++ b/src/components/menu/menu.jsx @@ -59,7 +59,27 @@ MenuItem.propTypes = { onClick: PropTypes.func }; +const addDividerClassToFirstChild = (child, id) => ( + React.cloneElement(child, { + className: classNames(child.className, { + [styles.menuSection]: id === 0 + }), + key: id + }) +); + +const MenuSection = ({children}) => ( + <React.Fragment>{ + children.map(addDividerClassToFirstChild) + }</React.Fragment> +); + +MenuSection.propTypes = { + children: PropTypes.node +}; + export { MenuComponent as default, - MenuItem + MenuItem, + MenuSection }; diff --git a/src/containers/load-button.jsx b/src/containers/load-button.jsx index fae36861e..d13319018 100644 --- a/src/containers/load-button.jsx +++ b/src/containers/load-button.jsx @@ -61,7 +61,16 @@ class LoadButton extends React.Component { } render () { if (this.state.loadingError) throw new Error(`Failed to load project: ${this.state.errorMessage}`); - return this.props.children(this.renderFileInput, this.handleClick); + const { + /* eslint-disable no-unused-vars */ + children, + closeLoadingState, + openLoadingState, + vm, + /* eslint-enable no-unused-vars */ + ...props + } = this.props; + return this.props.children(this.renderFileInput, this.handleClick, props); } } diff --git a/src/containers/save-button.jsx b/src/containers/save-button.jsx index 6458de5ba..cb840ac33 100644 --- a/src/containers/save-button.jsx +++ b/src/containers/save-button.jsx @@ -30,7 +30,14 @@ class SaveButton extends React.Component { }); } render () { - return this.props.children(this.saveProject); + const { + /* eslint-disable no-unused-vars */ + children, + vm, + /* eslint-enable no-unused-vars */ + ...props + } = this.props; + return this.props.children(this.saveProject, props); } } -- GitLab