import { defineComponent, unref, computed, ref } from 'vue'; import { Layout, Tooltip, Badge } from 'ant-design-vue'; import Logo from '/@/layouts/logo/index.vue'; import UserDropdown from './UserDropdown'; import LayoutMenu from '/@/layouts/default/menu/LayoutMenu'; import LayoutBreadcrumb from './LayoutBreadcrumb'; import LockAction from './LockActionItem'; import LayoutTrigger from '../LayoutTrigger'; import NoticeAction from './notice/NoticeActionItem.vue'; import { RedoOutlined, FullscreenExitOutlined, FullscreenOutlined, GithubFilled, LockOutlined, BugOutlined, } from '@ant-design/icons-vue'; import { useFullscreen } from '/@/hooks/web/useFullScreen'; import { useTabs } from '/@/hooks/web/useTabs'; import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn'; import { useRouter } from 'vue-router'; import { useModal } from '/@/components/Modal'; import { appStore } from '/@/store/modules/app'; import { errorStore } from '/@/store/modules/error'; import { MenuModeEnum, MenuSplitTyeEnum, MenuTypeEnum, TriggerEnum } from '/@/enums/menuEnum'; import { GITHUB_URL } from '/@/settings/siteSetting'; import './index.less'; export default defineComponent({ name: 'DefaultLayoutHeader', setup() { const widthRef = ref(200); let logoEl: Element | null; const { refreshPage } = useTabs(); const { push } = useRouter(); const [register, { openModal }] = useModal(); const { toggleFullscreen, isFullscreenRef } = useFullscreen(); const getProjectConfigRef = computed(() => { return appStore.getProjectConfig; }); 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 } ); function goToGithub() { window.open(GITHUB_URL, '__blank'); } const headerClass = computed(() => { const theme = unref(getProjectConfigRef).headerSetting.theme; return theme ? `layout-header__header--${theme}` : ''; }); const showHeaderTrigger = computed(() => { const { show, trigger, hidden, type } = unref(getProjectConfigRef).menuSetting; if (type === MenuTypeEnum.TOP_MENU || !show || !hidden) return false; return trigger === TriggerEnum.HEADER; }); function handleToErrorList() { errorStore.commitErrorListCountState(0); push('/exception/error-log'); } /** * @description: 锁定屏幕 */ function handleLockPage() { openModal(true); } return () => { const getProjectConfig = unref(getProjectConfigRef); const { useErrorHandle, showLogo, multiTabsSetting: { show: showTab }, headerSetting: { theme: headerTheme, useLockPage, showRedo, showGithub, showFullScreen, showNotice, }, menuSetting: { mode, type: menuType, split: splitMenu, topMenuAlign }, showBreadCrumb, showBreadCrumbIcon, } = getProjectConfig; const isSidebarType = menuType === MenuTypeEnum.SIDEBAR; const width = unref(widthRef); const showLeft = (mode !== MenuModeEnum.HORIZONTAL && showBreadCrumb && !splitMenu) || unref(showHeaderTrigger); return ( {() => ( <>
{showLogo && !isSidebarType && ( )} {showLeft && (
{unref(showHeaderTrigger) && ( )} {mode !== MenuModeEnum.HORIZONTAL && showBreadCrumb && !splitMenu && ( )}
)} {unref(showTopMenu) && (
)}
{useErrorHandle && ( {{ title: () => '错误日志', default: () => ( {() => (
)}
), }}
)} {showGithub && ( {{ title: () => 'github', default: () => (
), }}
)} {useLockPage && ( {{ title: () => '锁定屏幕', default: () => (
), }}
)} {showNotice && (
{{ title: () => '消息通知', default: () => , }}
)} {showRedo && showTab && ( {{ title: () => '刷新', default: () => (
), }}
)} {showFullScreen && ( {{ title: () => (unref(isFullscreenRef) ? '退出全屏' : '全屏'), default: () => { const Icon: any = !unref(isFullscreenRef) ? ( ) : ( ); return (
); }, }}
)}
)}
); }; }, });