From d35e1c9a3e5478af0de8986e57248c948b903136 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Sat, 14 Feb 2026 15:48:56 +0100 Subject: [PATCH] =?UTF-8?q?F=C3=BCge=20Vorname=20und=20Nachname=20in=20das?= =?UTF-8?q?=20Registrierungsformular=20und=20die=20Mitgliederverwaltung=20?= =?UTF-8?q?ein?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/registrieren.vue | 42 +++++++++++++++++++++++++++++---------- server/api/members.get.js | 20 +++++++++++++++++-- 2 files changed, 50 insertions(+), 12 deletions(-) diff --git a/pages/registrieren.vue b/pages/registrieren.vue index c681730..0e0e9f5 100644 --- a/pages/registrieren.vue +++ b/pages/registrieren.vue @@ -32,22 +32,40 @@ --> - +
+
+ +
+ +
@@ -318,7 +336,8 @@ import { AlertCircle, Check, Loader2, Info } from 'lucide-vue-next' // console.log('[DEBUG] Component setup started') const formData = ref({ - name: '', + firstName: '', + lastName: '', email: '', phone: '', password: '', @@ -400,7 +419,9 @@ const handleRegister = async () => { const response = await $fetch('/api/auth/register', { method: 'POST', body: { - name: formData.value.name, + firstName: formData.value.firstName, + lastName: formData.value.lastName, + name: `${formData.value.firstName} ${formData.value.lastName}`.trim(), email: formData.value.email, phone: formData.value.phone, password: formData.value.password @@ -412,7 +433,8 @@ const handleRegister = async () => { // Reset form formData.value = { - name: '', + firstName: '', + lastName: '', email: '', phone: '', password: '', diff --git a/server/api/members.get.js b/server/api/members.get.js index 26911b5..8a6e2cf 100644 --- a/server/api/members.get.js +++ b/server/api/members.get.js @@ -100,6 +100,14 @@ export default defineEventHandler(async (event) => { const normalizedEmail = user.email?.toLowerCase().trim() || '' const normalizedName = user.name?.toLowerCase().trim() || '' + // Hilfsfunktion: Extrahiere Vorname/Nachname aus user.name + function extractNames(name) { + if (!name || typeof name !== 'string') return { firstName: '', lastName: '' } + const parts = name.trim().split(/\s+/) + if (parts.length === 1) return { firstName: parts[0], lastName: '' } + return { firstName: parts[0], lastName: parts.slice(1).join(' ') } + } + // Check if this user matches an existing manual member using O(1) lookup let matchedManualIndex = -1 @@ -135,6 +143,8 @@ export default defineEventHandler(async (event) => { // Merge with existing manual member const migratedUser = migrateUserRoles({ ...user }) const roles = Array.isArray(migratedUser.roles) ? migratedUser.roles : (migratedUser.role ? [migratedUser.role] : ['mitglied']) + // Extrahiere Namen nur, wenn Felder leer sind + const { firstName, lastName } = extractNames(user.name) mergedMembers[matchedManualIndex] = { ...mergedMembers[matchedManualIndex], hasLogin: true, @@ -142,7 +152,10 @@ export default defineEventHandler(async (event) => { loginRoles: roles, loginRole: roles[0] || 'mitglied', // Rückwärtskompatibilität lastLogin: user.lastLogin, - isMannschaftsspieler: user.isMannschaftsspieler === true || mergedMembers[matchedManualIndex].isMannschaftsspieler === true + isMannschaftsspieler: user.isMannschaftsspieler === true || mergedMembers[matchedManualIndex].isMannschaftsspieler === true, + firstName: mergedMembers[matchedManualIndex].firstName || firstName, + lastName: mergedMembers[matchedManualIndex].lastName || lastName, + editable: true } // If the registered user has visibility preferences, apply them (coerce to booleans) if (user.visibility && typeof user.visibility === 'object') { @@ -160,9 +173,12 @@ export default defineEventHandler(async (event) => { // Registered-only user: default to privacy-preserving visibility (hidden) unless user explicitly set visibility elsewhere // Use stored visibility from user if present, otherwise default to false const userVis = user.visibility || {} + const { firstName, lastName } = extractNames(user.name) mergedMembers.push({ id: user.id, name: user.name, + firstName, + lastName, email: user.email, phone: user.phone || '', address: '', @@ -173,7 +189,7 @@ export default defineEventHandler(async (event) => { }, notes: `Rolle(n): ${roles.join(', ')}`, source: 'login', - editable: false, + editable: true, hasLogin: true, loginEmail: user.email, loginRoles: roles,