@ysmood/material-ui
Version:
Material Design UI components built with React
110 lines (95 loc) • 2.84 kB
JSX
var React = require('react');
var StylePropable = require('./mixins/style-propable');
var Transitions = require('./styles/transitions');
var Spacing = require('./styles/spacing');
var ClickAwayable = require('./mixins/click-awayable');
var FontIcon = require('./font-icon');
var Menu = require('./menu/menu');
var DropDownIcon = React.createClass({
mixins: [StylePropable, ClickAwayable],
propTypes: {
onChange: React.PropTypes.func,
menuItems: React.PropTypes.array.isRequired,
closeOnMenuItemClick: React.PropTypes.bool,
iconStyle: React.PropTypes.object,
iconClassName: React.PropTypes.string,
},
getInitialState: function() {
return {
open: false,
}
},
getDefaultProps: function() {
return {
closeOnMenuItemClick: true
}
},
componentClickAway: function() {
this.setState({ open: false });
},
getStyles: function() {
var iconWidth = 48;
var styles = {
root: {
display: 'inline-block',
width: iconWidth + 'px !important',
position: 'relative',
height: Spacing.desktopToolbarHeight,
fontSize: Spacing.desktopDropDownMenuFontSize,
cursor: 'pointer'
},
menu: {
transition: Transitions.easeOut(),
right: '-14px !important',
top: '9px !important',
opacity: (this.props.open) ? 1 : 0
},
menuItem: { // similair to drop down menu's menu item styles
paddingRight: (Spacing.iconSize + (Spacing.desktopGutterLess*2)),
height: Spacing.desktopDropDownMenuItemHeight,
lineHeight: Spacing.desktopDropDownMenuItemHeight + 'px'
}
};
return styles;
},
render: function() {
var {
style,
children,
menuItems,
closeOnMenuItemClick,
iconStyle,
iconClassName,
...other
} = this.props;
var styles = this.getStyles();
return (
<div {...other} style={this.mergeAndPrefix(styles.root, this.props.style)}>
<div onTouchTap={this._onControlClick}>
<FontIcon
className={iconClassName}
style={iconStyle}/>
{this.props.children}
</div>
<Menu
ref="menuItems"
style={this.mergeAndPrefix(styles.menu)}
menuItems={menuItems}
menuItemStyle={styles.menuItem}
hideable={true}
visible={this.state.open}
onItemTap={this._onMenuItemClick} />
</div>
);
},
_onControlClick: function() {
this.setState({ open: !this.state.open });
},
_onMenuItemClick: function(e, key, payload) {
if (this.props.onChange) this.props.onChange(e, key, payload);
if (this.props.closeOnMenuItemClick) {
this.setState({ open: false });
}
}
});
module.exports = DropDownIcon;