diff --git a/packages/ui-vue/components/tabs/src/components/tab-page.props.ts b/packages/ui-vue/components/tabs/src/components/tab-page.props.ts index 9950369829ba9c5ea40718663ca5e7b4d6939305..4bcacc211738ab895e8da4838705a9ee87bab438 100644 --- a/packages/ui-vue/components/tabs/src/components/tab-page.props.ts +++ b/packages/ui-vue/components/tabs/src/components/tab-page.props.ts @@ -1,4 +1,5 @@ -import { ExtractPropTypes } from 'vue'; +import { ExtractPropTypes, PropType } from 'vue'; +import { ToolbarPosition, ToolbarContentsConf } from '../composition/types' export const tabPageProps = { tabWidth: { type: Number, default: -1 }, @@ -9,6 +10,8 @@ export const tabPageProps = { selected: { type: Boolean, default: false }, disabled: { type: Boolean, default: false }, removeable: { type: Boolean, default: false }, - show: { type: Boolean, default: true } + show: { type: Boolean, default: true }, + toolbar: { type: Object as PropType }, + toolbarPosition: { type: String as PropType, default: 'inContent' } }; export type TabPageProps = ExtractPropTypes; diff --git a/packages/ui-vue/components/tabs/src/composition/types.ts b/packages/ui-vue/components/tabs/src/composition/types.ts index df06a3f6386a26e3c4254d3ed56bd76c9c5bdfae..e97b09081e56f59f81230824e5091b0cac5a931b 100644 --- a/packages/ui-vue/components/tabs/src/composition/types.ts +++ b/packages/ui-vue/components/tabs/src/composition/types.ts @@ -10,4 +10,13 @@ export interface TabsContext { addTab(props: TabContext): void, updateTab(props: TabContext): void, tabs: Ref -} \ No newline at end of file +} + +export type ToolbarPosition = 'inHead' | 'inContent'; +export interface ToolbarContentsConf { + id: string; + disable: boolean; + title: string; + click: Function; + appearance: object; +} diff --git a/packages/ui-vue/components/tabs/src/composition/use-tabs.ts b/packages/ui-vue/components/tabs/src/composition/use-tabs.ts index db498bb95498f79fda0beadf2ec4aa3f75eadcc6..238122a7576ff5de116dcafbbd89d31de04b3b5e 100644 --- a/packages/ui-vue/components/tabs/src/composition/use-tabs.ts +++ b/packages/ui-vue/components/tabs/src/composition/use-tabs.ts @@ -59,7 +59,7 @@ export function useTabs( } } } - function selectTabByIndex($event: MouseEvent, targetTabId: string) { + function selectTabByTabId($event: MouseEvent, targetTabId: string) { const prevId = activeId.value; activeId.value = targetTabId context.emit('tabChange', { @@ -77,6 +77,6 @@ export function useTabs( getTabNavLinkClass, getTabTextClass, changeTitleStyle, - selectTabByIndex + selectTabByTabId }; } diff --git a/packages/ui-vue/components/tabs/src/tabs.component.tsx b/packages/ui-vue/components/tabs/src/tabs.component.tsx index fb82cabf8a1d70db08d9995637ac94a63020d341..f7d2bc3b57f0ea5dc02e67a5d6dbd93273eb6732 100644 --- a/packages/ui-vue/components/tabs/src/tabs.component.tsx +++ b/packages/ui-vue/components/tabs/src/tabs.component.tsx @@ -1,4 +1,4 @@ -import { computed, defineComponent, provide, reactive, ref, SetupContext, toRef, onMounted, shallowRef, nextTick } from 'vue'; +import { computed, defineComponent, provide, reactive, ref, SetupContext, onMounted, shallowRef, nextTick, Slots } from 'vue'; import { TabsProps, tabsProps } from './tabs.props'; import './tabs.css' import { useTabs } from './composition/use-tabs'; @@ -19,9 +19,20 @@ export default defineComponent({ // 显示下拉面板 const hideDropDown = ref(true); + const activeTabSlot = computed(() => { + const activeTab = tabs.value.find(tab => tab.props.id === activeId.value); + return activeTab?.slots + }) + const hasInHeadClass = computed(() => { + const activeTab = tabs.value.find(tab => tab.props.id === activeId.value); + const toolbarPosition = activeTab?.props.toolbarPosition + if (toolbarPosition === 'inHead') { + return true + } return false; }); + const menuItemsWidth = ref('atuo') // 下拉框后的搜索文本 const searchTabText = ref(''); @@ -31,7 +42,7 @@ export default defineComponent({ // 激活状态的tabId const activeId = ref(props.activeId); - const { setActiveId, getTabStyle, getTabClass, getTabNavLinkClass, getTabTextClass, changeTitleStyle, selectTabByIndex } = useTabs(props, context, activeId); + const { setActiveId, getTabStyle, getTabClass, getTabNavLinkClass, getTabTextClass, changeTitleStyle, selectTabByTabId } = useTabs(props, context, activeId); // 增加一个tab标题 const addTab = (tabContext: TabContext) => { const index = tabs.value.findIndex(tab => tab.props.id === tabContext.props.id) @@ -153,14 +164,15 @@ export default defineComponent({ }; // 选中某个tab - const _cpSelectTabByIndex = ($event: MouseEvent, tab: TabPageProps) => { + const _cpSelectTab = ($event: MouseEvent, tab: TabPageProps) => { if (tab.disabled) { return } - selectTabByIndex($event, tab.id); + selectTabByTabId($event, tab.id); const index = tabs.value.findIndex(tb => tb.props.id === tab.id); hideDropDown.value = true; nextTick(() => { + setHideButtonsStatus() scrollToActiveTab(index) }) } @@ -200,7 +212,7 @@ export default defineComponent({ 'flex-row-reverse': props.position === 'right' })); - // 设置隐藏按钮的状态 + // 设置页签下拉按钮的显隐状态 const setHideButtonsStatus = () => { const titleUlparentElement = titleUlElement.value?.parentElement if (!titleUlparentElement || !titleUlElement.value) { @@ -263,9 +275,16 @@ export default defineComponent({ } } + const selectTab = ($event: MouseEvent, targetTabId: string) => { + selectTabByTabId($event, targetTabId) + nextTick(() => { + setHideButtonsStatus() + }) + } + onMounted(() => { nextTick(() => { - changeTitleStyle(titleUlElement) + changeTitleStyle(titleUlElement); // 下拉面板之外空白处点击关闭下拉面板 window.addEventListener('click', (ev: any) => { if (hideDropDown.value) { @@ -295,7 +314,7 @@ export default defineComponent({ const titleSlot = tabPage.slots.title return (
  • - selectTabByIndex($event, tab.id)}> + selectTab($event, tab.id)}> {titleSlot ? titleSlot() : {tab.title}} {tab.removeable && ( removeTab($event, tab.id)}> @@ -319,7 +338,7 @@ export default defineComponent({ {cpTabs.value.length ?
      {cpTabs.value.map(tab => { return ( -
    • _cpSelectTabByIndex($event, tab.props)}> +
    • _cpSelectTab($event, tab.props)}> {tab.props.removeable && removeTab($event, tab.props.id, true)}> } @@ -331,6 +350,9 @@ export default defineComponent({ + {activeTabSlot.value &&
      + {activeTabSlot.value?.toolbarExtra?.()} +
      }
      {context.slots.default?.()} diff --git a/packages/ui-vue/src/components/tabs.vue b/packages/ui-vue/src/components/tabs.vue index 0fcfe9af17e760c3a1522e76f6fca46fb783975a..9924b01e205a0874c213829e4c88665c7da0058c 100644 --- a/packages/ui-vue/src/components/tabs.vue +++ b/packages/ui-vue/src/components/tabs.vue @@ -1,62 +1,66 @@