ruoyi-plus-vben5/packages/business/layouts/src/basic/layout.vue

253 lines
6.9 KiB
Vue
Raw Normal View History

2024-05-19 21:20:42 +08:00
<script lang="ts" setup>
import { VbenAdminLayout } from '@vben-core/layout-ui';
2024-06-01 23:15:29 +08:00
import {
flatPreferences,
preferences,
updatePreferences,
usePreferences,
} from '@vben-core/preferences';
2024-06-01 22:17:52 +08:00
import {
VbenBackTop,
// VbenFloatingButtonGroup,
VbenLogo,
} from '@vben-core/shadcn-ui';
import { mapTree } from '@vben-core/toolkit';
import { MenuRecordRaw } from '@vben-core/typings';
2024-05-19 21:20:42 +08:00
2024-06-01 23:15:29 +08:00
import { PreferencesWidget } from '@vben/common-ui';
import { $t } from '@vben/locales';
2024-05-19 21:20:42 +08:00
import { computed } from 'vue';
import { LayoutContent } from './content';
import { LayoutFooter } from './footer';
import { LayoutHeader } from './header';
import {
LayoutExtraMenu,
LayoutMenu,
LayoutMixedMenu,
useExtraMenu,
useMixedMenu,
} from './menu';
import { LayoutTabs, LayoutTabsToolbar } from './tabs';
import { Breadcrumb } from './widgets';
defineOptions({ name: 'BasicLayout' });
const { isDark, isHeaderNav, isMixedNav, isSideMixedNav, layout } =
2024-06-01 23:15:29 +08:00
usePreferences();
2024-05-19 21:20:42 +08:00
const headerMenuTheme = computed(() => {
return isDark.value ? 'dark' : 'light';
});
const theme = computed(() => {
2024-06-01 23:15:29 +08:00
const dark = isDark.value || preferences.app.semiDarkMenu;
2024-05-19 21:20:42 +08:00
return dark ? 'dark' : 'light';
});
const logoClass = computed(() => {
2024-06-01 23:15:29 +08:00
const { collapse, collapseShowTitle } = preferences.sidebar;
return collapseShowTitle && collapse && !isMixedNav.value ? 'mx-auto' : '';
2024-05-19 21:20:42 +08:00
});
const isMenuRounded = computed(() => {
2024-06-01 23:15:29 +08:00
return preferences.navigation.styleType === 'rounded';
2024-05-19 21:20:42 +08:00
});
const logoCollapse = computed(() => {
if (isHeaderNav.value || isMixedNav.value) {
return false;
}
2024-06-01 23:15:29 +08:00
const { appIsMobile, sidebarCollapse } = flatPreferences;
2024-05-19 21:20:42 +08:00
2024-06-01 23:15:29 +08:00
if (!sidebarCollapse && appIsMobile) {
2024-05-19 21:20:42 +08:00
return false;
}
2024-06-01 23:15:29 +08:00
return sidebarCollapse || isSideMixedNav.value;
2024-05-19 21:20:42 +08:00
});
const showHeaderNav = computed(() => {
return isHeaderNav.value || isMixedNav.value;
});
const {
extraActiveMenu,
extraMenus,
extraVisible,
handleDefaultSelect,
handleMenuMouseEnter,
handleMixedMenuSelect,
handleSideMouseLeave,
} = useExtraMenu();
const {
handleMenuSelect,
headerActive,
headerMenus,
sideActive,
sideMenus,
sideVisible,
} = useMixedMenu();
function wrapperMenus(menus: MenuRecordRaw[]) {
return mapTree(menus, (item) => {
return {
...item,
name: $t(item.name),
};
});
}
2024-05-19 21:20:42 +08:00
</script>
<template>
<VbenAdminLayout
v-model:side-extra-visible="extraVisible"
2024-06-01 23:15:29 +08:00
v-model:side-collapse="flatPreferences.sidebarCollapse"
v-model:side-expand-on-hover="flatPreferences.sidebarExpandOnHover"
v-model:side-extra-collapse="flatPreferences.sidebarExtraCollapse"
:side-collapse-show-title="preferences.sidebar.collapseShowTitle"
:content-compact="preferences.app.contentCompact"
:is-mobile="preferences.app.isMobile"
2024-05-19 21:20:42 +08:00
:layout="layout"
2024-06-01 23:15:29 +08:00
:header-mode="preferences.header.mode"
:footer-fixed="preferences.footer.fixed"
:side-semi-dark="preferences.app.semiDarkMenu"
2024-05-19 21:20:42 +08:00
:side-theme="theme"
2024-06-01 23:15:29 +08:00
:side-hidden="preferences.sidebar.hidden"
2024-05-19 21:20:42 +08:00
:side-visible="sideVisible"
2024-06-01 23:15:29 +08:00
:footer-visible="preferences.footer.enable"
:header-visible="preferences.header.enable"
:header-hidden="preferences.header.hidden"
:side-width="preferences.sidebar.width"
:tabs-visible="preferences.tabbar.enable"
2024-05-19 21:20:42 +08:00
@side-mouse-leave="handleSideMouseLeave"
@update:side-visible="
2024-06-01 23:15:29 +08:00
(value: boolean) =>
updatePreferences({
sidebar: {
enable: value,
},
})
2024-05-19 21:20:42 +08:00
"
>
2024-06-01 23:15:29 +08:00
<template v-if="preferences.app.showPreference" #preferences>
<PreferencesWidget />
2024-05-19 21:20:42 +08:00
</template>
2024-06-01 22:17:52 +08:00
<template #floating-button-group>
2024-05-19 21:20:42 +08:00
<VbenBackTop />
2024-06-01 22:17:52 +08:00
<!-- <VbenFloatingButtonGroup /> -->
2024-05-19 21:20:42 +08:00
</template>
<!-- logo -->
<template #logo>
<VbenLogo
:collapse="logoCollapse"
2024-06-01 23:15:29 +08:00
:src="preferences.logo.source"
:text="preferences.app.name"
2024-05-19 21:20:42 +08:00
:theme="showHeaderNav ? headerMenuTheme : theme"
2024-06-01 23:15:29 +08:00
:alt="preferences.app.name"
2024-05-19 21:20:42 +08:00
:class="logoClass"
/>
</template>
<!-- 头部区域 -->
<template #header>
<LayoutHeader :theme="theme">
<template
2024-06-01 23:15:29 +08:00
v-if="!showHeaderNav && preferences.breadcrumb.enable"
2024-05-19 21:20:42 +08:00
#breadcrumb
>
<Breadcrumb
2024-06-01 23:15:29 +08:00
:hide-when-only-one="preferences.breadcrumb.hideOnlyOne"
:type="preferences.breadcrumb.styleType"
:show-icon="preferences.breadcrumb.showIcon"
:show-home="preferences.breadcrumb.showHome"
2024-05-19 21:20:42 +08:00
/>
</template>
<template v-if="showHeaderNav" #menu>
<LayoutMenu
class="w-full"
:rounded="isMenuRounded"
mode="horizontal"
:theme="headerMenuTheme"
:menus="wrapperMenus(headerMenus)"
2024-05-19 21:20:42 +08:00
:default-active="headerActive"
@select="handleMenuSelect"
/>
</template>
<template #user-dropdown>
<slot name="user-dropdown"></slot>
</template>
<template #notification>
<slot name="notification"></slot>
</template>
</LayoutHeader>
</template>
<!-- 侧边菜单区域 -->
<template #menu>
<LayoutMenu
mode="vertical"
2024-06-01 23:15:29 +08:00
:accordion="preferences.navigation.accordion"
2024-05-19 21:20:42 +08:00
:rounded="isMenuRounded"
2024-06-01 23:15:29 +08:00
:collapse-show-title="preferences.sidebar.collapseShowTitle"
:collapse="preferences.sidebar.collapse"
2024-05-19 21:20:42 +08:00
:theme="theme"
:menus="wrapperMenus(sideMenus)"
2024-05-19 21:20:42 +08:00
:default-active="sideActive"
@select="handleMenuSelect"
/>
</template>
<template #mixed-menu>
<LayoutMixedMenu
:rounded="isMenuRounded"
2024-06-01 23:15:29 +08:00
:collapse="!preferences.sidebar.collapseShowTitle"
2024-05-19 21:20:42 +08:00
:active-path="extraActiveMenu"
:theme="theme"
@select="handleMixedMenuSelect"
@default-select="handleDefaultSelect"
@enter="handleMenuMouseEnter"
/>
</template>
<!-- 侧边额外区域 -->
<template #side-extra>
<LayoutExtraMenu
2024-06-01 23:15:29 +08:00
:accordion="preferences.navigation.accordion"
2024-05-19 21:20:42 +08:00
:rounded="isMenuRounded"
:menus="wrapperMenus(extraMenus)"
2024-06-01 23:15:29 +08:00
:collapse="preferences.sidebar.extraCollapse"
2024-05-19 21:20:42 +08:00
:theme="theme"
/>
</template>
<template #side-extra-title>
<VbenLogo
2024-06-01 23:15:29 +08:00
v-if="preferences.logo.enable"
:text="preferences.app.name"
2024-05-19 21:20:42 +08:00
:theme="theme"
2024-06-01 23:15:29 +08:00
:alt="preferences.app.name"
2024-05-19 21:20:42 +08:00
/>
</template>
<template #tabs>
<LayoutTabs
2024-06-01 23:15:29 +08:00
v-if="preferences.tabbar.enable"
:show-icon="preferences.tabbar.showIcon"
2024-05-19 21:20:42 +08:00
/>
</template>
<template #tabs-toolbar>
2024-06-01 23:15:29 +08:00
<LayoutTabsToolbar v-if="preferences.tabbar.enable" />
2024-05-19 21:20:42 +08:00
</template>
<!-- 主体内容 -->
<template #content>
<LayoutContent />
</template>
<!-- 页脚 -->
2024-06-01 23:15:29 +08:00
<template v-if="preferences.footer.enable" #footer>
<LayoutFooter v-if="preferences.app.copyright">
{{ preferences.app.copyright }}
2024-05-19 21:20:42 +08:00
</LayoutFooter>
</template>
</VbenAdminLayout>
</template>