tabs.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. import { useStorage } from '@vueuse/core'
  2. import { acceptHMRUpdate, defineStore } from 'pinia'
  3. import type { RouteRecordNameGeneric } from 'vue-router'
  4. export interface Tab {
  5. compName?: string
  6. name?: RouteRecordNameGeneric
  7. icon?: string
  8. key: string
  9. label?: string
  10. locked?: boolean
  11. pinned?: boolean
  12. }
  13. export const useTabsStore = defineStore('tabsStore', () => {
  14. const tabs = useStorage<Tab[]>('tabs', [
  15. {
  16. compName: 'Dashboard',
  17. icon: 'iconify-[mage--dashboard-chart]',
  18. key: '/dashboard',
  19. label: '仪表板',
  20. pinned: true,
  21. },
  22. ])
  23. const tabActiveKey = useStorage<string>('tabActiveKey', '')
  24. const tabsKeepAlive = useStorage<string[]>('tabsKeepAlive', [])
  25. const removeTabs = (keys: string[]) => {
  26. const activeTabKeyIndex = tabs.value.findIndex((item) => item.key === tabActiveKey.value)
  27. if (keys.includes(tabActiveKey.value)) {
  28. let newActiveKey = ''
  29. for (let i = activeTabKeyIndex + 1; i < tabs.value.length; i++) {
  30. if (!keys.includes(tabs.value[i].key)) {
  31. newActiveKey = tabs.value[i].key
  32. break
  33. }
  34. }
  35. if (!newActiveKey) {
  36. for (let i = activeTabKeyIndex - 1; i >= 0; i--) {
  37. if (!keys.includes(tabs.value[i].key)) {
  38. newActiveKey = tabs.value[i].key
  39. break
  40. }
  41. }
  42. }
  43. setActive(newActiveKey)
  44. }
  45. tabs.value = tabs.value.filter((item) => !keys.includes(item.key))
  46. }
  47. function findTabIndex(key: string) {
  48. return tabs.value.findIndex((item) => item.key === key)
  49. }
  50. function getLefts(key: string) {
  51. const mutableTabKeys: string[] = []
  52. for (let i = 0; i < tabs.value.length; i++) {
  53. if (tabs.value[i].key === key) break
  54. if (!tabs.value[i].locked && !tabs.value[i].pinned) {
  55. mutableTabKeys.push(tabs.value[i].key)
  56. }
  57. }
  58. return mutableTabKeys
  59. }
  60. function getRights(key: string) {
  61. const mutableTabKeys: string[] = []
  62. for (let i = tabs.value.length - 1; i >= 0; i--) {
  63. if (tabs.value[i].key === key) break
  64. if (!tabs.value[i].locked && !tabs.value[i].pinned) {
  65. mutableTabKeys.push(tabs.value[i].key)
  66. }
  67. }
  68. return mutableTabKeys
  69. }
  70. function getOthers(key: string) {
  71. const mutableTabKeys: string[] = []
  72. for (let i = 0; i < tabs.value.length; i++) {
  73. if (tabs.value[i].key !== key) {
  74. if (!tabs.value[i].locked && !tabs.value[i].pinned) {
  75. mutableTabKeys.push(tabs.value[i].key)
  76. }
  77. }
  78. }
  79. return mutableTabKeys
  80. }
  81. function getAlls() {
  82. const mutableTabKeys: string[] = []
  83. for (let i = 0; i < tabs.value.length; i++) {
  84. if (!tabs.value[i].locked && !tabs.value[i].pinned) {
  85. mutableTabKeys.push(tabs.value[i].key)
  86. }
  87. }
  88. return mutableTabKeys
  89. }
  90. function setTabs(value: Tab[]) {
  91. tabs.value = value
  92. }
  93. function setActive(key: string) {
  94. tabActiveKey.value = key
  95. }
  96. function create(tab: Tab) {
  97. const index = tabs.value.findIndex((item) => item.key === tab.key)
  98. if (index === -1) {
  99. tabs.value.push(tab)
  100. }
  101. setActive(tab.key)
  102. }
  103. const remove = (key: string) => {
  104. removeTabs([key])
  105. }
  106. const removeLefts = (key: string) => {
  107. removeTabs(getLefts(key))
  108. }
  109. const removeRights = (key: string) => {
  110. removeTabs(getRights(key))
  111. }
  112. const removeOthers = (key: string) => {
  113. removeTabs(getOthers(key))
  114. }
  115. const removeAlls = () => {
  116. removeTabs(getAlls())
  117. }
  118. const hasKeepAlive = (compName?: string) => {
  119. const index = tabsKeepAlive.value.findIndex((item) => item === compName)
  120. return index !== -1 ? true : false
  121. }
  122. const addKeepAlive = (compName: string) => {
  123. const index = tabsKeepAlive.value.findIndex((item) => item === compName)
  124. if (index !== -1) {
  125. tabsKeepAlive.value.splice(index, 1)
  126. } else {
  127. tabsKeepAlive.value.push(compName)
  128. }
  129. }
  130. const isPinned = (key: string) => {
  131. const index = findTabIndex(key)
  132. return index !== -1 ? tabs.value[index].pinned : void 0
  133. }
  134. const isLocked = (key: string) => {
  135. const index = findTabIndex(key)
  136. return index !== -1 ? tabs.value[index].locked : void 0
  137. }
  138. const setLocked = (key: string) => {
  139. const index = findTabIndex(key)
  140. if (index !== -1) {
  141. tabs.value[index].locked = !tabs.value[index].locked
  142. }
  143. }
  144. return {
  145. tabs,
  146. tabActiveKey,
  147. tabsKeepAlive,
  148. create,
  149. getAlls,
  150. getLefts,
  151. getOthers,
  152. getRights,
  153. hasKeepAlive,
  154. isLocked,
  155. isPinned,
  156. removeAlls,
  157. removeLefts,
  158. removeOthers,
  159. removeRights,
  160. remove,
  161. setActive,
  162. addKeepAlive,
  163. setLocked,
  164. setTabs,
  165. }
  166. })
  167. if (import.meta.hot) {
  168. import.meta.hot.accept(acceptHMRUpdate(useTabsStore, import.meta.hot))
  169. }