UNPKG

@react-md/menu

Version:

Create menus that auto-position themselves within the viewport and adhere to the accessibility guidelines

144 lines 7.16 kB
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, { forwardRef } from "react"; import { IconRotator, useIcon } from "@react-md/icon"; import { BELOW_INNER_RIGHT_ANCHOR, TOP_RIGHT_ANCHOR } from "@react-md/utils"; import { defaultMenuItemRenderer } from "./defaultMenuItemRenderer"; import { defaultMenuRenderer } from "./defaultMenuRenderer"; import { MenuItem } from "./MenuItem"; import { useItemVisibility } from "./useItemVisibility"; /** * The `DropdownMenuItem` component is used to be able to render nested dropdown menus. */ export var DropdownMenuItem = forwardRef(function DropdownMenuItem(_a, ref) { var propOnClick = _a.onClick, propOnKeyDown = _a.onKeyDown, children = _a.children, propAnchor = _a.anchor, menuLabel = _a.menuLabel, menuLabelledBy = _a.menuLabelledBy, _b = _a.menuRenderer, menuRenderer = _b === void 0 ? defaultMenuRenderer : _b, items = _a.items, _c = _a.itemRenderer, itemRenderer = _c === void 0 ? defaultMenuItemRenderer : _c, horizontal = _a.horizontal, onVisibilityChange = _a.onVisibilityChange, _d = _a.portal, portal = _d === void 0 ? true : _d, portalInto = _a.portalInto, portalIntoId = _a.portalIntoId, positionOptions = _a.positionOptions, propRightAddon = _a.rightAddon, propDropdownIcon = _a.dropdownIcon, _e = _a.closeOnScroll, closeOnScroll = _e === void 0 ? false : _e, _f = _a.closeOnResize, closeOnResize = _f === void 0 ? false : _f, _g = _a.disableEscapeCascade, disableEscapeCascade = _g === void 0 ? false : _g, _h = _a.disableDropdownIcon, disableDropdownIcon = _h === void 0 ? false : _h, props = __rest(_a, ["onClick", "onKeyDown", "children", "anchor", "menuLabel", "menuLabelledBy", "menuRenderer", "items", "itemRenderer", "horizontal", "onVisibilityChange", "portal", "portalInto", "portalIntoId", "positionOptions", "rightAddon", "dropdownIcon", "closeOnScroll", "closeOnResize", "disableEscapeCascade", "disableDropdownIcon"]); var id = props.id; var dropdownIcon = useIcon("forward", propDropdownIcon); var _j = useItemVisibility({ onClick: propOnClick, onKeyDown: propOnKeyDown, onVisibilityChange: onVisibilityChange, }), visible = _j.visible, hide = _j.hide, onClick = _j.onClick, onKeyDown = _j.onKeyDown, defaultFocus = _j.defaultFocus; var labelledBy = menuLabelledBy; if (!menuLabel && !menuLabelledBy) { labelledBy = id; } var rightAddon = propRightAddon; if (!disableDropdownIcon && dropdownIcon && !rightAddon) { rightAddon = React.createElement(IconRotator, { rotated: visible }, dropdownIcon); } var anchor = propAnchor; if (!anchor) { anchor = horizontal ? BELOW_INNER_RIGHT_ANCHOR : TOP_RIGHT_ANCHOR; } return (React.createElement(React.Fragment, null, React.createElement(MenuItem, __assign({}, props, { ref: ref, "aria-haspopup": "menu", "aria-expanded": visible ? "true" : undefined, role: "button", onClick: onClick, onKeyDown: onKeyDown, rightAddon: rightAddon }), children), menuRenderer({ "aria-label": menuLabel, // ok to typecast since one of these two should be a string by this // line "aria-labelledby": labelledBy, id: id + "-menu", controlId: id, anchor: anchor, positionOptions: positionOptions, closeOnScroll: closeOnScroll, closeOnResize: closeOnResize, horizontal: horizontal, visible: visible, defaultFocus: defaultFocus, onRequestClose: hide, children: items.map(function (item, i) { return itemRenderer(item, "item-" + i); }), portal: portal, portalInto: portalInto, portalIntoId: portalIntoId, onKeyDown: function (event) { if (event.key !== "Escape" || disableEscapeCascade) { // don't want parent keydown listeners to be triggered as well event.stopPropagation(); } if (!horizontal && event.key === "ArrowLeft") { hide(); } }, }, items))); }); if (process.env.NODE_ENV !== "production") { try { var PropTypes = require("prop-types"); DropdownMenuItem.propTypes = { id: PropTypes.string.isRequired, className: PropTypes.string, portal: PropTypes.bool, portalInto: PropTypes.oneOfType([ PropTypes.string, PropTypes.func, PropTypes.object, ]), portalIntoId: PropTypes.string, onClick: PropTypes.func, onKeyDown: PropTypes.func, children: PropTypes.node, anchor: PropTypes.shape({ x: PropTypes.oneOf([ "left", "right", "center", "inner-left", "inner-right", ]).isRequired, y: PropTypes.oneOf(["above", "below", "center", "top", "bottom"]) .isRequired, }), items: PropTypes.arrayOf(PropTypes.oneOfType([ PropTypes.string, PropTypes.number, PropTypes.node, PropTypes.object, ])).isRequired, menuLabel: PropTypes.string, menuLabelledBy: PropTypes.string, menuRenderer: PropTypes.func, itemRenderer: PropTypes.func, dropdownIcon: PropTypes.node, horizontal: PropTypes.bool, positionOptions: PropTypes.shape({ vwMargin: PropTypes.number, vhMargin: PropTypes.number, xMargin: PropTypes.number, yMargin: PropTypes.number, initialX: PropTypes.number, initialY: PropTypes.number, disableSwapping: PropTypes.bool, }), rightAddon: PropTypes.node, onVisibilityChange: PropTypes.func, disableDropdownIcon: PropTypes.bool, disableEscapeCascade: PropTypes.bool, closeOnScroll: PropTypes.bool, closeOnResize: PropTypes.bool, }; } catch (e) { } } //# sourceMappingURL=DropdownMenuItem.js.map