diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java index f5ddc8faeea..69a185202d7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataForm.java @@ -37,7 +37,9 @@ import java.util.Arrays; import java.util.Collections; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import org.apache.commons.collections4.CollectionUtils; @@ -962,12 +964,17 @@ protected void addFields() { + I18nProperties.getDescription(Descriptions.descGdpr)); CssStyles.style(additionalDetails, CssStyles.CAPTION_HIDDEN); - addField(CaseDataDto.PREGNANT, NullableOptionGroup.class); + NullableOptionGroup pregnantField = addField(CaseDataDto.PREGNANT, NullableOptionGroup.class); - addField(CaseDataDto.POSTPARTUM, NullableOptionGroup.class); + NullableOptionGroup postpartumField = addField(CaseDataDto.POSTPARTUM, NullableOptionGroup.class); addField(CaseDataDto.TRIMESTER, NullableOptionGroup.class); FieldHelper.setVisibleWhen(getFieldGroup(), CaseDataDto.TRIMESTER, CaseDataDto.PREGNANT, Arrays.asList(YesNoUnknown.YES), true); + // Mutual exclusivity: Pregnancy and Postpartum + if (pregnantField != null && postpartumField != null) { + setupMutuallyExclusiveFields(pregnantField, postpartumField); + } + addField(CaseDataDto.VACCINATION_STATUS, TextField.class); // getContent().addComponent(new Label("Debug vaccination"), CaseDataDto.VACCINATION_STATUS); addFields(CaseDataDto.SMALLPOX_VACCINATION_SCAR, CaseDataDto.SMALLPOX_VACCINATION_RECEIVED); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/HealthConditionsForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/HealthConditionsForm.java index 0aeb8435243..1c88999644e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/HealthConditionsForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/clinicalcourse/HealthConditionsForm.java @@ -148,6 +148,31 @@ protected void addFields() { FieldHelper.setVisibleWhen(getFieldGroup(), HIV_ART, HIV, Arrays.asList(YesNoUnknown.YES), true); + // Mutual exclusivity: Current smoker and Former smoker + NullableOptionGroup currentSmokerField = (NullableOptionGroup) getFieldGroup().getField(CURRENT_SMOKER); + NullableOptionGroup formerSmokerField = (NullableOptionGroup) getFieldGroup().getField(FORMER_SMOKER); + if (currentSmokerField != null && formerSmokerField != null) { + setupMutuallyExclusiveFields(currentSmokerField, formerSmokerField); + } + + // Auto-check immunodeficiency when Asplenia is selected + NullableOptionGroup aspleniaField = (NullableOptionGroup) getFieldGroup().getField(ASPLENIA); + NullableOptionGroup immunodeficiencyField = (NullableOptionGroup) getFieldGroup().getField(IMMUNODEFICIENCY_OTHER_THAN_HIV); + if (aspleniaField != null) { + aspleniaField.addValueChangeListener(e -> { + Object rawValue = e.getProperty().getValue(); + if (rawValue instanceof Set) { + @SuppressWarnings("unchecked") + Set aspleniaValue = (Set) rawValue; + if (aspleniaValue.contains(YesNoUnknown.YES)) { + if (immunodeficiencyField != null && immunodeficiencyField.isVisible()) { + immunodeficiencyField.setValue(new HashSet<>(Arrays.asList(YesNoUnknown.YES))); + } + } + } + }); + } + //Below requirement (showing the treatment year and its compliances only applicable for LUX) if (isConfiguredServer(CountryHelper.COUNTRY_CODE_LUXEMBOURG)) { if (Disease.TUBERCULOSIS.equals(disease)) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java index bfedbee36bd..b5bc57d0af2 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java @@ -18,10 +18,13 @@ import static com.vaadin.v7.data.fieldgroup.DefaultFieldGroupFieldFactory.CAPTION_PROPERTY_ID; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -209,7 +212,7 @@ protected ComboBox addDiseaseField(String fieldId, boolean showNonPrimaryDisease * that makes sure the value that is about to be selected is added to the list of allowed values. This is intended * to be used for Disease fields that might contain a disease that is no longer active in the system and thus will * not be returned by DiseaseHelper.isActivePrimaryDisease(disease). - * + * * @param showNonPrimaryDiseases * Whether or not diseases that have been configured as non-primary should be included * @param setServerDiseaseAsDefault @@ -621,7 +624,7 @@ public void setHeading(String heading) { /** * List of editable allowed fields, - * + * * @return */ public List> editableAllowedFields() { @@ -685,4 +688,29 @@ protected T safeSetFieldValue(String propertyId, T value) { } return safeSetFieldValue(field, value); } + + /** + * Sets up mutually exclusive behavior between two YesNoUnknown fields. + * When one field is set to YES, the other is automatically set to NO. + * + * @param field1 + * First field + * @param field2 + * Second field (mutually exclusive with field1) + */ + @SuppressWarnings("unchecked") + protected void setupMutuallyExclusiveFields(NullableOptionGroup field1, NullableOptionGroup field2) { + field1.addValueChangeListener(e -> { + Set value = (Set) e.getProperty().getValue(); + if (value != null && value.contains(de.symeda.sormas.api.utils.YesNoUnknown.YES)) { + field2.setValue(new HashSet<>(Arrays.asList(de.symeda.sormas.api.utils.YesNoUnknown.NO))); + } + }); + field2.addValueChangeListener(e -> { + Set value = (Set) e.getProperty().getValue(); + if (value != null && value.contains(de.symeda.sormas.api.utils.YesNoUnknown.YES)) { + field1.setValue(new HashSet<>(Arrays.asList(de.symeda.sormas.api.utils.YesNoUnknown.NO))); + } + }); + } }