Add 'Intern' menu for logged-in users with submenu navigation
This commit is contained in:
@@ -66,6 +66,14 @@
|
||||
Galerie
|
||||
</NuxtLink>
|
||||
|
||||
<button
|
||||
v-if="isLoggedIn"
|
||||
@click="toggleSubmenu('intern')"
|
||||
class="px-4 py-2 text-gray-300 hover:text-white font-medium transition-all rounded-lg hover:bg-primary-700/50"
|
||||
:class="(route.path.startsWith('/mitgliederbereich') || route.path.startsWith('/cms') || currentSubmenu === 'intern') ? 'text-white bg-primary-600' : ''">
|
||||
Intern
|
||||
</button>
|
||||
|
||||
<NuxtLink to="/kontakt" @click="currentSubmenu = null"
|
||||
class="px-4 py-2 bg-primary-600 hover:bg-primary-700 text-white font-semibold transition-all rounded-lg shadow-lg">
|
||||
Kontakt
|
||||
@@ -155,6 +163,44 @@
|
||||
TT-Regeln
|
||||
</NuxtLink>
|
||||
</template>
|
||||
|
||||
<!-- Intern Submenu -->
|
||||
<template v-if="currentSubmenu === 'intern'">
|
||||
<NuxtLink to="/mitgliederbereich"
|
||||
class="px-2.5 py-1 text-xs font-semibold text-white hover:bg-primary-700/50 rounded transition-all"
|
||||
active-class="bg-primary-600">
|
||||
Übersicht
|
||||
</NuxtLink>
|
||||
<div class="h-3 w-px bg-primary-700" />
|
||||
<NuxtLink to="/mitgliederbereich/mitglieder"
|
||||
class="px-2.5 py-1 text-xs text-gray-300 hover:text-white hover:bg-primary-700/50 rounded transition-all"
|
||||
active-class="text-white bg-primary-600">
|
||||
Mitgliederliste
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/mitgliederbereich/news"
|
||||
class="px-2.5 py-1 text-xs text-gray-300 hover:text-white hover:bg-primary-700/50 rounded transition-all"
|
||||
active-class="text-white bg-primary-600">
|
||||
Interne News
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/mitgliederbereich/profil"
|
||||
class="px-2.5 py-1 text-xs text-gray-300 hover:text-white hover:bg-primary-700/50 rounded transition-all"
|
||||
active-class="text-white bg-primary-600">
|
||||
Mein Profil
|
||||
</NuxtLink>
|
||||
<template v-if="isAdmin">
|
||||
<div class="h-3 w-px bg-primary-700" />
|
||||
<NuxtLink to="/cms"
|
||||
class="px-2.5 py-1 text-xs text-yellow-300 hover:text-white hover:bg-primary-700/50 rounded transition-all"
|
||||
active-class="text-white bg-primary-600">
|
||||
CMS
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/benutzer"
|
||||
class="px-2.5 py-1 text-xs text-yellow-300 hover:text-white hover:bg-primary-700/50 rounded transition-all"
|
||||
active-class="text-white bg-primary-600">
|
||||
Benutzerverwaltung
|
||||
</NuxtLink>
|
||||
</template>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -295,6 +341,45 @@
|
||||
Galerie
|
||||
</NuxtLink>
|
||||
|
||||
<!-- Intern Mobile -->
|
||||
<div v-if="isLoggedIn">
|
||||
<button @click="toggleMobileSubmenu('intern')"
|
||||
class="w-full flex items-center justify-between px-4 py-3 text-gray-300 hover:text-white hover:bg-primary-700/50 rounded-lg font-medium transition-colors">
|
||||
Intern
|
||||
<ChevronDown :size="16"
|
||||
:class="['transition-transform', mobileSubmenu === 'intern' ? 'rotate-180' : '']" />
|
||||
</button>
|
||||
<div v-if="mobileSubmenu === 'intern'" class="pl-4 space-y-1 mt-1 bg-primary-900/30 rounded-lg p-2">
|
||||
<NuxtLink to="/mitgliederbereich" @click="isMobileMenuOpen = false"
|
||||
class="block px-4 py-2 text-sm font-semibold text-gray-300 hover:text-white hover:bg-primary-700/50 rounded-lg transition-colors">
|
||||
Übersicht
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/mitgliederbereich/mitglieder" @click="isMobileMenuOpen = false"
|
||||
class="block px-4 py-2 text-sm text-gray-400 hover:text-white hover:bg-primary-700/50 rounded-lg transition-colors">
|
||||
Mitgliederliste
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/mitgliederbereich/news" @click="isMobileMenuOpen = false"
|
||||
class="block px-4 py-2 text-sm text-gray-400 hover:text-white hover:bg-primary-700/50 rounded-lg transition-colors">
|
||||
Interne News
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/mitgliederbereich/profil" @click="isMobileMenuOpen = false"
|
||||
class="block px-4 py-2 text-sm text-gray-400 hover:text-white hover:bg-primary-700/50 rounded-lg transition-colors">
|
||||
Mein Profil
|
||||
</NuxtLink>
|
||||
<template v-if="isAdmin">
|
||||
<div class="border-t border-primary-700/20 my-2" />
|
||||
<NuxtLink to="/cms" @click="isMobileMenuOpen = false"
|
||||
class="block px-4 py-2 text-sm text-yellow-300 hover:text-white hover:bg-primary-700/50 rounded-lg transition-colors">
|
||||
CMS
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/benutzer" @click="isMobileMenuOpen = false"
|
||||
class="block px-4 py-2 text-sm text-yellow-300 hover:text-white hover:bg-primary-700/50 rounded-lg transition-colors">
|
||||
Benutzerverwaltung
|
||||
</NuxtLink>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<NuxtLink to="/kontakt" @click="isMobileMenuOpen = false"
|
||||
class="block px-4 py-3 bg-primary-600 hover:bg-primary-700 text-white rounded-lg font-semibold transition-colors">
|
||||
Kontakt
|
||||
@@ -315,6 +400,12 @@ const isMobileMenuOpen = ref(false)
|
||||
const mobileSubmenu = ref(null)
|
||||
const mannschaften = ref([])
|
||||
const hasGalleryImages = ref(false)
|
||||
const isLoggedIn = ref(false)
|
||||
const userRole = ref(null)
|
||||
|
||||
const isAdmin = computed(() => {
|
||||
return userRole.value === 'admin' || userRole.value === 'vorstand'
|
||||
})
|
||||
|
||||
// Automatisches Setzen des Submenus basierend auf der Route
|
||||
const currentSubmenu = computed(() => {
|
||||
@@ -330,6 +421,9 @@ const hasGalleryImages = ref(false)
|
||||
if (path.startsWith('/training') || path.startsWith('/tt-regeln')) {
|
||||
return 'training'
|
||||
}
|
||||
if (path.startsWith('/mitgliederbereich') || path.startsWith('/cms')) {
|
||||
return 'intern'
|
||||
}
|
||||
return null
|
||||
})
|
||||
|
||||
@@ -392,9 +486,21 @@ const checkGalleryImages = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
const checkAuthStatus = async () => {
|
||||
try {
|
||||
const response = await $fetch('/api/auth/status')
|
||||
isLoggedIn.value = response.isLoggedIn
|
||||
userRole.value = response.role
|
||||
} catch (error) {
|
||||
isLoggedIn.value = false
|
||||
userRole.value = null
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
loadMannschaften()
|
||||
checkGalleryImages()
|
||||
checkAuthStatus()
|
||||
})
|
||||
|
||||
const toggleSubmenu = (menu) => {
|
||||
@@ -409,6 +515,8 @@ onMounted(() => {
|
||||
navigateTo('/mannschaften')
|
||||
} else if (menu === 'training' && !path.startsWith('/training') && !path.startsWith('/tt-regeln')) {
|
||||
navigateTo('/training')
|
||||
} else if (menu === 'intern' && !path.startsWith('/mitgliederbereich') && !path.startsWith('/cms')) {
|
||||
navigateTo('/mitgliederbereich')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user