1
0
mirror of https://github.com/1Panel-dev/1Panel.git synced 2025-01-20 08:49:16 +08:00

143 lines
4.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ref } from 'vue';
import { defineStore } from 'pinia';
const TabsStore = defineStore(
'TabsStore',
() => {
const isShowTabIcon = ref(true);
// 缓存的KEY直接给keepalive使用
const cachedTabs = ref([]);
const openedTabs = ref([]);
const activeTabPath = ref('');
const getActivePath = (path) => {
let firstSlashIndex = path.indexOf('/');
let lastSlashIndex = path.lastIndexOf('/');
if (firstSlashIndex === -1 || firstSlashIndex === lastSlashIndex) {
return path;
}
return path.substring(firstSlashIndex, lastSlashIndex);
};
const getTabIdxByPath = (path) => {
return openedTabs.value.findIndex((v) => v.path === path);
};
const removeAllTabs = () => {
openedTabs.value = [];
cachedTabs.value = [];
};
const removeUnActiveTabs = () => {
if (openedTabs.value.length) {
let idx = getTabIdxByPath(activeTabPath.value);
idx = idx > -1 ? idx : 0;
const tab = openedTabs.value[idx];
removeOtherTabs(tab);
}
};
const findTab = (path) => {
const idx = getTabIdxByPath(path);
if (idx > -1) {
return openedTabs.value[idx];
}
};
const addTab = (tab) => {
const idx = getTabIdxByPath(tab.path);
if (idx < 0) {
openedTabs.value.push(Object.assign({}, tab));
addCachedTab(tab.name);
}
};
const removeTab = (path) => {
if (openedTabs.value.length > 1) {
const idx = getTabIdxByPath(path);
if (idx > -1) {
removeCachedTab(openedTabs.value[idx].name);
openedTabs.value.splice(idx, 1);
}
return openedTabs.value[openedTabs.value.length - 1].path;
}
};
const removeOtherTabs = (path) => {
const idx = getTabIdxByPath(path);
if (idx > -1) {
const tab = openedTabs.value[idx];
openedTabs.value = [tab];
cachedTabs.value = [];
cachedTabs.value = [tab.name];
}
};
const removeTabs = (path, type) => {
if (path) {
const idx = getTabIdxByPath(path);
let removeTabs = [];
if (type === 'right') {
removeTabs = openedTabs.value.splice(idx + 1);
} else if (type === 'left') {
removeTabs = openedTabs.value.splice(0, idx);
}
if (removeTabs.length) {
removeTabs.forEach((e) => removeCachedTab(e.name));
}
}
};
const addCachedTab = (name) => {
if (name && !cachedTabs.value.includes(name)) {
cachedTabs.value.push(name);
}
};
const removeCachedTab = (name) => {
if (name) {
const idx = cachedTabs.value.findIndex((v) => v === name);
if (idx > -1) {
cachedTabs.value.splice(idx, 1);
}
}
};
const hasCloseDropdown = (path, type) => {
const idx = getTabIdxByPath(path);
switch (type) {
case 'close':
case 'other':
return openedTabs.value.length > 1;
case 'left':
return idx !== 0;
case 'right':
return idx !== openedTabs.value.length - 1;
}
};
return {
isShowTabIcon,
activeTabPath,
openedTabs,
cachedTabs,
addTab,
findTab,
addCachedTab,
removeCachedTab,
removeTab,
removeTabs,
removeOtherTabs,
removeAllTabs,
removeUnActiveTabs,
hasCloseDropdown,
getActivePath,
};
},
{
persist: true,
},
);
export default TabsStore;