UNPKG

wetrade-design

Version:

一款多语言支持Vue3的UI框架

384 lines 14.2 kB
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty"; import _typeof from "@babel/runtime/helpers/esm/typeof"; import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2"; import { resolveDirective as _resolveDirective, createVNode as _createVNode } from "vue"; // Accessibility https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/Tab_Role import TabNavList from './TabNavList'; import TabPanelList from './TabPanelList'; import Icon from '../../icon'; import { defineComponent, computed, onMounted, watchEffect, camelize } from 'vue'; import { flattenChildren, initDefaultProps, isValidElement } from '../../_util/props-util'; import useConfigInject from '../../_util/hooks/useConfigInject'; import useState from '../../_util/hooks/useState'; import isMobile from '../../vc-util/isMobile'; import useMergedState from '../../_util/hooks/useMergedState'; import classNames from '../../_util/classNames'; // import CloseOutlined from '@ant-design/icons-vue/CloseOutlined'; // import PlusOutlined from '@ant-design/icons-vue/PlusOutlined'; import devWarning from '../../vc-util/devWarning'; import { useProvideTabs } from './TabContext'; import pick from 'lodash-es/pick'; import PropTypes from '../../_util/vue-types'; import omit from '../../_util/omit'; // Used for accessibility var uuid = 0; export var tabsProps = function tabsProps() { return { prefixCls: { type: String }, id: { type: String }, activeKey: { type: [String, Number] }, defaultActiveKey: { type: [String, Number] }, direction: { type: String }, animated: { type: [Boolean, Object] }, renderTabBar: { type: Function }, tabBarGutter: { type: Number }, tabBarStyle: { type: Object }, tabPosition: { type: String }, destroyInactiveTabPane: { type: Boolean }, showAdd: Boolean, marginOfLineTab: Number, type: { type: String }, size: { type: String }, centered: Boolean, onAdd: { type: Function }, onChange: { type: Function }, onTabClick: { type: Function }, onTabScroll: { type: Function }, 'onUpdate:activeKey': { type: Function }, // Accessibility locale: { type: Object, default: undefined }, onPrevClick: Function, onNextClick: Function, tabBarExtraContent: PropTypes.any, onMousedown: Function, preventScroll: Boolean, overlayClassName: { type: String }, overlayEllipsis: { type: Boolean } }; }; function parseTabList(children) { return children.map(function (node) { if (isValidElement(node)) { var props = _objectSpread({}, node.props || {}); for (var _i = 0, _Object$entries = Object.entries(props); _i < _Object$entries.length; _i++) { var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), k = _Object$entries$_i[0], v = _Object$entries$_i[1]; delete props[k]; props[camelize(k)] = v; } var slots = node.children || {}; var key = node.key !== undefined ? node.key : undefined; var _props$tab = props.tab, tab = _props$tab === void 0 ? slots.tab : _props$tab, disabled = props.disabled, forceRender = props.forceRender, closable = props.closable, animated = props.animated, active = props.active, destroyInactiveTabPane = props.destroyInactiveTabPane; return _objectSpread(_objectSpread({ key: key }, props), {}, { node: node, closeIcon: slots.closeIcon, tab: tab, disabled: disabled === '' || disabled, forceRender: forceRender === '' || forceRender, closable: closable === '' || closable, animated: animated === '' || animated, active: active === '' || active, destroyInactiveTabPane: destroyInactiveTabPane === '' || destroyInactiveTabPane }); } return null; }).filter(function (tab) { return tab; }); } var InternalTabs = defineComponent({ compatConfig: { MODE: 3 }, name: 'InternalTabs', inheritAttrs: false, props: _objectSpread(_objectSpread({}, initDefaultProps(tabsProps(), { tabPosition: 'top', animated: { inkBar: true, tabPane: false } })), {}, { tabs: { type: Array } }), slots: ['tabBarExtraContent', 'leftExtra', 'rightExtra', 'moreIcon', 'addIcon', 'removeIcon', 'renderTabBar'], // emits: ['tabClick', 'tabScroll', 'change', 'update:activeKey'], setup: function setup(props, _ref) { var attrs = _ref.attrs, slots = _ref.slots; devWarning(!(props.onPrevClick !== undefined) && !(props.onNextClick !== undefined), 'Tabs', '`onPrevClick / @prevClick` and `onNextClick / @nextClick` has been removed. Please use `onTabScroll / @tabScroll` instead.'); devWarning(!(props.tabBarExtraContent !== undefined), 'Tabs', '`tabBarExtraContent` prop has been removed. Please use `rightExtra` slot instead.'); devWarning(!(slots.tabBarExtraContent !== undefined), 'Tabs', '`tabBarExtraContent` slot is deprecated. Please use `rightExtra` slot instead.'); var _useConfigInject = useConfigInject('tabs', props), prefixCls = _useConfigInject.prefixCls, direction = _useConfigInject.direction, size = _useConfigInject.size; var rtl = computed(function () { return direction.value === 'rtl'; }); var mergedAnimated = computed(function () { var animated = props.animated, tabPosition = props.tabPosition; if (animated === false || ['left', 'right'].includes(tabPosition)) { return { inkBar: false, tabPane: false }; } else if (animated === true) { return { inkBar: true, tabPane: true }; } else { return _objectSpread({ inkBar: true, tabPane: false }, _typeof(animated) === 'object' ? animated : {}); } }); // ======================== Mobile ======================== var _useState = useState(false), _useState2 = _slicedToArray(_useState, 2), mobile = _useState2[0], setMobile = _useState2[1]; onMounted(function () { // Only update on the client side setMobile(isMobile()); }); // ====================== Active Key ====================== var _useMergedState = useMergedState(function () { var _props$tabs$; return (_props$tabs$ = props.tabs[0]) === null || _props$tabs$ === void 0 ? void 0 : _props$tabs$.key; }, { value: computed(function () { return props.activeKey; }), defaultValue: props.defaultActiveKey }), _useMergedState2 = _slicedToArray(_useMergedState, 2), mergedActiveKey = _useMergedState2[0], setMergedActiveKey = _useMergedState2[1]; var _useState3 = useState(function () { return props.tabs.findIndex(function (tab) { return tab.key === mergedActiveKey.value; }); }), _useState4 = _slicedToArray(_useState3, 2), activeIndex = _useState4[0], setActiveIndex = _useState4[1]; watchEffect(function () { var newActiveIndex = props.tabs.findIndex(function (tab) { return tab.key === mergedActiveKey.value; }); if (newActiveIndex === -1) { var _props$tabs$newActive; newActiveIndex = Math.max(0, Math.min(activeIndex.value, props.tabs.length - 1)); setMergedActiveKey((_props$tabs$newActive = props.tabs[newActiveIndex]) === null || _props$tabs$newActive === void 0 ? void 0 : _props$tabs$newActive.key); } setActiveIndex(newActiveIndex); }); // ===================== Accessibility ==================== var _useMergedState3 = useMergedState(null, { value: computed(function () { return props.id; }) }), _useMergedState4 = _slicedToArray(_useMergedState3, 2), mergedId = _useMergedState4[0], setMergedId = _useMergedState4[1]; var mergedTabPosition = computed(function () { if (mobile.value && !['left', 'right'].includes(props.tabPosition)) { return 'top'; } else { return props.tabPosition; } }); onMounted(function () { if (!props.id) { setMergedId("rc-tabs-".concat(process.env.NODE_ENV === 'test' ? 'test' : uuid)); uuid += 1; } }); // ======================== Events ======================== var onInternalTabClick = function onInternalTabClick(key, e) { var _props$onTabClick; (_props$onTabClick = props.onTabClick) === null || _props$onTabClick === void 0 ? void 0 : _props$onTabClick.call(props, key, e); var isActiveChanged = key !== mergedActiveKey.value; setMergedActiveKey(key); if (isActiveChanged) { var _props$onChange; (_props$onChange = props.onChange) === null || _props$onChange === void 0 ? void 0 : _props$onChange.call(props, key); } }; useProvideTabs({ tabs: computed(function () { return props.tabs; }), prefixCls: prefixCls }); return function () { var _classNames; var id = props.id, type = props.type, tabBarGutter = props.tabBarGutter, overlayClassName = props.overlayClassName, overlayEllipsis = props.overlayEllipsis, tabBarStyle = props.tabBarStyle, locale = props.locale, destroyInactiveTabPane = props.destroyInactiveTabPane, _props$renderTabBar = props.renderTabBar, renderTabBar = _props$renderTabBar === void 0 ? slots.renderTabBar : _props$renderTabBar, onTabScroll = props.onTabScroll, showAdd = props.showAdd, centered = props.centered, marginOfLineTab = props.marginOfLineTab, preventScroll = props.preventScroll; // ======================== Render ======================== var sharedProps = { id: mergedId.value, activeKey: mergedActiveKey.value, animated: mergedAnimated.value, tabPosition: mergedTabPosition.value, rtl: rtl.value, mobile: mobile.value }; // let editable: EditableConfig | undefined; var editable = { onAdd: function onAdd() { var _props$onAdd; (_props$onAdd = props.onAdd) === null || _props$onAdd === void 0 ? void 0 : _props$onAdd.call(props); }, // removeIcon: () => <CloseOutlined />, addIcon: slots.addIcon ? slots.addIcon : function () { return _createVNode(Icon, { "icon-class": "wd-icon-tips_plus" }, null); }, showAdd: showAdd }; var tabNavBar; var tabNavBarProps = _objectSpread(_objectSpread({}, sharedProps), {}, { // moreTransitionName: `${rootPrefixCls.value}-slide-up`, moreTransitionName: '', editable: editable, locale: locale, tabBarGutter: tabBarGutter, overlayClassName: overlayClassName, overlayEllipsis: overlayEllipsis, type: type, marginOfLineTab: marginOfLineTab, onTabClick: onInternalTabClick, onTabScroll: onTabScroll, style: tabBarStyle, preventScroll: preventScroll }); if (renderTabBar) { tabNavBar = renderTabBar(_objectSpread(_objectSpread({}, tabNavBarProps), {}, { DefaultTabBar: TabNavList })); } else { tabNavBar = _createVNode(TabNavList, tabNavBarProps, pick(slots, ['moreIcon', 'leftExtra', 'rightExtra', 'tabBarExtraContent'])); } var pre = prefixCls.value; return _createVNode("div", _objectSpread(_objectSpread({}, attrs), {}, { "id": id, "class": classNames(pre, "".concat(pre, "-").concat(mergedTabPosition.value), (_classNames = {}, _defineProperty(_classNames, "".concat(pre, "-").concat(size.value), size.value), _defineProperty(_classNames, "".concat(pre, "-card"), ['card', 'editable-card'].includes(type)), _defineProperty(_classNames, "".concat(pre, "-editable-card"), type === 'editable-card'), _defineProperty(_classNames, "".concat(pre, "-button"), type === 'button'), _defineProperty(_classNames, "".concat(pre, "-text"), type === 'text'), _defineProperty(_classNames, "".concat(pre, "-centered"), centered), _defineProperty(_classNames, "".concat(pre, "-mobile"), mobile.value), _defineProperty(_classNames, "".concat(pre, "-editable"), type === 'editable-card'), _defineProperty(_classNames, "".concat(pre, "-rtl"), rtl.value), _classNames), attrs.class), "onMousedown": props.onMousedown }), [tabNavBar, _createVNode(TabPanelList, _objectSpread(_objectSpread({ "destroyInactiveTabPane": destroyInactiveTabPane }, sharedProps), {}, { "animated": mergedAnimated.value }), null)]); }; } }); export default defineComponent({ compatConfig: { MODE: 3 }, name: 'WdTabs', inheritAttrs: false, props: initDefaultProps(tabsProps(), { tabPosition: 'top', animated: { inkBar: true, tabPane: false } }), slots: ['tabBarExtraContent', 'leftExtra', 'rightExtra', 'moreIcon', 'addIcon', 'removeIcon', 'renderTabBar'], // emits: ['tabClick', 'tabScroll', 'change', 'update:activeKey'], setup: function setup(props, _ref2) { var attrs = _ref2.attrs, slots = _ref2.slots, emit = _ref2.emit; var handleChange = function handleChange(key) { emit('update:activeKey', key); emit('change', key); }; return function () { var _slots$default; var tabs = parseTabList(flattenChildren((_slots$default = slots.default) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots))); return _createVNode(InternalTabs, _objectSpread(_objectSpread(_objectSpread({}, omit(props, ['onUpdate:activeKey'])), attrs), {}, { "onMousedown": props.onMousedown, "onChange": handleChange, "tabs": tabs }), slots); }; } });