diff --git a/d2/menus/index.js b/d2/menus/index.js index 4de9178c..7d59160a 100644 --- a/d2/menus/index.js +++ b/d2/menus/index.js @@ -1,69 +1,45 @@ -import { get, pick } from 'lodash-es' -import { Menu } from 'd2/utils/menu.js' -import { flattenObjectArray } from 'd2/utils/array.js' -import routes from 'virtual:generated-pages' +import { Menu, routeMenus } from 'd2/utils/menu.js' -const flatRoutes = flattenObjectArray( - routes, - 'children', - (item, _) => pick(item, ['name', 'path', 'meta']) -) +export const dashboardIndexMenu = new Menu('控制台').url('/dashboard').icon('icon-park-outline:dashboard') -function filterRoutes (rule) { - return flatRoutes.filter(route => rule.test(route.name)) -} - -function creatRouteMenu (route, basePath) { - const url = route.path.replace(RegExp(`^${basePath}`), '') - const title = get(route.meta, 'd2admin.menu.title', url || '/') - if (!url) { - return new Menu(title).index() - } - return new Menu(title).url(url) -} - -function creatRouteMenus ({ match = /.+/, basePath = '' } = {}) { - return filterRoutes(match).map(route => creatRouteMenu(route, basePath)) -} - -export const dashboardIndexMenu = new Menu('控制台') - .url('/dashboard') - .icon('icon-park-outline:dashboard') - -export const indexMenu = new Menu('首页') - .url('/') - .icon('icon-park-outline:home') +export const indexMenu = new Menu('首页').url('/').icon('icon-park-outline:home') export const dashboardDemoComponentScrollMenus = new Menu('滚动') - .scope('/dashboard/demo/component/scroll') .icon('icon-park-outline:move') - .add(new Menu('概览').index()) - .add(new Menu('基础').url('/base')) + .scope('/dashboard/demo/component/scroll') + .add(routeMenus({ + match: /^dashboard-demo-component-scroll/, + basePath: 'demo/component/scroll' + })) export const dashboardDemoComponentSvgMenus = new Menu('SVG') .icon('icon-park-outline:pic-one') .scope('/dashboard/demo/component/svg') - .add(new Menu('概览').index()) - .add(new Menu('基础').url('/base')) - .add(new Menu('尺寸').url('/size')) + .add(routeMenus({ + match: /^dashboard-demo-component-svg/, + basePath: 'demo/component/svg' + })) export const dashboardDemoComponentIconMenus = new Menu('图标') .icon('icon-park-outline:emotion-happy') .scope('/dashboard/demo/component/icon') - .add(new Menu('概览').index()) - .add(new Menu('基础').url('/base')) + .add(routeMenus({ + match: /^dashboard-demo-component-icon/, + basePath: 'demo/component/icon' + })) export const dashboardDemoComponentBreakPointMenus = new Menu('断点') .icon('icon-park-outline:distribute-horizontally') .scope('/dashboard/demo/component/break-point') - .add(new Menu('概览').index()) - .add(new Menu('基础').url('/base')) - .add(new Menu('data').url('/data')) + .add(routeMenus({ + match: /^dashboard-demo-component-break-point/, + basePath: 'demo/component/break-point' + })) export const dashboardDemoComponentFlexMenus = new Menu('Flex') .icon('icon-park-outline:carousel') .scope('/dashboard/demo/component/flex') - .add(creatRouteMenus({ + .add(routeMenus({ match: /^dashboard-demo-component-flex/, basePath: 'demo/component/flex' })) @@ -77,10 +53,10 @@ export const dashboardDemoComponentMenus = new Menu('组件') .add(dashboardDemoComponentBreakPointMenus) .add(dashboardDemoComponentFlexMenus) -export const dashboardDemoLayoutDashboardMenus = new Menu('LayoutDashboard') +export const dashboardDemoLayoutDashboardMenus = new Menu('控制台布局') .icon('icon-park-outline:page') .scope('/dashboard/demo/layout/dashboard') - .add(creatRouteMenus({ + .add(routeMenus({ match: /^dashboard-demo-layout-dashboard/, basePath: 'demo/layout/dashboard' })) @@ -93,7 +69,7 @@ export const dashboardDemoLayoutMenus = new Menu('布局') export const dashboardDocumentMenus = new Menu('文档') .icon('icon-park-outline:doc-detail') .scope('/dashboard/document') - .add([ - new Menu('doc-1').url('/page1'), - new Menu('doc-2').url('/page2') - ]) + .add(routeMenus({ + match: /^dashboard-document/, + basePath: 'document' + })) diff --git a/d2/utils/menu.js b/d2/utils/menu.js index ec7f15e5..0889f83d 100644 --- a/d2/utils/menu.js +++ b/d2/utils/menu.js @@ -1,5 +1,7 @@ import { nanoid } from 'nanoid' -import { isArray, cloneDeep, omit } from 'lodash-es' +import { isArray, cloneDeep, omit, get, pick } from 'lodash-es' +import { flattenObjectArray } from 'd2/utils/array.js' +import routes from 'virtual:generated-pages' export const _k_id = '_id' export const _k_children = 'children' @@ -98,3 +100,26 @@ export class Menu { } } } + +const routesFlat = flattenObjectArray( + routes, + 'children', + (item, _) => pick(item, ['name', 'path', 'meta']) +) + +function routesFilter (rule) { + return routesFlat.filter(route => rule.test(route.name)) +} + +function routeMenu (route, basePath) { + const url = route.path.replace(RegExp(`^${basePath}`), '') + const title = get(route.meta, 'd2admin.menu.title', url || '/') + if (!url) { + return new Menu(title).index() + } + return new Menu(title).url(url) +} + +export function routeMenus ({ match = /.+/, basePath = '' } = {}) { + return routesFilter(match).map(route => routeMenu(route, basePath)) +}