Skip to content

Commit 6d238a2

Browse files
committed
feat: 完成页面的基本布局
1 parent a019fd0 commit 6d238a2

File tree

5 files changed

+113
-8
lines changed

5 files changed

+113
-8
lines changed

src/features/tab/tabHooks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ export function useTabActions() {
154154

155155
const initTabs = _initTabs();
156156

157-
if (initTabs.length > 0 && !isTabInTabs(tab.id, initTabs)) {
157+
if (!initTabs || initTabs.length === 0 || (initTabs.length > 0 && !isTabInTabs(tab.id, initTabs))) {
158158
dispatch(addTab(tab));
159159
}
160160
} else if (!isTabInTabs(tab.id, tabs)) {

src/layouts/base-layout/BaseLayout.tsx

Lines changed: 93 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,131 @@
1-
import { AdminLayout } from '@sa/materials';
2-
3-
import './index.scss';
1+
import { AdminLayout, LAYOUT_SCROLL_EL_ID } from '@sa/materials';
2+
import type { LayoutMode } from '@sa/materials';
3+
import { configResponsive } from 'ahooks';
44
import { Suspense } from 'react';
55

6+
import './index.scss';
67
import {
78
LAYOUT_MODE_HORIZONTAL,
89
LAYOUT_MODE_HORIZONTAL_MIX,
910
LAYOUT_MODE_VERTICAL,
1011
LAYOUT_MODE_VERTICAL_MIX
1112
} from '@/constants/common';
12-
import { MenuProvider } from '@/features/menu';
13+
import { MenuProvider, useMixMenuContext } from '@/features/menu';
1314
import GlobalTab from '@/features/tab/GlobalTab';
14-
import { getThemeSettings } from '@/features/theme';
15-
import { getSiderCollapse } from '@/layouts/appStore';
15+
import { getThemeSettings, setLayoutMode } from '@/features/theme';
1616

17+
import { getFullContent, getMixSiderFixed, getSiderCollapse, setIsMobile, setSiderCollapse } from '../appStore';
1718
import GlobalContent from '../modules/GlobalContent';
19+
import GlobalFooter from '../modules/GlobalFooter';
1820
import GlobalSider from '../modules/GlobalSider';
1921
import GlobalHeader from '../modules/global-header/GlobalHeader';
2022
import GlobalMenu from '../modules/global-menu';
2123
import ThemeDrawer from '../modules/theme-drawer';
2224

25+
configResponsive({ sm: 640 });
26+
2327
const BaseLayout = () => {
28+
const dispatch = useAppDispatch();
29+
2430
const themeSettings = useAppSelector(getThemeSettings);
2531

2632
const siderCollapse = useAppSelector(getSiderCollapse);
2733

34+
const fullContent = useAppSelector(getFullContent);
35+
36+
const responsive = useResponsive();
37+
38+
const mixSiderFixed = useAppSelector(getMixSiderFixed);
39+
40+
const { childLevelMenus, isActiveFirstLevelMenuHasChildren } = useMixMenuContext();
41+
2842
const siderVisible = themeSettings.layout.mode !== LAYOUT_MODE_HORIZONTAL;
2943

3044
const isVerticalMix = themeSettings.layout.mode === LAYOUT_MODE_VERTICAL_MIX;
3145

3246
const isHorizontalMix = themeSettings.layout.mode === LAYOUT_MODE_HORIZONTAL_MIX;
3347

48+
const layoutMode = themeSettings.layout.mode.includes(LAYOUT_MODE_VERTICAL)
49+
? LAYOUT_MODE_VERTICAL
50+
: LAYOUT_MODE_HORIZONTAL;
51+
52+
const isMobile = !responsive.sm;
53+
54+
function getSiderWidth() {
55+
const { reverseHorizontalMix } = themeSettings.layout;
56+
57+
const { mixChildMenuWidth, mixWidth, width } = themeSettings.sider;
58+
59+
if (isHorizontalMix && reverseHorizontalMix) {
60+
return isActiveFirstLevelMenuHasChildren ? width : 0;
61+
}
62+
63+
let w = isVerticalMix || isHorizontalMix ? mixWidth : width;
64+
65+
if (isVerticalMix && mixSiderFixed && childLevelMenus.length) {
66+
w += mixChildMenuWidth;
67+
}
68+
69+
return w;
70+
}
71+
72+
const siderWidth = getSiderWidth();
73+
74+
function getSiderCollapsedWidth() {
75+
const { reverseHorizontalMix } = themeSettings.layout;
76+
const { collapsedWidth, mixChildMenuWidth, mixCollapsedWidth } = themeSettings.sider;
77+
78+
if (isHorizontalMix && reverseHorizontalMix) {
79+
return isActiveFirstLevelMenuHasChildren ? collapsedWidth : 0;
80+
}
81+
82+
let w = isVerticalMix || isHorizontalMix ? mixCollapsedWidth : collapsedWidth;
83+
84+
if (isVerticalMix && mixSiderFixed && childLevelMenus.length) {
85+
w += mixChildMenuWidth;
86+
}
87+
88+
return w;
89+
}
90+
const siderCollapsedWidth = getSiderCollapsedWidth();
91+
92+
function updateSiderCollapse() {
93+
dispatch(setSiderCollapse(true));
94+
}
95+
96+
useLayoutEffect(() => {
97+
dispatch(setIsMobile(isMobile));
98+
if (isMobile) {
99+
dispatch(setLayoutMode('vertical'));
100+
}
101+
}, [isMobile, dispatch]);
102+
34103
return (
35104
<MenuProvider>
36105
<AdminLayout
106+
fixedFooter={themeSettings.footer.fixed}
107+
fixedTop={themeSettings.fixedHeaderAndTab}
108+
Footer={<GlobalFooter />}
109+
footerHeight={themeSettings.footer.height}
110+
footerVisible={themeSettings.footer.visible}
111+
fullContent={fullContent}
112+
headerHeight={themeSettings.header.height}
113+
isMobile={isMobile}
114+
mode={layoutMode as LayoutMode}
115+
rightFooter={themeSettings.footer.right}
116+
scrollElId={LAYOUT_SCROLL_EL_ID}
37117
scrollMode={themeSettings.layout.scrollMode}
38118
siderCollapse={siderCollapse}
119+
siderCollapsedWidth={siderCollapsedWidth}
120+
siderVisible={siderVisible}
121+
siderWidth={siderWidth}
39122
Tab={<GlobalTab />}
123+
tabHeight={themeSettings.tab.height}
124+
tabVisible={themeSettings.tab.visible}
125+
updateSiderCollapse={updateSiderCollapse}
40126
Header={
41127
<GlobalHeader
128+
isMobile={isMobile}
42129
mode={themeSettings.layout.mode}
43130
reverse={themeSettings.layout.reverseHorizontalMix}
44131
siderWidth={themeSettings.sider.width}

src/layouts/modules/GlobalFooter.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import DarkModeContainer from '@/components/DarkModeContainer';
2+
3+
const GlobalFooter = () => {
4+
return (
5+
<DarkModeContainer className="h-full flex-center">
6+
<a
7+
href="https://github.com/honghuangdc/soybean-admin/blob/main/LICENSE"
8+
rel="noopener noreferrer"
9+
target="_blank"
10+
>
11+
Copyright MIT © 2021 Soybean
12+
</a>
13+
</DarkModeContainer>
14+
);
15+
};
16+
17+
export default GlobalFooter;

src/layouts/modules/global-header/GlobalHeader.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ const GlobalHeader: FC<Props> = memo(({ isMobile, mode, reverse, siderWidth }) =
6565
className="h-full flex-y-center flex-1-hidden"
6666
id={GLOBAL_HEADER_MENU_ID}
6767
>
68-
<GlobalBreadcrumb className="ml-12px" />
68+
{!isMobile && !showMenu && <GlobalBreadcrumb className="ml-12px" />}
6969
</div>
7070

7171
<div className="h-full flex-y-center justify-end">

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import Vertical from './Vertical';
44
const ReversedHorizontalMix = () => {
55
return [
66
<Vertical key="vertical" />,
7+
78
<Horizontal
89
key="ReversedHorizontalMix "
910
mode="3"

0 commit comments

Comments
 (0)