Skip to content

Commit 2efb5b7

Browse files
authored
feat: auto activate subMenu on select root menu (#5147)
* feat: auto activate subMenu on click root menu * fix: prop name fixed * chore: test and docs update
1 parent 22c1f86 commit 2efb5b7

File tree

10 files changed

+56
-3
lines changed

10 files changed

+56
-3
lines changed

docs/src/en/guide/essentials/settings.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ const defaultPreferences: Preferences = {
217217
globalSearch: true,
218218
},
219219
sidebar: {
220+
autoActivateChild: false,
220221
collapsed: false,
221222
collapsedShowTitle: false,
222223
enable: true,

docs/src/guide/essentials/settings.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ const defaultPreferences: Preferences = {
240240
globalSearch: true,
241241
},
242242
sidebar: {
243+
autoActivateChild: false,
243244
collapsed: false,
244245
collapsedShowTitle: false,
245246
enable: true,

packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ exports[`defaultPreferences immutability test > should not modify the config obj
6565
"globalSearch": true,
6666
},
6767
"sidebar": {
68+
"autoActivateChild": false,
6869
"collapsed": false,
6970
"collapsedShowTitle": false,
7071
"enable": true,

packages/@core/preferences/src/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ const defaultPreferences: Preferences = {
6565
globalSearch: true,
6666
},
6767
sidebar: {
68+
autoActivateChild: false,
6869
collapsed: false,
6970
collapsedShowTitle: false,
7071
enable: true,

packages/@core/preferences/src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ interface NavigationPreferences {
125125
}
126126

127127
interface SidebarPreferences {
128+
/** 点击目录时自动激活子菜单 */
129+
autoActivateChild: boolean;
128130
/** 侧边栏是否折叠 */
129131
collapsed: boolean;
130132
/** 侧边栏折叠时,是否显示title */

packages/effects/layouts/src/basic/menu/use-extra-menu.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ function useExtraMenu() {
1515

1616
const menus = computed(() => accessStore.accessMenus);
1717

18+
/** 记录当前顶级菜单下哪个子菜单最后激活 */
19+
const defaultSubMap = new Map<string, string>();
20+
1821
const route = useRoute();
1922
const extraMenus = ref<MenuRecordRaw[]>([]);
2023
const sidebarExtraVisible = ref<boolean>(false);
@@ -32,6 +35,12 @@ function useExtraMenu() {
3235
sidebarExtraVisible.value = hasChildren;
3336
if (!hasChildren) {
3437
await navigation(menu.path);
38+
} else if (preferences.sidebar.autoActivateChild) {
39+
await navigation(
40+
defaultSubMap.has(menu.path)
41+
? (defaultSubMap.get(menu.path) as string)
42+
: menu.path,
43+
);
3544
}
3645
};
3746

@@ -89,6 +98,7 @@ function useExtraMenu() {
8998
menus.value,
9099
currentPath,
91100
);
101+
if (rootMenuPath) defaultSubMap.set(rootMenuPath, currentPath);
92102
extraActiveMenu.value = rootMenuPath ?? findMenu?.path ?? '';
93103
extraMenus.value = rootMenu?.children ?? [];
94104
},

packages/effects/layouts/src/widgets/preferences/blocks/layout/sidebar.vue

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
11
<script setup lang="ts">
2+
import type { LayoutType } from '@vben/types';
3+
24
import { $t } from '@vben/locales';
35
46
import NumberFieldItem from '../number-field-item.vue';
57
import SwitchItem from '../switch-item.vue';
68
7-
defineProps<{ disabled: boolean }>();
9+
defineProps<{ currentLayout?: LayoutType; disabled: boolean }>();
810
911
const sidebarEnable = defineModel<boolean>('sidebarEnable');
1012
const sidebarWidth = defineModel<number>('sidebarWidth');
1113
const sidebarCollapsedShowTitle = defineModel<boolean>(
1214
'sidebarCollapsedShowTitle',
1315
);
16+
const sidebarAutoActivateChild = defineModel<boolean>(
17+
'sidebarAutoActivateChild',
18+
);
1419
const sidebarCollapsed = defineModel<boolean>('sidebarCollapsed');
20+
const sidebarExpandOnHover = defineModel<boolean>('sidebarExpandOnHover');
1521
</script>
1622

1723
<template>
@@ -21,12 +27,28 @@ const sidebarCollapsed = defineModel<boolean>('sidebarCollapsed');
2127
<SwitchItem v-model="sidebarCollapsed" :disabled="!sidebarEnable || disabled">
2228
{{ $t('preferences.sidebar.collapsed') }}
2329
</SwitchItem>
30+
<SwitchItem
31+
v-model="sidebarExpandOnHover"
32+
:disabled="!sidebarEnable || disabled || !sidebarCollapsed"
33+
:tip="$t('preferences.sidebar.expandOnHoverTip')"
34+
>
35+
{{ $t('preferences.sidebar.expandOnHover') }}
36+
</SwitchItem>
2437
<SwitchItem
2538
v-model="sidebarCollapsedShowTitle"
2639
:disabled="!sidebarEnable || disabled || !sidebarCollapsed"
2740
>
2841
{{ $t('preferences.sidebar.collapsedShowTitle') }}
2942
</SwitchItem>
43+
<SwitchItem
44+
v-model="sidebarAutoActivateChild"
45+
:disabled="
46+
!sidebarEnable || currentLayout !== 'sidebar-mixed-nav' || disabled
47+
"
48+
:tip="$t('preferences.sidebar.autoActivateChildTip')"
49+
>
50+
{{ $t('preferences.sidebar.autoActivateChild') }}
51+
</SwitchItem>
3052
<NumberFieldItem
3153
v-model="sidebarWidth"
3254
:disabled="!sidebarEnable || disabled"

packages/effects/layouts/src/widgets/preferences/preferences-drawer.vue

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ const sidebarCollapsed = defineModel<boolean>('sidebarCollapsed');
8787
const sidebarCollapsedShowTitle = defineModel<boolean>(
8888
'sidebarCollapsedShowTitle',
8989
);
90+
const sidebarAutoActivateChild = defineModel<boolean>(
91+
'sidebarAutoActivateChild',
92+
);
93+
const SidebarExpandOnHover = defineModel<boolean>('sidebarExpandOnHover');
9094
9195
const headerEnable = defineModel<boolean>('headerEnable');
9296
const headerMode = defineModel<LayoutHeaderModeType>('headerMode');
@@ -299,10 +303,13 @@ async function handleReset() {
299303

300304
<Block :title="$t('preferences.sidebar.title')">
301305
<Sidebar
306+
v-model:sidebar-auto-activate-child="sidebarAutoActivateChild"
302307
v-model:sidebar-collapsed="sidebarCollapsed"
303308
v-model:sidebar-collapsed-show-title="sidebarCollapsedShowTitle"
304309
v-model:sidebar-enable="sidebarEnable"
310+
v-model:sidebar-expand-on-hover="SidebarExpandOnHover"
305311
v-model:sidebar-width="sidebarWidth"
312+
:current-layout="appLayout"
306313
:disabled="!isSideMode"
307314
/>
308315
</Block>

packages/locales/src/langs/en-US/preferences.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@
4545
"width": "Width",
4646
"visible": "Show Sidebar",
4747
"collapsed": "Collpase Menu",
48-
"collapsedShowTitle": "Show Menu Title"
48+
"collapsedShowTitle": "Show Menu Title",
49+
"autoActivateChild": "Auto Activate SubMenu",
50+
"autoActivateChildTip": "`Enabled` to automatically activate the submenu while click menu.",
51+
"expandOnHover": "Expand On Hover",
52+
"expandOnHoverTip": "When the mouse hovers over menu, \n `Enabled` to expand children menus \n `Disabled` to expand whole sidebar."
4953
},
5054
"tabbar": {
5155
"title": "Tabbar",

packages/locales/src/langs/zh-CN/preferences.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@
4545
"width": "宽度",
4646
"visible": "显示侧边栏",
4747
"collapsed": "折叠菜单",
48-
"collapsedShowTitle": "折叠显示菜单名"
48+
"collapsedShowTitle": "折叠显示菜单名",
49+
"autoActivateChild": "自动激活子菜单",
50+
"autoActivateChildTip": "点击顶层菜单时,自动激活第一个子菜单或者上一次激活的子菜单",
51+
"expandOnHover": "鼠标悬停展开",
52+
"expandOnHoverTip": "鼠标在折叠区域悬浮时,`启用`则展开当前子菜单,`禁用`则展开整个侧边栏"
4953
},
5054
"tabbar": {
5155
"title": "标签栏",

0 commit comments

Comments
 (0)