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'; const transForm = (data) => { return JSON.stringify(data || []); }; 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 transForm(e.children[0].meta?.backApi); } else { return transForm(e.meta?.backApi); } } return transForm(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); }