You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
InternshipProject/node_modules/rc-menu/lib/Menu.js

455 lines
18 KiB

"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
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 React = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _shallowequal = _interopRequireDefault(require("shallowequal"));
var _useMergedState7 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
var _warning = _interopRequireDefault(require("rc-util/lib/warning"));
var _rcOverflow = _interopRequireDefault(require("rc-overflow"));
var _MenuItem = _interopRequireDefault(require("./MenuItem"));
var _nodeUtil = require("./utils/nodeUtil");
var _MenuContext = _interopRequireDefault(require("./context/MenuContext"));
var _useMemoCallback = _interopRequireDefault(require("./hooks/useMemoCallback"));
var _warnUtil = require("./utils/warnUtil");
var _SubMenu = _interopRequireDefault(require("./SubMenu"));
var _useAccessibility = _interopRequireDefault(require("./hooks/useAccessibility"));
var _useUUID = _interopRequireDefault(require("./hooks/useUUID"));
var _PathContext = require("./context/PathContext");
var _useKeyRecords2 = _interopRequireWildcard(require("./hooks/useKeyRecords"));
var _IdContext = require("./context/IdContext");
var _PrivateContext = _interopRequireDefault(require("./context/PrivateContext"));
var _excluded = ["prefixCls", "style", "className", "tabIndex", "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"];
/**
* 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 = function Menu(props) {
var _childList$, _classNames;
var _props$prefixCls = props.prefixCls,
prefixCls = _props$prefixCls === void 0 ? 'rc-menu' : _props$prefixCls,
style = props.style,
className = props.className,
_props$tabIndex = props.tabIndex,
tabIndex = _props$tabIndex === void 0 ? 0 : _props$tabIndex,
children = props.children,
direction = props.direction,
id = props.id,
_props$mode = props.mode,
mode = _props$mode === void 0 ? 'vertical' : _props$mode,
inlineCollapsed = props.inlineCollapsed,
disabled = props.disabled,
disabledOverflow = props.disabledOverflow,
_props$subMenuOpenDel = props.subMenuOpenDelay,
subMenuOpenDelay = _props$subMenuOpenDel === void 0 ? 0.1 : _props$subMenuOpenDel,
_props$subMenuCloseDe = props.subMenuCloseDelay,
subMenuCloseDelay = _props$subMenuCloseDe === void 0 ? 0.1 : _props$subMenuCloseDe,
forceSubMenuRender = props.forceSubMenuRender,
defaultOpenKeys = props.defaultOpenKeys,
openKeys = props.openKeys,
activeKey = props.activeKey,
defaultActiveFirst = props.defaultActiveFirst,
_props$selectable = props.selectable,
selectable = _props$selectable === void 0 ? true : _props$selectable,
_props$multiple = props.multiple,
multiple = _props$multiple === void 0 ? false : _props$multiple,
defaultSelectedKeys = props.defaultSelectedKeys,
selectedKeys = props.selectedKeys,
onSelect = props.onSelect,
onDeselect = props.onDeselect,
_props$inlineIndent = props.inlineIndent,
inlineIndent = _props$inlineIndent === void 0 ? 24 : _props$inlineIndent,
motion = props.motion,
defaultMotions = props.defaultMotions,
_props$triggerSubMenu = props.triggerSubMenuAction,
triggerSubMenuAction = _props$triggerSubMenu === void 0 ? 'hover' : _props$triggerSubMenu,
builtinPlacements = props.builtinPlacements,
itemIcon = props.itemIcon,
expandIcon = props.expandIcon,
_props$overflowedIndi = props.overflowedIndicator,
overflowedIndicator = _props$overflowedIndi === void 0 ? '...' : _props$overflowedIndi,
overflowedIndicatorPopupClassName = props.overflowedIndicatorPopupClassName,
getPopupContainer = props.getPopupContainer,
onClick = props.onClick,
onOpenChange = props.onOpenChange,
onKeyDown = props.onKeyDown,
openAnimation = props.openAnimation,
openTransitionName = props.openTransitionName,
_internalRenderMenuItem = props._internalRenderMenuItem,
_internalRenderSubMenuItem = props._internalRenderSubMenuItem,
restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
var childList = (0, _nodeUtil.parseChildren)(children, EMPTY_LIST);
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.');
} // ========================= Mode =========================
var _React$useMemo = React.useMemo(function () {
if ((mode === 'inline' || mode === 'vertical') && inlineCollapsed) {
return ['vertical', inlineCollapsed];
}
return [mode, false];
}, [mode, inlineCollapsed]),
_React$useMemo2 = (0, _slicedToArray2.default)(_React$useMemo, 2),
mergedMode = _React$useMemo2[0],
mergedInlineCollapsed = _React$useMemo2[1]; // ====================== Responsive ======================
var _React$useState3 = React.useState(0),
_React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
lastVisibleIndex = _React$useState4[0],
setLastVisibleIndex = _React$useState4[1];
var allVisible = lastVisibleIndex >= childList.length - 1 || mergedMode !== 'horizontal' || disabledOverflow; // ========================= 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];
var triggerOpenKeys = function triggerOpenKeys(keys) {
setMergedOpenKeys(keys);
onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(keys);
}; // >>>>> Cache & Reset open keys when inlineCollapsed changed
var _React$useState5 = React.useState(mergedOpenKeys),
_React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2),
inlineCacheOpenKeys = _React$useState6[0],
setInlineCacheOpenKeys = _React$useState6[1];
var isInlineMode = mergedMode === 'inline';
var mountRef = React.useRef(false); // Cache
React.useEffect(function () {
if (isInlineMode) {
setInlineCacheOpenKeys(mergedOpenKeys);
}
}, [mergedOpenKeys]); // Restore
React.useEffect(function () {
if (!mountRef.current) {
mountRef.current = true;
return;
}
if (isInlineMode) {
setMergedOpenKeys(inlineCacheOpenKeys);
} else {
// Trigger open event in case its in control
triggerOpenKeys(EMPTY_LIST);
}
}, [isInlineMode]); // ========================= 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);
}); // ======================== 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 ? void 0 : onDeselect(selectInfo);
} else {
onSelect === null || onSelect === void 0 ? void 0 : onSelect(selectInfo);
}
} // Whatever selectable, always close it
if (!multiple && mergedOpenKeys.length && mergedMode !== '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 ? 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 (mergedMode !== 'inline') {
// We need find all related popup to close
var subPathKeys = getSubPathKeys(key);
newOpenKeys = newOpenKeys.filter(function (k) {
return !subPathKeys.has(k);
});
}
if (!(0, _shallowequal.default)(mergedOpenKeys, newOpenKeys)) {
triggerOpenKeys(newOpenKeys);
}
});
var getInternalPopupContainer = (0, _useMemoCallback.default)(getPopupContainer); // ==================== 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.default)(mergedMode, 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 = mergedMode !== '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(mergedMode), className, (_classNames = {}, (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-inline-collapsed"), mergedInlineCollapsed), (0, _defineProperty2.default)(_classNames, "".concat(prefixCls, "-rtl"), isRtl), _classNames)),
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: mergedMode !== '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,
mode: mergedMode,
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: getInternalPopupContainer // 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
}, childList)))));
};
var _default = Menu;
exports.default = _default;