Erweiterungen

This commit is contained in:
2026-02-17 16:27:20 +01:00
parent 6181f53854
commit b4b1685ea6

View File

@@ -174,14 +174,8 @@ public class AddJobView extends Main {
// Adressvalidierung // Adressvalidierung
private final Map<String, AddressValidationResult> addressValidationResults = new HashMap<>(); private final Map<String, AddressValidationResult> addressValidationResults = new HashMap<>();
private RouteCalculationResult routeCalculationResult; private RouteCalculationResult routeCalculationResult;
private String lastPickupStreet = ""; private boolean addressesDirty = true; // true = Adressen müssen validiert werden
private String lastPickupHouseNumber = ""; private boolean validationDialogOpen = false; // true = Dialog ist gerade geöffnet
private String lastPickupZip = "";
private String lastPickupCity = "";
private String lastDeliveryStreet = "";
private String lastDeliveryHouseNumber = "";
private String lastDeliveryZip = "";
private String lastDeliveryCity = "";
private TabSheet tabSheet; private TabSheet tabSheet;
public AddJobView(AddJobService addJobService, AddCustomerService addCustomerService, public AddJobView(AddJobService addJobService, AddCustomerService addCustomerService,
@@ -240,6 +234,10 @@ public class AddJobView extends Main {
savePickupAddress.setValue(true); savePickupAddress.setValue(true);
return; return;
} }
// Streckeninformationen zurücksetzen, da sich die Abholadresse ändert
resetRouteInformation();
Customer c = customerLabelToEntity.get(selected); Customer c = customerLabelToEntity.get(selected);
if (c == null) if (c == null)
return; return;
@@ -421,6 +419,9 @@ public class AddJobView extends Main {
submitButton = new Button("Auftrag anlegen", event -> submit()); submitButton = new Button("Auftrag anlegen", event -> submit());
submitButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY); submitButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
submitButton.setEnabled(false); submitButton.setEnabled(false);
// Listener für Adressänderungen registrieren
setupAddressChangeListeners();
} }
// Testdaten entfernt // Testdaten entfernt
@@ -973,6 +974,9 @@ public class AddJobView extends Main {
return; return;
} }
// Streckeninformationen zurücksetzen, da sich die Adresse ändert
resetRouteInformation();
// Find the first customer with this company name // Find the first customer with this company name
Optional<Customer> matchingCustomer = allCustomers.stream() Optional<Customer> matchingCustomer = allCustomers.stream()
.filter(c -> selectedCompany.equals(c.getCompanyName())).findFirst(); .filter(c -> selectedCompany.equals(c.getCompanyName())).findFirst();
@@ -1041,6 +1045,9 @@ public class AddJobView extends Main {
String customValue = event.getDetail(); String customValue = event.getDetail();
companyField.setValue(customValue); companyField.setValue(customValue);
// Streckeninformationen zurücksetzen
resetRouteInformation();
// Reactivate save checkbox for custom values // Reactivate save checkbox for custom values
if (isPickup) { if (isPickup) {
savePickupAddress.setValue(true); savePickupAddress.setValue(true);
@@ -1833,6 +1840,9 @@ public class AddJobView extends Main {
* Leert alle Felder im Formular * Leert alle Felder im Formular
*/ */
private void clearAllFields() { private void clearAllFields() {
// Streckeninformationen zurücksetzen
resetRouteInformation();
// Customer selection // Customer selection
customerSelection.clear(); customerSelection.clear();
@@ -2732,60 +2742,70 @@ public class AddJobView extends Main {
return; return;
} }
log.debug("Tab-Wechsel von Adress-Tab zu '{}' - addressesDirty={}", selectedTab.getLabel(), addressesDirty);
// Wenn der Validierungsdialog gerade geöffnet ist, nichts tun
if (validationDialogOpen) {
log.debug("Validierungsdialog ist geöffnet - ignoriere Tab-Wechsel");
return;
}
// Prüfen, ob Adressen geändert wurden // Prüfen, ob Adressen geändert wurden
boolean pickupChanged = hasPickupAddressChanged(); boolean pickupChanged = hasPickupAddressChanged();
boolean deliveryChanged = hasDeliveryAddressChanged(); boolean deliveryChanged = hasDeliveryAddressChanged();
log.debug("Adressänderung: pickupChanged={}, deliveryChanged={}", pickupChanged, deliveryChanged);
if (!pickupChanged && !deliveryChanged) { if (!pickupChanged && !deliveryChanged) {
// Adressen nicht geändert, nichts zu tun // Adressen nicht geändert, nichts zu tun
log.debug("Keine Adressänderung - Dialog wird nicht angezeigt");
return; return;
} }
// Tab-Wechsel vorübergehend verhindern, indem wir zurück zum Adress-Tab // Tab-Wechsel vorübergehend verhindern
// wechseln // Flag setzen, Dialog anzeigen, und Tab zurücksetzen
// Der Dialog wird angezeigt und bei Bestätigung wird der Tab gewechselt validationDialogOpen = true;
event.unregisterListener();
tabSheet.setSelectedTab(addressesTab); tabSheet.setSelectedTab(addressesTab);
// Validierungsdialog anzeigen // Validierungsdialog anzeigen
log.debug("Zeige Validierungsdialog an");
showAddressValidationDialog(selectedTab); showAddressValidationDialog(selectedTab);
} }
/** /**
* Prüft, ob sich die Abholadresse geändert hat. * Prüft, ob die Abholadresse gültig ist (Pflichtfelder ausgefüllt).
*/ */
private boolean hasPickupAddressChanged() { private boolean hasPickupAddressChanged() {
String currentStreet = getValueOrEmpty(pickupStreet); String currentStreet = getValueOrEmpty(pickupStreet);
String currentHouseNumber = getValueOrEmpty(pickupHouseNumber);
String currentZip = getValueOrEmpty(pickupZip); String currentZip = getValueOrEmpty(pickupZip);
String currentCity = getValueOrEmpty(pickupCity); String currentCity = getValueOrEmpty(pickupCity);
boolean changed = !currentStreet.equals(lastPickupStreet) || !currentHouseNumber.equals(lastPickupHouseNumber) // Nur true zurückgeben, wenn alle Pflichtfelder ausgefüllt sind und Validierung
|| !currentZip.equals(lastPickupZip) || !currentCity.equals(lastPickupCity); // nötig ist
return addressesDirty && !currentStreet.isEmpty() && !currentZip.isEmpty() && !currentCity.isEmpty();
return changed && !currentStreet.isEmpty() && !currentZip.isEmpty() && !currentCity.isEmpty();
} }
/** /**
* Prüft, ob sich die Lieferadresse geändert hat. * Prüft, ob die Lieferadresse gültig ist (Pflichtfelder ausgefüllt).
*/ */
private boolean hasDeliveryAddressChanged() { private boolean hasDeliveryAddressChanged() {
String currentStreet = getValueOrEmpty(deliveryStreet); String currentStreet = getValueOrEmpty(deliveryStreet);
String currentHouseNumber = getValueOrEmpty(deliveryHouseNumber);
String currentZip = getValueOrEmpty(deliveryZip); String currentZip = getValueOrEmpty(deliveryZip);
String currentCity = getValueOrEmpty(deliveryCity); String currentCity = getValueOrEmpty(deliveryCity);
boolean changed = !currentStreet.equals(lastDeliveryStreet) // Nur true zurückgeben, wenn alle Pflichtfelder ausgefüllt sind und Validierung
|| !currentHouseNumber.equals(lastDeliveryHouseNumber) || !currentZip.equals(lastDeliveryZip) // nötig ist
|| !currentCity.equals(lastDeliveryCity); return addressesDirty && !currentStreet.isEmpty() && !currentZip.isEmpty() && !currentCity.isEmpty();
return changed && !currentStreet.isEmpty() && !currentZip.isEmpty() && !currentCity.isEmpty();
} }
private String getValueOrEmpty(TextField field) { private String getValueOrEmpty(TextField field) {
return field.getValue() != null ? field.getValue().trim() : ""; return field.getValue() != null ? field.getValue().trim() : "";
} }
private String getComboValueOrEmpty(ComboBox<String> field) {
return field.getValue() != null ? field.getValue().trim() : "";
}
/** /**
* Zeigt den Adressvalidierungsdialog an. Die Prüfung erfolgt im Hintergrund und * Zeigt den Adressvalidierungsdialog an. Die Prüfung erfolgt im Hintergrund und
* der Dialog wird aktualisiert, sobald die Ergebnisse vorliegen. * der Dialog wird aktualisiert, sobald die Ergebnisse vorliegen.
@@ -2841,6 +2861,8 @@ public class AddJobView extends Main {
final Button cancelButton = new Button("Zurück", e -> { final Button cancelButton = new Button("Zurück", e -> {
dialog.close(); dialog.close();
// Im Adress-Tab bleiben // Im Adress-Tab bleiben
validationDialogOpen = false;
log.debug("Dialog geschlossen (Zurück), validationDialogOpen=false");
}); });
cancelButton.addThemeVariants(ButtonVariant.LUMO_TERTIARY); cancelButton.addThemeVariants(ButtonVariant.LUMO_TERTIARY);
@@ -2848,8 +2870,10 @@ public class AddJobView extends Main {
dialog.close(); dialog.close();
// Zum Ziel-Tab wechseln // Zum Ziel-Tab wechseln
tabSheet.setSelectedTab(targetTab); tabSheet.setSelectedTab(targetTab);
// Gespeicherte Adressen aktualisieren // Adressen als validiert markieren
saveCurrentAddresses(); markAddressesAsValidated();
validationDialogOpen = false;
log.debug("Dialog geschlossen (Weiter), validationDialogOpen=false");
}); });
continueButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY); continueButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
@@ -3047,18 +3071,11 @@ public class AddJobView extends Main {
} }
/** /**
* Speichert die aktuellen Adressen als "zuletzt geprüft". * Markiert die Adressen als validiert (nach erfolgreicher Prüfung).
*/ */
private void saveCurrentAddresses() { private void markAddressesAsValidated() {
lastPickupStreet = getValueOrEmpty(pickupStreet); addressesDirty = false;
lastPickupHouseNumber = getValueOrEmpty(pickupHouseNumber); log.debug("Adressen als validiert markiert");
lastPickupZip = getValueOrEmpty(pickupZip);
lastPickupCity = getValueOrEmpty(pickupCity);
lastDeliveryStreet = getValueOrEmpty(deliveryStreet);
lastDeliveryHouseNumber = getValueOrEmpty(deliveryHouseNumber);
lastDeliveryZip = getValueOrEmpty(deliveryZip);
lastDeliveryCity = getValueOrEmpty(deliveryCity);
} }
/** /**
@@ -3106,4 +3123,86 @@ public class AddJobView extends Main {
: 0.0; : 0.0;
} }
/**
* Registriert ValueChangeListener für alle Adressfelder, um bei Änderungen die
* Streckeninformationen zurückzusetzen.
*/
private void setupAddressChangeListeners() {
// Abholadress-Felder
pickupCompany.addValueChangeListener(e -> {
if (e.isFromClient()) {
resetRouteInformation();
}
});
pickupStreet.addValueChangeListener(e -> {
if (e.isFromClient()) {
resetRouteInformation();
}
});
pickupHouseNumber.addValueChangeListener(e -> {
if (e.isFromClient()) {
resetRouteInformation();
}
});
pickupZip.addValueChangeListener(e -> {
if (e.isFromClient()) {
resetRouteInformation();
}
});
pickupCity.addValueChangeListener(e -> {
if (e.isFromClient()) {
resetRouteInformation();
}
});
// Lieferadress-Felder
deliveryCompany.addValueChangeListener(e -> {
if (e.isFromClient()) {
resetRouteInformation();
}
});
deliveryStreet.addValueChangeListener(e -> {
if (e.isFromClient()) {
resetRouteInformation();
}
});
deliveryHouseNumber.addValueChangeListener(e -> {
if (e.isFromClient()) {
resetRouteInformation();
}
});
deliveryZip.addValueChangeListener(e -> {
if (e.isFromClient()) {
resetRouteInformation();
}
});
deliveryCity.addValueChangeListener(e -> {
if (e.isFromClient()) {
resetRouteInformation();
}
});
}
/**
* Setzt alle Streckeninformationen zurück, wenn sich Adressdaten ändern. Dies
* bewirkt, dass der Validierungsdialog beim Tab-Wechsel erneut angezeigt wird.
*/
private void resetRouteInformation() {
// Flag setzen, dass Adressen geändert wurden
addressesDirty = true;
// Routenberechnung zurücksetzen
routeCalculationResult = null;
// Validierungsergebnisse zurücksetzen
addressValidationResults.clear();
// Route-Info-Box im Preis-Tab verstecken
if (routeInfoBox != null) {
routeInfoBox.setVisible(false);
}
log.debug("Streckeninformationen zurückgesetzt aufgrund von Adressänderungen");
}
} }