feat: routeMenus

This commit is contained in:
FairyEver 2021-12-05 11:26:05 +08:00
parent 94065415d9
commit 72265e41fd
2 changed files with 53 additions and 52 deletions

View File

@ -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'
}))

View File

@ -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))
}