export function getTagFullPath(router, tag) {
|
if (tag.fullPath) return tag.fullPath
|
return router.resolve({
|
path: tag.path,
|
query: tag.query || {}
|
}).route.fullPath
|
}
|
|
function getNavigationTarget(router, remainingTags, fallback) {
|
if (fallback) {
|
const fallbackRoute = router.resolve(fallback).route
|
const matchingTag = remainingTags.slice().reverse().find((tag) => {
|
return router.resolve(getTagFullPath(router, tag)).route.path === fallbackRoute.path
|
})
|
return matchingTag ? getTagFullPath(router, matchingTag) : fallback
|
}
|
|
const target = remainingTags[remainingTags.length - 1]
|
return target ? getTagFullPath(router, target) : null
|
}
|
|
export function closeRouteView({ router, store, route, tag, fallback }) {
|
const currentRoute = route || router.currentRoute
|
const targetTag = tag || store.state.tagList.find((item) => {
|
return getTagFullPath(router, item) === currentRoute.fullPath
|
})
|
const targetFullPath = targetTag
|
? getTagFullPath(router, targetTag)
|
: currentRoute.fullPath
|
const remainingTags = store.state.tagList.filter((item) => {
|
return getTagFullPath(router, item) !== targetFullPath
|
})
|
const isActive = targetFullPath === router.currentRoute.fullPath
|
const pruneKey = targetTag && targetTag.cacheKey
|
? targetTag.cacheKey
|
: targetFullPath
|
|
const removeTagAndPrune = () => {
|
const latestTags = store.state.tagList.filter((item) => {
|
return getTagFullPath(router, item) !== targetFullPath
|
})
|
store.commit('SET_TAGLIST', latestTags)
|
store.commit('PRUNE_VIEW_CACHE', pruneKey)
|
}
|
|
if (!isActive) {
|
removeTagAndPrune()
|
return Promise.resolve()
|
}
|
|
const navigationTarget = getNavigationTarget(router, remainingTags, fallback)
|
if (!navigationTarget) {
|
removeTagAndPrune()
|
return Promise.resolve()
|
}
|
|
return Promise.resolve(router.push(navigationTarget)).then(
|
(result) => {
|
removeTagAndPrune()
|
return result
|
},
|
(error) => {
|
removeTagAndPrune()
|
throw error
|
}
|
)
|
}
|