Skip to content

Commit 132fa6f

Browse files
committed
refactor(projects): refactor global menu & support reversed-horizontal-mix-menu
1 parent 185ff72 commit 132fa6f

File tree

16 files changed

+163
-52
lines changed

16 files changed

+163
-52
lines changed

src/layouts/base-layout/BaseLayout.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ const LAYOUT_MODE_VERTICAL: LayoutMode = 'vertical';
2323
const LAYOUT_MODE_HORIZONTAL: LayoutMode = 'horizontal';
2424
const LAYOUT_MODE_VERTICAL_MIX = 'vertical-mix';
2525
const LAYOUT_MODE_HORIZONTAL_MIX = 'horizontal-mix';
26-
// const breakpointsTailwind = { sm: 640, md: 768, lg: 1024, xl: 1280, '2xl': 1536 };
26+
2727
configResponsive({ sm: 640 });
28+
2829
const HEADER_PROPS_CONFIG: Record<UnionKey.ThemeLayoutMode, App.Global.HeaderProps> = {
2930
vertical: {
3031
showLogo: false,
@@ -54,7 +55,7 @@ const BaseLayout = () => {
5455
const fullContent = useAppSelector(getFullContent);
5556
const dispatch = useAppDispatch();
5657
const responsive = useResponsive();
57-
const { childLevelMenus } = useMixMenuContext();
58+
const { childLevelMenus, isActiveFirstLevelMenuHasChildren } = useMixMenuContext();
5859

5960
const contentXScrollable = useAppSelector(getContentXScrollable);
6061
const mixSiderFixed = useAppSelector(getMixSiderFixed);
@@ -70,8 +71,14 @@ const BaseLayout = () => {
7071
const isHorizontalMix = themeSettings.layout.mode === LAYOUT_MODE_HORIZONTAL_MIX;
7172

7273
function getSiderWidth() {
74+
const { reverseHorizontalMix } = themeSettings.layout;
75+
7376
const { width, mixWidth, mixChildMenuWidth } = themeSettings.sider;
7477

78+
if (isHorizontalMix && reverseHorizontalMix) {
79+
return isActiveFirstLevelMenuHasChildren ? width : 0;
80+
}
81+
7582
let w = isVerticalMix || isHorizontalMix ? mixWidth : width;
7683

7784
if (isVerticalMix && mixSiderFixed && childLevelMenus.length) {
@@ -82,8 +89,13 @@ const BaseLayout = () => {
8289
}
8390

8491
function getSiderCollapsedWidth() {
92+
const { reverseHorizontalMix } = themeSettings.layout;
8593
const { collapsedWidth, mixCollapsedWidth, mixChildMenuWidth } = themeSettings.sider;
8694

95+
if (isHorizontalMix && reverseHorizontalMix) {
96+
return isActiveFirstLevelMenuHasChildren ? collapsedWidth : 0;
97+
}
98+
8799
let w = isVerticalMix || isHorizontalMix ? mixCollapsedWidth : collapsedWidth;
88100

89101
if (isVerticalMix && mixSiderFixed && childLevelMenus.length) {
@@ -141,7 +153,10 @@ const BaseLayout = () => {
141153
>
142154
<GlobalContent />
143155

144-
<GlobalMenu mode={themeSettings.layout.mode} />
156+
<GlobalMenu
157+
reverse={themeSettings.layout.reverseHorizontalMix}
158+
mode={themeSettings.layout.mode}
159+
/>
145160

146161
<ThemeDrawer />
147162
</AdminLayout>

src/layouts/base-layout/MenuProvider.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ const MenuProvider: FC<Props> = ({ children }) => {
3737
activeFirstLevelMenuKey,
3838
setActiveFirstLevelMenuKey: changeActiveFirstLevelMenuKey,
3939
firstLevelMenu,
40-
isActiveFirstLevelMenuHasChildren: activeFirstLevelMenuKey ? Boolean(activeFirstLevelMenuKey) : false,
40+
isActiveFirstLevelMenuHasChildren: activeFirstLevelMenuKey ? Boolean(childLevelMenus) : false,
4141
childLevelMenus: childLevelMenus || []
4242
};
4343

src/layouts/modules/global-menu/components/FirstLevelMenu.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ function MixMenuItem(menu: MixMenuItemProps) {
6464
}
6565

6666
const FirstLevelMenu = ({ children, inverted, onSelect }: Props) => {
67-
const { firstLevelMenu } = useMixMenuContext();
67+
const { allMenus } = useMixMenuContext();
6868

6969
const siderCollapse = useAppSelector(getSiderCollapse);
7070
const activeMenuKey = useAppSelector(selectActiveFirstLevelMenuKey);
@@ -73,7 +73,7 @@ const FirstLevelMenu = ({ children, inverted, onSelect }: Props) => {
7373
<div className="h-full flex-col-stretch flex-1-hidden">
7474
{children}
7575
<SimpleScrollbar>
76-
{firstLevelMenu.map(item => (
76+
{allMenus.map(item => (
7777
<MixMenuItem
7878
onClick={() => onSelect(item as any)}
7979
isMini={siderCollapse}

src/layouts/modules/global-menu/components/HorizontalMenu.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import type { Route } from '@sa/simple-router';
22
import type { MenuInfo } from 'rc-menu/lib/interface';
3+
import type { FC } from 'react';
34
import { useRouterPush } from '@/hooks/common/routerPush';
45

6+
interface Props {
7+
mode: '1' | '2' | '3';
8+
}
9+
510
function getSelectKey(route: Route) {
611
const { hideInMenu, activeMenu } = route.meta;
712

@@ -12,10 +17,16 @@ function getSelectKey(route: Route) {
1217
return [routeName];
1318
}
1419

15-
const HorizontalMenu = memo(() => {
20+
const HorizontalMenu: FC<Props> = memo(({ mode }) => {
1621
const route = useRoute();
1722

18-
const { allMenus } = useMixMenuContext();
23+
const { allMenus, childLevelMenus, firstLevelMenu } = useMixMenuContext();
24+
25+
const menus = new Map([
26+
['1', allMenus as any],
27+
['2', childLevelMenus],
28+
['3', firstLevelMenu]
29+
]);
1930

2031
const router = useRouterPush();
2132

@@ -28,7 +39,7 @@ const HorizontalMenu = memo(() => {
2839
return (
2940
<AMenu
3041
mode="horizontal"
31-
items={allMenus}
42+
items={menus.get(mode)}
3243
inlineIndent={18}
3344
onSelect={handleClickMenu}
3445
className="size-full bg-container transition-300 border-0!"

src/layouts/modules/global-menu/components/VerticalMenu.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ const getSelectedMenuKeyPath = (matches: RouteRecordNormalized[]) => {
5050
const VerticalMenu = memo(() => {
5151
const route = useRoute();
5252

53-
const { allMenus } = useMixMenuContext();
53+
const { allMenus, childLevelMenus } = useMixMenuContext();
5454

5555
const levelKeys = getLevelKeys(allMenus as LevelKeysProps[]);
5656

@@ -103,7 +103,7 @@ const VerticalMenu = memo(() => {
103103
<SimpleScrollbar>
104104
<AMenu
105105
mode="inline"
106-
items={allMenus}
106+
items={themeSettings.layout.mode.includes('mix') ? childLevelMenus : allMenus}
107107
inlineCollapsed={inlineCollapsed}
108108
openKeys={stateOpenKeys}
109109
onOpenChange={onOpenChange}

src/layouts/modules/global-menu/index.tsx

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,24 @@
1-
import type { SubMenuType } from 'antd/es/menu/interface';
2-
import { setActiveFirstLevelMenuKey } from '@/store/slice/tab';
3-
import VerticalMixMenu from './modules/VerticalMixMenu';
1+
import HorizontalMix from './modules/HorizontalMix';
2+
import VerticalMixMenu from './modules/VerticalMix';
43
import HorizontalMenu from './modules/Horizontal';
54
import VerticalMenu from './modules/Vertical';
6-
import FirstLevelMenu from './components/FirstLevelMenu';
5+
import ReversedHorizontalMix from './modules/ReversedHorizontalMix';
76

87
interface Props {
98
mode: UnionKey.ThemeLayoutMode;
9+
reverse: boolean;
1010
}
1111

12-
const GlobalMenu: FC<Props> = memo(({ mode }) => {
13-
const dispatch = useAppDispatch();
14-
15-
const router = useRouterPush();
16-
function handleSelectMixMenu(menu: SubMenuType) {
17-
dispatch(setActiveFirstLevelMenuKey(menu.key));
18-
19-
if (!menu.children?.length) {
20-
router.routerPush({ name: menu.key });
21-
}
22-
}
23-
24-
const componentsMap = {
25-
vertical: <VerticalMenu />,
26-
'vertical-mix': <VerticalMixMenu />,
27-
horizontal: <HorizontalMenu />,
28-
'horizontal-mix': [
29-
<HorizontalMenu key={1} />,
30-
<FirstLevelMenu
31-
key={2}
32-
onSelect={handleSelectMixMenu}
33-
/>
34-
]
35-
};
12+
const GlobalMenu: FC<Props> = memo(({ mode, reverse }) => {
13+
const componentsMap = useMemo(
14+
() => ({
15+
vertical: <VerticalMenu />,
16+
'vertical-mix': <VerticalMixMenu />,
17+
horizontal: <HorizontalMenu />,
18+
'horizontal-mix': reverse ? <ReversedHorizontalMix /> : <HorizontalMix />
19+
}),
20+
[reverse]
21+
);
3622

3723
return componentsMap[mode];
3824
});

src/layouts/modules/global-menu/modules/Horizontal.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { GLOBAL_HEADER_MENU_ID } from '@/constants/app';
33
import HorizontalMenu from '../components/HorizontalMenu';
44
import { useGetElementById } from './hook';
55

6-
const Horizontal = () => {
6+
const Horizontal = ({ mode = '1' }: { mode?: '1' | '2' | '3' }) => {
77
const container = useGetElementById(GLOBAL_HEADER_MENU_ID);
88

99
if (!container) return null;
1010

11-
return createPortal(<HorizontalMenu />, container);
11+
return createPortal(<HorizontalMenu mode={mode} />, container);
1212
};
1313

1414
export default Horizontal;
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { createPortal } from 'react-dom';
2+
import type { SubMenuType } from 'antd/es/menu/interface';
3+
import { GLOBAL_SIDER_MENU_ID } from '@/constants/app';
4+
import { setActiveFirstLevelMenuKey } from '@/store/slice/tab';
5+
import FirstLevelMenu from '../components/FirstLevelMenu';
6+
import { useGetElementById } from './hook';
7+
import Horizontal from './Horizontal';
8+
9+
const HorizontalMix = () => {
10+
const container = useGetElementById(GLOBAL_SIDER_MENU_ID);
11+
12+
const dispatch = useAppDispatch();
13+
14+
const router = useRouterPush();
15+
16+
function handleSelectMixMenu(menu: SubMenuType) {
17+
dispatch(setActiveFirstLevelMenuKey(menu.key));
18+
19+
if (!menu.children?.length) {
20+
router.routerPush({ name: menu.key });
21+
}
22+
}
23+
24+
if (!container) return null;
25+
26+
return [
27+
<Horizontal
28+
mode="2"
29+
key="horizontal"
30+
/>,
31+
createPortal(
32+
<FirstLevelMenu
33+
key="first-level-menu"
34+
onSelect={handleSelectMixMenu}
35+
/>,
36+
container
37+
)
38+
];
39+
};
40+
41+
export default HorizontalMix;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import Vertical from './Vertical';
2+
import Horizontal from './Horizontal';
3+
4+
const ReversedHorizontalMix = () => {
5+
return [
6+
<Vertical key="vertical" />,
7+
<Horizontal
8+
key="ReversedHorizontalMix "
9+
mode="3"
10+
/>
11+
];
12+
};
13+
14+
export default ReversedHorizontalMix;

src/layouts/modules/global-menu/modules/VerticalMixMenu.tsx renamed to src/layouts/modules/global-menu/modules/VerticalMix.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ const VerticalMix = memo(() => {
3838
}
3939
}
4040
function handleResetActiveMenu() {
41+
setDrawerVisible(false);
4142
const firstLevelRouteName = getActiveFirstLevelMenuKey(router.currentRoute);
4243
dispatch(setActiveFirstLevelMenuKey(firstLevelRouteName));
43-
setDrawerVisible(false);
4444
}
4545

4646
return (

0 commit comments

Comments
 (0)