UNPKG

zrmc

Version:

ZRMC is an ES7 React wrapper for Material Components Web.

186 lines (145 loc) 5.02 kB
"use strict"; 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 };