choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
411 lines (344 loc) • 15.2 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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _react = _interopRequireWildcard(require("react"));
var _mobx = require("mobx");
var _classnames2 = _interopRequireDefault(require("classnames"));
var _modalProvider = _interopRequireDefault(require("../../pro/lib/modal-provider"));
var _iteratorUtils = require("../../pro/lib/_util/iteratorUtils");
var _getReactNodeText = _interopRequireDefault(require("../../pro/lib/_util/getReactNodeText"));
var _enum = require("./enum");
var _utils = require("./utils");
var _enum2 = require("../_util/enum");
var _warning = _interopRequireDefault(require("../_util/warning"));
var _TabBar = _interopRequireDefault(require("./TabBar"));
var _TabContent = _interopRequireDefault(require("./TabContent"));
var _isFlexSupported = _interopRequireDefault(require("../_util/isFlexSupported"));
var _KeyCode = _interopRequireDefault(require("../_util/KeyCode"));
var _TabsContext = _interopRequireDefault(require("./TabsContext"));
var _ConfigContext = _interopRequireDefault(require("../config-provider/ConfigContext"));
var _excluded = ["tabPosition", "className", "destroyInactiveTabPane", "style", "size", "type", "showMore", "tabBarStyle", "inkBarStyle", "hideAdd", "animated", "tabBarGutter", "onEdit", "tabBarExtraContent", "hideOnlyGroup", "customizedCode", "customizable", "children", "defaultActiveKey", "setCustomized", "customized", "prefixCls", "activeKey", "onChange", "onTabClick", "keyboard", "defaultChangeable", "tabDraggable", "tabTitleEditable", "tabCountHideable", "rippleDisabled", "flex", "restoreDefault"];
function handleScroll(e) {
var currentTarget = e.currentTarget;
var ownerDocument = currentTarget.ownerDocument;
if (ownerDocument) {
var defaultView = ownerDocument.defaultView;
if (defaultView) {
var computedStyle = defaultView.getComputedStyle(currentTarget);
if (computedStyle.overflowX === 'hidden') {
currentTarget.scrollLeft = 0;
}
if (computedStyle.overflowY === 'hidden') {
currentTarget.scrollTop = 0;
}
}
}
}
function isAnimated(animated) {
return (0, _typeof2["default"])(animated) === 'object';
}
var TabsWithContext = function TabsWithContext(props) {
var _classnames;
var _useContext = (0, _react.useContext)(_ConfigContext["default"]),
getConfig = _useContext.getConfig,
getPrefixCls = _useContext.getPrefixCls;
var tabPosition = props.tabPosition,
className = props.className,
destroyInactiveTabPane = props.destroyInactiveTabPane,
style = props.style,
size = props.size,
type = props.type,
showMore = props.showMore,
tabBarStyle = props.tabBarStyle,
_props$inkBarStyle = props.inkBarStyle,
inkBarStyle = _props$inkBarStyle === void 0 ? getConfig('tabsInkBarStyle') : _props$inkBarStyle,
hideAdd = props.hideAdd,
_props$animated = props.animated,
animated = _props$animated === void 0 ? true : _props$animated,
tabBarGutter = props.tabBarGutter,
onEdit = props.onEdit,
tabBarExtraContent = props.tabBarExtraContent,
hideOnlyGroup = props.hideOnlyGroup,
customizedCode = props.customizedCode,
customizable = props.customizable,
children = props.children,
propDefaultActiveKey = props.defaultActiveKey,
setCustomized = props.setCustomized,
customized = props.customized,
customizePrefixCls = props.prefixCls,
propActiveKey = props.activeKey,
onChange = props.onChange,
onTabClick = props.onTabClick,
keyboard = props.keyboard,
propDefaultChangeable = props.defaultChangeable,
tabDraggable = props.tabDraggable,
tabTitleEditable = props.tabTitleEditable,
tabCountHideable = props.tabCountHideable,
rippleDisabled = props.rippleDisabled,
flex = props.flex,
restoreDefault = props.restoreDefault,
restProps = (0, _objectWithoutProperties2["default"])(props, _excluded);
var hasPropActiveKey = ('activeKey' in props);
var prefixCls = getPrefixCls('tabs', customizePrefixCls);
var saveCustomized = (0, _react.useCallback)(function (newCustomized) {
if (customizable) {
setCustomized(newCustomized);
if (customizedCode) {
var customizedSave = getConfig('customizedSave');
customizedSave(customizedCode, newCustomized, 'Tabs');
}
}
}, [customizable, customizedCode]);
var _useMemo = (0, _react.useMemo)(function () {
return (0, _utils.normalizePanes)(children, customized, {
tabDraggable: tabDraggable,
tabTitleEditable: tabTitleEditable,
tabCountHideable: tabCountHideable
});
}, [children, customized, tabDraggable, tabTitleEditable, tabCountHideable]),
_useMemo2 = (0, _slicedToArray2["default"])(_useMemo, 2),
totalPanelsMap = _useMemo2[0],
groupedPanelsMap = _useMemo2[1];
var defaultChangeable = (0, _react.useMemo)(function () {
if (propDefaultChangeable !== undefined) {
return propDefaultChangeable;
}
var tabsDefaultChangeable = getConfig('tabsDefaultChangeable');
return tabsDefaultChangeable;
}, []);
var defaultActiveKey = (0, _react.useMemo)(function () {
var option = {
activeKey: propActiveKey,
defaultActiveKey: propDefaultActiveKey
};
return (0, _utils.getDefaultActiveKey)(totalPanelsMap, groupedPanelsMap, option);
}, []);
var customizedDefaultActiveKey = (0, _react.useMemo)(function () {
if (defaultChangeable && customized) {
var $defaultActiveKey = customized.defaultActiveKey;
if ($defaultActiveKey !== undefined) {
var pane = totalPanelsMap.get($defaultActiveKey);
if (pane && !pane.disabled) {
return $defaultActiveKey;
}
}
}
}, [defaultChangeable, customized, totalPanelsMap]);
var actuallyDefaultActiveKey = (0, _react.useMemo)(function () {
if (customizedDefaultActiveKey !== undefined) {
if (onChange && customizedDefaultActiveKey !== defaultActiveKey) {
onChange(customizedDefaultActiveKey);
}
return customizedDefaultActiveKey;
}
return defaultActiveKey;
}, [defaultActiveKey, customizedDefaultActiveKey]);
var _useState = (0, _react.useState)(actuallyDefaultActiveKey),
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
activeKey = _useState2[0],
setActiveKey = _useState2[1];
var activeGroupKey = (0, _react.useMemo)(function () {
if (groupedPanelsMap.size) {
if (activeKey) {
var groupKey;
(0, _iteratorUtils.iteratorSome)(groupedPanelsMap.entries(), function (_ref) {
var _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
key = _ref2[0],
panelsMap = _ref2[1].panelsMap;
var found = (0, _iteratorUtils.iteratorSome)(panelsMap.keys(), function (panelKey) {
return panelKey === activeKey;
});
if (found) {
groupKey = key;
}
return found;
});
if (groupKey !== undefined) {
return groupKey;
}
}
return (0, _utils.getDefaultGroupKey)(groupedPanelsMap);
}
}, [groupedPanelsMap, activeKey]);
var currentGroup = activeGroupKey ? groupedPanelsMap.get(activeGroupKey) : undefined;
var currentPanelMap = currentGroup ? currentGroup.panelsMap : totalPanelsMap;
var refCurrent = {
activeGroupKey: activeGroupKey,
currentGroup: currentGroup,
currentPanelMap: currentPanelMap
};
var ref = (0, _react.useRef)(refCurrent);
ref.current = refCurrent;
var tabRef = (0, _react.useRef)(null);
var changeActiveKey = (0, _react.useCallback)(function (key, byGroup) {
if (activeKey !== key) {
if (!byGroup && currentGroup) {
currentGroup.lastActiveKey = key;
}
if (!hasPropActiveKey) {
setActiveKey(key);
}
if (onChange) {
onChange(key);
}
}
}, [hasPropActiveKey, activeKey, onChange, currentGroup]);
var validationMap = (0, _react.useMemo)(function () {
return _mobx.observable.map();
}, []);
var value = {
defaultActiveKey: propDefaultActiveKey,
actuallyDefaultActiveKey: actuallyDefaultActiveKey,
propActiveKey: propActiveKey,
prefixCls: prefixCls,
keyboard: keyboard,
tabBarPosition: tabPosition,
hideOnlyGroup: hideOnlyGroup,
customizable: customizable,
customized: customized,
saveCustomized: saveCustomized,
activeKey: activeKey,
activeGroupKey: activeGroupKey,
changeActiveKey: changeActiveKey,
groupedPanelsMap: groupedPanelsMap,
currentPanelMap: currentPanelMap,
totalPanelsMap: totalPanelsMap,
validationMap: validationMap,
onTabClick: onTabClick,
children: children,
tabDraggable: tabDraggable,
tabTitleEditable: tabTitleEditable,
tabCountHideable: tabCountHideable,
defaultChangeable: defaultChangeable,
rippleDisabled: rippleDisabled,
restoreDefault: restoreDefault
};
var inkBarAnimated = isAnimated(animated) ? animated.inkBar : animated;
var tabPaneAnimated = isAnimated(animated) ? animated.tabPane : animated;
var onTabsChange = getConfig('onTabsChange'); // card tabs should not have animation
if (type !== _enum.TabsType.line) {
tabPaneAnimated = 'animated' in props ? tabPaneAnimated : false;
}
if (flex) {
tabPaneAnimated = false;
}
var isCard = type === _enum.TabsType.card || type === _enum.TabsType['editable-card'];
(0, _warning["default"])(!(isCard && (size === _enum2.Size.small || size === _enum2.Size.large)), 'Tabs[type=card|editable-card] doesn\'t have small or large size, it\'s by designed.');
var removeTab = (0, _react.useCallback)(function (targetKey, e) {
e.stopPropagation();
if (!targetKey) {
return;
}
if (onEdit) {
onEdit(targetKey, 'remove');
}
}, [onEdit]);
(0, _react.useEffect)(function () {
if (hasPropActiveKey) {
if (propActiveKey !== activeKey) {
setActiveKey(propActiveKey);
}
} else if (activeKey === undefined || !totalPanelsMap.has(activeKey)) {
setActiveKey((0, _utils.getDefaultActiveKeyInGroup)(currentPanelMap));
}
}, [hasPropActiveKey, propActiveKey, activeKey, totalPanelsMap, currentPanelMap]);
(0, _react.useEffect)(function () {
if (onTabsChange && activeKey) {
var current = ref.current;
var currentPanel = current.currentPanelMap.get(activeKey);
if (currentPanel) {
var $currentGroup = current.currentGroup,
$activeGroupKey = current.activeGroupKey;
var groupTab = $currentGroup ? $currentGroup.group.tab : undefined;
var title = (0, _utils.getHeader)(currentPanel);
var promises = [(0, _getReactNodeText["default"])(title)];
if (groupTab) {
promises.push((0, _getReactNodeText["default"])(groupTab));
}
Promise.all(promises).then(function (_ref3) {
var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2),
title = _ref4[0],
groupTitle = _ref4[1];
onTabsChange({
activeKey: activeKey,
activeGroupKey: $activeGroupKey,
title: title,
groupTitle: groupTitle,
code: customizedCode
});
});
}
}
}, [activeKey, onTabsChange, customizedCode]);
var cls = (0, _classnames2["default"])(prefixCls, "".concat(prefixCls, "-").concat(tabPosition), "".concat(prefixCls, "-").concat(type), (0, _utils.isVertical)(tabPosition) ? "".concat(prefixCls, "-vertical") : "".concat(prefixCls, "-horizontal"), (_classnames = {}, (0, _defineProperty2["default"])(_classnames, "".concat(prefixCls, "-").concat(size), !!size), (0, _defineProperty2["default"])(_classnames, "".concat(prefixCls, "-card"), isCard), (0, _defineProperty2["default"])(_classnames, "".concat(prefixCls, "-flex"), flex), (0, _defineProperty2["default"])(_classnames, "".concat(prefixCls, "-no-animation"), !tabPaneAnimated), (0, _defineProperty2["default"])(_classnames, 'no-flex', !(0, _isFlexSupported["default"])()), _classnames), className);
var extraContent = !hideAdd && type === _enum.TabsType['editable-card'] ?
/*#__PURE__*/
// Add new tab handler
_react["default"].createElement("div", {
key: "tabBarExtraContent",
className: "".concat(prefixCls, "-extra-bar")
}, tabBarExtraContent) : tabBarExtraContent;
var tabBarProps = {
inkBarAnimated: inkBarAnimated,
extraContent: extraContent,
style: tabBarStyle,
tabBarGutter: tabBarGutter,
type: type,
showMore: showMore,
onRemoveTab: removeTab,
onEdit: onEdit,
inkBarStyle: inkBarStyle,
hideAdd: hideAdd
};
var tabContentProps = {
animatedWithMargin: true,
animated: tabPaneAnimated,
destroyInactiveTabPane: destroyInactiveTabPane
};
var contents = [/*#__PURE__*/_react["default"].createElement(_TabBar["default"], (0, _extends2["default"])({
key: "tabBar"
}, tabBarProps)), /*#__PURE__*/_react["default"].createElement(_TabContent["default"], (0, _extends2["default"])({
key: "tabContent"
}, tabContentProps))];
if (tabPosition === _enum.TabsPosition.bottom) {
contents.reverse();
}
var handleKeyDown = (0, _react.useCallback)(function (e) {
var keyCode = e.keyCode;
if (keyCode === _KeyCode["default"].TAB) {
if (tabRef.current) {
var selector = '[tabindex^="-1"]';
var findFocusableElements = Array.from(tabRef.current.querySelectorAll(selector));
findFocusableElements.forEach(function (child) {
if (child.getAttribute('data-node-key') === activeKey && document.activeElement === tabRef.current) {
child.focus();
}
});
}
}
}, [activeKey]);
var tabs = /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({
tabIndex: -1,
ref: tabRef,
className: cls,
style: style,
onScrollCapture: tabPaneAnimated ? handleScroll : undefined,
onKeyDown: handleKeyDown
}, (0, _utils.getDataAttr)(restProps)), contents);
return /*#__PURE__*/_react["default"].createElement(_TabsContext["default"].Provider, {
value: value
}, customizable ? /*#__PURE__*/_react["default"].createElement(_modalProvider["default"], null, tabs) : tabs);
};
TabsWithContext.displayName = 'TabsWithContext';
var _default = TabsWithContext;
exports["default"] = _default;
//# sourceMappingURL=TabsWithContext.js.map