@momentum-ui/react-collaboration
Version:
Cisco Momentum UI Framework for React Collaboration Applications
129 lines • 6.12 kB
JavaScript
/** @component menu */
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
import React from 'react';
import { findDOMNode } from 'react-dom';
import PropTypes from 'prop-types';
import omit from 'lodash/omit';
import { UIDReset } from 'react-uid';
import EventOverlay from '../EventOverlay';
import MenuContext from '../MenuContext';
import { isMRv2Button } from '../../helpers/verifyTypes';
/**
* @deprecated - Components in the legacy folder (/src/legacy) are deprecated. Please use a component from the components folder (/src/components) instead. Legacy components may not follow accessibility standards.
**/
var MenuOverlay = /** @class */ (function (_super) {
__extends(MenuOverlay, _super);
function MenuOverlay() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.state = {
isOpen: _this.props.isOpen || false,
};
_this.onSelect = function (e, opts) {
var onSelect = _this.props.onSelect;
var eventKey = opts.eventKey, element = opts.element;
var keepMenuOpen = element.props.keepMenuOpen;
onSelect && onSelect(e, { eventKey: eventKey, element: element });
element.constructor.displayName !== 'SubMenu' && !keepMenuOpen && _this.handleClose();
};
_this.handleClose = function () {
_this.setState({ isOpen: false });
};
return _this;
}
MenuOverlay.prototype.componentDidMount = function () {
this.props.isOpen && this.forceUpdate();
};
MenuOverlay.prototype.componentDidUpdate = function (prevProps, prevState) {
var focusFirstQuery = this.props.focusFirstQuery;
var isOpen = this.state.isOpen;
if (!prevState.isOpen && prevState !== isOpen && focusFirstQuery) {
var overlay = findDOMNode(this.menuOverlay);
var focusElement = overlay && overlay.querySelector(focusFirstQuery);
focusElement && focusElement.focus();
}
};
MenuOverlay.prototype.render = function () {
var _this = this;
var _a = this.props, children = _a.children, className = _a.className, menuTrigger = _a.menuTrigger, showArrow = _a.showArrow, props = __rest(_a, ["children", "className", "menuTrigger", "showArrow"]);
var isOpen = this.state.isOpen;
var otherProps = omit(__assign({}, props), ['isOpen', 'focusFirstQuery', 'onSelect']);
var setMenuTrigger = function () {
var _a;
return React.cloneElement(menuTrigger, (_a = {},
_a[isMRv2Button(menuTrigger) ? 'onPress' : 'onClick'] = function () {
return _this.setState({ isOpen: !isOpen });
},
_a.ref = function (ref) { return (_this.anchorNode = ref); },
_a));
};
return (React.createElement("div", { className: 'md-menu-overlay-wrapper' + "".concat((className && " ".concat(className)) || '') },
setMenuTrigger(),
isOpen && (React.createElement(EventOverlay, __assign({ allowClickAway: true, anchorNode: this.anchorNode, className: "md-menu-overlay", close: this.handleClose, isOpen: isOpen, ref: function (ref) { return (_this.menuOverlay = ref); }, showArrow: showArrow }, otherProps),
React.createElement(MenuContext.Provider, { value: { parentOnSelect: this.onSelect } },
React.createElement(UIDReset, null, children))))));
};
return MenuOverlay;
}(React.Component));
MenuOverlay.propTypes = {
/** @prop Children nodes to render inside MenuOverlay | null */
children: PropTypes.node,
/** @prop Optional css class name | '' */
className: PropTypes.string,
/** @prop Queries children to find matching item to have focus | '' */
focusFirstQuery: PropTypes.string,
/** @prop Prop to initalize state as open | false */
isOpen: PropTypes.bool,
/** @prop HTML element that provides control to MenuOverlay user */
menuTrigger: PropTypes.element.isRequired,
/** @prop Callback function invoked when user selects MenuOverlay | null */
onSelect: PropTypes.func,
/** @prop Determines if the MenuOverlay should show the open/close arrow | true */
showArrow: PropTypes.bool,
};
MenuOverlay.defaultProps = {
children: null,
className: '',
focusFirstQuery: '',
isOpen: false,
onSelect: null,
showArrow: true,
};
MenuOverlay.displayName = 'MenuOverlay';
export default MenuOverlay;
//# sourceMappingURL=index.js.map