UNPKG

rsuite

Version:

A suite of react components

198 lines (164 loc) 8.16 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = exports.dropdownMenuPropTypes = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _Spinner = _interopRequireDefault(require("@rsuite/icons/legacy/Spinner")); var _isUndefined = _interopRequireDefault(require("lodash/isUndefined")); var _isNil = _interopRequireDefault(require("lodash/isNil")); var _utils = require("../utils"); var _Picker = require("../Picker"); var _AngleLeft = _interopRequireDefault(require("@rsuite/icons/legacy/AngleLeft")); var _AngleRight = _interopRequireDefault(require("@rsuite/icons/legacy/AngleRight")); var _getPosition = _interopRequireDefault(require("dom-lib/getPosition")); var _scrollTop = _interopRequireDefault(require("dom-lib/scrollTop")); var emptyArray = []; var DropdownMenu = /*#__PURE__*/_react.default.forwardRef(function (props, ref) { var _props$as = props.as, Component = _props$as === void 0 ? 'div' : _props$as, activeItemValue = props.activeItemValue, classPrefix = props.classPrefix, className = props.className, _props$childrenKey = props.childrenKey, childrenKey = _props$childrenKey === void 0 ? 'children' : _props$childrenKey, _props$disabledItemVa = props.disabledItemValues, disabledItemValues = _props$disabledItemVa === void 0 ? emptyArray : _props$disabledItemVa, _props$menuWidth = props.menuWidth, menuWidth = _props$menuWidth === void 0 ? 120 : _props$menuWidth, _props$menuHeight = props.menuHeight, menuHeight = _props$menuHeight === void 0 ? 200 : _props$menuHeight, _props$valueKey = props.valueKey, valueKey = _props$valueKey === void 0 ? 'value' : _props$valueKey, _props$cascadeData = props.cascadeData, cascadeData = _props$cascadeData === void 0 ? emptyArray : _props$cascadeData, _props$cascadePaths = props.cascadePaths, cascadePaths = _props$cascadePaths === void 0 ? emptyArray : _props$cascadePaths, _props$labelKey = props.labelKey, labelKey = _props$labelKey === void 0 ? 'label' : _props$labelKey, renderMenu = props.renderMenu, renderMenuItem = props.renderMenuItem, onSelect = props.onSelect, rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["as", "activeItemValue", "classPrefix", "className", "childrenKey", "disabledItemValues", "menuWidth", "menuHeight", "valueKey", "cascadeData", "cascadePaths", "labelKey", "renderMenu", "renderMenuItem", "onSelect"]); var _useClassNames = (0, _utils.useClassNames)(classPrefix), merge = _useClassNames.merge, prefix = _useClassNames.prefix; var classes = merge(className, prefix('items')); var rootRef = (0, _react.useRef)(); var rtl = (0, _utils.useCustom)('DropdownMenu'); (0, _react.useEffect)(function () { var _rootRef$current; var columns = ((_rootRef$current = rootRef.current) === null || _rootRef$current === void 0 ? void 0 : _rootRef$current.querySelectorAll('[data-type="column"]')) || []; columns.forEach(function (column) { if (!column) { return; } var activeItem = column.querySelector("." + prefix('item-focus')); if (!activeItem) { activeItem = column.querySelector("." + prefix('item-active')); } if (activeItem) { var position = (0, _getPosition.default)(activeItem, column); // Let the active option scroll into view. (0, _scrollTop.default)(column, position === null || position === void 0 ? void 0 : position.top); } }); }, [prefix]); var getCascadePaths = (0, _react.useCallback)(function (layer, node) { var paths = []; for (var i = 0; i < cascadeData.length && i < layer; i += 1) { if (i < layer - 1 && cascadePaths) { paths.push(cascadePaths[i]); } } paths.push(node); return paths; }, [cascadeData, cascadePaths]); var handleSelect = function handleSelect(layer, node, event) { var isLeafNode = (0, _isNil.default)(node[childrenKey]); var cascadePaths = getCascadePaths(layer + 1, node); onSelect === null || onSelect === void 0 ? void 0 : onSelect(node, cascadePaths, isLeafNode, event); }; var renderCascadeNode = function renderCascadeNode(node, index, layer, focus) { var children = node[childrenKey]; var value = node[valueKey]; var label = node[labelKey]; var disabled = disabledItemValues.some(function (disabledValue) { return (0, _utils.shallowEqual)(disabledValue, value); }); // Use `value` in keys when If `value` is string or number var onlyKey = typeof value === 'number' || typeof value === 'string' ? value : index; var Icon = node.loading ? _Spinner.default : rtl ? _AngleRight.default : _AngleLeft.default; return /*#__PURE__*/_react.default.createElement(_Picker.DropdownMenuItem, { classPrefix: "picker-cascader-menu-item", as: 'li', role: "treeitem", key: layer + "-" + onlyKey, disabled: disabled, active: !(0, _isUndefined.default)(activeItemValue) && (0, _utils.shallowEqual)(activeItemValue, value), focus: focus, value: value, "aria-owns": node.children ? 'treeitem-' + value + '-children' : undefined, className: children ? prefix('has-children') : undefined, onSelect: function onSelect(_value, event) { return handleSelect(layer, node, event); } }, renderMenuItem ? renderMenuItem(label, node) : label, children ? /*#__PURE__*/_react.default.createElement(Icon, { className: prefix('caret'), spin: node.loading }) : null); }; var styles = { width: cascadeData.length * menuWidth }; var cascadeNodes = cascadeData.map(function (children, layer) { var onlyKey = layer + "_" + children.length; var parentNode = cascadePaths[layer - 1]; var menu = /*#__PURE__*/_react.default.createElement("ul", { role: layer === 0 ? 'none presentation' : 'group', id: parentNode ? 'treeitem-' + parentNode[valueKey] + '-children' : undefined }, children.map(function (item, index) { return renderCascadeNode(item, index, layer, cascadePaths[layer] && (0, _utils.shallowEqual)(cascadePaths[layer][valueKey], item[valueKey])); })); return /*#__PURE__*/_react.default.createElement("div", { key: onlyKey, className: prefix('column'), "data-layer": layer, "data-type": 'column', style: { height: menuHeight, width: menuWidth } }, renderMenu ? renderMenu(children, menu, parentNode, layer) : menu); }); return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({ role: "tree" }, rest, { ref: (0, _utils.mergeRefs)(rootRef, ref), className: classes }), /*#__PURE__*/_react.default.createElement("div", { style: styles }, cascadeNodes)); }); var dropdownMenuPropTypes = { classPrefix: _propTypes.default.string, disabledItemValues: _propTypes.default.array, activeItemValue: _propTypes.default.any, childrenKey: _propTypes.default.string, valueKey: _propTypes.default.string, labelKey: _propTypes.default.string, menuWidth: _propTypes.default.number, menuHeight: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]), className: _propTypes.default.string, renderMenuItem: _propTypes.default.func, renderMenu: _propTypes.default.func, onSelect: _propTypes.default.func, cascadeData: _propTypes.default.array, cascadePaths: _propTypes.default.array }; exports.dropdownMenuPropTypes = dropdownMenuPropTypes; DropdownMenu.displayName = 'DropdownMenu'; DropdownMenu.propTypes = dropdownMenuPropTypes; var _default = DropdownMenu; exports.default = _default;