@eccenca/gui-elements
Version:
Collection of low-level GUI elements like Buttons, Icons or Alerts. Also includes core styles for those elements.
106 lines (91 loc) • 2.99 kB
JSX
import React from 'react';
import _ from 'lodash';
import ReactMDLMenu, {MenuItem} from 'react-mdl/lib/Menu';
import Button from './../../elements/Button/Button';
import PerformanceMixin from './../../mixins/PerformanceMixin';
/**
* This component provides a context menu
*/
const ContextMenu = React.createClass({
mixins: [PerformanceMixin],
displayName: 'ContextMenu',
propTypes: {
align: React.PropTypes.string,
valign: React.PropTypes.string,
className: React.PropTypes.string,
ripple: React.PropTypes.bool,
target: React.PropTypes.string,
tooltip: React.PropTypes.string,
},
getDefaultProps() {
return {
align: 'right',
valign: 'bottom',
ripple: false,
tooltip: 'open menu',
};
},
render() {
const {children, iconName, tooltip, target, ...otherProps} = this.props;
const menuItemsCopy = Array.isArray(children) ? children : [children];
const menuId = target || _.uniqueId('app-contextmenu-');
const menuItems = _.map(menuItemsCopy, (obj, idx) => {
if (obj) {
if (_.has(obj, 'props.className') && obj.key) {
return obj;
}
const objExtension = {};
// add className if none exist
if (
!_.has(obj, 'props.className') &&
_.has(obj, 'props.children')
) {
objExtension.className = `item-${_.kebabCase(
obj.props.children
)}`;
}
// add key
if (!obj.key) {
objExtension.key = `MenuItem.${idx}`;
}
return Object.assign(
{},
obj,
objExtension.key ? {key: objExtension.key} : {key: obj.key},
objExtension.className
? {
props: Object.assign({}, obj.props, {
className: objExtension.className,
}),
}
: {props: obj.props}
);
}
return null;
});
const menulist =
menuItems.length > 0 ? (
<ReactMDLMenu target={menuId} {...otherProps}>
{menuItems}
</ReactMDLMenu>
) : (
false
);
return menulist ? (
<div className="contextmenu-container">
<Button
iconName={iconName || 'menu_more'}
id={menuId}
tooltip={false}
/>
{menulist}
</div>
) : (
false
);
},
});
export default {
ContextMenu,
MenuItem,
};