tabs.ts 2.8 KB

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