UNPKG

@talend/react-bootstrap

Version:

Bootstrap 3 components built with React

135 lines (134 loc) 4.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _reactDom = _interopRequireDefault(require("react-dom")); var _RootCloseWrapper = _interopRequireDefault(require("react-overlays/lib/RootCloseWrapper")); var _classnames = _interopRequireDefault(require("classnames")); var _propTypes = _interopRequireDefault(require("prop-types")); var _bootstrapUtils = require("./utils/bootstrapUtils"); var _createChainedFunction = _interopRequireDefault(require("./utils/createChainedFunction")); var _ValidComponentChildren = _interopRequireDefault(require("./utils/ValidComponentChildren")); var _jsxRuntime = require("react/jsx-runtime"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const propTypes = { open: _propTypes.default.bool, pullRight: _propTypes.default.bool, onClose: _propTypes.default.func, labelledBy: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]), onSelect: _propTypes.default.func, rootCloseEvent: _propTypes.default.oneOf(['click', 'mousedown']) }; const defaultProps = { bsRole: 'menu', pullRight: false }; class DropdownMenu extends _react.default.Component { constructor(props) { super(props); this.handleRootClose = this.handleRootClose.bind(this); this.handleKeyDown = this.handleKeyDown.bind(this); } getFocusableMenuItems() { const node = _reactDom.default.findDOMNode(this); if (!node) { return []; } return Array.from(node.querySelectorAll('[tabIndex="-1"]')); } getItemsAndActiveIndex() { const items = this.getFocusableMenuItems(); const activeIndex = items.indexOf(document.activeElement); return { items, activeIndex }; } focusNext() { const { items, activeIndex } = this.getItemsAndActiveIndex(); if (items.length === 0) { return; } const nextIndex = activeIndex === items.length - 1 ? 0 : activeIndex + 1; items[nextIndex].focus(); } focusPrevious() { const { items, activeIndex } = this.getItemsAndActiveIndex(); if (items.length === 0) { return; } const prevIndex = activeIndex === 0 ? items.length - 1 : activeIndex - 1; items[prevIndex].focus(); } handleKeyDown(event) { switch (event.key) { case 'Down': case 'ArrowDown': this.focusNext(); event.preventDefault(); break; case 'Up': case 'ArrowUp': this.focusPrevious(); event.preventDefault(); break; case 'Esc': case 'Escape': case 'Tab': this.props.onClose(event, { source: 'keydown' }); break; default: } } handleRootClose(event) { this.props.onClose(event, { source: 'rootClose' }); } render() { const { open, pullRight, labelledBy, onSelect, className, rootCloseEvent, children, ...props } = this.props; const [bsProps, elementProps] = (0, _bootstrapUtils.splitBsPropsAndOmit)(props, ['onClose']); const classes = { ...(0, _bootstrapUtils.getClassSet)(bsProps), [(0, _bootstrapUtils.prefix)(bsProps, 'right')]: pullRight }; return /*#__PURE__*/(0, _jsxRuntime.jsx)(_RootCloseWrapper.default, { disabled: !open, onRootClose: this.handleRootClose, event: rootCloseEvent, children: /*#__PURE__*/(0, _jsxRuntime.jsx)("ul", { ...elementProps, role: "menu", className: (0, _classnames.default)(className, classes), "aria-labelledby": labelledBy, children: _ValidComponentChildren.default.map(children, child => /*#__PURE__*/_react.default.cloneElement(child, { onKeyDown: (0, _createChainedFunction.default)(child.props.onKeyDown, this.handleKeyDown), onSelect: (0, _createChainedFunction.default)(child.props.onSelect, onSelect) })) }) }); } } DropdownMenu.propTypes = propTypes; DropdownMenu.defaultProps = defaultProps; var _default = exports.default = (0, _bootstrapUtils.bsClass)('dropdown-menu', DropdownMenu); //# sourceMappingURL=DropdownMenu.js.map