UNPKG

create-iking-admin

Version:

金合技术中台脚手架

107 lines (96 loc) 3.38 kB
/* * @Author: wfl * @LastEditors: wfl * @description: * @updateInfo: * @Date: 2022-07-29 11:45:14 * @LastEditTime: 2022-10-08 12:14:31 */ import type { AppRouteRecordRaw, Menu, MenuModule } from '@/mainApp/router/types'; import { AppRouteModule } from '@/mainApp/router/types'; import { ikTree, paramType } from 'iking-utils'; import { cloneDeep } from 'lodash-es'; import { toRaw } from 'vue'; import { RouteParams } from 'vue-router'; export function getAllParentPath<T = Recordable>(treeData: T[], path: string) { const menuList = ikTree.findPath(treeData, (n) => n.path === path) as Menu[]; return (menuList || []).map((item) => item.path); } export function getAllParentId<T = Recordable>(treeData: T[], path: string) { const menuList = ikTree.findPath(treeData, (n) => { return n.path === path || n.__nodekey === path; }) as Menu[]; return (menuList || []).map((item) => item); } function joinParentPath(menus: Menu[], parentPath = '') { for (let index = 0; index < menus.length; index++) { const menu = menus[index]; if (!(menu?.path?.startsWith('/') || paramType.isUrl(menu?.path))) { // path doesn't start with /, nor is it a url, join parent path menu.path = `${parentPath}/${menu.path}`; } if (menu?.children?.length) { joinParentPath(menu.children, menu.meta?.hidePathForChildren ? parentPath : menu.path); } } } // Parsing the menu module export function transformMenuModule(menuModule: MenuModule): Menu { const { menu } = menuModule; const menuList = [menu]; joinParentPath(menuList); return menuList[0]; } export function transformRouteToMenu(routeModList: AppRouteModule[], routerMapping = false) { const cloneRouteModList = cloneDeep(routeModList); const routeList: AppRouteRecordRaw[] = []; cloneRouteModList.forEach((item) => { if (routerMapping && typeof item.redirect === 'string') { item.path = item.redirect; } if (item.meta?.single) { const realItem = item?.children?.[0]; realItem && routeList.push(realItem); } else { routeList.push(item); } }); const list = ikTree.treeMap(routeList, { conversion: (node: AppRouteRecordRaw) => { const { meta: { title, hideMenu = false } = {} } = node; return { ...node, ...(node.meta || {}), meta: node.meta, name: title, hideMenu, path: node.path, ...(node.redirect ? { redirect: node.redirect } : {}), }; }, }); joinParentPath(list); return cloneDeep(list); } /** * config menu with given params */ const menuParamRegex = /(?::)([\s\S]+?)((?=\/)|$)/g; export function configureDynamicParamsMenu(menu: Menu, params: RouteParams) { const { path, paramPath } = toRaw(menu); let realPath = paramPath ? paramPath : path; const matchArr = realPath.match(menuParamRegex); matchArr?.forEach((it) => { const realIt = it.substr(1); if (params[realIt]) { realPath = realPath.replace(`:${realIt}`, params[realIt] as string); } }); // save original param path. if (!paramPath && matchArr && matchArr.length > 0) { menu.paramPath = path; } menu.path = realPath; // children menu.children?.forEach((item) => configureDynamicParamsMenu(item, params)); }