UNPKG

@clayui/drop-down

Version:
250 lines (249 loc) 13.2 kB
"use strict"; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _core = require("@clayui/core"); var _icon = _interopRequireDefault(require("@clayui/icon")); var _shared = require("@clayui/shared"); var _classnames = _interopRequireDefault(require("classnames")); var _react = _interopRequireWildcard(require("react")); var _Action = _interopRequireDefault(require("./Action")); var _Caption = _interopRequireDefault(require("./Caption")); var _Divider = _interopRequireDefault(require("./Divider")); var _DropDownContext = require("./DropDownContext"); var _FocusMenu = require("./FocusMenu"); var _Group = _interopRequireDefault(require("./Group")); var _Help = _interopRequireDefault(require("./Help")); var _Item = _interopRequireDefault(require("./Item")); var _ItemList = _interopRequireDefault(require("./ItemList")); var _Menu = _interopRequireDefault(require("./Menu")); var _Search = _interopRequireDefault(require("./Search")); var _Section = _interopRequireDefault(require("./Section")); var _excluded = ["children"], _excluded2 = ["active", "alignmentByViewport", "alignmentPosition", "children", "className", "closeOnClick", "closeOnClickOutside", "containerElement", "defaultActive", "filterKey", "hasLeftSymbols", "hasRightSymbols", "items", "menuElementAttrs", "menuHeight", "menuWidth", "offsetFn", "onActiveChange", "renderMenuOnClick", "role", "trigger", "triggerIcon"]; /** * SPDX-FileCopyrightText: © 2019 Liferay, Inc. <https://liferay.com> * SPDX-License-Identifier: BSD-3-Clause */ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) { if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } } return n.default = e, t && t.set(e, n), n; } function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) { n[e] = r[e]; } return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0) { ; } } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) { ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } } return n; }, _extends.apply(null, arguments); } function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var s = Object.getOwnPropertySymbols(e); for (r = 0; r < s.length; r++) { o = s[r], t.includes(o) || {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } } return i; } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) { if ({}.hasOwnProperty.call(r, n)) { if (e.includes(n)) continue; t[n] = r[n]; } } return t; } var Collection = _core.__NOT_PUBLIC_COLLECTION.Collection; var List = /*#__PURE__*/_react.default.forwardRef(function List(_ref, ref) { var children = _ref.children, otherProps = _objectWithoutProperties(_ref, _excluded); return /*#__PURE__*/_react.default.createElement("ul", _extends({}, otherProps, { className: "list-unstyled", ref: ref }), children); }); var counter = 0; function DropDown(_ref2) { var active = _ref2.active, alignmentByViewport = _ref2.alignmentByViewport, alignmentPosition = _ref2.alignmentPosition, children = _ref2.children, className = _ref2.className, _ref2$closeOnClick = _ref2.closeOnClick, closeOnClick = _ref2$closeOnClick === void 0 ? false : _ref2$closeOnClick, closeOnClickOutside = _ref2.closeOnClickOutside, _ref2$containerElemen = _ref2.containerElement, ContainerElement = _ref2$containerElemen === void 0 ? 'div' : _ref2$containerElemen, _ref2$defaultActive = _ref2.defaultActive, defaultActive = _ref2$defaultActive === void 0 ? false : _ref2$defaultActive, filterKey = _ref2.filterKey, hasLeftSymbols = _ref2.hasLeftSymbols, hasRightSymbols = _ref2.hasRightSymbols, items = _ref2.items, menuElementAttrs = _ref2.menuElementAttrs, menuHeight = _ref2.menuHeight, menuWidth = _ref2.menuWidth, offsetFn = _ref2.offsetFn, onActiveChange = _ref2.onActiveChange, _ref2$renderMenuOnCli = _ref2.renderMenuOnClick, renderMenuOnClick = _ref2$renderMenuOnCli === void 0 ? false : _ref2$renderMenuOnCli, _ref2$role = _ref2.role, role = _ref2$role === void 0 ? 'menu' : _ref2$role, trigger = _ref2.trigger, _ref2$triggerIcon = _ref2.triggerIcon, triggerIcon = _ref2$triggerIcon === void 0 ? null : _ref2$triggerIcon, otherProps = _objectWithoutProperties(_ref2, _excluded2); var triggerElementRef = (0, _react.useRef)(null); var menuElementRef = (0, _react.useRef)(null); var _useState = (0, _react.useState)(!renderMenuOnClick), _useState2 = _slicedToArray(_useState, 2), initialized = _useState2[0], setInitialized = _useState2[1]; var _useControlledState = (0, _shared.useControlledState)({ defaultName: 'defaultActive', defaultValue: defaultActive, handleName: 'onActiveChange', name: 'active', onChange: onActiveChange, value: active }), _useControlledState2 = _slicedToArray(_useControlledState, 2), internalActive = _useControlledState2[0], setInternalActive = _useControlledState2[1]; var _useState3 = (0, _react.useState)(''), _useState4 = _slicedToArray(_useState3, 2), search = _useState4[0], setSearch = _useState4[1]; var ariaControls = (0, _react.useMemo)(function () { counter++; return "clay-dropdown-menu-".concat(counter); }, []); var openMenu = (0, _react.useCallback)(function (value) { if (!initialized) { setInitialized(true); } setInternalActive(value); }, [initialized]); var _useNavigation = (0, _shared.useNavigation)({ activation: 'manual', containerRef: menuElementRef, loop: true, orientation: 'vertical', typeahead: true, visible: internalActive }), navigationProps = _useNavigation.navigationProps; return /*#__PURE__*/_react.default.createElement(ContainerElement, _extends({}, otherProps, { className: (0, _classnames.default)('dropdown', className) }), /*#__PURE__*/_react.default.cloneElement(trigger, { 'aria-controls': ariaControls, 'aria-expanded': internalActive, 'aria-haspopup': 'true', children: /*#__PURE__*/_react.default.isValidElement(trigger) && // @ts-ignore (trigger === null || trigger === void 0 ? void 0 : trigger.type.displayName) === 'ClayButton' && triggerIcon ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, trigger.props.children, ' ', /*#__PURE__*/_react.default.createElement(_icon.default, { className: "ml-1", symbol: triggerIcon })) : trigger.props.children, className: (0, _classnames.default)('dropdown-toggle', trigger.props.className), onClick: function onClick(event) { if (trigger.props.onClick) { trigger.props.onClick(event); } openMenu(!internalActive); }, onKeyDown: function onKeyDown(event) { if (trigger.props.onKeyDown) { trigger.props.onKeyDown(event); } if (event.key === _shared.Keys.Spacebar) { openMenu(!internalActive); } if (event.key === _shared.Keys.Down) { event.preventDefault(); event.stopPropagation(); openMenu(true); } if (internalActive && event.key === _shared.Keys.Down) { event.preventDefault(); event.stopPropagation(); var list = (0, _shared.getFocusableList)(menuElementRef); if (list.length) { list[0].focus(); } } if ([_shared.Keys.Spacebar, _shared.Keys.Down].includes(event.key)) { event.preventDefault(); } }, ref: function ref(node) { triggerElementRef.current = node; // Call the original ref, if any. var ref = trigger.ref; if (typeof ref === 'function') { ref(node); } } }), initialized && /*#__PURE__*/_react.default.createElement(_Menu.default, _extends({}, menuElementAttrs, { active: internalActive, alignElementRef: triggerElementRef, alignmentByViewport: alignmentByViewport, alignmentPosition: alignmentPosition, closeOnClickOutside: closeOnClickOutside, hasLeftSymbols: hasLeftSymbols, hasRightSymbols: hasRightSymbols, height: menuHeight, id: ariaControls, offsetFn: offsetFn, onActiveChange: setInternalActive, onKeyDown: function onKeyDown(event) { if (menuElementAttrs !== null && menuElementAttrs !== void 0 && menuElementAttrs.onKeyDown) { menuElementAttrs.onKeyDown(event); } if (event.key === _shared.Keys.Tab) { event.preventDefault(); openMenu(false); var list = Array.from(document.querySelectorAll(_shared.FOCUSABLE_ELEMENTS.join(','))); var position = list.indexOf(triggerElementRef.current); var nextElement = list[position + 1]; if (nextElement) { nextElement.focus(); } } navigationProps.onKeyDown(event); }, ref: menuElementRef, suppress: [triggerElementRef, menuElementRef], triggerRef: triggerElementRef, width: menuWidth }), /*#__PURE__*/_react.default.createElement(_FocusMenu.FocusMenu, { condition: internalActive, onRender: function onRender() { // After a few milliseconds querying the elements in the DOM // inside the menu. This especially when the menu is not // rendered yet only after the menu is opened, React needs // to commit the changes to the DOM so that the elements are // visible and we can move the focus. setTimeout(function () { var list = (0, _shared.getFocusableList)(menuElementRef); if (list.length) { list[0].focus(); } }, 10); } }, /*#__PURE__*/_react.default.createElement(_DropDownContext.DropDownContext.Provider, { value: { close: function close() { var _triggerElementRef$cu; setInternalActive(false); (_triggerElementRef$cu = triggerElementRef.current) === null || _triggerElementRef$cu === void 0 ? void 0 : _triggerElementRef$cu.focus(); }, closeOnClick: closeOnClick, filterKey: filterKey, onSearch: setSearch, search: search, tabFocus: false } }, children instanceof Function ? /*#__PURE__*/_react.default.createElement(Collection, { as: List, items: items, role: role }, children) : children)))); } DropDown.Action = _Action.default; DropDown.Caption = _Caption.default; DropDown.Divider = _Divider.default; DropDown.Group = _Group.default; DropDown.Help = _Help.default; DropDown.Menu = _Menu.default; DropDown.Item = _Item.default; DropDown.ItemList = _ItemList.default; DropDown.Search = _Search.default; DropDown.Section = _Section.default; var _default = exports.default = DropDown;