From 46c2c14ae840591cbaed15fd3b6a3d3f5ab3458c Mon Sep 17 00:00:00 2001
From: "Torsten Schulz (local)"
Date: Thu, 26 Feb 2026 14:28:54 +0100
Subject: [PATCH] =?UTF-8?q?F=C3=BCge=20Unterst=C3=BCtzung=20f=C3=BCr=20Kon?=
=?UTF-8?q?taktanfragen=20hinzu,=20einschlie=C3=9Flich=20neuer=20Routen=20?=
=?UTF-8?q?und=20Berechtigungen=20f=C3=BCr=20Trainer=20und=20Vorstand.=20A?=
=?UTF-8?q?ktualisiere=20E-Mail-Versandlogik,=20um=20Anfragen=20an=20alle?=
=?UTF-8?q?=20relevanten=20Empf=C3=A4nger=20weiterzuleiten.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
components/Contact.vue | 2 +-
components/Membership.vue | 2 +-
components/MembershipNoQuestions.vue | 2 +-
components/Navigation.vue | 38 +++
middleware/auth.js | 5 +
pages/cms/benutzer.vue | 15 +-
pages/cms/einstellungen.vue | 9 +
pages/cms/index.vue | 23 +-
pages/cms/kontaktanfragen.vue | 229 ++++++++++++++++++
pages/login.vue | 4 +-
server/api/cms/contact-requests.get.js | 17 ++
.../cms/contact-requests/[id]/reply.post.js | 75 ++++++
server/api/cms/users/update-role.post.js | 2 +-
server/api/contact.post.js | 164 +++++++++----
server/utils/contact-requests.js | 79 ++++++
15 files changed, 612 insertions(+), 54 deletions(-)
create mode 100644 pages/cms/kontaktanfragen.vue
create mode 100644 server/api/cms/contact-requests.get.js
create mode 100644 server/api/cms/contact-requests/[id]/reply.post.js
create mode 100644 server/utils/contact-requests.js
diff --git a/components/Contact.vue b/components/Contact.vue
index de07d96..88ca33e 100644
--- a/components/Contact.vue
+++ b/components/Contact.vue
@@ -202,7 +202,7 @@
- Ihre Nachricht wird direkt an j.dichmann@gmx.de gesendet
+ Ihre Nachricht wird an den Vorstand und die Trainer weitergeleitet
diff --git a/components/Membership.vue b/components/Membership.vue
index d85e518..4112bfd 100644
--- a/components/Membership.vue
+++ b/components/Membership.vue
@@ -109,7 +109,7 @@
oder
oder
+
+
+
+ Kontaktanfragen
+
+
@@ -371,6 +381,13 @@
>
Mitgliederverwaltung
+
+ Kontaktanfragen
+
+
+
+
+ Kontaktanfragen
+
+
Mitgliederverwaltung
+
+ Kontaktanfragen
+
{
const store = getAuthStore()
return store?.hasAnyRole('admin', 'vorstand', 'newsletter') ?? false
})
+const canAccessContactRequests = computed(() => {
+ const store = getAuthStore()
+ return store?.hasAnyRole('admin', 'vorstand', 'trainer') ?? false
+})
// Automatisches Setzen des Submenus basierend auf der Route
const currentSubmenu = computed(() => {
diff --git a/middleware/auth.js b/middleware/auth.js
index a200285..1382645 100644
--- a/middleware/auth.js
+++ b/middleware/auth.js
@@ -19,12 +19,17 @@ export default defineNuxtRouteMiddleware(async (to, _from) => {
if (to.path.startsWith('/cms')) {
const roles = auth.value.roles || (auth.value.role ? [auth.value.role] : [])
const hasAccess = roles.includes('admin') || roles.includes('vorstand') || roles.includes('newsletter')
+ const canAccessContactRequests = roles.includes('admin') || roles.includes('vorstand') || roles.includes('trainer')
// Newsletter-Seite nur für Newsletter-Rolle, Admin oder Vorstand
if (to.path.startsWith('/cms/newsletter')) {
if (!hasAccess) {
return navigateTo('/mitgliederbereich')
}
+ } else if (to.path.startsWith('/cms/kontaktanfragen')) {
+ if (!canAccessContactRequests) {
+ return navigateTo('/mitgliederbereich')
+ }
} else {
// Andere CMS-Seiten nur für Admin oder Vorstand
const isAdmin = roles.includes('admin') || roles.includes('vorstand')
diff --git a/pages/cms/benutzer.vue b/pages/cms/benutzer.vue
index 49b7131..28dce73 100644
--- a/pages/cms/benutzer.vue
+++ b/pages/cms/benutzer.vue
@@ -70,6 +70,9 @@
+
@@ -177,10 +180,11 @@
'bg-red-100 text-red-800': role === 'admin',
'bg-blue-100 text-blue-800': role === 'vorstand',
'bg-green-100 text-green-800': role === 'newsletter',
+ 'bg-amber-100 text-amber-800': role === 'trainer',
'bg-gray-100 text-gray-800': role === 'mitglied'
}"
>
- {{ role === 'admin' ? 'Admin' : role === 'vorstand' ? 'Vorstand' : role === 'newsletter' ? 'Newsletter' : 'Mitglied' }}
+ {{ role === 'admin' ? 'Admin' : role === 'vorstand' ? 'Vorstand' : role === 'newsletter' ? 'Newsletter' : role === 'trainer' ? 'Trainer' : 'Mitglied' }}