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 ? : null); return ( {this.props.iconPosition == 'left' ? icon : null} {this.props.label} {this.props.iconPosition == 'left' ? null : icon} ); } } 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 (
this._menuButton = span} button="text" icon="icon-ellipsis-v" onClick={(event) => { this.handleMenuIconClick(event) }} /> {this.state.menuOpen ?
this._menuDiv = div} className="menu" onClick={(event) => { this.handleMenuClick(event) }}> {this.props.children}
: null}
); } }