123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490 |
- "use strict";
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
- var _typeof = require("@babel/runtime/helpers/typeof");
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
- var _classnames = _interopRequireDefault(require("classnames"));
- var _rcOverflow = _interopRequireDefault(require("rc-overflow"));
- var _useMergedState7 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
- var _isEqual = _interopRequireDefault(require("rc-util/lib/isEqual"));
- var _warning = _interopRequireDefault(require("rc-util/lib/warning"));
- var _react = _interopRequireWildcard(require("react"));
- var React = _react;
- var _reactDom = require("react-dom");
- var _IdContext = require("./context/IdContext");
- var _MenuContext = _interopRequireDefault(require("./context/MenuContext"));
- var _PathContext = require("./context/PathContext");
- var _PrivateContext = _interopRequireDefault(require("./context/PrivateContext"));
- var _useAccessibility = require("./hooks/useAccessibility");
- var _useKeyRecords2 = _interopRequireWildcard(require("./hooks/useKeyRecords"));
- var _useMemoCallback = _interopRequireDefault(require("./hooks/useMemoCallback"));
- var _useUUID = _interopRequireDefault(require("./hooks/useUUID"));
- var _MenuItem = _interopRequireDefault(require("./MenuItem"));
- var _SubMenu = _interopRequireDefault(require("./SubMenu"));
- var _nodeUtil = require("./utils/nodeUtil");
- var _warnUtil = require("./utils/warnUtil");
- var _excluded = ["prefixCls", "rootClassName", "style", "className", "tabIndex", "items", "children", "direction", "id", "mode", "inlineCollapsed", "disabled", "disabledOverflow", "subMenuOpenDelay", "subMenuCloseDelay", "forceSubMenuRender", "defaultOpenKeys", "openKeys", "activeKey", "defaultActiveFirst", "selectable", "multiple", "defaultSelectedKeys", "selectedKeys", "onSelect", "onDeselect", "inlineIndent", "motion", "defaultMotions", "triggerSubMenuAction", "builtinPlacements", "itemIcon", "expandIcon", "overflowedIndicator", "overflowedIndicatorPopupClassName", "getPopupContainer", "onClick", "onOpenChange", "onKeyDown", "openAnimation", "openTransitionName", "_internalRenderMenuItem", "_internalRenderSubMenuItem", "_internalComponents"];
- 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 && Object.prototype.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; }
- /**
- * Menu modify after refactor:
- * ## Add
- * - disabled
- *
- * ## Remove
- * - openTransitionName
- * - openAnimation
- * - onDestroy
- * - siderCollapsed: Seems antd do not use this prop (Need test in antd)
- * - collapsedWidth: Seems this logic should be handle by antd Layout.Sider
- */
- // optimize for render
- var EMPTY_LIST = [];
- var Menu = /*#__PURE__*/React.forwardRef(function (props, ref) {
- var _childList$;
- var _ref = props,
- _ref$prefixCls = _ref.prefixCls,
- prefixCls = _ref$prefixCls === void 0 ? 'rc-menu' : _ref$prefixCls,
- rootClassName = _ref.rootClassName,
- style = _ref.style,
- className = _ref.className,
- _ref$tabIndex = _ref.tabIndex,
- tabIndex = _ref$tabIndex === void 0 ? 0 : _ref$tabIndex,
- items = _ref.items,
- children = _ref.children,
- direction = _ref.direction,
- id = _ref.id,
- _ref$mode = _ref.mode,
- mode = _ref$mode === void 0 ? 'vertical' : _ref$mode,
- inlineCollapsed = _ref.inlineCollapsed,
- disabled = _ref.disabled,
- disabledOverflow = _ref.disabledOverflow,
- _ref$subMenuOpenDelay = _ref.subMenuOpenDelay,
- subMenuOpenDelay = _ref$subMenuOpenDelay === void 0 ? 0.1 : _ref$subMenuOpenDelay,
- _ref$subMenuCloseDela = _ref.subMenuCloseDelay,
- subMenuCloseDelay = _ref$subMenuCloseDela === void 0 ? 0.1 : _ref$subMenuCloseDela,
- forceSubMenuRender = _ref.forceSubMenuRender,
- defaultOpenKeys = _ref.defaultOpenKeys,
- openKeys = _ref.openKeys,
- activeKey = _ref.activeKey,
- defaultActiveFirst = _ref.defaultActiveFirst,
- _ref$selectable = _ref.selectable,
- selectable = _ref$selectable === void 0 ? true : _ref$selectable,
- _ref$multiple = _ref.multiple,
- multiple = _ref$multiple === void 0 ? false : _ref$multiple,
- defaultSelectedKeys = _ref.defaultSelectedKeys,
- selectedKeys = _ref.selectedKeys,
- onSelect = _ref.onSelect,
- onDeselect = _ref.onDeselect,
- _ref$inlineIndent = _ref.inlineIndent,
- inlineIndent = _ref$inlineIndent === void 0 ? 24 : _ref$inlineIndent,
- motion = _ref.motion,
- defaultMotions = _ref.defaultMotions,
- _ref$triggerSubMenuAc = _ref.triggerSubMenuAction,
- triggerSubMenuAction = _ref$triggerSubMenuAc === void 0 ? 'hover' : _ref$triggerSubMenuAc,
- builtinPlacements = _ref.builtinPlacements,
- itemIcon = _ref.itemIcon,
- expandIcon = _ref.expandIcon,
- _ref$overflowedIndica = _ref.overflowedIndicator,
- overflowedIndicator = _ref$overflowedIndica === void 0 ? '...' : _ref$overflowedIndica,
- overflowedIndicatorPopupClassName = _ref.overflowedIndicatorPopupClassName,
- getPopupContainer = _ref.getPopupContainer,
- onClick = _ref.onClick,
- onOpenChange = _ref.onOpenChange,
- onKeyDown = _ref.onKeyDown,
- openAnimation = _ref.openAnimation,
- openTransitionName = _ref.openTransitionName,
- _internalRenderMenuItem = _ref._internalRenderMenuItem,
- _internalRenderSubMenuItem = _ref._internalRenderSubMenuItem,
- _internalComponents = _ref._internalComponents,
- restProps = (0, _objectWithoutProperties2.default)(_ref, _excluded);
- var _React$useMemo = React.useMemo(function () {
- return [(0, _nodeUtil.parseItems)(children, items, EMPTY_LIST, _internalComponents, prefixCls), (0, _nodeUtil.parseItems)(children, items, EMPTY_LIST, {}, prefixCls)];
- }, [children, items, _internalComponents]),
- _React$useMemo2 = (0, _slicedToArray2.default)(_React$useMemo, 2),
- childList = _React$useMemo2[0],
- measureChildList = _React$useMemo2[1];
- var _React$useState = React.useState(false),
- _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
- mounted = _React$useState2[0],
- setMounted = _React$useState2[1];
- var containerRef = React.useRef();
- var uuid = (0, _useUUID.default)(id);
- var isRtl = direction === 'rtl';
- // ========================= Warn =========================
- if (process.env.NODE_ENV !== 'production') {
- (0, _warning.default)(!openAnimation && !openTransitionName, '`openAnimation` and `openTransitionName` is removed. Please use `motion` or `defaultMotion` instead.');
- }
- // ========================= Open =========================
- var _useMergedState = (0, _useMergedState7.default)(defaultOpenKeys, {
- value: openKeys,
- postState: function postState(keys) {
- return keys || EMPTY_LIST;
- }
- }),
- _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
- mergedOpenKeys = _useMergedState2[0],
- setMergedOpenKeys = _useMergedState2[1];
- // React 18 will merge mouse event which means we open key will not sync
- // ref: https://github.com/ant-design/ant-design/issues/38818
- var triggerOpenKeys = function triggerOpenKeys(keys) {
- var forceFlush = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- function doUpdate() {
- setMergedOpenKeys(keys);
- onOpenChange === null || onOpenChange === void 0 || onOpenChange(keys);
- }
- if (forceFlush) {
- (0, _reactDom.flushSync)(doUpdate);
- } else {
- doUpdate();
- }
- };
- // >>>>> Cache & Reset open keys when inlineCollapsed changed
- var _React$useState3 = React.useState(mergedOpenKeys),
- _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
- inlineCacheOpenKeys = _React$useState4[0],
- setInlineCacheOpenKeys = _React$useState4[1];
- var mountRef = React.useRef(false);
- // ========================= Mode =========================
- var _React$useMemo3 = React.useMemo(function () {
- if ((mode === 'inline' || mode === 'vertical') && inlineCollapsed) {
- return ['vertical', inlineCollapsed];
- }
- return [mode, false];
- }, [mode, inlineCollapsed]),
- _React$useMemo4 = (0, _slicedToArray2.default)(_React$useMemo3, 2),
- mergedMode = _React$useMemo4[0],
- mergedInlineCollapsed = _React$useMemo4[1];
- var isInlineMode = mergedMode === 'inline';
- var _React$useState5 = React.useState(mergedMode),
- _React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2),
- internalMode = _React$useState6[0],
- setInternalMode = _React$useState6[1];
- var _React$useState7 = React.useState(mergedInlineCollapsed),
- _React$useState8 = (0, _slicedToArray2.default)(_React$useState7, 2),
- internalInlineCollapsed = _React$useState8[0],
- setInternalInlineCollapsed = _React$useState8[1];
- React.useEffect(function () {
- setInternalMode(mergedMode);
- setInternalInlineCollapsed(mergedInlineCollapsed);
- if (!mountRef.current) {
- return;
- }
- // Synchronously update MergedOpenKeys
- if (isInlineMode) {
- setMergedOpenKeys(inlineCacheOpenKeys);
- } else {
- // Trigger open event in case its in control
- triggerOpenKeys(EMPTY_LIST);
- }
- }, [mergedMode, mergedInlineCollapsed]);
- // ====================== Responsive ======================
- var _React$useState9 = React.useState(0),
- _React$useState10 = (0, _slicedToArray2.default)(_React$useState9, 2),
- lastVisibleIndex = _React$useState10[0],
- setLastVisibleIndex = _React$useState10[1];
- var allVisible = lastVisibleIndex >= childList.length - 1 || internalMode !== 'horizontal' || disabledOverflow;
- // Cache
- React.useEffect(function () {
- if (isInlineMode) {
- setInlineCacheOpenKeys(mergedOpenKeys);
- }
- }, [mergedOpenKeys]);
- React.useEffect(function () {
- mountRef.current = true;
- return function () {
- mountRef.current = false;
- };
- }, []);
- // ========================= Path =========================
- var _useKeyRecords = (0, _useKeyRecords2.default)(),
- registerPath = _useKeyRecords.registerPath,
- unregisterPath = _useKeyRecords.unregisterPath,
- refreshOverflowKeys = _useKeyRecords.refreshOverflowKeys,
- isSubPathKey = _useKeyRecords.isSubPathKey,
- getKeyPath = _useKeyRecords.getKeyPath,
- getKeys = _useKeyRecords.getKeys,
- getSubPathKeys = _useKeyRecords.getSubPathKeys;
- var registerPathContext = React.useMemo(function () {
- return {
- registerPath: registerPath,
- unregisterPath: unregisterPath
- };
- }, [registerPath, unregisterPath]);
- var pathUserContext = React.useMemo(function () {
- return {
- isSubPathKey: isSubPathKey
- };
- }, [isSubPathKey]);
- React.useEffect(function () {
- refreshOverflowKeys(allVisible ? EMPTY_LIST : childList.slice(lastVisibleIndex + 1).map(function (child) {
- return child.key;
- }));
- }, [lastVisibleIndex, allVisible]);
- // ======================== Active ========================
- var _useMergedState3 = (0, _useMergedState7.default)(activeKey || defaultActiveFirst && ((_childList$ = childList[0]) === null || _childList$ === void 0 ? void 0 : _childList$.key), {
- value: activeKey
- }),
- _useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2),
- mergedActiveKey = _useMergedState4[0],
- setMergedActiveKey = _useMergedState4[1];
- var onActive = (0, _useMemoCallback.default)(function (key) {
- setMergedActiveKey(key);
- });
- var onInactive = (0, _useMemoCallback.default)(function () {
- setMergedActiveKey(undefined);
- });
- (0, _react.useImperativeHandle)(ref, function () {
- return {
- list: containerRef.current,
- focus: function focus(options) {
- var _childList$find;
- var keys = getKeys();
- var _refreshElements = (0, _useAccessibility.refreshElements)(keys, uuid),
- elements = _refreshElements.elements,
- key2element = _refreshElements.key2element,
- element2key = _refreshElements.element2key;
- var focusableElements = (0, _useAccessibility.getFocusableElements)(containerRef.current, elements);
- var shouldFocusKey = mergedActiveKey !== null && mergedActiveKey !== void 0 ? mergedActiveKey : focusableElements[0] ? element2key.get(focusableElements[0]) : (_childList$find = childList.find(function (node) {
- return !node.props.disabled;
- })) === null || _childList$find === void 0 ? void 0 : _childList$find.key;
- var elementToFocus = key2element.get(shouldFocusKey);
- if (shouldFocusKey && elementToFocus) {
- var _elementToFocus$focus;
- elementToFocus === null || elementToFocus === void 0 || (_elementToFocus$focus = elementToFocus.focus) === null || _elementToFocus$focus === void 0 || _elementToFocus$focus.call(elementToFocus, options);
- }
- }
- };
- });
- // ======================== Select ========================
- // >>>>> Select keys
- var _useMergedState5 = (0, _useMergedState7.default)(defaultSelectedKeys || [], {
- value: selectedKeys,
- // Legacy convert key to array
- postState: function postState(keys) {
- if (Array.isArray(keys)) {
- return keys;
- }
- if (keys === null || keys === undefined) {
- return EMPTY_LIST;
- }
- return [keys];
- }
- }),
- _useMergedState6 = (0, _slicedToArray2.default)(_useMergedState5, 2),
- mergedSelectKeys = _useMergedState6[0],
- setMergedSelectKeys = _useMergedState6[1];
- // >>>>> Trigger select
- var triggerSelection = function triggerSelection(info) {
- if (selectable) {
- // Insert or Remove
- var targetKey = info.key;
- var exist = mergedSelectKeys.includes(targetKey);
- var newSelectKeys;
- if (multiple) {
- if (exist) {
- newSelectKeys = mergedSelectKeys.filter(function (key) {
- return key !== targetKey;
- });
- } else {
- newSelectKeys = [].concat((0, _toConsumableArray2.default)(mergedSelectKeys), [targetKey]);
- }
- } else {
- newSelectKeys = [targetKey];
- }
- setMergedSelectKeys(newSelectKeys);
- // Trigger event
- var selectInfo = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, info), {}, {
- selectedKeys: newSelectKeys
- });
- if (exist) {
- onDeselect === null || onDeselect === void 0 || onDeselect(selectInfo);
- } else {
- onSelect === null || onSelect === void 0 || onSelect(selectInfo);
- }
- }
- // Whatever selectable, always close it
- if (!multiple && mergedOpenKeys.length && internalMode !== 'inline') {
- triggerOpenKeys(EMPTY_LIST);
- }
- };
- // ========================= Open =========================
- /**
- * Click for item. SubMenu do not have selection status
- */
- var onInternalClick = (0, _useMemoCallback.default)(function (info) {
- onClick === null || onClick === void 0 || onClick((0, _warnUtil.warnItemProp)(info));
- triggerSelection(info);
- });
- var onInternalOpenChange = (0, _useMemoCallback.default)(function (key, open) {
- var newOpenKeys = mergedOpenKeys.filter(function (k) {
- return k !== key;
- });
- if (open) {
- newOpenKeys.push(key);
- } else if (internalMode !== 'inline') {
- // We need find all related popup to close
- var subPathKeys = getSubPathKeys(key);
- newOpenKeys = newOpenKeys.filter(function (k) {
- return !subPathKeys.has(k);
- });
- }
- if (!(0, _isEqual.default)(mergedOpenKeys, newOpenKeys, true)) {
- triggerOpenKeys(newOpenKeys, true);
- }
- });
- // ==================== Accessibility =====================
- var triggerAccessibilityOpen = function triggerAccessibilityOpen(key, open) {
- var nextOpen = open !== null && open !== void 0 ? open : !mergedOpenKeys.includes(key);
- onInternalOpenChange(key, nextOpen);
- };
- var onInternalKeyDown = (0, _useAccessibility.useAccessibility)(internalMode, mergedActiveKey, isRtl, uuid, containerRef, getKeys, getKeyPath, setMergedActiveKey, triggerAccessibilityOpen, onKeyDown);
- // ======================== Effect ========================
- React.useEffect(function () {
- setMounted(true);
- }, []);
- // ======================= Context ========================
- var privateContext = React.useMemo(function () {
- return {
- _internalRenderMenuItem: _internalRenderMenuItem,
- _internalRenderSubMenuItem: _internalRenderSubMenuItem
- };
- }, [_internalRenderMenuItem, _internalRenderSubMenuItem]);
- // ======================== Render ========================
- // >>>>> Children
- var wrappedChildList = internalMode !== 'horizontal' || disabledOverflow ? childList :
- // Need wrap for overflow dropdown that do not response for open
- childList.map(function (child, index) {
- return (
- /*#__PURE__*/
- // Always wrap provider to avoid sub node re-mount
- React.createElement(_MenuContext.default, {
- key: child.key,
- overflowDisabled: index > lastVisibleIndex
- }, child)
- );
- });
- // >>>>> Container
- var container = /*#__PURE__*/React.createElement(_rcOverflow.default, (0, _extends2.default)({
- id: id,
- ref: containerRef,
- prefixCls: "".concat(prefixCls, "-overflow"),
- component: "ul",
- itemComponent: _MenuItem.default,
- className: (0, _classnames.default)(prefixCls, "".concat(prefixCls, "-root"), "".concat(prefixCls, "-").concat(internalMode), className, (0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(prefixCls, "-inline-collapsed"), internalInlineCollapsed), "".concat(prefixCls, "-rtl"), isRtl), rootClassName),
- dir: direction,
- style: style,
- role: "menu",
- tabIndex: tabIndex,
- data: wrappedChildList,
- renderRawItem: function renderRawItem(node) {
- return node;
- },
- renderRawRest: function renderRawRest(omitItems) {
- // We use origin list since wrapped list use context to prevent open
- var len = omitItems.length;
- var originOmitItems = len ? childList.slice(-len) : null;
- return /*#__PURE__*/React.createElement(_SubMenu.default, {
- eventKey: _useKeyRecords2.OVERFLOW_KEY,
- title: overflowedIndicator,
- disabled: allVisible,
- internalPopupClose: len === 0,
- popupClassName: overflowedIndicatorPopupClassName
- }, originOmitItems);
- },
- maxCount: internalMode !== 'horizontal' || disabledOverflow ? _rcOverflow.default.INVALIDATE : _rcOverflow.default.RESPONSIVE,
- ssr: "full",
- "data-menu-list": true,
- onVisibleChange: function onVisibleChange(newLastIndex) {
- setLastVisibleIndex(newLastIndex);
- },
- onKeyDown: onInternalKeyDown
- }, restProps));
- // >>>>> Render
- return /*#__PURE__*/React.createElement(_PrivateContext.default.Provider, {
- value: privateContext
- }, /*#__PURE__*/React.createElement(_IdContext.IdContext.Provider, {
- value: uuid
- }, /*#__PURE__*/React.createElement(_MenuContext.default, {
- prefixCls: prefixCls,
- rootClassName: rootClassName,
- mode: internalMode,
- openKeys: mergedOpenKeys,
- rtl: isRtl
- // Disabled
- ,
- disabled: disabled
- // Motion
- ,
- motion: mounted ? motion : null,
- defaultMotions: mounted ? defaultMotions : null
- // Active
- ,
- activeKey: mergedActiveKey,
- onActive: onActive,
- onInactive: onInactive
- // Selection
- ,
- selectedKeys: mergedSelectKeys
- // Level
- ,
- inlineIndent: inlineIndent
- // Popup
- ,
- subMenuOpenDelay: subMenuOpenDelay,
- subMenuCloseDelay: subMenuCloseDelay,
- forceSubMenuRender: forceSubMenuRender,
- builtinPlacements: builtinPlacements,
- triggerSubMenuAction: triggerSubMenuAction,
- getPopupContainer: getPopupContainer
- // Icon
- ,
- itemIcon: itemIcon,
- expandIcon: expandIcon
- // Events
- ,
- onItemClick: onInternalClick,
- onOpenChange: onInternalOpenChange
- }, /*#__PURE__*/React.createElement(_PathContext.PathUserContext.Provider, {
- value: pathUserContext
- }, container), /*#__PURE__*/React.createElement("div", {
- style: {
- display: 'none'
- },
- "aria-hidden": true
- }, /*#__PURE__*/React.createElement(_PathContext.PathRegisterContext.Provider, {
- value: registerPathContext
- }, measureChildList)))));
- });
- var _default = exports.default = Menu;
|