zrmc
Version:
ZRMC is an ES7 React wrapper for Material Components Web.
186 lines (145 loc) • 5.02 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = undefined;
var _objectWithoutProperties2 = require("babel-runtime/helpers/objectWithoutProperties");
var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require("babel-runtime/helpers/createClass");
var _createClass3 = _interopRequireDefault(_createClass2);
var _possibleConstructorReturn2 = require("babel-runtime/helpers/possibleConstructorReturn");
var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
var _inherits2 = require("babel-runtime/helpers/inherits");
var _inherits3 = _interopRequireDefault(_inherits2);
var _react = require("react");
var _react2 = _interopRequireDefault(_react);
var _propTypes = require("prop-types");
var _propTypes2 = _interopRequireDefault(_propTypes);
var _ = require("../");
var _2 = _interopRequireDefault(_);
var _foundation = require("./foundation");
var _foundation2 = _interopRequireDefault(_foundation);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* mdc-menu-anchor
* See:
* https://material.io/components/web/catalog/menus/
* https://material-components-web.appspot.com/simple-menu.html
*
*/
/**
* Copyright (c) 2015-present, CWB SAS
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var MDC_MENU_ANCHOR = "mdc-menu-anchor";
var MenuAnchor = function (_Component) {
(0, _inherits3.default)(MenuAnchor, _Component);
function MenuAnchor(props) {
(0, _classCallCheck3.default)(this, MenuAnchor);
var _this = (0, _possibleConstructorReturn3.default)(this, (MenuAnchor.__proto__ || Object.getPrototypeOf(MenuAnchor)).call(this, props));
_initialiseProps.call(_this);
var open = props.menu.props.open;
_this.state = { open: open };
return _this;
}
(0, _createClass3.default)(MenuAnchor, [{
key: "componentDidMount",
value: function componentDidMount() {
_2.default.enableClickOutside(this.onClickOutsideHandler);
this.updateContent();
}
}, {
key: "componentDidUpdate",
value: function componentDidUpdate() {
this.updateContent();
}
}, {
key: "componentWillUnmount",
value: function componentWillUnmount() {
_2.default.disableClickOutside(this.onClickOutsideHandler);
}
}, {
key: "updateContent",
value: function updateContent() {
if (this.anchorRef && this.menuRef && this.state.open) {
var style = _foundation2.default.autoPosition(this);
this.menuRef.innerRef.style = style;
_2.default.lockScroll();
}
}
}, {
key: "render",
value: function render() {
var _this2 = this;
var _props = this.props,
menu = _props.menu,
children = _props.children,
props = (0, _objectWithoutProperties3.default)(_props, ["menu", "children"]);
var classes = MDC_MENU_ANCHOR;
// change onClick event for anchor
var a = children;
var anchorElement = _react2.default.cloneElement(a, {
onClick: this.onClickHandler,
ref: function ref(c) {
_this2.anchorRef = c;
}
});
// change menu open based on onClick event
var menuElement = _react2.default.cloneElement(menu, {
open: this.state.open,
ref: function ref(c) {
_this2.menuRef = c;
},
onClose: this.onClose
});
var element = _react2.default.createElement(
"div",
{ className: classes },
anchorElement,
menuElement
);
return _2.default.render(element, props);
}
}]);
return MenuAnchor;
}(_react.Component);
var _initialiseProps = function _initialiseProps() {
var _this3 = this;
this.onClickOutsideHandler = function (e) {
var open = _this3.state.open;
if (open && (!_this3.anchorRef || !_this3.anchorRef.contains(e.target)) && (!_this3.menuRef || !_this3.menuRef.innerRef || !_this3.menuRef.innerRef.contains(e.target))) {
e.preventDefault();
_this3.onClose();
}
};
this.onClickHandler = function (e) {
e.stopPropagation();
if (_this3.state.open) {
_this3.onClose();
} else {
_this3.setState({ open: true });
_2.default.lockScroll();
}
var prevOnClick = _this3.props.children.props.onClick;
if (prevOnClick) {
prevOnClick(e);
}
};
this.onClose = function () {
_this3.setState({ open: false });
_2.default.unlockScroll();
};
};
exports.default = MenuAnchor;
MenuAnchor.defaultProps = {
mdcElement: MDC_MENU_ANCHOR
};
MenuAnchor.propTypes = {
mdcElement: _propTypes2.default.string,
menu: _propTypes2.default.element.isRequired,
children: _propTypes2.default.element
};