choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
910 lines (761 loc) • 33.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard")["default"];
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _classnames7 = _interopRequireDefault(require("classnames"));
var _debounce = _interopRequireDefault(require("lodash/debounce"));
var _button = _interopRequireDefault(require("../../pro/lib/button"));
var _enum = require("../../pro/lib/button/enum");
var _ModalProvider = require("../../pro/lib/modal-provider/ModalProvider");
var _iteratorUtils = require("../../pro/lib/_util/iteratorUtils");
var _dropdown = _interopRequireDefault(require("../../pro/lib/dropdown"));
var _localeContext = require("../../pro/lib/locale-context");
var _utils = require("./utils");
var _warning = _interopRequireDefault(require("../_util/warning"));
var _ripple = _interopRequireDefault(require("../ripple"));
var _TabBarInner = _interopRequireDefault(require("./TabBarInner"));
var _EventManager = _interopRequireDefault(require("../_util/EventManager"));
var _enum2 = require("./enum");
var _icon = _interopRequireDefault(require("../icon"));
var _menu = _interopRequireDefault(require("../menu"));
var _MenuItem = _interopRequireDefault(require("../menu/MenuItem"));
var _badge = _interopRequireDefault(require("../badge"));
var _TabsContext = _interopRequireDefault(require("./TabsContext"));
var _KeyCode = _interopRequireDefault(require("../_util/KeyCode"));
var _enum3 = require("../_util/enum");
var _customizationSettings = _interopRequireDefault(require("./customization-settings"));
var _Count = _interopRequireDefault(require("./Count"));
var _TabsAddBtn = _interopRequireDefault(require("./TabsAddBtn"));
var _InvalidBadge = _interopRequireDefault(require("./InvalidBadge"));
var _resizeObserver = _interopRequireDefault(require("../_util/resizeObserver"));
var _excluded = ["scrollAnimated", "className", "style", "inkBarStyle", "extraContent", "tabBarGutter", "inkBarAnimated", "type", "showMore", "hideAdd", "onRemoveTab", "onEdit"];
var TabBar = function TabBar(props) {
var scrollAnimated = props.scrollAnimated,
className = props.className,
style = props.style,
inkBarStyle = props.inkBarStyle,
extraContent = props.extraContent,
tabBarGutter = props.tabBarGutter,
inkBarAnimated = props.inkBarAnimated,
type = props.type,
showMore = props.showMore,
hideAdd = props.hideAdd,
onRemoveTab = props.onRemoveTab,
onEdit = props.onEdit,
restProps = (0, _objectWithoutProperties2["default"])(props, _excluded);
var _useContext = (0, _react.useContext)(_TabsContext["default"]),
keyboard = _useContext.keyboard,
customizable = _useContext.customizable,
prefixCls = _useContext.prefixCls,
activeKey = _useContext.activeKey,
activeGroupKey = _useContext.activeGroupKey,
tabBarPosition = _useContext.tabBarPosition,
_useContext$hideOnlyG = _useContext.hideOnlyGroup,
hideOnlyGroup = _useContext$hideOnlyG === void 0 ? false : _useContext$hideOnlyG,
groupedPanelsMap = _useContext.groupedPanelsMap,
currentPanelMap = _useContext.currentPanelMap,
validationMap = _useContext.validationMap,
onTabClick = _useContext.onTabClick,
changeActiveKey = _useContext.changeActiveKey,
rippleDisabled = _useContext.rippleDisabled;
var modal = (0, _ModalProvider.useModal)();
var openCustomizationModal = (0, _react.useCallback)(function () {
if (customizable) {
var modalProps = {
drawer: true,
size: _enum3.Size.small,
title: (0, _localeContext.$l)('Tabs', 'customization_settings'),
children: /*#__PURE__*/_react["default"].createElement(_customizationSettings["default"], null),
bodyStyle: {
overflow: 'hidden auto',
padding: 0
}
};
modalProps.okText = (0, _localeContext.$l)('Tabs', 'save');
modal.open(modalProps);
}
}, [customizable, modal]);
var getNextActiveKey = (0, _react.useCallback)(function (next) {
var list = [];
currentPanelMap.forEach(function (c, key) {
if (!c.disabled) {
if (next) {
list.push(key);
} else {
list.unshift(key);
}
}
});
var length = list.length;
if (activeKey && length) {
var i = list.indexOf(activeKey);
var itemIndex = i === length - 1 ? 0 : i + 1;
return list[itemIndex] || list[0];
}
return undefined;
}, [activeKey, currentPanelMap]);
var handleKeyDown = (0, _react.useCallback)(function (e) {
var keyCode = e.keyCode;
if (keyCode === _KeyCode["default"].RIGHT || keyCode === _KeyCode["default"].DOWN) {
e.preventDefault();
var nextKey = getNextActiveKey(true);
if (nextKey) {
changeActiveKey(nextKey);
}
} else if (keyCode === _KeyCode["default"].LEFT || keyCode === _KeyCode["default"].UP) {
e.preventDefault();
var previousKey = getNextActiveKey(false);
if (previousKey) {
changeActiveKey(previousKey);
}
}
}, [changeActiveKey, getNextActiveKey]);
var handleTabClick = (0, _react.useCallback)(function (key) {
if (onTabClick) {
onTabClick(key);
}
changeActiveKey(key);
}, [changeActiveKey, onTabClick]);
var handleGroupSelect = (0, _react.useCallback)(function (param) {
var key = param.key;
if (activeGroupKey !== key) {
var newActiveKey = (0, _utils.getActiveKeyByGroupKey)(groupedPanelsMap, key);
if (newActiveKey) {
changeActiveKey(newActiveKey, true);
}
}
}, [changeActiveKey, activeGroupKey, groupedPanelsMap]);
var getOffsetWH = (0, _react.useCallback)(function (node) {
return node[(0, _utils.isVertical)(tabBarPosition) ? 'offsetHeight' : 'offsetWidth'];
}, [tabBarPosition]);
var getScrollWH = (0, _react.useCallback)(function (node) {
return node[(0, _utils.isVertical)(tabBarPosition) ? 'scrollHeight' : 'scrollWidth'];
}, [tabBarPosition]);
var getOffsetLT = (0, _react.useCallback)(function (node) {
return node.getBoundingClientRect()[(0, _utils.isVertical)(tabBarPosition) ? 'top' : 'left'];
}, [tabBarPosition]);
var resizeEvent = (0, _react.useMemo)(function () {
return new _EventManager["default"](typeof window === 'undefined' ? undefined : window);
}, []);
var lastNextPrevShownRef = (0, _react.useRef)();
var offsetRef = (0, _react.useRef)(0);
var containerRef = (0, _react.useRef)(null);
var navWrapRef = (0, _react.useRef)(null);
var navScrollRef = (0, _react.useRef)(null);
var navRef = (0, _react.useRef)(null);
var rootRef = (0, _react.useRef)(null);
var activeTabRef = (0, _react.useRef)(null);
var inkBarRef = (0, _react.useRef)(null);
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
next = _useState2[0],
setNext = _useState2[1];
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
prev = _useState4[0],
setPrev = _useState4[1];
var _useState5 = (0, _react.useState)(activeKey),
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
prevActiveKey = _useState6[0],
setActiveKey = _useState6[1];
var _useState7 = (0, _react.useState)([]),
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
menuList = _useState8[0],
setMenuList = _useState8[1];
var tabsRef = (0, _react.useRef)([]);
var getTabs = function getTabs() {
var length = currentPanelMap.size;
var tabBarRef = (0, _toConsumableArray2["default"])(currentPanelMap.entries()).map(function (item) {
return {
key: item[0],
value: item[1],
ref: /*#__PURE__*/_react["default"].createRef()
};
});
tabsRef.current = tabBarRef;
var isSecond = type === _enum2.TabsType['second-level'];
return (0, _iteratorUtils.iteratorReduce)(currentPanelMap.entries(), function (rst, _ref, index) {
var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
key = _ref2[0],
child = _ref2[1];
var disabled = child.disabled,
_child$closable = child.closable,
closable = _child$closable === void 0 ? true : _child$closable,
showCount = child.showCount,
count = child.count,
overflowCount = child.overflowCount,
countRenderer = child.countRenderer;
var classes = isSecond ? ["".concat(prefixCls, "-second-tab")] : ["".concat(prefixCls, "-tab")];
var tabProps = {
tabKey: key,
role: 'tab',
'aria-disabled': 'false',
'aria-selected': 'false',
style: {
marginRight: tabBarGutter && index === length - 1 ? 0 : tabBarGutter
}
};
if (disabled) {
classes.push("".concat(classes, "-disabled"));
tabProps['aria-disabled'] = 'true';
} else {
tabProps.onTabClick = handleTabClick;
}
if (activeKey === key) {
classes.push(isSecond ? "".concat(classes, "-active") : "".concat(classes, "-active"));
tabBarRef[index].ref = activeTabRef;
tabProps['aria-selected'] = 'true';
}
tabProps.className = classes.join(' ');
(0, _warning["default"])('tab' in child || 'title' in child, 'There must be `tab` or `title` property on children of Tabs.');
var title = /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, (0, _utils.getHeader)(child), showCount && /*#__PURE__*/_react["default"].createElement(_Count["default"], {
prefixCls: prefixCls,
count: count,
renderer: countRenderer,
overflowCount: overflowCount,
asyncCount: renderInkBar
}));
rst.push( /*#__PURE__*/_react["default"].createElement(_ripple["default"], {
disabled: disabled || rippleDisabled,
key: key
}, /*#__PURE__*/_react["default"].createElement(_TabBarInner["default"], (0, _extends2["default"])({
ref: tabBarRef[index].ref
}, tabProps), /*#__PURE__*/_react["default"].createElement(_InvalidBadge["default"], {
prefixCls: prefixCls,
isInvalid: function isInvalid() {
return key !== activeKey && validationMap.get(key) === false;
}
}, type === _enum2.TabsType['editable-card'] ? /*#__PURE__*/_react["default"].createElement("div", {
className: closable ? undefined : "".concat(prefixCls, "-tab-unclosable")
}, title, closable && /*#__PURE__*/_react["default"].createElement(_icon["default"], {
type: "close",
onClick: function onClick(e) {
return onRemoveTab(key, e);
}
})) : title))));
return rst;
}, []);
};
var isNextPrevShown = (0, _react.useCallback)(function (state) {
if (state) {
return state.next || state.prev;
}
return next || prev;
}, [next, prev]);
var onMenuClick = function onMenuClick(_ref3) {
var key = _ref3.key;
changeActiveKey(key);
scrollToActiveTab();
};
var menu = function menu() {
return /*#__PURE__*/_react["default"].createElement(_menu["default"], {
style: {
maxHeight: 200,
overflow: 'auto'
},
onClick: onMenuClick
}, menuList.map(function (x) {
return /*#__PURE__*/_react["default"].createElement(_menu["default"].Item, {
key: x.key
}, /*#__PURE__*/_react["default"].createElement("a", {
target: "_blank"
}, (0, _utils.getHeader)(x)));
}));
};
var getContent = function getContent(contents) {
var vertical = (0, _utils.isVertical)(tabBarPosition);
var isEditCard = type === _enum2.TabsType['editable-card'];
var classes = (0, _classnames7["default"])("".concat(prefixCls, "-extra-content"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-extra-vertical-content"), vertical));
var dropDownClass = (0, _classnames7["default"])("".concat(prefixCls, "-more-tab"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-more-vertical-tab"), vertical));
var nextPrevShown = isNextPrevShown();
var moreTool = nextPrevShown && !!showMore && /*#__PURE__*/_react["default"].createElement(_dropdown["default"], {
overlay: menu,
key: "more"
}, /*#__PURE__*/_react["default"].createElement(_icon["default"], {
type: "more_horiz",
className: dropDownClass
}));
var addTool = isEditCard && nextPrevShown && !hideAdd && /*#__PURE__*/_react["default"].createElement(_TabsAddBtn["default"], {
key: "add",
onEdit: onEdit,
vertical: vertical,
isFixed: true
}); // 这里是固定项
var toolBar = [moreTool, addTool];
if (extraContent || customizable) {
return [contents, /*#__PURE__*/_react["default"].createElement("div", {
key: "extra",
className: classes
}, customizable && /*#__PURE__*/_react["default"].createElement(_button["default"], {
className: "".concat(prefixCls, "-hover-button"),
funcType: _enum.FuncType.flat,
icon: "predefine",
size: _enum3.Size.small,
onClick: openCustomizationModal
}), toolBar, extraContent)];
}
return [contents, /*#__PURE__*/_react["default"].createElement("div", {
key: "extra",
className: classes
}, toolBar)];
};
var getGroupNode = function getGroupNode() {
if (groupedPanelsMap.size > Number(hideOnlyGroup)) {
var items = [];
groupedPanelsMap.forEach(function (pane, key) {
var _pane$group = pane.group,
tab = _pane$group.tab,
disabled = _pane$group.disabled,
dot = _pane$group.dot,
panelsMap = pane.panelsMap;
if (panelsMap.size) {
items.push( /*#__PURE__*/_react["default"].createElement(_MenuItem["default"], {
key: String(key),
disabled: disabled
}, /*#__PURE__*/_react["default"].createElement(_InvalidBadge["default"], {
prefixCls: prefixCls,
isInvalid: function isInvalid() {
return activeGroupKey !== key && (0, _iteratorUtils.iteratorSome)(panelsMap.keys(), function (paneKey) {
return validationMap.get(paneKey) === false;
});
}
}, /*#__PURE__*/_react["default"].createElement(_badge["default"], {
dot: dot
}, tab))));
}
});
if (items.length > 1) {
return /*#__PURE__*/_react["default"].createElement(_menu["default"], {
prefixCls: "".concat(prefixCls, "-group"),
selectedKeys: activeGroupKey ? [activeGroupKey] : [],
onSelect: handleGroupSelect,
mode: "vertical"
}, items);
}
}
return undefined;
};
var getInkBarNode = function getInkBarNode() {
var inkBarClassName = "".concat(prefixCls, "-ink-bar");
var classes = (0, _classnames7["default"])(inkBarClassName, inkBarAnimated ? "".concat(inkBarClassName, "-animated") : "".concat(inkBarClassName, "-no-animated"));
return /*#__PURE__*/_react["default"].createElement("div", {
style: inkBarStyle,
className: classes,
key: "inkBar",
ref: inkBarRef
});
};
var setOffset = (0, _react.useCallback)(function (offset, callback) {
var nav = navRef.current; // 节点长度
var navScroll = navScrollRef.current;
if (nav && navScroll) {
var target = Math.round(offset);
if (offsetRef.current !== target) {
offsetRef.current = Math.abs(target);
var navOffset = {};
var navStyle = nav.style;
var transformSupported = (0, _utils.isTransformSupported)(navStyle);
if ((0, _utils.isVertical)(tabBarPosition)) {
if (transformSupported) {
var top = Math.abs(target);
if (navScroll.scrollTo) {
navScroll.scrollTo({
top: top
});
} else {
navScroll.scrollTop = top;
}
} else {
navOffset.name = 'top';
navOffset.value = "".concat(target, "px");
}
} else if (transformSupported) {
var left = Math.abs(target);
if (navScroll.scrollTo) {
navScroll.scrollTo({
left: left
});
} else {
navScroll.scrollLeft = left;
}
} else {
navOffset.name = 'left';
navOffset.value = "".concat(target, "px");
}
if (transformSupported) {
(0, _utils.setTransform)(navStyle, navOffset.value);
} else if (navOffset.name) {
navStyle[navOffset.name] = navOffset.value;
}
if (callback) {
callback();
}
}
}
}, [offsetRef, navRef, tabBarPosition]);
var setNextPrev = (0, _react.useCallback)(function () {
var navNode = navRef.current;
var container = containerRef.current;
var navWrap = navWrapRef.current;
if (navNode && container && navWrap) {
var navNodeWH = getScrollWH(navNode);
var containerWH = getOffsetWH(container);
var navWrapNodeWH = getOffsetWH(navWrap);
var offset = Math.round(offsetRef.current); // 当容器小于tab的时候使用最小值才可以防止回弹问题。
var minOffset = Math.round(navNodeWH - navWrapNodeWH);
var $next = next;
var $prev = prev;
if (offset === 0 && containerWH < navNodeWH) {
$prev = false;
$next = true;
} else if (minOffset > 0 && offset >= minOffset) {
$prev = true;
$next = false;
} else if (offset > 0) {
$prev = true;
$next = true;
} else {
$prev = false;
$next = false;
}
if (next !== $next) {
setNext($next);
}
if (prev !== $prev) {
setPrev($prev);
}
return {
next: $next,
prev: $prev
};
}
}, [next, prev, navRef, containerRef, navWrapRef, offsetRef, getScrollWH, getOffsetWH]);
var toPrev = (0, _react.useCallback)(function () {
var navWrapNode = navWrapRef.current;
if (navWrapNode) {
var navWrapNodeWH = getOffsetWH(navWrapNode);
var offset = offsetRef.current - navWrapNodeWH;
setOffset(offset < 0 ? 0 : 0 - offset, setNextPrev);
}
}, [getOffsetWH, setOffset, navWrapRef, setNextPrev]);
var toNext = (0, _react.useCallback)(function () {
var navWrapNode = navWrapRef.current;
var navNode = navRef.current;
if (navWrapNode && navNode) {
var navNodeWH = getScrollWH(navNode);
var navWrapNodeWH = getOffsetWH(navWrapNode);
var offset = offsetRef.current + navWrapNodeWH;
setOffset(0 - (offset > navNodeWH ? navNodeWH - navWrapNodeWH : offset), setNextPrev);
}
}, [getOffsetWH, setOffset, navWrapRef, setNextPrev]);
var scrollToActiveTab = (0, _react.useCallback)(function (e) {
var vertical = (0, _utils.isVertical)(tabBarPosition);
var activeTab = activeTabRef.current;
var navWrap = navWrapRef.current;
if (e && e.target !== e.currentTarget || !activeTab || !navWrap) {
return;
} // when not scrollable or enter scrollable first time, don't emit scrolling
var needToSroll = isNextPrevShown();
if (!needToSroll) {
return;
}
var activeTabWH = getOffsetWH(activeTab) + (0, _utils.getStyle)(activeTab, vertical ? 'margin-bottom' : 'margin-right');
var navWrapNodeWH = getOffsetWH(navWrap);
var offset = navScrollRef.current ? vertical ? navScrollRef.current.scrollTop : navScrollRef.current.scrollLeft : 0;
var wrapOffset = getOffsetLT(navWrap);
var activeTabOffset = getOffsetLT(activeTab);
if (wrapOffset > activeTabOffset) {
offset -= wrapOffset - activeTabOffset;
setOffset(offset, setNextPrev);
} else if (wrapOffset + navWrapNodeWH < activeTabOffset + activeTabWH) {
offset += activeTabOffset + activeTabWH - (navWrapNodeWH + wrapOffset);
setOffset(offset, setNextPrev);
}
}, [activeTabRef, navWrapRef, lastNextPrevShownRef, getScrollWH, getOffsetWH, getOffsetLT, setOffset, setNextPrev, isNextPrevShown]);
var prevTransitionEnd = (0, _react.useCallback)(function (e) {
if (e.propertyName !== 'opacity') {
return;
}
var current = containerRef.current;
if (current) {
scrollToActiveTab({
target: current,
currentTarget: current
});
}
}, [scrollToActiveTab, containerRef]);
var getScrollBarNode = function getScrollBarNode(content) {
var _classnames3, _classnames4, _classnames5;
var showNextPrev = isNextPrevShown();
var prevButton = /*#__PURE__*/_react["default"].createElement("span", {
onClick: prev ? toPrev : undefined,
unselectable: "on",
className: (0, _classnames7["default"])("".concat(prefixCls, "-tab-prev"), (_classnames3 = {}, (0, _defineProperty2["default"])(_classnames3, "".concat(prefixCls, "-tab-btn-disabled"), !prev), (0, _defineProperty2["default"])(_classnames3, "".concat(prefixCls, "-tab-arrow-show"), showNextPrev), _classnames3)),
onTransitionEnd: prevTransitionEnd
}, /*#__PURE__*/_react["default"].createElement("span", {
className: "".concat(prefixCls, "-tab-prev-icon")
}));
var nextButton = /*#__PURE__*/_react["default"].createElement("span", {
onClick: next ? toNext : undefined,
unselectable: "on",
className: (0, _classnames7["default"])((_classnames4 = {}, (0, _defineProperty2["default"])(_classnames4, "".concat(prefixCls, "-tab-next"), 1), (0, _defineProperty2["default"])(_classnames4, "".concat(prefixCls, "-tab-btn-disabled"), !next), (0, _defineProperty2["default"])(_classnames4, "".concat(prefixCls, "-tab-arrow-show"), showNextPrev), _classnames4))
}, /*#__PURE__*/_react["default"].createElement("span", {
className: "".concat(prefixCls, "-tab-next-icon")
}));
var navClassName = type === _enum2.TabsType['second-level'] ? "".concat(prefixCls, "-second-nav") : "".concat(prefixCls, "-nav");
var navClasses = (0, _classnames7["default"])(navClassName, scrollAnimated ? "".concat(navClassName, "-animated") : "".concat(navClassName, "-no-animated"));
var vertical = (0, _utils.isVertical)(tabBarPosition);
var isEditCard = type === _enum2.TabsType['editable-card'];
return /*#__PURE__*/_react["default"].createElement("div", {
className: (0, _classnames7["default"])((_classnames5 = {}, (0, _defineProperty2["default"])(_classnames5, "".concat(prefixCls, "-nav-container"), 1), (0, _defineProperty2["default"])(_classnames5, "".concat(prefixCls, "-nav-container-scrolling"), showNextPrev && !showMore), _classnames5)),
key: "container",
ref: containerRef
}, !showMore && prevButton, !showMore && nextButton, /*#__PURE__*/_react["default"].createElement("div", {
className: "".concat(prefixCls, "-nav-wrap"),
ref: navWrapRef
}, /*#__PURE__*/_react["default"].createElement("div", {
className: "".concat(prefixCls, "-nav-scroll"),
ref: navScrollRef
}, /*#__PURE__*/_react["default"].createElement("div", {
className: navClasses,
ref: navRef
}, content, !hideAdd && isEditCard && /*#__PURE__*/_react["default"].createElement(_TabsAddBtn["default"], {
prefixCls: prefixCls,
extraPrefixCls: showNextPrev ? 'none' : 'inline-flex',
vertical: vertical,
onEdit: onEdit
})))));
}; // 发生滚动事件,改变更多的菜单。
var handleScrollEvent = (0, _react.useCallback)(function (_ref4) {
var target = _ref4.target;
var vertical = (0, _utils.isVertical)(tabBarPosition);
var scrollLeft = target.scrollLeft,
scrollTop = target.scrollTop;
var hiddenOffset = 0;
var prevMenuList = []; // 计算前面隐藏的tabs
for (var i = 0; i < tabsRef.current.length; i++) {
var _tabsRef$current$i = tabsRef.current[i],
key = _tabsRef$current$i.key,
value = _tabsRef$current$i.value,
ref = _tabsRef$current$i.ref;
var dom = ref.current;
var currentTabOffset = 0;
if (dom) {
currentTabOffset = vertical ? dom.offsetHeight + (0, _utils.getStyle)(dom, 'margin-bottom') : dom.offsetWidth + (0, _utils.getStyle)(dom, 'margin-right');
}
hiddenOffset += currentTabOffset || 0;
if (!vertical && scrollLeft > 0 || vertical && scrollTop > 0) {
prevMenuList.push((0, _objectSpread2["default"])({
key: key
}, value));
}
if (!vertical && scrollLeft < hiddenOffset || vertical && scrollTop < hiddenOffset) {
break;
}
} // 计算后面隐藏的tabs
var nextMenuList = [];
var navNode = navRef.current; // 节点长度
var navWrap = navWrapRef.current; // 节点滚动区域
var totalHiddenOffset = 0;
if (navNode && navWrap) {
var navNodeWH = getScrollWH(navNode);
var navWrapNodeWH = getOffsetWH(navWrap);
totalHiddenOffset = navNodeWH - navWrapNodeWH - (vertical ? scrollTop : scrollLeft);
}
var hiddenBackOffset = 0;
for (var _i = tabsRef.current.length - 1; _i >= 0; _i--) {
var _tabsRef$current$_i = tabsRef.current[_i],
_key = _tabsRef$current$_i.key,
_value = _tabsRef$current$_i.value,
_ref5 = _tabsRef$current$_i.ref;
var _dom = _ref5.current;
var endTabOffset = 0;
if (_dom) {
endTabOffset = vertical ? _dom.offsetHeight + (0, _utils.getStyle)(_dom, 'margin-bottom') : _dom.offsetWidth + (0, _utils.getStyle)(_dom, 'margin-right');
}
hiddenBackOffset += endTabOffset || 0;
if (totalHiddenOffset > 0) {
nextMenuList.push((0, _objectSpread2["default"])({
key: _key
}, _value));
}
if (hiddenBackOffset >= totalHiddenOffset) {
break;
}
}
nextMenuList.reverse();
setMenuList(prevMenuList.concat(nextMenuList));
setOffset(vertical ? scrollTop : scrollLeft, setNextPrev);
}, [tabBarPosition]);
var renderInkBar = function renderInkBar() {
var inkBarNode = inkBarRef.current;
if (inkBarNode) {
var inkBarNodeStyle = inkBarNode.style;
var activeTab = activeTabRef.current;
var rootNode = rootRef.current;
if (activeTab && rootNode) {
var wrapNode = navRef.current || rootNode;
var transformSupported = (0, _utils.isTransformSupported)(inkBarNodeStyle);
if (!(0, _utils.isVertical)(tabBarPosition)) {
var left = (0, _utils.getLeft)(activeTab, wrapNode);
var width = activeTab.offsetWidth; // If tabNode'width width equal to wrapNode'width when tabBarPosition is top or bottom
// It means no css working, then ink bar should not have width until css is loaded
if (width === rootNode.offsetWidth) {
width = 0;
} else if (inkBarStyle && inkBarStyle.width !== undefined) {
width = parseFloat(inkBarStyle.width);
if (width) {
left += (activeTab.offsetWidth - width) / 2;
}
} // use 3d gpu to optimize render
if (transformSupported) {
(0, _utils.setTransform)(inkBarNodeStyle, "translate3d(".concat(left, "px,0,0)"));
inkBarNodeStyle.width = "".concat(width, "px");
inkBarNodeStyle.height = '';
} else {
inkBarNodeStyle.left = "".concat(left, "px");
inkBarNodeStyle.top = '';
inkBarNodeStyle.bottom = '';
inkBarNodeStyle.right = "".concat(wrapNode.offsetWidth - left - width, "px");
}
} else {
var top = (0, _utils.getTop)(activeTab, wrapNode);
var height = activeTab.offsetHeight;
if (inkBarStyle && inkBarStyle.height !== undefined) {
height = parseFloat(inkBarStyle.height);
if (height) {
top += (activeTab.offsetHeight - height) / 2;
}
}
if (transformSupported) {
(0, _utils.setTransform)(inkBarNodeStyle, "translate3d(0,".concat(top, "px,0)"));
inkBarNodeStyle.height = "".concat(height, "px");
inkBarNodeStyle.width = '';
} else {
inkBarNodeStyle.left = '';
inkBarNodeStyle.right = '';
inkBarNodeStyle.top = "".concat(top, "px");
inkBarNodeStyle.bottom = "".concat(wrapNode.offsetHeight - top - height, "px");
}
}
}
inkBarNodeStyle.visibility = activeTab ? 'visible' : 'hidden';
}
};
(0, _react.useLayoutEffect)(function () {
renderInkBar();
});
(0, _react.useEffect)(function () {
handleScrollEvent({
target: {
scrollLeft: 0,
scrollTop: 0
}
});
var debouncedScroll = (0, _debounce["default"])(function (e) {
handleScrollEvent(e);
}, 200);
var debouncedWheel = (0, _debounce["default"])(function (e) {
var originalScrollLeft = navScrollRef && navScrollRef.current ? navScrollRef.current.scrollLeft : 0;
var scrollLeft = originalScrollLeft + e.deltaY;
handleScrollEvent({
target: {
scrollLeft: scrollLeft > 0 ? scrollLeft : 0,
scrollTop: 0
}
});
}, 50);
var debouncedWheelWrap = function debouncedWheelWrap(e) {
// 仅处理横向显示且为鼠标滚动
if ((0, _utils.isVertical)(tabBarPosition) || Math.abs(e.deltaX) > 0) {
return;
}
if (navScrollRef && navScrollRef.current && navRef && navRef.current && navRef.current.offsetWidth > navScrollRef.current.offsetWidth) {
e.preventDefault();
e.stopPropagation();
debouncedWheel(e);
}
};
var scrollEvent = new _EventManager["default"](navScrollRef.current);
scrollEvent.addEventListener('scroll', debouncedScroll);
scrollEvent.addEventListener('wheel', debouncedWheelWrap);
return function () {
scrollEvent.removeEventListener('scroll', debouncedScroll);
scrollEvent.removeEventListener('wheel', debouncedWheelWrap);
debouncedScroll.cancel();
debouncedWheel.cancel();
};
}, [tabBarPosition]);
(0, _react.useLayoutEffect)(function () {
var currentNextPrev = {
prev: prev,
next: next
};
var nextPrev = setNextPrev(); // wait next, prev show hide
/* eslint react/no-did-update-set-state:0 */
if (isNextPrevShown(currentNextPrev) !== isNextPrevShown(nextPrev)) {
scrollToActiveTab();
} else if (activeKey !== prevActiveKey) {
setActiveKey(activeKey); // can not use props.activeKey
scrollToActiveTab();
}
}, [setNextPrev, isNextPrevShown, prev, next, activeKey, prevActiveKey]);
(0, _react.useEffect)(function () {
var debouncedResize = (0, _debounce["default"])(function () {
setNextPrev();
scrollToActiveTab();
}, 200);
resizeEvent.addEventListener('resize', debouncedResize);
return function () {
resizeEvent.removeEventListener('resize', debouncedResize);
debouncedResize.cancel();
};
}, [setNextPrev, scrollToActiveTab, resizeEvent]); // 内容变化判断是否显示更多
(0, _react.useEffect)(function () {
setNextPrev();
}, [getContent]);
var inkBarNode = getInkBarNode();
var tabs = getTabs();
var groupNode = getGroupNode();
var scrollbarNode = getScrollBarNode([inkBarNode, tabs]);
var classString = (0, _classnames7["default"])("".concat(prefixCls, "-bar"), (0, _defineProperty2["default"])({}, "".concat(prefixCls, "-bar-with-groups"), groupNode), className);
var tabBarProps = {
role: 'tablist',
className: classString,
ref: rootRef,
style: style
};
if (keyboard) {
tabBarProps.tabIndex = 0;
tabBarProps.onKeyDown = handleKeyDown;
}
return /*#__PURE__*/_react["default"].createElement(_resizeObserver["default"], {
resizeProp: (0, _utils.isVertical)(tabBarPosition) ? 'height' : 'width',
onResize: (0, _debounce["default"])(function () {
setNextPrev();
scrollToActiveTab();
}, 200)
}, /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({}, tabBarProps, (0, _utils.getDataAttr)(restProps)), /*#__PURE__*/_react["default"].createElement("div", {
className: "".concat(prefixCls, "-bar-inner")
}, groupNode, groupNode && /*#__PURE__*/_react["default"].createElement("div", {
className: "".concat(prefixCls, "-bar-divider")
}), getContent(scrollbarNode))));
};
TabBar.displayName = 'TabBar';
TabBar.defaultProps = {
inkBarAnimated: true,
scrollAnimated: true
};
var _default = TabBar;
exports["default"] = _default;
//# sourceMappingURL=TabBar.js.map