@ccs-design/rc-pro
Version:
ccs design basic react component
625 lines (529 loc) • 21.8 kB
JavaScript
import "antd/es/config-provider/style";
import _ConfigProvider from "antd/es/config-provider";
import "antd/es/breadcrumb/style";
import _Breadcrumb from "antd/es/breadcrumb";
import "antd/es/tabs/style";
import _Tabs from "antd/es/tabs";
import "antd/es/dropdown/style";
import _Dropdown from "antd/es/dropdown";
import "antd/es/menu/style";
import _Menu from "antd/es/menu";
import "antd/es/layout/style";
import _Layout from "antd/es/layout";
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import React, { useEffect, useState, useMemo, useLayoutEffect } from 'react';
import { isBrowser } from 'umi';
import NoFoundPage from './404';
import { DownOutlined, MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons';
import Header from './header';
import AppPage from './page';
import { AuthContext, GlobalContext } from './context';
import LayoutMenu from './menu';
import { getStroage, setStroage } from '../utils';
import classNames from 'classnames';
import { ContainerQuery } from 'react-container-query';
import zhCN from "antd/es/locale-provider/zh_CN";
import { useEventListener, useUpdateEffect } from 'ahooks';
import DumiLayout from './dumi';
import './index.less';
var Content = _Layout.Content,
Sider = _Layout.Sider;
var query = {
'screen-xs': {
maxWidth: 575
},
'screen-sm': {
minWidth: 576,
maxWidth: 767
},
'screen-md': {
minWidth: 768,
maxWidth: 991
},
'screen-lg': {
minWidth: 992,
maxWidth: 1199
},
'screen-xl': {
minWidth: 1200,
maxWidth: 1599
},
'screen-xxl': {
minWidth: 1600
}
};
var RouteHistorys = [];
export var classPrefix = 'ccs-bl';
export function stringToHex(str) {
if (str === '') return '';
var hexCharCode = [];
for (var i = 0; i < str.length; i += 1) {
hexCharCode.push(str.charCodeAt(i).toString(16));
}
return hexCharCode.join('').toUpperCase();
}
var getRoute = function getRoute() {
var routes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var path = arguments.length > 1 ? arguments[1] : undefined;
var get = function get(rs, ph) {
rs.forEach(function (r) {
if (r.path === ph) {
throw new Error(r.hiddenBreadcrumb);
}
if (r.routes) get(r.routes, ph);
});
};
try {
get(routes, path);
} catch (error) {
return error.message;
}
return false;
}; // 获取菜单列表(鉴权用)
var getMenus = function getMenus() {
var menus = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var parents = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
return menus.reduce(function (keys, item) {
keys.push(_objectSpread(_objectSpread({}, item), {}, {
parents: parents
}));
if (item.nodeData.menuType === 0) {
return keys.concat(getMenus(item.children, [].concat(_toConsumableArray(parents), [{
key: item.nodeId,
url: item.nodeData.menuUrl,
name: item.nodeData.menuName
}])));
}
return keys;
}, []);
};
var tabPages = [];
/**
* 布局
* @param BasicLayoutType
*/
var CcsBasicLayout = function CcsBasicLayout(_ref) {
var logo = _ref.logo,
route = _ref.route,
history = _ref.history,
children = _ref.children,
dispatch = _ref.dispatch,
location = _ref.location,
userDetail = _ref.userDetail,
headerExtra = _ref.headerExtra,
_ref$homePage = _ref.homePage,
homePage = _ref$homePage === void 0 ? '/' : _ref$homePage,
layoutConfig = _ref.layoutConfig,
renderHeader = _ref.renderHeader,
hideLeftMenu = _ref.hideLeftMenu,
userOverlayMenu = _ref.userOverlayMenu,
renderChildrenMenu = _ref.renderChildrenMenu;
var _ref2 = location || {},
pathname = _ref2.pathname;
var _ref3 = userDetail || {},
_ref3$menuData = _ref3.menuData,
menuData = _ref3$menuData === void 0 ? [] : _ref3$menuData;
var menus = useMemo(function () {
return getMenus(menuData).filter(function (t) {
var _t$nodeData;
return ((_t$nodeData = t.nodeData) === null || _t$nodeData === void 0 ? void 0 : _t$nodeData.menuType) === 1;
});
}, [menuData.map(function (m) {
return m.nodeId;
}).toString()]);
var _ref4 = layoutConfig || {},
IsDark = _ref4.IsDark,
_ref4$AppName = _ref4.AppName,
AppName = _ref4$AppName === void 0 ? '' : _ref4$AppName,
IsCompact = _ref4.IsCompact,
IsTabsPage = _ref4.IsTabsPage,
LayoutMode = _ref4.LayoutMode,
_ref4$MenuExpandWidth = _ref4.MenuExpandWidth,
MenuExpandWidth = _ref4$MenuExpandWidth === void 0 ? 208 : _ref4$MenuExpandWidth,
_ref4$MenuCollapsedWi = _ref4.MenuCollapsedWidth,
MenuCollapsedWidth = _ref4$MenuCollapsedWi === void 0 ? 48 : _ref4$MenuCollapsedWi,
MenuCollapsed = _ref4.MenuCollapsed;
var _useState = useState(false),
_useState2 = _slicedToArray(_useState, 2),
tabs = _useState2[0],
setTabs = _useState2[1];
var appNameHex = useMemo(function () {
return stringToHex(AppName);
}, []);
function getLocalStorage(key) {
try {
return localStorage.getItem("".concat(key, "_").concat(appNameHex));
} catch (error) {
return false;
}
}
function setLocalStorage(state) {
try {
var key = state.key,
value = state.value;
localStorage.setItem("".concat(key, "_").concat(appNameHex), value);
} catch (error) {
/* continue regardless of error */
}
}
var _useState3 = useState(getLocalStorage('_LAYOUT') || LayoutMode || 'left'),
_useState4 = _slicedToArray(_useState3, 2),
layout = _useState4[0],
setLayout = _useState4[1];
var _useState5 = useState(MenuCollapsed || getLocalStorage('_COLLAPSED') === 'true'),
_useState6 = _slicedToArray(_useState5, 2),
collapsed = _useState6[0],
setCollapsed = _useState6[1];
var hasPage = tabPages.find(function (page) {
return page.key === pathname;
}) || {
key: pathname,
title: '',
content: undefined,
top: 0
};
var title = '未知';
var content = function content() {
return /*#__PURE__*/React.createElement(NoFoundPage, null);
}; // clear tabs
useEffect(function () {
return function () {
tabPages = [];
};
}, []);
useUpdateEffect(function () {
if (hasPage === null || hasPage === void 0 ? void 0 : hasPage.content) {
var _document$scrollingEl;
(_document$scrollingEl = document.scrollingElement) === null || _document$scrollingEl === void 0 ? void 0 : _document$scrollingEl.scrollTo(0, hasPage.top);
}
}, [pathname]);
var onScroll = function onScroll(e) {
var _ref5 = e.target.scrollingElement || {},
scrollTop = _ref5.scrollTop;
hasPage.top = scrollTop;
}; // listener document scroll
useEventListener('scroll', onScroll, {
target: document
}); // add theme class
useLayoutEffect(function () {
var body = document.getElementsByTagName('body');
if (body && body.length > 0) {
body[0].classList.add(IsDark ? 'dark-theme' : 'default-theme');
if (IsCompact) {
body[0].classList.add('compact-theme');
}
}
}, []); // coolapsed change
function onChangeCollapsed() {
setCollapsed(!collapsed);
setLocalStorage({
key: '_COLLAPSED',
value: !collapsed
});
} // layou change
function onChangeLayout(e) {
setLayout(e);
setLocalStorage({
key: '_LAYOUT',
value: e
});
}
var curMenu = useMemo(function () {
var menu = menus.find(function (m) {
var menuUrl = m.nodeData.menuUrl;
if (menuUrl.includes('?')) {
return menuUrl.split('?')[0] === pathname;
}
return menuUrl === pathname;
}); // add document title
if (isBrowser() && menu) {
setTimeout(function () {
document.title = "".concat(AppName, " - ").concat(menu.nodeName);
}, 10);
} // save history route
var saveHistory = /*#__PURE__*/function () {
var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
var index;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (RouteHistorys.length) {
_context.next = 7;
break;
}
_context.next = 3;
return getStroage('_ROUTE_HISTORY');
case 3:
_context.t0 = _context.sent;
if (_context.t0) {
_context.next = 6;
break;
}
_context.t0 = [];
case 6:
RouteHistorys = _context.t0;
case 7:
index = RouteHistorys.findIndex(function (h) {
return h.pathName === pathname;
});
if (index > -1) {
RouteHistorys.splice(index, 1);
}
RouteHistorys.unshift({
pathName: pathname,
menuName: (menu === null || menu === void 0 ? void 0 : menu.nodeData.menuName) || '',
time: new Date()
});
setStroage('_ROUTE_HISTORY', RouteHistorys);
case 11:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function saveHistory() {
return _ref6.apply(this, arguments);
};
}();
if (menu) saveHistory();
return menu;
}, [pathname]); // cache page
if (!(hasPage === null || hasPage === void 0 ? void 0 : hasPage.content) && IsTabsPage) {
if (curMenu) {
title = curMenu.nodeName;
content = children === null || children === void 0 ? void 0 : children.props.children;
}
hasPage.title = title;
hasPage.content = content;
tabPages.push(hasPage);
} // tabs change
function onChange(e) {
history.push(e);
} // tab close
var onEdit = function onEdit(e) {
if (tabPages.length === 1) {
// close last
tabPages = [];
history.push(homePage);
return;
}
tabPages = tabPages.filter(function (f) {
return f.key !== e;
}); // close current
if (pathname === e) {
history.push(tabPages[tabPages.length - 1].key);
return;
}
setTabs(!tabs);
}; // tab extra
var operations = function operations() {
// close other or close all tabs
var onClose = function onClose(key) {
if (key) {
tabPages = tabPages.filter(function (f) {
return f.key === key;
});
setTabs(!tabs);
} else {
tabPages = [];
history.push(homePage);
}
};
var closeMenu = /*#__PURE__*/React.createElement(_Menu, null, /*#__PURE__*/React.createElement(_Menu.Item, {
key: "1"
}, /*#__PURE__*/React.createElement("a", {
onClick: function onClick() {
return onClose(pathname);
}
}, "\u5173\u95ED\u5176\u4ED6\u6807\u7B7E")), /*#__PURE__*/React.createElement(_Menu.Item, {
key: "2"
}, /*#__PURE__*/React.createElement("a", {
onClick: function onClick() {
return onClose();
}
}, "\u5173\u95ED\u6240\u6709\u6807\u7B7E")));
return /*#__PURE__*/React.createElement(_Dropdown, {
overlay: closeMenu
}, /*#__PURE__*/React.createElement("a", {
className: "ant-dropdown-link",
onClick: function onClick(e) {
return e.preventDefault();
},
style: {
paddingRight: 16
}
}, "\u5173\u95ED ", /*#__PURE__*/React.createElement(DownOutlined, null)));
}; // left menu
var renderSiderMenu = function renderSiderMenu() {
if (layout !== 'left' || hideLeftMenu) return null;
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
style: {
width: collapsed ? MenuCollapsedWidth : MenuExpandWidth,
transition: 'width 0.3s'
}
}), /*#__PURE__*/React.createElement(Sider, {
theme: IsDark ? 'dark' : 'light',
width: MenuExpandWidth,
collapsedWidth: MenuCollapsedWidth,
collapsed: collapsed,
className: "".concat(classPrefix, "-siderbar")
}, /*#__PURE__*/React.createElement(LayoutMenu, {
mode: "inline",
theme: "light",
menus: menus,
menuData: menuData,
location: location,
collapsed: collapsed,
layoutConfig: layoutConfig,
renderChildrenMenu: renderChildrenMenu
}), !MenuCollapsed ? /*#__PURE__*/React.createElement("div", {
className: "".concat(classPrefix, "-trigger"),
style: {
paddingLeft: 16
}
}, /*#__PURE__*/React.createElement("span", {
onClick: onChangeCollapsed
}, collapsed ? /*#__PURE__*/React.createElement(MenuUnfoldOutlined, null) : /*#__PURE__*/React.createElement(MenuFoldOutlined, null))) : null));
};
var renderTab = function renderTab(page) {
return /*#__PURE__*/React.createElement(_Tabs.TabPane, {
tab: page.title,
key: page.key
}, page.title === '未知' ? /*#__PURE__*/React.createElement(NoFoundPage, null) : /*#__PURE__*/React.createElement(AppPage, {
location: location,
menu: curMenu
}, children.props.children));
}; // render tabs page
var renderTabsPage = function renderTabsPage() {
return /*#__PURE__*/React.createElement(_Tabs, {
onEdit: onEdit,
hideAdd: true,
tabBarGutter: 0,
size: 'small',
onChange: onChange,
activeKey: pathname,
type: 'editable-card',
className: "".concat(classPrefix, "-card-container"),
tabBarExtraContent: operations(),
tabBarStyle: {
marginBottom: 0,
left: [0, 0, MenuCollapsedWidth, MenuExpandWidth][[layout === 'top', hideLeftMenu, collapsed, !collapsed].findIndex(function (e) {
return e;
})],
background: IsDark ? undefined : '#f0f2f5'
},
style: {
overflow: 'unset'
}
}, tabPages.map(function (page) {
return renderTab(page);
}));
}; // render one page
var renderPage = function renderPage() {
var _curMenu$parents;
// is hiddenBreadcrumb ?
var isHideBb = getRoute(route === null || route === void 0 ? void 0 : route.routes, pathname);
var page = isHideBb !== 'true' ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
className: "".concat(classPrefix, "-breadcrumb")
}, /*#__PURE__*/React.createElement("div", null, curMenu === null || curMenu === void 0 ? void 0 : curMenu.nodeData.menuName), /*#__PURE__*/React.createElement(_Breadcrumb, null, /*#__PURE__*/React.createElement(_Breadcrumb.Item, null, "\u9996\u9875"), curMenu === null || curMenu === void 0 ? void 0 : (_curMenu$parents = curMenu.parents) === null || _curMenu$parents === void 0 ? void 0 : _curMenu$parents.map(function (m) {
return /*#__PURE__*/React.createElement(_Breadcrumb.Item, {
key: m.key
}, m.name);
}), /*#__PURE__*/React.createElement(_Breadcrumb.Item, null, curMenu === null || curMenu === void 0 ? void 0 : curMenu.nodeName))), children) : children;
/** 权限判断 */
var onAuth = function onAuth(code) {
var btns = (curMenu === null || curMenu === void 0 ? void 0 : curMenu.children) || [];
return btns.find(function (b) {
return b.nodeData.menuUrl === code;
});
};
return curMenu ? /*#__PURE__*/React.createElement(AuthContext.Provider, {
value: {
menu: curMenu,
onAuth: onAuth
}
}, page) : /*#__PURE__*/React.createElement(NoFoundPage, null);
};
var contextValue = useMemo(function () {
return _objectSpread({
layout: layout,
collapsed: collapsed,
userDetail: userDetail,
dispatch: dispatch
}, layoutConfig);
}, [layout, collapsed, userDetail === null || userDetail === void 0 ? void 0 : userDetail.loginId]);
if (process.env.isDumi) return /*#__PURE__*/React.createElement(DumiLayout, {
logo: logo,
route: route,
history: history,
children: children,
dispatch: dispatch,
location: location,
userDetail: userDetail,
headerExtra: headerExtra,
layoutConfig: layoutConfig,
renderHeader: renderHeader,
userOverlayMenu: userOverlayMenu,
renderChildrenMenu: renderChildrenMenu
});
return /*#__PURE__*/React.createElement(_ConfigProvider, {
locale: zhCN
}, /*#__PURE__*/React.createElement(ContainerQuery, {
query: query
}, function (screen) {
return /*#__PURE__*/React.createElement("div", {
className: classNames('ccs-bl', screen, layout === 'top' ? "".concat(classPrefix, "-top") : "".concat(classPrefix, "-left"))
}, /*#__PURE__*/React.createElement(GlobalContext.Provider, {
value: contextValue
}, /*#__PURE__*/React.createElement(_Layout, {
style: {
minHeight: '100vh',
flexDirection: 'row'
}
}, renderSiderMenu(), /*#__PURE__*/React.createElement(_Layout, {
style: {
width: 0
}
}, /*#__PURE__*/React.createElement("div", {
style: {
height: 48
}
}), renderHeader ? renderHeader({
logo: logo,
menuData: menuData,
menus: menus,
layout: layout,
location: location
}) : /*#__PURE__*/React.createElement(Header, {
logo: logo,
menus: menus,
layout: layout,
history: history,
menuData: menuData,
location: location,
userDetail: userDetail,
headerExtra: headerExtra,
layoutConfig: layoutConfig,
userOverlayMenu: userOverlayMenu,
onChangeLayout: onChangeLayout,
renderChildrenMenu: renderChildrenMenu
}), /*#__PURE__*/React.createElement(Content, null, IsTabsPage ? renderTabsPage() : renderPage())))));
}));
};
export default CcsBasicLayout;