You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.5 KiB
150 lines
4.5 KiB
import PageBreadcrumb from '@/components/breadcrumb'
|
|
import ErrorPage from '@/components/error/error.tsx'
|
|
import SelectLang from '@/components/select-lang'
|
|
import { useTranslation } from '@/i18n.ts'
|
|
import { MenuItem } from '@/types'
|
|
import { ProConfigProvider, ProLayout, } from '@ant-design/pro-components'
|
|
import { CatchBoundary, Link, Outlet, useRouteContext } from '@tanstack/react-router'
|
|
import { ConfigProvider, Dropdown } from 'antd'
|
|
import { useState } from 'react'
|
|
import Icon from '../components/icon'
|
|
import defaultProps from './_defaultProps'
|
|
|
|
|
|
//根据menuData生成Breadcrumb所需的数据
|
|
const getBreadcrumbData = (menuData: MenuItem[], pathname: string) => {
|
|
const breadcrumbData: any[] = []
|
|
const findItem = (menuData: any[], pathname: string) => {
|
|
for (let i = 0; i < menuData.length; i++) {
|
|
if (menuData[i].path === pathname) {
|
|
breadcrumbData.push(menuData[i])
|
|
return true
|
|
}
|
|
if (menuData[i].children) {
|
|
if (findItem(menuData[i].children, pathname)) {
|
|
breadcrumbData.push(menuData[i])
|
|
return true
|
|
}
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
findItem(menuData, pathname)
|
|
return breadcrumbData.reverse()
|
|
}
|
|
|
|
export default () => {
|
|
|
|
const { t } = useTranslation()
|
|
const { menuData } = useRouteContext({
|
|
from: undefined,
|
|
strict: false,
|
|
select: (state) => state
|
|
})
|
|
|
|
const items = getBreadcrumbData(menuData, location.pathname)
|
|
|
|
const [ pathname, setPathname ] = useState(location.pathname)
|
|
|
|
return (
|
|
<div
|
|
id="crazy-pro-layout"
|
|
style={{
|
|
height: '100vh',
|
|
// overflow: 'auto',
|
|
}}
|
|
>
|
|
<CatchBoundary
|
|
getResetKey={() => 'reset-page'}
|
|
errorComponent={ErrorPage}
|
|
>
|
|
<ProConfigProvider hashed={false}>
|
|
<ConfigProvider
|
|
getTargetContainer={() => {
|
|
return document.getElementById('crazy-pro-layout') || document.body
|
|
}}
|
|
>
|
|
<ProLayout
|
|
headerContentRender={() => <PageBreadcrumb
|
|
className={'top-breadcrumb'}
|
|
showIcon={false}
|
|
items={items}/>}
|
|
title="Crazy Pro"
|
|
{...defaultProps}
|
|
route={{
|
|
path: '/',
|
|
routes: menuData
|
|
}}
|
|
location={{
|
|
pathname,
|
|
}}
|
|
token={{
|
|
header: {
|
|
colorBgMenuItemSelected: 'rgba(0,0,0,0.04)',
|
|
},
|
|
}}
|
|
menu={{
|
|
collapsedShowGroupTitle: true,
|
|
}}
|
|
avatarProps={{
|
|
src: 'https://gw.alipayobjects.com/zos/antfincdn/efFD%24IOql2/weixintupian_20170331104822.jpg',
|
|
size: 'small',
|
|
title: '管理员',
|
|
render: (_, dom) => {
|
|
return (
|
|
<Dropdown
|
|
menu={{
|
|
items: [
|
|
{
|
|
key: 'logout',
|
|
icon: <Icon type={'Logout'}/>,
|
|
label: t('app.header.logout'),
|
|
},
|
|
],
|
|
}}
|
|
>
|
|
{dom}
|
|
</Dropdown>
|
|
)
|
|
},
|
|
}}
|
|
actionsRender={(props) => {
|
|
if (props.isMobile) return []
|
|
if (typeof window === 'undefined') return []
|
|
return [
|
|
<SelectLang/>
|
|
]
|
|
}}
|
|
menuRender={(_, defaultDom) => (
|
|
<>
|
|
{defaultDom}
|
|
</>
|
|
)}
|
|
menuItemRender={(item, dom) => {
|
|
return <div onClick={() => {
|
|
setPathname(item.path || '/welcome')
|
|
}}
|
|
>
|
|
<Link to={item.path} target={item.type === 3 ? '_blank' : '_self'}>
|
|
{dom}
|
|
</Link>
|
|
</div>
|
|
}}
|
|
{...{
|
|
'layout': 'mix',
|
|
'navTheme': 'light',
|
|
'contentWidth': 'Fluid',
|
|
'fixSiderbar': true,
|
|
'colorPrimary': '#1677FF',
|
|
'siderMenuType': 'group',
|
|
// layout: 'side',
|
|
}}
|
|
>
|
|
<Outlet/>
|
|
</ProLayout>
|
|
</ConfigProvider>
|
|
</ProConfigProvider>
|
|
</CatchBoundary>
|
|
</div>
|
|
)
|
|
}
|