soybean-admin/src/store/modules/tab/shared.ts
2024-01-25 02:35:37 +08:00

214 lines
4.4 KiB
TypeScript

import type { Router } from 'vue-router';
import type { LastLevelRouteKey, RouteKey, RouteMap } from '@elegant-router/types';
import { $t } from '@/locales';
import { getRoutePath } from '@/router/elegant/transform';
/**
* Get all tabs
*
* @param tabs Tabs
* @param homeTab Home tab
*/
export function getAllTabs(tabs: App.Global.Tab[], homeTab?: App.Global.Tab) {
if (!homeTab) {
return [];
}
const fixedTabs = tabs.filter(tab => tab.fixedIndex !== undefined).sort((a, b) => a.fixedIndex! - b.fixedIndex!);
const remainTabs = tabs.filter(tab => tab.fixedIndex === undefined);
const allTabs = [homeTab, ...fixedTabs, ...remainTabs];
return updateTabsLabel(allTabs);
}
/**
* Get tab id by route
*
* @param route
*/
export function getTabIdByRoute(route: App.Global.TabRoute) {
const { path, query = {}, meta } = route;
let id = path;
if (meta.multiTab) {
const queryKeys = Object.keys(query).sort();
const qs = queryKeys.map(key => `${key}=${query[key]}`).join('&');
id = `${path}?${qs}`;
}
return id;
}
/**
* Get tab by route
*
* @param route
*/
export function getTabByRoute(route: App.Global.TabRoute) {
const { name, path, fullPath = path, meta } = route;
const { title, i18nKey, fixedIndexInTab, icon = import.meta.env.VITE_MENU_ICON, localIcon } = meta;
const label = i18nKey ? $t(i18nKey) : title;
const tab: App.Global.Tab = {
id: getTabIdByRoute(route),
label,
routeKey: name as LastLevelRouteKey,
routePath: path as RouteMap[LastLevelRouteKey],
fullPath,
fixedIndex: fixedIndexInTab,
icon,
localIcon,
i18nKey
};
return tab;
}
/**
* Get default home tab
*
* @param router
*/
export function getDefaultHomeTab(router: Router) {
const homeRouteName = import.meta.env.VITE_ROUTE_HOME;
const homeRoutePath = getRoutePath(homeRouteName);
const i18nLabel = $t(`route.${homeRouteName}`);
let homeTab: App.Global.Tab = {
id: getRoutePath(homeRouteName),
label: i18nLabel || homeRouteName,
routeKey: homeRouteName,
routePath: homeRoutePath,
fullPath: homeRoutePath
};
const routes = router.getRoutes();
const homeRoute = routes.find(route => route.name === homeRouteName);
if (homeRoute) {
homeTab = getTabByRoute(homeRoute);
}
return homeTab;
}
/**
* Is tab in tabs
*
* @param tab
* @param tabs
*/
export function isTabInTabs(tabId: string, tabs: App.Global.Tab[]) {
return tabs.some(tab => tab.id === tabId);
}
/**
* Filter tabs by id
*
* @param tabId
* @param tabs
*/
export function filterTabsById(tabId: string, tabs: App.Global.Tab[]) {
return tabs.filter(tab => tab.id !== tabId);
}
/**
* Filter tabs by ids
*
* @param tabIds
* @param tabs
*/
export function filterTabsByIds(tabIds: string[], tabs: App.Global.Tab[]) {
return tabs.filter(tab => !tabIds.includes(tab.id));
}
/**
* filter tabs by all routes
*
* @param router
* @param tabs
*/
export function filterTabsByAllRoutes(router: Router, tabs: App.Global.Tab[]) {
const routes = router.getRoutes();
const routeNames = routes.map(route => route.name);
return tabs.filter(tab => routeNames.includes(tab.routeKey));
}
/**
* Get fixed tabs
*
* @param tabs
*/
export function getFixedTabs(tabs: App.Global.Tab[]) {
return tabs.filter(tab => tab.fixedIndex !== undefined);
}
/**
* Get fixed tab ids
*
* @param tabs
*/
export function getFixedTabIds(tabs: App.Global.Tab[]) {
const fixedTabs = getFixedTabs(tabs);
return fixedTabs.map(tab => tab.id);
}
/**
* Update tabs label
*
* @param tabs
*/
function updateTabsLabel(tabs: App.Global.Tab[]) {
const updated = tabs.map(tab => ({
...tab,
label: tab.newLabel || tab.oldLabel || tab.label
}));
return updated;
}
/**
* Update tab by i18n key
*
* @param tab
*/
export function updateTabByI18nKey(tab: App.Global.Tab) {
const { i18nKey, label } = tab;
return {
...tab,
label: i18nKey ? $t(i18nKey) : label
};
}
/**
* Update tabs by i18n key
*
* @param tabs
*/
export function updateTabsByI18nKey(tabs: App.Global.Tab[]) {
return tabs.map(tab => updateTabByI18nKey(tab));
}
/**
* find tab by route name
*
* @param name
* @param tabs
*/
export function findTabByRouteName(name: RouteKey, tabs: App.Global.Tab[]) {
const routePath = getRoutePath(name);
const tabId = routePath;
const multiTabId = `${routePath}?`;
return tabs.find(tab => tab.id === tabId || tab.id.startsWith(multiTabId));
}