fleet/frontend/components/buttons/EllipsisMenu/EllipsisMenu.jsx

112 lines
2.4 KiB
React
Raw Normal View History

import React, { Component, PropTypes } from 'react';
import { calculateTooltipDirection } from './helpers';
import ClickOutside from '../../ClickOutside';
const baseClass = 'ellipsis-menu';
2016-11-04 17:06:11 +00:00
export class EllipsisMenu extends Component {
static propTypes = {
children: PropTypes.node,
positionStyles: PropTypes.object, // eslint-disable-line react/forbid-prop-types
};
constructor (props) {
super(props);
this.state = {
showChildren: false,
};
}
componentDidMount () {
const { setTooltipDirection } = this;
global.window.addEventListener('resize', setTooltipDirection);
return setTooltipDirection();
}
componentWillUnmount () {
const { setTooltipDirection } = this;
global.window.removeEventListener('resize', setTooltipDirection);
return false;
}
onToggleChildren = () => {
const { showChildren } = this.state;
this.setState({ showChildren: !showChildren });
return false;
}
setDOMNode = (DOMNode) => {
this.DOMNode = DOMNode;
}
setTooltipDirection = () => {
if (this.DOMNode) {
const tooltipDirection = calculateTooltipDirection(this.DOMNode);
this.setState({ tooltipDirection });
}
return false;
}
renderChildren = () => {
const { children } = this.props;
const { showChildren, tooltipDirection } = this.state;
const triangleDirection = tooltipDirection === 'left' ? 'right' : 'left';
if (!showChildren) {
return false;
}
return (
<div
className={`container-triangle ${triangleDirection} ${baseClass}__triangle ${baseClass}__triangle--${tooltipDirection}`}
>
{children}
</div>
);
}
render () {
const { onToggleChildren, renderChildren, setDOMNode } = this;
const { positionStyles } = this.props;
return (
<div
ref={setDOMNode}
className={baseClass}
style={positionStyles}
>
<button
onClick={onToggleChildren}
className={`${baseClass}__btn button button--unstyled`}
>
&bull; &bull; &bull;
</button>
{renderChildren()}
</div>
);
}
}
2016-11-04 17:06:11 +00:00
export default ClickOutside(EllipsisMenu, {
getDOMNode: (component) => {
return component.DOMNode;
},
onOutsideClick: (component) => {
return () => {
component.setState({ showChildren: false });
return false;
};
},
});