From ec9b92000e0815703ea4b8266e69aa6385ad9e14 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 8 Oct 2025 18:06:22 +0200 Subject: [PATCH] Update Member model to allow optional birthDate and enhance QuickAddMemberDialog for better input handling. Refactor DiaryView to remove default birthDate logic and improve member creation process. Adjust MembersView to handle empty birthDate gracefully in formatting. --- backend/models/Member.js | 4 +- .../src/components/QuickAddMemberDialog.vue | 24 +++++---- frontend/src/views/DiaryView.vue | 52 ++++++++++--------- frontend/src/views/MembersView.vue | 2 + 4 files changed, 44 insertions(+), 38 deletions(-) diff --git a/backend/models/Member.js b/backend/models/Member.js index 2c128ee..a415712 100644 --- a/backend/models/Member.js +++ b/backend/models/Member.js @@ -45,9 +45,9 @@ const Member = sequelize.define('Member', { }, birthDate: { type: DataTypes.STRING, - allowNull: false, + allowNull: true, set(value) { - const encryptedValue = encryptData(value); + const encryptedValue = encryptData(value || ''); this.setDataValue('birthDate', encryptedValue); }, get() { diff --git a/frontend/src/components/QuickAddMemberDialog.vue b/frontend/src/components/QuickAddMemberDialog.vue index 23635be..b8238ee 100644 --- a/frontend/src/components/QuickAddMemberDialog.vue +++ b/frontend/src/components/QuickAddMemberDialog.vue @@ -14,7 +14,8 @@ @@ -33,17 +35,18 @@
- +
- @@ -101,15 +104,14 @@ export default { this.localMember = { ...newVal }; }, deep: true - }, - localMember: { - handler(newVal) { - this.$emit('update:member', newVal); - }, - deep: true } }, methods: { + updateMember(field, value) { + this.localMember[field] = value; + this.$emit('update:member', { ...this.localMember }); + }, + handleClose() { this.$emit('update:modelValue', false); this.$emit('close'); diff --git a/frontend/src/views/DiaryView.vue b/frontend/src/views/DiaryView.vue index 67bc258..24f58f5 100644 --- a/frontend/src/views/DiaryView.vue +++ b/frontend/src/views/DiaryView.vue @@ -1713,15 +1713,10 @@ export default { openQuickAddDialog() { this.showQuickAddDialog = true; - // Standard-Geburtsdatum: 01.01.(aktuelles Jahr - 10) - const currentYear = new Date().getFullYear(); - const defaultBirthYear = currentYear - 10; - const defaultBirthDate = `${defaultBirthYear}-01-01`; - this.newMember = { firstName: '', lastName: '', - birthDate: defaultBirthDate, + birthDate: '', gender: '' }; }, @@ -1736,39 +1731,46 @@ export default { }; }, - async createAndAddMember() { - if (!this.isNewMemberValid) return; + async createAndAddMember(memberData) { + console.log('🔍 createAndAddMember aufgerufen mit:', memberData); + + // Verwende die übergebenen Daten oder die lokalen Daten als Fallback + const data = memberData || this.newMember; + + console.log('📊 Verwendete Daten:', data); + + if (!data.firstName || data.firstName.trim() === '') { + console.log('❌ Validierung fehlgeschlagen: Vorname fehlt'); + this.showInfo('Fehler', 'Vorname ist erforderlich', '', 'error'); + return; + } try { - // Standard-Geburtsdatum falls keins eingegeben wurde - let birthDate = this.newMember.birthDate; - if (!birthDate) { - const currentYear = new Date().getFullYear(); - const defaultBirthYear = currentYear - 10; - birthDate = `${defaultBirthYear}-01-01`; - } - + console.log('✅ Validierung erfolgreich, erstelle Mitglied...'); + // Erstelle neues Mitglied - const memberData = { - firstName: this.newMember.firstName.trim(), - lastName: this.newMember.lastName.trim(), - birthDate: birthDate, - gender: this.newMember.gender + const memberDataToSend = { + firstName: data.firstName.trim(), + lastName: data.lastName.trim(), + birthDate: data.birthDate || '', + gender: data.gender }; + + console.log('📤 Sende Daten an API:', memberDataToSend); const response = await apiClient.post(`/clubmembers/set/${this.currentClub}`, { id: null, // null für neues Mitglied - firstname: memberData.firstName, - lastname: memberData.lastName, + firstname: memberDataToSend.firstName, + lastname: memberDataToSend.lastName, street: '', city: '', - birthdate: memberData.birthDate, + birthdate: memberDataToSend.birthDate, phone: '', email: '', active: true, testMembership: false, picsInInternetAllowed: false, - gender: memberData.gender + gender: memberDataToSend.gender }); if (response.data.result === 'success') { diff --git a/frontend/src/views/MembersView.vue b/frontend/src/views/MembersView.vue index 4df6078..104b3bb 100644 --- a/frontend/src/views/MembersView.vue +++ b/frontend/src/views/MembersView.vue @@ -565,7 +565,9 @@ export default { pdfGenerator.save('Telefonliste.pdf'); }, getFormattedBirthdate(birthDate) { + if (!birthDate) return '–'; const date = new Date(birthDate); + if (isNaN(date.getTime())) return '–'; return `${String(date.getDate()).padStart(2, '0')}.${String(date.getMonth() + 1).padStart(2, '0')}.${date.getFullYear()}`; }, labelGender(g) {