Context menu listens to explicit touch/mouse events rather than generic click
This commit is contained in:
@ -21,18 +21,21 @@ class ContextMenu extends React.Component{
|
|||||||
this.state = {
|
this.state = {
|
||||||
submenu_expanded: false
|
submenu_expanded: false
|
||||||
}
|
}
|
||||||
this.handleScroll = this.handleScroll.bind(this)
|
this.handleScroll = this.handleScroll.bind(this);
|
||||||
this.handleClick = this.handleClick.bind(this)
|
this.handleMouseDown = this.handleMouseDown.bind(this);
|
||||||
|
this.handleTouchEnd = this.handleTouchEnd.bind(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount(){
|
componentDidMount(){
|
||||||
window.addEventListener("scroll", this.handleScroll, false)
|
window.addEventListener("scroll", this.handleScroll, false);
|
||||||
window.addEventListener("click", this.handleClick, false)
|
window.addEventListener("mousedown", this.handleMouseDown, false);
|
||||||
|
window.addEventListener("touchend", this.handleTouchEnd, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount(){
|
componentWillUnmount(){
|
||||||
window.removeEventListener("scroll", this.handleScroll, false)
|
window.removeEventListener("scroll", this.handleScroll, false);
|
||||||
window.removeEventListener("click", this.handleClick, false)
|
window.removeEventListener("mousedown", this.handleMouseDown, false);
|
||||||
|
window.removeEventListener("touchend", this.handleTouchEnd, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps){
|
componentWillReceiveProps(nextProps){
|
||||||
@ -74,8 +77,16 @@ class ContextMenu extends React.Component{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleTouchEnd(e){
|
||||||
|
this.handleClick(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
handleMouseDown(e){
|
||||||
|
this.handleClick(e);
|
||||||
|
}
|
||||||
|
|
||||||
handleClick(e){
|
handleClick(e){
|
||||||
// if we click outside of the context menu or context menu trigger, kill it
|
// if we click (touch or mouse) outside of the context menu or context menu trigger, kill it
|
||||||
if ($(e.target).closest('.context-menu').length <= 0 && $(e.target).closest('.context-menu-trigger').length <= 0){
|
if ($(e.target).closest('.context-menu').length <= 0 && $(e.target).closest('.context-menu-trigger').length <= 0){
|
||||||
this.props.uiActions.hideContextMenu()
|
this.props.uiActions.hideContextMenu()
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,6 +8,18 @@ export default class ContextMenuTrigger extends React.Component{
|
|||||||
super(props);
|
super(props);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handleMouseDown(e){
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
this.props.onTrigger(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
handleTouchEnd(e){
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
this.props.onTrigger(e);
|
||||||
|
}
|
||||||
|
|
||||||
render(){
|
render(){
|
||||||
var className = 'context-menu-trigger'
|
var className = 'context-menu-trigger'
|
||||||
if (this.props.className){
|
if (this.props.className){
|
||||||
@ -15,8 +27,8 @@ export default class ContextMenuTrigger extends React.Component{
|
|||||||
}
|
}
|
||||||
return (
|
return (
|
||||||
<span className={className}
|
<span className={className}
|
||||||
onMouseDown={e => this.props.onTrigger(e)}
|
onMouseDown={e => this.handleMouseDown(e)}
|
||||||
onTouchEnd={e => this.props.onTrigger(e)}>
|
onTouchEnd={e => this.handleTouchEnd(e)}>
|
||||||
<span className="dot"></span>
|
<span className="dot"></span>
|
||||||
<span className="dot"></span>
|
<span className="dot"></span>
|
||||||
<span className="dot"></span>
|
<span className="dot"></span>
|
||||||
|
|||||||
@ -13,12 +13,12 @@
|
|||||||
padding: 5px 8px;
|
padding: 5px 8px;
|
||||||
color: $white;
|
color: $white;
|
||||||
font-size: 11px;
|
font-size: 11px;
|
||||||
line-height: 11px;
|
line-height: 12px;
|
||||||
top: -24px;
|
bottom: 37px;
|
||||||
left: 1px;
|
left: 1px;
|
||||||
z-index: 97;
|
z-index: 97;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
white-space: nowrap;
|
white-space: wrap;
|
||||||
|
|
||||||
&:first-letter {
|
&:first-letter {
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
@ -42,7 +42,7 @@
|
|||||||
&:hover {
|
&:hover {
|
||||||
.tooltip {
|
.tooltip {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
top: -22px;
|
bottom: 35px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,7 +51,7 @@
|
|||||||
padding: 8px 12px;
|
padding: 8px 12px;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
line-height: 14px;
|
line-height: 14px;
|
||||||
top: -50px;
|
bottom: 50px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user