diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/QuickImmunizationCreationForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/QuickImmunizationCreationForm.java
index c886f5433b3..03feff6fafe 100644
--- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/QuickImmunizationCreationForm.java
+++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/QuickImmunizationCreationForm.java
@@ -31,6 +31,7 @@
import com.vaadin.data.converter.StringToIntegerConverter;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.DateField;
+import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.v7.data.fieldgroup.FieldGroup.CommitEvent;
@@ -43,6 +44,8 @@
import de.symeda.sormas.api.i18n.Captions;
import de.symeda.sormas.api.i18n.I18nProperties;
import de.symeda.sormas.api.i18n.Validations;
+import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto;
+import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto;
import de.symeda.sormas.api.immunization.ImmunizationDto;
import de.symeda.sormas.api.immunization.MeansOfImmunization;
import de.symeda.sormas.api.utils.Diseases;
@@ -51,12 +54,14 @@
import de.symeda.sormas.ui.utils.AbstractEditForm;
import de.symeda.sormas.ui.utils.CssStyles;
import de.symeda.sormas.ui.utils.DateFormatHelper;
+import de.symeda.sormas.ui.utils.FieldHelper;
import de.symeda.sormas.ui.utils.FormComponent;
/**
* Simplified "Quick Immunization Entry" form showing only the 7 core fields (BR0070).
- * Jurisdiction fields (responsibleRegion, responsibleDistrict) are not shown; they must be
- * pre-set on the DTO before calling {@link #setValue(ImmunizationDto)}.
+ * Jurisdiction fields (responsibleRegion, responsibleDistrict) stay hidden when they are already
+ * pre-set on the DTO before calling {@link #setValue(ImmunizationDto)}. If either value is missing,
+ * Vaadin 8 jurisdiction inputs are shown so the immunization can still be created.
*
* Extends {@link AbstractEditForm} for compatibility with
* {@link de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent}.
@@ -131,6 +136,9 @@ private static final class FieldsComponent extends FormComponent meansOfImmunization;
+ private ComboBox responsibleRegion;
+ private ComboBox responsibleDistrict;
+ private HorizontalLayout jurisdictionRow;
private TextField numberOfDoses;
private DateField dateOfMostRecentDose;
private ComboBox vaccinationInfoSource;
@@ -150,8 +158,12 @@ private static final class FieldsComponent extends FormComponent item != null ? item.buildCaption() : "");
+ responsibleRegion.setItems(FacadeProvider.getRegionFacade().getAllActiveByServerCountry());
+
+ responsibleDistrict = createComboBox(ImmunizationDto.RESPONSIBLE_DISTRICT, ImmunizationDto.I18N_PREFIX);
+ responsibleDistrict.setItemCaptionGenerator(item -> item != null ? item.buildCaption() : "");
+ jurisdictionRow = addRow(responsibleRegion, responsibleDistrict);
+
numberOfDoses = createTextField(ImmunizationDto.NUMBER_OF_DOSES, ImmunizationDto.I18N_PREFIX);
addRow(numberOfDoses, null);
@@ -213,6 +233,14 @@ private void bindFields() {
.asRequired(I18nProperties.getValidationError(Validations.required, meansOfImmunization.getCaption()))
.bind(ImmunizationDto::getMeansOfImmunization, ImmunizationDto::setMeansOfImmunization);
+ binder.forField(responsibleRegion)
+ .asRequired(I18nProperties.getValidationError(Validations.required, responsibleRegion.getCaption()))
+ .bind(ImmunizationDto.RESPONSIBLE_REGION);
+
+ binder.forField(responsibleDistrict)
+ .asRequired(I18nProperties.getValidationError(Validations.required, responsibleDistrict.getCaption()))
+ .bind(ImmunizationDto.RESPONSIBLE_DISTRICT);
+
binder.forField(numberOfDoses)
.withNullRepresentation("")
.withConverter(new StringToIntegerConverter(I18nProperties.getValidationError(Validations.vaccineDosesFormat)))
@@ -243,6 +271,7 @@ private void bindFields() {
}
private void wireEvents() {
+ track(responsibleRegion.addValueChangeListener(e -> refreshDistrictOptions(e.getValue())));
track(meansOfImmunization.addValueChangeListener(e -> {
updateVaccinationFieldsVisibility(e.getValue());
if (e.getValue() != MeansOfImmunization.MATERNAL_VACCINATION) {
@@ -266,6 +295,19 @@ private void refreshMeansOfImmunizationOptions(Disease disease) {
}
}
+ private void refreshDistrictOptions(RegionReferenceDto region) {
+ FieldHelper.updateItems(
+ responsibleDistrict,
+ region != null ? FacadeProvider.getDistrictFacade().getAllActiveByRegion(region.getUuid()) : null);
+ }
+
+ private void updateJurisdictionFieldsVisibility(ImmunizationDto dto) {
+ boolean showJurisdictionFields = dto == null || dto.getResponsibleRegion() == null || dto.getResponsibleDistrict() == null;
+ responsibleRegion.setVisible(showJurisdictionFields);
+ responsibleDistrict.setVisible(showJurisdictionFields);
+ jurisdictionRow.setVisible(showJurisdictionFields);
+ }
+
private void updateVaccinationFieldsVisibility(MeansOfImmunization meansOfImmunization) {
boolean isVaccination = MeansOfImmunization.isVaccination(meansOfImmunization);
boolean isMaternalVaccination = meansOfImmunization == MeansOfImmunization.MATERNAL_VACCINATION;