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
private final Map<String, AddressValidationResult> 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<Customer> 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<String> 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");
}
}