UNPKG

@wordpress/components

Version:
189 lines (156 loc) 5.58 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _element = require("@wordpress/element"); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classnames = _interopRequireDefault(require("classnames")); var _lodash = require("lodash"); var _keycodes = require("@wordpress/keycodes"); var _deprecated = _interopRequireDefault(require("@wordpress/deprecated")); var _icons = require("@wordpress/icons"); var _button = _interopRequireDefault(require("../button")); var _toolbarButton = _interopRequireDefault(require("../toolbar-button")); var _dropdown = _interopRequireDefault(require("../dropdown")); var _navigableContainer = require("../navigable-container"); /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function mergeProps(defaultProps = {}, props = {}) { const mergedProps = { ...defaultProps, ...props }; if (props.className && defaultProps.className) { mergedProps.className = (0, _classnames.default)(props.className, defaultProps.className); } return mergedProps; } function DropdownMenu({ children, className, controls, icon = _icons.menu, label, popoverProps, toggleProps, menuProps, disableOpenOnArrowDown = false, text, // The following props exist for backward compatibility. menuLabel, position, noIcons, isToolbarButton = false }) { if (menuLabel) { (0, _deprecated.default)('`menuLabel` prop in `DropdownComponent`', { since: '5.3', alternative: '`menuProps` object and its `aria-label` property' }); } if (position) { (0, _deprecated.default)('`position` prop in `DropdownComponent`', { since: '5.3', alternative: '`popoverProps` object and its `position` property' }); } if ((0, _lodash.isEmpty)(controls) && !(0, _lodash.isFunction)(children)) { return null; } // Normalize controls to nested array of objects (sets of controls) let controlSets; if (!(0, _lodash.isEmpty)(controls)) { controlSets = controls; if (!Array.isArray(controlSets[0])) { controlSets = [controlSets]; } } const mergedPopoverProps = mergeProps({ className: 'components-dropdown-menu__popover', position }, popoverProps); const ButtonComponent = isToolbarButton ? _toolbarButton.default : _button.default; return (0, _element.createElement)(_dropdown.default, { className: (0, _classnames.default)('components-dropdown-menu', className), popoverProps: mergedPopoverProps, renderToggle: ({ isOpen, onToggle }) => { var _toggleProps$showTool; const openOnArrowDown = event => { if (disableOpenOnArrowDown) { return; } if (!isOpen && event.keyCode === _keycodes.DOWN) { event.preventDefault(); event.stopPropagation(); onToggle(); } }; const mergedToggleProps = mergeProps({ className: (0, _classnames.default)('components-dropdown-menu__toggle', { 'is-opened': isOpen }) }, toggleProps); return (0, _element.createElement)(ButtonComponent, (0, _extends2.default)({}, mergedToggleProps, { icon: icon, onClick: event => { onToggle(event); if (mergedToggleProps.onClick) { mergedToggleProps.onClick(event); } }, onKeyDown: event => { openOnArrowDown(event); if (mergedToggleProps.onKeyDown) { mergedToggleProps.onKeyDown(event); } }, "aria-haspopup": "true", "aria-expanded": isOpen, label: label, text: text, showTooltip: (_toggleProps$showTool = toggleProps === null || toggleProps === void 0 ? void 0 : toggleProps.showTooltip) !== null && _toggleProps$showTool !== void 0 ? _toggleProps$showTool : true }), mergedToggleProps.children); }, renderContent: props => { const mergedMenuProps = mergeProps({ 'aria-label': menuLabel || label, className: (0, _classnames.default)('components-dropdown-menu__menu', { 'no-icons': noIcons }) }, menuProps); return (0, _element.createElement)(_navigableContainer.NavigableMenu, (0, _extends2.default)({}, mergedMenuProps, { role: "menu" }), (0, _lodash.isFunction)(children) ? children(props) : null, (0, _lodash.flatMap)(controlSets, (controlSet, indexOfSet) => controlSet.map((control, indexOfControl) => (0, _element.createElement)(_button.default, { key: [indexOfSet, indexOfControl].join(), onClick: event => { event.stopPropagation(); props.onClose(); if (control.onClick) { control.onClick(); } }, className: (0, _classnames.default)('components-dropdown-menu__menu-item', { 'has-separator': indexOfSet > 0 && indexOfControl === 0, 'is-active': control.isActive }), icon: control.icon, "aria-checked": control.role === 'menuitemcheckbox' || control.role === 'menuitemradio' ? control.isActive : undefined, role: control.role === 'menuitemcheckbox' || control.role === 'menuitemradio' ? control.role : 'menuitem', disabled: control.isDisabled }, control.title)))); } }); } var _default = DropdownMenu; exports.default = _default; //# sourceMappingURL=index.js.map