import React from 'react'; import {Icon} from './common.js'; import Link from 'component/link'; export class DropDownMenuItem extends React.Component { static propTypes = { href: React.PropTypes.string, label: React.PropTypes.string, icon: React.PropTypes.string, onClick: React.PropTypes.func, } static defaultProps = { iconPosition: 'left', } render() { var icon = (this.props.icon ? <Icon icon={this.props.icon} fixed /> : null); return ( <a className="menu__menu-item" onClick={this.props.onClick} href={this.props.href || 'javascript:'} label={this.props.label}> {this.props.iconPosition == 'left' ? icon : null} {this.props.label} {this.props.iconPosition == 'left' ? null : icon} </a> ); } } export class DropDownMenu extends React.Component { constructor(props) { super(props); this._isWindowClickBound = false; this._menuDiv = null; this.state = { menuOpen: false, }; } componentWillUnmount() { if (this._isWindowClickBound) { window.removeEventListener('click', this.handleWindowClick, false); } } handleMenuIconClick(e) { this.setState({ menuOpen: !this.state.menuOpen, }); if (!this.state.menuOpen && !this._isWindowClickBound) { this._isWindowClickBound = true; window.addEventListener('click', this.handleWindowClick, false); e.stopPropagation(); } return false; } handleMenuClick(e) { // Event bubbles up to the menu after a link is clicked this.setState({ menuOpen: false, }); } handleWindowClick(e) { if (this.state.menuOpen && (!this._menuDiv || !this._menuDiv.contains(e.target))) { this.setState({ menuOpen: false }); } } render() { if (!this.state.menuOpen && this._isWindowClickBound) { this._isWindowClickBound = false; window.removeEventListener('click', this.handleWindowClick, false); } return ( <div className="menu-container"> <Link ref={(span) => this._menuButton = span} button="text" icon="icon-ellipsis-v" onClick={(event) => { this.handleMenuIconClick(event) }} /> {this.state.menuOpen ? <div ref={(div) => this._menuDiv = div} className="menu" onClick={(event) => { this.handleMenuClick(event) }}> {this.props.children} </div> : null} </div> ); } }