123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- <template>
- <Layout.Header :class="getHeaderClass" style="height: auto; padding-inline: 0">
- <!-- left start -->
- <div :class="`${prefixCls}-left`">
- <!-- logo -->
- <AppLogo
- v-if="getShowHeaderLogo || getIsMobile"
- :class="`${prefixCls}-logo`"
- :theme="getHeaderTheme"
- :style="getLogoWidth"
- />
- <LayoutTrigger
- v-if="
- (getShowContent && getShowHeaderTrigger && !getSplit && !getIsMixSidebar) || getIsMobile
- "
- :theme="getHeaderTheme"
- :sider="false"
- />
- <LayoutBreadcrumb v-if="getShowContent && getShowBread" :theme="getHeaderTheme" />
- </div>
- <!-- left end -->
- <!-- menu start -->
- <div v-if="getShowTopMenu && !getIsMobile" :class="`${prefixCls}-menu`">
- <LayoutMenu
- :isHorizontal="true"
- :theme="getHeaderTheme"
- :splitType="getSplitType"
- :menuMode="getMenuMode"
- />
- </div>
- <!-- menu-end -->
- <!-- action -->
- <div :class="`${prefixCls}-action`">
- <AppSearch v-if="getShowSearch" :class="`${prefixCls}-action__item `" />
- <ErrorAction v-if="getUseErrorHandle" :class="`${prefixCls}-action__item error-action`" />
- <Notify v-if="getShowNotice" :class="`${prefixCls}-action__item notify-item`" />
- <FullScreen v-if="getShowFullScreen" :class="`${prefixCls}-action__item fullscreen-item`" />
- <AppLocalePicker
- v-if="getShowLocalePicker"
- :reload="true"
- :showText="false"
- :class="`${prefixCls}-action__item`"
- />
- <UserDropDown :theme="getHeaderTheme" />
- <SettingDrawer v-if="getShowSetting" :class="`${prefixCls}-action__item`" />
- </div>
- </Layout.Header>
- </template>
- <script lang="ts" setup>
- import { Layout } from 'ant-design-vue';
- import { computed, unref } from 'vue';
- import { AppLocalePicker, AppLogo, AppSearch } from '@/components/Application';
- import { SettingButtonPositionEnum } from '@/enums/appEnum';
- import { MenuModeEnum, MenuSplitTyeEnum } from '@/enums/menuEnum';
- import { useHeaderSetting } from '@/hooks/setting/useHeaderSetting';
- import { useMenuSetting } from '@/hooks/setting/useMenuSetting';
- import { useRootSetting } from '@/hooks/setting/useRootSetting';
- import { useAppInject } from '@/hooks/web/useAppInject';
- import { useDesign } from '@/hooks/web/useDesign';
- import { useLocale } from '@/locales/useLocale';
- import { createAsyncComponent } from '@/utils/factory/createAsyncComponent';
- import { propTypes } from '@/utils/propTypes';
- import LayoutMenu from '../menu/index.vue';
- import LayoutTrigger from '../trigger/index.vue';
- import { ErrorAction, FullScreen, LayoutBreadcrumb, Notify, UserDropDown } from './components';
- const SettingDrawer = createAsyncComponent(() => import('@/layouts/default/setting/index.vue'), {
- loading: true,
- });
- defineOptions({ name: 'LayoutHeader' });
- const props = defineProps({
- fixed: propTypes.bool,
- });
- const { prefixCls } = useDesign('layout-header');
- const {
- getShowTopMenu,
- getShowHeaderTrigger,
- getSplit,
- getIsMixMode,
- getMenuWidth,
- getIsMixSidebar,
- } = useMenuSetting();
- const { getUseErrorHandle, getShowSettingButton, getSettingButtonPosition } = useRootSetting();
- const {
- getHeaderTheme,
- getShowFullScreen,
- getShowNotice,
- getShowContent,
- getShowBread,
- getShowHeaderLogo,
- getShowHeader,
- getShowSearch,
- } = useHeaderSetting();
- const { getShowLocalePicker } = useLocale();
- const { getIsMobile } = useAppInject();
- const getHeaderClass = computed(() => {
- const theme = unref(getHeaderTheme);
- return [
- prefixCls,
- {
- [`${prefixCls}--fixed`]: props.fixed,
- [`${prefixCls}--mobile`]: unref(getIsMobile),
- [`${prefixCls}--${theme}`]: theme,
- },
- ];
- });
- const getShowSetting = computed(() => {
- if (!unref(getShowSettingButton)) {
- return false;
- }
- const settingButtonPosition = unref(getSettingButtonPosition);
- if (settingButtonPosition === SettingButtonPositionEnum.AUTO) {
- return unref(getShowHeader);
- }
- return settingButtonPosition === SettingButtonPositionEnum.HEADER;
- });
- const getLogoWidth = computed(() => {
- if (!unref(getIsMixMode) || unref(getIsMobile)) {
- return {};
- }
- const width = unref(getMenuWidth) < 180 ? 180 : unref(getMenuWidth);
- return { width: `${width}px` };
- });
- const getSplitType = computed(() => {
- return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE;
- });
- const getMenuMode = computed(() => {
- return unref(getSplit) ? MenuModeEnum.HORIZONTAL : null;
- });
- </script>
- <style lang="less">
- @import url('./index.less');
- </style>
|