feat: routeMenus
This commit is contained in:
parent
94065415d9
commit
72265e41fd
|
|
@ -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'
|
||||
}))
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue