UNPKG

generator-bingo-dig-h5

Version:

Bingo-dig-h5 generator by BINGO.DIG

164 lines (138 loc) 4.15 kB
var React = require('react'); var Classable = require('../mixins/classable'); var EnhancedButton = require('./enhanced-button'); var FontIcon = require('./font-icon'); var Tooltip = require('./tooltip'); var IconButton = React.createClass({ mixins: [Classable], propTypes: { className: React.PropTypes.string, disabled: React.PropTypes.bool, iconClassName: React.PropTypes.string, placement: React.PropTypes.oneOf(['top', 'right', 'bottom', 'left']), onBlur: React.PropTypes.func, onFocus: React.PropTypes.func, tooltip: React.PropTypes.string, touch: React.PropTypes.bool, hasCounts: React.PropTypes.bool, counts: React.PropTypes.number, midSize: React.PropTypes.bool }, getDefaultProps: function() { return { placement: 'bottom', hasCounts: false, counts: 0, midSize: false }; }, getInitialState: function() { return { tooltipShown: false }; }, componentDidMount: function() { if (this.props.tooltip) { this._positionTooltip(); } if (process.NODE_ENV !== 'production') { if (this.props.iconClassName && this.props.children) { var warning = 'You have set both an iconClassName and a child icon. ' + 'It is recommended you use only one method when adding ' + 'icons to IconButtons.'; console.warn(warning); } } }, render: function() { var { tooltip, touch, ...other } = this.props; var classes = this.getClasses('dig-icon-button', { 'mid-size': this.props.midSize }); var tooltip; var fonticon; if (this.props.tooltip) { tooltip = ( <Tooltip ref="tooltip" label={tooltip} show={this.state.tooltipShown} touch={touch} /> //className="dig-icon-button-tooltip" ); } if (this.props.iconClassName) { fonticon = ( <FontIcon className={this.props.iconClassName} hasCounts={this.props.hasCounts} counts={this.props.counts} midSize={this.props.midSize} /> ); } return ( <EnhancedButton {...other} ref="button" centerRipple={true} className={classes} onBlur={this._handleBlur} onFocus={this._handleFocus} onMouseOut={this._handleMouseOut} onMouseOver={this._handleMouseOver}> {tooltip} {fonticon} {this.props.children} </EnhancedButton> ); }, _positionTooltip: function() { var tooltip = this.refs.tooltip.getDOMNode(); var tooltipWidth = tooltip.offsetWidth; var tooltipHeight = tooltip.offsetHeight; var button = this.getDOMNode(); var buttonWidth = button.offsetWidth; var buttonHeight = button.offsetHeight; switch (this.props.placement) { case 'right': break; case 'left': break; case 'top': tooltip.style.left = (buttonWidth - tooltipWidth) / 2 + 'px'; tooltip.style.top = (buttonHeight + tooltipHeight) * -3 / 4 + 'px'; break; case 'bottom': tooltip.style.left = (buttonWidth - tooltipWidth) / 2 + 'px'; tooltip.style.top = buttonHeight * 3 / 4 + 'px'; break; default: throw new Error('_positionTooltip(): No such placement of "' + this.props.placement + '" found.'); } }, _showTooltip: function() { if (!this.props.disabled) this.setState({ tooltipShown: true }); }, _hideTooltip: function() { this.setState({ tooltipShown: false }); }, _handleBlur: function(e) { this._hideTooltip(); if (this.props.onBlur) this.props.onBlur(e); }, _handleFocus: function(e) { this._showTooltip(); if (this.props.onFocus) this.props.onFocus(e); }, _handleMouseOut: function(e) { if (!this.refs.button.isKeyboardFocused()) this._hideTooltip(); if (this.props.onMouseOut) this.props.onMouseOut(e); }, _handleMouseOver: function(e) { this._showTooltip(); if (this.props.onMouseOver) this.props.onMouseOver(e); } }); module.exports = IconButton;