Enhance error handling and logging in MemberTransferService and MemberTransferDialog

Updated the MemberTransferService to provide detailed error messages during bulk transfers, including identification of problematic members. Improved logging for error responses to facilitate debugging. In the MemberTransferDialog, implemented $nextTick to ensure login credentials are cleared properly upon loading and closing, enhancing user experience and preventing autofill issues.
This commit is contained in:
Torsten Schulz (local)
2025-11-06 08:24:39 +01:00
parent 2f161d1eb5
commit 75242f63fc
2 changed files with 86 additions and 21 deletions

View File

@@ -373,12 +373,31 @@ class MemberTransferService {
}
};
} else {
// Extrahiere detaillierte Fehlerinformationen
let errorMessage = transferResult.error || 'Bulk-Übertragung fehlgeschlagen';
// Wenn die Fehlermeldung Validierungsfehler enthält, versuche zu identifizieren, welches Mitglied das Problem verursacht
if (errorMessage.includes('Zeile') || errorMessage.includes('Validierungsfehler')) {
// Versuche die Zeilennummer zu extrahieren
const lineMatch = errorMessage.match(/Zeile\s+(\d+)/);
if (lineMatch) {
const lineNumber = parseInt(lineMatch[1], 10);
// Zeile 1 = Index 0 im Array
const memberIndex = lineNumber - 1;
if (memberIndex >= 0 && memberIndex < membersArray.length) {
const problematicMember = membersArray[memberIndex];
const memberName = `${problematicMember.firstName || ''} ${problematicMember.lastName || ''}`.trim() || 'Unbekanntes Mitglied';
errorMessage = `${errorMessage}\n\nProblematisches Mitglied (Index ${memberIndex + 1}): ${memberName}`;
}
}
}
return {
status: transferResult.status || 500,
response: {
success: false,
message: 'Bulk-Übertragung fehlgeschlagen',
error: transferResult.error,
error: errorMessage,
transferred: 0,
total: members.length,
errors: memberErrors
@@ -727,10 +746,33 @@ class MemberTransferService {
};
} catch (error) {
errorLog('[transferMember] Error:', error);
// Extrahiere detaillierte Fehlerinformationen
let errorMessage = 'Übertragung fehlgeschlagen';
let statusCode = error.response?.status;
if (error.response?.data) {
// Versuche verschiedene Felder für die Fehlermeldung
errorMessage = error.response.data.message ||
error.response.data.error ||
error.response.data.errorMessage ||
(typeof error.response.data === 'string' ? error.response.data : errorMessage);
// Logge die vollständige Fehlerantwort für Debugging
infoLog('[transferMember] Fehlerantwort vom externen Endpoint:', JSON.stringify(error.response.data, null, 2));
} else if (error.message) {
errorMessage = error.message;
}
// Logge den Status-Code für Debugging
if (statusCode) {
infoLog(`[transferMember] Externer Endpoint Status: ${statusCode}`);
}
return {
success: false,
error: error.response?.data?.message || error.message || 'Übertragung fehlgeschlagen',
status: error.response?.status
error: errorMessage,
status: statusCode
};
}
}

View File

@@ -58,17 +58,27 @@
<label>Login-Daten:</label>
<div class="credentials-group">
<div class="credential-row">
<!-- Dummy-Felder, um Browser-Autofill zu verhindern (ausgeblendet) -->
<input type="text" style="position: absolute; left: -9999px; opacity: 0;" tabindex="-1" autocomplete="off" />
<input type="password" style="position: absolute; left: -9999px; opacity: 0;" tabindex="-1" autocomplete="off" />
<input
type="text"
v-model="loginCredentials.username"
placeholder="Benutzername / Email"
class="form-input"
autocomplete="off"
name="transfer-username"
id="transfer-username"
/>
<input
type="password"
v-model="loginCredentials.password"
placeholder="Passwort (leer lassen für gespeichertes)"
class="form-input"
autocomplete="new-password"
name="transfer-password"
id="transfer-password"
/>
</div>
<div class="credential-row">
@@ -77,12 +87,16 @@
v-model="loginCredentials.additionalField1"
:placeholder="additionalField1Placeholder"
class="form-input"
autocomplete="off"
name="transfer-additional1"
/>
<input
type="text"
v-model="loginCredentials.additionalField2"
:placeholder="additionalField2Placeholder"
class="form-input"
autocomplete="off"
name="transfer-additional2"
/>
</div>
</div>
@@ -173,12 +187,15 @@ export default {
modelValue(newVal) {
if (newVal) {
// WICHTIG: Felder sofort leeren, bevor Konfiguration geladen wird
this.loginCredentials = {
username: '',
password: '',
additionalField1: '',
additionalField2: ''
};
// Verwende $nextTick, um sicherzustellen, dass Vue die Änderungen verarbeitet
this.$nextTick(() => {
this.loginCredentials = {
username: '',
password: '',
additionalField1: '',
additionalField2: ''
};
});
this.loadSavedConfig();
} else {
// Beim Schließen auch leeren
@@ -200,12 +217,15 @@ export default {
}
// WICHTIG: Login-Credentials sofort leeren, damit sie nicht vorausgefüllt werden
this.loginCredentials = {
username: '',
password: '',
additionalField1: '',
additionalField2: ''
};
// Verwende $nextTick, um sicherzustellen, dass Vue die Änderungen verarbeitet
this.$nextTick(() => {
this.loginCredentials = {
username: '',
password: '',
additionalField1: '',
additionalField2: ''
};
});
this.loadingConfig = true;
try {
@@ -235,12 +255,15 @@ export default {
}
} finally {
// Sicherstellen, dass Login-Credentials leer sind
this.loginCredentials = {
username: '',
password: '',
additionalField1: '',
additionalField2: ''
};
// Verwende $nextTick, um sicherzustellen, dass Vue die Änderungen verarbeitet
this.$nextTick(() => {
this.loginCredentials = {
username: '',
password: '',
additionalField1: '',
additionalField2: ''
};
});
this.loadingConfig = false;
}
},