vben
authored
|
1
|
import { defineComponent, unref, computed, ref } from 'vue';
|
vben
authored
|
2
|
|
vben
authored
|
3
|
import { Layout, Tooltip, Badge } from 'ant-design-vue';
|
vben
authored
|
4
|
import Logo from '/@/layouts/logo/index.vue';
|
|
5
|
import UserDropdown from './UserDropdown';
|
vben
authored
|
6
|
import LayoutMenu from '/@/layouts/default/menu/LayoutMenu';
|
|
7
|
import LayoutBreadcrumb from './LayoutBreadcrumb';
|
vben
authored
|
8
9
10
|
import LockAction from './LockActionItem';
import LayoutTrigger from '../LayoutTrigger';
import NoticeAction from './notice/NoticeActionItem.vue';
|
|
11
12
13
14
15
16
|
import {
RedoOutlined,
FullscreenExitOutlined,
FullscreenOutlined,
GithubFilled,
LockOutlined,
|
vben
authored
|
17
|
BugOutlined,
|
|
18
|
} from '@ant-design/icons-vue';
|
vben
authored
|
19
|
|
|
20
21
|
import { useFullscreen } from '/@/hooks/web/useFullScreen';
import { useTabs } from '/@/hooks/web/useTabs';
|
vben
authored
|
22
|
import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
|
vben
authored
|
23
|
import { useRouter } from 'vue-router';
|
vben
authored
|
24
25
26
27
28
|
import { useModal } from '/@/components/Modal/index';
import { appStore } from '/@/store/modules/app';
import { errorStore } from '/@/store/modules/error';
|
vben
authored
|
29
|
import { MenuModeEnum, MenuSplitTyeEnum, MenuTypeEnum, TriggerEnum } from '/@/enums/menuEnum';
|
vben
authored
|
30
|
import { GITHUB_URL } from '/@/settings/siteSetting';
|
vben
authored
|
31
32
|
import './index.less';
|
|
33
34
35
|
export default defineComponent({
name: 'DefaultLayoutHeader',
setup() {
|
vben
authored
|
36
|
const widthRef = ref(200);
|
vben
authored
|
37
38
|
let logoEl: Element | null;
|
vben
authored
|
39
40
|
const { refreshPage } = useTabs();
const { push } = useRouter();
|
|
41
42
|
const [register, { openModal }] = useModal();
const { toggleFullscreen, isFullscreenRef } = useFullscreen();
|
vben
authored
|
43
|
|
|
44
45
46
|
const getProjectConfigRef = computed(() => {
return appStore.getProjectConfig;
});
|
vben
authored
|
47
|
|
vben
authored
|
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
const showTopMenu = computed(() => {
const getProjectConfig = unref(getProjectConfigRef);
const {
menuSetting: { mode, split: splitMenu },
} = getProjectConfig;
return mode === MenuModeEnum.HORIZONTAL || splitMenu;
});
useWindowSizeFn(
() => {
if (!unref(showTopMenu)) return;
let width = 0;
if (!logoEl) {
logoEl = document.querySelector('.layout-header__logo');
}
if (logoEl) {
width += logoEl.clientWidth;
}
widthRef.value = width + 60;
},
200,
{ immediate: true }
);
|
|
71
72
73
74
75
76
77
78
79
|
function goToGithub() {
window.open(GITHUB_URL, '__blank');
}
const headerClass = computed(() => {
const theme = unref(getProjectConfigRef).headerSetting.theme;
return theme ? `layout-header__header--${theme}` : '';
});
|
vben
authored
|
80
|
|
vben
authored
|
81
|
const showHeaderTrigger = computed(() => {
|
vben
authored
|
82
83
|
const { show, trigger, hidden, type } = unref(getProjectConfigRef).menuSetting;
if (type === MenuTypeEnum.TOP_MENU || !show || !hidden) return false;
|
vben
authored
|
84
85
86
|
return trigger === TriggerEnum.HEADER;
});
|
vben
authored
|
87
88
|
function handleToErrorList() {
errorStore.commitErrorListCountState(0);
|
vben
authored
|
89
|
push('/exception/error-log');
|
vben
authored
|
90
91
|
}
|
|
92
93
94
95
96
97
|
/**
* @description: 锁定屏幕
*/
function handleLockPage() {
openModal(true);
}
|
vben
authored
|
98
|
|
|
99
100
101
|
return () => {
const getProjectConfig = unref(getProjectConfigRef);
const {
|
vben
authored
|
102
|
useErrorHandle,
|
|
103
|
showLogo,
|
vben
authored
|
104
|
multiTabsSetting: { show: showTab },
|
|
105
106
107
108
109
110
111
112
|
headerSetting: {
theme: headerTheme,
useLockPage,
showRedo,
showGithub,
showFullScreen,
showNotice,
},
|
|
113
114
|
menuSetting: { mode, type: menuType, split: splitMenu, topMenuAlign },
showBreadCrumb,
|
|
115
|
showBreadCrumbIcon,
|
|
116
117
118
|
} = getProjectConfig;
const isSidebarType = menuType === MenuTypeEnum.SIDEBAR;
|
vben
authored
|
119
|
|
vben
authored
|
120
|
const width = unref(widthRef);
|
vben
authored
|
121
|
|
|
122
|
return (
|
nebv
authored
|
123
|
<Layout.Header class={['layout-header', 'flex p-0 px-4 ', unref(headerClass)]}>
|
|
124
125
|
{() => (
<>
|
nebv
authored
|
126
|
<div class="layout-header__content ">
|
vben
authored
|
127
128
|
{showLogo && !isSidebarType && (
<Logo class={`layout-header__logo`} theme={headerTheme} />
|
|
129
|
)}
|
vben
authored
|
130
131
132
133
134
135
136
137
|
<div class="layout-header__left">
{unref(showHeaderTrigger) && <LayoutTrigger theme={headerTheme} sider={false} />}
{mode !== MenuModeEnum.HORIZONTAL && showBreadCrumb && !splitMenu && (
<LayoutBreadcrumb showIcon={showBreadCrumbIcon} />
)}
</div>
|
vben
authored
|
138
139
|
{unref(showTopMenu) && (
<div
|
vben
authored
|
140
|
class={[`layout-header__menu `]}
|
vben
authored
|
141
142
|
style={{ width: `calc(100% - ${unref(width)}px)` }}
>
|
|
143
|
<LayoutMenu
|
vben
authored
|
144
145
|
isTop={true}
class={`justify-${topMenuAlign}`}
|
|
146
147
148
149
150
151
152
153
154
155
|
theme={headerTheme}
splitType={splitMenu ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE}
menuMode={splitMenu ? MenuModeEnum.HORIZONTAL : null}
showSearch={false}
/>
</div>
)}
</div>
<div class={`layout-header__action`}>
|
vben
authored
|
156
157
158
159
160
161
162
163
|
{useErrorHandle && (
<Tooltip>
{{
title: () => '错误日志',
default: () => (
<Badge
count={errorStore.getErrorListCountState}
offset={[0, 10]}
|
vben
authored
|
164
|
dot
|
vben
authored
|
165
166
167
168
169
170
171
172
173
174
175
176
177
|
overflowCount={99}
>
{() => (
<div class={`layout-header__action-item`} onClick={handleToErrorList}>
<BugOutlined class={`layout-header__action-icon`} />
</div>
)}
</Badge>
),
}}
</Tooltip>
)}
|
|
178
179
180
181
182
183
184
185
186
187
188
189
|
{showGithub && (
<Tooltip>
{{
title: () => 'github',
default: () => (
<div class={`layout-header__action-item`} onClick={goToGithub}>
<GithubFilled class={`layout-header__action-icon`} />
</div>
),
}}
</Tooltip>
)}
|
vben
authored
|
190
|
{useLockPage && (
|
|
191
192
193
194
195
196
197
198
199
200
201
|
<Tooltip>
{{
title: () => '锁定屏幕',
default: () => (
<div class={`layout-header__action-item`} onClick={handleLockPage}>
<LockOutlined class={`layout-header__action-icon`} />
</div>
),
}}
</Tooltip>
)}
|
|
202
203
204
205
|
{showNotice && (
<div>
<Tooltip>
{{
|
vben
authored
|
206
207
|
title: () => '消息通知',
default: () => <NoticeAction />,
|
|
208
209
210
211
|
}}
</Tooltip>
</div>
)}
|
vben
authored
|
212
|
{showRedo && showTab && (
|
|
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
|
<Tooltip>
{{
title: () => '刷新',
default: () => (
<div class={`layout-header__action-item`} onClick={refreshPage}>
<RedoOutlined class={`layout-header__action-icon`} />
</div>
),
}}
</Tooltip>
)}
{showFullScreen && (
<Tooltip>
{{
title: () => (unref(isFullscreenRef) ? '退出全屏' : '全屏'),
default: () => {
const Icon: any = !unref(isFullscreenRef) ? (
<FullscreenOutlined />
) : (
<FullscreenExitOutlined />
);
return (
<div class={`layout-header__action-item`} onClick={toggleFullscreen}>
<Icon class={`layout-header__action-icon`} />
</div>
);
},
}}
</Tooltip>
)}
<UserDropdown class={`layout-header__user-dropdown`} />
</div>
<LockAction onRegister={register} />
</>
)}
</Layout.Header>
);
};
},
});
|