From d2f3a9d04f7b189db0c0011694c63de2a63f348d Mon Sep 17 00:00:00 2001 From: Vben Date: Mon, 26 Aug 2024 23:17:27 +0800 Subject: [PATCH] feat: preference button supports automatic positioning (#4243) --- docs/src/en/guide/essentials/settings.md | 2 +- docs/src/guide/essentials/settings.md | 2 +- packages/@core/base/typings/src/app.d.ts | 3 +- packages/@core/preferences/src/config.ts | 2 +- .../@core/preferences/src/use-preferences.ts | 40 +++++++++++++++++++ .../layouts/src/basic/header/header.vue | 9 ++--- packages/effects/layouts/src/basic/layout.vue | 8 +--- .../widgets/global-search/global-search.vue | 2 +- .../preferences/blocks/layout/widget.vue | 4 ++ packages/locales/src/langs/en-US.json | 1 + packages/locales/src/langs/zh-CN.json | 1 + 11 files changed, 57 insertions(+), 17 deletions(-) diff --git a/docs/src/en/guide/essentials/settings.md b/docs/src/en/guide/essentials/settings.md index 719b1d91..5a7cec18 100644 --- a/docs/src/en/guide/essentials/settings.md +++ b/docs/src/en/guide/essentials/settings.md @@ -170,7 +170,7 @@ const defaultPreferences: Preferences = { locale: 'zh-CN', loginExpiredMode: 'modal', name: 'Vben Admin', - preferencesButtonPosition: 'fixed', + preferencesButtonPosition: 'auto', watermark: false, }, breadcrumb: { diff --git a/docs/src/guide/essentials/settings.md b/docs/src/guide/essentials/settings.md index 3bf0eae0..66317400 100644 --- a/docs/src/guide/essentials/settings.md +++ b/docs/src/guide/essentials/settings.md @@ -190,7 +190,7 @@ const defaultPreferences: Preferences = { locale: 'zh-CN', loginExpiredMode: 'modal', name: 'Vben Admin', - preferencesButtonPosition: 'fixed', + preferencesButtonPosition: 'auto', watermark: false, }, breadcrumb: { diff --git a/packages/@core/base/typings/src/app.d.ts b/packages/@core/base/typings/src/app.d.ts index 15fffb28..e49a8657 100644 --- a/packages/@core/base/typings/src/app.d.ts +++ b/packages/@core/base/typings/src/app.d.ts @@ -11,8 +11,9 @@ type ThemeModeType = 'auto' | 'dark' | 'light'; * 偏好设置按钮位置 * fixed 固定在右侧 * header 顶栏 + * auto 自动 */ -type PreferencesButtonPositionType = 'fixed' | 'header'; +type PreferencesButtonPositionType = 'auto' | 'fixed' | 'header'; type BuiltinThemeType = | 'custom' diff --git a/packages/@core/preferences/src/config.ts b/packages/@core/preferences/src/config.ts index fa03699b..c196b153 100644 --- a/packages/@core/preferences/src/config.ts +++ b/packages/@core/preferences/src/config.ts @@ -20,7 +20,7 @@ const defaultPreferences: Preferences = { locale: 'zh-CN', loginExpiredMode: 'page', name: 'Vben Admin', - preferencesButtonPosition: 'fixed', + preferencesButtonPosition: 'auto', watermark: false, }, breadcrumb: { diff --git a/packages/@core/preferences/src/use-preferences.ts b/packages/@core/preferences/src/use-preferences.ts index 03e959fb..ff5dbedf 100644 --- a/packages/@core/preferences/src/use-preferences.ts +++ b/packages/@core/preferences/src/use-preferences.ts @@ -149,6 +149,45 @@ function usePreferences() { return enable && globalLockScreen; }); + /** + * @zh_CN 偏好设置按钮位置 + */ + const preferencesButtonPosition = computed(() => { + const { enablePreferences, preferencesButtonPosition } = preferences.app; + + // 如果没有启用偏好设置按钮 + if (!enablePreferences) { + return { + fixed: false, + header: false, + }; + } + + const { header, sidebar } = preferences; + const headerHidden = header.hidden; + const sidebarHidden = sidebar.hidden; + + const contentIsMaximize = headerHidden && sidebarHidden; + + const isHeaderPosition = preferencesButtonPosition === 'header'; + + // 如果设置了固定位置 + if (preferencesButtonPosition !== 'auto') { + return { + fixed: preferencesButtonPosition === 'fixed', + header: isHeaderPosition, + }; + } + + // 如果是全屏模式或者没有固定在顶部, + const fixed = contentIsMaximize || isFullContent.value || isMobile.value; + + return { + fixed, + header: !fixed, + }; + }); + return { authPanelCenter, authPanelLeft, @@ -168,6 +207,7 @@ function usePreferences() { isSideNav, keepAlive, layout, + preferencesButtonPosition, sidebarCollapsed, theme, }; diff --git a/packages/effects/layouts/src/basic/header/header.vue b/packages/effects/layouts/src/basic/header/header.vue index 46cec6f7..3febc93a 100644 --- a/packages/effects/layouts/src/basic/header/header.vue +++ b/packages/effects/layouts/src/basic/header/header.vue @@ -28,7 +28,7 @@ withDefaults(defineProps(), { }); const accessStore = useAccessStore(); -const { globalSearchShortcutKey } = usePreferences(); +const { globalSearchShortcutKey, preferencesButtonPosition } = usePreferences(); const slots = useSlots(); const rightSlots = computed(() => { const list = [{ index: 100, name: 'user-dropdown' }]; @@ -39,10 +39,7 @@ const rightSlots = computed(() => { }); } - if ( - preferences.app.enablePreferences && - preferences.app.preferencesButtonPosition === 'header' - ) { + if (preferencesButtonPosition.value.header) { list.push({ index: 10, name: 'preferences', @@ -121,7 +118,7 @@ const leftSlots = computed(() => { diff --git a/packages/effects/layouts/src/basic/layout.vue b/packages/effects/layouts/src/basic/layout.vue index f575ca5a..af12deff 100644 --- a/packages/effects/layouts/src/basic/layout.vue +++ b/packages/effects/layouts/src/basic/layout.vue @@ -40,6 +40,7 @@ const { isMobile, isSideMixedNav, layout, + preferencesButtonPosition, sidebarCollapsed, theme, } = usePreferences(); @@ -326,12 +327,7 @@ const headerSlots = computed(() => { -