1919
2020import static de .symeda .sormas .api .symptoms .SymptomsDto .*;
2121import static de .symeda .sormas .ui .utils .CssStyles .H3 ;
22+ import static de .symeda .sormas .ui .utils .CssStyles .H4 ;
2223import static de .symeda .sormas .ui .utils .CssStyles .VSPACE_3 ;
2324import static de .symeda .sormas .ui .utils .CssStyles .VSPACE_NONE ;
2425import static de .symeda .sormas .ui .utils .LayoutUtil .fluidColumn ;
3031import static de .symeda .sormas .ui .utils .LayoutUtil .locCss ;
3132import static de .symeda .sormas .ui .utils .LayoutUtil .locsCss ;
3233
34+ import java .util .ArrayList ;
3335import java .util .Arrays ;
36+ import java .util .Comparator ;
37+ import java .util .HashMap ;
3438import java .util .List ;
39+ import java .util .Map ;
40+ import java .util .Optional ;
3541import java .util .Set ;
42+ import java .util .function .Predicate ;
3643import java .util .stream .Collectors ;
3744import java .util .stream .Stream ;
3845
4148import com .vaadin .shared .ui .MarginInfo ;
4249import com .vaadin .ui .Alignment ;
4350import com .vaadin .ui .Button ;
51+ import com .vaadin .ui .Component ;
4452import com .vaadin .ui .HorizontalLayout ;
4553import com .vaadin .ui .Image ;
4654import com .vaadin .ui .Label ;
7078import de .symeda .sormas .api .symptoms .SymptomsContext ;
7179import de .symeda .sormas .api .symptoms .SymptomsDto ;
7280import de .symeda .sormas .api .symptoms .SymptomsHelper ;
81+ import de .symeda .sormas .api .utils .SymptomGroup ;
82+ import de .symeda .sormas .api .utils .SymptomGrouping ;
7383import de .symeda .sormas .api .utils .fieldaccess .UiFieldAccessCheckers ;
7484import de .symeda .sormas .api .utils .fieldvisibility .FieldVisibilityCheckers ;
7585import de .symeda .sormas .api .utils .fieldvisibility .checkers .CountryFieldVisibilityChecker ;
@@ -90,6 +100,14 @@ public class SymptomsForm extends AbstractEditForm<SymptomsDto> {
90100
91101 private static final String CLINICAL_MEASUREMENTS_HEADING_LOC = "clinicalMeasurementsHeadingLoc" ;
92102 private static final String SIGNS_AND_SYMPTOMS_HEADING_LOC = "signsAndSymptomsHeadingLoc" ;
103+ private static final String GENERAL_SIGNS_AND_SYMPTOMS_HEADING_LOC = "generalSignsAndSymptomsHeadingLoc" ;
104+ private static final String RESPIRATORY_SIGNS_AND_SYMPTOMS_HEADING_LOC = "respiratorySignsAndSymptomsHeadingLoc" ;
105+ private static final String CARDIOVASCULAR_SIGNS_AND_SYMPTOMS_HEADING_LOC = "cardiovascularSignsAndSymptomsHeadingLoc" ;
106+ private static final String GASTROINTESTINAL_SIGNS_AND_SYMPTOMS_HEADING_LOC = "gastrointestinalSignsAndSymptomsHeadingLoc" ;
107+ private static final String URINARY_SIGNS_AND_SYMPTOMS_HEADING_LOC = "urinarySignsAndSymptomsHeadingLoc" ;
108+ private static final String NERVOUS_SYSTEM_SIGNS_AND_SYMPTOMS_HEADING_LOC = "nervousSystemSignsAndSymptomsHeadingLoc" ;
109+ private static final String SKIN_SIGNS_AND_SYMPTOMS_HEADING_LOC = "skinSignsAndSymptomsHeadingLoc" ;
110+ private static final String OTHER_SIGNS_AND_SYMPTOMS_HEADING_LOC = "otherSignsAndSymptomsHeadingLoc" ;
93111 private static final String BUTTONS_LOC = "buttonsLoc" ;
94112 private static final String LESIONS_LOCATIONS_LOC = "lesionsLocationsLoc" ;
95113 private static final String MONKEYPOX_LESIONS_IMG1 = "monkeypoxLesionsImg1" ;
@@ -99,6 +117,8 @@ public class SymptomsForm extends AbstractEditForm<SymptomsDto> {
99117 private static final String SYMPTOMS_HINT_LOC = "symptomsHintLoc" ;
100118 private static final String COMPLICATIONS_HEADING = "complicationsHeading" ;
101119
120+ private static Map <String , List <String >> symptomGroupMap = new HashMap ();
121+
102122 //@formatter:off
103123 private static final String HTML_LAYOUT =
104124 loc (CLINICAL_MEASUREMENTS_HEADING_LOC ) +
@@ -110,67 +130,15 @@ public class SymptomsForm extends AbstractEditForm<SymptomsDto> {
110130 //XXX #1620 fluidColumnLoc?
111131 fluidColumn (8 , 0 , loc (SYMPTOMS_HINT_LOC ))) +
112132 fluidRow (fluidColumn (8 ,4 , locCss (CssStyles .ALIGN_RIGHT ,BUTTONS_LOC )))+
113- fluidRow (
114- fluidColumn (6 , -1 ,
115- locsCss (VSPACE_3 ,
116- FEELING_ILL , SHIVERING , HEADACHE , MUSCLE_PAIN , ABDOMINAL_PAIN , ABNORMAL_LUNG_XRAY_FINDINGS ,
117- ACUTE_RESPIRATORY_DISTRESS_SYNDROME , HEARINGLOSS , ANOREXIA_APPETITE_LOSS ,
118- BACKACHE , BLACKENING_DEATH_OF_TISSUE , BLOOD_IN_STOOL ,
119- BUBOES_GROIN_ARMPIT_NECK , BULGING_FONTANELLE ,
120- BILATERAL_CATARACTS , UNILATERAL_CATARACTS , CHEST_PAIN , CHILLS_SWEATS ,
121- CONGENITAL_GLAUCOMA , CONGENITAL_HEART_DISEASE ,
122- CONGENITAL_HEART_DISEASE_TYPE , CONGENITAL_HEART_DISEASE_DETAILS ,
123- CONJUNCTIVITIS , CONJUNCTIVAL_INJECTION , COUGH , COUGH_WITHOUT_SPUTUM , COUGH_WITH_SPUTUM ,
124- COUGH_WITH_HEAMOPTYSIS , RESPIRATORY_DISEASE_VENTILATION ,
125- DARK_URINE , DEHYDRATION , DEVELOPMENTAL_DELAY , DIARRHEA ,
126- CHEST_PRESSURE , DIFFICULTY_BREATHING , LYMPHADENOPATHY , LYMPHADENOPATHY_AXILLARY ,
127- LYMPHADENOPATHY_CERVICAL , LYMPHADENOPATHY_INGUINAL ,
128- FATIGUE_WEAKNESS , WEAKNESS , FATIGUE ,FEVER , FEVERISHFEELING , FLUID_IN_LUNG_CAVITY ,
129- FLUID_IN_LUNG_CAVITY_AUSCULTATION , FLUID_IN_LUNG_CAVITY_XRAY ,
130- HICCUPS , BEDRIDDEN ,
131- JAUNDICE , JAUNDICE_WITHIN_24_HOURS_OF_BIRTH , JOINT_PAIN , KOPLIKS_SPOTS ,
132- LOSS_SKIN_TURGOR ,
133- SKIN_RASH , MALAISE , MENINGOENCEPHALITIS , OTITIS_MEDIA , MICROCEPHALY ,
134- NAUSEA , NECK_STIFFNESS , OEDEMA_FACE_NECK , OEDEMA_LOWER_EXTREMITY ,
135- EYE_PAIN_LIGHT_SENSITIVE ,
136- PAINFUL_LYMPHADENITIS , ANXIETY_STATES , DELIRIUM , UPROARIOUSNESS ,
137- PARASTHESIA_AROUND_WOUND ,
138- EXCESS_SALIVATION , INSOMNIA , PARALYSIS , EXCITATION , DYSPHAGIA , AEROPHOBIA
139- , CONVULSION )),
140- fluidColumn (6 , 0 ,
141- locsCss (VSPACE_3 ,
142- FAST_HEART_RATE , PALPABLE_LIVER , PALPABLE_SPLEEN , PHARYNGEAL_ERYTHEMA , PHARYNGEAL_EXUDATE ,
143- PIGMENTARY_RETINOPATHY , PNEUMONIA_CLINICAL_OR_RADIOLOGIC ,
144- PURPURIC_RASH , RADIOLUCENT_BONE_DISEASE , RAPID_BREATHING ,
145- REFUSAL_FEEDOR_DRINK , RUNNY_NOSE ,
146- ORAL_ULCERS , SIDE_PAIN , SORE_THROAT , SPLENOMEGALY , SUNKEN_EYES_FONTANELLE
147- , SWOLLEN_GLANDS ,
148- THROBOCYTOPENIA , TREMOR , UNEXPLAINED_BLEEDING , EYES_BLEEDING ,
149- INJECTION_SITE_BLEEDING ,
150- BLEEDING_VAGINA , GUMS_BLEEDING , STOMACH_BLEEDING , BLOOD_URINE ,
151- BLOODY_BLACK_STOOL ,
152- SKIN_BRUISING , COUGHING_BLOOD , DIGESTED_BLOOD_VOMIT , RED_BLOOD_VOMIT ,
153- NOSE_BLEEDING ,
154- OTHER_HEMORRHAGIC_SYMPTOMS , OTHER_HEMORRHAGIC_SYMPTOMS_TEXT ,
155- LESIONS , LESIONS_THAT_ITCH , LESIONS_SAME_STATE , LESIONS_SAME_SIZE ,
156- LESIONS_DEEP_PROFOUND ,
157- LESIONS_LOCATIONS_LOC , LESIONS_FACE , LESIONS_LEGS , LESIONS_SOLES_FEET ,
158- LESIONS_PALMS_HANDS , LESIONS_THORAX ,
159- LESIONS_ARMS , LESIONS_GENITALS , LESIONS_ALL_OVER_BODY ,
160- LESIONS_RESEMBLE_IMG1 , MONKEYPOX_LESIONS_IMG1 ,
161- LESIONS_RESEMBLE_IMG2 , MONKEYPOX_LESIONS_IMG2 , LESIONS_RESEMBLE_IMG3 ,
162- MONKEYPOX_LESIONS_IMG3 , LESIONS_RESEMBLE_IMG4 , MONKEYPOX_LESIONS_IMG4 ,
163- LESIONS_ONSET_DATE , VOMITING , HYDROPHOBIA , OPISTHOTONUS , HYPERACTIVITY ,
164- PARESIS , AGITATION ,
165- ASCENDING_FLACCID_PARALYSIS , ERRATIC_BEHAVIOUR , COMA , LOSS_OF_TASTE ,
166- LOSS_OF_SMELL , WHEEZING , SKIN_ULCERS , INABILITY_TO_WALK ,
167- IN_DRAWING_OF_CHEST_WALL , OXYGEN_SATURATION_LOWER_94 ,
168- BREATHLESSNESS , BLUE_LIPS , BLOOD_CIRCULATION_PROBLEMS , PALPITATIONS ,
169- DIZZINESS_STANDING_UP , HIGH_OR_LOW_BLOOD_PRESSURE , URINARY_RETENTION ,
170- OTHER_NON_HEMORRHAGIC_SYMPTOMS , OTHER_NON_HEMORRHAGIC_SYMPTOMS_TEXT ) +
171- locsCss (VSPACE_3 , PATIENT_ILL_LOCATION , SYMPTOMS_COMMENTS )
172- )
173- ) +
133+ createSymptomGroupLayout (SymptomGroup .GENERAL , GENERAL_SIGNS_AND_SYMPTOMS_HEADING_LOC ) +
134+ createSymptomGroupLayout (SymptomGroup .RESPIRATORY , RESPIRATORY_SIGNS_AND_SYMPTOMS_HEADING_LOC ) +
135+ createSymptomGroupLayout (SymptomGroup .CARDIOVASCULAR , CARDIOVASCULAR_SIGNS_AND_SYMPTOMS_HEADING_LOC ) +
136+ createSymptomGroupLayout (SymptomGroup .GASTROINTESTINAL , GASTROINTESTINAL_SIGNS_AND_SYMPTOMS_HEADING_LOC ) +
137+ createSymptomGroupLayout (SymptomGroup .URINARY , URINARY_SIGNS_AND_SYMPTOMS_HEADING_LOC ) +
138+ createSymptomGroupLayout (SymptomGroup .NERVOUS_SYSTEM , NERVOUS_SYSTEM_SIGNS_AND_SYMPTOMS_HEADING_LOC ) +
139+ createSymptomGroupLayout (SymptomGroup .SKIN , SKIN_SIGNS_AND_SYMPTOMS_HEADING_LOC ) +
140+ createSymptomGroupLayout (SymptomGroup .OTHER , OTHER_SIGNS_AND_SYMPTOMS_HEADING_LOC ) +
141+ locsCss (VSPACE_3 , PATIENT_ILL_LOCATION , SYMPTOMS_COMMENTS ) +
174142 fluidRowLocsCss (VSPACE_3 , ONSET_SYMPTOM , ONSET_DATE ) +
175143 loc (COMPLICATIONS_HEADING ) +
176144 fluidRow (
@@ -184,6 +152,23 @@ public class SymptomsForm extends AbstractEditForm<SymptomsDto> {
184152 MENINGEAL_SIGNS , SEIZURES , SEPSIS , SHOCK ))
185153 );
186154 //@formatter:on
155+
156+ private static String createSymptomGroupLayout (SymptomGroup symptomGroup , String loc ) {
157+
158+ final Predicate <java .lang .reflect .Field > groupSymptoms =
159+ field -> field .isAnnotationPresent (SymptomGrouping .class ) && field .getAnnotation (SymptomGrouping .class ).value () == symptomGroup ;
160+ final List <String > symptomLocations = Arrays .stream (SymptomsDto .class .getDeclaredFields ())
161+ .filter (groupSymptoms )
162+ .map (field -> field .getName ())
163+ .sorted (Comparator .comparing (fieldName -> I18nProperties .getPrefixCaption (I18N_PREFIX , fieldName )))
164+ .collect (Collectors .toList ());
165+
166+ symptomGroupMap .put (loc , symptomLocations );
167+
168+ return loc (loc ) + fluidRow (
169+ fluidColumn (6 , -1 , locsCss (VSPACE_3 , new ArrayList <>(symptomLocations .subList (0 , symptomLocations .size () / 2 )))),
170+ fluidColumn (6 , 0 , locsCss (VSPACE_3 , new ArrayList <>(symptomLocations .subList (symptomLocations .size () / 2 , symptomLocations .size ())))));
171+ }
187172
188173 private final CaseDataDto caze ;
189174 private final Disease disease ;
@@ -237,13 +222,24 @@ protected void addFields() {
237222 }
238223
239224 // Add fields
240- Label clinicalMeasurementsHeadingLabel = new Label (I18nProperties .getString (Strings .headingClinicalMeasurements ));
241- clinicalMeasurementsHeadingLabel .addStyleName (H3 );
242- getContent ().addComponent (clinicalMeasurementsHeadingLabel , CLINICAL_MEASUREMENTS_HEADING_LOC );
243-
244- Label signsAndSymptomsHeadingLabel = new Label (I18nProperties .getString (Strings .headingSignsAndSymptoms ));
245- signsAndSymptomsHeadingLabel .addStyleName (H3 );
246- getContent ().addComponent (signsAndSymptomsHeadingLabel , SIGNS_AND_SYMPTOMS_HEADING_LOC );
225+ Label clinicalMeasurementsHeadingLabel =
226+ createLabel (I18nProperties .getString (Strings .headingClinicalMeasurements ), H3 , CLINICAL_MEASUREMENTS_HEADING_LOC );
227+
228+ Label signsAndSymptomsHeadingLabel =
229+ createLabel (I18nProperties .getString (Strings .headingSignsAndSymptoms ), H3 , SIGNS_AND_SYMPTOMS_HEADING_LOC );
230+
231+ final Label generalSymptomsHeadingLabel = createLabel (SymptomGroup .GENERAL .toString (), H4 , GENERAL_SIGNS_AND_SYMPTOMS_HEADING_LOC );
232+ final Label respiratorySymptomsHeadingLabel =
233+ createLabel (SymptomGroup .RESPIRATORY .toString (), H4 , RESPIRATORY_SIGNS_AND_SYMPTOMS_HEADING_LOC );
234+ final Label cardiovascularSymptomsHeadingLabel =
235+ createLabel (SymptomGroup .CARDIOVASCULAR .toString (), H4 , CARDIOVASCULAR_SIGNS_AND_SYMPTOMS_HEADING_LOC );
236+ final Label gastrointestinalSymptomsHeadingLabel =
237+ createLabel (SymptomGroup .GASTROINTESTINAL .toString (), H4 , GASTROINTESTINAL_SIGNS_AND_SYMPTOMS_HEADING_LOC );
238+ final Label urinarySymptomsHeadingLabel = createLabel (SymptomGroup .URINARY .toString (), H4 , URINARY_SIGNS_AND_SYMPTOMS_HEADING_LOC );
239+ final Label nervousSystemSymptomsHeadingLabel =
240+ createLabel (SymptomGroup .NERVOUS_SYSTEM .toString (), H4 , NERVOUS_SYSTEM_SIGNS_AND_SYMPTOMS_HEADING_LOC );
241+ final Label skinSymptomsHeadingLabel = createLabel (SymptomGroup .SKIN .toString (), H4 , SKIN_SIGNS_AND_SYMPTOMS_HEADING_LOC );
242+ final Label otherSymptomsHeadingLabel = createLabel (SymptomGroup .OTHER .toString (), H4 , OTHER_SIGNS_AND_SYMPTOMS_HEADING_LOC );
247243
248244 DateField onsetDateField = addField (ONSET_DATE , DateField .class );
249245 ComboBox onsetSymptom = addField (ONSET_SYMPTOM , ComboBox .class );
@@ -316,7 +312,7 @@ protected void addFields() {
316312 CONJUNCTIVITIS ,
317313 EYE_PAIN_LIGHT_SENSITIVE ,
318314 KOPLIKS_SPOTS ,
319- THROBOCYTOPENIA ,
315+ THROBOCYTOPENIA ,
320316 OTITIS_MEDIA ,
321317 HEARINGLOSS ,
322318 DEHYDRATION ,
@@ -721,6 +717,14 @@ protected void addFields() {
721717 getFieldGroup ().getField (PATIENT_ILL_LOCATION ).setVisible (false );
722718 }
723719
720+ symptomGroupMap .forEach ((location , strings ) -> {
721+ final Component groupLabel = getContent ().getComponent (location );
722+ final Optional <String > groupHasVisibleSymptom = strings .stream ().filter (s -> getFieldGroup ().getField (s ).isVisible ()).findAny ();
723+ if (!groupHasVisibleSymptom .isPresent ()) {
724+ groupLabel .setVisible (false );
725+ }
726+ });
727+
724728 if (isEditableAllowed (OTHER_HEMORRHAGIC_SYMPTOMS_TEXT )) {
725729 FieldHelper .setRequiredWhen (
726730 getFieldGroup (),
@@ -791,6 +795,14 @@ protected void addFields() {
791795 getContent ().addComponent (buttonsLayout , BUTTONS_LOC );
792796 }
793797
798+ private Label createLabel (String text , String h4 , String location ) {
799+ final Label label = new Label (text );
800+ label .setId (text );
801+ label .addStyleName (h4 );
802+ getContent ().addComponent (label , location );
803+ return label ;
804+ }
805+
794806 @ Override
795807 protected String createHtmlLayout () {
796808 return HTML_LAYOUT ;
0 commit comments