1
This commit is contained in:
parent
07ce66be11
commit
df175bbf65
@ -1,66 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import { useSelector } from 'react-redux';
|
|
||||||
import { useNavigate, useLocation } from 'react-router-dom';
|
|
||||||
import { Sidebar, SidebarHeader, SidebarContent } from './ui/sidebar';
|
|
||||||
import { MenuItem, MenuGroup } from './ui/sidebar-menu';
|
|
||||||
import type { RootState } from '@/store';
|
|
||||||
import { MenuResponse, MenuTypeEnum } from '@/pages/System/Menu/types';
|
|
||||||
import { getIconComponent } from '@/config/icons';
|
|
||||||
|
|
||||||
interface AppMenuProps {
|
|
||||||
openKeys: string[];
|
|
||||||
onOpenChange: (keys: string[]) => void;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function AppMenu({ openKeys, onOpenChange }: AppMenuProps) {
|
|
||||||
const navigate = useNavigate();
|
|
||||||
const location = useLocation();
|
|
||||||
const menus = useSelector((state: RootState) => state.user.menus);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Sidebar>
|
|
||||||
<SidebarHeader>
|
|
||||||
<div className="text-lg font-semibold text-slate-900">Deploy Ease</div>
|
|
||||||
</SidebarHeader>
|
|
||||||
<SidebarContent>
|
|
||||||
<MenuGroup>
|
|
||||||
{menus?.filter(menu => menu.type !== MenuTypeEnum.BUTTON && !menu.hidden)
|
|
||||||
.map(menu => (
|
|
||||||
<MenuItem
|
|
||||||
key={menu.path || String(menu.id)}
|
|
||||||
icon={getIconComponent(menu.icon)}
|
|
||||||
title={menu.name}
|
|
||||||
active={location.pathname === menu.path}
|
|
||||||
expanded={openKeys.includes(menu.path || String(menu.id))}
|
|
||||||
onClick={() => {
|
|
||||||
if (menu.children?.length) {
|
|
||||||
onOpenChange(
|
|
||||||
openKeys.includes(menu.path || String(menu.id))
|
|
||||||
? openKeys.filter(key => key !== (menu.path || String(menu.id)))
|
|
||||||
: [...openKeys, menu.path || String(menu.id)]
|
|
||||||
);
|
|
||||||
} else if (menu.path) {
|
|
||||||
navigate(menu.path);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{menu.children?.map(child => (
|
|
||||||
<MenuItem
|
|
||||||
key={child.path || String(child.id)}
|
|
||||||
icon={getIconComponent(child.icon)}
|
|
||||||
title={child.name}
|
|
||||||
active={location.pathname === child.path}
|
|
||||||
onClick={() => {
|
|
||||||
if (child.path) {
|
|
||||||
navigate(child.path);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</MenuItem>
|
|
||||||
))}
|
|
||||||
</MenuGroup>
|
|
||||||
</SidebarContent>
|
|
||||||
</Sidebar>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
66
frontend/src/layouts/AppMenu.tsx
Normal file
66
frontend/src/layouts/AppMenu.tsx
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import {useSelector} from 'react-redux';
|
||||||
|
import {useNavigate, useLocation} from 'react-router-dom';
|
||||||
|
import {Sidebar, SidebarHeader, SidebarContent} from '@/components/ui/sidebar';
|
||||||
|
import {MenuItem, MenuGroup} from '@/components/ui/sidebar-menu';
|
||||||
|
import type {RootState} from '@/store';
|
||||||
|
import {MenuTypeEnum} from '@/pages/System/Menu/types';
|
||||||
|
import {getIconComponent} from '@/config/icons';
|
||||||
|
|
||||||
|
interface AppMenuProps {
|
||||||
|
openKeys: string[];
|
||||||
|
onOpenChange: (keys: string[]) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function AppMenu({openKeys, onOpenChange}: AppMenuProps) {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const location = useLocation();
|
||||||
|
const menus = useSelector((state: RootState) => state.user.menus);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Sidebar>
|
||||||
|
<SidebarHeader>
|
||||||
|
<div className="text-lg font-semibold text-slate-900">Deploy Ease</div>
|
||||||
|
</SidebarHeader>
|
||||||
|
<SidebarContent>
|
||||||
|
<MenuGroup>
|
||||||
|
{menus?.filter(menu => menu.type !== MenuTypeEnum.BUTTON && !menu.hidden)
|
||||||
|
.map(menu => (
|
||||||
|
<MenuItem
|
||||||
|
key={menu.path || String(menu.id)}
|
||||||
|
icon={getIconComponent(menu.icon)}
|
||||||
|
title={menu.name}
|
||||||
|
active={location.pathname === menu.path}
|
||||||
|
expanded={openKeys.includes(menu.path || String(menu.id))}
|
||||||
|
onClick={() => {
|
||||||
|
if (menu.children?.length) {
|
||||||
|
onOpenChange(
|
||||||
|
openKeys.includes(menu.path || String(menu.id))
|
||||||
|
? openKeys.filter(key => key !== (menu.path || String(menu.id)))
|
||||||
|
: [...openKeys, menu.path || String(menu.id)]
|
||||||
|
);
|
||||||
|
} else if (menu.path) {
|
||||||
|
navigate(menu.path);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{menu.children?.map(child => (
|
||||||
|
<MenuItem
|
||||||
|
key={child.path || String(child.id)}
|
||||||
|
icon={getIconComponent(child.icon)}
|
||||||
|
title={child.name}
|
||||||
|
active={location.pathname === child.path}
|
||||||
|
onClick={() => {
|
||||||
|
if (child.path) {
|
||||||
|
navigate(child.path);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
</MenuItem>
|
||||||
|
))}
|
||||||
|
</MenuGroup>
|
||||||
|
</SidebarContent>
|
||||||
|
</Sidebar>
|
||||||
|
);
|
||||||
|
}
|
||||||
@ -16,7 +16,7 @@ import {getWeather} from '../services/weather';
|
|||||||
import type {RootState} from '../store';
|
import type {RootState} from '../store';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import 'dayjs/locale/zh-cn';
|
import 'dayjs/locale/zh-cn';
|
||||||
import { AppMenu } from '@/components/AppMenu';
|
import { AppMenu } from './AppMenu';
|
||||||
import { Layout, LayoutContent, Header, Main } from '@/components/ui/layout';
|
import { Layout, LayoutContent, Header, Main } from '@/components/ui/layout';
|
||||||
|
|
||||||
const {confirm} = Modal;
|
const {confirm} = Modal;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user