UNPKG

create-iking-admin

Version:

金合技术中台脚手架

166 lines (151 loc) 5 kB
import type { RouteLocationRaw } from 'vue-router' import useSettingsStore from '@main/store/modules/settings' import useTabbarStore from '@main/store/modules/tabbar' export default function useTabbar() { const route = useRoute() const router = useRouter() const settingsStore = useSettingsStore() const tabbarStore = useTabbarStore() function getId() { return settingsStore.settings.tabbar.mergeTabsBy === 'activeMenu' ? (route.meta.activeMenu ?? route.fullPath) : route.fullPath } function open(to: RouteLocationRaw) { const index = tabbarStore.list.findIndex(item => item.tabId === getId()) tabbarStore.$patch({ leaveIndex: index, }) router.push(to) } function go(delta: number) { const tabId = getId() router.go(delta) tabbarStore.remove(tabId) } function close(to: RouteLocationRaw) { const tabId = getId() router.push(to).then(() => { tabbarStore.remove(tabId) }) } function closeById(tabId = getId()) { const activedTabId = getId() if (tabbarStore.list.some(item => item.tabId === tabId)) { if (tabbarStore.list.length > 1) { // 如果关闭的标签正好是当前路由 if (tabId === activedTabId) { const index = tabbarStore.list.findIndex(item => item.tabId === tabId) if (index < tabbarStore.list.length - 1) { close(tabbarStore.list[index + 1].fullPath) } else { close(tabbarStore.list[index - 1].fullPath) } } else { tabbarStore.remove(tabId) } } else { useMessage().msgError('当前只有一个标签页,已阻止关闭') } } else { useMessage().msgError('关闭的页面不存在') } } /** * 关闭两侧标签页 */ function closeOtherSide(tabId = getId()) { const activedTabId = getId() // 如果操作的是非当前路由标签页,则先跳转到指定路由标签页 if (tabId !== activedTabId) { const index = tabbarStore.list.findIndex(item => item.tabId === tabId) router.push(tabbarStore.list[index].fullPath) } tabbarStore.removeOtherSide(tabId) } /** * 关闭左侧标签页 */ function closeLeftSide(tabId = getId()) { const activedTabId = getId() // 如果操作的是非当前路由标签页,需要判断当前标签页是否在指定标签页左侧,如果是则先跳转到指定路由标签页 if (tabId !== activedTabId) { const index = tabbarStore.list.findIndex(item => item.tabId === tabId) const activedIndex = tabbarStore.list.findIndex(item => item.tabId === activedTabId) if (activedIndex < index) { router.push(tabbarStore.list[index].fullPath) } } tabbarStore.removeLeftSide(tabId) } /** * 关闭右侧标签页 */ function closeRightSide(tabId = getId()) { const activedTabId = getId() // 如果操作的是非当前路由标签页,需要判断当前标签页是否在指定标签页右侧,如果是则先跳转到指定路由标签页 if (tabId !== activedTabId) { const index = tabbarStore.list.findIndex(item => item.tabId === tabId) const activedIndex = tabbarStore.list.findIndex(item => item.tabId === activedTabId) if (activedIndex > index) { router.push(tabbarStore.list[index].fullPath) } } tabbarStore.removeRightSide(tabId) } /** * 校验指定标签两侧是否有可关闭的标签 */ function checkCloseOtherSide(tabId = getId()) { return tabbarStore.list.some((item) => { return !item.isPermanent && !item.isPin && item.tabId !== tabId }) } /** * 校验指定标签左侧是否有可关闭的标签 */ function checkCloseLeftSide(tabId = getId()) { let flag = true if (tabId === tabbarStore.list[0]?.tabId) { flag = false } else { const index = tabbarStore.list.findIndex(item => item.tabId === tabId) flag = tabbarStore.list.some((item, i) => { return i < index && !item.isPermanent && !item.isPin && item.tabId !== tabId }) } return flag } /** * 校验指定标签右侧是否有可关闭的标签 */ function checkCloseRightSide(tabId = getId()) { let flag = true if (tabId === tabbarStore.list.at(-1)?.tabId) { flag = false } else { const index = tabbarStore.list.findIndex(item => item.tabId === tabId) flag = tabbarStore.list.some((item, i) => { return i >= index && !item.isPermanent && !item.isPin && item.tabId !== tabId }) } return flag } return { getId, open, go, close, closeById, closeOtherSide, closeLeftSide, closeRightSide, checkCloseOtherSide, checkCloseLeftSide, checkCloseRightSide, } }