tabs.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import router from '@/routers'
  2. import { defineStore } from 'pinia'
  3. import { getUrlWithParams } from '@/utils'
  4. import { useKeepAliveStore } from './keepAlive'
  5. import { TabsState, TabsMenuProps } from '@/stores/interface'
  6. import piniaPersistConfig from '@/stores/helper/persist'
  7. const keepAliveStore = useKeepAliveStore()
  8. export const useTabsStore = defineStore('admin-tabs', {
  9. state: (): TabsState => ({
  10. tabsMenuList: []
  11. }),
  12. actions: {
  13. // Add Tabs
  14. async addTabs(tabItem: TabsMenuProps) {
  15. if (this.tabsMenuList.every(item => item.path !== tabItem.path)) {
  16. this.tabsMenuList.push(tabItem)
  17. }
  18. // add keepalive
  19. if (!keepAliveStore.keepAliveName.includes(tabItem.name) && tabItem.isKeepAlive) {
  20. keepAliveStore.addKeepAliveName(tabItem.name)
  21. }
  22. },
  23. // Remove Tabs
  24. async removeTabs(tabPath: string, isCurrent: boolean = true) {
  25. if (isCurrent) {
  26. this.tabsMenuList.forEach((item, index) => {
  27. if (item.path !== tabPath) return
  28. const nextTab = this.tabsMenuList[index + 1] || this.tabsMenuList[index - 1]
  29. if (!nextTab) return
  30. router.push(nextTab.path)
  31. })
  32. }
  33. // remove keepalive
  34. const tabItem = this.tabsMenuList.find(item => item.path === tabPath)
  35. tabItem?.isKeepAlive && keepAliveStore.removeKeepAliveName(tabItem.name)
  36. // set tabs
  37. this.tabsMenuList = this.tabsMenuList.filter(item => item.path !== tabPath)
  38. },
  39. // Close Tabs On Side
  40. async closeTabsOnSide(path: string, type: 'left' | 'right') {
  41. const currentIndex = this.tabsMenuList.findIndex(item => item.path === path)
  42. if (currentIndex !== -1) {
  43. const range = type === 'left' ? [0, currentIndex] : [currentIndex + 1, this.tabsMenuList.length]
  44. this.tabsMenuList = this.tabsMenuList.filter((item, index) => {
  45. return index < range[0] || index >= range[1] || !item.close
  46. })
  47. }
  48. // set keepalive
  49. const KeepAliveList = this.tabsMenuList.filter(item => item.isKeepAlive)
  50. keepAliveStore.setKeepAliveName(KeepAliveList.map(item => item.name))
  51. },
  52. // Close MultipleTab
  53. async closeMultipleTab(tabsMenuValue?: string) {
  54. this.tabsMenuList = this.tabsMenuList.filter(item => {
  55. return item.path === tabsMenuValue || !item.close
  56. })
  57. // set keepalive
  58. const KeepAliveList = this.tabsMenuList.filter(item => item.isKeepAlive)
  59. keepAliveStore.setKeepAliveName(KeepAliveList.map(item => item.name))
  60. },
  61. // Set Tabs
  62. async setTabs(tabsMenuList: TabsMenuProps[]) {
  63. this.tabsMenuList = tabsMenuList
  64. },
  65. // Set Tabs Title
  66. async setTabsTitle(title: string) {
  67. this.tabsMenuList.forEach(item => {
  68. if (item.path == getUrlWithParams()) item.title = title
  69. })
  70. }
  71. },
  72. persist: piniaPersistConfig('admin-tabs')
  73. })