choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
313 lines (265 loc) • 12 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
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 _classnames2 = _interopRequireDefault(require("classnames"));
var _modalProvider = _interopRequireDefault(require("../../pro/lib/modal-provider"));
var _enum = require("./enum");
var _utils = require("./utils");
var _enum2 = require("../_util/enum");
var _configure = require("../configure");
var _warning = _interopRequireDefault(require("../_util/warning"));
var _TabBar = _interopRequireDefault(require("./TabBar"));
var _icon = _interopRequireDefault(require("../icon"));
var _TabContent = _interopRequireDefault(require("./TabContent"));
var _isFlexSupported = _interopRequireDefault(require("../_util/isFlexSupported"));
var _TabsContext = _interopRequireDefault(require("./TabsContext"));
function isAnimated(animated) {
return (0, _typeof2["default"])(animated) === 'object';
}
var TabsWithContext = function TabsWithContext(props) {
var _classnames;
var tabPosition = props.tabPosition,
className = props.className,
destroyInactiveTabPane = props.destroyInactiveTabPane,
style = props.style,
size = props.size,
type = props.type,
tabBarStyle = props.tabBarStyle,
_props$inkBarStyle = props.inkBarStyle,
inkBarStyle = _props$inkBarStyle === void 0 ? (0, _configure.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,
onPrevClick = props.onPrevClick,
onNextClick = props.onNextClick,
keyboard = props.keyboard,
restProps = (0, _objectWithoutProperties2["default"])(props, ["tabPosition", "className", "destroyInactiveTabPane", "style", "size", "type", "tabBarStyle", "inkBarStyle", "hideAdd", "animated", "tabBarGutter", "onEdit", "tabBarExtraContent", "hideOnlyGroup", "customizedCode", "customizable", "children", "defaultActiveKey", "setCustomized", "customized", "prefixCls", "activeKey", "onChange", "onTabClick", "onPrevClick", "onNextClick", "keyboard"]);
var hasPropActiveKey = 'activeKey' in props;
var prefixCls = (0, _configure.getPrefixCls)('tabs', customizePrefixCls);
var saveCustomized = (0, _react.useCallback)(function (newCustomized) {
if (customizable) {
setCustomized(newCustomized);
if (customizedCode) {
var customizedSave = (0, _configure.getConfig)('customizedSave');
customizedSave(customizedCode, newCustomized, 'Tabs');
}
}
}, [customizable, customizedCode]);
var _useMemo = (0, _react.useMemo)(function () {
return (0, _utils.normalizePanes)(children, customized);
}, [children, customized]),
_useMemo2 = (0, _slicedToArray2["default"])(_useMemo, 2),
totalPanelsMap = _useMemo2[0],
groupedPanelsMap = _useMemo2[1];
var defaultActiveKey = (0, _react.useMemo)(function () {
var option = {
activeKey: propActiveKey,
defaultActiveKey: propDefaultActiveKey
};
return (0, _utils.getDefaultActiveKey)(totalPanelsMap, groupedPanelsMap, option);
}, []);
var actuallyDefaultActiveKey = (0, _react.useMemo)(function () {
if (customized) {
var $defaultActiveKey = customized.defaultActiveKey;
if ($defaultActiveKey !== undefined) {
if (onChange && $defaultActiveKey !== defaultActiveKey) {
onChange($defaultActiveKey);
}
return $defaultActiveKey;
}
}
return defaultActiveKey;
}, [defaultActiveKey]);
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 _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = groupedPanelsMap[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var _step$value = (0, _slicedToArray2["default"])(_step.value, 2),
groupKey = _step$value[0],
panelsMap = _step$value[1].panelsMap;
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = panelsMap[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var _step2$value = (0, _slicedToArray2["default"])(_step2.value, 1),
panelKey = _step2$value[0];
if (panelKey === activeKey) {
return groupKey;
}
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
_iterator2["return"]();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator["return"] != null) {
_iterator["return"]();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
return (0, _utils.getDefaultGroupKey)(groupedPanelsMap);
}
}, [groupedPanelsMap, activeKey]);
var currentGroup = activeGroupKey && groupedPanelsMap.get(activeGroupKey);
var currentPanelMap = currentGroup ? currentGroup.panelsMap : totalPanelsMap;
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 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,
onTabClick: onTabClick,
onPrevClick: onPrevClick,
onNextClick: onNextClick,
children: children
};
var inkBarAnimated = isAnimated(animated) ? animated.inkBar : animated;
var tabPaneAnimated = isAnimated(animated) ? animated.tabPane : animated; // card tabs should not have animation
if (type !== _enum.TabsType.line) {
tabPaneAnimated = 'animated' in props ? 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 createNewTab = (0, _react.useCallback)(function (e) {
if (onEdit) {
onEdit(e, 'add');
}
}, [onEdit]);
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]);
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, "-no-animation"), !tabPaneAnimated), (0, _defineProperty2["default"])(_classnames, 'no-flex', !(0, _isFlexSupported["default"])()), _classnames), className);
var extraContent = !hideAdd && type === _enum.TabsType['editable-card'] ? // Add new tab handler
_react["default"].createElement("span", {
key: "tabBarExtraContent"
}, _react["default"].createElement(_icon["default"], {
type: "add",
className: "".concat(prefixCls, "-new-tab"),
onClick: createNewTab
}), tabBarExtraContent) : tabBarExtraContent;
var tabBarProps = {
inkBarAnimated: inkBarAnimated,
extraContent: extraContent,
style: tabBarStyle,
tabBarGutter: tabBarGutter,
type: type,
onRemoveTab: removeTab,
inkBarStyle: inkBarStyle
};
var tabContentProps = {
animatedWithMargin: true,
animated: tabPaneAnimated,
destroyInactiveTabPane: destroyInactiveTabPane
};
var contents = [_react["default"].createElement(_TabBar["default"], (0, _extends2["default"])({
key: "tabBar"
}, tabBarProps)), _react["default"].createElement(_TabContent["default"], (0, _extends2["default"])({
key: "tabContent"
}, tabContentProps))];
if (tabPosition === _enum.TabsPosition.bottom) {
contents.reverse();
}
var tabs = _react["default"].createElement("div", (0, _extends2["default"])({
className: cls,
style: style
}, (0, _utils.getDataAttr)(restProps)), contents);
return _react["default"].createElement(_TabsContext["default"].Provider, {
value: value
}, customizable ? _react["default"].createElement(_modalProvider["default"], null, tabs) : tabs);
};
TabsWithContext.displayName = 'TabsWithContext';
var _default = TabsWithContext;
exports["default"] = _default;
//# sourceMappingURL=TabsWithContext.js.map