@ant-design/pro-layout
Version:
307 lines (304 loc) • 15.7 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.ProPageHeader = exports.ProBreadcrumb = exports.PageContainer = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _proProvider = require("@ant-design/pro-provider");
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireWildcard(require("react"));
var _RouteContext = require("../../context/RouteContext");
var _FooterToolbar = require("../FooterToolbar");
var _GridContent = require("../GridContent");
var _PageHeader = require("../PageHeader");
var _PageLoading = require("../PageLoading");
var _WaterMark = require("../WaterMark");
var _style = require("./style");
var _stylish = require("./style/stylish");
var _proUtils = require("@ant-design/pro-utils");
require("antd/lib/breadcrumb/style");
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["title", "content", "pageHeaderRender", "header", "prefixedClassName", "extraContent", "childrenContentStyle", "style", "prefixCls", "hashId", "value", "breadcrumbRender"],
_excluded2 = ["children", "loading", "className", "style", "footer", "affixProps", "token", "fixedHeader", "breadcrumbRender", "footerToolBarProps", "childrenContentStyle"];
function genLoading(spinProps) {
if ((0, _typeof2.default)(spinProps) === 'object') {
return spinProps;
}
return {
spinning: spinProps
};
}
/**
* Render Footer tabList In order to be compatible with the old version of the PageHeader basically
* all the functions are implemented.
*/
var renderFooter = function renderFooter(_ref) {
var tabList = _ref.tabList,
tabActiveKey = _ref.tabActiveKey,
onTabChange = _ref.onTabChange,
hashId = _ref.hashId,
tabBarExtraContent = _ref.tabBarExtraContent,
tabProps = _ref.tabProps,
prefixedClassName = _ref.prefixedClassName;
if (Array.isArray(tabList) || tabBarExtraContent) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tabs, (0, _objectSpread2.default)((0, _objectSpread2.default)({
className: "".concat(prefixedClassName, "-tabs ").concat(hashId).trim(),
activeKey: tabActiveKey,
onChange: function onChange(key) {
if (onTabChange) {
onTabChange(key);
}
},
tabBarExtraContent: tabBarExtraContent,
items: tabList === null || tabList === void 0 ? void 0 : tabList.map(function (item, index) {
var _item$key;
return (0, _objectSpread2.default)((0, _objectSpread2.default)({
label: item.tab
}, item), {}, {
key: ((_item$key = item.key) === null || _item$key === void 0 ? void 0 : _item$key.toString()) || (index === null || index === void 0 ? void 0 : index.toString())
});
})
}, tabProps), {}, {
children: (0, _proUtils.compareVersions)(_antd.version, '4.23.0') < 0 ? tabList === null || tabList === void 0 ? void 0 : tabList.map(function (item, index) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tabs.TabPane, (0, _objectSpread2.default)({
tab: item.tab
}, item), item.key || index);
}) : null
}));
}
return null;
};
var renderPageHeader = function renderPageHeader(content, extraContent, prefixedClassName, hashId) {
if (!content && !extraContent) {
return null;
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixedClassName, "-detail ").concat(hashId).trim(),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixedClassName, "-main ").concat(hashId).trim(),
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: "".concat(prefixedClassName, "-row ").concat(hashId).trim(),
children: [content && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixedClassName, "-content ").concat(hashId).trim(),
children: content
}), extraContent && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(prefixedClassName, "-extraContent ").concat(hashId).trim(),
children: extraContent
})]
})
})
});
};
/**
* 配置与面包屑相同,只是增加了自动根据路由计算面包屑的功能。此功能必须要在 ProLayout 中使用。
*
* @param props
* @returns
*/
var ProBreadcrumb = exports.ProBreadcrumb = function ProBreadcrumb(props) {
var value = (0, _react.useContext)(_RouteContext.RouteContext);
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
style: {
height: '100%',
display: 'flex',
alignItems: 'center'
},
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Breadcrumb, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, value === null || value === void 0 ? void 0 : value.breadcrumb), value === null || value === void 0 ? void 0 : value.breadcrumbProps), props))
});
};
var memoRenderPageHeader = function memoRenderPageHeader(props) {
var _breadcrumb$items;
var title = props.title,
content = props.content,
pageHeaderRender = props.pageHeaderRender,
header = props.header,
prefixedClassName = props.prefixedClassName,
extraContent = props.extraContent,
childrenContentStyle = props.childrenContentStyle,
style = props.style,
prefixCls = props.prefixCls,
hashId = props.hashId,
value = props.value,
breadcrumbRender = props.breadcrumbRender,
restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
var getBreadcrumbRender = function getBreadcrumbRender() {
if (!breadcrumbRender) {
return undefined;
}
return breadcrumbRender;
};
if (pageHeaderRender === false) {
return null;
}
if (pageHeaderRender) {
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [" ", pageHeaderRender((0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), value))]
});
}
var pageHeaderTitle = title;
if (!title && title !== false) {
pageHeaderTitle = value.title;
}
var pageHeaderProps = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, value), {}, {
title: pageHeaderTitle
}, restProps), {}, {
footer: renderFooter((0, _objectSpread2.default)((0, _objectSpread2.default)({}, restProps), {}, {
hashId: hashId,
breadcrumbRender: breadcrumbRender,
prefixedClassName: prefixedClassName
}))
}, header);
var _ref2 = pageHeaderProps,
breadcrumb = _ref2.breadcrumb;
var noHasBreadCrumb = (!breadcrumb || !(breadcrumb !== null && breadcrumb !== void 0 && breadcrumb.itemRender) && !(breadcrumb !== null && breadcrumb !== void 0 && (_breadcrumb$items = breadcrumb.items) !== null && _breadcrumb$items !== void 0 && _breadcrumb$items.length)) && !breadcrumbRender;
if (['title', 'subTitle', 'extra', 'tags', 'footer', 'avatar', 'backIcon'].every(function (item) {
return !pageHeaderProps[item];
}) && noHasBreadCrumb && !content && !extraContent) {
return null;
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PageHeader.PageHeader, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, pageHeaderProps), {}, {
className: "".concat(prefixedClassName, "-warp-page-header ").concat(hashId).trim(),
breadcrumb: breadcrumbRender === false ? undefined : (0, _objectSpread2.default)((0, _objectSpread2.default)({}, pageHeaderProps.breadcrumb), value.breadcrumbProps),
breadcrumbRender: getBreadcrumbRender(),
prefixCls: prefixCls,
children: (header === null || header === void 0 ? void 0 : header.children) || renderPageHeader(content, extraContent, prefixedClassName, hashId)
}));
};
var PageContainerBase = function PageContainerBase(props) {
var _restProps$header2, _token$layout;
var children = props.children,
_props$loading = props.loading,
loading = _props$loading === void 0 ? false : _props$loading,
className = props.className,
style = props.style,
footer = props.footer,
affixProps = props.affixProps,
propsToken = props.token,
fixedHeader = props.fixedHeader,
breadcrumbRender = props.breadcrumbRender,
footerToolBarProps = props.footerToolBarProps,
childrenContentStyle = props.childrenContentStyle,
restProps = (0, _objectWithoutProperties2.default)(props, _excluded2);
var value = (0, _react.useContext)(_RouteContext.RouteContext);
/** 告诉 props 是否存在 footerBar */
(0, _react.useEffect)(function () {
var _value$setHasPageCont;
if (!value || !(value !== null && value !== void 0 && value.setHasPageContainer)) {
return function () {};
}
value === null || value === void 0 || (_value$setHasPageCont = value.setHasPageContainer) === null || _value$setHasPageCont === void 0 || _value$setHasPageCont.call(value, function (num) {
return num + 1;
});
return function () {
var _value$setHasPageCont2;
value === null || value === void 0 || (_value$setHasPageCont2 = value.setHasPageContainer) === null || _value$setHasPageCont2 === void 0 || _value$setHasPageCont2.call(value, function (num) {
return num - 1;
});
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
var _useContext = (0, _react.useContext)(_proProvider.ProProvider),
token = _useContext.token;
var _useContext2 = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext),
getPrefixCls = _useContext2.getPrefixCls;
var prefixCls = props.prefixCls || getPrefixCls('pro');
var basePageContainer = "".concat(prefixCls, "-page-container");
var _useStyle = (0, _style.useStyle)(basePageContainer, propsToken),
wrapSSR = _useStyle.wrapSSR,
hashId = _useStyle.hashId;
var stylish = (0, _stylish.useStylish)("".concat(basePageContainer, ".").concat(basePageContainer, "-stylish"), {
stylish: props.stylish
});
var memoBreadcrumbRender = (0, _react.useMemo)(function () {
var _restProps$header;
if (breadcrumbRender == false) return false;
return breadcrumbRender || (restProps === null || restProps === void 0 || (_restProps$header = restProps.header) === null || _restProps$header === void 0 ? void 0 : _restProps$header.breadcrumbRender);
}, [breadcrumbRender, restProps === null || restProps === void 0 || (_restProps$header2 = restProps.header) === null || _restProps$header2 === void 0 ? void 0 : _restProps$header2.breadcrumbRender]);
var pageHeaderDom = memoRenderPageHeader((0, _objectSpread2.default)((0, _objectSpread2.default)({}, restProps), {}, {
breadcrumbRender: memoBreadcrumbRender,
ghost: true,
hashId: hashId,
prefixCls: undefined,
prefixedClassName: basePageContainer,
value: value
}));
var loadingDom = (0, _react.useMemo)(function () {
// 当loading时一个合法的ReactNode时,说明用户使用了自定义loading,直接返回改自定义loading
if ( /*#__PURE__*/_react.default.isValidElement(loading)) {
return loading;
}
// 当传递过来的是布尔值,并且为false时,说明不需要显示loading,返回null
if (typeof loading === 'boolean' && !loading) {
return null;
}
// 如非上述两种情况,那么要么用户传了一个true,要么用户传了loading配置,使用genLoading生成loading配置后返回PageLoading
var spinProps = genLoading(loading);
// 如果传的是loading配置,但spinning传的是false,也不需要显示loading
return spinProps.spinning ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_PageLoading.PageLoading, (0, _objectSpread2.default)({}, spinProps)) : null;
}, [loading]);
var content = (0, _react.useMemo)(function () {
return children ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: (0, _classnames.default)(hashId, "".concat(basePageContainer, "-children-container"), (0, _defineProperty2.default)({}, "".concat(basePageContainer, "-children-container-no-header"), !pageHeaderDom)),
style: childrenContentStyle,
children: children
})
}) : null;
}, [children, basePageContainer, childrenContentStyle, hashId]);
var renderContentDom = (0, _react.useMemo)(function () {
// 只要loadingDom非空我们就渲染loadingDom,否则渲染内容
var dom = loadingDom || content;
if (props.waterMarkProps || value.waterMarkProps) {
var waterMarkProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, value.waterMarkProps), props.waterMarkProps);
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_WaterMark.WaterMark, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, waterMarkProps), {}, {
children: dom
}));
}
return dom;
}, [props.waterMarkProps, value.waterMarkProps, loadingDom, content]);
var containerClassName = (0, _classnames.default)(basePageContainer, hashId, className, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(basePageContainer, "-with-footer"), footer), "".concat(basePageContainer, "-with-affix"), fixedHeader && pageHeaderDom), "".concat(basePageContainer, "-stylish"), !!restProps.stylish));
return wrapSSR(stylish.wrapSSR( /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
style: style,
className: containerClassName,
children: [fixedHeader && pageHeaderDom ?
/*#__PURE__*/
// 在 hasHeader 且 fixedHeader 的情况下,才需要设置高度
(0, _jsxRuntime.jsx)(_antd.Affix, (0, _objectSpread2.default)((0, _objectSpread2.default)({
offsetTop: value.hasHeader && value.fixedHeader ? (_token$layout = token.layout) === null || _token$layout === void 0 || (_token$layout = _token$layout.header) === null || _token$layout === void 0 ? void 0 : _token$layout.heightLayoutHeader : 1
}, affixProps), {}, {
className: "".concat(basePageContainer, "-affix ").concat(hashId).trim(),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(basePageContainer, "-warp ").concat(hashId).trim(),
children: pageHeaderDom
})
})) : pageHeaderDom, renderContentDom && /*#__PURE__*/(0, _jsxRuntime.jsx)(_GridContent.GridContent, {
children: renderContentDom
})]
}), footer && /*#__PURE__*/(0, _jsxRuntime.jsx)(_FooterToolbar.FooterToolbar, (0, _objectSpread2.default)((0, _objectSpread2.default)({
stylish: restProps.footerStylish,
prefixCls: prefixCls
}, footerToolBarProps), {}, {
children: footer
}))]
})));
};
var PageContainer = exports.PageContainer = function PageContainer(props) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_proProvider.ProConfigProvider, {
needDeps: true,
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(PageContainerBase, (0, _objectSpread2.default)({}, props))
});
};
var ProPageHeader = exports.ProPageHeader = function ProPageHeader(props) {
var value = (0, _react.useContext)(_RouteContext.RouteContext);
return memoRenderPageHeader((0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
hashId: '',
value: value
}));
};