LayoutHeader.tsx 6.3 KB
Newer Older
陈文彬 已提交
1
import { defineComponent, unref, computed } from 'vue';
V
vben 已提交
2
import { Layout, Tooltip, Badge } from 'ant-design-vue';
陈文彬 已提交
3 4 5 6 7 8 9 10 11 12 13 14
import Logo from '/@/layouts/Logo.vue';
import UserDropdown from './UserDropdown';
import LayoutMenu from './LayoutMenu';
import { appStore } from '/@/store/modules/app';
import { MenuModeEnum, MenuSplitTyeEnum, MenuTypeEnum } from '/@/enums/menuEnum';
import LayoutBreadcrumb from './LayoutBreadcrumb';
import {
  RedoOutlined,
  FullscreenExitOutlined,
  FullscreenOutlined,
  GithubFilled,
  LockOutlined,
V
vben 已提交
15
  BugOutlined,
陈文彬 已提交
16 17 18 19 20 21
} from '@ant-design/icons-vue';
import { useFullscreen } from '/@/hooks/web/useFullScreen';
import { useTabs } from '/@/hooks/web/useTabs';
import { GITHUB_URL } from '/@/settings/siteSetting';
import LockAction from './actions/LockActionItem';
import { useModal } from '/@/components/Modal/index';
V
vben 已提交
22 23
import { errorStore } from '/@/store/modules/error';
import { useGo } from '/@/hooks/web/usePage';
陈文彬 已提交
24 25 26 27 28 29 30

export default defineComponent({
  name: 'DefaultLayoutHeader',
  setup() {
    const { refreshPage } = useTabs();
    const [register, { openModal }] = useModal();
    const { toggleFullscreen, isFullscreenRef } = useFullscreen();
V
vben 已提交
31
    const go = useGo();
陈文彬 已提交
32 33 34 35 36 37 38 39 40 41 42 43
    const getProjectConfigRef = computed(() => {
      return appStore.getProjectConfig;
    });

    function goToGithub() {
      window.open(GITHUB_URL, '__blank');
    }

    const headerClass = computed(() => {
      const theme = unref(getProjectConfigRef).headerSetting.theme;
      return theme ? `layout-header__header--${theme}` : '';
    });
V
vben 已提交
44 45 46 47 48 49

    function handleToErrorList() {
      errorStore.commitErrorListCountState(0);
      go('/exception/error-log');
    }

陈文彬 已提交
50 51 52 53 54 55 56 57 58
    /**
     * @description: 锁定屏幕
     */
    function handleLockPage() {
      openModal(true);
    }
    return () => {
      const getProjectConfig = unref(getProjectConfigRef);
      const {
V
vben 已提交
59
        useErrorHandle,
陈文彬 已提交
60
        showLogo,
V
vben 已提交
61
        headerSetting: { theme: headerTheme, useLockPage, showRedo, showGithub, showFullScreen },
陈文彬 已提交
62 63 64 65 66 67
        menuSetting: { mode, type: menuType, split: splitMenu, topMenuAlign },
        showBreadCrumb,
      } = getProjectConfig;

      const isSidebarType = menuType === MenuTypeEnum.SIDEBAR;
      return (
N
nebv 已提交
68
        <Layout.Header class={['layout-header', 'flex p-0 px-4 ', unref(headerClass)]}>
陈文彬 已提交
69 70
          {() => (
            <>
N
nebv 已提交
71
              <div class="layout-header__content ">
陈文彬 已提交
72 73 74
                {showLogo && !isSidebarType && <Logo class={`layout-header__logo`} />}

                {mode !== MenuModeEnum.HORIZONTAL && showBreadCrumb && !splitMenu && (
陈文彬 已提交
75
                  <LayoutBreadcrumb />
陈文彬 已提交
76 77
                )}
                {(mode === MenuModeEnum.HORIZONTAL || splitMenu) && (
N
nebv 已提交
78
                  <div class={[`layout-header__menu `, `justify-${topMenuAlign}`]}>
陈文彬 已提交
79 80 81 82 83 84 85 86 87 88 89
                    <LayoutMenu
                      theme={headerTheme}
                      splitType={splitMenu ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE}
                      menuMode={splitMenu ? MenuModeEnum.HORIZONTAL : null}
                      showSearch={false}
                    />
                  </div>
                )}
              </div>

              <div class={`layout-header__action`}>
V
vben 已提交
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
                {useErrorHandle && (
                  <Tooltip>
                    {{
                      title: () => '错误日志',
                      default: () => (
                        <Badge
                          count={errorStore.getErrorListCountState}
                          offset={[0, 10]}
                          overflowCount={99}
                        >
                          {() => (
                            <div class={`layout-header__action-item`} onClick={handleToErrorList}>
                              <BugOutlined class={`layout-header__action-icon`} />
                            </div>
                          )}
                        </Badge>
                      ),
                    }}
                  </Tooltip>
                )}

陈文彬 已提交
111 112 113 114 115 116 117 118 119 120 121 122
                {showGithub && (
                  <Tooltip>
                    {{
                      title: () => 'github',
                      default: () => (
                        <div class={`layout-header__action-item`} onClick={goToGithub}>
                          <GithubFilled class={`layout-header__action-icon`} />
                        </div>
                      ),
                    }}
                  </Tooltip>
                )}
V
vben 已提交
123
                {useLockPage && (
陈文彬 已提交
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
                  <Tooltip>
                    {{
                      title: () => '锁定屏幕',
                      default: () => (
                        <div class={`layout-header__action-item`} onClick={handleLockPage}>
                          <LockOutlined class={`layout-header__action-icon`} />
                        </div>
                      ),
                    }}
                  </Tooltip>
                )}
                {showRedo && (
                  <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>
      );
    };
  },
});