UNPKG

qt-public-ui

Version:

新设计规范下业务组件库

360 lines (350 loc) 17.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.LayoutContext = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireWildcard(require("react")); var _reactRouterDom = require("react-router-dom"); var _Layout = _interopRequireDefault(require("../Layout")); var _qtPublicHooks = require("qt-public-hooks"); var _lodash = require("lodash"); var _header = _interopRequireDefault(require("./component/header")); var _side = _interopRequireDefault(require("./component/side")); var _access = _interopRequireDefault(require("./component/access")); 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 && {}.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; } // interface MenuConfigItemTypes { // hideNav?: boolean; // hideSelect?: boolean; // hideSide?: boolean; // } var menuData = []; // 所有菜单项的原始信息 var accessUrlMap = {}; // 为了方便找到没个菜单项对应的权限信息,设置了权限对应关系 var AnalyzeFrame = _react["default"].forwardRef(function (props, frameRef) { var _props$menuConfig2, _props$menuConfig3, _menuConfig$activeNav, _props$appSelectProps, _props$appSelectProps2, _menuConfig$activeNav2, _menuConfig$activeNav3, _menuConfig$activeNav4, _menuConfig$activeNav5; var _props$menuConfig = props.menuConfig, menuConfig = _props$menuConfig === void 0 ? {} : _props$menuConfig, _props$appId = props.appId, appId = _props$appId === void 0 ? '' : _props$appId, sideConfig = props.sideConfig, _props$navConfig = props.navConfig, navConfig = _props$navConfig === void 0 ? {} : _props$navConfig, allAccessible = props.allAccessible; var _menuConfig$hideNav = menuConfig.hideNav, hideNav = _menuConfig$hideNav === void 0 ? false : _menuConfig$hideNav; var _navConfig$navActiveP = navConfig.navActivePatten, navActivePatten = _navConfig$navActiveP === void 0 ? {} : _navConfig$navActiveP; var _useState = (0, _react.useState)([]), _useState2 = (0, _slicedToArray2["default"])(_useState, 2), navOptions = _useState2[0], setNavOptions = _useState2[1]; // 顶部导航列表 var _useState3 = (0, _react.useState)(''), _useState4 = (0, _slicedToArray2["default"])(_useState3, 2), activeNav = _useState4[0], setActiveNav = _useState4[1]; // 顶部高亮导航 var _useState5 = (0, _react.useState)([]), _useState6 = (0, _slicedToArray2["default"])(_useState5, 2), sideOptions = _useState6[0], setSideOptions = _useState6[1]; // 左侧导航列表 var _useState7 = (0, _react.useState)({}), _useState8 = (0, _slicedToArray2["default"])(_useState7, 2), matchAccess = _useState8[0], setMatchAccess = _useState8[1]; // 匹配上菜单项的权限信息 var _useState9 = (0, _react.useState)((_props$menuConfig2 = props.menuConfig) === null || _props$menuConfig2 === void 0 ? void 0 : _props$menuConfig2.hideSide), _useState10 = (0, _slicedToArray2["default"])(_useState9, 2), _useState10$ = _useState10[0], hideSide = _useState10$ === void 0 ? false : _useState10$, setSideStatus = _useState10[1]; var _useState11 = (0, _react.useState)((_props$menuConfig3 = props.menuConfig) === null || _props$menuConfig3 === void 0 ? void 0 : _props$menuConfig3.hideSelect), _useState12 = (0, _slicedToArray2["default"])(_useState11, 2), _useState12$ = _useState12[0], hideSelect = _useState12$ === void 0 ? false : _useState12$, setSelectStatus = _useState12[1]; var _useState13 = (0, _react.useState)(false), _useState14 = (0, _slicedToArray2["default"])(_useState13, 2), noLeft = _useState14[0], setNoLeft = _useState14[1]; var _useState15 = (0, _react.useState)(true), _useState16 = (0, _slicedToArray2["default"])(_useState15, 2), isFetching = _useState16[0], setFetching = _useState16[1]; var history = (0, _reactRouterDom.useHistory)(); /** * 找到高亮顶导对应的左侧导航列表 * @param {string} chooseNav 高亮的顶导 * @param {boolean} needReplace 在点击顶部导航的是否需要跳转到到第一个有权限的菜单项 * @return {[MenuItemTypes]} */ var getSideOptions = function getSideOptions(chooseNav) { var _sideList$0$children; var sideList = menuData.filter(function (item) { return item.name === chooseNav; }); if (sideList.length && (_sideList$0$children = sideList[0].children) !== null && _sideList$0$children !== void 0 && _sideList$0$children.length) { setSideOptions(sideList[0].children); } else { setSideOptions([]); } return sideList; }; // 格式化menu,并且每个顶导下补充首次展示的url信息 var formatMenu = function formatMenu() { var isMathed = false; var matchNavPatten = false; var deepFormat = function deepFormat(options, nav) { options.forEach(function (option) { var _option$url; option.title = option.name; option.link = ((_option$url = option.url) === null || _option$url === void 0 ? void 0 : _option$url.replace('${appId}', appId)) || ''; option.disabled = !option.available; if (option.children) { deepFormat(option.children, nav); } else { option.children = []; accessUrlMap[option.link] = option; // accessUrlMap 记录下每个url对应的权限项 if ((location.pathname.indexOf(option.link) === 0 || option.pattern && location.pathname.match(option.pattern)) && !isMathed) { setMatchAccess(option); isMathed = true; } // 找到第一个有权限项的菜单项,若都没有权限,显示第一个菜单 if (!nav.activeMenu) { nav.activeMenu = option; } else if (!nav.activeMenu.accessible && option.accessible) { nav.activeMenu = option; } } }); }; menuData.forEach(function (nav) { var _navActivePatten$nav$, _navActivePatten$nav$2, _nav$children; var realUrl = nav.url.replace('${appId}', appId); var pattern = navActivePatten[nav.name]; nav.title = nav.name; nav.link = realUrl; nav.pattern = nav.pattern || pattern; if ((_navActivePatten$nav$ = navActivePatten[nav.name]) !== null && _navActivePatten$nav$ !== void 0 && (_navActivePatten$nav$2 = _navActivePatten$nav$.test) !== null && _navActivePatten$nav$2 !== void 0 && _navActivePatten$nav$2.call(_navActivePatten$nav$, location.pathname)) { matchNavPatten = true; } ((_nav$children = nav.children) === null || _nav$children === void 0 ? void 0 : _nav$children.length) && deepFormat(nav.children, nav); }); if (!isMathed && !matchNavPatten && location.pathname.match(/^\/platform\/.{14, 24}\//)) { setMatchAccess({ noAccess: true }); } return isMathed; }; var updateMenuList = function updateMenuList() { var _sideList$, _sideList$$activeMenu; var hasMathedMenu = formatMenu(); var sideList = []; var navList = menuData.reduce(function (nv, item) { var _pattern$test; var link = item.link, title = item.title, pattern = item.pattern, isNew = item.isNew; var isMatch = pattern ? (_pattern$test = pattern.test) === null || _pattern$test === void 0 ? void 0 : _pattern$test.call(pattern, location.pathname) : (0, _reactRouterDom.matchPath)(location.pathname, { path: link }); if (isMatch) { // setActiveNav(item.name); onNavChange(item.name); sideList = getSideOptions(item.name); } nv.push({ isNew: isNew, title: title, link: link, pattern: pattern }); return nv; }, []); navList = (navConfig === null || navConfig === void 0 ? void 0 : navConfig.getRenderNavOption) && navConfig.getRenderNavOption(navList) || navList; setNavOptions(navList); var _ref = props.checkJumpFirst && props.checkJumpFirst(sideOptions, hasMathedMenu) || {}, _ref$needReplace = _ref.needReplace, needReplace = _ref$needReplace === void 0 ? false : _ref$needReplace, _ref$replaceUrl = _ref.replaceUrl, replaceUrl = _ref$replaceUrl === void 0 ? (_sideList$ = sideList[0]) === null || _sideList$ === void 0 ? void 0 : (_sideList$$activeMenu = _sideList$.activeMenu) === null || _sideList$$activeMenu === void 0 ? void 0 : _sideList$$activeMenu.link : _ref$replaceUrl; needReplace && replaceUrl && history.replace(replaceUrl); }; // app发生变化时,重新获取菜单信息,设置顶导和侧导 var fetchMenuList = /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { var res; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: setFetching(true); _context.next = 3; return props.fetchMenuList(); case 3: res = _context.sent; menuData = (0, _lodash.cloneDeep)(res.data); accessUrlMap = {}; setFetching(false); updateMenuList(); case 8: case "end": return _context.stop(); } }, _callee); })); return function fetchMenuList() { return _ref2.apply(this, arguments); }; }(); (0, _react.useImperativeHandle)(frameRef, function () { return { forceUpdate: fetchMenuList }; }); // 首次进入的时候,找到所有导航中第一个有权限访问的链接 var getFirstActiveUrl = function getFirstActiveUrl(searchMenu) { if (searchMenu.length) { var _sideList$2; var index = (0, _lodash.findIndex)(searchMenu, function (item) { var _item$activeMenu; return item === null || item === void 0 ? void 0 : (_item$activeMenu = item.activeMenu) === null || _item$activeMenu === void 0 ? void 0 : _item$activeMenu.accessible; }); if (index === -1) { index = 0; } setActiveNav(searchMenu[index].name); var sideList = getSideOptions(searchMenu[index].name); ((_sideList$2 = sideList[0]) === null || _sideList$2 === void 0 ? void 0 : _sideList$2.activeMenu) && history.replace(sideList[0].activeMenu.link); return searchMenu[index].activeMenu.link; } }; // appId 发生变化:选中应用发生变化 var handleAppChange = /*#__PURE__*/function () { var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() { var firstUrl; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return fetchMenuList(); case 2: // 直接输入 /platform/${appId} 将做跳转 if (appId && location.pathname === "/platform/".concat(appId)) { firstUrl = getFirstActiveUrl(menuData); history.replace(firstUrl); } case 3: case "end": return _context2.stop(); } }, _callee2); })); return function handleAppChange() { return _ref3.apply(this, arguments); }; }(); (0, _react.useImperativeHandle)(frameRef, function () { return { forceUpdate: handleAppChange }; }); (0, _react.useEffect)(function () { handleAppChange(); }, [appId]); (0, _react.useEffect)(function () { var hideSider = (0, _lodash.get)(menuConfig[activeNav], 'hideSider'); setNoLeft(!(0, _lodash.isUndefined)(hideSider) && hideSider); }, [activeNav]); // pathname 变化时,判断权限 (0, _qtPublicHooks.useUpdateEffect)(function () { Object.keys(accessUrlMap).forEach(function (item) { if (location.pathname.indexOf(item) === 0) { setMatchAccess(accessUrlMap[item]); } }); }, [location.pathname]); var onNavChange = function onNavChange(nav) { var activeNavItem = menuData.find(function (item) { return item.name === nav; }); // 需要跳转到第一个有权限的菜单项 var sideList = []; if (nav) { var _sideList$3, _sideList$3$activeMen, _props$navConfig2; sideList = getSideOptions(nav); var needReplace = activeNavItem && activeNavItem.link === location.pathname; var replaceUrl = ((_sideList$3 = sideList[0]) === null || _sideList$3 === void 0 ? void 0 : (_sideList$3$activeMen = _sideList$3.activeMenu) === null || _sideList$3$activeMen === void 0 ? void 0 : _sideList$3$activeMen.link) || ''; (replaceUrl === null || replaceUrl === void 0 ? void 0 : replaceUrl.indexOf('//')) === -1 && needReplace && replaceUrl && history.replace(replaceUrl); ((_props$navConfig2 = props.navConfig) === null || _props$navConfig2 === void 0 ? void 0 : _props$navConfig2.onNavChange) && props.navConfig.onNavChange(nav, sideList); setActiveNav(nav); } }; return /*#__PURE__*/_react["default"].createElement(LayoutContext.Provider, { value: { menuHook: { toogleSiderNav: function toogleSiderNav(status) { setSideStatus(status); }, toogleSelect: function toogleSelect(status) { setSelectStatus(status); }, toogleSider: function toogleSider(status) { setNoLeft(status); }, forceUpdate: handleAppChange } } }, /*#__PURE__*/_react["default"].createElement(_Layout["default"], { className: props.className, headerProps: props.headerProps, nav: /*#__PURE__*/_react["default"].createElement("div", { style: { display: 'flex', alignItems: 'center', height: '100%' } }, /*#__PURE__*/_react["default"].createElement("div", { style: { width: 0 } }, !hideSelect && !((_menuConfig$activeNav = menuConfig[activeNav]) !== null && _menuConfig$activeNav !== void 0 && _menuConfig$activeNav.hideSelect) && ((_props$appSelectProps = props.appSelectProps) === null || _props$appSelectProps === void 0 ? void 0 : _props$appSelectProps.type) === 'topSelect' && props.appSelectProps.component), /*#__PURE__*/_react["default"].createElement("div", { style: { flex: '1', marginLeft: ((_props$appSelectProps2 = props.appSelectProps) === null || _props$appSelectProps2 === void 0 ? void 0 : _props$appSelectProps2.type) === 'topSelect' ? '150px' : '0' } }, hideNav || (_menuConfig$activeNav2 = menuConfig[activeNav]) !== null && _menuConfig$activeNav2 !== void 0 && _menuConfig$activeNav2.hideNav ? /*#__PURE__*/_react["default"].createElement("div", null) : /*#__PURE__*/_react["default"].createElement(_header["default"], { options: navOptions, onChange: onNavChange }))) }, !noLeft && /*#__PURE__*/_react["default"].createElement(_Layout["default"].Sider, null, props.appSelectProps.type === 'leftSelect' && !hideSelect && !((_menuConfig$activeNav3 = menuConfig[activeNav]) !== null && _menuConfig$activeNav3 !== void 0 && _menuConfig$activeNav3.hideSelect) && props.appSelectProps.component, !hideSide && !((_menuConfig$activeNav4 = menuConfig[activeNav]) !== null && _menuConfig$activeNav4 !== void 0 && _menuConfig$activeNav4.hideSide) && ((_menuConfig$activeNav5 = menuConfig[activeNav]) !== null && _menuConfig$activeNav5 !== void 0 && _menuConfig$activeNav5.sideRender ? menuConfig[activeNav].sideRender(activeNav, sideOptions) : /*#__PURE__*/_react["default"].createElement(_side["default"], { options: sideOptions, appId: appId, activeNav: activeNav, sideConfig: sideConfig }))), /*#__PURE__*/_react["default"].createElement(_access["default"], (0, _extends2["default"])({}, matchAccess, { isFetching: isFetching, allAccessible: allAccessible }), props.children))); }); var LayoutContext = exports.LayoutContext = _react["default"].createContext({ menuHook: { toogleSiderNav: function toogleSiderNav() { return null; }, toogleSelect: function toogleSelect() { return null; }, toogleSider: function toogleSider() { return null; }, forceUpdate: function forceUpdate() { return null; } } }); var _default = exports["default"] = AnalyzeFrame;