diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java index 1206b94c4f7..d5199b536ee 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java @@ -389,6 +389,7 @@ public class CaseDataDto extends SormasToSormasShareableDto implements IsCase { Disease.OTHER }) @Outbreaks private VaccinationStatus vaccinationStatus; + @Diseases(value = Disease.SALMONELLOSIS, hide = true) @Outbreaks @Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong) private String vaccinationStatusDetails; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/EatingOutVenue.java b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/EatingOutVenue.java deleted file mode 100644 index a517f57641a..00000000000 --- a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/EatingOutVenue.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2026 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - */ - -package de.symeda.sormas.api.exposure; - -import de.symeda.sormas.api.i18n.I18nProperties; - -public enum EatingOutVenue { - - CANTEENS, - FOOD_SERVED_ON_BOARD, - GAS_STATIONS, - STREET_VENDORS, - FOOD_COURTS, - CAFES_OR_TEA_ROOMS, - SANDWICH_SHOPS_BAKERIES_DELICATESSENS, - CAFETERIAS_OR_BARS, - KEBAB_FALAFEL_SNACK_SHOPS, - BURGER_RESTAURANTS, - FAST_FOOD_SNACK_BARS, - PIZZERIAS, - ASIAN_RESTAURANTS, - HOTELS, - TAKEAWAY_FOOD, - BUFFET_STYLE_RESTAURANTS, - FOOD_AT_EVENTS, - OTHER; - - @Override - public String toString() { - return I18nProperties.getEnumCaption(this); - } -} 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 b4751a64a72..95fee8269b4 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 @@ -141,8 +141,6 @@ public class ExposureDto extends PseudonymizableDto { public static final String PROPHYLAXIS_ADHERENCE_DETAILS = "prophylaxisAdherenceDetails"; public static final String TRAVEL_PURPOSE = "travelPurpose"; public static final String TRAVEL_PURPOSE_DETAILS = "travelPurposeDetails"; - public static final String EATING_OUT_VENUES = "eatingOutVenues"; - public static final String EATING_OUT_VENUE_OTHER = "eatingOutVenueOther"; public static final String SHOPPING_FOR_FOOD_DETAILS = "shoppingForFoodDetails"; @SensitiveData @@ -461,17 +459,6 @@ public class ExposureDto extends PseudonymizableDto { @Size(max = FieldConstraints.CHARACTER_LIMIT_TEXT, message = Validations.textTooLong) private String travelPurposeDetails; - @Diseases({ - Disease.SALMONELLOSIS }) - @HideForCountriesExcept(countries = { - CountryHelper.COUNTRY_CODE_LUXEMBOURG }) - private Set eatingOutVenues; - @Diseases({ - Disease.SALMONELLOSIS }) - @HideForCountriesExcept(countries = { - CountryHelper.COUNTRY_CODE_LUXEMBOURG }) - @Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong) - private String eatingOutVenueOther; @Diseases({ Disease.SALMONELLOSIS }) @HideForCountriesExcept(countries = { @@ -490,7 +477,6 @@ public static ExposureDto build(ExposureType exposureType) { exposure.setSubSettings(new HashSet<>()); exposure.setContactFactors(new HashSet<>()); exposure.setProtectiveMeasures(new HashSet<>()); - exposure.setEatingOutVenues(new HashSet<>()); return exposure; } @@ -1175,22 +1161,6 @@ public void setProphylaxisAdherenceDetails(String prophylaxisAdherenceDetails) { this.prophylaxisAdherenceDetails = prophylaxisAdherenceDetails; } - public Set getEatingOutVenues() { - return eatingOutVenues; - } - - public void setEatingOutVenues(Set eatingOutVenues) { - this.eatingOutVenues = eatingOutVenues; - } - - public String getEatingOutVenueOther() { - return eatingOutVenueOther; - } - - public void setEatingOutVenueOther(String eatingOutVenueOther) { - this.eatingOutVenueOther = eatingOutVenueOther; - } - public String getShoppingForFoodDetails() { return shoppingForFoodDetails; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSubSetting.java b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSubSetting.java index 6c565eb70e8..3b5f9773e96 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSubSetting.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/exposure/ExposureSubSetting.java @@ -20,7 +20,9 @@ import java.util.List; 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; public enum ExposureSubSetting { @@ -49,6 +51,8 @@ public enum ExposureSubSetting { EATING_AT_HOME(ExposureCategory.FOOD_BORNE, null), EATING_OUTSIDE(ExposureCategory.FOOD_BORNE, null), + @Diseases({ + Disease.SALMONELLOSIS }) SHOPPING_FOR_FOOD(ExposureCategory.FOOD_BORNE, null), UNKNOWN(null, null), @@ -90,6 +94,15 @@ public static List getValues(ExposureCategory category, Expo .collect(Collectors.toList()); } + /** + * Disease-aware overload: filters the values returned by {@link #getValues(ExposureCategory, ExposureSetting)} + * to those whose {@code @Diseases} annotation matches the given disease (or values with no annotation, + * which apply to every disease). + */ + public static List getValues(ExposureCategory category, ExposureSetting setting, Disease disease) { + return getValues(category, setting).stream().filter(s -> isVisibleForDisease(s, disease)).collect(Collectors.toList()); + } + public static List getValuesForCategoryOnly(ExposureCategory category) { if (category == null) { return Collections.emptyList(); @@ -109,6 +122,19 @@ public static List getValuesForCategoryOnly(ExposureCategory return Arrays.stream(values()).filter(s -> (s.category == category && s.setting == null) || s.category == null).collect(Collectors.toList()); } + /** + * Disease-aware overload: filters the values returned by {@link #getValuesForCategoryOnly(ExposureCategory)} + * to those whose {@code @Diseases} annotation matches the given disease (or values with no annotation). + */ + public static List getValuesForCategoryOnly(ExposureCategory category, Disease disease) { + return getValuesForCategoryOnly(category).stream().filter(s -> isVisibleForDisease(s, disease)).collect(Collectors.toList()); + } + + private static boolean isVisibleForDisease(ExposureSubSetting subSetting, Disease disease) { + return Diseases.DiseasesConfiguration.isMissing(ExposureSubSetting.class, subSetting.name()) + || Diseases.DiseasesConfiguration.isDefined(ExposureSubSetting.class, subSetting.name(), disease); + } + @Override public String toString() { return I18nProperties.getEnumCaption(this); 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 75bb37fc32c..d6e61c57c0f 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 @@ -1902,8 +1902,6 @@ public interface Captions { String Exposure_deceasedPersonName = "Exposure.deceasedPersonName"; String Exposure_deceasedPersonRelation = "Exposure.deceasedPersonRelation"; String Exposure_domesticSwimming = "Exposure.domesticSwimming"; - String Exposure_eatingOutVenueOther = "Exposure.eatingOutVenueOther"; - String Exposure_eatingOutVenues = "Exposure.eatingOutVenues"; String Exposure_eatingRawAnimalProducts = "Exposure.eatingRawAnimalProducts"; String Exposure_endDate = "Exposure.endDate"; String Exposure_exposureCategory = "Exposure.exposureCategory"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestType.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestType.java index 554cf4a7066..5a70079b911 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestType.java @@ -30,7 +30,8 @@ public enum PathogenTestType { Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.DENGUE, - Disease.MALARIA }, hide = true) + Disease.MALARIA, + Disease.SALMONELLOSIS }, hide = true) ANTIBODY_DETECTION, ANTIGEN_DETECTION, @@ -55,7 +56,8 @@ public enum PathogenTestType { Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.DENGUE, - Disease.MALARIA }, hide = true) + Disease.MALARIA, + Disease.SALMONELLOSIS }, hide = true) HISTOPATHOLOGY, @Diseases(value = { @@ -91,7 +93,8 @@ public enum PathogenTestType { Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.DENGUE, - Disease.MALARIA }, hide = true) + Disease.MALARIA, + Disease.SALMONELLOSIS }, hide = true) IGA_SERUM_ANTIBODY, @Diseases(value = { @@ -103,7 +106,8 @@ public enum PathogenTestType { Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.DENGUE, - Disease.MALARIA }, hide = true) + Disease.MALARIA, + Disease.SALMONELLOSIS }, hide = true) INCUBATION_TIME, @Diseases(value = { @@ -128,7 +132,8 @@ public enum PathogenTestType { Disease.RESPIRATORY_SYNCYTIAL_VIRUS, Disease.MEASLES, Disease.DENGUE, - Disease.MALARIA }, hide = true) + Disease.MALARIA, + Disease.SALMONELLOSIS }, hide = true) MICROSCOPY, @Diseases(value = { @@ -137,7 +142,8 @@ public enum PathogenTestType { Disease.MEASLES, Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, - Disease.MALARIA }, hide = true) + Disease.MALARIA, + Disease.SALMONELLOSIS }, hide = true) NEUTRALIZING_ANTIBODIES, @Diseases(value = { @@ -145,6 +151,9 @@ public enum PathogenTestType { Disease.MALARIA }) ENZYME_LINKED_IMMUNOSORBENT_ASSAY, + @Diseases(value = { + Disease.SALMONELLOSIS }, hide = true) + @RevealsTestTypeText PCR_RT_PCR, @Diseases(value = { @@ -154,7 +163,8 @@ public enum PathogenTestType { Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.DENGUE, - Disease.MALARIA }, hide = true) + Disease.MALARIA, + Disease.SALMONELLOSIS }, hide = true) GRAM_STAIN, @Diseases(value = { @@ -166,7 +176,8 @@ public enum PathogenTestType { Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.DENGUE, - Disease.MALARIA }, hide = true) + Disease.MALARIA, + Disease.SALMONELLOSIS }, hide = true) LATEX_AGGLUTINATION, @Diseases(value = { @@ -177,7 +188,8 @@ public enum PathogenTestType { Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.DENGUE, - Disease.MALARIA }, hide = true) + Disease.MALARIA, + Disease.SALMONELLOSIS }, hide = true) CQ_VALUE_DETECTION, @Diseases(value = { @@ -195,7 +207,8 @@ public enum PathogenTestType { Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.DENGUE, - Disease.MALARIA }, hide = true) + Disease.MALARIA, + Disease.SALMONELLOSIS }, hide = true) DNA_MICROARRAY, @Diseases(value = { @@ -206,7 +219,8 @@ public enum PathogenTestType { Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.DENGUE, - Disease.MALARIA }, hide = true) + Disease.MALARIA, + Disease.SALMONELLOSIS }, hide = true) TMA, @Diseases(value = { @@ -243,9 +257,32 @@ public enum PathogenTestType { @Diseases(value = { Disease.INVASIVE_MENINGOCOCCAL_INFECTION, - Disease.INVASIVE_PNEUMOCOCCAL_INFECTION }) + Disease.INVASIVE_PNEUMOCOCCAL_INFECTION, + Disease.SALMONELLOSIS }) + @RevealsTestTypeText(diseases = Disease.SALMONELLOSIS) MULTILOCUS_SEQUENCE_TYPING, + @Diseases(value = { + Disease.INVASIVE_MENINGOCOCCAL_INFECTION, + Disease.INVASIVE_PNEUMOCOCCAL_INFECTION, + Disease.SALMONELLOSIS }) + @RevealsTestTypeText(diseases = Disease.SALMONELLOSIS) + CGMLST, + + @Diseases(value = { + Disease.INVASIVE_MENINGOCOCCAL_INFECTION, + Disease.INVASIVE_PNEUMOCOCCAL_INFECTION, + Disease.SALMONELLOSIS }) + @RevealsTestTypeText(diseases = Disease.SALMONELLOSIS) + SNP_TYPING, + + @Diseases(value = { + Disease.INVASIVE_MENINGOCOCCAL_INFECTION, + Disease.INVASIVE_PNEUMOCOCCAL_INFECTION, + Disease.SALMONELLOSIS }) + @RevealsTestTypeText(diseases = Disease.SALMONELLOSIS) + SEROTYPING, + @Diseases(value = { Disease.INVASIVE_MENINGOCOCCAL_INFECTION, Disease.INVASIVE_PNEUMOCOCCAL_INFECTION }) @@ -296,6 +333,7 @@ public enum PathogenTestType { @Diseases({ Disease.MALARIA }) OTHER_SEROLOGICAL_TEST, + @RevealsTestTypeText OTHER; @Override @@ -304,6 +342,10 @@ public String toString() { } public static String toString(PathogenTestType value, String details) { + return toString(value, details, null); + } + + public static String toString(PathogenTestType value, String details, Disease disease) { if (value == null) { return ""; } @@ -312,6 +354,40 @@ public static String toString(PathogenTestType value, String details) { return DataHelper.toStringNullable(details); } + if (revealsTestTypeText(value, disease) && !DataHelper.isNullOrEmpty(details)) { + return value + " (" + details + ")"; + } + return value.toString(); } + + /** + * @return true when picking {@code testType} should reveal the {@code PathogenTestDto.testTypeText} free-text + * companion field. The decision is data-driven via {@link RevealsTestTypeText} on the enum value; values + * with no annotation never reveal the field, values annotated without a disease list reveal it for every + * disease, and values with a disease list reveal it only when {@code disease} is one of those listed. + */ + public static boolean revealsTestTypeText(PathogenTestType testType, Disease disease) { + if (testType == null) { + return false; + } + try { + RevealsTestTypeText annotation = PathogenTestType.class.getField(testType.name()).getAnnotation(RevealsTestTypeText.class); + if (annotation == null) { + return false; + } + Disease[] diseases = annotation.diseases(); + if (diseases.length == 0) { + return true; + } + for (Disease d : diseases) { + if (d == disease) { + return true; + } + } + return false; + } catch (NoSuchFieldException e) { + return false; + } + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/RevealsTestTypeText.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/RevealsTestTypeText.java new file mode 100644 index 00000000000..85d0b9c4a16 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/RevealsTestTypeText.java @@ -0,0 +1,37 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2026 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +package de.symeda.sormas.api.sample; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import de.symeda.sormas.api.Disease; + +/** + * Marks a {@link PathogenTestType} value as one whose selection should reveal the + * pathogen-test "test type text" free-text companion field. + * + *

+ * Without any {@code diseases} listed, the value reveals the text field for every disease that + * sees it. When a non-empty {@code diseases} array is given, the value reveals the text field + * only for cases of one of those diseases — useful for disease-specific typing tests + * (e.g. {@code SEROTYPING} reveals text only for Salmonellosis). + * + *

+ * Read at runtime by {@link PathogenTestType#revealsTestTypeText(PathogenTestType, Disease)}. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface RevealsTestTypeText { + + Disease[] diseases() default {}; +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java index 8e122c2728b..513a1765c06 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleExportDto.java @@ -852,6 +852,12 @@ public void setSampleReportDate(Date sampleReportDate) { this.sampleReportDate = sampleReportDate; } + @Order(104) + public String getSampleMaterialSnomedCode() { + SampleMaterial material = sampleSampleExportMaterial != null ? sampleSampleExportMaterial.sampleMaterial : null; + return material != null ? material.getSnomedCode() : null; + } + public SampleExportPathogenTest getPathogenTest1() { return pathogenTest1; } @@ -998,6 +1004,7 @@ public static class SampleExportPathogenTest implements Serializable { @SensitiveData private String testTypeText; private String disease; + private Disease testedDisease; private Date dateTime; private String lab; private PathogenTestResultType testResult; @@ -1014,9 +1021,22 @@ public SampleExportPathogenTest( String lab, PathogenTestResultType testResult, Boolean verified) { + this(testType, testTypeText, disease, null, dateTime, lab, testResult, verified); + } + + public SampleExportPathogenTest( + PathogenTestType testType, + String testTypeText, + String disease, + Disease testedDisease, + Date dateTime, + String lab, + PathogenTestResultType testResult, + Boolean verified) { this.testType = testType; this.testTypeText = testTypeText; this.disease = disease; + this.testedDisease = testedDisease; this.dateTime = dateTime; this.lab = lab; this.testResult = testResult; @@ -1024,7 +1044,7 @@ public SampleExportPathogenTest( } public String formatType() { - return PathogenTestType.toString(testType, testTypeText); + return PathogenTestType.toString(testType, testTypeText, testedDisease); } public String formatString() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleMaterial.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleMaterial.java index 6045ef4dff2..511627b2bb5 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleMaterial.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleMaterial.java @@ -17,6 +17,10 @@ *******************************************************************************/ package de.symeda.sormas.api.sample; +import java.util.Collections; +import java.util.EnumMap; +import java.util.Map; + import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.utils.DataHelper; @@ -335,8 +339,103 @@ public enum SampleMaterial { Disease.GIARDIASIS }) DUODENUM_FLUID, + @Diseases({ + Disease.SALMONELLOSIS }) + ASPIRATE, + + @Diseases({ + Disease.SALMONELLOSIS }) + BONE_AND_JOINT, + + @Diseases({ + Disease.SALMONELLOSIS }) + CATHETER_EXIT_SITE, + + @Diseases({ + Disease.SALMONELLOSIS }) + EYE, + + @Diseases({ + Disease.SALMONELLOSIS }) + GASTRIC_FLUID, + + @Diseases({ + Disease.SALMONELLOSIS }) + GENITAL_SWAB, + + @Diseases({ + Disease.SALMONELLOSIS }) + LOWER_RESPIRATORY_TRACT, + + @Diseases({ + Disease.SALMONELLOSIS }) + PUS, + + @Diseases({ + Disease.SALMONELLOSIS }) + SEMEN, + + @Diseases({ + Disease.SALMONELLOSIS }) + SKIN, + + @Diseases({ + Disease.SALMONELLOSIS }) + SOFT_TISSUE, + + @Diseases({ + Disease.SALMONELLOSIS }) + WOUND, + OTHER; + /** + * SNOMED-CT codes for sample materials. Reference data per the v1.1 Salmonellosis spec + * (Lux requirement Salmonella v1.1.docx, sample list table). Optional: returns null + * when no canonical code is mapped. + */ + private static final Map SNOMED_CODES; + static { + EnumMap map = new EnumMap<>(SampleMaterial.class); + map.put(ASPIRATE, "119295008"); + map.put(BRONCHOALVEOLAR_LAVAGE, "258607008"); + map.put(BLOOD, "119297000"); + map.put(BONE_AND_JOINT, "258539005"); + map.put(CATHETER_EXIT_SITE, "16227651000119102"); + map.put(CRUST, "1332490003"); + map.put(CEREBROSPINAL_FLUID, "258450006"); + map.put(DRY_BLOOD, "440500007"); + map.put(EDTA_WHOLE_BLOOD, "57921000052103"); + map.put(EYE, "119399004"); + map.put(STOOL, "119339001"); + map.put(GENITAL_SWAB, "258508008"); + map.put(GASTRIC_FLUID, "258459007"); + map.put(LOWER_RESPIRATORY_TRACT, "258606004"); + map.put(TISSUE, "399492000"); + map.put(WOUND, "119365002"); + map.put(NP_SWAB, "258500001"); + map.put(OROPHARYNGEAL_SWAB, "461911000124106"); + map.put(PLEURAL_FLUID, "418564007"); + map.put(PUS, "119323008"); + map.put(RECTAL_SWAB, "258528007"); + map.put(SALIVA, "119342007"); + map.put(SEMEN, "119347001"); + map.put(SERA, "119364003"); + map.put(SKIN, "608969007"); + map.put(SOFT_TISSUE, "309072003"); + map.put(SPUTUM, "119334006"); + map.put(SYNOVIAL_FLUID, "119332005"); + map.put(URINE, "122575003"); + SNOMED_CODES = Collections.unmodifiableMap(map); + } + + /** + * @return SNOMED-CT code for this sample material, or {@code null} if no canonical code is mapped. + */ + public String getSnomedCode() { + return SNOMED_CODES.get(this); + } + @Override public String toString() { return I18nProperties.getEnumCaption(this); diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 32ba6995be1..e2143af055f 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -1619,8 +1619,6 @@ Exposure.prophylaxisAdherence=Prophylaxis adherence Exposure.prophylaxisAdherenceDetails=Prophylaxis adherence details Exposure.travelPurpose=Reason for travel 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 diff --git a/sormas-api/src/main/resources/doc/SORMAS_Data_Dictionary.xlsx b/sormas-api/src/main/resources/doc/SORMAS_Data_Dictionary.xlsx index 39bf9ee13b0..b78da8ecbd7 100644 Binary files a/sormas-api/src/main/resources/doc/SORMAS_Data_Dictionary.xlsx and b/sormas-api/src/main/resources/doc/SORMAS_Data_Dictionary.xlsx differ diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index 13b8d0b33c9..e65075aabf1 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -1194,6 +1194,9 @@ PathogenTestType.SPOLIGOTYPING = Spoligotyping PathogenTestType.MIRU_PATTERN_CODE = MIRU Pattern Code PathogenTestType.ANTIBIOTIC_SUSCEPTIBILITY = Antibiotic susceptibility PathogenTestType.MULTILOCUS_SEQUENCE_TYPING = Multilocus Sequence Typing (MLST) +PathogenTestType.CGMLST = Core Genome MLST (cgMLST) +PathogenTestType.SNP_TYPING = SNP Typing +PathogenTestType.SEROTYPING = Serotyping PathogenTestType.SLIDE_AGGLUTINATION = Slide Agglutination PathogenTestType.WHOLE_GENOME_SEQUENCING = Whole-Genome Sequencing (WGS) PathogenTestType.SEROGROUPING = Serogrouping @@ -1373,6 +1376,18 @@ SampleMaterial.THROAT_ASPIRATE = Throat aspirate SampleMaterial.EDTA_WHOLE_BLOOD = EDTA Whole Blood SampleMaterial.INTESTINAL_FLUID = Intestinal Fluid SampleMaterial.DUODENUM_FLUID = Duodenum fluid +SampleMaterial.ASPIRATE = Aspirate +SampleMaterial.BONE_AND_JOINT = Bone and joint specimen +SampleMaterial.CATHETER_EXIT_SITE = Catheter exit site +SampleMaterial.EYE = Eye +SampleMaterial.GASTRIC_FLUID = Gastric fluid +SampleMaterial.GENITAL_SWAB = Genital swab +SampleMaterial.LOWER_RESPIRATORY_TRACT = Lower respiratory tract +SampleMaterial.PUS = Pus +SampleMaterial.SEMEN = Semen +SampleMaterial.SKIN = Skin +SampleMaterial.SOFT_TISSUE = Soft tissue sample +SampleMaterial.WOUND = Wound SampleMaterial.BIOPSY = Biopsy # SampleSource SampleSource.ANIMAL=Animal @@ -3017,26 +3032,6 @@ ExposureSubSetting.TRAVELED_ABROAD=Traveled abroad ExposureSubSetting.UNKNOWN=Unknown ExposureSubSetting.OTHER=Other -# EatingOutVenue -EatingOutVenue.CANTEENS=Canteens (work, school, hospital, nursing home, retirement home) -EatingOutVenue.FOOD_SERVED_ON_BOARD=Food served on board (airplane, train, ferry, cruise ship) -EatingOutVenue.GAS_STATIONS=Gas stations -EatingOutVenue.STREET_VENDORS=Street vendors/mobile food vendors (food trucks, markets) -EatingOutVenue.FOOD_COURTS=Food courts (shopping malls, entertainment venues) -EatingOutVenue.CAFES_OR_TEA_ROOMS=Cafés or tea rooms -EatingOutVenue.SANDWICH_SHOPS_BAKERIES_DELICATESSENS=Sandwich shops, bakeries, or delicatessens -EatingOutVenue.CAFETERIAS_OR_BARS=Cafeterias or bars -EatingOutVenue.KEBAB_FALAFEL_SNACK_SHOPS=Kebab/falafel snack shops -EatingOutVenue.BURGER_RESTAURANTS=Burger restaurants -EatingOutVenue.FAST_FOOD_SNACK_BARS=Fast food/snack bars -EatingOutVenue.PIZZERIAS=Pizzerias -EatingOutVenue.ASIAN_RESTAURANTS=Asian restaurants -EatingOutVenue.HOTELS=Hotels -EatingOutVenue.TAKEAWAY_FOOD=Takeaway food (including home delivery) -EatingOutVenue.BUFFET_STYLE_RESTAURANTS=Buffet-style restaurants (all-you-can-eat, self-service) -EatingOutVenue.FOOD_AT_EVENTS=Food at events (weddings, conferences, festivals) -EatingOutVenue.OTHER=Other (please specify) - # ExposureContactFactor ExposureContactFactor.DURATION_OF_EXPOSURE=Duration of Exposure ExposureContactFactor.PROXIMITY_TO_SOURCE=Proximity to Source diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataFacadeEjb.java index 202accc3ea3..8a22fb4fb97 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataFacadeEjb.java @@ -139,6 +139,7 @@ public EpiData fillOrBuildEntity(EpiDataDto source, EpiData target, boolean chec target.setExposureInvestigationToDate(source.getExposureInvestigationToDate()); target.setActivityAsCaseFromDate(source.getActivityAsCaseFromDate()); target.setActivityAsCaseToDate(source.getActivityAsCaseToDate()); + return target; } @@ -243,8 +244,6 @@ public Exposure fillOrBuildExposureEntity(ExposureDto source, Exposure target, b target.setProphylaxisAdherenceDetails(source.getProphylaxisAdherenceDetails()); target.setTravelPurpose(source.getTravelPurpose()); target.setTravelPurposeDetails(source.getTravelPurposeDetails()); - target.setEatingOutVenues(source.getEatingOutVenues() != null ? source.getEatingOutVenues() : new HashSet<>()); - target.setEatingOutVenueOther(source.getEatingOutVenueOther()); target.setShoppingForFoodDetails(source.getShoppingForFoodDetails()); return target; } @@ -436,8 +435,6 @@ public static ExposureDto toExposureDto(Exposure source) { target.setProphylaxisAdherenceDetails(source.getProphylaxisAdherenceDetails()); target.setTravelPurpose(source.getTravelPurpose()); target.setTravelPurposeDetails(source.getTravelPurposeDetails()); - target.setEatingOutVenues(new HashSet<>(source.getEatingOutVenues())); - target.setEatingOutVenueOther(source.getEatingOutVenueOther()); target.setShoppingForFoodDetails(source.getShoppingForFoodDetails()); return target; } 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 016499e9039..4fe91410664 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 @@ -42,7 +42,6 @@ import de.symeda.sormas.api.exposure.AnimalCategory; import de.symeda.sormas.api.exposure.AnimalContactType; import de.symeda.sormas.api.exposure.AnimalLocation; -import de.symeda.sormas.api.exposure.EatingOutVenue; import de.symeda.sormas.api.exposure.ExposureCategory; import de.symeda.sormas.api.exposure.ExposureContactFactor; import de.symeda.sormas.api.exposure.ExposureProtectiveMeasure; @@ -92,8 +91,6 @@ public class Exposure extends AbstractDomainObject { public static final String SUB_SETTINGS = "subSettings"; public static final String CONTACT_FACTORS = "contactFactors"; public static final String PROTECTIVE_MEASURES = "protectiveMeasures"; - public static final String EATING_OUT_VENUES = "eatingOutVenues"; - public static final String EATING_OUT_VENUE_OTHER = "eatingOutVenueOther"; public static final String SHOPPING_FOR_FOOD_DETAILS = "shoppingForFoodDetails"; private EpiData epiData; @@ -201,8 +198,6 @@ public class Exposure extends AbstractDomainObject { private Set contactFactors = new HashSet<>(); private Set protectiveMeasures = new HashSet<>(); - private Set eatingOutVenues = new HashSet<>(); - private String eatingOutVenueOther; private String shoppingForFoodDetails; @ManyToOne @@ -957,28 +952,6 @@ public void setProtectiveMeasures(Set protectiveMeasu this.protectiveMeasures = protectiveMeasures; } - @ElementCollection(fetch = FetchType.EAGER) - @Enumerated(EnumType.STRING) - @CollectionTable(name = "exposures_eatingoutvenues", - joinColumns = @JoinColumn(name = "exposure_id", referencedColumnName = Exposure.ID, nullable = false)) - @Column(name = "eatingoutvenue", nullable = false) - public Set getEatingOutVenues() { - return eatingOutVenues; - } - - public void setEatingOutVenues(Set eatingOutVenues) { - this.eatingOutVenues = eatingOutVenues; - } - - @Column(length = CHARACTER_LIMIT_DEFAULT) - public String getEatingOutVenueOther() { - return eatingOutVenueOther; - } - - public void setEatingOutVenueOther(String eatingOutVenueOther) { - this.eatingOutVenueOther = eatingOutVenueOther; - } - @Column(length = CHARACTER_LIMIT_DEFAULT) public String getShoppingForFoodDetails() { return shoppingForFoodDetails; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java index cc3eedf9577..67fb5e5d360 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java @@ -674,6 +674,7 @@ private List getExportList( pathogenTest.getTestType(), pathogenTest.getTestTypeText(), DiseaseHelper.toString(pathogenTest.getTestedDisease(), pathogenTest.getTestedDiseaseDetails()), + pathogenTest.getTestedDisease(), pathogenTest.getTestDateTime(), lab, pathogenTest.getTestResult(), diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index 159e5e5293a..14f75333594 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -16008,4 +16008,29 @@ WHERE featuretype = 'EXTERNAL_MESSAGES'; INSERT INTO schema_version (version_number, comment) VALUES (630, 'Fix corrupt JSON in featureconfiguration.properties for EXTERNAL_MESSAGES from 629'); +-- 2026-05-11 Drop broken delete_history_trigger on exposures_eatingoutvenues +-- (composite-PK join tables don't have an `id` column; mirrors v617 which did the same for +-- exposures_subsettings / contactfactors / protectivemeasures). #13917 +DROP TRIGGER IF EXISTS delete_history_trigger ON exposures_eatingoutvenues; + +INSERT INTO schema_version (version_number, comment) VALUES (631, '#13917 - Drop broken delete_history_trigger on exposures_eatingoutvenues'); + +-- 2026-05-19 Remove eating-out venues from Salmonellosis exposure (reverts the v627 join table + eatingoutvenueother columns). #13918 +-- shoppingforfooddetails stays — it lives on the SHOPPING_FOR_FOOD sub-setting and is not part of this removal. + +-- Drop versioning triggers on the join table before dropping the table itself. +-- Guarded with IF EXISTS so the migration is idempotent regardless of whether v630 ran on this DB. +DROP TRIGGER IF EXISTS versioning_trigger ON exposures_eatingoutvenues; +DROP TRIGGER IF EXISTS delete_history_trigger ON exposures_eatingoutvenues; + +-- Drop join tables (history first to avoid any dangling references). +DROP TABLE IF EXISTS exposures_eatingoutvenues_history; +DROP TABLE IF EXISTS exposures_eatingoutvenues; + +-- Drop the "other" free-text column from exposures and its history mirror. +ALTER TABLE exposures DROP COLUMN IF EXISTS eatingoutvenueother; +ALTER TABLE exposures_history DROP COLUMN IF EXISTS eatingoutvenueother; + +INSERT INTO schema_version (version_number, comment) VALUES (632, '#13918 - Remove eating out venues from Salmonellosis exposure'); + -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/report/AggregateReportFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/report/AggregateReportFacadeEjbTest.java index 47a454b016b..5d8798a3edd 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/report/AggregateReportFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/report/AggregateReportFacadeEjbTest.java @@ -247,10 +247,12 @@ private AggregateReportDto createAggregateReportDto( } @Test - public void testAggregateReportsSummarize() { + public void testAggregateReportsSummarize() throws InterruptedException { loginWith(informant1); createAggregateReport(1, 1, 1, rdcf.region, rdcf.district, null, null); + // changeDate has millisecond resolution, delay so the later report at the same jurisdiction is unambiguously the most recent + Thread.sleep(1); createAggregateReport(2, 2, 2, rdcf.region, rdcf.district, null, null); createAggregateReport(3, 3, 3, rdcf.region, rdcf.district, rdcf.facility, null); @@ -367,12 +369,14 @@ public void testAggregatereportSummarizeConsidersUpperLevelData() { } @Test - public void testAggregateReportGetEditData() { + public void testAggregateReportGetEditData() throws InterruptedException { useNationalUserLogin(); Disease disease = Disease.ACUTE_VIRAL_HEPATITIS; creator.updateDiseaseConfiguration(disease, false, false, false, true, null, false, 0, 0); createAggregateReport(disease, null, 1, 1, 1); + // changeDate has millisecond resolution, delay so getSimilarAggregateReports unambiguously picks the most recent report per age group + Thread.sleep(1); AggregateReportDto selectedAggregateReport = createAggregateReport(disease, null, 2, 2, 2); List similarAggregateReports = getAggregateReportFacade().getSimilarAggregateReports(selectedAggregateReport); @@ -388,6 +392,8 @@ public void testAggregateReportGetEditData() { createAggregateReport(disease, "1Y_5Y", 5, 5, 5); createAggregateReport(disease, "6Y", 6, 6, 6); + // delay so the second batch (same age groups, higher values) is unambiguously more recent than the first + Thread.sleep(1); createAggregateReport(disease, "0D_28D", 31, 31, 31); AggregateReportDto selectedAggregateReport2 = createAggregateReport(disease, "1M_12M", 41, 41, 41); createAggregateReport(disease, "1Y_5Y", 51, 51, 51); diff --git a/sormas-rest/swagger.json b/sormas-rest/swagger.json index 16990472ebb..0df70eeb7e6 100644 --- a/sormas-rest/swagger.json +++ b/sormas-rest/swagger.json @@ -13661,7 +13661,7 @@ "type" : "array", "items" : { "type" : "string", - "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] + "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "CGMLST", "SNP_TYPING", "SEROTYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] } } } @@ -13690,14 +13690,14 @@ "type" : "array", "items" : { "type" : "string", - "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] + "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "CGMLST", "SNP_TYPING", "SEROTYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] } }, "sampleTestTypes" : { "type" : "array", "items" : { "type" : "string", - "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] + "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "CGMLST", "SNP_TYPING", "SEROTYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] }, "writeOnly" : true } @@ -18758,19 +18758,6 @@ "type" : "string", "enum" : [ "YES", "NO", "UNKNOWN" ] }, - "eatingOutVenueOther" : { - "type" : "string", - "maxLength" : 512, - "minLength" : 0 - }, - "eatingOutVenues" : { - "type" : "array", - "items" : { - "type" : "string", - "enum" : [ "CANTEENS", "FOOD_SERVED_ON_BOARD", "GAS_STATIONS", "STREET_VENDORS", "FOOD_COURTS", "CAFES_OR_TEA_ROOMS", "SANDWICH_SHOPS_BAKERIES_DELICATESSENS", "CAFETERIAS_OR_BARS", "KEBAB_FALAFEL_SNACK_SHOPS", "BURGER_RESTAURANTS", "FAST_FOOD_SNACK_BARS", "PIZZERIAS", "ASIAN_RESTAURANTS", "HOTELS", "TAKEAWAY_FOOD", "BUFFET_STYLE_RESTAURANTS", "FOOD_AT_EVENTS", "OTHER" ] - }, - "uniqueItems" : true - }, "eatingRawAnimalProducts" : { "type" : "string", "enum" : [ "YES", "NO", "UNKNOWN" ] @@ -22499,7 +22486,7 @@ }, "testType" : { "type" : "string", - "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] + "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "CGMLST", "SNP_TYPING", "SEROTYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] }, "testTypeText" : { "type" : "string", @@ -24072,7 +24059,7 @@ "type" : "array", "items" : { "type" : "string", - "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] + "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "CGMLST", "SNP_TYPING", "SEROTYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] }, "uniqueItems" : true }, @@ -24082,7 +24069,7 @@ }, "sampleMaterial" : { "type" : "string", - "enum" : [ "BLOOD", "DRY_BLOOD", "SERA", "STOOL", "THROAT_ASPIRATE", "NASAL_SWAB", "THROAT_SWAB", "NP_SWAB", "RECTAL_SWAB", "CEREBROSPINAL_FLUID", "CRUST", "TISSUE", "URINE", "CORNEA_PM", "SALIVA", "URINE_PM", "NUCHAL_SKIN_BIOPSY", "BIOPSY", "SPUTUM", "ENDOTRACHEAL_ASPIRATE", "BRONCHOALVEOLAR_LAVAGE", "BRAIN_TISSUE", "ANTERIOR_NARES_SWAB", "OP_ASPIRATE", "NP_ASPIRATE", "PLEURAL_FLUID", "NASOPHARYNGEAL_LAVAGE", "OROPHARYNGEAL_SWAB", "AMNIOTIC_FLUID", "CLINICAL_SAMPLE", "PERITONEAL_FLUID", "SYNOVIAL_FLUID", "EDTA_WHOLE_BLOOD", "INTESTINAL_FLUID", "DUODENUM_FLUID", "OTHER" ] + "enum" : [ "BLOOD", "DRY_BLOOD", "SERA", "STOOL", "THROAT_ASPIRATE", "NASAL_SWAB", "THROAT_SWAB", "NP_SWAB", "RECTAL_SWAB", "CEREBROSPINAL_FLUID", "CRUST", "TISSUE", "URINE", "CORNEA_PM", "SALIVA", "URINE_PM", "NUCHAL_SKIN_BIOPSY", "BIOPSY", "SPUTUM", "ENDOTRACHEAL_ASPIRATE", "BRONCHOALVEOLAR_LAVAGE", "BRAIN_TISSUE", "ANTERIOR_NARES_SWAB", "OP_ASPIRATE", "NP_ASPIRATE", "PLEURAL_FLUID", "NASOPHARYNGEAL_LAVAGE", "OROPHARYNGEAL_SWAB", "AMNIOTIC_FLUID", "CLINICAL_SAMPLE", "PERITONEAL_FLUID", "SYNOVIAL_FLUID", "EDTA_WHOLE_BLOOD", "INTESTINAL_FLUID", "DUODENUM_FLUID", "ASPIRATE", "BONE_AND_JOINT", "CATHETER_EXIT_SITE", "EYE", "GASTRIC_FLUID", "GENITAL_SWAB", "LOWER_RESPIRATORY_TRACT", "PUS", "SEMEN", "SKIN", "SOFT_TISSUE", "WOUND", "OTHER" ] }, "sampleMaterialText" : { "type" : "string", @@ -24216,7 +24203,7 @@ }, "sampleMaterial" : { "type" : "string", - "enum" : [ "BLOOD", "DRY_BLOOD", "SERA", "STOOL", "THROAT_ASPIRATE", "NASAL_SWAB", "THROAT_SWAB", "NP_SWAB", "RECTAL_SWAB", "CEREBROSPINAL_FLUID", "CRUST", "TISSUE", "URINE", "CORNEA_PM", "SALIVA", "URINE_PM", "NUCHAL_SKIN_BIOPSY", "BIOPSY", "SPUTUM", "ENDOTRACHEAL_ASPIRATE", "BRONCHOALVEOLAR_LAVAGE", "BRAIN_TISSUE", "ANTERIOR_NARES_SWAB", "OP_ASPIRATE", "NP_ASPIRATE", "PLEURAL_FLUID", "NASOPHARYNGEAL_LAVAGE", "OROPHARYNGEAL_SWAB", "AMNIOTIC_FLUID", "CLINICAL_SAMPLE", "PERITONEAL_FLUID", "SYNOVIAL_FLUID", "EDTA_WHOLE_BLOOD", "INTESTINAL_FLUID", "DUODENUM_FLUID", "OTHER" ] + "enum" : [ "BLOOD", "DRY_BLOOD", "SERA", "STOOL", "THROAT_ASPIRATE", "NASAL_SWAB", "THROAT_SWAB", "NP_SWAB", "RECTAL_SWAB", "CEREBROSPINAL_FLUID", "CRUST", "TISSUE", "URINE", "CORNEA_PM", "SALIVA", "URINE_PM", "NUCHAL_SKIN_BIOPSY", "BIOPSY", "SPUTUM", "ENDOTRACHEAL_ASPIRATE", "BRONCHOALVEOLAR_LAVAGE", "BRAIN_TISSUE", "ANTERIOR_NARES_SWAB", "OP_ASPIRATE", "NP_ASPIRATE", "PLEURAL_FLUID", "NASOPHARYNGEAL_LAVAGE", "OROPHARYNGEAL_SWAB", "AMNIOTIC_FLUID", "CLINICAL_SAMPLE", "PERITONEAL_FLUID", "SYNOVIAL_FLUID", "EDTA_WHOLE_BLOOD", "INTESTINAL_FLUID", "DUODENUM_FLUID", "ASPIRATE", "BONE_AND_JOINT", "CATHETER_EXIT_SITE", "EYE", "GASTRIC_FLUID", "GENITAL_SWAB", "LOWER_RESPIRATORY_TRACT", "PUS", "SEMEN", "SKIN", "SOFT_TISSUE", "WOUND", "OTHER" ] }, "samplePurpose" : { "type" : "string", @@ -24242,7 +24229,7 @@ }, "typeOfLastTest" : { "type" : "string", - "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] + "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "CGMLST", "SNP_TYPING", "SEROTYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] }, "uuid" : { "type" : "string", @@ -24316,7 +24303,7 @@ }, "sampleMaterial" : { "type" : "string", - "enum" : [ "BLOOD", "DRY_BLOOD", "SERA", "STOOL", "THROAT_ASPIRATE", "NASAL_SWAB", "THROAT_SWAB", "NP_SWAB", "RECTAL_SWAB", "CEREBROSPINAL_FLUID", "CRUST", "TISSUE", "URINE", "CORNEA_PM", "SALIVA", "URINE_PM", "NUCHAL_SKIN_BIOPSY", "BIOPSY", "SPUTUM", "ENDOTRACHEAL_ASPIRATE", "BRONCHOALVEOLAR_LAVAGE", "BRAIN_TISSUE", "ANTERIOR_NARES_SWAB", "OP_ASPIRATE", "NP_ASPIRATE", "PLEURAL_FLUID", "NASOPHARYNGEAL_LAVAGE", "OROPHARYNGEAL_SWAB", "AMNIOTIC_FLUID", "CLINICAL_SAMPLE", "PERITONEAL_FLUID", "SYNOVIAL_FLUID", "EDTA_WHOLE_BLOOD", "INTESTINAL_FLUID", "DUODENUM_FLUID", "OTHER" ] + "enum" : [ "BLOOD", "DRY_BLOOD", "SERA", "STOOL", "THROAT_ASPIRATE", "NASAL_SWAB", "THROAT_SWAB", "NP_SWAB", "RECTAL_SWAB", "CEREBROSPINAL_FLUID", "CRUST", "TISSUE", "URINE", "CORNEA_PM", "SALIVA", "URINE_PM", "NUCHAL_SKIN_BIOPSY", "BIOPSY", "SPUTUM", "ENDOTRACHEAL_ASPIRATE", "BRONCHOALVEOLAR_LAVAGE", "BRAIN_TISSUE", "ANTERIOR_NARES_SWAB", "OP_ASPIRATE", "NP_ASPIRATE", "PLEURAL_FLUID", "NASOPHARYNGEAL_LAVAGE", "OROPHARYNGEAL_SWAB", "AMNIOTIC_FLUID", "CLINICAL_SAMPLE", "PERITONEAL_FLUID", "SYNOVIAL_FLUID", "EDTA_WHOLE_BLOOD", "INTESTINAL_FLUID", "DUODENUM_FLUID", "ASPIRATE", "BONE_AND_JOINT", "CATHETER_EXIT_SITE", "EYE", "GASTRIC_FLUID", "GENITAL_SWAB", "LOWER_RESPIRATORY_TRACT", "PUS", "SEMEN", "SKIN", "SOFT_TISSUE", "WOUND", "OTHER" ] }, "sampleMaterialText" : { "type" : "string", @@ -26894,7 +26881,7 @@ }, "testType" : { "type" : "string", - "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] + "enum" : [ "ANTIBODY_DETECTION", "ANTIGEN_DETECTION", "RAPID_ANTIGEN_DETECTION", "RAPID_TEST", "CULTURE", "HISTOPATHOLOGY", "ISOLATION", "IGM_SERUM_ANTIBODY", "IGG_SERUM_ANTIBODY", "IGA_SERUM_ANTIBODY", "INCUBATION_TIME", "INDIRECT_FLUORESCENT_ANTIBODY", "DIRECT_FLUORESCENT_ANTIBODY", "MICROSCOPY", "NEUTRALIZING_ANTIBODIES", "ENZYME_LINKED_IMMUNOSORBENT_ASSAY", "PCR_RT_PCR", "GRAM_STAIN", "LATEX_AGGLUTINATION", "CQ_VALUE_DETECTION", "SEQUENCING", "DNA_MICROARRAY", "TMA", "IGRA", "TST", "BEIJINGGENOTYPING", "SPOLIGOTYPING", "MIRU_PATTERN_CODE", "ANTIBIOTIC_SUSCEPTIBILITY", "MULTILOCUS_SEQUENCE_TYPING", "CGMLST", "SNP_TYPING", "SEROTYPING", "SLIDE_AGGLUTINATION", "WHOLE_GENOME_SEQUENCING", "SEROGROUPING", "GENOTYPING", "NAAT", "THICK_BLOOD_SMEAR", "THIN_BLOOD_SMEAR", "Q_PCR", "LAMP", "OTHER_ANTIGEN_DETECTION_TEST", "OTHER_MOLECULAR_ASSAY", "OTHER_SEROLOGICAL_TEST", "OTHER" ] }, "testTypeDetails" : { "type" : "string", diff --git a/sormas-rest/swagger.yaml b/sormas-rest/swagger.yaml index a5058372d94..b8dbc11f3e6 100644 --- a/sormas-rest/swagger.yaml +++ b/sormas-rest/swagger.yaml @@ -11619,6 +11619,9 @@ components: - MIRU_PATTERN_CODE - ANTIBIOTIC_SUSCEPTIBILITY - MULTILOCUS_SEQUENCE_TYPING + - CGMLST + - SNP_TYPING + - SEROTYPING - SLIDE_AGGLUTINATION - WHOLE_GENOME_SEQUENCING - SEROGROUPING @@ -11681,6 +11684,9 @@ components: - MIRU_PATTERN_CODE - ANTIBIOTIC_SUSCEPTIBILITY - MULTILOCUS_SEQUENCE_TYPING + - CGMLST + - SNP_TYPING + - SEROTYPING - SLIDE_AGGLUTINATION - WHOLE_GENOME_SEQUENCING - SEROGROUPING @@ -11729,6 +11735,9 @@ components: - MIRU_PATTERN_CODE - ANTIBIOTIC_SUSCEPTIBILITY - MULTILOCUS_SEQUENCE_TYPING + - CGMLST + - SNP_TYPING + - SEROTYPING - SLIDE_AGGLUTINATION - WHOLE_GENOME_SEQUENCING - SEROGROUPING @@ -17614,34 +17623,6 @@ components: - "YES" - "NO" - UNKNOWN - eatingOutVenueOther: - type: string - maxLength: 512 - minLength: 0 - eatingOutVenues: - type: array - items: - type: string - enum: - - CANTEENS - - FOOD_SERVED_ON_BOARD - - GAS_STATIONS - - STREET_VENDORS - - FOOD_COURTS - - CAFES_OR_TEA_ROOMS - - SANDWICH_SHOPS_BAKERIES_DELICATESSENS - - CAFETERIAS_OR_BARS - - KEBAB_FALAFEL_SNACK_SHOPS - - BURGER_RESTAURANTS - - FAST_FOOD_SNACK_BARS - - PIZZERIAS - - ASIAN_RESTAURANTS - - HOTELS - - TAKEAWAY_FOOD - - BUFFET_STYLE_RESTAURANTS - - FOOD_AT_EVENTS - - OTHER - uniqueItems: true eatingRawAnimalProducts: type: string enum: @@ -22537,6 +22518,9 @@ components: - MIRU_PATTERN_CODE - ANTIBIOTIC_SUSCEPTIBILITY - MULTILOCUS_SEQUENCE_TYPING + - CGMLST + - SNP_TYPING + - SEROTYPING - SLIDE_AGGLUTINATION - WHOLE_GENOME_SEQUENCING - SEROGROUPING @@ -24224,6 +24208,9 @@ components: - MIRU_PATTERN_CODE - ANTIBIOTIC_SUSCEPTIBILITY - MULTILOCUS_SEQUENCE_TYPING + - CGMLST + - SNP_TYPING + - SEROTYPING - SLIDE_AGGLUTINATION - WHOLE_GENOME_SEQUENCING - SEROGROUPING @@ -24279,6 +24266,18 @@ components: - EDTA_WHOLE_BLOOD - INTESTINAL_FLUID - DUODENUM_FLUID + - ASPIRATE + - BONE_AND_JOINT + - CATHETER_EXIT_SITE + - EYE + - GASTRIC_FLUID + - GENITAL_SWAB + - LOWER_RESPIRATORY_TRACT + - PUS + - SEMEN + - SKIN + - SOFT_TISSUE + - WOUND - OTHER sampleMaterialText: type: string @@ -24520,6 +24519,18 @@ components: - EDTA_WHOLE_BLOOD - INTESTINAL_FLUID - DUODENUM_FLUID + - ASPIRATE + - BONE_AND_JOINT + - CATHETER_EXIT_SITE + - EYE + - GASTRIC_FLUID + - GENITAL_SWAB + - LOWER_RESPIRATORY_TRACT + - PUS + - SEMEN + - SKIN + - SOFT_TISSUE + - WOUND - OTHER samplePurpose: type: string @@ -24588,6 +24599,9 @@ components: - MIRU_PATTERN_CODE - ANTIBIOTIC_SUSCEPTIBILITY - MULTILOCUS_SEQUENCE_TYPING + - CGMLST + - SNP_TYPING + - SEROTYPING - SLIDE_AGGLUTINATION - WHOLE_GENOME_SEQUENCING - SEROGROUPING @@ -24689,6 +24703,18 @@ components: - EDTA_WHOLE_BLOOD - INTESTINAL_FLUID - DUODENUM_FLUID + - ASPIRATE + - BONE_AND_JOINT + - CATHETER_EXIT_SITE + - EYE + - GASTRIC_FLUID + - GENITAL_SWAB + - LOWER_RESPIRATORY_TRACT + - PUS + - SEMEN + - SKIN + - SOFT_TISSUE + - WOUND - OTHER sampleMaterialText: type: string @@ -28151,6 +28177,9 @@ components: - MIRU_PATTERN_CODE - ANTIBIOTIC_SUSCEPTIBILITY - MULTILOCUS_SEQUENCE_TYPING + - CGMLST + - SNP_TYPING + - SEROTYPING - SLIDE_AGGLUTINATION - WHOLE_GENOME_SEQUENCING - SEROGROUPING diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java index 601b5f4ce5b..644a0b613ef 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseDataView.java @@ -179,8 +179,8 @@ protected void initView(String params) { } if (UiUtil.permitted(FeatureType.IMMUNIZATION_MANAGEMENT, UserRight.IMMUNIZATION_VIEW)) { - // Immunizations are not shown for Giardiasis and Cryptosporidiosis - if (!List.of(Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS).contains(caze.getDisease())) { + // Immunizations are not shown for Giardiasis, Cryptosporidiosis, and Salmonellosis + if (!List.of(Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.SALMONELLOSIS).contains(caze.getDisease())) { if (!FacadeProvider.getFeatureConfigurationFacade() .isPropertyValueTrue(FeatureType.IMMUNIZATION_MANAGEMENT, FeatureTypeProperty.REDUCED)) { layout.addSidePanelComponent(new SideComponentLayout(new ImmunizationListComponent(() -> { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java index d04a0bd4685..57deb22e77c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java @@ -17,10 +17,19 @@ *******************************************************************************/ package de.symeda.sormas.ui.contact; +import java.text.DecimalFormat; +import java.util.Date; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import com.vaadin.navigator.View; import com.vaadin.ui.Label; import com.vaadin.ui.renderers.DateRenderer; + import de.symeda.sormas.api.CountryHelper; +import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.DiseaseHelper; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseIndexDto; @@ -38,14 +47,13 @@ import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.ViewModelProviders; -import de.symeda.sormas.ui.utils.*; - -import java.text.DecimalFormat; -import java.util.Date; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.DateFormatHelper; +import de.symeda.sormas.ui.utils.FieldAccessColumnStyleGenerator; +import de.symeda.sormas.ui.utils.FilteredGrid; +import de.symeda.sormas.ui.utils.ShowDetailsListener; +import de.symeda.sormas.ui.utils.UuidRenderer; +import de.symeda.sormas.ui.utils.ViewConfiguration; @SuppressWarnings("serial") public abstract class AbstractContactGrid extends FilteredGrid { @@ -164,17 +172,12 @@ protected void initColumns() { getColumn(CaseIndexDto.EXTERNAL_TOKEN).setHidden(true); } getColumn(ContactIndexDto.CONTACT_PROXIMITIES).setWidth(200); - ((Column>) getColumn(ContactIndexDto.CONTACT_PROXIMITIES)).setRenderer( - proximities -> { - if (proximities == null || proximities.isEmpty()) { - return ""; - } - return proximities.stream() - .map(I18nProperties::getEnumCaption) - .collect(Collectors.joining(", ")); - }, - new com.vaadin.ui.renderers.TextRenderer() - ); + ((Column>) getColumn(ContactIndexDto.CONTACT_PROXIMITIES)).setRenderer(proximities -> { + if (proximities == null || proximities.isEmpty()) { + return ""; + } + return proximities.stream().map(I18nProperties::getEnumCaption).collect(Collectors.joining(", ")); + }, new com.vaadin.ui.renderers.TextRenderer()); ((Column) getColumn(ContactIndexDto.UUID)).setRenderer(new UuidRenderer()); ((Column) getColumn(ContactIndexDto.PERSON_UUID)).setRenderer(new UuidRenderer()); ((Column) getColumn(ContactIndexDto.FOLLOW_UP_UNTIL)).setRenderer(new DateRenderer(DateFormatHelper.getDateFormat())); @@ -253,11 +256,9 @@ public void reload() { deselectAll(); } - if (getCriteria().getFollowUpStatus() == FollowUpStatus.NO_FOLLOW_UP) { - this.getColumn(NUMBER_OF_VISITS).setHidden(true); - } else { - this.getColumn(NUMBER_OF_VISITS).setHidden(false); - } + // Hide visits column when follow-up is not relevant: filter excludes follow-up, or disease is Salmonellosis (Lu-driven, no contact follow-up) + boolean hideVisits = getCriteria().getFollowUpStatus() == FollowUpStatus.NO_FOLLOW_UP || getCriteria().getDisease() == Disease.SALMONELLOSIS; + this.getColumn(NUMBER_OF_VISITS).setHidden(hideVisits); if (ViewModelProviders.of(viewClass).get(viewConfigurationClass).isInEagerMode()) { setEagerDataProvider(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java index 2ae252fcd74..216b790e449 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataView.java @@ -144,6 +144,11 @@ protected void initView(String params) { layout.addSidePanelComponent(createCaseInfoLayout(caseDto), CASE_LOC); } + Disease resolvedDisease = contactDto.getDisease(); + if (resolvedDisease == null && caseDto != null) { + resolvedDisease = caseDto.getDisease(); + } + final String uuid = contactDto.getUuid(); boolean editAllowed = isEditAllowed(); if (UiUtil.permitted(UserRight.CONTACT_REASSIGN_CASE) && editAllowed) { @@ -247,12 +252,18 @@ protected void initView(String params) { layout.addSidePanelComponent(eventsLayout, EVENTS_LOC); } - if (UiUtil.permitted(FeatureType.IMMUNIZATION_MANAGEMENT, UserRight.IMMUNIZATION_VIEW)) { + // Immunizations are not shown for Salmonellosis contacts + if (UiUtil.permitted(FeatureType.IMMUNIZATION_MANAGEMENT, UserRight.IMMUNIZATION_VIEW) && resolvedDisease != Disease.SALMONELLOSIS) { if (!FacadeProvider.getFeatureConfigurationFacade() .isPropertyValueTrue(FeatureType.IMMUNIZATION_MANAGEMENT, FeatureTypeProperty.REDUCED)) { layout.addSidePanelComponent(new SideComponentLayout(new ImmunizationListComponent(() -> { ContactDto refreshedContact = FacadeProvider.getContactFacade().getByUuid(getContactRef().getUuid()); - return new ImmunizationListCriteria.Builder(refreshedContact.getPerson()).withDisease(refreshedContact.getDisease()).build(); + Disease criteriaDisease = refreshedContact.getDisease(); + if (criteriaDisease == null && refreshedContact.getCaze() != null) { + CaseDataDto refreshedCase = FacadeProvider.getCaseFacade().getCaseDataByUuid(refreshedContact.getCaze().getUuid()); + criteriaDisease = refreshedCase != null ? refreshedCase.getDisease() : null; + } + return new ImmunizationListCriteria.Builder(refreshedContact.getPerson()).withDisease(criteriaDisease).build(); }, null, this::showUnsavedChangesPopup, editAllowed)), IMMUNIZATION_LOC); } else { layout.addSidePanelComponent(new SideComponentLayout(new VaccinationListComponent(() -> { @@ -261,7 +272,11 @@ protected void initView(String params) { if (refreshedContact.getCaze() != null) { refreshedCase = FacadeProvider.getCaseFacade().getCaseDataByUuid(refreshedContact.getCaze().getUuid()); } - return new VaccinationCriteria.Builder(refreshedContact.getPerson()).withDisease(refreshedContact.getDisease()) + Disease criteriaDisease = refreshedContact.getDisease(); + if (criteriaDisease == null && refreshedCase != null) { + criteriaDisease = refreshedCase.getDisease(); + } + return new VaccinationCriteria.Builder(refreshedContact.getPerson()).withDisease(criteriaDisease) .build() .vaccinationAssociationType(VaccinationAssociationType.CONTACT) .contactReference(getContactRef()) @@ -300,12 +315,7 @@ protected void initView(String params) { layout.addSidePanelComponent(new SideComponentLayout(documentList), DOCUMENTS_LOC); } - Disease disease = contactDto.getDisease(); - if (disease == null && caseDto != null) { - disease = caseDto.getDisease(); - } - - QuarantineOrderDocumentsComponent.addComponentToLayout(layout, contactDto, disease, documentList); + QuarantineOrderDocumentsComponent.addComponentToLayout(layout, contactDto, resolvedDisease, documentList); if (UiUtil.permitted(FeatureType.EXTERNAL_EMAILS, UserRight.EXTERNAL_EMAIL_SEND)) { ExternalEmailSideComponent externalEmailSideComponent = diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java index b81c3ac448f..dbf0c2e3acf 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/epidata/EpiDataForm.java @@ -110,7 +110,7 @@ public class EpiDataForm extends AbstractEditForm { Collections.unmodifiableList(Arrays.asList(Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS, Disease.MALARIA, Disease.DENGUE)); //@formatter:off - private static final String MAIN_HTML_LAYOUT = + private static final String MAIN_HTML_LAYOUT = loc(LOC_EXPOSURE_PERIOD_CONSIDER_HEADING) + fluidRowLocs("EXP_DATES_LAYOUT") + loc(LOC_EXPOSURE_INVESTIGATION_HEADING) + @@ -135,11 +135,11 @@ public class EpiDataForm extends AbstractEditForm { fluidRowLocs(3, EpiDataDto.CLUSTER_RELATED,5,EpiDataDto.CLUSTER_TYPE,4,EpiDataDto.CLUSTER_TYPE_TEXT) + locCss(VSPACE_TOP_3, LOC_EPI_DATA_FIELDS_HINT) + loc(EpiDataDto.HIGH_TRANSMISSION_RISK_AREA) + - loc(EpiDataDto.LARGE_OUTBREAKS_AREA) + + loc(EpiDataDto.LARGE_OUTBREAKS_AREA) + loc(EpiDataDto.AIRPORT_WORKER) + loc(EpiDataDto.HEALTHCARE_PROFESSIONAL) + loc(EpiDataDto.AREA_INFECTED_ANIMALS); - + private static final String SOURCE_CONTACTS_HTML_LAYOUT = locCss(VSPACE_TOP_3, LOC_SOURCE_CASE_CONTACTS_HEADING) + loc(EpiDataDto.CONTACT_WITH_SOURCE_CASE_KNOWN) + @@ -301,7 +301,7 @@ protected void addFields() { /** * Include the exposure start and dates when symptomOnsetDate is present. * Disease incubation period is enabled with valid values. - * + * * @param symptomOnsetDate * @param disease */ 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 981f67f1f6e..651d6f8abae 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 @@ -60,7 +60,6 @@ import de.symeda.sormas.api.event.MeansOfTransport; import de.symeda.sormas.api.event.TypeOfPlace; import de.symeda.sormas.api.exposure.AnimalCategory; -import de.symeda.sormas.api.exposure.EatingOutVenue; import de.symeda.sormas.api.exposure.ExposureCategory; import de.symeda.sormas.api.exposure.ExposureContactFactor; import de.symeda.sormas.api.exposure.ExposureDto; @@ -117,8 +116,6 @@ public class ExposureForm extends AbstractEditForm { fluidRow( fluidColumn(4, 0, locs( ExposureDto.SUB_SETTINGS, - ExposureDto.EATING_OUT_VENUES, - ExposureDto.EATING_OUT_VENUE_OTHER, ExposureDto.SHOPPING_FOR_FOOD_DETAILS, ExposureDto.CONDITION_OF_ANIMAL, ExposureDto.ANIMAL_CATEGORY, @@ -342,15 +339,6 @@ private void addBasicFields() { subSettingsDetailsField = addField(exposureDetailsLayout, ExposureDto.EXPOSURE_SUB_SETTING_DETAILS, TextField.class); subSettingsDetailsField.setVisible(false); - OptionGroup eatingOutVenuesField = addField(exposureDetailsLayout, ExposureDto.EATING_OUT_VENUES, OptionGroup.class); - eatingOutVenuesField.setMultiSelect(true); - CssStyles.style(eatingOutVenuesField, CssStyles.CAPTION_ON_TOP); - FieldHelper.updateItems(eatingOutVenuesField, Arrays.asList(EatingOutVenue.values())); - eatingOutVenuesField.setVisible(false); - - TextField eatingOutVenueOtherField = addField(exposureDetailsLayout, ExposureDto.EATING_OUT_VENUE_OTHER, TextField.class); - eatingOutVenueOtherField.setVisible(false); - TextField shoppingForFoodDetailsField = addField(exposureDetailsLayout, ExposureDto.SHOPPING_FOR_FOOD_DETAILS, TextField.class); shoppingForFoodDetailsField.setVisible(false); @@ -432,29 +420,12 @@ private void addBasicFields() { boolean isProphylaxis = selectedSubSettings != null && selectedSubSettings.contains(ExposureSubSetting.TRAVELED_ABROAD); setVisibleClear(isProphylaxis, ExposureDto.PROPHYLAXIS_ADHERENCE, ExposureDto.TRAVEL_PURPOSE); - // Salmonellosis Lu: Eating out venues + shopping-for-food details follow sub-setting selection - boolean showEatingOutVenues = selectedSubSettings != null && selectedSubSettings.contains(ExposureSubSetting.EATING_OUTSIDE); - eatingOutVenuesField.setVisible(showEatingOutVenues); - if (!showEatingOutVenues) { - eatingOutVenuesField.setValue(null); - eatingOutVenueOtherField.setVisible(false); - eatingOutVenueOtherField.setValue(null); - } - boolean showShoppingForFood = selectedSubSettings != null && selectedSubSettings.contains(ExposureSubSetting.SHOPPING_FOR_FOOD); + // Salmonellosis: shopping-for-food details follows sub-setting selection. + // Disease-gated so non-SAL exposures with FOOD_BORNE category don't see it. + boolean isSalmonellosis = disease == Disease.SALMONELLOSIS; + boolean showShoppingForFood = + isSalmonellosis && selectedSubSettings != null && selectedSubSettings.contains(ExposureSubSetting.SHOPPING_FOR_FOOD); shoppingForFoodDetailsField.setVisible(showShoppingForFood); - if (!showShoppingForFood) { - shoppingForFoodDetailsField.setValue(null); - } - }); - - eatingOutVenuesField.addValueChangeListener(e -> { - @SuppressWarnings("unchecked") - Set selectedVenues = (Set) e.getProperty().getValue(); - boolean containsOther = selectedVenues != null && selectedVenues.contains(EatingOutVenue.OTHER); - eatingOutVenueOtherField.setVisible(eatingOutVenuesField.isVisible() && containsOther); - if (!containsOther) { - eatingOutVenueOtherField.setValue(null); - } }); contactFactorsField.addValueChangeListener(e -> { @@ -590,11 +561,12 @@ private void updateSubSettingsFieldItems(ExposureCategory category, ExposureSett List subSettings; // For categories that have no setting but do have subsettings (e.g., FOOD_BORNE), - // we need to get subsettings based only on category + // we need to get subsettings based only on category. Disease-aware overloads filter values whose + // @Diseases annotation excludes the current disease (e.g. SHOPPING_FOR_FOOD is SAL-only). if (category != null && category.hasNoSetting()) { - subSettings = ExposureSubSetting.getValuesForCategoryOnly(category); + subSettings = ExposureSubSetting.getValuesForCategoryOnly(category, disease); } else { - subSettings = ExposureSubSetting.getValues(category, setting); + subSettings = ExposureSubSetting.getValues(category, setting, disease); } FieldHelper.updateItems(subSettingsField, subSettings); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/hospitalization/HospitalizationForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/hospitalization/HospitalizationForm.java index 05b8005970a..fae19ad6366 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/hospitalization/HospitalizationForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/hospitalization/HospitalizationForm.java @@ -83,9 +83,9 @@ public class HospitalizationForm extends AbstractEditForm { fluidRowLocs(HEALTH_FACILITY, HEALTH_FACILITY_DEPARTMENT) + fluidRowLocs(HospitalizationDto.ADMISSION_DATE, HospitalizationDto.DISCHARGE_DATE, HospitalizationDto.LEFT_AGAINST_ADVICE, "") + fluidRowLocs( HospitalizationDto.DURATION_OF_HOSPITALIZATION, HospitalizationDto.HOSPITALIZATION_REASON, HospitalizationDto.OTHER_HOSPITALIZATION_REASON, "") + - fluidRowLocs(3, HospitalizationDto.INTENSIVE_CARE_UNIT, - 3, HospitalizationDto.INTENSIVE_CARE_UNIT_START, - 3, HospitalizationDto.INTENSIVE_CARE_UNIT_END, + fluidRowLocs(3, HospitalizationDto.INTENSIVE_CARE_UNIT, + 3, HospitalizationDto.INTENSIVE_CARE_UNIT_START, + 3, HospitalizationDto.INTENSIVE_CARE_UNIT_END, 3, HospitalizationDto.ICU_LENGTH_OF_STAY) + fluidRowLocs(HospitalizationDto.OXYGEN_PRESCRIBED, HospitalizationDto.STILL_HOSPITALIZED) + fluidRowLocs(HospitalizationDto.ISOLATED, HospitalizationDto.ISOLATION_DATE, "") + @@ -173,10 +173,18 @@ protected void addFields() { final NullableOptionGroup oxygenPrescribedField = addField(HospitalizationDto.OXYGEN_PRESCRIBED, NullableOptionGroup.class); final NullableOptionGroup stillHospitalizedField = addField(HospitalizationDto.STILL_HOSPITALIZED, NullableOptionGroup.class); - if (!List.of(Disease.RESPIRATORY_SYNCYTIAL_VIRUS, Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.SALMONELLOSIS).contains(caze.getDisease())) { + if (!List.of(Disease.RESPIRATORY_SYNCYTIAL_VIRUS, Disease.GIARDIASIS, Disease.CRYPTOSPORIDIOSIS, Disease.SALMONELLOSIS) + .contains(caze.getDisease())) { icuLengthOfStayField.setVisible(false); oxygenPrescribedField.setVisible(false); stillHospitalizedField.setVisible(false); + } else if (caze.getDisease() == Disease.SALMONELLOSIS) { + // SAL renders only stillHospitalized from the RSV-family block; ICU length-of-stay, oxygen, and ICU dates are not relevant. + icuLengthOfStayField.setVisible(false); + oxygenPrescribedField.setVisible(false); + intensiveCareUnit.setVisible(false); + intensiveCareUnitStart.setVisible(false); + intensiveCareUnitEnd.setVisible(false); } final Field isolationDateField = addField(HospitalizationDto.ISOLATION_DATE); @@ -379,11 +387,8 @@ public String getFormattedHtmlMessage() { // stillHospitalized should not be visible/writable if discharge date is filled. // Applies to every disease that renders the stillHospitalized field (RSV, Giardiasis, Cryptosporidiosis, Salmonellosis). - if (List.of( - Disease.RESPIRATORY_SYNCYTIAL_VIRUS, - Disease.CRYPTOSPORIDIOSIS, - Disease.GIARDIASIS, - Disease.SALMONELLOSIS).contains(caze.getDisease())) { + if (List.of(Disease.RESPIRATORY_SYNCYTIAL_VIRUS, Disease.CRYPTOSPORIDIOSIS, Disease.GIARDIASIS, Disease.SALMONELLOSIS) + .contains(caze.getDisease())) { dischargeDateField.addValueChangeListener(event -> { boolean hasDischargeDate = dischargeDateField.getValue() != null; stillHospitalizedField.setVisible(!hasDischargeDate); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/components/TestMethodComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/components/TestMethodComponent.java index b6d8bd0d14f..b7be2776b4b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/components/TestMethodComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/components/TestMethodComponent.java @@ -169,11 +169,12 @@ private void bindFields() { } private void wireEvents() { - // Self-managed visibility: testTypeText visible for PCR_RT_PCR or OTHER + // Self-managed visibility: testTypeText reveals for any value annotated with @RevealsTestTypeText + // (PCR_RT_PCR + OTHER for every disease; the four typing tests for Salmonellosis only). track(testTypeField.addValueChangeListener(e -> { PathogenTestType type = e.getValue(); - boolean showTestTypeText = type == PathogenTestType.PCR_RT_PCR || type == PathogenTestType.OTHER; + boolean showTestTypeText = PathogenTestType.revealsTestTypeText(type, currentDisease); testTypeTextField.setVisible(showTestTypeText); testTypeTextSpacer.setVisible(!showTestTypeText); if (!showTestTypeText) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListEntry.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListEntry.java index 07340c150ed..93876dae0dd 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListEntry.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/pathogentestlink/PathogenTestListEntry.java @@ -73,7 +73,8 @@ public PathogenTestListEntry(PathogenTestDto pathogenTest, boolean showTestResul topLabelLayout.setMargin(false); topLabelLayout.setWidth(100, Unit.PERCENTAGE); addComponentToField(topLabelLayout); - Label labelTopLeft = new Label(PathogenTestType.toString(pathogenTest.getTestType(), pathogenTest.getTestTypeText())); + Label labelTopLeft = new Label( + PathogenTestType.toString(pathogenTest.getTestType(), pathogenTest.getTestTypeText(), pathogenTest.getTestedDisease())); CssStyles.style(labelTopLeft, CssStyles.LABEL_BOLD, CssStyles.LABEL_UPPERCASE); topLabelLayout.addComponent(labelTopLeft); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java index 8cb02a63f69..e581327bca4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java @@ -202,6 +202,7 @@ private CssStyles() { public static final String CAPTION_HIDDEN = "caption-hidden"; public static final String CAPTION_OVERFLOW = "caption-overflow"; public static final String CAPTION_FIXED_WIDTH_100 = "caption-fixed-width-100"; + public static final String CAPTION_NO_UPPERCASE = "no-uppercase"; public static final String ERROR_COLOR_PRIMARY = "error-color-primary"; diff --git a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss index 6dc5ad0c940..ae96ddb66b4 100644 --- a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss +++ b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss @@ -29,6 +29,10 @@ } } + + &.v-caption-no-uppercase { + text-transform: none; + } } .v-caption-multiline {