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:
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user