UNPKG

@aplus-frontend/antdv

Version:

Vue basic component library maintained based on ant-design-vue

333 lines (331 loc) 12.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.tabsProps = exports.default = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _vue = require("vue"); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _TabNavList = _interopRequireDefault(require("./TabNavList")); var _TabPanelList = _interopRequireDefault(require("./TabPanelList")); var _propsUtil = require("../../_util/props-util"); var _useConfigInject = _interopRequireDefault(require("../../config-provider/hooks/useConfigInject")); var _useState = _interopRequireDefault(require("../../_util/hooks/useState")); var _isMobile = _interopRequireDefault(require("../../vc-util/isMobile")); var _useMergedState = _interopRequireDefault(require("../../_util/hooks/useMergedState")); var _classNames = _interopRequireDefault(require("../../_util/classNames")); var _CloseOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/CloseOutlined")); var _PlusOutlined = _interopRequireDefault(require("@ant-design/icons-vue/lib/icons/PlusOutlined")); var _devWarning = _interopRequireDefault(require("../../vc-util/devWarning")); var _TabContext = require("./TabContext"); var _type = require("../../_util/type"); var _pick = _interopRequireDefault(require("lodash/pick")); var _vueTypes = _interopRequireDefault(require("../../_util/vue-types")); var _omit = _interopRequireDefault(require("../../_util/omit")); var _style = _interopRequireDefault(require("../style")); // Accessibility https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/Tab_Role // Used for accessibility let uuid = 0; const tabsProps = () => { return { prefixCls: { type: String }, id: { type: String }, popupClassName: String, getPopupContainer: (0, _type.functionType)(), activeKey: { type: [String, Number] }, defaultActiveKey: { type: [String, Number] }, direction: (0, _type.stringType)(), animated: (0, _type.someType)([Boolean, Object]), renderTabBar: (0, _type.functionType)(), tabBarGutter: { type: Number }, tabBarStyle: (0, _type.objectType)(), tabPosition: (0, _type.stringType)(), destroyInactiveTabPane: (0, _type.booleanType)(), hideAdd: Boolean, type: (0, _type.stringType)(), size: (0, _type.stringType)(), centered: Boolean, onEdit: (0, _type.functionType)(), onChange: (0, _type.functionType)(), onTabClick: (0, _type.functionType)(), onTabScroll: (0, _type.functionType)(), 'onUpdate:activeKey': (0, _type.functionType)(), // Accessibility locale: (0, _type.objectType)(), onPrevClick: (0, _type.functionType)(), onNextClick: (0, _type.functionType)(), tabBarExtraContent: _vueTypes.default.any }; }; exports.tabsProps = tabsProps; function parseTabList(children) { return children.map(node => { if ((0, _propsUtil.isValidElement)(node)) { const props = (0, _extends2.default)({}, node.props || {}); for (const [k, v] of Object.entries(props)) { delete props[k]; props[(0, _propsUtil.camelize)(k)] = v; } const slots = node.children || {}; const key = node.key !== undefined ? node.key : undefined; const { tab = slots.tab, disabled, forceRender, closable, animated, active, destroyInactiveTabPane } = props; return (0, _extends2.default)((0, _extends2.default)({ key }, props), { node, closeIcon: slots.closeIcon, tab, disabled: disabled === '' || disabled, forceRender: forceRender === '' || forceRender, closable: closable === '' || closable, animated: animated === '' || animated, active: active === '' || active, destroyInactiveTabPane: destroyInactiveTabPane === '' || destroyInactiveTabPane }); } return null; }).filter(tab => tab); } const InternalTabs = (0, _vue.defineComponent)({ compatConfig: { MODE: 3 }, name: 'InternalTabs', inheritAttrs: false, props: (0, _extends2.default)((0, _extends2.default)({}, (0, _propsUtil.initDefaultProps)(tabsProps(), { tabPosition: 'top', animated: { inkBar: true, tabPane: false } })), { tabs: (0, _type.arrayType)() }), slots: Object, // emits: ['tabClick', 'tabScroll', 'change', 'update:activeKey'], setup(props, _ref) { let { attrs, slots } = _ref; (0, _devWarning.default)(!(props.onPrevClick !== undefined) && !(props.onNextClick !== undefined), 'Tabs', '`onPrevClick / @prevClick` and `onNextClick / @nextClick` has been removed. Please use `onTabScroll / @tabScroll` instead.'); (0, _devWarning.default)(!(props.tabBarExtraContent !== undefined), 'Tabs', '`tabBarExtraContent` prop has been removed. Please use `rightExtra` slot instead.'); (0, _devWarning.default)(!(slots.tabBarExtraContent !== undefined), 'Tabs', '`tabBarExtraContent` slot is deprecated. Please use `rightExtra` slot instead.'); const { prefixCls, direction, size, rootPrefixCls, getPopupContainer } = (0, _useConfigInject.default)('tabs', props); const [wrapSSR, hashId] = (0, _style.default)(prefixCls); const rtl = (0, _vue.computed)(() => direction.value === 'rtl'); const mergedAnimated = (0, _vue.computed)(() => { const { animated, tabPosition } = props; if (animated === false || ['left', 'right'].includes(tabPosition)) { return { inkBar: false, tabPane: false }; } else if (animated === true) { return { inkBar: true, tabPane: true }; } else { return (0, _extends2.default)({ inkBar: true, tabPane: false }, typeof animated === 'object' ? animated : {}); } }); // ======================== Mobile ======================== const [mobile, setMobile] = (0, _useState.default)(false); (0, _vue.onMounted)(() => { // Only update on the client side setMobile((0, _isMobile.default)()); }); // ====================== Active Key ====================== const [mergedActiveKey, setMergedActiveKey] = (0, _useMergedState.default)(() => { var _a; return (_a = props.tabs[0]) === null || _a === void 0 ? void 0 : _a.key; }, { value: (0, _vue.computed)(() => props.activeKey), defaultValue: props.defaultActiveKey }); const [activeIndex, setActiveIndex] = (0, _useState.default)(() => props.tabs.findIndex(tab => tab.key === mergedActiveKey.value)); (0, _vue.watchEffect)(() => { var _a; let newActiveIndex = props.tabs.findIndex(tab => tab.key === mergedActiveKey.value); if (newActiveIndex === -1) { newActiveIndex = Math.max(0, Math.min(activeIndex.value, props.tabs.length - 1)); setMergedActiveKey((_a = props.tabs[newActiveIndex]) === null || _a === void 0 ? void 0 : _a.key); } setActiveIndex(newActiveIndex); }); // ===================== Accessibility ==================== const [mergedId, setMergedId] = (0, _useMergedState.default)(null, { value: (0, _vue.computed)(() => props.id) }); const mergedTabPosition = (0, _vue.computed)(() => { if (mobile.value && !['left', 'right'].includes(props.tabPosition)) { return 'top'; } else { return props.tabPosition; } }); (0, _vue.onMounted)(() => { if (!props.id) { setMergedId(`rc-tabs-${process.env.NODE_ENV === 'test' ? 'test' : uuid}`); uuid += 1; } }); // ======================== Events ======================== const onInternalTabClick = (key, e) => { var _a, _b; (_a = props.onTabClick) === null || _a === void 0 ? void 0 : _a.call(props, key, e); const isActiveChanged = key !== mergedActiveKey.value; setMergedActiveKey(key); if (isActiveChanged) { (_b = props.onChange) === null || _b === void 0 ? void 0 : _b.call(props, key); } }; (0, _TabContext.useProvideTabs)({ tabs: (0, _vue.computed)(() => props.tabs), prefixCls }); return () => { const { id, type, tabBarGutter, tabBarStyle, locale, destroyInactiveTabPane, renderTabBar = slots.renderTabBar, onTabScroll, hideAdd, centered } = props; // ======================== Render ======================== const sharedProps = { id: mergedId.value, activeKey: mergedActiveKey.value, animated: mergedAnimated.value, tabPosition: mergedTabPosition.value, rtl: rtl.value, mobile: mobile.value }; let editable; if (type === 'editable-card') { editable = { onEdit: (editType, _ref2) => { let { key, event } = _ref2; var _a; (_a = props.onEdit) === null || _a === void 0 ? void 0 : _a.call(props, editType === 'add' ? event : key, editType); }, removeIcon: () => (0, _vue.createVNode)(_CloseOutlined.default, null, null), addIcon: slots.addIcon ? slots.addIcon : () => (0, _vue.createVNode)(_PlusOutlined.default, null, null), showAdd: hideAdd !== true }; } let tabNavBar; const tabNavBarProps = (0, _extends2.default)((0, _extends2.default)({}, sharedProps), { moreTransitionName: `${rootPrefixCls.value}-slide-up`, editable, locale, tabBarGutter, onTabClick: onInternalTabClick, onTabScroll, style: tabBarStyle, getPopupContainer: getPopupContainer.value, popupClassName: (0, _classNames.default)(props.popupClassName, hashId.value) }); if (renderTabBar) { tabNavBar = renderTabBar((0, _extends2.default)((0, _extends2.default)({}, tabNavBarProps), { DefaultTabBar: _TabNavList.default })); } else { tabNavBar = (0, _vue.createVNode)(_TabNavList.default, tabNavBarProps, (0, _pick.default)(slots, ['moreIcon', 'leftExtra', 'rightExtra', 'tabBarExtraContent'])); } const pre = prefixCls.value; return wrapSSR((0, _vue.createVNode)("div", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, attrs), {}, { "id": id, "class": (0, _classNames.default)(pre, `${pre}-${mergedTabPosition.value}`, { [hashId.value]: true, [`${pre}-${size.value}`]: size.value, [`${pre}-card`]: ['card', 'editable-card'].includes(type), [`${pre}-editable-card`]: type === 'editable-card', [`${pre}-centered`]: centered, [`${pre}-mobile`]: mobile.value, [`${pre}-editable`]: type === 'editable-card', [`${pre}-rtl`]: rtl.value }, attrs.class) }), [tabNavBar, (0, _vue.createVNode)(_TabPanelList.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({ "destroyInactiveTabPane": destroyInactiveTabPane }, sharedProps), {}, { "animated": mergedAnimated.value }), null)])); }; } }); var _default = exports.default = (0, _vue.defineComponent)({ compatConfig: { MODE: 3 }, name: 'ATabs', inheritAttrs: false, props: (0, _propsUtil.initDefaultProps)(tabsProps(), { tabPosition: 'top', animated: { inkBar: true, tabPane: false } }), slots: Object, // emits: ['tabClick', 'tabScroll', 'change', 'update:activeKey'], setup(props, _ref3) { let { attrs, slots, emit } = _ref3; const handleChange = key => { emit('update:activeKey', key); emit('change', key); }; return () => { var _a; const tabs = parseTabList((0, _propsUtil.flattenChildren)((_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots))); return (0, _vue.createVNode)(InternalTabs, (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _omit.default)(props, ['onUpdate:activeKey'])), attrs), {}, { "onChange": handleChange, "tabs": tabs }), slots); }; } });