feat: `autoActivateChild` support more layout mode (#5148)

dev-v5
Netfan 2024-12-16 04:54:32 +08:00 committed by GitHub
parent 2efb5b71c3
commit f6faeb034e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 37 additions and 2 deletions

View File

@ -103,6 +103,7 @@ const {
const { const {
handleMenuSelect, handleMenuSelect,
handleMenuOpen,
headerActive, headerActive,
headerMenus, headerMenus,
sidebarActive, sidebarActive,
@ -260,6 +261,7 @@ const headerSlots = computed(() => {
:rounded="isMenuRounded" :rounded="isMenuRounded"
:theme="sidebarTheme" :theme="sidebarTheme"
mode="vertical" mode="vertical"
@open="handleMenuOpen"
@select="handleMenuSelect" @select="handleMenuSelect"
/> />
</template> </template>

View File

@ -14,12 +14,17 @@ const props = withDefaults(defineProps<Props>(), {
}); });
const emit = defineEmits<{ const emit = defineEmits<{
open: [string, string[]];
select: [string, string?]; select: [string, string?];
}>(); }>();
function handleMenuSelect(key: string) { function handleMenuSelect(key: string) {
emit('select', key, props.mode); emit('select', key, props.mode);
} }
function handleMenuOpen(key: string, path: string[]) {
emit('open', key, path);
}
</script> </script>
<template> <template>
@ -32,6 +37,7 @@ function handleMenuSelect(key: string) {
:mode="mode" :mode="mode"
:rounded="rounded" :rounded="rounded"
:theme="theme" :theme="theme"
@open="handleMenuOpen"
@select="handleMenuSelect" @select="handleMenuSelect"
/> />
</template> </template>

View File

@ -15,7 +15,8 @@ function useMixedMenu() {
const route = useRoute(); const route = useRoute();
const splitSideMenus = ref<MenuRecordRaw[]>([]); const splitSideMenus = ref<MenuRecordRaw[]>([]);
const rootMenuPath = ref<string>(''); const rootMenuPath = ref<string>('');
/** 记录当前顶级菜单下哪个子菜单最后激活 */
const defaultSubMap = new Map<string, string>();
const { isMixedNav } = usePreferences(); const { isMixedNav } = usePreferences();
const needSplit = computed( const needSplit = computed(
@ -86,6 +87,25 @@ function useMixedMenu() {
splitSideMenus.value = rootMenu?.children ?? []; splitSideMenus.value = rootMenu?.children ?? [];
if (splitSideMenus.value.length === 0) { if (splitSideMenus.value.length === 0) {
navigation(key); navigation(key);
} else if (rootMenu && preferences.sidebar.autoActivateChild) {
navigation(
defaultSubMap.has(rootMenu.path)
? (defaultSubMap.get(rootMenu.path) as string)
: rootMenu.path,
);
}
};
/**
*
* @param key
* @param parentsPath
*/
const handleMenuOpen = (key: string, parentsPath: string[]) => {
if (parentsPath.length <= 1 && preferences.sidebar.autoActivateChild) {
navigation(
defaultSubMap.has(key) ? (defaultSubMap.get(key) as string) : key,
);
} }
}; };
@ -107,6 +127,8 @@ function useMixedMenu() {
(path) => { (path) => {
const currentPath = (route?.meta?.activePath as string) ?? path; const currentPath = (route?.meta?.activePath as string) ?? path;
calcSideMenus(currentPath); calcSideMenus(currentPath);
if (rootMenuPath.value)
defaultSubMap.set(rootMenuPath.value, currentPath);
}, },
{ immediate: true }, { immediate: true },
); );
@ -118,6 +140,7 @@ function useMixedMenu() {
return { return {
handleMenuSelect, handleMenuSelect,
handleMenuOpen,
headerActive, headerActive,
headerMenus, headerMenus,
sidebarActive, sidebarActive,

View File

@ -43,7 +43,11 @@ const sidebarExpandOnHover = defineModel<boolean>('sidebarExpandOnHover');
<SwitchItem <SwitchItem
v-model="sidebarAutoActivateChild" v-model="sidebarAutoActivateChild"
:disabled=" :disabled="
!sidebarEnable || currentLayout !== 'sidebar-mixed-nav' || disabled !sidebarEnable ||
!['sidebar-mixed-nav', 'mixed-nav', 'sidebar-nav'].includes(
currentLayout as string,
) ||
disabled
" "
:tip="$t('preferences.sidebar.autoActivateChildTip')" :tip="$t('preferences.sidebar.autoActivateChildTip')"
> >