You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
2.4 KiB

7 months ago
import { RouteRecordRaw } from 'vue-router';
import { getComponent } from '/nerv-base/router/helper/view-helper';
import { ModuleMenu } from '/nerv-base/router/types';
import { RouteMenu, sortMenu } from '/nerv-base/router/helper/menu-helper';
import { isNumber } from 'lodash-es';
export function transformRouteToMenu(route: RouteRecordRaw, parentCode = '') {
const { children, ...extend } = route;
if (extend.component) {
const component = getComponent(extend.component.toString());
component && (extend.component = component as any);
}
const code: any = route.meta?.code || route.name || '';
if (!extend.meta) extend.meta = {};
if (extend.meta.index === undefined || !isNumber(extend.meta.index)) {
extend.meta.index = 999;
}
const _menu: ModuleMenu = {
code,
icon: (route.meta?.icon || ' ') as string,
sort: (route.meta?.index || 999) as number,
label: (route.meta?.title || ' ') as string,
type: (route.meta?.type || 'menus') as string,
// name: dealOp(route) as string,
backApi: dealBackApi(route) as Recordable[],
parentCode,
extend: {
keepAlive: (route.meta?.keepAlive || false) as boolean,
// itemList: route.meta?.itemList || null,
},
route: extend,
};
if (children) {
_menu.menus = transformRoutes(children, code);
}
return _menu;
}
function dealBackApi(e: any) {
if (e.meta?.hideChildren) {
if (e.children !== undefined) {
return e.children[0].meta?.backApi || [];
} else {
return e.meta?.backApi ? e.meta?.backApi : [];
}
}
return e.meta?.backApi || [];
}
function dealOp(e: any) {
if (e.meta?.type === 'op') {
return e.name;
} else {
return '';
}
}
export function transformRoutes(routes: RouteRecordRaw[], parentCode = '') {
const list = [];
for (let i = 0, l = routes.length; i < l; i++) {
if (routes[i].meta?.operates && !routes[i].meta?.hideResource) {
routes[i].meta?.operates.forEach((item) => {
const info = {
sort: 999,
type: 'op',
code: item.code,
name: '',
label: item.title,
backApi: item.backApi,
parentCode: parentCode,
};
list.push(info);
});
}
if (routes[i].name !== `${parentCode}Index` && !routes[i].meta?.hideResource) {
list.push(transformRouteToMenu(routes[i], parentCode));
}
}
return sortMenu(list);
}