fix(fe): resolve tab overflow eviction and router synchronization bugs when closing active tabs
This commit is contained in:
@@ -15,7 +15,17 @@ const handleTabClick = (path: string) => {
|
||||
|
||||
const handleCloseTab = (event: Event, tabId: string) => {
|
||||
event.stopPropagation()
|
||||
const wasActive = activeTabId.value === tabId
|
||||
layoutStore.closeTab(tabId)
|
||||
|
||||
if (wasActive) {
|
||||
const nextActiveTab = tabs.value.find(t => t.id === layoutStore.activeTabId)
|
||||
if (nextActiveTab) {
|
||||
router.push(nextActiveTab.path)
|
||||
} else {
|
||||
router.push('/home')
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const handleCloseOther = (tabId: string) => {
|
||||
|
||||
@@ -45,24 +45,32 @@ export const useLayoutStore = defineStore('layout', () => {
|
||||
|
||||
// Tab management
|
||||
const addTab = (tab: Omit<OpenedTab, 'timestamp'>) => {
|
||||
// Check if tab already exists
|
||||
// Standardize tab ID based on path to prevent duplicates
|
||||
const tabId = tab.id || `tab-${tab.path}`
|
||||
const existing = openedTabs.value.find(t => t.path === tab.path)
|
||||
if (existing) {
|
||||
activeTabId.value = existing.id
|
||||
return
|
||||
}
|
||||
|
||||
// Respect max tabs limit
|
||||
// Respect max tabs limit (FIFO eviction)
|
||||
if (openedTabs.value.length >= maxTabs.value) {
|
||||
openedTabs.value.shift() // Remove oldest tab
|
||||
// Find oldest tab that is NOT currently active if possible
|
||||
const oldestIndex = openedTabs.value.findIndex(t => t.id !== activeTabId.value)
|
||||
if (oldestIndex !== -1) {
|
||||
openedTabs.value.splice(oldestIndex, 1)
|
||||
} else {
|
||||
openedTabs.value.shift()
|
||||
}
|
||||
}
|
||||
|
||||
const newTab: OpenedTab = {
|
||||
...tab,
|
||||
id: tabId,
|
||||
timestamp: Date.now(),
|
||||
}
|
||||
openedTabs.value.push(newTab)
|
||||
activeTabId.value = tab.id
|
||||
activeTabId.value = newTab.id
|
||||
saveTabs()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user