diff --git a/admin-frontend-vue/src/layout/AdminLayout.vue b/admin-frontend-vue/src/layout/AdminLayout.vue
index 803b5271..734f1f17 100644
--- a/admin-frontend-vue/src/layout/AdminLayout.vue
+++ b/admin-frontend-vue/src/layout/AdminLayout.vue
@@ -5,7 +5,7 @@ import { ElMessage } from 'element-plus'
import { useAdminSessionStore } from '@/stores/admin-session'
import { joinAdminPath } from '@/config/app'
import { pageTitleOf, topbarUserOf } from '@/layout/topbar-model'
-import type { AdminMenuNode } from '@/types/admin'
+import { groupKeysForActive, toSidebarEntries } from '@/layout/menu-mapper'
const route = useRoute()
const router = useRouter()
@@ -13,27 +13,12 @@ const session = useAdminSessionStore()
const collapsed = ref(false)
const activePath = computed(() => route.path)
-const groups = computed(() => session.menuTree.filter((node) => node.children?.length))
+const menuEntries = computed(() => toSidebarEntries(session.menuTree))
+const openedKeys = computed(() => groupKeysForActive(menuEntries.value, route.path))
const pageTitle = computed(() => pageTitleOf(route.meta.title as string | undefined))
const userVm = computed(() => topbarUserOf(session.user))
const logoUrl = joinAdminPath('assets', 'logo.jpg')
-function menuPath(node: AdminMenuNode): string {
- return node.route || '/account/users'
-}
-
-function visibleChildren(node: AdminMenuNode) {
- return (node.children || []).filter((child) => child.route)
-}
-
-function canSee(node: AdminMenuNode) {
- return session.isSuperAdmin.valueOf() || hasMenu(node, String(route.meta.menuKey || '')) || node.route === activePath.value
-}
-
-function hasMenu(node: AdminMenuNode, key: string): boolean {
- return node.key === key || (node.children || []).some((child) => hasMenu(child, key))
-}
-
async function signOut() {
try {
await session.signOut()
@@ -55,23 +40,22 @@ async function signOut() {