From 1c38c573b4581484ea51adef00598556a086922d Mon Sep 17 00:00:00 2001 From: Obinna Henry <55580796+obinna-h-n@users.noreply.github.com> Date: Mon, 18 May 2026 19:04:43 +0100 Subject: [PATCH] add general information layout to exposure form and re-introduce exposure type field --- .../sormas/api/exposure/ExposureDto.java | 2 + .../sormas/api/exposure/ExposureType.java | 73 ++++++++++++---- .../de/symeda/sormas/api/i18n/Captions.java | 1 + .../src/main/resources/captions.properties | 1 + .../sormas/backend/exposure/Exposure.java | 1 + .../src/main/resources/sql/sormas_schema.sql | 13 ++- .../sormas/ui/exposure/ExposureForm.java | 85 +++++++++++++++---- .../sormas/ui/exposure/ExposuresField.java | 64 ++++---------- 8 files changed, 156 insertions(+), 84 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureDto.java index 59c0c1ce0a7..b4751a64a72 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureDto.java @@ -20,6 +20,7 @@ import java.util.Set; import javax.validation.Valid; +import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import de.symeda.sormas.api.CountryHelper; @@ -153,6 +154,7 @@ public class ExposureDto extends PseudonymizableDto { @SensitiveData @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong) private String description; + @NotNull(message = Validations.requiredField) private ExposureType exposureType; @SensitiveData @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureType.java b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureType.java index 887100dd48a..6645082bf92 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureType.java @@ -15,6 +15,14 @@ package de.symeda.sormas.api.exposure; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.utils.Diseases; @@ -24,63 +32,94 @@ public enum ExposureType { @Diseases(value = { Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS }, hide = true) - WORK, + WORK(true), @Diseases({ Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS }) - TRAVEL, + TRAVEL(true), @Diseases(value = { Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS }, hide = true) - SPORT, + SPORT(false), @Diseases(value = { Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS }, hide = true) - VISIT, + VISIT(false), @Diseases(value = { Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS }, hide = true) - GATHERING, + GATHERING(true), @Diseases(value = { Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS }, hide = true) - HABITATION, + HABITATION(false), @Diseases(value = { Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS }, hide = true) - PERSONAL_SERVICES, + PERSONAL_SERVICES(false), @Diseases(value = { Disease.RESPIRATORY_SYNCYTIAL_VIRUS }) - CHILDCARE_FACILITY, + CHILDCARE_FACILITY(false), @Diseases(value = { Disease.CORONAVIRUS, Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS }, hide = true) - BURIAL, + BURIAL(false), @Diseases(value = { Disease.CORONAVIRUS }, hide = true) - ANIMAL_CONTACT, + ANIMAL_CONTACT(false), @Diseases({ Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS }) - RECREATIONAL_WATER, + RECREATIONAL_WATER(false, ExposureCategory.WATER_BORNE), @Diseases({ Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS }) - FOOD, + FOOD(false, ExposureCategory.FOOD_BORNE), @Diseases({ Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS }) - SEXUAL_CONTACT, + SEXUAL_CONTACT(false, ExposureCategory.DIRECT_CONTACT), @Diseases({ Disease.CRYPTOSPORIDIOSIS }) - SYMPTOMATIC_CONTACT, + SYMPTOMATIC_CONTACT(false, ExposureCategory.DIRECT_CONTACT), @Diseases({ Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS }) - FLOOD_EXPOSURE, - OTHER, - UNKNOWN; + FLOOD_EXPOSURE(false, ExposureCategory.WATER_BORNE), + OTHER(true), + UNKNOWN(true); + + private final boolean defaultType; + private final Set categories; + + ExposureType(boolean defaultType, ExposureCategory... categories) { + this.defaultType = defaultType; + this.categories = categories.length == 0 ? Collections.emptySet() : Collections.unmodifiableSet(EnumSet.copyOf(Arrays.asList(categories))); + } + + public boolean isDefaultType() { + return defaultType; + } + + public Set getCategories() { + return categories; + } + + public static List getValues(Collection diseaseCategories) { + boolean hasConfig = diseaseCategories != null && !diseaseCategories.isEmpty(); + Set configured = hasConfig ? EnumSet.copyOf(diseaseCategories) : EnumSet.noneOf(ExposureCategory.class); + + return Arrays.stream(values()).filter(type -> { + if (type.isDefaultType()) { + return true; + } + if (!hasConfig) { + return false; + } + return type.getCategories().stream().anyMatch(configured::contains); + }).collect(Collectors.toList()); + } @Override public String toString() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java index 46a9f65a9e9..75bb37fc32c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java @@ -3381,6 +3381,7 @@ public interface Captions { String titleDiseaseConfigurationGeneral = "titleDiseaseConfigurationGeneral"; String titleExposureActivitySection = "titleExposureActivitySection"; String titleExposureLocationSection = "titleExposureLocationSection"; + String titleExposuresGeneralSection = "titleExposuresGeneralSection"; String titleExposuresSection = "titleExposuresSection"; String titleNoComplications = "titleNoComplications"; String to = "to"; diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index a60f6487576..32ba6995be1 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -1622,6 +1622,7 @@ Exposure.travelPurposeDetails=Reason for travel details Exposure.eatingOutVenues=Eating out venues Exposure.eatingOutVenueOther=Other venue (please specify) Exposure.shoppingForFoodDetails=Shopping for food (location/details) +titleExposuresGeneralSection=General information titleExposuresSection=Exposure details titleExposureActivitySection=Activity details titleExposureLocationSection=Location of exposure diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/exposure/Exposure.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/exposure/Exposure.java index 3a71e41f40e..016499e9039 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/exposure/Exposure.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/exposure/Exposure.java @@ -262,6 +262,7 @@ public void setDescription(String description) { } @Enumerated(EnumType.STRING) + @Column(nullable = false) public ExposureType getExposureType() { return exposureType; } diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index a01412d5235..159e5e5293a 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -15996,7 +15996,16 @@ ALTER TABLE symptoms_history ADD COLUMN IF NOT EXISTS flatulence text; ALTER TABLE symptoms_history ADD COLUMN IF NOT EXISTS lossofappetite text; ALTER TABLE symptoms_history ADD COLUMN IF NOT EXISTS smellyburps text; -INSERT INTO schema_version (version_number, comment) -VALUES (629, '#13832 - External Survey integration'); +INSERT INTO schema_version (version_number, comment) VALUES (629, '#13832 - External Survey integration'); + +UPDATE featureconfiguration +SET properties = json_build_object( + 'FETCH_MODE', false, + 'FORCE_AUTOMATIC_PROCESSING', true, + 'SURVEY_FETCH_ENABLED', true +) +WHERE featuretype = 'EXTERNAL_MESSAGES'; + +INSERT INTO schema_version (version_number, comment) VALUES (630, 'Fix corrupt JSON in featureconfiguration.properties for EXTERNAL_MESSAGES from 629'); -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java index 3901c73bccb..981f67f1f6e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposureForm.java @@ -28,6 +28,7 @@ import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -66,6 +67,7 @@ import de.symeda.sormas.api.exposure.ExposureProtectiveMeasure; import de.symeda.sormas.api.exposure.ExposureSetting; import de.symeda.sormas.api.exposure.ExposureSubSetting; +import de.symeda.sormas.api.exposure.ExposureType; import de.symeda.sormas.api.exposure.FomiteTransmissionLocation; import de.symeda.sormas.api.exposure.ProphylaxisAdherence; import de.symeda.sormas.api.exposure.TravelPurpose; @@ -103,9 +105,13 @@ public class ExposureForm extends AbstractEditForm { private static final String UUID_REPORTING_USER = fluidRowLocs(ExposureDto.UUID, ExposureDto.REPORTING_USER); //@formatter:off - private static final String EXPOSURE_DETAILS_LAYOUT = + private static final String GENERAL_DETAILS_LAYOUT = fluidRowLocs(ExposureDto.START_DATE, ExposureDto.END_DATE) + - loc(LOC_CUSTOMIZABLE_FIELDS_EXPOSURE_DETAILS) + + fluidRowLocs(ExposureDto.EXPOSURE_TYPE, ExposureDto.EXPOSURE_TYPE_DETAILS) + + loc(ExposureDto.DESCRIPTION); + + private static final String EXPOSURE_DETAILS_LAYOUT = + loc(LOC_CUSTOMIZABLE_FIELDS_EXPOSURE_DETAILS) + loc(LOC_EXPOSURES_HEADING) + fluidRowLocs(ExposureDto.EXPOSURE_CATEGORY, ExposureDto.EXPOSURE_SETTING, ExposureDto.EXPOSURE_SETTING_DETAILS) + fluidRow( @@ -142,8 +148,7 @@ public class ExposureForm extends AbstractEditForm { ExposureDto.PROTECTIVE_MEASURE_DETAILS )) ) + - loc(LOC_CUSTOMIZABLE_FIELDS_EXPOSURES_GENERAL) + - loc(ExposureDto.DESCRIPTION); + loc(LOC_CUSTOMIZABLE_FIELDS_EXPOSURES_GENERAL); private static final String LOCATION_DETAILS_LAYOUT = loc(LOC_LOCATION_HEADING) + @@ -164,6 +169,7 @@ public class ExposureForm extends AbstractEditForm { private final Class epiDataParentClass; private final List sourceContacts; + private CustomLayout generalDetailsLayout; private CustomLayout exposureDetailsLayout; private CustomLayout locationDetailsLayout; @@ -174,6 +180,8 @@ public class ExposureForm extends AbstractEditForm { private LocationEditForm locationForm; private Disease disease; + private ComboBox exposureTypeField; + private ComboBox categoryField; private ComboBox settingField; private TextField settingDetailsField; @@ -230,6 +238,9 @@ protected void addFields() { FormSectionAccordion accordion = new FormSectionAccordion(); + generalDetailsLayout = new CustomLayout(); + generalDetailsLayout.setTemplateContents(GENERAL_DETAILS_LAYOUT); + exposureDetailsLayout = new CustomLayout(); exposureDetailsLayout.setTemplateContents(EXPOSURE_DETAILS_LAYOUT); @@ -254,8 +265,6 @@ protected void addFields() { exposuresGeneralPanel.updateFieldsDisplay(); exposureDetailsLayout.addComponent(exposuresGeneralPanel, LOC_CUSTOMIZABLE_FIELDS_EXPOSURES_GENERAL); - addField(exposureDetailsLayout, ExposureDto.DESCRIPTION, TextArea.class).setRows(5); - locationForm = addField(locationDetailsLayout, ExposureDto.LOCATION, LocationEditForm.class); locationForm.setCaption(null); addField(locationDetailsLayout, ExposureDto.CONNECTION_NUMBER, TextField.class); @@ -275,7 +284,8 @@ protected void addFields() { } }); - accordion.addFormSectionPanel(Captions.titleExposuresSection, true, exposureDetailsLayout); + accordion.addFormSectionPanel(Captions.titleExposuresGeneralSection, true, generalDetailsLayout); + accordion.addFormSectionPanel(Captions.titleExposuresSection, false, exposureDetailsLayout); accordion.addFormSectionPanel(Captions.titleExposureLocationSection, false, locationDetailsLayout); getContent().addComponent(accordion, MAIN_ACCORDION_LOC); @@ -285,6 +295,8 @@ protected void addFields() { initializeVisibilitiesAndAllowedVisibilities(); initializeAccessAndAllowedAccesses(); + setUpRequirements(); + setReadOnly(true, ExposureDto.UUID, ExposureDto.REPORTING_USER); } @@ -303,14 +315,19 @@ private void addHeadingsAndInfoTexts() { private void addBasicFields() { addFields(ExposureDto.UUID, ExposureDto.REPORTING_USER, ExposureDto.PROBABLE_INFECTION_ENVIRONMENT); - DateTimeField startDate = addField(exposureDetailsLayout, ExposureDto.START_DATE, DateTimeField.class); - DateTimeField endDate = addField(exposureDetailsLayout, ExposureDto.END_DATE, DateTimeField.class); + DateTimeField startDate = addField(generalDetailsLayout, ExposureDto.START_DATE, DateTimeField.class); + DateTimeField endDate = addField(generalDetailsLayout, ExposureDto.END_DATE, DateTimeField.class); DateComparisonValidator.addStartEndValidators(startDate, endDate, false); + exposureTypeField = addField(generalDetailsLayout, ExposureDto.EXPOSURE_TYPE, ComboBox.class); + exposureTypeField.setItemCaptionMode(ItemCaptionMode.ID_TOSTRING); + + addField(generalDetailsLayout, ExposureDto.EXPOSURE_TYPE_DETAILS, TextField.class); + addField(generalDetailsLayout, ExposureDto.DESCRIPTION, TextArea.class).setRows(5); + categoryField = addField(exposureDetailsLayout, ExposureDto.EXPOSURE_CATEGORY, ComboBox.class); categoryField.setItemCaptionMode(ItemCaptionMode.ID_TOSTRING); - categoryField.setRequired(true); settingField = addField(exposureDetailsLayout, ExposureDto.EXPOSURE_SETTING, ComboBox.class); settingField.setItemCaptionMode(ItemCaptionMode.ID_TOSTRING); @@ -500,6 +517,7 @@ private void addBasicFields() { } private void setUpVisibilityDependencies() { + FieldHelper.setVisibleWhen(getFieldGroup(), ExposureDto.EXPOSURE_TYPE_DETAILS, ExposureDto.EXPOSURE_TYPE, ExposureType.OTHER, true); FieldHelper.setVisibleWhen(getFieldGroup(), ExposureDto.TYPE_OF_PLACE_DETAILS, ExposureDto.TYPE_OF_PLACE, TypeOfPlace.OTHER, true); FieldHelper.setVisibleWhen( getFieldGroup(), @@ -536,6 +554,15 @@ private void setUpVisibilityDependencies() { locationForm.setContinentFieldsVisibility(); } + private void setUpRequirements() { + setRequired(true, ExposureDto.EXPOSURE_TYPE); + FieldHelper.setRequiredWhen( + getFieldGroup(), + ExposureDto.EXPOSURE_TYPE, + Collections.singletonList(ExposureDto.EXPOSURE_TYPE_DETAILS), + Collections.singletonList(ExposureType.OTHER)); + } + private void updateSettingFieldItems(ExposureCategory category) { List settings = ExposureSetting.getValues(category); FieldHelper.updateItems(settingField, settings); @@ -550,14 +577,12 @@ private void updateSettingFieldItems(ExposureCategory category) { settingDetailsField.setValue(null); settingDetailsField.setVisible(false); - if (category != null) { - if (category.hasNoSetting()) { - settingField.setVisible(false); - settingField.setRequired(false); - } else { - settingField.setVisible(true); - settingField.setRequired(true); - } + if (category == null || category.hasNoSetting()) { + settingField.setVisible(false); + settingField.setRequired(false); + } else { + settingField.setVisible(true); + settingField.setRequired(true); } } @@ -647,6 +672,7 @@ private void updateFomiteTransmissionField(ExposureCategory category) { public void setValue(ExposureDto newFieldValue) throws ReadOnlyException, Converter.ConversionException { super.setValue(newFieldValue); + populateExposureTypes(newFieldValue); populateExposureCategories(newFieldValue); if (newFieldValue != null) { @@ -783,6 +809,29 @@ public void setValue(ExposureDto newFieldValue) throws ReadOnlyException, Conver locationForm.discard(); } + private void populateExposureTypes(ExposureDto exposure) { + // Get disease configuration + DiseaseConfigurationDto diseaseConfig = null; + if (disease != null) { + diseaseConfig = FacadeProvider.getDiseaseConfigurationFacade().getDiseaseConfiguration(disease); + } + + Set diseaseCategories = diseaseConfig != null && diseaseConfig.getExposureCategories() != null + ? new HashSet<>(diseaseConfig.getExposureCategories()) + : Collections.emptySet(); + + // defaults (+ types matching the disease's configured categories, if any) + List filteredTypes = ExposureType.getValues(diseaseCategories); + + // Preserve existing record's value even if it is no longer in the filtered set (legacy data) + Set finalTypes = new LinkedHashSet<>(filteredTypes); + if (exposure != null && exposure.getExposureType() != null) { + finalTypes.add(exposure.getExposureType()); + } + + FieldHelper.updateItems(exposureTypeField, new ArrayList<>(finalTypes)); + } + private void populateExposureCategories(ExposureDto exposure) { Set categories; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java index 36258700f7a..371285af854 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/exposure/ExposuresField.java @@ -21,7 +21,6 @@ import java.util.Map; import java.util.function.Consumer; import java.util.function.Supplier; -import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; @@ -42,16 +41,15 @@ import de.symeda.sormas.api.customizablefield.CustomizableFieldContext; import de.symeda.sormas.api.customizablefield.CustomizableFieldMetadataDto; import de.symeda.sormas.api.customizablefield.CustomizableFieldValueDto; -import de.symeda.sormas.api.exposure.ExposureCategory; import de.symeda.sormas.api.exposure.ExposureDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.i18n.Validations; +import de.symeda.sormas.api.location.LocationDto; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DataHelper; -import de.symeda.sormas.api.utils.LocationHelper; import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers; import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers; import de.symeda.sormas.ui.UiUtil; @@ -69,10 +67,10 @@ }) public class ExposuresField extends AbstractTableField { + private static final String COLUMN_EXPOSURE_TYPE = ExposureDto.EXPOSURE_TYPE; private static final String COLUMN_EXPOSURE_CATEGORY = ExposureDto.EXPOSURE_CATEGORY; - private static final String COLUMN_EXPOSURE_SETTING = ExposureDto.EXPOSURE_SETTING; + private static final String COLUMN_LOCATION_COUNTRY = "locationCountry"; private static final String COLUMN_DATE = Captions.date; - private static final String COLUMN_ADDRESS = Captions.address; private static final String COLUMN_DESCRIPTION = ExposureDto.DESCRIPTION; private static final String COLUMN_PROPHYLAXIS_ADHERENCE = ExposureDto.PROPHYLAXIS_ADHERENCE; @@ -105,19 +103,19 @@ protected void updateColumns() { if (epiDataParentClass == CaseDataDto.class) { table.setVisibleColumns( ACTION_COLUMN_ID, - COLUMN_EXPOSURE_CATEGORY, - COLUMN_EXPOSURE_SETTING, - COLUMN_PROPHYLAXIS_ADHERENCE, + COLUMN_EXPOSURE_TYPE, + COLUMN_LOCATION_COUNTRY, COLUMN_DATE, - COLUMN_ADDRESS, - COLUMN_DESCRIPTION); + COLUMN_EXPOSURE_CATEGORY, + COLUMN_DESCRIPTION, + COLUMN_PROPHYLAXIS_ADHERENCE); } else { table.setVisibleColumns( ACTION_COLUMN_ID, - COLUMN_EXPOSURE_CATEGORY, - COLUMN_EXPOSURE_SETTING, + COLUMN_EXPOSURE_TYPE, + COLUMN_LOCATION_COUNTRY, COLUMN_DATE, - COLUMN_ADDRESS, + COLUMN_EXPOSURE_CATEGORY, COLUMN_DESCRIPTION); } table.setCellStyleGenerator( @@ -128,6 +126,8 @@ protected void updateColumns() { for (Object columnId : table.getVisibleColumns()) { if (columnId.equals(ACTION_COLUMN_ID)) { table.setColumnHeader(columnId, " "); + } else if (COLUMN_LOCATION_COUNTRY.equals(columnId)) { + table.setColumnHeader(columnId, I18nProperties.getPrefixCaption(LocationDto.I18N_PREFIX, LocationDto.COUNTRY)); } else { table.setColumnHeader(columnId, I18nProperties.getPrefixCaption(ExposureDto.I18N_PREFIX, (String) columnId)); } @@ -138,39 +138,13 @@ protected void updateColumns() { private void addGeneratedColumns(Table table) { - table.addGeneratedColumn(COLUMN_EXPOSURE_SETTING, (Table.ColumnGenerator) (source, itemId, columnId) -> { + table.addGeneratedColumn(COLUMN_LOCATION_COUNTRY, (Table.ColumnGenerator) (source, itemId, columnId) -> { ExposureDto exposure = (ExposureDto) itemId; - ExposureCategory category = exposure.getExposureCategory(); - - if (category == null) { + LocationDto location = exposure.getLocation(); + if (location == null || location.getCountry() == null) { return ""; } - - switch (category) { - case ANIMAL_CONTACT: - StringBuilder animalDetails = new StringBuilder(); - if (exposure.getConditionOfAnimal() != null) { - animalDetails.append(exposure.getConditionOfAnimal().toString()); - } - if (exposure.getAnimalCategory() != null) { - if (animalDetails.length() > 0) { - animalDetails.append(", "); - } - animalDetails.append(exposure.getAnimalCategory().toString()); - } - return animalDetails.toString(); - - case FOMITE_TRANSMISSION: - return exposure.getFomiteTransmissionLocation() != null ? exposure.getFomiteTransmissionLocation().toString() : ""; - - case FOOD_BORNE: - if (exposure.getSubSettings() != null && !exposure.getSubSettings().isEmpty()) { - return exposure.getSubSettings().stream().map(Object::toString).collect(Collectors.joining(", ")); - } - - default: - return exposure.getExposureSetting() != null ? exposure.getExposureSetting().toString() : ""; - } + return location.getCountry().getCaption(); }); table.addGeneratedColumn(COLUMN_DATE, (Table.ColumnGenerator) (source, itemId, columnId) -> { @@ -178,10 +152,6 @@ private void addGeneratedColumns(Table table) { return DateFormatHelper.buildPeriodDateTimeString(exposure.getStartDate(), exposure.getEndDate()); }); - table.addGeneratedColumn( - COLUMN_ADDRESS, - (Table.ColumnGenerator) (source, itemId, columnId) -> LocationHelper.buildLocationString(((ExposureDto) itemId).getLocation())); - table.addGeneratedColumn(COLUMN_DESCRIPTION, (Table.ColumnGenerator) (source, itemId, columnId) -> { ExposureDto exposure = (ExposureDto) itemId;