diff --git a/src/main/java/de/assecutor/votianlt/pages/view/AddJobView.java b/src/main/java/de/assecutor/votianlt/pages/view/AddJobView.java index 6e75e1d..ab00768 100644 --- a/src/main/java/de/assecutor/votianlt/pages/view/AddJobView.java +++ b/src/main/java/de/assecutor/votianlt/pages/view/AddJobView.java @@ -174,14 +174,8 @@ public class AddJobView extends Main { // Adressvalidierung private final Map addressValidationResults = new HashMap<>(); private RouteCalculationResult routeCalculationResult; - private String lastPickupStreet = ""; - private String lastPickupHouseNumber = ""; - private String lastPickupZip = ""; - private String lastPickupCity = ""; - private String lastDeliveryStreet = ""; - private String lastDeliveryHouseNumber = ""; - private String lastDeliveryZip = ""; - private String lastDeliveryCity = ""; + private boolean addressesDirty = true; // true = Adressen müssen validiert werden + private boolean validationDialogOpen = false; // true = Dialog ist gerade geöffnet private TabSheet tabSheet; public AddJobView(AddJobService addJobService, AddCustomerService addCustomerService, @@ -240,6 +234,10 @@ public class AddJobView extends Main { savePickupAddress.setValue(true); return; } + + // Streckeninformationen zurücksetzen, da sich die Abholadresse ändert + resetRouteInformation(); + Customer c = customerLabelToEntity.get(selected); if (c == null) return; @@ -421,6 +419,9 @@ public class AddJobView extends Main { submitButton = new Button("Auftrag anlegen", event -> submit()); submitButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY); submitButton.setEnabled(false); + + // Listener für Adressänderungen registrieren + setupAddressChangeListeners(); } // Testdaten entfernt @@ -973,6 +974,9 @@ public class AddJobView extends Main { return; } + // Streckeninformationen zurücksetzen, da sich die Adresse ändert + resetRouteInformation(); + // Find the first customer with this company name Optional matchingCustomer = allCustomers.stream() .filter(c -> selectedCompany.equals(c.getCompanyName())).findFirst(); @@ -1041,6 +1045,9 @@ public class AddJobView extends Main { String customValue = event.getDetail(); companyField.setValue(customValue); + // Streckeninformationen zurücksetzen + resetRouteInformation(); + // Reactivate save checkbox for custom values if (isPickup) { savePickupAddress.setValue(true); @@ -1833,6 +1840,9 @@ public class AddJobView extends Main { * Leert alle Felder im Formular */ private void clearAllFields() { + // Streckeninformationen zurücksetzen + resetRouteInformation(); + // Customer selection customerSelection.clear(); @@ -2732,60 +2742,70 @@ public class AddJobView extends Main { 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 boolean pickupChanged = hasPickupAddressChanged(); boolean deliveryChanged = hasDeliveryAddressChanged(); + log.debug("Adressänderung: pickupChanged={}, deliveryChanged={}", pickupChanged, deliveryChanged); + if (!pickupChanged && !deliveryChanged) { // Adressen nicht geändert, nichts zu tun + log.debug("Keine Adressänderung - Dialog wird nicht angezeigt"); return; } - // Tab-Wechsel vorübergehend verhindern, indem wir zurück zum Adress-Tab - // wechseln - // Der Dialog wird angezeigt und bei Bestätigung wird der Tab gewechselt - event.unregisterListener(); + // Tab-Wechsel vorübergehend verhindern + // Flag setzen, Dialog anzeigen, und Tab zurücksetzen + validationDialogOpen = true; tabSheet.setSelectedTab(addressesTab); // Validierungsdialog anzeigen + log.debug("Zeige Validierungsdialog an"); 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() { String currentStreet = getValueOrEmpty(pickupStreet); - String currentHouseNumber = getValueOrEmpty(pickupHouseNumber); String currentZip = getValueOrEmpty(pickupZip); String currentCity = getValueOrEmpty(pickupCity); - boolean changed = !currentStreet.equals(lastPickupStreet) || !currentHouseNumber.equals(lastPickupHouseNumber) - || !currentZip.equals(lastPickupZip) || !currentCity.equals(lastPickupCity); - - return changed && !currentStreet.isEmpty() && !currentZip.isEmpty() && !currentCity.isEmpty(); + // Nur true zurückgeben, wenn alle Pflichtfelder ausgefüllt sind und Validierung + // nötig ist + return addressesDirty && !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() { String currentStreet = getValueOrEmpty(deliveryStreet); - String currentHouseNumber = getValueOrEmpty(deliveryHouseNumber); String currentZip = getValueOrEmpty(deliveryZip); String currentCity = getValueOrEmpty(deliveryCity); - boolean changed = !currentStreet.equals(lastDeliveryStreet) - || !currentHouseNumber.equals(lastDeliveryHouseNumber) || !currentZip.equals(lastDeliveryZip) - || !currentCity.equals(lastDeliveryCity); - - return changed && !currentStreet.isEmpty() && !currentZip.isEmpty() && !currentCity.isEmpty(); + // Nur true zurückgeben, wenn alle Pflichtfelder ausgefüllt sind und Validierung + // nötig ist + return addressesDirty && !currentStreet.isEmpty() && !currentZip.isEmpty() && !currentCity.isEmpty(); } private String getValueOrEmpty(TextField field) { return field.getValue() != null ? field.getValue().trim() : ""; } + private String getComboValueOrEmpty(ComboBox field) { + return field.getValue() != null ? field.getValue().trim() : ""; + } + /** * Zeigt den Adressvalidierungsdialog an. Die Prüfung erfolgt im Hintergrund und * 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 -> { dialog.close(); // Im Adress-Tab bleiben + validationDialogOpen = false; + log.debug("Dialog geschlossen (Zurück), validationDialogOpen=false"); }); cancelButton.addThemeVariants(ButtonVariant.LUMO_TERTIARY); @@ -2848,8 +2870,10 @@ public class AddJobView extends Main { dialog.close(); // Zum Ziel-Tab wechseln tabSheet.setSelectedTab(targetTab); - // Gespeicherte Adressen aktualisieren - saveCurrentAddresses(); + // Adressen als validiert markieren + markAddressesAsValidated(); + validationDialogOpen = false; + log.debug("Dialog geschlossen (Weiter), validationDialogOpen=false"); }); 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() { - lastPickupStreet = getValueOrEmpty(pickupStreet); - lastPickupHouseNumber = getValueOrEmpty(pickupHouseNumber); - lastPickupZip = getValueOrEmpty(pickupZip); - lastPickupCity = getValueOrEmpty(pickupCity); - - lastDeliveryStreet = getValueOrEmpty(deliveryStreet); - lastDeliveryHouseNumber = getValueOrEmpty(deliveryHouseNumber); - lastDeliveryZip = getValueOrEmpty(deliveryZip); - lastDeliveryCity = getValueOrEmpty(deliveryCity); + private void markAddressesAsValidated() { + addressesDirty = false; + log.debug("Adressen als validiert markiert"); } /** @@ -3106,4 +3123,86 @@ public class AddJobView extends Main { : 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"); + } + }