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 } ) }