From d0a132691a2ed04b3ba902b6b13adbf4ad0c04bd Mon Sep 17 00:00:00 2001 From: Raul Bob Date: Tue, 7 Jul 2026 10:41:06 +0200 Subject: [PATCH] #14143 - Added region/district inputs for quick immunization --- .../form/QuickImmunizationCreationForm.java | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) 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;