161 lines
6.7 KiB
JavaScript
161 lines
6.7 KiB
JavaScript
"use strict";
|
||
|
||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
||
Object.defineProperty(exports, "__esModule", {
|
||
value: true
|
||
});
|
||
exports.getVersion = exports.getBreadcrumbProps = exports.getBreadcrumbFromProps = exports.getBreadcrumb = exports.genBreadcrumbProps = void 0;
|
||
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
||
var _proUtils = require("@ant-design/pro-utils");
|
||
var _antd = require("antd");
|
||
var _pathToRegexp = require("path-to-regexp");
|
||
var _pathTools = require("./pathTools");
|
||
var _jsxRuntime = require("react/jsx-runtime");
|
||
var getVersion = exports.getVersion = function getVersion() {
|
||
var _process;
|
||
if (typeof process === 'undefined') return _antd.version;
|
||
return ((_process = process) === null || _process === void 0 || (_process = _process.env) === null || _process === void 0 ? void 0 : _process.ANTD_VERSION) || _antd.version;
|
||
};
|
||
// 渲染 Breadcrumb 子节点
|
||
// Render the Breadcrumb child node
|
||
var defaultItemRender = function defaultItemRender(route, _, routes) {
|
||
var _ref = route,
|
||
breadcrumbName = _ref.breadcrumbName,
|
||
title = _ref.title,
|
||
path = _ref.path;
|
||
var last = routes.findIndex(function (i) {
|
||
return (
|
||
// @ts-ignore
|
||
i.linkPath === route.path
|
||
);
|
||
}) === routes.length - 1;
|
||
return last ? /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
||
children: title || breadcrumbName
|
||
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
||
onClick: path ? function () {
|
||
return location.href = path;
|
||
} : undefined,
|
||
children: title || breadcrumbName
|
||
});
|
||
};
|
||
var renderItemLocal = function renderItemLocal(item, props) {
|
||
var formatMessage = props.formatMessage,
|
||
menu = props.menu;
|
||
if (item.locale && formatMessage && (menu === null || menu === void 0 ? void 0 : menu.locale) !== false) {
|
||
return formatMessage({
|
||
id: item.locale,
|
||
defaultMessage: item.name
|
||
});
|
||
}
|
||
return item.name;
|
||
};
|
||
var getBreadcrumb = exports.getBreadcrumb = function getBreadcrumb(breadcrumbMap, url) {
|
||
var breadcrumbItem = breadcrumbMap.get(url);
|
||
if (!breadcrumbItem) {
|
||
// Find the first matching path in the order defined by route config
|
||
// 按照 route config 定义的顺序找到第一个匹配的路径
|
||
var keys = Array.from(breadcrumbMap.keys()) || [];
|
||
var targetPath = keys.find(function (path) {
|
||
try {
|
||
if (path !== null && path !== void 0 && path.startsWith('http')) return false;
|
||
return (0, _pathToRegexp.match)(path.replace('?', ''))(url);
|
||
} catch (error) {
|
||
console.log('path', path, error);
|
||
return false;
|
||
}
|
||
}
|
||
// remove ? ,不然会重复
|
||
);
|
||
if (targetPath) breadcrumbItem = breadcrumbMap.get(targetPath);
|
||
}
|
||
return breadcrumbItem || {
|
||
path: ''
|
||
};
|
||
};
|
||
var getBreadcrumbFromProps = exports.getBreadcrumbFromProps = function getBreadcrumbFromProps(props) {
|
||
var location = props.location,
|
||
breadcrumbMap = props.breadcrumbMap;
|
||
return {
|
||
location: location,
|
||
breadcrumbMap: breadcrumbMap
|
||
};
|
||
};
|
||
var conversionFromLocation = function conversionFromLocation(routerLocation, breadcrumbMap, props) {
|
||
// Convertor the url to an array
|
||
var pathSnippets = (0, _pathTools.urlToList)(routerLocation === null || routerLocation === void 0 ? void 0 : routerLocation.pathname);
|
||
// Loop data mosaic routing
|
||
var extraBreadcrumbItems = pathSnippets.map(function (url) {
|
||
var currentBreadcrumb = getBreadcrumb(breadcrumbMap, url);
|
||
var name = renderItemLocal(currentBreadcrumb, props);
|
||
var hideInBreadcrumb = currentBreadcrumb.hideInBreadcrumb;
|
||
return name && !hideInBreadcrumb ? {
|
||
linkPath: url,
|
||
breadcrumbName: name,
|
||
title: name,
|
||
component: currentBreadcrumb.component
|
||
} : {
|
||
linkPath: '',
|
||
breadcrumbName: '',
|
||
title: ''
|
||
};
|
||
}).filter(function (item) {
|
||
return item && item.linkPath;
|
||
});
|
||
return extraBreadcrumbItems;
|
||
};
|
||
/** 将参数转化为面包屑 Convert parameters into breadcrumbs */
|
||
var genBreadcrumbProps = exports.genBreadcrumbProps = function genBreadcrumbProps(props) {
|
||
var _getBreadcrumbFromPro = getBreadcrumbFromProps(props),
|
||
location = _getBreadcrumbFromPro.location,
|
||
breadcrumbMap = _getBreadcrumbFromPro.breadcrumbMap;
|
||
|
||
// 根据 location 生成 面包屑
|
||
// Generate breadcrumbs based on location
|
||
if (location && location.pathname && breadcrumbMap) {
|
||
return conversionFromLocation(location, breadcrumbMap, props);
|
||
}
|
||
return [];
|
||
};
|
||
|
||
// 声明一个导出函数,接收两个参数:BreadcrumbProps和ProLayoutProps,返回一个BreadcrumbListReturn类型的对象
|
||
var getBreadcrumbProps = exports.getBreadcrumbProps = function getBreadcrumbProps(props, layoutPros // ProLayoutProps类型的layoutPros
|
||
) {
|
||
// 解构赋值获取props中的breadcrumbRender和props中的itemRender,如果props中没有itemRender则使用默认的defaultItemRender函数
|
||
var breadcrumbRender = props.breadcrumbRender,
|
||
propsItemRender = props.itemRender;
|
||
// 解构赋值获取layoutPros.breadcrumbProps.minLenght的值,如果没有设置,则默认为2
|
||
var _ref2 = layoutPros.breadcrumbProps || {},
|
||
_ref2$minLength = _ref2.minLength,
|
||
minLength = _ref2$minLength === void 0 ? 2 : _ref2$minLength;
|
||
// 生成面包屑的路由数组,该数组中包含菜单项和面包屑项
|
||
var routesArray = genBreadcrumbProps(props);
|
||
// 如果props中有itemRender,则使用props中的itemRender,否则使用默认函数defaultItemRender
|
||
var itemRender = function itemRender(item) {
|
||
var renderFunction = propsItemRender || defaultItemRender;
|
||
for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||
rest[_key - 1] = arguments[_key];
|
||
}
|
||
return renderFunction === null || renderFunction === void 0 ? void 0 : renderFunction.apply(void 0, [(0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
|
||
// 如果item.linkPath存在,则使用item.linkPath,否则使用item.path
|
||
// @ts-ignore
|
||
path: item.linkPath || item.path
|
||
})].concat(rest));
|
||
};
|
||
var items = routesArray;
|
||
// 如果面包屑渲染函数breadcrumbRender存在,则使用其渲染数组items
|
||
if (breadcrumbRender) {
|
||
items = breadcrumbRender(items || []) || undefined;
|
||
}
|
||
// 如果items(渲染后的数组)的长度小于minLength或者breadcrumbRender为false,则items为undefined
|
||
if (items && items.length < minLength || breadcrumbRender === false) {
|
||
items = undefined;
|
||
}
|
||
// 如果当前 ant design 包的版本大于等于5.3.0,则返回一个对象{items,itemRender},否则返回一个对象{routes:item,itemRender}
|
||
return (0, _proUtils.compareVersions)(getVersion(), '5.3.0') > -1 ? {
|
||
items: items,
|
||
itemRender: itemRender
|
||
} : {
|
||
routes: items,
|
||
itemRender: itemRender
|
||
};
|
||
}; |