import './index.less'; import type { FunctionalComponent } from 'vue'; import { defineComponent, unref, computed, ref, nextTick } from 'vue'; import { Layout, Tooltip, Badge } from 'ant-design-vue'; import { AppLogo } from '/@/components/Application'; import UserDropdown from './UserDropdown'; import LayoutMenu from '../menu'; import LayoutBreadcrumb from './LayoutBreadcrumb'; import LockAction from '../lock/LockAction'; import LayoutTrigger from '../LayoutTrigger'; import NoticeAction from './notice/NoticeActionItem.vue'; import { RedoOutlined, FullscreenExitOutlined, FullscreenOutlined, LockOutlined, BugOutlined, } from '@ant-design/icons-vue'; import { useModal } from '/@/components/Modal'; import { useFullscreen } from '/@/hooks/web/useFullScreen'; import { useTabs } from '/@/hooks/web/useTabs'; import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn'; import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting'; import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; import { useRootSetting } from '/@/hooks/setting/useRootSetting'; import { useRouter } from 'vue-router'; import { errorStore } from '/@/store/modules/error'; import { PageEnum } from '/@/enums/pageEnum'; import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum'; import { Component } from '/@/components/types'; interface TooltipItemProps { title: string; } const TooltipItem: FunctionalComponent = (props, { slots }) => { return ( {{ title: () => props.title, default: () => slots.default?.(), }} ); }; export default defineComponent({ name: 'LayoutHeader', props: { fixed: { type: Boolean, default: false, }, }, setup(props) { let logoEl: Element | null; const logoWidthRef = ref(200); const logoRef = ref(null); const { refreshPage } = useTabs(); const { getShowTopMenu, getShowHeaderTrigger, getSplit, getTopMenuAlign } = useMenuSetting(); const { getUseErrorHandle, getShowBreadCrumbIcon } = useRootSetting(); const { getHeaderTheme, getShowRedo, getUseLockPage, getShowFullScreen, getShowNotice, getShowContent, getShowBread, getShowHeaderLogo, } = useHeaderSetting(); const { push } = useRouter(); const [register, { openModal }] = useModal(); const { toggleFullscreen, isFullscreenRef } = useFullscreen(); useWindowSizeFn( () => { nextTick(() => { if (!unref(getShowTopMenu)) return; let width = 0; if (!logoEl) { logoEl = logoRef.value.$el; } else { width += logoEl.clientWidth; } logoWidthRef.value = width + 80; }); }, 200, { immediate: true } ); const headerClass = computed(() => { const theme = unref(getHeaderTheme); return theme ? `layout-header__header--${theme}` : ''; }); const getSplitType = computed(() => { return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE; }); const getMenuMode = computed(() => { return unref(getSplit) ? MenuModeEnum.HORIZONTAL : null; }); function handleToErrorList() { push(PageEnum.ERROR_LOG_PAGE).then(() => { errorStore.commitErrorListCountState(0); }); } function handleLockPage() { openModal(true); } function renderHeaderContent() { const width = unref(logoWidthRef); return (
{unref(getShowHeaderLogo) && ( )} {unref(getShowContent) && (
{unref(getShowHeaderTrigger) && ( )} {unref(getShowBread) && }
)} {unref(getShowTopMenu) && (
)}
); } function renderActionDefault(Comp: Component | any, event: Fn) { return (
); } function renderAction() { return (
{unref(getUseErrorHandle) && ( {() => ( {() => renderActionDefault(BugOutlined, handleToErrorList)} )} )} {unref(getUseLockPage) && ( {() => renderActionDefault(LockOutlined, handleLockPage)} )} {unref(getShowNotice) && ( {() => } )} {unref(getShowRedo) && ( {() => renderActionDefault(RedoOutlined, refreshPage)} )} {unref(getShowFullScreen) && ( {() => { const Icon = !unref(isFullscreenRef) ? ( ) : ( ); return renderActionDefault(Icon, toggleFullscreen); }} )}
); } function renderHeaderDefault() { return ( <> {renderHeaderContent()} {renderAction()} ); } return () => { return ( {() => renderHeaderDefault()} ); }; }, });