@ant-design/pro-layout
Version:
296 lines (290 loc) • 14.3 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.renderLogoAndTitle = exports.SiderMenu = void 0;
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _proProvider = require("@ant-design/pro-provider");
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireWildcard(require("react"));
var _AppsLogoComponents = require("../AppsLogoComponents");
var _CollapsedIcon = require("../CollapsedIcon");
var _BaseMenu = require("./BaseMenu");
var _stylish = require("./style/stylish");
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["title", "render"];
var _SafetyWarningProvider = /*#__PURE__*/_react.default.memo(function (props) {
if (process.env.NODE_ENV !== 'production') {
console.warn("[pro-layout] SiderMenu required antd@^4.24.15 || antd@^5.11.2 for access the menu context, please upgrade your antd version (current ".concat(_antd.version, ")."));
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
children: props.children
});
});
var Sider = _antd.Layout.Sider,
_Layout$_InternalSide = _antd.Layout._InternalSiderContext,
SiderContext = _Layout$_InternalSide === void 0 ? {
Provider: _SafetyWarningProvider
} : _Layout$_InternalSide;
/**
* 渲染 title 和 logo
*
* @param props
* @param renderKey
* @returns
*/
var renderLogoAndTitle = exports.renderLogoAndTitle = function renderLogoAndTitle(props) {
var renderKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'menuHeaderRender';
var logo = props.logo,
title = props.title,
layout = props.layout;
var renderFunction = props[renderKey];
if (renderFunction === false) {
return null;
}
var logoDom = (0, _AppsLogoComponents.defaultRenderLogo)(logo);
var titleDom = /*#__PURE__*/(0, _jsxRuntime.jsx)("h1", {
children: title !== null && title !== void 0 ? title : 'Ant Design Pro'
});
if (renderFunction) {
// when collapsed, no render title
return renderFunction(logoDom, props.collapsed ? null : titleDom, props);
}
/**
* 收起来时候直接不显示
*/
if (props.isMobile) {
return null;
}
if (layout === 'mix' && renderKey === 'menuHeaderRender') return false;
if (props.collapsed) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
children: logoDom
}, "title");
}
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("a", {
children: [logoDom, titleDom]
}, "title");
};
var SiderMenu = exports.SiderMenu = function SiderMenu(props) {
var _props$menu2;
var collapsed = props.collapsed,
originCollapsed = props.originCollapsed,
fixSiderbar = props.fixSiderbar,
menuFooterRender = props.menuFooterRender,
_onCollapse = props.onCollapse,
theme = props.theme,
siderWidth = props.siderWidth,
isMobile = props.isMobile,
onMenuHeaderClick = props.onMenuHeaderClick,
_props$breakpoint = props.breakpoint,
breakpoint = _props$breakpoint === void 0 ? 'lg' : _props$breakpoint,
style = props.style,
layout = props.layout,
_props$menuExtraRende = props.menuExtraRender,
menuExtraRender = _props$menuExtraRende === void 0 ? false : _props$menuExtraRende,
links = props.links,
menuContentRender = props.menuContentRender,
collapsedButtonRender = props.collapsedButtonRender,
prefixCls = props.prefixCls,
avatarProps = props.avatarProps,
rightContentRender = props.rightContentRender,
actionsRender = props.actionsRender,
onOpenChange = props.onOpenChange,
stylish = props.stylish,
logoStyle = props.logoStyle;
var _useContext = (0, _react.useContext)(_proProvider.ProProvider),
hashId = _useContext.hashId;
var showSiderExtraDom = (0, _react.useMemo)(function () {
if (isMobile) return false;
if (layout === 'mix') return false;
return true;
}, [isMobile, layout]);
var baseClassName = "".concat(prefixCls, "-sider");
// 收起的宽度
var collapsedWidth = 64;
// 之所以这样写是为了提升样式优先级,不然会被sider 自带的覆盖掉
var stylishClassName = (0, _stylish.useStylish)("".concat(baseClassName, ".").concat(baseClassName, "-stylish"), {
stylish: stylish,
proLayoutCollapsedWidth: collapsedWidth
});
var siderClassName = (0, _classnames.default)("".concat(baseClassName), hashId, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(baseClassName, "-fixed"), fixSiderbar), "".concat(baseClassName, "-fixed-mix"), layout === 'mix' && !isMobile && fixSiderbar), "".concat(baseClassName, "-collapsed"), props.collapsed), "".concat(baseClassName, "-layout-").concat(layout), layout && !isMobile), "".concat(baseClassName, "-light"), theme !== 'dark'), "".concat(baseClassName, "-mix"), layout === 'mix' && !isMobile), "".concat(baseClassName, "-stylish"), !!stylish));
var headerDom = renderLogoAndTitle(props);
var extraDom = menuExtraRender && menuExtraRender(props);
var menuDom = (0, _react.useMemo)(function () {
return menuContentRender !== false && /*#__PURE__*/(0, _react.createElement)(_BaseMenu.BaseMenu, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
key: "base-menu",
mode: collapsed && !isMobile ? 'vertical' : 'inline',
handleOpenChange: onOpenChange,
style: {
width: '100%'
},
className: "".concat(baseClassName, "-menu ").concat(hashId).trim()
}));
}, [baseClassName, hashId, menuContentRender, onOpenChange, props]);
var linksMenuItems = (links || []).map(function (node, index) {
return {
className: "".concat(baseClassName, "-link"),
label: node,
key: index
};
});
var menuRenderDom = (0, _react.useMemo)(function () {
return menuContentRender ? menuContentRender(props, menuDom) : menuDom;
}, [menuContentRender, menuDom, props]);
var avatarDom = (0, _react.useMemo)(function () {
if (!avatarProps) return null;
var title = avatarProps.title,
render = avatarProps.render,
rest = (0, _objectWithoutProperties2.default)(avatarProps, _excluded);
var dom = /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: "".concat(baseClassName, "-actions-avatar"),
children: [rest !== null && rest !== void 0 && rest.src || rest !== null && rest !== void 0 && rest.srcSet || rest.icon || rest.children ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Avatar, (0, _objectSpread2.default)({
size: 28
}, rest)) : null, avatarProps.title && !collapsed && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
children: title
})]
});
if (render) {
return render(avatarProps, dom, props);
}
return dom;
}, [avatarProps, baseClassName, collapsed]);
var actionsDom = (0, _react.useMemo)(function () {
if (!actionsRender) return null;
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Space, {
align: "center",
size: 4,
direction: collapsed ? 'vertical' : 'horizontal',
className: (0, _classnames.default)(["".concat(baseClassName, "-actions-list"), collapsed && "".concat(baseClassName, "-actions-list-collapsed"), hashId]),
children: [actionsRender === null || actionsRender === void 0 ? void 0 : actionsRender(props)].flat(1).map(function (item, index) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(baseClassName, "-actions-list-item ").concat(hashId).trim(),
children: item
}, index);
})
});
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[actionsRender, baseClassName, collapsed]);
var appsDom = (0, _react.useMemo)(function () {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_AppsLogoComponents.AppsLogoComponents, {
onItemClick: props.itemClick,
appListRender: props.appListRender,
appList: props.appList,
prefixCls: props.prefixCls
});
}, [props.appList, props.appListRender, props.prefixCls]);
var collapsedDom = (0, _react.useMemo)(function () {
if (collapsedButtonRender === false) return null;
var dom = /*#__PURE__*/(0, _jsxRuntime.jsx)(_CollapsedIcon.CollapsedIcon, {
isMobile: isMobile,
collapsed: originCollapsed,
className: "".concat(baseClassName, "-collapsed-button"),
onClick: function onClick() {
_onCollapse === null || _onCollapse === void 0 || _onCollapse(!originCollapsed);
}
});
if (collapsedButtonRender) return collapsedButtonRender(collapsed, dom);
return dom;
}, [collapsedButtonRender, isMobile, originCollapsed, baseClassName, collapsed, _onCollapse]);
/** 操作区域的dom */
var actionAreaDom = (0, _react.useMemo)(function () {
if (!avatarDom && !actionsDom) return null;
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: (0, _classnames.default)("".concat(baseClassName, "-actions"), hashId, collapsed && "".concat(baseClassName, "-actions-collapsed")),
children: [avatarDom, actionsDom]
});
}, [actionsDom, avatarDom, baseClassName, collapsed, hashId]);
/* Using the useMemo hook to create a CSS class that will hide the menu when the menu is collapsed. */
var hideMenuWhenCollapsedClassName = (0, _react.useMemo)(function () {
var _props$menu;
// 收起时完全隐藏菜单
if (props !== null && props !== void 0 && (_props$menu = props.menu) !== null && _props$menu !== void 0 && _props$menu.hideMenuWhenCollapsed && collapsed) {
return "".concat(baseClassName, "-hide-menu-collapsed");
}
return null;
}, [baseClassName, collapsed, props === null || props === void 0 || (_props$menu2 = props.menu) === null || _props$menu2 === void 0 ? void 0 : _props$menu2.hideMenuWhenCollapsed]);
var menuFooterDom = menuFooterRender && (menuFooterRender === null || menuFooterRender === void 0 ? void 0 : menuFooterRender(props));
var menuDomItems = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [headerDom && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: (0, _classnames.default)([(0, _classnames.default)("".concat(baseClassName, "-logo"), hashId, (0, _defineProperty2.default)({}, "".concat(baseClassName, "-logo-collapsed"), collapsed))]),
onClick: showSiderExtraDom ? onMenuHeaderClick : undefined,
id: "logo",
style: logoStyle,
children: [headerDom, appsDom]
}), extraDom && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: (0, _classnames.default)(["".concat(baseClassName, "-extra"), !headerDom && "".concat(baseClassName, "-extra-no-logo"), hashId]),
children: extraDom
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
style: {
flex: 1,
overflowY: 'auto',
overflowX: 'hidden'
},
children: menuRenderDom
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(SiderContext.Provider, {
value: {},
children: [links ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(baseClassName, "-links ").concat(hashId).trim(),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Menu, {
inlineIndent: 16,
className: "".concat(baseClassName, "-link-menu ").concat(hashId).trim(),
selectedKeys: [],
openKeys: [],
theme: theme,
mode: "inline",
items: linksMenuItems
})
}) : null, showSiderExtraDom && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [actionAreaDom, !actionsDom && rightContentRender ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: (0, _classnames.default)("".concat(baseClassName, "-actions"), hashId, (0, _defineProperty2.default)({}, "".concat(baseClassName, "-actions-collapsed"), collapsed)),
children: rightContentRender === null || rightContentRender === void 0 ? void 0 : rightContentRender(props)
}) : null]
}), menuFooterDom && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: (0, _classnames.default)(["".concat(baseClassName, "-footer"), hashId, (0, _defineProperty2.default)({}, "".concat(baseClassName, "-footer-collapsed"), collapsed)]),
children: menuFooterDom
})]
})]
});
return stylishClassName.wrapSSR( /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [fixSiderbar && !isMobile && !hideMenuWhenCollapsedClassName && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
style: (0, _objectSpread2.default)({
width: collapsed ? collapsedWidth : siderWidth,
overflow: 'hidden',
flex: "0 0 ".concat(collapsed ? collapsedWidth : siderWidth, "px"),
maxWidth: collapsed ? collapsedWidth : siderWidth,
minWidth: collapsed ? collapsedWidth : siderWidth,
transition: 'all 0.2s ease 0s'
}, style)
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(Sider, {
collapsible: true,
trigger: null,
collapsed: collapsed,
breakpoint: breakpoint === false ? undefined : breakpoint,
onCollapse: function onCollapse(collapse) {
if (isMobile) return;
_onCollapse === null || _onCollapse === void 0 || _onCollapse(collapse);
},
collapsedWidth: collapsedWidth,
style: style,
theme: theme,
width: siderWidth,
className: (0, _classnames.default)(siderClassName, hashId, hideMenuWhenCollapsedClassName),
children: [hideMenuWhenCollapsedClassName ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(baseClassName, "-hide-when-collapsed ").concat(hashId).trim(),
style: {
height: '100%',
width: '100%',
opacity: hideMenuWhenCollapsedClassName ? 0 : 1
},
children: menuDomItems
}) : menuDomItems, collapsedDom]
})]
}));
};