UNPKG

@b-design/ui-layout

Version:

React component for Alibaba Cloud.

240 lines (213 loc) 10.6 kB
import _extends from "@babel/runtime/helpers/esm/extends"; import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray"; import _defineProperty from "@babel/runtime/helpers/esm/defineProperty"; import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); 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 = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } import React, { useState, useMemo, useEffect } from 'react'; import * as PropTypes from 'prop-types'; import Page from '@b-design/ui-page'; import RoutableMenu from '@b-design/ui-console-menu/RoutableMenu'; import Layout from './index'; import { Header, Container } from './styles'; import { Icon, Balloon } from '@b-design/ui'; /** * @public */ var BothSidesLayout = function BothSidesLayout(props) { var children = props.children, className = props.className, style = props.style, breadcrumb = props.breadcrumb, _props$menus = props.menus, menus = _props$menus === void 0 ? [] : _props$menus, headerLeftNode = props.headerLeftNode, headerRightNode = props.headerRightNode, pageTitle = props.pageTitle, onBackArrowClick = props.onBackArrowClick, hasBackArrow = props.hasBackArrow, _props$menuVisible = props.menuVisible, menuVisible = _props$menuVisible === void 0 ? true : _props$menuVisible, _props$headerVisible = props.headerVisible, headerVisible = _props$headerVisible === void 0 ? true : _props$headerVisible, _props$secondMenuProp = props.secondMenuProps, secondMenuProps = _props$secondMenuProp === void 0 ? {} : _props$secondMenuProp, _props$headerMenuProp = props.headerMenuProps, headerMenuProps = _props$headerMenuProp === void 0 ? {} : _props$headerMenuProp, breadcrumbExtra = props.breadcrumbExtra, breadcrumbExtraAlign = props.breadcrumbExtraAlign, subTitle = props.subTitle, headerExtra = props.headerExtra, headerClassName = props.headerClassName, headerStyle = props.headerStyle, _props$collapseVisibl = props.collapseVisible, collapseVisible = _props$collapseVisibl === void 0 ? true : _props$collapseVisibl; var _useState = useState(location.pathname), _useState2 = _slicedToArray(_useState, 2), pathname = _useState2[0], setPathname = _useState2[1]; var _useState3 = useState('left'), _useState4 = _slicedToArray(_useState3, 2), trigger = _useState4[0], setTrigger = _useState4[1]; var _useState5 = useState(''), _useState6 = _slicedToArray(_useState5, 2), activeKey = _useState6[0], setActiveKey = _useState6[1]; var firstMenu = useMemo(function () { return menus.map(function (item) { var _item$items; var data = queryFirstMenuUrl(item); return _objectSpread(_objectSpread({}, item), {}, { label: item.label, to: data.to, key: data.key, activePathPatterns: item !== null && item !== void 0 && (_item$items = item.items) !== null && _item$items !== void 0 && _item$items.length ? queryActivePathPatterns(item.items) : [item.to], items: undefined }); }); }, [menus]); useEffect(function () { setPathname("".concat(location.pathname).concat(location.hash)); }, [location.pathname, location.hash]); var secondMenu = useMemo(function () { var navs_map = new Map(); menus.forEach(function (item) { navs_map.set(querySecondMenuKey(item), item.items || []); }); var data = navs_map.get(pathname); querySecondMneuKey(data); return data; }, [menus, pathname]); // 通过地址栏找出应选中的二级菜单key function querySecondMneuKey() { var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; data.forEach(function (item) { var _item$items2; if (item.to === pathname) { setActiveKey(item.key); } else if (item !== null && item !== void 0 && (_item$items2 = item.items) !== null && _item$items2 !== void 0 && _item$items2.length) { querySecondMneuKey(item.items); } }); } // 找出当前路由匹配哪个二级菜单 function querySecondMenuKey(data) { var _data$items; if (data !== null && data !== void 0 && (_data$items = data.items) !== null && _data$items !== void 0 && _data$items.length && queryActivePathPatterns(data.items).includes(pathname)) { return pathname; } else { return data.to; } } // 找出一级菜单应跳转的地址 function queryFirstMenuUrl(data) { var _data$items2; if (data !== null && data !== void 0 && (_data$items2 = data.items) !== null && _data$items2 !== void 0 && _data$items2.length) { return queryFirstMenuUrl(data.items[0]); } else if (data.length) { return data[0]; } return data; } // 找出一级菜单对应的所有的 activePathPatterns function queryActivePathPatterns(data) { var arr = []; data.forEach(function (item) { var _item$activePathPatte, _item$items3; if (item.to) { arr.push(item.to); } if (item !== null && item !== void 0 && (_item$activePathPatte = item.activePathPatterns) !== null && _item$activePathPatte !== void 0 && _item$activePathPatte.length) { arr = [].concat(_toConsumableArray(arr), _toConsumableArray(item.activePathPatterns)); } if (item !== null && item !== void 0 && (_item$items3 = item.items) !== null && _item$items3 !== void 0 && _item$items3.length) { arr = [].concat(_toConsumableArray(arr), _toConsumableArray(queryActivePathPatterns(item.items))); } }); return arr; } function renderBalloon(item) { return /*#__PURE__*/React.createElement(Balloon, { trigger: /*#__PURE__*/React.createElement(Icon, { size: (item === null || item === void 0 ? void 0 : item.iconSize) || 'small', type: item.icon }), closable: false, align: "r" }, item.label); } var navs = useMemo(function () { return secondMenu === null || secondMenu === void 0 ? void 0 : secondMenu.map(function (item) { var _item$items4, _item$items5; return _objectSpread(_objectSpread({}, item), {}, { items: trigger === 'left' ? item === null || item === void 0 ? void 0 : item.items : undefined, label: item.icon ? /*#__PURE__*/React.createElement(React.Fragment, null, trigger === 'right' ? renderBalloon(item) : /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Icon, { size: (item === null || item === void 0 ? void 0 : item.iconSize) || 'small', type: item.icon, className: "layout-menu-item-icon" }), /*#__PURE__*/React.createElement("span", null, item.label))) : item.label, to: (_item$items4 = item.items) !== null && _item$items4 !== void 0 && _item$items4.length ? item.items[0].to : item.to, key: trigger === 'left' && item !== null && item !== void 0 && (_item$items5 = item.items) !== null && _item$items5 !== void 0 && _item$items5.length ? item.items[0].key : item.key }); }); }, [secondMenu, trigger]); return /*#__PURE__*/React.createElement("div", { className: "".concat(className ? className + ' ' : '', "b-design-layout"), style: _objectSpread({}, style) }, headerVisible && /*#__PURE__*/React.createElement(Header, { leftContainer: headerLeftNode, rightContainer: headerRightNode, className: headerClassName, style: headerStyle, headerMenu: menuVisible ? /*#__PURE__*/React.createElement(RoutableMenu, _extends({ items: firstMenu, embeddable: true, type: "secondary" }, headerMenuProps, { style: _objectSpread({ flex: 'auto' }, headerMenuProps.style), onItemClick: function onItemClick(key, itemInfo, event) { setPathname("".concat(location.pathname).concat(location.hash)); headerMenuProps.onItemClick && headerMenuProps.onItemClick(key, itemInfo, event); }, direction: "hoz", activeDirection: "bottom" })) : null }), /*#__PURE__*/React.createElement(Container, null, secondMenu !== null && secondMenu !== void 0 && secondMenu.length ? /*#__PURE__*/React.createElement(Layout.Sider, null, /*#__PURE__*/React.createElement(RoutableMenu, _extends({ items: navs, onItemClick: function onItemClick(key) { return setActiveKey(key); }, activeKey: activeKey }, secondMenuProps, { style: _objectSpread({ paddingBottom: collapseVisible ? '32px' : '0px' }, secondMenuProps.style), direction: "ver", className: "".concat(secondMenuProps.className ? secondMenuProps.className + ' ' : '').concat(trigger === 'left' ? 'layout-sidebar-show' : 'layout-sidebar-hide', " both-layout-menu") })), collapseVisible && /*#__PURE__*/React.createElement("div", { onClick: function onClick() { return setTrigger(trigger === 'left' ? 'right' : 'left'); }, className: "layout-sidebar-visible" }, /*#__PURE__*/React.createElement(Icon, { type: "toggle-".concat(trigger), size: "small" }))) : null, /*#__PURE__*/React.createElement(Page, { className: "b-design-layout-page-content" }, /*#__PURE__*/React.createElement(Page.Header, { title: pageTitle, breadcrumb: breadcrumb, hasBackArrow: hasBackArrow, onBackArrowClick: onBackArrowClick, breadcrumbExtra: breadcrumbExtra, breadcrumbExtraAlign: breadcrumbExtraAlign, subTitle: subTitle }, headerExtra), /*#__PURE__*/React.createElement(Page.Content, null, children)))); }; BothSidesLayout.propTypes = { className: PropTypes.string, style: PropTypes.objectOf(PropTypes.any), children: PropTypes.node, breadcrumb: PropTypes.node, breadcrumbExtra: PropTypes.node }; export default BothSidesLayout;