Implement member management enhancements; add bulk import functionality and duplicate checking based on geburtsdatum. Update API to support new fields and improve error handling for member data submissions. Refactor member-related components for better user experience and data validation.
This commit is contained in:
@@ -5,18 +5,14 @@
|
||||
<div class="flex flex-col justify-between h-full py-2">
|
||||
<!-- Hauptmenü -->
|
||||
<div class="flex justify-between items-center">
|
||||
<!-- Logo -->
|
||||
<NuxtLink to="/" class="flex items-center space-x-3 hover:scale-105 transition-transform">
|
||||
<img
|
||||
src="~/assets/images/logos/Harheimer TC.svg"
|
||||
alt="Harheimer TC Logo"
|
||||
class="w-12 h-12"
|
||||
/>
|
||||
<div class="hidden sm:block">
|
||||
<span class="text-xl font-display font-bold text-white">Harheimer <span
|
||||
class="text-primary-400">TC</span></span>
|
||||
</div>
|
||||
</NuxtLink>
|
||||
<!-- Logo -->
|
||||
<NuxtLink to="/" class="flex items-center space-x-3 hover:scale-105 transition-transform">
|
||||
<img src="~/assets/images/logos/Harheimer TC.svg" alt="Harheimer TC Logo" class="w-12 h-12" />
|
||||
<div class="hidden sm:block">
|
||||
<span class="text-xl font-display font-bold text-white">Harheimer <span
|
||||
class="text-primary-400">TC</span></span>
|
||||
</div>
|
||||
</NuxtLink>
|
||||
|
||||
<div style="display:flex;flex-direction:column;">
|
||||
<!-- Desktop Navigation -->
|
||||
@@ -57,18 +53,13 @@
|
||||
Termine
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink
|
||||
v-if="hasGalleryImages"
|
||||
to="/galerie"
|
||||
@click="currentSubmenu = null"
|
||||
<NuxtLink v-if="hasGalleryImages" to="/galerie" @click="currentSubmenu = null"
|
||||
class="px-4 py-2 text-gray-300 hover:text-white font-medium transition-all rounded-lg hover:bg-primary-700/50"
|
||||
active-class="text-white bg-primary-600">
|
||||
Galerie
|
||||
</NuxtLink>
|
||||
|
||||
<button
|
||||
v-if="isLoggedIn"
|
||||
@click="toggleSubmenu('intern')"
|
||||
<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
|
||||
@@ -81,203 +72,192 @@
|
||||
</div>
|
||||
|
||||
<div class="hidden lg:flex items-center h-6 border-t border-primary-700/20">
|
||||
<div v-if="currentSubmenu" class="flex items-center space-x-1">
|
||||
<!-- Verein Submenu -->
|
||||
<template v-if="currentSubmenu === 'verein'">
|
||||
<NuxtLink to="/verein/ueber-uns"
|
||||
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">
|
||||
Über uns
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/vorstand"
|
||||
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">
|
||||
Vorstand
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/verein/geschichte"
|
||||
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">
|
||||
Geschichte
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/verein/satzung"
|
||||
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">
|
||||
Satzung
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/vereinsmeisterschaften"
|
||||
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">
|
||||
Vereinsmeisterschaften
|
||||
</NuxtLink>
|
||||
</template>
|
||||
|
||||
<!-- Mannschaften Submenu -->
|
||||
<template v-if="currentSubmenu === 'mannschaften'">
|
||||
<NuxtLink to="/mannschaften"
|
||||
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" />
|
||||
<template v-for="mannschaft in mannschaften" :key="mannschaft.slug">
|
||||
<NuxtLink
|
||||
:to="`/mannschaften/${mannschaft.slug}`"
|
||||
<div v-if="currentSubmenu" class="flex items-center space-x-1">
|
||||
<!-- Verein Submenu -->
|
||||
<template v-if="currentSubmenu === 'verein'">
|
||||
<NuxtLink to="/verein/ueber-uns"
|
||||
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">
|
||||
{{ mannschaft.mannschaft }}
|
||||
Über uns
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/vorstand"
|
||||
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">
|
||||
Vorstand
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/verein/geschichte"
|
||||
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">
|
||||
Geschichte
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/verein/satzung"
|
||||
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">
|
||||
Satzung
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/vereinsmeisterschaften"
|
||||
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">
|
||||
Vereinsmeisterschaften
|
||||
</NuxtLink>
|
||||
</template>
|
||||
<div class="h-3 w-px bg-primary-700" />
|
||||
<NuxtLink to="/mannschaften/spielplaene"
|
||||
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">
|
||||
Spielpläne
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/spielsysteme"
|
||||
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">
|
||||
Spielsysteme
|
||||
</NuxtLink>
|
||||
</template>
|
||||
|
||||
<!-- Training Submenu -->
|
||||
<template v-if="currentSubmenu === 'training'">
|
||||
<NuxtLink to="/training"
|
||||
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">
|
||||
Trainingszeiten
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/training/trainer"
|
||||
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">
|
||||
Trainer
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/training/anfaenger"
|
||||
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">
|
||||
Anfänger
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/tt-regeln"
|
||||
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">
|
||||
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">
|
||||
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">
|
||||
<!-- Mannschaften Submenu -->
|
||||
<template v-if="currentSubmenu === 'mannschaften'">
|
||||
<NuxtLink to="/mannschaften"
|
||||
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" />
|
||||
<div class="relative inline-block">
|
||||
<button
|
||||
@click.stop="toggleCmsDropdown"
|
||||
class="px-2.5 py-1 text-xs text-yellow-300 hover:text-white hover:bg-primary-700/50 rounded transition-all flex items-center"
|
||||
:class="route.path.startsWith('/cms') ? 'text-white bg-primary-600' : ''"
|
||||
>
|
||||
CMS
|
||||
<ChevronDown :size="12" class="ml-1" :class="['transition-transform', showCmsDropdown ? 'rotate-180' : '']" />
|
||||
</button>
|
||||
|
||||
<!-- CMS Dropdown -->
|
||||
<div
|
||||
v-if="showCmsDropdown"
|
||||
class="absolute left-0 top-full mt-1 w-48 bg-gray-800 border border-gray-700 rounded-lg shadow-xl overflow-hidden z-50"
|
||||
>
|
||||
<NuxtLink to="/cms"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Übersicht
|
||||
</NuxtLink>
|
||||
<div class="border-t border-gray-700 my-1"></div>
|
||||
<NuxtLink to="/cms/ueber-uns"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Über uns
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/geschichte"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Geschichte
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/tt-regeln"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
TT-Regeln
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/satzung"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Satzung
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/vereinsmeisterschaften"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Vereinsmeisterschaften
|
||||
</NuxtLink>
|
||||
<div class="border-t border-gray-700 my-1"></div>
|
||||
<NuxtLink to="/mitgliederbereich/news"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
News
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/termine"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Termine
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/spielplaene"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Spielpläne
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/mitgliederbereich/mitglieder"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Mitglieder
|
||||
</NuxtLink>
|
||||
<div class="border-t border-gray-700 my-1"></div>
|
||||
<NuxtLink to="/cms/einstellungen"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Einstellungen
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/mitgliedschaftsantraege"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Mitgliedschaftsanträge
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/benutzer"
|
||||
@click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Benutzerverwaltung
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
<template v-for="mannschaft in mannschaften" :key="mannschaft.slug">
|
||||
<NuxtLink :to="`/mannschaften/${mannschaft.slug}`"
|
||||
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">
|
||||
{{ mannschaft.mannschaft }}
|
||||
</NuxtLink>
|
||||
</template>
|
||||
<div class="h-3 w-px bg-primary-700" />
|
||||
<NuxtLink to="/mannschaften/spielplaene"
|
||||
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">
|
||||
Spielpläne
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/spielsysteme"
|
||||
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">
|
||||
Spielsysteme
|
||||
</NuxtLink>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<!-- Training Submenu -->
|
||||
<template v-if="currentSubmenu === 'training'">
|
||||
<NuxtLink to="/training"
|
||||
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">
|
||||
Trainingszeiten
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/training/trainer"
|
||||
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">
|
||||
Trainer
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/training/anfaenger"
|
||||
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">
|
||||
Anfänger
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/tt-regeln"
|
||||
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">
|
||||
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">
|
||||
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>
|
||||
<div class="h-3 w-px bg-primary-700" />
|
||||
<NuxtLink to="/mitgliederbereich/api"
|
||||
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">
|
||||
API-Dokumentation
|
||||
</NuxtLink>
|
||||
<template v-if="isAdmin">
|
||||
<div class="h-3 w-px bg-primary-700" />
|
||||
<div class="relative inline-block">
|
||||
<button @click.stop="toggleCmsDropdown"
|
||||
class="px-2.5 py-1 text-xs text-yellow-300 hover:text-white hover:bg-primary-700/50 rounded transition-all flex items-center"
|
||||
:class="route.path.startsWith('/cms') ? 'text-white bg-primary-600' : ''">
|
||||
CMS
|
||||
<ChevronDown :size="12" class="ml-1"
|
||||
:class="['transition-transform', showCmsDropdown ? 'rotate-180' : '']" />
|
||||
</button>
|
||||
|
||||
<!-- CMS Dropdown -->
|
||||
<div v-if="showCmsDropdown"
|
||||
class="absolute left-0 top-full mt-1 w-48 bg-gray-800 border border-gray-700 rounded-lg shadow-xl overflow-hidden z-50">
|
||||
<NuxtLink to="/cms" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Übersicht
|
||||
</NuxtLink>
|
||||
<div class="border-t border-gray-700 my-1"></div>
|
||||
<NuxtLink to="/cms/ueber-uns" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Über uns
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/geschichte" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Geschichte
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/tt-regeln" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
TT-Regeln
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/satzung" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Satzung
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/vereinsmeisterschaften" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Vereinsmeisterschaften
|
||||
</NuxtLink>
|
||||
<div class="border-t border-gray-700 my-1"></div>
|
||||
<NuxtLink to="/mitgliederbereich/news" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
News
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/termine" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Termine
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/spielplaene" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Spielpläne
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/mitgliederbereich/mitglieder" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Mitglieder
|
||||
</NuxtLink>
|
||||
<div class="border-t border-gray-700 my-1"></div>
|
||||
<NuxtLink to="/cms/einstellungen" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Einstellungen
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/mitgliedschaftsantraege" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Mitgliedschaftsanträge
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/cms/benutzer" @click="showCmsDropdown = false"
|
||||
class="block px-4 py-2 text-sm text-gray-300 hover:bg-primary-600 hover:text-white transition-colors">
|
||||
Benutzerverwaltung
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Mobile Menu Button -->
|
||||
<button @click="isMobileMenuOpen = !isMobileMenuOpen"
|
||||
@@ -326,16 +306,16 @@
|
||||
class="block px-4 py-2 text-sm text-gray-400 hover:text-white hover:bg-primary-700/50 rounded-lg transition-colors">
|
||||
Geschichte
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/verein/satzung" @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">
|
||||
Satzung
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/vereinsmeisterschaften" @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">
|
||||
Vereinsmeisterschaften
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
<NuxtLink to="/verein/satzung" @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">
|
||||
Satzung
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/vereinsmeisterschaften" @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">
|
||||
Vereinsmeisterschaften
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Mannschaften Mobile -->
|
||||
<div>
|
||||
@@ -351,24 +331,22 @@
|
||||
Übersicht
|
||||
</NuxtLink>
|
||||
<template v-for="mannschaft in mannschaften" :key="mannschaft.slug">
|
||||
<NuxtLink
|
||||
:to="`/mannschaften/${mannschaft.slug}`"
|
||||
@click="isMobileMenuOpen = false"
|
||||
<NuxtLink :to="`/mannschaften/${mannschaft.slug}`" @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">
|
||||
{{ mannschaft.mannschaft }}
|
||||
</NuxtLink>
|
||||
</template>
|
||||
<div class="border-t border-primary-700/20 my-2" />
|
||||
<NuxtLink to="/mannschaften/spielplaene" @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">
|
||||
Spielpläne
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/spielsysteme" @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">
|
||||
Spielsysteme
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
<NuxtLink to="/mannschaften/spielplaene" @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">
|
||||
Spielpläne
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/spielsysteme" @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">
|
||||
Spielsysteme
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Training Mobile -->
|
||||
<div>
|
||||
@@ -387,16 +365,16 @@
|
||||
class="block px-4 py-2 text-sm text-gray-400 hover:text-white hover:bg-primary-700/50 rounded-lg transition-colors">
|
||||
Trainer
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/training/anfaenger" @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">
|
||||
Anfänger
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/tt-regeln" @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">
|
||||
TT-Regeln
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
<NuxtLink to="/training/anfaenger" @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">
|
||||
Anfänger
|
||||
</NuxtLink>
|
||||
<NuxtLink to="/tt-regeln" @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">
|
||||
TT-Regeln
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<NuxtLink to="/mitgliedschaft" @click="isMobileMenuOpen = false"
|
||||
class="block px-4 py-3 text-gray-300 hover:text-white hover:bg-primary-700/50 rounded-lg font-medium transition-colors">
|
||||
@@ -408,10 +386,7 @@
|
||||
Termine
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink
|
||||
v-if="hasGalleryImages"
|
||||
to="/galerie"
|
||||
@click="isMobileMenuOpen = false"
|
||||
<NuxtLink v-if="hasGalleryImages" to="/galerie" @click="isMobileMenuOpen = false"
|
||||
class="block px-4 py-3 text-gray-300 hover:text-white hover:bg-primary-700/50 rounded-lg font-medium transition-colors">
|
||||
Galerie
|
||||
</NuxtLink>
|
||||
@@ -526,24 +501,24 @@ const showCmsDropdown = ref(false)
|
||||
const isLoggedIn = computed(() => authStore.isLoggedIn)
|
||||
const isAdmin = computed(() => authStore.isAdmin)
|
||||
|
||||
// Automatisches Setzen des Submenus basierend auf der Route
|
||||
const currentSubmenu = computed(() => {
|
||||
const path = route.path
|
||||
if (path.startsWith('/verein/') || path.startsWith('/vorstand') ||
|
||||
path.startsWith('/vereinsmeisterschaften')) {
|
||||
return 'verein'
|
||||
}
|
||||
if (path.startsWith('/mannschaften') || path.startsWith('/spielsysteme')) {
|
||||
return 'mannschaften'
|
||||
}
|
||||
if (path.startsWith('/training') || path.startsWith('/tt-regeln')) {
|
||||
return 'training'
|
||||
}
|
||||
if (path.startsWith('/mitgliederbereich') || path.startsWith('/cms')) {
|
||||
return 'intern'
|
||||
}
|
||||
return null
|
||||
})
|
||||
// Automatisches Setzen des Submenus basierend auf der Route
|
||||
const currentSubmenu = computed(() => {
|
||||
const path = route.path
|
||||
if (path.startsWith('/verein/') || path.startsWith('/vorstand') ||
|
||||
path.startsWith('/vereinsmeisterschaften')) {
|
||||
return 'verein'
|
||||
}
|
||||
if (path.startsWith('/mannschaften') || path.startsWith('/spielsysteme')) {
|
||||
return 'mannschaften'
|
||||
}
|
||||
if (path.startsWith('/training') || path.startsWith('/tt-regeln')) {
|
||||
return 'training'
|
||||
}
|
||||
if (path.startsWith('/mitgliederbereich') || path.startsWith('/cms')) {
|
||||
return 'intern'
|
||||
}
|
||||
return null
|
||||
})
|
||||
|
||||
// Manuelles Toggle für Click-Events
|
||||
const manualSubmenu = ref(null)
|
||||
@@ -556,21 +531,21 @@ const loadMannschaften = async () => {
|
||||
try {
|
||||
const response = await fetch('/data/mannschaften.csv')
|
||||
if (!response.ok) return
|
||||
|
||||
|
||||
const csv = await response.text()
|
||||
const lines = csv.split('\n').filter(line => line.trim() !== '')
|
||||
|
||||
|
||||
if (lines.length < 2) return
|
||||
|
||||
|
||||
mannschaften.value = lines.slice(1).map(line => {
|
||||
// Besserer CSV-Parser: Respektiert Anführungszeichen
|
||||
const values = []
|
||||
let current = ''
|
||||
let inQuotes = false
|
||||
|
||||
|
||||
for (let i = 0; i < line.length; i++) {
|
||||
const char = line[i]
|
||||
|
||||
|
||||
if (char === '"') {
|
||||
inQuotes = !inQuotes
|
||||
} else if (char === ',' && !inQuotes) {
|
||||
@@ -581,9 +556,9 @@ const loadMannschaften = async () => {
|
||||
}
|
||||
}
|
||||
values.push(current.trim())
|
||||
|
||||
|
||||
if (values.length < 10) return null
|
||||
|
||||
|
||||
return {
|
||||
mannschaft: values[0].trim(),
|
||||
slug: values[0].trim().toLowerCase().replace(/\s+/g, '-')
|
||||
@@ -612,7 +587,7 @@ onMounted(() => {
|
||||
loadMannschaften()
|
||||
checkGalleryImages()
|
||||
authStore.checkAuth()
|
||||
|
||||
|
||||
// Close CMS dropdown when clicking outside
|
||||
document.addEventListener('click', (e) => {
|
||||
if (!e.target.closest('.relative.inline-block')) {
|
||||
@@ -621,19 +596,19 @@ onMounted(() => {
|
||||
})
|
||||
})
|
||||
|
||||
const toggleSubmenu = (menu) => {
|
||||
// Wenn wir schon im richtigen Bereich sind, nichts tun (Submenu bleibt offen)
|
||||
// Wenn nicht, zur Hauptseite navigieren
|
||||
const path = route.path
|
||||
const toggleSubmenu = (menu) => {
|
||||
// Wenn wir schon im richtigen Bereich sind, nichts tun (Submenu bleibt offen)
|
||||
// Wenn nicht, zur Hauptseite navigieren
|
||||
const path = route.path
|
||||
|
||||
if (menu === 'verein' && !path.startsWith('/verein/') && !path.startsWith('/vorstand') && !path.startsWith('/vereinsmeisterschaften')) {
|
||||
navigateTo('/verein/ueber-uns')
|
||||
} else if (menu === 'mannschaften' && !path.startsWith('/mannschaften') && !path.startsWith('/spielsysteme')) {
|
||||
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')
|
||||
}
|
||||
}
|
||||
if (menu === 'verein' && !path.startsWith('/verein/') && !path.startsWith('/vorstand') && !path.startsWith('/vereinsmeisterschaften')) {
|
||||
navigateTo('/verein/ueber-uns')
|
||||
} else if (menu === 'mannschaften' && !path.startsWith('/mannschaften') && !path.startsWith('/spielsysteme')) {
|
||||
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