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.

This commit is contained in:
Torsten Schulz (local)
2025-10-08 18:06:22 +02:00
parent d110900e85
commit ec9b92000e
4 changed files with 44 additions and 38 deletions

View File

@@ -14,7 +14,8 @@
<input
type="text"
id="firstName"
v-model="localMember.firstName"
:value="localMember.firstName"
@input="updateMember('firstName', $event.target.value)"
required
class="form-input"
placeholder="Vorname"
@@ -25,7 +26,8 @@
<input
type="text"
id="lastName"
v-model="localMember.lastName"
:value="localMember.lastName"
@input="updateMember('lastName', $event.target.value)"
class="form-input"
placeholder="Nachname"
/>
@@ -33,17 +35,18 @@
</div>
<div class="form-row">
<div class="form-group">
<label for="birthDate">Geburtsdatum:</label>
<label for="birthDate">Geburtsdatum (optional):</label>
<input
type="date"
id="birthDate"
v-model="localMember.birthDate"
:value="localMember.birthDate"
@input="updateMember('birthDate', $event.target.value)"
class="form-input"
/>
</div>
<div class="form-group">
<label for="gender">Geschlecht:</label>
<select id="gender" v-model="localMember.gender" class="form-select">
<select id="gender" :value="localMember.gender" @change="updateMember('gender', $event.target.value)" class="form-select">
<option value="">Bitte wählen</option>
<option value="male">Männlich</option>
<option value="female">Weiblich</option>
@@ -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');

View File

@@ -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') {

View File

@@ -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) {