@lyra/components
Version:
Basic UX components
180 lines (148 loc) • 6.09 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _omit3 = require('lodash/omit');
var _omit4 = _interopRequireDefault(_omit3);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _dropdownStyle = require('part:@lyra/components/buttons/dropdown-style');
var _dropdownStyle2 = _interopRequireDefault(_dropdownStyle);
var _default = require('part:@lyra/components/buttons/default');
var _default2 = _interopRequireDefault(_default);
var _angleDownIcon = require('part:@lyra/base/angle-down-icon');
var _angleDownIcon2 = _interopRequireDefault(_angleDownIcon);
var _default3 = require('part:@lyra/components/menus/default');
var _default4 = _interopRequireDefault(_default3);
var _reactPopper = require('react-popper');
var _stacked = require('part:@lyra/components/utilities/stacked');
var _stacked2 = _interopRequireDefault(_stacked);
var _escapable = require('part:@lyra/components/utilities/escapable');
var _escapable2 = _interopRequireDefault(_escapable);
var _portal = require('part:@lyra/components/utilities/portal');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } /* eslint-disable complexity */
class DropDownButton extends _react2.default.PureComponent {
constructor(...args) {
var _temp;
return _temp = super(...args), this.state = {
menuOpened: false,
width: 100
}, this.handleClose = () => {
this.setState({ menuOpened: false });
}, this.setRootElement = element => {
this._rootElement = element;
if (element) {
this.width = element.offsetWidth;
}
}, this.setMenuElement = element => {
this._menuElement = element;
}, this.handleOnClick = event => {
this.setState({
menuOpened: true,
width: event.target.offsetWidth
});
}, this.handleClickOutside = event => {
if (this._rootElement && this._rootElement.contains(event.target)) {
// Stop the open button from being clicked
event.stopPropagation();
this.handleClose();
} else {
this.handleClose();
}
}, this.handleAction = item => {
this.props.onAction(item);
this.handleClose();
}, _temp;
}
render() {
var _omit2 = (0, _omit4.default)(this.props, 'onAction');
const items = _omit2.items,
children = _omit2.children,
kind = _omit2.kind,
className = _omit2.className,
origin = _omit2.origin,
rest = _objectWithoutProperties(_omit2, ['items', 'children', 'kind', 'className', 'origin']);
var _state = this.state;
const menuOpened = _state.menuOpened,
width = _state.width;
return _react2.default.createElement(
'div',
{ ref: this.setRootElement, className: `${_dropdownStyle2.default.root} ${className}` },
_react2.default.createElement(
_reactPopper.Manager,
null,
_react2.default.createElement(
_reactPopper.Target,
null,
_react2.default.createElement(
_default2.default,
_extends({}, rest, { onClick: this.handleOnClick, kind: kind }),
_react2.default.createElement(
'span',
{ className: _dropdownStyle2.default.title },
children
),
_react2.default.createElement(
'span',
{ className: _dropdownStyle2.default.arrow },
_react2.default.createElement(_angleDownIcon2.default, { color: 'inherit' })
)
)
),
menuOpened && _react2.default.createElement(
_portal.Portal,
null,
_react2.default.createElement(
_stacked2.default,
null,
isActive => _react2.default.createElement(
_reactPopper.Popper,
{ className: _dropdownStyle2.default.popper },
_react2.default.createElement(
'div',
{
className: _dropdownStyle2.default.wrapper,
ref: this.setMenuElement,
style: { minWidth: `${width}px` }
},
_react2.default.createElement(_escapable2.default, { onEscape: isActive && this.handleClose }),
_react2.default.createElement(_default4.default, {
items: items,
isOpen: true,
className: _dropdownStyle2.default.menu,
onAction: this.handleAction,
onClickOutside: isActive && this.handleClickOutside
})
)
)
)
)
)
);
}
}
exports.default = DropDownButton;
DropDownButton.propTypes = {
kind: _propTypes2.default.oneOf(['secondary', 'add', 'delete', 'warning', 'success', 'danger', 'simple']),
items: _propTypes2.default.arrayOf(_propTypes2.default.shape({
title: _propTypes2.default.string.isRequired,
icon: _propTypes2.default.func
})),
onAction: _propTypes2.default.func.isRequired,
children: _propTypes2.default.node.isRequired,
inverted: _propTypes2.default.bool,
icon: _propTypes2.default.func,
loading: _propTypes2.default.bool,
ripple: _propTypes2.default.bool,
colored: _propTypes2.default.bool,
color: _propTypes2.default.string,
className: _propTypes2.default.string,
origin: _propTypes2.default.oneOf(['left', 'right'])
};
DropDownButton.defaultProps = {
origin: 'left'
};