UNPKG

tntd

Version:

tntd是基于 TNT Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。

376 lines (374 loc) 16.8 kB
"use strict"; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _debounce2 = _interopRequireDefault(require("lodash/debounce")); var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _utils = require("../../utils"); var _Iconfont = _interopRequireDefault(require("../Iconfont")); require("../../locale"); var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7; 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; } function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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 _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); } var SearchArea = _styledComponents["default"].div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n position: relative;\n font-size: 14px;\n margin-bottom: 20px;\n color: ", ";\n &.active {\n color: ", ";\n input {\n border-color: ", ";\n }\n }\n .tnt-icon {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n line-height: 1em;\n &[type='close'] {\n right: 0;\n top: 0;\n font-size: 18px;\n cursor: pointer;\n }\n }\n input {\n border-width: 0 0 1px;\n border-style: solid;\n border-color: ", ";\n width: 100%;\n padding: 4px 20px;\n line-height: 20px;\n background-color: transparent;\n outline: none;\n }\n"])), function (props) { return props.theme.secondaryTextColor; }, function (props) { return props.theme.primaryColor; }, function (props) { return props.theme.primaryColor; }, function (props) { return props.theme.borderColor; }); var ApplicationTabs = _styledComponents["default"].ul(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n border: 1px solid ", ";\n color: ", ";\n line-height: 32px;\n margin: 0 0 16px;\n padding: 0;\n display: inline-block;\n\n & > li {\n padding: 0 20px;\n display: inline-block;\n cursor: pointer;\n &:not(:last-child) {\n border-right: 1px solid ", ";\n }\n &.active {\n background-color: ", ";\n color: #fff;\n }\n }\n"])), function (props) { return props.theme.borderColor; }, function (props) { return props.theme.primaryTextColor; }, function (props) { return props.theme.borderColor; }, function (props) { return props.theme.primaryColor; }); var GroupMenus = _styledComponents["default"].div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n height: ", ";\n overflow: auto;\n & > div {\n width: 200px;\n margin-right: 10px;\n display: inline-block;\n vertical-align: top;\n }\n"])), function (props) { return props.isLevel3 ? 'calc(100% - 80px)' : 'calc(100% - 50px)'; }); var GroupMenuItem = _styledComponents["default"].div(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n margin-bottom: 20px;\n & > h5 {\n line-height: 20px;\n margin: 0;\n margin-bottom: 6px;\n }\n"]))); var MenuList = _styledComponents["default"].ul(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n list-style: none;\n padding: 0;\n margin: 0;\n"]))); var MenuItem = _styledComponents["default"].li(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n display: block;\n line-height: 30px;\n font-size: 12px;\n cursor: pointer;\n a {\n color: ", ";\n &:hover {\n color: ", " !important;\n }\n }\n &.active a {\n color: ", ";\n }\n"])), function (props) { return props.theme.secondaryTextColor; }, function (props) { return props.theme.secondaryColor; }, function (props) { return props.theme.primaryColor; }); var ListBox = _styledComponents["default"].ul(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n background: #fff;\n max-height: 320px;\n overflow-y: auto;\n margin: 0;\n padding: 6px 0;\n list-style: none;\n font-size: 13px;\n position: absolute;\n top: 29px;\n width: 100%;\n box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08),\n 0 9px 28px 8px rgba(0, 0, 0, 0.05);\n li {\n cursor: pointer;\n line-height: 32px;\n padding: 0 10px;\n color: ", ";\n &:hover {\n color: ", ";\n background-color: ", ";\n }\n }\n"])), function (props) { return props.theme.primaryTextColor; }, function (props) { return props.theme.secondaryColor; }, function (props) { return props.theme.lightBgColor; }); var SearchList = function SearchList(_ref) { var items = _ref.items, onSelectMenu = _ref.onSelectMenu, theme = _ref.theme; return _react["default"].createElement(ListBox, { theme: theme }, items === null || items === void 0 ? void 0 : items.map(function (item) { return _react["default"].createElement("li", { onClick: function onClick() { return onSelectMenu(item); } }, item === null || item === void 0 ? void 0 : item.menuName); })); }; var _default = exports["default"] = function _default(_ref2) { var theme = _ref2.theme, _ref2$menus = _ref2.menus, menus = _ref2$menus === void 0 ? [] : _ref2$menus, close = _ref2.close, actions = _ref2.actions, popupRef = _ref2.popupRef, containerRef = _ref2.containerRef; var _useState = (0, _react.useState)(false), _useState2 = _slicedToArray(_useState, 2), active = _useState2[0], setActive = _useState2[1]; var _useState3 = (0, _react.useState)(), _useState4 = _slicedToArray(_useState3, 2), searchValue = _useState4[0], setSearchValue = _useState4[1]; var language = actions === null || actions === void 0 ? void 0 : actions.getLanguage(); var isLevel3 = (0, _utils.hasLevel3)(menus); var _useState5 = (0, _react.useState)(isLevel3 ? menus === null || menus === void 0 ? void 0 : menus[0] : null), _useState6 = _slicedToArray(_useState5, 2), activeTopMenu = _useState6[0], setActiveTopMenu = _useState6[1]; var selectedMenuKey = actions.getSelectedMenuKey(); var calcGroupMenus = function calcGroupMenus(menus) { menus = menus === null || menus === void 0 ? void 0 : menus.reduce(function (acc, cur) { var _a; // 分组 if ((_a = cur === null || cur === void 0 ? void 0 : cur.children) === null || _a === void 0 ? void 0 : _a.length) { acc.push(cur); } else { var defaultGroup = acc.find(function (_ref3) { var isDefaultGroup = _ref3.isDefaultGroup; return isDefaultGroup; }); if (!defaultGroup) { acc.unshift({ isDefaultGroup: true, children: [cur] }); } else { defaultGroup.children.push(cur); } } return acc; }, []); return menus === null || menus === void 0 ? void 0 : menus.reduce(function (acc, cur) { var _a; var column = Math.max(1, ~~((containerRef.current.clientWidth - 32) / 210)); if (!acc.length) { acc.push([cur]); } else { var calcGroupHeight = function calcGroupHeight(group) { var _a; return 46 + (((_a = group === null || group === void 0 ? void 0 : group.children) === null || _a === void 0 ? void 0 : _a.length) || 0) * 30; }; var calcColumnHeight = function calcColumnHeight(columnGroups) { return columnGroups === null || columnGroups === void 0 ? void 0 : columnGroups.reduce(function (acc, cur) { acc += calcGroupHeight(cur); return acc; }, 0); }; var currentColumnHeight = calcColumnHeight(acc[acc.length - 1]); var nextGroupHeight = calcGroupHeight(cur); var findMinHeightGroup = function findMinHeightGroup(groups) { var minHeight = Infinity; var index = 0; for (var i = 0; i < groups.length; i++) { var height = calcColumnHeight(groups[i]); if (height < minHeight) { index = i; minHeight = height; } } return groups[index]; }; if (acc.length >= column) { var minHeightGroup = findMinHeightGroup(acc); minHeightGroup === null || minHeightGroup === void 0 ? void 0 : minHeightGroup.push(cur); } else { if (currentColumnHeight + nextGroupHeight > 440) { acc.push([cur]); } else { (_a = acc[(acc === null || acc === void 0 ? void 0 : acc.length) - 1]) === null || _a === void 0 ? void 0 : _a.push(cur); } } } return acc; }, []); }; var groupMenus = calcGroupMenus((activeTopMenu === null || activeTopMenu === void 0 ? void 0 : activeTopMenu.children) || menus); var _useState7 = (0, _react.useState)([]), _useState8 = _slicedToArray(_useState7, 2), searchedMenus = _useState8[0], setSearchedMenus = _useState8[1]; var onMenuClick = function onMenuClick(menu) { actions.emit('menuSelect', { key: menu.code, data: menu }); setSearchValue(''); setSearchedMenus([]); close(); }; var debounceSearch = (0, _debounce2["default"])(function (evt) { var _a; var value = (_a = evt.target.value) === null || _a === void 0 ? void 0 : _a.trim(); var matchedMenus = []; if (value) { (0, _utils.traverseTree)(menus, function (node) { var _a; if (node.path && ((_a = node === null || node === void 0 ? void 0 : node.menuName) === null || _a === void 0 ? void 0 : _a.includes(value))) { matchedMenus.push(node); } }); } setSearchedMenus(matchedMenus); }, 100); var onSearchChange = function onSearchChange(evt) { evt.persist(); setSearchValue(evt.target.value); debounceSearch(evt); }; var onSelectAppTab = function onSelectAppTab(menu) { setActiveTopMenu(menu); }; (0, _react.useEffect)(function () { var clickOutside = function clickOutside(evt) { var clientX = evt.clientX, clientY = evt.clientY, pageX = evt.pageX, pageY = evt.pageY; var isOutside = function isOutside(evt, popup) { if (popup === null || popup === void 0 ? void 0 : popup.contains) { return !(popup === null || popup === void 0 ? void 0 : popup.contains(evt.target)); } var _popup$getBoundingCli = popup.getBoundingClientRect(), x = _popup$getBoundingCli.x, y = _popup$getBoundingCli.y, height = _popup$getBoundingCli.height, width = _popup$getBoundingCli.width; x += window.scrollX; y += window.scrollY; return pageX < x || pageX > x + width || pageY < y || pageY > y + height; }; if (isOutside(evt, popupRef.current)) { setSearchValue(''); setSearchedMenus([]); close(); } }; document.addEventListener('click', clickOutside); return function () { return document.removeEventListener('click', clickOutside); }; }, []); return _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement(SearchArea, { theme: theme, className: (0, _classnames["default"])({ active: active }) }, _react["default"].createElement(_Iconfont["default"], { type: "search" }), _react["default"].createElement("input", { placeholder: actions === null || actions === void 0 ? void 0 : actions.getText('menuSearch'), value: searchValue, onChange: onSearchChange, onFocus: function onFocus() { return setActive(true); }, onBlur: function onBlur() { return setActive(false); } }), _react["default"].createElement(_Iconfont["default"], { type: "close", onClick: close }), (searchedMenus === null || searchedMenus === void 0 ? void 0 : searchedMenus.length) > 0 && _react["default"].createElement(SearchList, { items: searchedMenus, theme: theme, onSelectMenu: onMenuClick })), isLevel3 && _react["default"].createElement(ApplicationTabs, { theme: theme }, menus === null || menus === void 0 ? void 0 : menus.map(function (menu) { return _react["default"].createElement("li", { className: (0, _classnames["default"])({ active: menu.code === (activeTopMenu === null || activeTopMenu === void 0 ? void 0 : activeTopMenu.code) }), onClick: function onClick() { return onSelectAppTab(menu); } }, menu === null || menu === void 0 ? void 0 : menu[language === 'cn' ? 'groupName' : 'enName']); })), _react["default"].createElement(GroupMenus, { theme: theme, isLevel3: isLevel3 }, groupMenus === null || groupMenus === void 0 ? void 0 : groupMenus.map(function (groups) { return _react["default"].createElement("div", null, groups === null || groups === void 0 ? void 0 : groups.map(function (group) { return _react["default"].createElement(GroupMenuItem, { theme: theme }, _react["default"].createElement("h5", null, group === null || group === void 0 ? void 0 : group[language === 'cn' ? 'groupName' : 'enName']), _react["default"].createElement(MenuList, null, (group.children || []).map(function (menu) { return _react["default"].createElement(MenuItem, { key: menu.code, className: (0, _classnames["default"])({ active: selectedMenuKey === menu.code }), theme: theme, onClick: function onClick() { return onMenuClick(menu); } }, _react["default"].createElement("a", { href: menu.path, onClick: function onClick(evt) { return evt.preventDefault(); } }, menu === null || menu === void 0 ? void 0 : menu[language === 'cn' ? 'menuName' : 'enName'])); }))); })); }))); };