Skip to content

Commit

Permalink
Fixed #58
Browse files Browse the repository at this point in the history
  • Loading branch information
Merve7 committed Jul 24, 2017
1 parent 6b58e2c commit 8f0e8ff
Show file tree
Hide file tree
Showing 8 changed files with 543 additions and 3 deletions.
18 changes: 18 additions & 0 deletions public/showcase/resources/images/primeng-text.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ class AppMenu extends Component {
<Link to="/breadcrumb">&#9679; Breadcrumb</Link>
<Link to="/tieredmenu">&#9679; TieredMenu</Link>
<Link to="/menubar">&#9679; Menubar</Link>
<Link to="/contextmenu">&#9679; ContextMenu</Link>
</div>

<a href="#" onClick={(event) => this.openMenu(event, 7)} className={classNames({ 'active-menuitem': this.state.activeMenu === 7 })}>
Expand Down
137 changes: 137 additions & 0 deletions src/components/contextmenu/ContextMenu.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
import React, {Component} from 'react';
import PropTypes from 'prop-types';
import ReactDOM from 'react-dom';
import DomHandler from '../utils/DomHandler';
import classNames from 'classnames';
import {NestedMenu} from "../nestedmenu/NestedMenu";

export class ContextMenu extends Component {
static defaultProps = {
model:null,
style: null,
styleClass: null,
global:false,
target:null
}

static propsTypes = {
model:PropTypes.array,
style: PropTypes.string,
styleClass: PropTypes.string,
global:PropTypes.bool,
target:PropTypes.any
}

constructor(props) {
super(props);
this.state = {visible:false};
}
componentDidMount(){
this.bindDocumentListener();
}
toggle(event){
if(this.state.visible)
this.hide(event);
else
this.show(event);
}

show(event) {
this.position(event);
this.setState({visible:true});
DomHandler.fadeIn(this.container, 250);
this.bindDocumentListener();

if(event) {
event.preventDefault();
}
}
hide(event) {
this.setState({visible:false})
this.unbindDocumentListener();
}
position(event) {
if(event) {
let left = event.pageX + 1;
let top = event.pageY + 1;
let width = this.container.offsetParent ? this.container.offsetWidth: DomHandler.getHiddenElementOuterWidth(this.container);
let height = this.container.offsetParent ? this.container.offsetHeight: DomHandler.getHiddenElementOuterHeight(this.container);
let viewport = DomHandler.getViewport();

//flip
if(left + width - document.body.scrollLeft > viewport.width) {
left -= width;
}

//flip
if(top + height - document.body.scrollTop > viewport.height) {
top -= height;
}

//fit
if(left < document.body.scrollLeft) {
left = document.body.scrollLeft;
}

//fit
if(top < document.body.scrollTop) {
top = document.body.scrollTop;
}

this.container.style.left = left + 'px';
this.container.style.top = top + 'px';
}
}
bindDocumentListener() {
this.documentClickListener = () => {
this.hide();
};
document.addEventListener('click', this.documentClickListener);

if(this.props.global){
this.rightClickListener=(event)=>{
this.show(event);
event.preventDefault();}
document.addEventListener('contextmenu',this.rightClickListener)
}
/*if(this.props.target){
this.rightClickListener=(event)=>{
this.show(event);
event.preventDefault();
event.stopPropagation();
}
this.props.target.addEventListener('contextmenu',this.rightClickListener)
}*/

}

unbindDocumentListener() {
if(this.documentClickListener) {
document.removeEventListener('click', this.documentClickListener);
this.documentClickListener = null;
}
if(this.rightClickListener && this.props.global) {
document.removeEventListener('contextmenu', this.documentClickListener);
this.rightClickListener = null;
}
/* if(this.rightClickListener && this.props.target) {
this.props.target.removeEventListener('contextmenu', this.documentClickListener);
this.rightClickListener = null;
}*/
}

componentWillUnmount() {
this.unbindDocumentListener();
}
render() {
var divClass=classNames('ui-contextmenu ui-menu ui-widget ui-widget-content ui-corner-all ui-helper-clearfix ui-menu-dynamic ui-shadow',
this.props.styleClass);
var ulClass=classNames('ui-menu-list ui-helper-reset');
var styleClass={};
return (
<div className={divClass} style={{display:this.state.visible?'block':'none'&& this.props.style}} ref={el=>this.container=el} >
<NestedMenu styleClass={ulClass} items={this.props.model} root={true} parentMenu="ContextMenu" index={0}/>
</div>
);
}
}
4 changes: 2 additions & 2 deletions src/components/menu/MenuItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export class MenuItem extends Component{
if(this.item.url){
return (
<a href={this.item.url || '#'} className={styleClass} target={this.item.target} onClick={event=>this.menu.itemClick(event,this.item)}>
{this.item.items && this.props.parentMenu==='TieredMenu' && <span className="ui-submenu-icon fa fa-fw fa-caret-right"></span>}
{this.item.items && (this.props.parentMenu==='TieredMenu' || this.props.parentMenu==='ContextMenu') && <span className="ui-submenu-icon fa fa-fw fa-caret-right"></span>}
{this.item.icon && <span className={iconClass}></span>}
<span className="ui-menuitem-text">{this.item.label}</span>
{this.item.items && this.props.parentMenu==='Menubar' && <span className={rootClass}></span>}
Expand All @@ -43,7 +43,7 @@ export class MenuItem extends Component{
else{
return (
<a className={styleClass} href="#" target={this.item.target} onClick={event=>this.menu.itemClick(event,this.item)}>
{this.item.items && this.props.parentMenu==='TieredMenu' && <span className="ui-submenu-icon fa fa-fw fa-caret-right"></span>}
{this.item.items && (this.props.parentMenu==='TieredMenu' || this.props.parentMenu==='ContextMenu') && <span className="ui-submenu-icon fa fa-fw fa-caret-right"></span>}
{this.item.icon && <span className={iconClass}></span>}
<span className="ui-menuitem-text">{this.item.label}</span>
{this.item.items && this.props.parentMenu==='Menubar' && <span className={rootClass}></span>}
Expand Down
2 changes: 1 addition & 1 deletion src/components/nestedmenu/NestedMenuItem.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export class NestedMenuItem extends Component{
this.sublist=event.currentTarget.children[1];
if(this.sublist){
this.sublist.style.zIndex = DomHandler.getZindex();
if(this.props.parentMenu==='TieredMenu' || (this.props.parentMenu==='Menubar' && !this.props.root))
if(this.props.parentMenu==='TieredMenu' || (this.props.parentMenu==='Menubar' && !this.props.root) || this.props.parentMenu==='ContextMenu')
DomHandler.addClass(this.sublist,'ui-tieredmenu-item');
this.sublist.style.display='block';
}
Expand Down
19 changes: 19 additions & 0 deletions src/components/utils/DomHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,25 @@ export default class DomHandler {
element.style.top = top + 'px';
element.style.left = left + 'px';
}
static getHiddenElementOuterHeight(element) {
element.style.visibility = 'hidden';
element.style.display = 'block';
let elementHeight = element.offsetHeight;
element.style.display = 'none';
element.style.visibility = 'visible';

return elementHeight;
}

static getHiddenElementOuterWidth(element) {
element.style.visibility = 'hidden';
element.style.display = 'block';
let elementWidth = element.offsetWidth;
element.style.display = 'none';
element.style.visibility = 'visible';

return elementWidth;
}

static getHiddenElementDimensions(element) {
var dimensions = {};
Expand Down
2 changes: 2 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ import {TabMenuDemo} from './showcase/tabmenu/TabMenuDemo';
import {BreadcrumbDemo} from './showcase/breadcrumb/BreadcrumbDemo';
import {TieredMenuDemo} from './showcase/tieredmenu/TieredMenuDemo';
import {MenubarDemo} from './showcase/menubar/MenubarDemo';
import {ContextMenuDemo} from './showcase/contextmenu/ContextMenuDemo';
import {Router,Route,hashHistory} from 'react-router';

ReactDOM.render(
Expand Down Expand Up @@ -144,6 +145,7 @@ ReactDOM.render(
<Route path="/breadcrumb" component={BreadcrumbDemo} />
<Route path="/tieredmenu" component={TieredMenuDemo} />
<Route path="/menubar" component={MenubarDemo} />
<Route path="/contextmenu" component={ContextMenuDemo} />
<Route path="/setup" component={SetupPage} />
<Route path="/splitbutton" component={SplitButtonDemo} />
</Route>
Expand Down
Loading

0 comments on commit 8f0e8ff

Please sign in to comment.